using Assets.Scripts.Enums; using Assets.Scripts.Helpers; using System; using System.Collections.Generic; using System.Linq; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.Tilemaps; public class GameManager : SettingsManager { public GameObject damageTextPrefab; public GameObject healthTextPrefab; public Canvas playerUI; public Canvas pauseMenuUI; public GameObject levelChanger; public Tilemap tilemap; [NonSerialized] public GenerateTileMap generateTileMap; [NonSerialized] public List destroyedTiles = new List(); public GameObject pickups; private void Awake() { SoundManager.instance.ChangeMusic(SoundName.MusicHappy); LoadTileMaps(SaveSystem.isGameLoaded); } private void LoadTileMaps(bool loadFromSave) { generateTileMap = tilemap.GetComponent(); pauseMenuUI.GetComponent().Pause(); levelChanger.GetComponent().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().SetBool("SceneLoading", false); GameLoaded(); } public void GameLoaded() { pauseMenuUI.GetComponent().Resume(); pauseMenuUI.GetComponent().SetTrigger("GameLoaded"); } #region characterEvents private void OnEnable() { // add listen events CharacterEvents.characterDamaged += (CharacterTookDamange); CharacterEvents.characterHealed += (CharacterHealed); CharacterEvents.characterDrill += (CharacterDrill); } private void OnDisable() { // remove listen events CharacterEvents.characterDamaged -= (CharacterTookDamange); CharacterEvents.characterHealed -= (CharacterHealed); CharacterEvents.characterDrill -= (CharacterDrill); } public void CharacterTookDamange(GameObject character, int damageReceived) { // Create damage text at character Vector3 spawnPosition = Camera.main.WorldToScreenPoint(character.transform.position); TMP_Text tmpText = Instantiate(damageTextPrefab, spawnPosition, Quaternion.identity, pauseMenuUI.transform).GetComponent(); tmpText.text = damageReceived.ToString(); } public void CharacterHealed(GameObject character, int healthRestored) { // Create heal text at character Vector3 spawnPosition = Camera.main.WorldToScreenPoint(character.transform.position); TMP_Text tmpText = Instantiate(healthTextPrefab, spawnPosition, Quaternion.identity, pauseMenuUI.transform).GetComponent(); tmpText.text = healthRestored.ToString(); } public void CharacterDrill(ContactPoint2D contact, DrillDirection drillDirection) { GridLayout grid = tilemap.transform.GetComponentInParent(); 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)) { GameObject tileGameObject = tilemap.GetInstantiatedObject(cellCoord); if (tileGameObject?.GetComponent()?.isDrillable ?? false) { Vector3 cellWorldPosition = grid.CellToWorld(cellCoord); // middle of tile cellWorldPosition.x += 0.5f; cellWorldPosition.y += 0.5f; if (tileGameObject?.GetComponent()?.isDropable ?? false) { // Change no drops, only inventory //Instantiate(tileGameObject?.GetComponent().dropable, cellWorldPosition, Quaternion.identity, pickups.transform); //Debug.Log(.name); } tilemap.SetTile(cellCoord, null); destroyedTiles.Add(cellCoord); CharacterEvents.characterDrillingToPosition.Invoke(cellWorldPosition, drillDirection); } else { //CharacterEvents.characterDrillingToPositionAbort.Invoke(moveToPosition); } } } #endregion }