miepzerino
2023-12-25 89c72b3b11cbfbd9a8f86abb418ae8ada3ee237b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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<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);
 
    }
 
    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<TMP_Text>();
 
        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<TMP_Text>();
 
        tmpText.text = healthRestored.ToString();
 
    }
    public void CharacterDrill(ContactPoint2D contact, DrillDirection drillDirection)
    {
        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))
        {
            tilemap.SetTile(cellCoord, null);
            destroyedTiles.Add(cellCoord);
            Vector3 moveToPosition = grid.CellToWorld(cellCoord);
            moveToPosition.x += 0.5f;
            moveToPosition.y += 0.5f;
            CharacterEvents.characterDrillingToPosition.Invoke(moveToPosition);
        }
    }
    #endregion
 
}