Example #1
0
        public void NonExitentTag()
        {
            var builder = new ReplacementRuleBuilder();

            // don't move to nonexistent tag
            Assert.ThrowsException <ArgumentException>(() => builder.MoveToTag("test"));
        }
Example #2
0
        private Graph GenerateGraph()
        {
            var builder = new ReplacementRuleBuilder();

            builder.MappedVertex <StartingRoom>("start")
            .ReplacementVertexWithEdge <EmptyRoom, Edge>().ReplacementVertexWithEdge <EmptyRoom, Edge>()
            .MoveToTag("start")
            .ReplacementVertexWithEdge <EmptyRoom, Edge>().ReplacementVertexWithEdge <EmptyRoom, Edge>()
            .MoveToTag("start")
            .ReplacementVertexWithEdge <EmptyRoom, Edge>().ReplacementVertexWithEdge <EmptyRoom, Edge>();

            var initialRule = builder.GetResult();

            var dungeon = new Graph();

            dungeon.Random = Game.Random;
            dungeon.AddVertex(new StartingRoom());
            dungeon.Replace(initialRule, true);


            for (int i = 0; i < 20; i++)
            {
                int  endurance = 10;
                int  ruleIndex;
                bool ruleSuccess;

                var   rules = GetReplacementRules();
                int   acc   = 0;
                int[] absoluteDistribution = rules.Select(t => acc += t.Item2).ToArray();

                do
                {
                    if (endurance-- == 0)
                    {
                        builder.Reset()
                        .MappedVertex <EmptyRoom>()
                        .ReplacementVertexWithEdge <EmptyRoom, Edge>();

                        var addRoom = builder.GetResult();
                        dungeon.Replace(addRoom, true);
                        break;
                    }

                    int r = Game.Random.Next(acc);

                    for (ruleIndex = 0; ruleIndex < rules.Length; ruleIndex++)
                    {
                        if (r < absoluteDistribution[ruleIndex])
                        {
                            break;
                        }
                    }

                    ruleSuccess = dungeon.Replace(rules[ruleIndex].Item1, true);
                } while (!ruleSuccess);
            }

            return(dungeon);
        }
Example #3
0
        public void EdgeStart()
        {
            var builder = new ReplacementRuleBuilder();

            // don't start with edge
            Assert.ThrowsException <InvalidOperationException>(() => builder.PatternEdge <Edge>());
            Assert.ThrowsException <InvalidOperationException>(() => builder.ReplacementEdge <Edge>());
            Assert.ThrowsException <InvalidOperationException>(() => builder.MappedEdge <Edge>());
        }
Example #4
0
        public void InvalidMappedVertexContinuation()
        {
            var builder = new ReplacementRuleBuilder();

            // check impossible next states after adding mapped vertex
            builder.MappedVertex <Vertex>();
            Assert.ThrowsException <InvalidOperationException>(() => builder.PatternVertex <Vertex>());
            Assert.ThrowsException <InvalidOperationException>(() => builder.ReplacementVertex <Vertex>());
            Assert.ThrowsException <InvalidOperationException>(() => builder.MappedVertex <Vertex>());
        }
Example #5
0
        public void Control()
        {
            var builder = new ReplacementRuleBuilder();

            // invalid operations in "start" state
            Assert.ThrowsException <InvalidOperationException>(() => builder.GetResult());
            Assert.ThrowsException <InvalidOperationException>(() => builder.Continue());

            builder.MappedVertex <Vertex>("test");

            builder.MappedEdge <Edge>();
            // can't get result if edge is unfinished
            Assert.ThrowsException <InvalidOperationException>(() => builder.GetResult());

            builder.MappedVertex <Vertex>();
            builder.PatternEdge <Edge>();
            // can't get result if edge is unfinished
            Assert.ThrowsException <InvalidOperationException>(() => builder.GetResult());

            // test continuing from end state
            builder.PatternVertex <Vertex>().GetResult();
            builder.Continue("test");

            builder.ReplacementEdge <Edge>();
            // can't get result if edge is unfinished
            Assert.ThrowsException <InvalidOperationException>(() => builder.GetResult());

            builder.ReplacementVertex <Vertex>();

            // valid control:
            var rule = builder.GetResult();

            builder.Continue();
            builder.MoveToTag("test");
            builder.GetResult();
            builder.Reset();

            Assert.IsTrue(rule.Pattern.Vertices.Count == 3);
            Assert.IsTrue(rule.Replacement.Vertices.Count == 3);
            Assert.IsTrue(rule.Mapping.Count == 2);
        }
Example #6
0
        public void Test()
        {
            Dungeon = new Graph();

            int victoryPathLength = 10;

            REssential[] victoryPath = new REssential[victoryPathLength];
            for (int i = 0; i < victoryPathLength; i++)
            {
                victoryPath[i] = new REssential();
                Dungeon.AddVertex(victoryPath[i]);
                if (i > 0)
                {
                    Dungeon.AddEdge(new Edge(victoryPath[i], victoryPath[i - 1]));
                }
            }

            for (int i = 0; i < 2; i++)
            {
                var builder = new ReplacementRuleBuilder();

                builder.MappedVertex <REssential>("loop")
                .MappedVertexWithEdge <REssential, Edge>()
                .MappedVertexWithEdge <REssential, Edge>()
                .MappedVertexWithEdge <REssential, Edge>()
                .ReplacementVertexWithEdge <RBasic, Edge>()
                .ReplacementEdge <Edge>()
                .MoveToTag("loop");

                ReplacementRule addShortcut = builder.GetResult();

                Assert.IsTrue(addShortcut.Pattern.Vertices.Count == 4);
                Assert.IsTrue(addShortcut.Mapping.Count == 4);
                Assert.IsTrue(addShortcut.Replacement.Vertices.Count == 5);

                bool success = Dungeon.Replace(addShortcut, randomMatch: true);
                Assert.IsTrue(success);
            }

            var bossTreasure = new ReplacementRule();

            var anchorP = new RBasic();

            bossTreasure.Pattern.AddVertex(anchorP);

            var anchorR  = new RBasic();
            var boss     = new RBoss();
            var treasure = new RTreasure();

            bossTreasure.Replacement.AddVertex(anchorR);
            bossTreasure.Replacement.AddVertex(boss);
            bossTreasure.Replacement.AddVertex(treasure);
            bossTreasure.Replacement.AddEdge(new Edge(anchorR, boss));
            bossTreasure.Replacement.AddEdge(new Edge(boss, treasure));
            bossTreasure.Mapping[anchorP] = anchorR;

            Assert.IsTrue(bossTreasure.Pattern.Vertices.Count == 1);
            Assert.IsTrue(bossTreasure.Mapping.Count == 1);
            Assert.IsTrue(bossTreasure.Replacement.Vertices.Count == 3);

            bool success2 = Dungeon.Replace(bossTreasure, randomMatch: true);

            Assert.IsTrue(success2);

            File.WriteAllText("dungeon.gv", GraphPrinter.ToDot(Dungeon));
        }
        public void Start()
        {
            if (seed == 0)
            {
                seed = (int)System.DateTime.Now.Ticks;
            }

            Console.WriteLine("Seed: " + seed);
            rnd = new Random(seed);

            var builder = new ReplacementRuleBuilder();

            builder.MappedVertex <StartingRoom>("start")
            .ReplacementVertexWithEdge <BasicRoom, Edge>().ReplacementVertexWithEdge <BasicRoom, Edge>().MoveToTag("start")
            .ReplacementVertexWithEdge <BasicRoom, Edge>().ReplacementVertexWithEdge <BasicRoom, Edge>().MoveToTag("start")
            .ReplacementVertexWithEdge <BasicRoom, Edge>().ReplacementVertexWithEdge <BasicRoom, Edge>();

            var initialRule = builder.GetResult();

            var dungeon = new Graph();

            dungeon.AddVertex(new StartingRoom());
            dungeon.Replace(initialRule, true);

            for (int i = 0; i < 15; i++)
            {
                builder.Reset()
                .MappedVertex <BasicRoom>("a")
                .PatternVertexWithEdge <BasicRoom, Edge>("b")
                .MoveToTag("a").ReplacementVertexWithEdge <Junction, Edge>("j")
                .ReplacementVertexWithEdge <BasicRoom, Edge>().MoveToTag("j")
                .ReplacementVertexWithEdge <BasicRoom, Edge>().MapToTag("b");

                var addJunction = builder.GetResult();

                builder.Reset()
                .MappedVertex <BasicRoom>("a")
                .PatternVertexWithEdge <BasicRoom, Edge>("b").MoveToTag("a")
                .ReplacementVertexWithEdge <BasicRoom, Edge>()
                .ReplacementVertexWithEdge <BasicRoom, Edge>().MapToTag("b");

                var stretch = builder.GetResult();

                builder.Reset()
                .MappedVertex <BasicRoom>("a")
                .PatternVertexWithEdge <Junction, Edge>("j")
                .PatternVertexWithEdge <BasicRoom, Edge>("b").MoveToTag("j")
                .PatternVertexWithEdge <BasicRoom, Edge>("c").MoveToTag("a")
                .ReplacementVertexWithEdge <BasicRoom, Edge>().MapToTag("b")
                .ReplacementVertexWithEdge <BasicRoom, Edge>().MapToTag("c")
                .ReplacementEdge <Edge>().MoveToTag("a");

                var transformJunction = builder.GetResult();

                builder.Reset()
                .MappedVertex <BasicRoom>("a")
                .MappedVertexWithEdge <BasicRoom, Edge>()
                .MappedVertexWithEdge <BasicRoom, Edge>()
                .MappedVertexWithEdge <BasicRoom, Edge>()
                .ReplacementEdge <Edge>().MoveToTag("a");

                var createLoop = builder.GetResult();

                builder.Reset()
                .MappedVertex <BasicRoom>()
                .ReplacementVertexWithEdge <BasicRoom, Edge>();

                var addRoom = builder.GetResult();

                var rules = new Tuple <ReplacementRule, int>[]
                {
                    Tuple.Create(addJunction, 3),
                    Tuple.Create(stretch, 2),
                    Tuple.Create(createLoop, 2),
                    Tuple.Create(transformJunction, 1)
                };

                int   acc = 0;
                int[] absoluteDistribution = rules.Select(t => acc += t.Item2).ToArray();

                int  endurance = 10;
                int  ruleIndex;
                bool ruleSuccess;

                do
                {
                    if (endurance-- == 0)
                    {
                        dungeon.Replace(addRoom, true);
                        break;
                    }

                    int r = rnd.Next(acc);

                    for (ruleIndex = 0; ruleIndex < rules.Length; ruleIndex++)
                    {
                        if (r < absoluteDistribution[ruleIndex])
                        {
                            break;
                        }
                    }

                    ruleSuccess = dungeon.Replace(rules[ruleIndex].Item1, true);
                } while (!ruleSuccess);
            }

            File.WriteAllText("advancedDungeon.gv", GraphPrinter.ToDot(dungeon));
        }
Example #8
0
        private Tuple <ReplacementRule, int>[] GetReplacementRules()
        {
            var builder = new ReplacementRuleBuilder();

            builder.Reset()
            .MappedVertex <EmptyRoom>("a")
            .PatternVertexWithEdge <EmptyRoom, Edge>("b")
            .MoveToTag("a").ReplacementVertexWithEdge <Junction, Edge>("j")
            .ReplacementVertexWithEdge <EmptyRoom, Edge>().MoveToTag("j")
            .ReplacementVertexWithEdge <EmptyRoom, Edge>().MapToTag("b");

            var addJunction = builder.GetResult();

            builder.Reset()
            .MappedVertex <EmptyRoom>("a")
            .PatternVertexWithEdge <EmptyRoom, Edge>("b").MoveToTag("a")
            .ReplacementVertexWithEdge <EmptyRoom, Edge>()
            .ReplacementVertexWithEdge <EmptyRoom, Edge>().MapToTag("b");

            var stretch = builder.GetResult();

            builder.Reset()
            .MappedVertex <EmptyRoom>("a")
            .PatternVertexWithEdge <Junction, Edge>("j")
            .PatternVertexWithEdge <EmptyRoom, Edge>("b").MoveToTag("j")
            .PatternVertexWithEdge <EmptyRoom, Edge>("c").MoveToTag("a")
            .ReplacementVertexWithEdge <EmptyRoom, Edge>().MapToTag("b")
            .ReplacementVertexWithEdge <EmptyRoom, Edge>().MapToTag("c")
            .ReplacementEdge <Edge>().MoveToTag("a");

            var transformJunction = builder.GetResult();

            builder.Reset()
            .MappedVertex <EmptyRoom>("a")
            .MappedVertexWithEdge <EmptyRoom, Edge>()
            .MappedVertexWithEdge <EmptyRoom, Edge>()
            .MappedVertexWithEdge <EmptyRoom, Edge>()
            .ReplacementEdge <Edge>().MoveToTag("a");

            var createLoop = builder.GetResult();

            builder.Reset()
            .MappedVertex <EmptyRoom>()
            .ReplacementEdge <Edge>()
            .ReplacementVertex <FountainRoom>();


            var createFountain = builder.GetResult();

            var randomMechs = new ReplacementRule();
            var pattern     = new Graph();

            pattern.AddVertex(new EmptyRoom());
            randomMechs.Pattern = pattern;

            var replacement = new Graph();

            replacement.AddVertex(new RandomMechsRoom());
            randomMechs.Replacement = replacement;

            randomMechs.Mapping = new Dictionary <Vertex, Vertex>()
            {
                { pattern.Vertices.First(), replacement.Vertices.First() }
            };

            var rules = new[]
            {
                Tuple.Create(addJunction, 3),
                Tuple.Create(stretch, 2),
                Tuple.Create(createLoop, 1),
                Tuple.Create(transformJunction, 1),
                Tuple.Create(createFountain, 1),
                Tuple.Create(randomMechs, 4)
            };

            return(rules);
        }