Esempio n. 1
0
        public override bool OnSenseEvent(Sheriff sheriff, Sense sense)
        {
            if (!sheriff.IsDead)
            {
                if (typeof(Outlaw) == AgentManager.GetAgent(sense.Sender).GetType()) // outlaw spotted
                {
                    if (!sheriff.OutlawSpotted && !AgentManager.GetAgent(sense.Sender).IsDead)
                    {
                        Printer.Print(sheriff.Id, "Sure glad to see you bandit, but hand me those guns.");
                        sheriff.OutlawSpotted = true;
                        Message.DispatchMessage(0, sheriff.Id, sense.Sender, MessageType.SheriffEncountered);

                        return(true);
                    }
                }
                else // greetings
                {
                    Printer.Print(sheriff.Id, "Good day, townie!");
                    Message.DispatchMessage(0, sheriff.Id, sense.Sender, MessageType.SheriffEncountered);

                    return(true);
                }
            }

            return(false);
        }
Esempio n. 2
0
        public override void Execute(Undertaker undertaker)
        {
            if (path.Count > 0)
            {
                for (int i = 0; i < path.Count; ++i)
                {
                    path[i].TintColor = Color.Black;
                    path[i].TintAlpha = 0.5f;
                }

                undertaker.CurrentPosition = path[0].Position;
                path.RemoveAt(0);
            }
            else
            {
                undertaker.CurrentPosition = targetPosition;

                State <Undertaker> previousState = undertaker.StateMachine.PreviousState;
                undertaker.StateMachine.ChangeState(targetState);
                undertaker.StateMachine.PreviousState = previousState;
            }

            if (undertaker.CorpseID >= 0)
            {
                AgentManager.GetAgent(undertaker.CorpseID).CurrentPosition = undertaker.CurrentPosition;
            }
        }
Esempio n. 3
0
        public static void UpdateSensors()
        {
            // Agents pairwise check
            for (int i = 0; i < AgentManager.GetCount(); ++i)
            {
                Agent a1 = AgentManager.GetAgent(i);
                for (int j = 0; j < AgentManager.GetCount(); ++j)
                {
                    if (i != j)
                    {
                        Agent a2 = AgentManager.GetAgent(j);

                        // If close enough
                        if (Vector2.Distance(a1.CurrentPosition, a2.CurrentPosition) < SENSE_RANGE)
                        {
                            // Propogate the sense
                            if (propogator.PropogateSense(a1.CurrentPosition, a2.CurrentPosition))
                            {
                                // Sense the agent
                                Sense sense = new Sense(a2.Id, a1.Id, SenseType.Sight);
                                a1.HandleSenseEvent(sense);
                            }
                        }
                    }
                }
            }
        }
Esempio n. 4
0
 // This sends any messages that are due for delivery; invoked at each tick by the game's Update() method
 public static void SendDelayedMessages()
 {
     for (int i = 0; i < telegramQueue.Count; i++)
     {
         if (telegramQueue[i].DispatchTime <= gameTime.TotalGameTime.Ticks)
         {
             Agent receivingAgent = AgentManager.GetAgent(telegramQueue[i].Receiver);
             SendMessage(receivingAgent, telegramQueue[i]);
             telegramQueue.RemoveAt(i);
         }
     }
 }
Esempio n. 5
0
        public override bool OnMesssage(Undertaker undertaker, Telegram telegram)
        {
            switch (telegram.messageType)
            {
            case MessageType.Gunfight:
                Printer.Print(undertaker.Id, "Let's get down to business!");

                undertaker.StateMachine.ChangeState(new UndertakerTravelToTarget(AgentManager.GetAgent(telegram.Sender).CurrentPosition, new LookForDeadBodies()));

                return(true);

            default:
                return(false);
            }
        }
Esempio n. 6
0
        public override bool OnMesssage(Sheriff sheriff, Telegram telegram)
        {
            switch (telegram.messageType)
            {
            case MessageType.Gunfight:
                // Notify the undertaker
                Message.DispatchMessage(0, sheriff.Id, Agent.AgentsCount - 1, MessageType.Gunfight);

                // Gunfight
                Outlaw outlaw = (AgentManager.GetAgent(telegram.Sender) as Outlaw);

                if (rand.Next(10) == 1)     // sheriff dies
                {
                    outlaw.GoldCarrying += sheriff.GoldCarrying;
                    sheriff.GoldCarrying = 0;

                    Message.DispatchMessage(0, sheriff.Id, sheriff.Id, MessageType.Dead);
                }
                else     // outlaw dies
                {
                    Printer.Print(sheriff.Id, "I am not coward, but I am so strong. It is hard to die.");

                    sheriff.GoldCarrying += outlaw.GoldCarrying;
                    outlaw.GoldCarrying   = 0;

                    Message.DispatchMessage(0, sheriff.Id, outlaw.Id, MessageType.Dead);

                    sheriff.StateMachine.ChangeState(new SheriffTravelToTarget(Location.bank, new StopByBankAndDepositGold()));
                }

                sheriff.OutlawSpotted = false;

                return(true);

            case MessageType.Dead:
                sheriff.StateMachine.ChangeState(new DropDeadSheriff());
                return(true);

            case MessageType.Respawn:
                sheriff.StateMachine.ChangeState(new PatrolRandomLocation());
                return(true);

            default:
                return(false);
            }
        }
Esempio n. 7
0
        // This message is used by agents to dispatch messages to other agents -- use this from your own agents
        public static void DispatchMessage(double delay, int sender, int receiver, MessageType messageType)
        {
            Agent sendingAgent   = AgentManager.GetAgent(sender);
            Agent receivingAgent = AgentManager.GetAgent(receiver);

            Telegram telegram = new Telegram(0, sender, receiver, messageType);

            if (delay <= 0.0f)
            {
                Printer.PrintMessageData("Instant telegram dispatched by " + sender + " for " + receiver + " message is " + MessageToString(messageType));
                SendMessage(receivingAgent, telegram);
            }
            else
            {
                telegram.DispatchTime = (int)gameTime.TotalGameTime.Ticks + delay;
                telegramQueue.Add(telegram);
                Printer.PrintMessageData("Delayed telegram from " + sender + " recorded at time " + gameTime.TotalGameTime.Ticks);
            }
        }
Esempio n. 8
0
        public override void Execute(Undertaker undertaker)
        {
            for (int i = 0; i < Agent.AgentsCount; ++i)
            {
                if (AgentManager.GetAgent(i).IsDead)
                {
                    if (undertaker.CurrentPosition != AgentManager.GetAgent(i).CurrentPosition)
                    {
                        undertaker.StateMachine.ChangeState(new UndertakerTravelToTarget(AgentManager.GetAgent(i).CurrentPosition, new LookForDeadBodies()));
                        return;
                    }
                    undertaker.CorpseID = i;
                }
            }

            Printer.Print(undertaker.Id, "Found the corpse of " + AgentManager.GetAgent(undertaker.CorpseID).GetType().Name + ".");

            if (undertaker.CorpseID >= 0)
            {
                undertaker.StateMachine.ChangeState(new UndertakerTravelToTarget(Location.cemetery, new DragOffTheBody()));
            }
        }
Esempio n. 9
0
        public void Draw(SpriteBatch spriteBatch, int screenOffsetX, int screenOffsetY)
        {
            spriteBatch.Begin();

            // tiles
            for (int i = 0; i < mapRows; ++i)
            {
                int y = screenOffsetY + (i - (mapRows - 1) / 2) * tileSize - tileSize / 2;
                for (int j = 0; j < mapCols; ++j)
                {
                    int x = screenOffsetX + (j - (mapCols - 1) / 2) * tileSize - tileSize / 2;

                    // terrain
                    spriteBatch.Draw(terrainSet, new Rectangle(x, y, tileSize, tileSize), GetSourceRectangle(tiles[i][j].TileID, terrainSet.Height), Color.White);

                    // location
                    if (tiles[i][j].LocationID >= 0)
                    {
                        spriteBatch.Draw(locationSet, new Rectangle(x, y, tileSize, tileSize), GetSourceRectangle(tiles[i][j].LocationID, locationSet.Height), Color.White);
                    }

                    // overlay
                    spriteBatch.Draw(overlay, new Rectangle(x, y, tileSize, tileSize), tiles[i][j].TintColor * tiles[i][j].TintAlpha);
                }
            }

            // characters
            for (int i = 0; i < AgentManager.GetCount(); ++i)
            {
                Vector2 position = AgentManager.GetAgent(i).CurrentPosition;
                int     x        = screenOffsetX + ((int)position.X - (mapCols - 1) / 2) * tileSize - tileSize / 2;
                int     y        = screenOffsetY + ((int)position.Y - (mapRows - 1) / 2) * tileSize - tileSize / 2;

                spriteBatch.Draw(characterSet, new Rectangle(x, y, tileSize, tileSize), GetSourceRectangle(i, characterSet.Height), Color.White);
            }

            spriteBatch.End();
        }
Esempio n. 10
0
        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // Here's a little hack: The Miner and MinersWife must know each other's id in
            // order to communicate.  We calculate them inside each agent based on their
            // creation order, so the pair must always be created in this sequence.
            Map = new TileMap();

            Bob   = new Miner();
            Elsa  = new MinersWife();
            Jesse = new Outlaw();
            Wyatt = new Sheriff();
            Ripp  = new Undertaker();

            AgentManager.AddAgent(Bob);
            AgentManager.AddAgent(Elsa);
            AgentManager.AddAgent(Jesse);
            AgentManager.AddAgent(Wyatt);
            AgentManager.AddAgent(Ripp);

            // TODO: We could add more agents here

            base.Initialize();
        }