using System; using System.Collections.Generic; using System.Linq; using CIGEnums; using SUISSEngine; using UnityEngine; public class CIGAnimalManager : MonoBehaviour { private void Start() { this.animalAllowedTiles = this.horsePrefabs[0].GetComponent(); base.transform.position = this.grid.transform.position; this.InitialiseAnimals(); } private void InitialiseAnimals() { List freeBlocks = this.GetFreeBlocks(); if (freeBlocks.Count == 0) { UnityEngine.Debug.LogWarning("No free blocks for animals; no animals"); return; } CIGExpansions.ExpansionBlock block = freeBlocks[UnityEngine.Random.Range(0, freeBlocks.Count)]; List suitableElements = this.GetSuitableElements(block); List list = new List(); for (int i = 0; i < this.animalCount; i++) { CIGMovingUnit cigmovingUnit = this.CreateHorseAt(new GridPoint(suitableElements[UnityEngine.Random.Range(0, suitableElements.Count)].Index)); cigmovingUnit.SetTargetLocation(new GridPoint(suitableElements[UnityEngine.Random.Range(0, suitableElements.Count)].Index)); list.Add(cigmovingUnit.GetComponent()); } foreach (Boid boid in list) { boid.SetHerd(list); } } private CIGMovingUnit CreateHorseAt(GridPoint place) { GameObject gameObject = UnityEngine.Object.Instantiate(this.horsePrefabs[UnityEngine.Random.Range(0, this.horsePrefabs.Count())]); gameObject.transform.parent = base.transform; CIGMovingUnit component = gameObject.GetComponent(); component.SpawnAt(this.grid, place); return component; } private List GetFreeBlocks() { List list = new List(); foreach (CIGExpansions.ExpansionBlock expansionBlock in this.expansions.AllBlocks) { if (expansionBlock != null) { if (this.animalAllowedTiles == null) { UnityEngine.Debug.LogError("Animal prefab has no attached element type list, to get the allowed tiles to walk on"); } else if (!expansionBlock.Unlocked && this.GetSuitableElements(expansionBlock).Count > expansionBlock.AvailableElements / 2) { list.Add(expansionBlock); } } } return list; } private List GetSuitableElements(CIGExpansions.ExpansionBlock block) { List list = new List(); for (int i = block.Origin.u; i < block.Origin.u + block.Size.u; i++) { for (int j = block.Origin.v; j < block.Origin.v + block.Size.v; j++) { GridElement gridElement = this.grid[i, j]; foreach (SurfaceType surfaceType in this.animalAllowedTiles.elementTypes) { if (gridElement.Type == (int)surfaceType) { list.Add(gridElement); } } } } return list; } [SerializeField] private IsometricGrid grid; [SerializeField] private CIGExpansions expansions; [SerializeField] private GameObject[] horsePrefabs; public int animalCount = 10; private AttachedElementTypeList animalAllowedTiles; }