Example #1
0
 private void OnEnvironmentEvent(EnvironmentEvent e)
 {
     if (e.type == EnvironmentEventType.HideConcept)
     {
         displayParent.gameObject.SetActive(true);
     }
     else if (e.type == EnvironmentEventType.ShowConcept)
     {
         displayParent.gameObject.SetActive(false);
     }
 }
Example #2
0
 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();
     }
 }
Example #3
0
 public void Warn(EnvironmentEvent _event)
 {
     _latestEvents.Enqueue(_event);
     _makeDecision.Release();
 }
Example #4
0
 abstract protected void MakeDecision(EnvironmentEvent latestEvent);
Example #5
0
        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;
            }
            }
        }
Example #6
0
        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;
            }
            }
        }
Example #7
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;
            }
            }
        }