public override void LoadXml(XElement xmlNode) { string spriteName = "Default"; string partName = null; XAttribute spriteNameAttr = xmlNode.Attribute("name"); if (spriteNameAttr != null) { spriteName = spriteNameAttr.Value; } XAttribute partAttr = xmlNode.Attribute("part"); if (partAttr != null) { partName = partAttr.Value; } if (xmlNode.Attribute("tilesheet") != null) // explicitly specified sheet for this sprite { _sheetPath = System.IO.Path.Combine(Game.CurrentGame.BasePath, xmlNode.RequireAttribute("tilesheet").Value); } Sprite sprite = GameXmlReader.LoadSprite(xmlNode); sprite.SheetPath = FilePath.FromAbsolute(_sheetPath, Game.CurrentGame.BasePath); Add(spriteName, sprite, partName); }
public static Sprite GetSpriteFromFile(string filename, string basePath = null) { String xmlInput = TestHelpers.GetInputFile(filename); var xmlNode = XElement.Parse(xmlInput); if (basePath == null) { return(GameXmlReader.LoadSprite(xmlNode)); } else { return(GameXmlReader.LoadSprite(xmlNode, basePath)); } }
public void Load(Project project, XElement xmlNode) { foreach (var node in xmlNode.Elements("Entity")) { var info = new EntityInfo() { Name = node.RequireAttribute("name").Value, MaxAlive = node.TryAttribute <int>("maxAlive", 50) }; var editorData = node.Element("EditorData"); if (editorData != null) { info.EditorData = new EntityEditorData() { DefaultSpriteName = editorData.TryAttribute <string>("defaultSprite"), HideFromPlacement = editorData.TryAttribute <bool>("hide", false) }; } FilePath sheetPath = null; var sheetNode = node.Element("Tilesheet"); if (sheetNode != null) { sheetPath = FilePath.FromRelative(sheetNode.Value, project.BaseDir); } foreach (var spriteNode in node.Elements("Sprite")) { if (sheetPath == null) { var sprite = GameXmlReader.LoadSprite(spriteNode, project.BaseDir); info.Sprites.Add(sprite.Name ?? "Default", sprite); } else { var sprite = GameXmlReader.LoadSprite(spriteNode); sprite.SheetPath = sheetPath; info.Sprites.Add(sprite.Name ?? "Default", sprite); } } project.AddEntity(info); } }
public static Effect LoadEffectAction(XElement node) { Effect effect = e => { }; switch (node.Name.LocalName) { case "Call": effect = GetLateBoundEffect(node.Value); break; case "Spawn": effect = LoadSpawnEffect(node); break; case "Remove": effect = entity => { entity.Remove(); }; break; case "Die": effect = entity => { entity.Die(); }; break; case "AddInventory": string itemName = node.RequireAttribute("item").Value; int quantity = node.TryAttribute <int>("quantity", 1); effect = entity => { Game.CurrentGame.Player.CollectItem(itemName, quantity); }; break; case "RemoveInventory": string itemNameUse = node.RequireAttribute("item").Value; int quantityUse = node.TryAttribute <int>("quantity", 1); effect = entity => { Game.CurrentGame.Player.UseItem(itemNameUse, quantityUse); }; break; case "UnlockWeapon": string weaponName = node.RequireAttribute("name").Value; effect = entity => { Game.CurrentGame.Player.UnlockWeapon(weaponName); }; break; case "DefeatBoss": string name = node.RequireAttribute("name").Value; effect = entity => { Game.CurrentGame.Player.DefeatBoss(name); }; break; case "Lives": int add = int.Parse(node.RequireAttribute("add").Value); effect = entity => { Game.CurrentGame.Player.Lives += add; }; break; case "GravityFlip": bool flip = node.GetValue <bool>(); effect = entity => { entity.Container.IsGravityFlipped = flip; }; break; case "Func": effect = entity => { }; string[] statements = node.Value.Split(';'); foreach (string st in statements.Where(st => !string.IsNullOrEmpty(st.Trim()))) { LambdaExpression lambda = System.Linq.Dynamic.DynamicExpression.ParseLambda( new[] { posParam, moveParam, sprParam, inputParam, collParam, ladderParam, timerParam, healthParam, stateParam, weaponParam, playerParam }, typeof(SplitEffect), null, st, dirDict); effect += CloseEffect((SplitEffect)lambda.Compile()); } break; case "Trigger": string conditionString; if (node.Attribute("condition") != null) { conditionString = node.RequireAttribute("condition").Value; } else { conditionString = node.Element("Condition").Value; } Condition condition = ParseCondition(conditionString); Effect triggerEffect = LoadTriggerEffect(node.Element("Effect")); effect += (e) => { if (condition(e)) { triggerEffect(e); } }; break; case "Pause": effect = entity => { entity.Paused = true; }; break; case "Unpause": effect = entity => { entity.Paused = false; }; break; case "Next": var transfer = GameXmlReader.LoadHandlerTransfer(node); effect = e => { Game.CurrentGame.ProcessHandler(transfer); }; break; case "Palette": var paletteName = node.RequireAttribute("name").Value; var paletteIndex = node.GetAttribute <int>("index"); effect = e => { var palette = PaletteSystem.Get(paletteName); if (palette != null) { palette.CurrentIndex = paletteIndex; } }; break; case "Delay": var delayFrames = node.GetAttribute <int>("frames"); var delayEffect = LoadEffect(node); effect = e => { Engine.Instance.DelayedCall(() => delayEffect(e), null, delayFrames); }; break; case "SetVar": var varname = node.RequireAttribute("name").Value; var value = node.RequireAttribute("value").Value; effect = e => { Game.CurrentGame.Player.SetVar(varname, value); }; break; default: effect = GameEntity.ParseComponentEffect(node); break; } return(effect); }