gather-and-defend/Assets/Scripts/Ally/ProductionBuilding.cs

65 lines
1.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class ProductionBuilding : House
{
[SerializeField]
private int _range;
[SerializeField]
private float _multiplier;
private const float _pollNearbyTilesInterval = 1.0f;
public override float PopulationGiven => GlobalConfig.Instance.Current.populationGivenPerHouseUpgrade;
protected abstract Enum.ResourceNodeType RessourceNodeType { get; }
private Vector3 _position;
private List<ResourceTile> _tilesInRange = new List<ResourceTile>();
public override void Start()
{
base.Start();
_position = Position;
StartCoroutine(PollNearbyTiles());
}
IEnumerator PollNearbyTiles()
{
ApplyMultiplier(1 / _multiplier);
for (int i = -_range; i <= _range; i++)
{
for (int j = -_range; j <= _range; j++)
{
Vector3 checkPosition = new Vector3(Mathf.Floor(_position.x) + i, Mathf.Floor(_position.y) + j, 0.0f);
var tile = LevelManager.Instance.Get<ResourceTile>(t => t.Position == checkPosition);
if (tile == default) continue;
var checkResourceType = tile.ResourceNodeType;
if (checkResourceType != RessourceNodeType) continue;
if (!_tilesInRange.Contains(tile))
{
_tilesInRange.Add(tile);
}
}
}
ApplyMultiplier(_multiplier);
yield return new WaitForSeconds(_pollNearbyTilesInterval);
StartCoroutine(PollNearbyTiles());
}
public override void LevelDestroy()
{
ApplyMultiplier(1 / _multiplier);
base.LevelDestroy();
}
private void ApplyMultiplier(float multiplier)
{
foreach (var tile in _tilesInRange)
{
tile.YieldSpeedMultiplier *= multiplier;
}
}
}