public override bool Action(LivingEntity interactor, String interaction) { if (item == null || !base.Action(interactor, interaction)) return false; interactor.inventory.Add(item); this.item = null; this.markForDelete = true; return true; }
//constructor public Mugging(string name, string objective, string description, Vector2 start, Player player) : base(name, objective, description, start, player, WinCondition.EnemyDies, 0, 10) { mugger = new LivingEntity(new FloatRectangle(start.X, start.Y, MUGGER_WIDTH, MUGGER_WIDTH), Sprites.spritesDictionary["mugger"], 10); knife = new Weapon(20, 1, 3, "Knife", 1, 99); muggerAI = new LowAI(mugger); mugger.ai = muggerAI; entitites = new List<Entity.Entity>(); entitites.Add(mugger); EnemyToKill = mugger; //manager.CurrentWorld.manager.AddEntity(mugger); }
public virtual bool Action(LivingEntity interactor, String interaction) { if (markForDelete || interactData == null || interactData.Dialogue[interaction] == null) { return(false); } Response r = interactData.Dialogue[interaction]; //Send the message to the Render Manager here. switch (r.Action) { case ResponseAction.StartQuest: //How do we start quests? break; case ResponseAction.GiveItem: interactor.inventory.Add((Item.Item)r.Data); break; case ResponseAction.TakeItem: if (interactor.inventory.EntityInventory.Contains((Item.Item)r.Data)) { interactor.inventory.EntityInventory.Remove(((Item.Item)r.Data)); } break; case ResponseAction.Heal: interactor.health = Math.Min(interactor.health + (int)r.Data, interactor.maxHealth); break; default: break; } return(true); }
public MidAI(LivingEntity entity) : base(entity) { }
public HighAI(LivingEntity entity) : base(entity) { }
public virtual bool Action(LivingEntity interactor, String interaction) { if (markForDelete || interactData == null || interactData.Dialogue[interaction] == null) return false; Response r = interactData.Dialogue[interaction]; //Send the message to the Render Manager here. switch (r.Action) { case ResponseAction.StartQuest: //How do we start quests? break; case ResponseAction.GiveItem: interactor.inventory.Add((Item.Item) r.Data); break; case ResponseAction.TakeItem: if (interactor.inventory.EntityInventory.Contains((Item.Item) r.Data)) interactor.inventory.EntityInventory.Remove(((Item.Item) r.Data)); break; case ResponseAction.Heal: interactor.health = Math.Min(interactor.health + (int) r.Data, interactor.maxHealth); break; default: break; } return true; }
public LowAI(LivingEntity entity) : base(entity) { }
private int mapToUse; //Which map this AI is currently going for. #endregion Fields #region Constructors public CivilianAI(LivingEntity entity) : base(entity) { mapToUse = Game1.Instance.random.Next(0, 1); entity.color = Color.Green; }
/// <summary> /// Takes a path to a quest file and parses it to a quest object /// </summary> /// <param name="filename">the file path</param> /// <returns>A quest</returns> public static Quest ParseQuest(string filename) { Quest quest = null; Console.WriteLine("Quest file name: \n\t" + filename); using (StreamReader input = new StreamReader(filename)) { string data = input.ReadToEnd(); if (data.Substring(5, 12).Contains("Storyline")) { /* //load individual quests int index, end; index = data.IndexOf("Folder") + 8; end = data.IndexOf('"', index); string folder = data.Substring(index, end - index); storylineFolder = QUEST_DIRECTORY + folder; Storyline newStoryline; string[] files = Directory.GetFiles(storylineFolder); Quest loaded; //loop through all of the files in the directory foreach (string path in files) { //try and parse the quest from each file loaded = ParseQuest(path); //if the parse was successfull, add it to the log if (loaded != null) { newStoryline.Add(loaded); } } */ } else { int index, end; string attribute; //get name index = data.IndexOf("Name:") + 6; end = data.IndexOf('"', index); string name = data.Substring(index, end - index); //get world key index = data.IndexOf("World:") + 7; end = data.IndexOf('"', index); string key = data.Substring(index, end - index); //get the description index = data.IndexOf("Description:") + 13; end = data.IndexOf('"', index); string description = data.Substring(index, end - index); //get objective index = data.IndexOf("Objective:") + 11; end = data.IndexOf('"', index); string objective = data.Substring(index, end - index); //get reward index = data.IndexOf("Reward:"); index = data.IndexOf("Cash:", index) + 5; end = data.IndexOf("\n", index); attribute = data.Substring(index, end - index); int cash; if (!int.TryParse(attribute, out cash)) cash = 0; index = data.IndexOf("Q-Points:", index) + 9; end = data.IndexOf("\n", index); attribute = data.Substring(index, end - index); int qPoints; if (!int.TryParse(attribute, out qPoints)) qPoints = 0; //get start point index = data.IndexOf("Start:"); index = data.IndexOf("X:", index) + 2; end = data.IndexOf("\n", index); attribute = data.Substring(index, end - index); int X; if (!int.TryParse(attribute, out X)) X = 10; index = data.IndexOf("Y:", index) + 2; end = data.IndexOf("\r", index); attribute = data.Substring(index, end - index); int Y; if (!int.TryParse(attribute, out Y)) Y = 10; Vector2 start = new Vector2(X, Y); //get the win condition index = data.IndexOf("Condition:") + 10; end = data.IndexOf("\r", index); attribute = data.Substring(index, end - index); WinCondition condition; //win state switch (attribute) { case "EnemyDies": condition = WinCondition.EnemyDies; break; case "ObtainItem": condition = WinCondition.ObtainItem; break; case "DeliverItem": condition = WinCondition.DeliverItem; break; case "AllEnemiesDead": default: condition = WinCondition.AllEnemiesDead; break; } //get the id of the entity or item that satisfies the quest condition string target = ""; string recipient = ""; switch (condition) { case WinCondition.EnemyDies: case WinCondition.ObtainItem: //get the name of the entity index = data.IndexOf("Target:") + 7; string test = data.Substring(index); end = data.IndexOf('\n', index) - 1; target = data.Substring(index, end - index); break; case WinCondition.DeliverItem: //get the target item index = data.IndexOf("Target:") + 7; target = data.Substring(index); //get destination index = data.IndexOf("Recipient:") + 10; end = data.IndexOf('\n'); recipient = data.Substring(index, index - end); break; } #region Read Enemies //read all of the living entities Dictionary<string, Entity.LivingEntity> livingEntities = new Dictionary<string, Entity.LivingEntity>(); int endEntity = data.Length; FloatRectangle EntityRect; AI.AI ai; //string test = data.Substring(index, 10); index = 1; while((index = data.IndexOf("Living Entity:", index)) > 0) { ai = null; endEntity = data.IndexOf("End Living Enity", index); //get the id index = data.IndexOf("ID:", index) + 3; end = data.IndexOf('\r', index); string id = data.Substring(index, end - index); //get the start position //get start point index = data.IndexOf("Start:", index); index = data.IndexOf("X:", index) + 2; end = data.IndexOf("\n", index); attribute = data.Substring(index, end - index); int sX; if (!int.TryParse(attribute, out sX)) sX = 10; index = data.IndexOf("Y:", index) + 2; end = data.IndexOf("\r", index); attribute = data.Substring(index, end - index); int sY; if (!int.TryParse(attribute, out sY)) sY = 10; //get texture index = data.IndexOf("Texture:", index) + 9; end = data.IndexOf('"', index); string texturePath = data.Substring(index, end - index); GUI.Sprite sprite = GUI.Sprites.spritesDictionary[texturePath]; //create rectangle EntityRect = new FloatRectangle(sX, sY, sprite.Width, sprite.Height); //get the health index = data.IndexOf("Health:", index) + 7; end = data.IndexOf('\n', index); attribute = data.Substring(index, end - index); int health; if(!int.TryParse(attribute, out health)) { health = 0; } livingEntities[id] = new Entity.LivingEntity(EntityRect, sprite, health, null); livingEntities[id].Name = id; //get the ai index = data.IndexOf("AI:", index) + 3; end = data.IndexOf('\n', index) - 1; if (index >= 0) { attribute = data.Substring(index, end - index); switch (attribute) { case "Low": ai = new AI.LowAI(livingEntities[id]); break; case "Mid": ai = new AI.HighAI(livingEntities[id]); break; case "High": ai = new AI.HighAI(livingEntities[id]); break; default: ai = null; break; } livingEntities[id].ai = ai; livingEntities[id].inventory.Add(new Item.Weapon(50, 1, 10, "Bam", 100, 0.5)); livingEntities[id].inventory.ActiveWeapon = 0; } } #endregion #region Read Items Dictionary<string, QuestItem> items = new Dictionary<string,QuestItem>(); index = 0; int endItem = data.Length; while((index = data.IndexOf("Item:", index)) > 0) { endItem = data.IndexOf("End Item", index); //get the id index = data.IndexOf("ID:", index) + 3; end = data.IndexOf('\n', index); string id = data.Substring(index, end - index); //get the texture index = data.IndexOf("Texture:", index) + 9; end = data.IndexOf('"', index); string texturePath = data.Substring(index, end - index); GUI.Sprite sprite = GUI.Sprites.spritesDictionary[texturePath]; //create item items[id] = new QuestItem(id); items[id].Item = new Item.Item(); items[id].Item.previewSprite = sprite; } #endregion //Create the quest quest = new Quest(name, objective, description, start, null, condition, qPoints, cash); quest.worldKey = key; quest.Status = 1; //add the entities to the quests entitiy list foreach (Entity.LivingEntity entity in livingEntities.Values.ToList()) { quest.entitites.Add(entity); } //items too /* Quest needs to be updated foreach(Item.Item item in items.Values.ToArray()) { quest. } */ switch (condition) { case WinCondition.EnemyDies: quest.EnemyToKill = livingEntities[target]; break; case WinCondition.AllEnemiesDead: break; case WinCondition.ObtainItem: quest.FindThis = items[target].Item; break; case WinCondition.DeliverItem: quest.Delivery = items[target].Item; quest.Recipient = livingEntities[recipient]; break; default: break; } } } return quest; }
public AI(LivingEntity entity) { this.entity = entity; }
//Josiah S DeVizia, implemented world importation public WorldManager() { worlds = new Dictionary<String, World>(); worldQuests = new QuestLog(); //TODO: Load/Save worlds. current = "main"; player = new Player(new FloatRectangle(384, 72, 32, 32), Sprites.spritesDictionary["player"]); player.inventory.ActiveWeapon = 0; if(!worlds.ContainsKey(current)) worlds.Add(current, Game1.Instance.saveManager.LoadWorld(current)); worlds["main"].manager.AddEntity(player); // DEBUG #region debug #if false LivingEntity mugger = new LivingEntity(new FloatRectangle(384, 150, 32, 32), Sprites.spritesDictionary["player"], 10); mugger.ai = new MidAI(mugger); mugger.inventory.Add(new Item.Weapon(50, 1, 10, "Bam", 100, 0.5)); mugger.inventory.ActiveWeapon = 0; //mugger.interactData = new Entity.Entity.InteractionData(new List<String>() { "I bite my thumb at you, sir!" }); worlds["main"].manager.AddEntity(mugger); //LivingEntity civvie = new LivingEntity(new FloatRectangle(384, 247, 32, 32), Sprites.spritesDictionary["player"], 4); //civvie.ai = new CivilianAI(civvie); //civvie.interactData = new Entity.Entity.InteractionData(new List<String>() { "pls no." }); //worlds["main"].manager.AddEntity(civvie); worlds["main"].manager.AddEntity(player); Quest mugging = SaveManager.ParseQuest("./Content/Quests/Mugging.quest"); mugging.SetAvailable(); mugging.worldManager = this; player.log.Add(mugging); this.worldQuests.Add(mugging); mugging.player = player; Quest gunman = SaveManager.ParseQuest("./Content/Quests/Crazed Gunman.quest"); gunman.SetAvailable(); player.log.Add(gunman); this.worldQuests.Add(gunman); Quest war = SaveManager.ParseQuest("./Content/Quests/Gang war.quest"); war.SetAvailable(); player.log.Add(war); this.worldQuests.Add(war); Quest sniper = SaveManager.ParseQuest("./Content/Quests/Sniper.quest"); sniper.SetAvailable(); player.log.Add(sniper); this.worldQuests.Add(sniper); /* Quest sniper1 = SaveManager.ParseQuest("./Content/Quests/Sniper1.quest"); sniper1.SetAvailable(); player.log.Add(sniper1); this.worldQuests.Add(sniper1); Quest sniper2 = SaveManager.ParseQuest("./Content/Quests/Sniper2.quest"); sniper2.SetAvailable(); player.log.Add(sniper2); this.worldQuests.Add(sniper2); Quest sniper3 = SaveManager.ParseQuest("./Content/Quests/Sniper3.quest"); sniper3.SetAvailable(); player.log.Add(sniper3); this.worldQuests.Add(sniper3); Quest mugging1 = SaveManager.ParseQuest("./Content/Quests/Mugging1.quest"); mugging1.SetAvailable(); player.log.Add(mugging1); this.worldQuests.Add(mugging1); Quest mugging2 = SaveManager.ParseQuest("./Content/Quests/Mugging2.quest"); mugging2.SetAvailable(); player.log.Add(mugging2); this.worldQuests.Add(mugging2); Quest mugging3 = SaveManager.ParseQuest("./Content/Quests/Mugging3.quest"); mugging3.SetAvailable(); player.log.Add(mugging3); this.worldQuests.Add(mugging3); */ /* Quest test = new Quest("Mugging", "Kill the mugger", "You are being attacked", new Vector2(100, 1000), player, this, WinCondition.EnemyDies, 4, 50); test.EnemyToKill = mugger; test.entitites.Add(mugger); test.Status = 1; player.log.Add(test); */ #endif // need to fix fleemap lag before renabling the above. #endregion worldQuests = new QuestLog(); spawnDaemon = new SpawnDaemon(); spawnThread = new Thread(new ThreadStart(spawnDaemon.startDaemon)); }
/// <summary> /// Takes the equation of the bullet a figures out what, if anything, is hit /// </summary> /// <param name="x">The attacker x location</param> /// <param name="y">The attacker y location</param> /// <param name="i">The i component of the direction vector</param> /// <param name="j">The j component of the direction vector</param> public void FireBullet(float x, float y, float i, float j, int damage, LivingEntity shooter) { Vector2 bullet = new Vector2(x + i, y + j); Player player = Game1.Instance.worldManager.CurrentWorld.manager.GetPlayer(); #region Screen Bounds int right = player.location.IntX + (RenderManager.ViewportWidth / 2); int left = player.location.IntX - (RenderManager.ViewportWidth / 2); int top = player.location.IntY - (RenderManager.ViewportHeight / 2); int bottom = player.location.IntY + (RenderManager.ViewportHeight / 2); #endregion bool go = true; for (int t = 1; bullet.X < right && bullet.X > left && bullet.Y < bottom && bullet.Y > top && go; t++) { int tileX = (int) (bullet.X / GUI.Tile.SIDE_LENGTH); int tileY = (int) (bullet.Y / GUI.Tile.SIDE_LENGTH); if (tileX < 0 || tileY < 0 || mainGame.worldManager.CurrentWorld.tiles.Length <= tileX || mainGame.worldManager.CurrentWorld.tiles[tileX].Length <= tileY) { break; } if (!mainGame.worldManager.CurrentWorld.tiles[tileX][tileY].IsWalkable && !mainGame.worldManager.CurrentWorld.tiles[tileX][tileY].FileName.Equals("Water.png")) { break; } for (int cntr = 0; cntr < entities.Count; cntr++) { if (entities[cntr].location.Contains(bullet) && !entities[cntr].Equals(shooter)) { go = false; if (entities[cntr] is LivingEntity) { (entities[cntr] as LivingEntity).health -= damage; } else { break; } } } bullet.X += i; bullet.Y += j; } // line is from x,y to bullet hit Game1.Instance.renderManager.EmitParticle(new Line(Color.LightGoldenrodYellow, 1, new Vector2(x, y), bullet, .05)); }
/// <summary> /// Takes a path to a quest file and parses it to a quest object /// </summary> /// <param name="filename">the file path</param> /// <returns>A quest</returns> public static Quest ParseQuest(string filename) { Quest quest = null; Console.WriteLine("Quest file name: \n\t" + filename); using (StreamReader input = new StreamReader(filename)) { string data = input.ReadToEnd(); if (data.Substring(5, 12).Contains("Storyline")) { /* * //load individual quests * int index, end; * index = data.IndexOf("Folder") + 8; * end = data.IndexOf('"', index); * string folder = data.Substring(index, end - index); * storylineFolder = QUEST_DIRECTORY + folder; * * Storyline newStoryline; * * * string[] files = Directory.GetFiles(storylineFolder); * Quest loaded; * * //loop through all of the files in the directory * foreach (string path in files) * { * //try and parse the quest from each file * loaded = ParseQuest(path); * * //if the parse was successfull, add it to the log * if (loaded != null) * { * newStoryline.Add(loaded); * } * } */ } else { int index, end; string attribute; //get name index = data.IndexOf("Name:") + 6; end = data.IndexOf('"', index); string name = data.Substring(index, end - index); //get world key index = data.IndexOf("World:") + 7; end = data.IndexOf('"', index); string key = data.Substring(index, end - index); //get the description index = data.IndexOf("Description:") + 13; end = data.IndexOf('"', index); string description = data.Substring(index, end - index); //get objective index = data.IndexOf("Objective:") + 11; end = data.IndexOf('"', index); string objective = data.Substring(index, end - index); //get reward index = data.IndexOf("Reward:"); index = data.IndexOf("Cash:", index) + 5; end = data.IndexOf("\n", index); attribute = data.Substring(index, end - index); int cash; if (!int.TryParse(attribute, out cash)) { cash = 0; } index = data.IndexOf("Q-Points:", index) + 9; end = data.IndexOf("\n", index); attribute = data.Substring(index, end - index); int qPoints; if (!int.TryParse(attribute, out qPoints)) { qPoints = 0; } //get start point index = data.IndexOf("Start:"); index = data.IndexOf("X:", index) + 2; end = data.IndexOf("\n", index); attribute = data.Substring(index, end - index); int X; if (!int.TryParse(attribute, out X)) { X = 10; } index = data.IndexOf("Y:", index) + 2; end = data.IndexOf("\r", index); attribute = data.Substring(index, end - index); int Y; if (!int.TryParse(attribute, out Y)) { Y = 10; } Vector2 start = new Vector2(X, Y); //get the win condition index = data.IndexOf("Condition:") + 10; end = data.IndexOf("\r", index); attribute = data.Substring(index, end - index); WinCondition condition; //win state switch (attribute) { case "EnemyDies": condition = WinCondition.EnemyDies; break; case "ObtainItem": condition = WinCondition.ObtainItem; break; case "DeliverItem": condition = WinCondition.DeliverItem; break; case "AllEnemiesDead": default: condition = WinCondition.AllEnemiesDead; break; } //get the id of the entity or item that satisfies the quest condition string target = ""; string recipient = ""; switch (condition) { case WinCondition.EnemyDies: case WinCondition.ObtainItem: //get the name of the entity index = data.IndexOf("Target:") + 7; string test = data.Substring(index); end = data.IndexOf('\n', index) - 1; target = data.Substring(index, end - index); break; case WinCondition.DeliverItem: //get the target item index = data.IndexOf("Target:") + 7; target = data.Substring(index); //get destination index = data.IndexOf("Recipient:") + 10; end = data.IndexOf('\n'); recipient = data.Substring(index, index - end); break; } #region Read Enemies //read all of the living entities Dictionary <string, Entity.LivingEntity> livingEntities = new Dictionary <string, Entity.LivingEntity>(); int endEntity = data.Length; FloatRectangle EntityRect; AI.AI ai; //string test = data.Substring(index, 10); index = 1; while ((index = data.IndexOf("Living Entity:", index)) > 0) { ai = null; endEntity = data.IndexOf("End Living Enity", index); //get the id index = data.IndexOf("ID:", index) + 3; end = data.IndexOf('\r', index); string id = data.Substring(index, end - index); //get the start position //get start point index = data.IndexOf("Start:", index); index = data.IndexOf("X:", index) + 2; end = data.IndexOf("\n", index); attribute = data.Substring(index, end - index); int sX; if (!int.TryParse(attribute, out sX)) { sX = 10; } index = data.IndexOf("Y:", index) + 2; end = data.IndexOf("\r", index); attribute = data.Substring(index, end - index); int sY; if (!int.TryParse(attribute, out sY)) { sY = 10; } //get texture index = data.IndexOf("Texture:", index) + 9; end = data.IndexOf('"', index); string texturePath = data.Substring(index, end - index); GUI.Sprite sprite = GUI.Sprites.spritesDictionary[texturePath]; //create rectangle EntityRect = new FloatRectangle(sX, sY, sprite.Width, sprite.Height); //get the health index = data.IndexOf("Health:", index) + 7; end = data.IndexOf('\n', index); attribute = data.Substring(index, end - index); int health; if (!int.TryParse(attribute, out health)) { health = 0; } livingEntities[id] = new Entity.LivingEntity(EntityRect, sprite, health, null); livingEntities[id].Name = id; //get the ai index = data.IndexOf("AI:", index) + 3; end = data.IndexOf('\n', index) - 1; if (index >= 0) { attribute = data.Substring(index, end - index); switch (attribute) { case "Low": ai = new AI.LowAI(livingEntities[id]); break; case "Mid": ai = new AI.HighAI(livingEntities[id]); break; case "High": ai = new AI.HighAI(livingEntities[id]); break; default: ai = null; break; } livingEntities[id].ai = ai; livingEntities[id].inventory.Add(new Item.Weapon(50, 1, 10, "Bam", 100, 0.5)); livingEntities[id].inventory.ActiveWeapon = 0; } } #endregion #region Read Items Dictionary <string, QuestItem> items = new Dictionary <string, QuestItem>(); index = 0; int endItem = data.Length; while ((index = data.IndexOf("Item:", index)) > 0) { endItem = data.IndexOf("End Item", index); //get the id index = data.IndexOf("ID:", index) + 3; end = data.IndexOf('\n', index); string id = data.Substring(index, end - index); //get the texture index = data.IndexOf("Texture:", index) + 9; end = data.IndexOf('"', index); string texturePath = data.Substring(index, end - index); GUI.Sprite sprite = GUI.Sprites.spritesDictionary[texturePath]; //create item items[id] = new QuestItem(id); items[id].Item = new Item.Item(); items[id].Item.previewSprite = sprite; } #endregion //Create the quest quest = new Quest(name, objective, description, start, null, condition, qPoints, cash); quest.worldKey = key; quest.Status = 1; //add the entities to the quests entitiy list foreach (Entity.LivingEntity entity in livingEntities.Values.ToList()) { quest.entitites.Add(entity); } //items too /* Quest needs to be updated * foreach(Item.Item item in items.Values.ToArray()) * { * quest. * } */ switch (condition) { case WinCondition.EnemyDies: quest.EnemyToKill = livingEntities[target]; break; case WinCondition.AllEnemiesDead: break; case WinCondition.ObtainItem: quest.FindThis = items[target].Item; break; case WinCondition.DeliverItem: quest.Delivery = items[target].Item; quest.Recipient = livingEntities[recipient]; break; default: break; } } } return(quest); }