public void PerformResult() { if (!World.GetContentsFromID(ResultContentsID, out Contents contents)) { // Contents was destroyed - or does not exist return; } // Making lowercase provides less ability to mess up switch (ResultType.ToLower()) { case "useaction": if (!UseActions.TryGetAction(ResultInformation, out Action <string[], Contents> useAction)) { Output.WriteLineTagged("Contents: " + contents.Name + " (" + contents.ID + ") has an incorrect UseAction.", Output.Tag.Error); return; } useAction(new string[0], contents); break; case "behavior": if (!Behavior.TryGetBehaviors(ResultInformation.Split(","), out Action <Contents>[] behaviors))
// This is a child function of the one above. It recursively gets all contents, since a contents can contain a contents. // This is the only reasonable way to get all contents (thus, the name) private static List <Contents> GetAllContents(XmlReader xr) { List <Contents> contentsList = new List <Contents>(); if (!xr.HasAttributes) { contentsList.Add(null); xr.Read(); return(contentsList); } while (xr.Name == "Contents") { Contents contents = new Contents("", 0, ' ', true, 1, 1, 1f, UseActions.DoesNothing, new Action <Contents>[] { Behavior.DoesNothing }); xr.MoveToNextAttribute(); contents.Name = xr.Value; xr.MoveToNextAttribute(); contents.ID = int.Parse(xr.Value); if (contents.ID > Contents.uniqueIndex) { Contents.uniqueIndex = contents.ID; } xr.MoveToNextAttribute(); contents.VisualChar = xr.Value[0]; xr.MoveToNextAttribute(); contents.Transparent = bool.Parse(xr.Value); xr.MoveToNextAttribute(); contents.Durability = int.Parse(xr.Value); xr.MoveToNextAttribute(); contents.Size = int.Parse(xr.Value); xr.MoveToNextAttribute(); contents.Weight = float.Parse(xr.Value); xr.MoveToNextAttribute(); contents.Container = bool.Parse(xr.Value); xr.MoveToNextAttribute(); contents.ContainerSpace = int.Parse(xr.Value); xr.MoveToNextAttribute(); UseActions.TryGetAction(xr.Value, out Action <string[], Contents> action); contents.UseAction = action; xr.MoveToNextAttribute(); Behavior.TryGetBehaviors(xr.Value.Split(','), out Action <Contents>[] behaviors); contents.Behaviors = behaviors; xr.Read(); if (xr.HasValue) { contents.Contained = GetAllContents(xr); } xr.Read(); xr.MoveToNextAttribute(); contents.Tags = xr.Value.Split(','); xr.Read(); xr.Read(); contentsList.Add(contents); } return(contentsList); }
// Used in InterpretTile() and other cases. Prompts user for all aspects of Contents public static bool InterpretContents(out Contents result) { Output.WriteLineToConsole("\nContents"); result = null; int uniqueID = Contents.UniqueID(); Dictionary <string, string> preContainerParamMap = new Dictionary <string, string>() { { "Name", GetUserResponse("Name (unique identifier)<string>:") }, { "VisualChar", GetUserResponse("Visual character (to represent on the grid)<character>:") }, { "Transparent", GetUserResponse("Would you like this tile to be transparent? (visible and targetable through)<boolean>:") }, { "Durability", GetUserResponse("Durability (health points)<integer>:") }, { "Size", GetUserResponse("Size (space it takes up in containers)<integer>:") }, { "Weight", GetUserResponse("Weight (Depending on player strength, they may or may not be able to pick this up)<float>:\nCurrent player strength is " + World.Player.Strength) }, { "Action", string.Empty }, { "Behavior", string.Empty }, { "Tags", string.Empty } }; Output.WriteLineTagged("Choose an action that this contents takes", Output.Tag.Prompt); if (!CommandInterpretation.InterpretString(UseActions.GetIdentifiers(), out string actionString)) { Output.WriteLineTagged("Action was not a valid response", Output.Tag.Error); return(false); } preContainerParamMap["Action"] = actionString; if (preContainerParamMap["Action"] == "Dialogue") { string dialogue = CommandInterpretation.GetUserResponse("Please enter the line of dialogue for this contents"); World.Dialogue.Add(uniqueID, dialogue); } Output.WriteLineTagged("Choose a behavior for this contents", Output.Tag.Prompt); do { if (!CommandInterpretation.InterpretString(Behavior.GetIdentifiers(), out string behaviorString)) { Output.WriteLineTagged("Behavior was not a valid response", Output.Tag.Error); return(false); } preContainerParamMap["Behavior"] += behaviorString + ","; } while (CommandInterpretation.AskYesNo("Would you like to add any more behavior?")); string tempBehavior = preContainerParamMap["Behavior"]; tempBehavior = tempBehavior.Substring(0, tempBehavior.Length - 1); #region Checking params if (!InterpretInt(preContainerParamMap["Durability"], out int durability)) { Output.WriteLineTagged("Durability was not in integer format", Output.Tag.Error); return(false); } if (!InterpretInt(preContainerParamMap["Size"], out int size)) { Output.WriteLineTagged("Size was not in integer format", Output.Tag.Error); return(false); } if (!InterpretFloat(preContainerParamMap["Weight"], out float weight)) { Output.WriteLineTagged("Weight was not in float format", Output.Tag.Error); return(false); } if (!UseActions.TryGetAction(preContainerParamMap["Action"], out Action <string[], Contents> action)) { Output.WriteLineTagged("Action was not found", Output.Tag.Error); return(false); } if (!Behavior.TryGetBehaviors(tempBehavior.Split(","), out Action <Contents>[] behavior))