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); }
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; } }
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); } } } } } }
// 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); } } }
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); } }
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); } }
// 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); } }
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())); } }
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(); }