public override void MouseClick(UrbTile currentCursorTile)
 {
     if (!UrbAgentSpawner.SpawnAgent(AgentTemplate, currentCursorTile, out _))
     {
         Debug.LogWarning("Failed to spawn agent from click");
     }
 }
Beispiel #2
0
    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);
    }
Beispiel #3
0
    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;
    }
Beispiel #4
0
    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();
    }