public override void MouseClick(UrbTile currentCursorTile) { if (!UrbAgentSpawner.SpawnAgent(AgentTemplate, currentCursorTile, out _)) { Debug.LogWarning("Failed to spawn agent from click"); } }
public static UrbAgent LoadAgentFromID(int ID, UrbTile Tile, UrbObjectData Data) { if (ID < 0 || !HasInstance || ID >= Instance.AgentTypes.Count) { return(null); } if (!UrbAgentSpawner.SpawnAgent(Instance.AgentTypes[ID], Tile, out var AgentObject, Data)) { return(null); } UrbAgent LoadedAgent = AgentObject.GetComponent <UrbAgent>(); return(LoadedAgent); }
protected IEnumerator AttemptSpawn() { //TODO: Make spawning cost energy ? SetOffspringTemplate(Random.Range(0, OffspringObjects.Length)); if (LastBreedTile != mAgent.CurrentTile) { LastBreedTile = mAgent.CurrentTile; SearchCache = DispersalDistance < 0 ? mAgent.Tileprint.GetAllPrintTiles(mAgent) : mAgent.Tileprint.GetBorderingTiles(mAgent, true, DispersalDistance); } Delay = Random.Range((int)0, (int)(SearchCache.Length / 2)); NumberOffspring = 0; for (int t = 0; t < SearchCache.Length; t++) { if (--Delay > 0) { _birthStatus = "not ready to spawn"; continue; } var current = SearchCache[t]; if (current == null) { _birthStatus = $"tile {t} was null"; continue; } if (current.Blocked) { _birthStatus = "tile was blocked"; continue; } if (!current.TerrainPassable(RequiredOffspringTerrain) || current.RemainingCapacity < OffspringRequiredSpace) { _birthStatus = "terrain not passable or doesnt match required space"; continue; } if (NumberOffspring >= OffspringCount) { _birthStatus = "Too many offspring"; break; } if (mAgent.mBody.BodyComposition.ContainsLessThan(GestationRecipe)) { _birthStatus = "Not enough resources to spawn baby"; break; } yield return(BehaviourThrottle.PerformanceThrottle()); if (UrbAgentSpawner.SpawnAgent(OffspringAgent, SearchCache[t], out OffspringObject, OffspringData[OffspringChoice])) { SetOffspringData(OffspringObject.GetComponent <UrbAgent>()); Delay = Random.Range((int)0, (int)2); NumberOffspring++; mAgent.mBody.BodyComposition.RemoveRecipe(GestationRecipe); if (mAgent.Metabolism != null && OffspringAgent != null) { mAgent.Metabolism.SpendEnergy(OffspringAgent.Mass); } SetOffspringTemplate(Random.Range(0, OffspringObjects.Length)); } else { _birthStatus = "Spawn attempt failed"; logger.LogWarning("Failed to spawn offspring", mAgent); } } Gestating = false; }
public override void ExecuteTileBehaviour() { if (PossibleProducts == null || PossibleProducts.Length == 0) { Debug.LogWarning("Attempting Split with no Split Products on " + gameObject.name); return; } UrbTile[] SplitTileTargets = mAgent.OccupiedTiles; if (SplitTileTargets == null || SplitTileTargets.Length == 0) { SplitTileTargets = mAgent.Tileprint.GetAllPrintTiles(mAgent); } float AvailableMass = mAgent.Mass; for (int p = 0; p < PossibleProducts.Length; p++) { UrbSplitProduct PossibleProduct = PossibleProducts[p]; if (AvailableMass < PossibleProduct.ProductRequiredMass) { continue; } for (int s = 0; s < SplitTileTargets.Length; s++) { UrbTile Tile = SplitTileTargets[s]; if (Tile == null || Tile.Blocked) { continue; } if (PossibleProduct.RequiredSpace > Tile.RemainingCapacity) { continue; } if (PossibleProduct.ProductRequiredMass > AvailableMass) { break; } GameObject SplitObject; if (UrbAgentSpawner.SpawnAgent(PossibleProduct.ProductAgent, Tile, out SplitObject)) { AvailableMass -= PossibleProduct.ProductRequiredMass; UrbMetabolism SplitMetabolism = SplitObject.GetComponent <UrbMetabolism>(); if (SplitMetabolism != null) { SplitMetabolism.GrowBody(PossibleProduct.ProductRequiredMass); } } } } mAgent.Remove(); base.ExecuteTileBehaviour(); }