private static Door buildDoor(Wall wall, Node node) { Door door; if (node is Pair) door = new Door(wall, ((Pair)node).value); else { door = new Door(wall, ""); foreach (Node n in node.children) { if (n is Pair) { Pair p = (Pair)n; if (p.name.Equals("Target", StringComparison.OrdinalIgnoreCase)) door.name = p.value; else if (p.name.Equals("Locked", StringComparison.OrdinalIgnoreCase)) door.locked = bool.Parse(p.value); else if (p.name.Equals("Visible", StringComparison.OrdinalIgnoreCase)) door.visible = bool.Parse(p.value); else if (p.name.Equals("Description", StringComparison.OrdinalIgnoreCase)) door.description = p.value; } } } return door; }
private static List<Node> parseNode(string data) { List<Node> nodes = new List<Node>(); int index = 0; while (index < data.Length) { int pair = data.IndexOf('=', index); int brace = data.IndexOf('{', index); if (pair != -1 && (pair < brace || brace == -1)) { int sc = data.IndexOf(';', index); if (sc == -1) throw new InvalidDataException("No semicolon found."); string s = data.Substring(index, sc - index); int p = s.IndexOf("="); nodes.Add(new Pair(s.Substring(0,p).Trim(), s.Substring(p+1).Trim())); index = sc + 1; } else if (brace != -1 && (pair > brace || pair == -1)) { Node node; int braceNum = 1, open = data.IndexOf('{', index), closed = open + 1; for (; closed < data.Length; closed++) { char c = data[closed]; if (c == '{') braceNum++; else if (c == '}') braceNum--; if (braceNum == 0) break; } if (closed == data.Length) throw new InvalidDataException("No closing bracket found."); node = new Node(data.Substring(index, open - index).Trim()); node.addAll(parseNode(data.Substring(open + 1, closed - open - 1).Trim())); index = closed + 1; nodes.Add(node); } else throw new InvalidDataException("Invalid data detected."); } return nodes; }
private static Item buildItem(Player player, Wall wall, Node node) { Item item = new Item(wall, node.name); bool hasDescription = false; List<string> commands = new List<string>(); commands.Add("use"); commands.Add("examine"); foreach (Node n in node.children) { if (n is Pair) { Pair p = (Pair)n; if (p.name.Equals("Description", StringComparison.OrdinalIgnoreCase)) { item.description = p.value; hasDescription = true; } else if (p.name.Equals("Takeable", StringComparison.OrdinalIgnoreCase)) item.takeable = bool.Parse(p.value); else if (p.name.Equals("UseIfNotEquipped", StringComparison.OrdinalIgnoreCase)) item.useIfNotEquipped = bool.Parse(p.value); else if (p.name.Equals("Visible", StringComparison.OrdinalIgnoreCase)) item.visible = bool.Parse(p.value); else if (p.name.Equals("Detail", StringComparison.OrdinalIgnoreCase)) item.detail = p.value; else if (p.name.Equals("Alias", StringComparison.OrdinalIgnoreCase)) { string[] aliases = p.value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (string s in aliases) item.addAlias(s.Trim()); } else if (p.name.Equals("Commands", StringComparison.OrdinalIgnoreCase)) { string[] cs = p.value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (string s in cs) commands.Add(s.Trim()); } else if (commands.Contains(p.name)) { item.addCommand(p.name, createCommand(player, item, p.value, null)); } } else { if (!n.name.Equals("Children", StringComparison.OrdinalIgnoreCase)) throw new InvalidDataException("Cannot have a node under an item except for Children."); item.addAll(buildItems(player, wall, n)); } } if (!hasDescription) throw new InvalidDataException("No description found in Item."); return item; }
private static void buildWalls(Player player, Room room, Node node) { foreach (Node n in node.children) { Direction d; try { d = (Direction)Enum.Parse(typeof(Direction), n.name, true); } catch { continue; } buildWall(player, room.getWall(d), n); } }
private static void buildWall(Player player, Wall wall, Node node) { foreach (Node n in node.children) { if (n.name.Equals("Door", StringComparison.OrdinalIgnoreCase)) wall.door = buildDoor(wall, n); } wall.items = buildItems(player, wall, node); }
private static Room buildRoom(Player player, Node node) { Room room = new Room(node.name); foreach (Node n in node.children) { if (n is Pair && n.name.Equals("Description", StringComparison.OrdinalIgnoreCase)) room.description = ((Pair)n).value; else if (n.name.Equals("Items", StringComparison.OrdinalIgnoreCase)) room.Items = buildItems(player, null, n); } buildWalls(player, room, node); return room; }
private static List<Item> buildItems(Player player, Wall wall, Node node) { List<Item> items = new List<Item>(); foreach (Node n in node.children) { if (n.name.Equals("Door", StringComparison.OrdinalIgnoreCase)) continue; if (n is Pair) throw new InvalidDataException("Cannot have a free standing pair under Items"); else items.Add(buildItem(player, wall, n)); } return items; }