private void OnEnvironmentEvent(EnvironmentEvent e) { if (e.type == EnvironmentEventType.HideConcept) { displayParent.gameObject.SetActive(true); } else if (e.type == EnvironmentEventType.ShowConcept) { displayParent.gameObject.SetActive(false); } }
protected void Run() { while (true) // While the Villager lives { // Decision making process // Wait for main thread to warn me about making a decision EnvironmentEvent latestEvent = Wait(); // Wait until its my turn //HomeTown.AITurn.WaitOne(); MakeDecision(latestEvent); //HomeTown.AITurn.Release(); } }
public void Warn(EnvironmentEvent _event) { _latestEvents.Enqueue(_event); _makeDecision.Release(); }
abstract protected void MakeDecision(EnvironmentEvent latestEvent);
protected override void MakeDecision(EnvironmentEvent latestEvent) { CurrentState = WoodcutterState.Thinking; switch (CurrentTask) { case (WoodcutterTask.None): { // TODO other behaviors // if hungry, go eat // if thirsty, go drink // else, go cut wood Tree tree = FindUnusedTree(); if (tree != null) { CurrentTask = WoodcutterTask.GoingToTree; CurrentState = WoodcutterState.Walking; GoTo(tree.Position); } break; } case (WoodcutterTask.GoingToTree): { Tree tree = FindUnusedTree(); if (tree != null) { if (Position.IsNextTo(tree.Position)) { if (tree.Consort(this)) { CurrentState = WoodcutterState.Cutting; CurrentTask = WoodcutterTask.PickUpWood; SetFacingDirection(tree.Position); } else { Warn(EnvironmentEvent.Auto); } } else // keep going to tree { CurrentState = WoodcutterState.Walking; GoTo(tree.Position); } } break; } case (WoodcutterTask.PickUpWood): { if (latestEvent == EnvironmentEvent.TreeCutted) { Tree tree = FindMyTree(); if (tree != null) { tree.Deconsort(); TileMap.Tiles[tree.Position.X, tree.Position.Y].RemoveObject(tree); WoodCount++; CurrentTask = WoodcutterTask.GoingToLumberMill; CurrentState = WoodcutterState.Walking; Warn(EnvironmentEvent.WoodPickedUp); } } break; } case (WoodcutterTask.GoingToLumberMill): { LumberMill lumbermill = Pathfinding.FindClosest <LumberMill>(Position); if (lumbermill != null) { if (Position.IsNextTo(lumbermill.Position)) { WoodCount -= lumbermill.StoreWood(WoodCount); CurrentTask = WoodcutterTask.None; Warn(EnvironmentEvent.WoodStored); } else { CurrentTask = WoodcutterTask.GoingToLumberMill; CurrentState = WoodcutterState.Walking; GoTo(lumbermill.Position); } } break; } default: { break; } } }
protected override void MakeDecision(EnvironmentEvent latestEvent) { switch (CurrentTask) { case (BuilderTask.None): { Building cs = FindUnattendedConstructionSite(); if (cs != null) { CurrentTask = BuilderTask.GoingToConstructionSite; GoTo(cs.Position); } break; } case (BuilderTask.GoingToConstructionSite): { Building cs = FindUnattendedConstructionSite(); if (cs != null) { if (Position.IsNextTo(cs.Position)) { if (cs.Consort(this)) { CurrentTask = BuilderTask.Build; SetFacingDirection(cs.Position); } else { Warn(EnvironmentEvent.Auto); } } else { GoTo(cs.Position); } } break; } case (BuilderTask.Build): { if (latestEvent == EnvironmentEvent.BuildingBuilt) { Building cs = FindMyConstructionSite(); //cs.Build(); //TileMap.Tiles[cs.Position.X, cs.Position.Y].AddObject(new House(HomeTown)); cs.Deconsort(); //TileMap.Tiles[cs.Position.X, cs.Position.Y].RemoveObject(cs); CurrentTask = BuilderTask.None; Warn(EnvironmentEvent.Auto); } break; } default: { break; } } }
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; } } }