using CIGEnums; using SUISS.Core; using SUISS.Scheduling; using SUISSEngine; using System.Collections.Generic; using UnityEngine; public class CIGScenery : Scenery { public int happiness; public bool multiple; public Sprite[] sprites; public Island island; [SelfReference] public SpriteRenderer spriteRenderer; private CIGGameStats _gameStats; private CIGIslandState _islandState; protected int _effectiveHappiness; protected const string EffectiveHappinessKey = "EffectiveHappiness"; private SpriteRenderer _spriteRenderer2; private SpriteRenderer _spriteRenderer3; private SpriteRenderer _spriteRenderer4; private MagicalReference expansions = new MagicalReference(); private OverlayButtons _overlayButtons; protected CIGIslandState IslandState { get { if (_islandState == null) { _islandState = CityIsland.GetParent(this).islandState; } return _islandState; } } public override List ShownProperties { get { List shownProperties = base.ShownProperties; if (!shownProperties.Contains(BuildingProperty.Happiness) && happiness > 0) { shownProperties.Add(BuildingProperty.Happiness); } return shownProperties; } } public override bool CanDemolish { get { if (!base.CanDemolish) { return false; } if (base.state == BuildingState.Normal) { CIGExpansions.ExpansionBlock blockForIndex = expansions.reference.GetBlockForIndex(tile.index); if (blockForIndex != null && !blockForIndex.Unlocked) { return false; } } return true; } } protected override void Awake() { base.Awake(); _gameStats = SingletonMonobehaviour.Instance; } protected void OnEnable() { GameEvents.Subscribe(OnUnemiShouldCloseEvent); } protected void OnDisable() { GameEvents.Unsubscribe(OnUnemiShouldCloseEvent); } protected override void OnSerialize(Dictionary values) { base.OnSerialize(values); values["EffectiveHappiness"] = _effectiveHappiness; } protected override void OnDeserialize(Dictionary values) { base.OnDeserialize(values); if (values.ContainsKey("EffectiveHappiness")) { _effectiveHappiness = (int)values["EffectiveHappiness"]; } } protected override void OnGridTileStatusChanged(GridTile.Status oldStatus) { base.OnGridTileStatusChanged(oldStatus); if (tile.status == GridTile.Status.Created) { SingletonMonobehaviour.Instance.ExecuteNextFrame(base.gameObject, GridTileStatus); SingletonMonobehaviour.Instance.ExecuteNextFrame(base.gameObject, UpdateSprite); } else if (oldStatus == GridTile.Status.Created && tile.status == GridTile.Status.Destroyed) { UpdateNeighborSprites(); GridTileStatus(); } } protected void GridTileStatus() { if (tile.status == GridTile.Status.Created && happiness > _effectiveHappiness) { IslandState.AddHappiness(happiness - _effectiveHappiness); _effectiveHappiness = happiness; serializing.Serialize(); } else if (tile.status == GridTile.Status.Destroyed && _effectiveHappiness > 0) { IslandState.AddHappiness(-_effectiveHappiness); _gameStats.AddNumberOfRocksRemoved(1); _effectiveHappiness = 0; serializing.Serialize(); } } private CIGScenery GetMultiScenery(GridIndex index) { IsometricGrid grid = tile.grid; if (grid.IsWithinBounds(index) && grid[index].Tile != null) { CIGScenery component = grid[index.u, index.v].Tile.GetComponent(); if (component != null && component.multiple) { return component; } } return null; } private bool HasMultiScenery(GridIndex index) { return GetMultiScenery(index) != null; } private int GetSpriteNumber(bool index1, bool index2, bool index3, bool index4) { int num = 0; if (index4) { num += 8; } if (index3) { num += 2; } if (index2) { num += 4; } if (index1) { num++; } return num; } private SpriteRenderer createSpriteRendererAt(int u, int v) { float x = tile.element.Grid.elementSize.x; float y = tile.element.Grid.elementSize.y; GameObject gameObject = new GameObject(); gameObject.transform.parent = base.transform; gameObject.transform.localScale = Vector3.one; gameObject.name = "MultiScenerySprite" + u + "." + v; gameObject.transform.localPosition = new Vector2((float)(u - v) * x * 0.5f, (float)(u + v) * y * -0.5f); SpriteRenderer spriteRenderer = gameObject.AddComponent(); spriteRenderer.sortingOrder = this.spriteRenderer.sortingOrder; return spriteRenderer; } public void UpdateNeighborSprites() { if (multiple) { GridIndex index = tile.index; CIGScenery multiScenery = GetMultiScenery(new GridIndex(index.u - 1, index.v)); if (multiScenery != null) { multiScenery.UpdateSprite(); } multiScenery = GetMultiScenery(new GridIndex(index.u, index.v - 1)); if (multiScenery != null) { multiScenery.UpdateSprite(); } multiScenery = GetMultiScenery(new GridIndex(index.u - 1, index.v - 1)); if (multiScenery != null) { multiScenery.UpdateSprite(); } multiScenery = GetMultiScenery(new GridIndex(index.u + 1, index.v)); if (multiScenery != null) { multiScenery.UpdateSprite(); } multiScenery = GetMultiScenery(new GridIndex(index.u, index.v + 1)); if (multiScenery != null) { multiScenery.UpdateSprite(); } multiScenery = GetMultiScenery(new GridIndex(index.u + 1, index.v + 1)); if (multiScenery != null) { multiScenery.UpdateSprite(); } multiScenery = GetMultiScenery(new GridIndex(index.u - 1, index.v + 1)); if (multiScenery != null) { multiScenery.UpdateSprite(); } multiScenery = GetMultiScenery(new GridIndex(index.u + 1, index.v - 1)); if (multiScenery != null) { multiScenery.UpdateSprite(); } } } public void UpdateSprite() { if (!multiple) { return; } GridIndex index = tile.index; bool flag = true; bool flag2 = HasMultiScenery(new GridIndex(index.u - 1, index.v)); bool flag3 = HasMultiScenery(new GridIndex(index.u, index.v - 1)); bool index2 = HasMultiScenery(new GridIndex(index.u - 1, index.v - 1)); bool flag4 = HasMultiScenery(new GridIndex(index.u + 1, index.v)); bool flag5 = HasMultiScenery(new GridIndex(index.u, index.v + 1)); bool flag6 = HasMultiScenery(new GridIndex(index.u + 1, index.v + 1)); bool index3 = HasMultiScenery(new GridIndex(index.u + 1, index.v - 1)); bool flag7 = HasMultiScenery(new GridIndex(index.u - 1, index.v + 1)); spriteRenderer.sprite = sprites[GetSpriteNumber(index2, flag3, flag2, flag)]; if (!flag4 && !flag3) { if (_spriteRenderer2 == null) { _spriteRenderer2 = createSpriteRendererAt(1, 0); } _spriteRenderer2.enabled = true; _spriteRenderer2.sprite = sprites[GetSpriteNumber(flag3, index3, flag, flag4)]; } else if (_spriteRenderer2 != null) { _spriteRenderer2.enabled = false; } if (!flag6) { if (_spriteRenderer3 == null) { _spriteRenderer3 = createSpriteRendererAt(1, 1); } _spriteRenderer3.enabled = true; _spriteRenderer3.sprite = sprites[GetSpriteNumber(flag, flag4, flag5, flag6)]; } else if (_spriteRenderer3 != null) { _spriteRenderer3.enabled = false; } if (!flag5 && !flag7 && !flag2) { if (_spriteRenderer4 == null) { _spriteRenderer4 = createSpriteRendererAt(0, 1); } _spriteRenderer4.enabled = true; _spriteRenderer4.sprite = sprites[GetSpriteNumber(flag2, flag, flag7, flag5)]; } else if (_spriteRenderer4 != null) { _spriteRenderer4.enabled = false; } } protected override void ClickHandler(GameObject target) { base.ClickHandler(target); if (base.state != BuildingState.Demolishing && base.state != BuildingState.WaitingForDemolishing) { ToggleButtons(); } } private void ToggleButtons() { if (_overlayButtons == null) { GameEvents.Invoke(new UnemiShouldCloseEvent(this)); SingletonMonobehaviour.Instance.PlayClip(Clip.ButtonClick); _overlayButtons = OverlayButtons.Get(this); _overlayButtons.ShowOpenAnimation(); _overlayButtons.DisableAllButtons(); if (ShownProperties.Count > 0) { _overlayButtons.InfoButton.EnableButton(InfoAction); } if (CanDemolish) { _overlayButtons.DemolishButton.EnableButton(DemolishAction); } } else { RemoveButtons(); } } private void RemoveButtons() { if ((bool)_overlayButtons) { OverlayButtons overlayButtonsTemp = _overlayButtons; overlayButtonsTemp.ShowCloseAnimation(delegate { UnityEngine.Object.Destroy(overlayButtonsTemp.gameObject); }); _overlayButtons = null; } } private void InfoAction() { SingletonMonobehaviour.Instance.RequestFirstPopup(delegate (State state) { ((BuildingInfoPopupState)state).SetBuildingAndContent(this, BuildingPopupContent.Info); }); } private void DemolishAction() { RemoveButtons(); CityIsland.Current.isometricIsland.destroyer.DestroyBuilding(this); } private void OnUnemiShouldCloseEvent(UnemiShouldCloseEvent e) { RemoveButtons(); } }