miepzerino
2023-12-25 3d9870b82513c2aeb474e2f131a61708d9046247
Assets/Scripts/Managers/GameManager.cs
@@ -1,10 +1,12 @@
using Assets.Scripts.Enums;
using System.Collections;
using Assets.Scripts.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
using UnityEngine.Tilemaps;
public class GameManager : SettingsManager
{
@@ -12,17 +14,69 @@
    public GameObject healthTextPrefab;
    public Canvas playerUI;
    public Canvas pauseMenuUI;
    public GameObject levelChanger;
    public Tilemap tilemap;
    [NonSerialized]
    public GenerateTileMap generateTileMap;
    [NonSerialized]
    public List<Vector3Int> destroyedTiles = new List<Vector3Int>();
    private void Awake()
    {
        SoundManager.instance.ChangeMusic(SoundName.MusicHappy);
        LoadTileMaps(SaveSystem.isGameLoaded);
    }
    private void LoadTileMaps(bool loadFromSave)
    {
        generateTileMap = tilemap.GetComponent<GenerateTileMap>();
        pauseMenuUI.GetComponent<PauseMenu>().Pause();
        levelChanger.GetComponent<Animator>().SetBool("SceneLoading", true);
        if (loadFromSave)
        {
            LoadMapState();
        }
        Debug.Log("waiting for async map loading");
        StartCoroutine(generateTileMap.GenerateTiles(LoadTileMapsFinished, destroyedTiles));
    }
    private void LoadMapState()
    {
        SaveDataMap mapState = SaveSystem.LoadMapState();
        if (mapState != null)
        {
            generateTileMap.SetSettingsFromSeed(mapState.seed);
            if (mapState.destroyedTiles != null && mapState.destroyedTiles.Count > 0)
            {
                // TODO rework load map (it's fucky wucky currently as I had to make an extra class for it to jsonify the tiles correctly, as unity does not like lists of arrays or 2d arrays)
                foreach (DestroyedTile tile in mapState.destroyedTiles)
                {
                    destroyedTiles.Add(tile.tileCoord.ConvertToVector3Int());
                }                //destroyedTiles.AddRange(mapState.destroyedTiles.Select(tile => { return tile.tileCoord; }).ToList().ConvertToVector3Int());
            }
        }
    }
    public void LoadTileMapsFinished()
    {
        Debug.Log("done async map loading");
        levelChanger.GetComponent<Animator>().SetBool("SceneLoading", false);
        GameLoaded();
    }
    public void GameLoaded()
    {
        pauseMenuUI.GetComponent<PauseMenu>().Resume();
        pauseMenuUI.GetComponent<Animator>().SetTrigger("GameLoaded");
    }
    #region characterEvents
    private void OnEnable()
    {
        // add listen events
        CharacterEvents.characterDamaged += (CharacterTookDamange);
        CharacterEvents.characterHealed += (CharacterHealed);
        CharacterEvents.characterDrill += (CharacterDrill);
    }
@@ -31,6 +85,7 @@
        // remove listen events
        CharacterEvents.characterDamaged -= (CharacterTookDamange);
        CharacterEvents.characterHealed -= (CharacterHealed);
        CharacterEvents.characterDrill -= (CharacterDrill);
    }
    public void CharacterTookDamange(GameObject character, int damageReceived)
@@ -53,8 +108,42 @@
        tmpText.text = healthRestored.ToString();
    }
    public void GameLoaded()
    public void CharacterDrill(ContactPoint2D contact, DrillDirection drillDirection)
    {
        pauseMenuUI.GetComponent<Animator>().SetTrigger("GameLoaded");
        GridLayout grid = tilemap.transform.GetComponentInParent<GridLayout>();
        Vector3Int cellCoord = grid.WorldToCell(contact.point);
        switch (drillDirection)
        {
            case DrillDirection.Left:
                cellCoord.x = cellCoord.x - 1;
                break;
            case DrillDirection.Right:
                cellCoord.x = cellCoord.x + 1;
                break;
            case DrillDirection.Down:
                cellCoord.y = cellCoord.y - 1;
                break;
        }
        //Debug.Log("cellCoord: " + grid.CellToWorld(cellCoord));
        //Debug.Log(tilemap.HasTile(cellCoord));
        if (tilemap.HasTile(cellCoord))
        {
            if (tilemap.GetInstantiatedObject(cellCoord)?.GetComponent<Drillable>()?.isDrillable ?? false)
            {
                tilemap.SetTile(cellCoord, null);
                destroyedTiles.Add(cellCoord);
                Vector3 moveToPosition = grid.CellToWorld(cellCoord);
                moveToPosition.x += 0.5f;
                moveToPosition.y += 0.5f;
                CharacterEvents.characterDrillingToPosition.Invoke(moveToPosition, drillDirection);
            }
            else
            {
                //CharacterEvents.characterDrillingToPositionAbort.Invoke(moveToPosition);
            }
        }
    }
    #endregion
}