public RotatedRectangle(FloatRectangle theRectangle, float theInitialRotation, Vector2?theOrigin = null) { collisionRectangle = theRectangle; rotation = theInitialRotation; //Calculate the Rectangles origin. We assume the center of the Rectangle will //be the point that we will be rotating around and we use that for the origin if (theOrigin == null) { origin = new Vector2(theRectangle.Width / 2, theRectangle.Height / 2); } else { origin = (Vector2)theOrigin; } }
/// <summary> /// This intersects method can be used to check a standard XNA framework Rectangle /// object and see if it collides with a Rotated Rectangle object /// </summary> /// <param name="theRectangle"></param> /// <returns></returns> public bool Intersects(FloatRectangle theRectangle) { return(Intersects(new RotatedRectangle(theRectangle, 0.0f))); }
/// <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); }