Esempio n. 1
0
        protected override void MakeDecision(EnvironmentEvent latestEvent)
        {
            switch (CurrentTask)
            {
            case (CarrierTask.None):
            {
                // TODO other behaviors
                // if hungry, go eat
                // if thirsty, go drink
                CurrentTask = CarrierTask.GoingToLumberMill;
                GoTo(Workplace.Position);
                break;
            }

            case (CarrierTask.GoingToLumberMill):
            {
                if (Position.IsNextTo(Workplace.Position))
                {
                    CurrentTask = CarrierTask.PickUpWood;
                    Workplace.Consort(this);
                    SetFacingDirection(Workplace.Position);

                    // in case lumbermill already has the supply needed
                    Warn(EnvironmentEvent.Auto);
                }
                else     // keep going to lumberMill
                {
                    GoTo(Workplace.Position);
                }
                break;
            }

            case (CarrierTask.PickUpWood):
            {
                int woodAvailable = Workplace.CheckWood();
                int woodNeeded    = MAX_LOAD_SIZE - LoadSize;
                if (woodAvailable >= woodNeeded)
                {
                    LoadSize += Workplace.DiscardWood(woodNeeded);

                    Building cs = Pathfinding.FindClosest <Building>(Position, (x => x.InConstruction && x.NeedWood()), true);
                    if (cs != null)
                    {
                        CurrentTask = CarrierTask.GoingToConstructionSite;
                        GoTo(cs.Position);
                    }

                    Warn(EnvironmentEvent.WoodPickedUp);
                }
                break;
            }

            case (CarrierTask.GoingToConstructionSite):
            {
                Building cs = Pathfinding.FindClosest <Building>(Position, (x => x.InConstruction && x.NeedWood()), true);
                if (cs != null)
                {
                    if (Position.IsNextTo(cs.Position))
                    {
                        LoadSize -= cs.AddWood(LoadSize);

                        // If load remaining, give it to another construction site
                        if (LoadSize > 0)
                        {
                            CurrentTask = CarrierTask.GoingToConstructionSite;
                        }
                        else
                        {
                            CurrentTask = CarrierTask.None;
                        }

                        Warn(EnvironmentEvent.WoodStored);
                    }
                    else     // keep going to construction site
                    {
                        GoTo(cs.Position);
                    }
                }
                else
                {
                    CurrentTask = CarrierTask.GoingToLumberMill;
                    GoTo(Workplace.Position);
                }
                break;
            }

            default:
            {
                break;
            }
            }
        }