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; } } }