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 _tilesInRange = new List(); 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(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; } } }