Exemple #1
0
        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;
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        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;
        }
Exemple #4
0
        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);
            }
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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;
        }
Exemple #7
0
        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;
        }