Ejemplo n.º 1
0
        public CustomMutator[] ConstructMutators(string generalName, string pattern, float[] multipliers)
        {
            CustomMutator[] mutators = new CustomMutator[multipliers.Length];
            for (int i = 0; i < multipliers.Length; i++)
            {
                string multStr = multipliers[i].ToString(CultureInfo.InvariantCulture).Replace(".", string.Empty);
                string id      = "aToM:" + generalName.Replace(" ", string.Empty) + multStr;
                string name    = "[aToM] " + generalName + (multipliers[i] == 1 ? " =1" : " x" + multipliers[i].ToString(CultureInfo.InvariantCulture));

                Regex  regex       = new Regex(@"\[(.*)\|(.*)\|(.*)\|(.*)\]");
                string description = regex.Replace(pattern,
                                                   multipliers[i] == 0 ? "$1"
                                        : multipliers[i] == 1 ? "$2"
                                        : multipliers[i] > 1 ? "$3" : "$4").Replace(".x", (multipliers[i] > 1 ? multipliers[i] : 1f / multipliers[i]).ToString(CultureInfo.InvariantCulture) + "x");

                mutators[i] = RogueLibs.CreateCustomMutator(id, true, new CustomNameInfo(name), new CustomNameInfo(description));
            }
            return(mutators);
        }
Ejemplo n.º 2
0
        public void SplitterTestFirstEvaluatorTakesItAll()
        {
            var context = TestExecuter.GetContext();

            var splitter = new Splitter <DefaultRowQueue>(context)
            {
                InputProcess = new EnumerableImporter(context)
                {
                    InputGenerator = caller => TestData.Person(context).Evaluate(caller).TakeRowsAndReleaseOwnership(),
                },
            };

            var processes = new IProducer[4];

            for (var i = 0; i < 3; i++)
            {
                processes[i] = new CustomMutator(context)
                {
                    InputProcess = splitter,
                    Action       = row =>
                    {
                        Thread.Sleep(new Random().Next(10));
                        row["ThreadIndex"] = i;
                        return(true);
                    },
                };
            }

            var results = new List <ISlimRow> [3];

            for (var i = 0; i < 3; i++)
            {
                results[i] = processes[i].Evaluate().TakeRowsAndReleaseOwnership().ToList();
            }

            Assert.AreEqual(7, results[0].Count);
            Assert.AreEqual(0, results[1].Count);
            Assert.AreEqual(0, results[2].Count);
            var exceptions = context.GetExceptions();

            Assert.AreEqual(0, exceptions.Count);
        }
Ejemplo n.º 3
0
        public void SplitterTestFirstEvaluatorTakesItAll()
        {
            var topic = TestExecuter.GetTopic();

            var splitter = new Splitter <DefaultRowQueue>(topic, null)
            {
                InputProcess = new EnumerableImporter(topic, null)
                {
                    InputGenerator = caller => TestData.Person(topic).Evaluate(caller).TakeRowsAndReleaseOwnership(),
                },
            };

            var processes = new IEvaluable[4];

            for (var i = 0; i < 3; i++)
            {
                processes[i] = new CustomMutator(topic, null)
                {
                    InputProcess = splitter,
                    Then         = (proc, row) =>
                    {
                        Thread.Sleep(new Random().Next(10));
                        row.SetValue("ThreadIndex", i);
                        return(true);
                    },
                };
            }

            var results = new List <ISlimRow> [3];

            for (var i = 0; i < 3; i++)
            {
                results[i] = processes[i].Evaluate().TakeRowsAndReleaseOwnership().ToList();
            }

            Assert.AreEqual(7, results[0].Count);
            Assert.AreEqual(0, results[1].Count);
            Assert.AreEqual(0, results[2].Count);
            var exceptions = topic.Context.GetExceptions();

            Assert.AreEqual(0, exceptions.Count);
        }
Ejemplo n.º 4
0
        public void SplitterTestMultiThread()
        {
            var context = TestExecuter.GetContext();

            var splitter = new Splitter <DefaultRowQueue>(context)
            {
                InputProcess = new EnumerableImporter(context)
                {
                    InputGenerator = caller => TestData.Person(context).Evaluate(caller).TakeRowsAndReleaseOwnership(),
                },
            };

            var processes = new IProducer[4];

            for (var i = 0; i < 3; i++)
            {
                processes[i] = new CustomMutator(context)
                {
                    InputProcess = splitter,
                    Action       = row =>
                    {
                        Thread.Sleep(new Random().Next(10));
                        row["ThreadIndex"] = i;
                        return(true);
                    },
                };
            }

            var threads = new List <Thread>();
            var results = new List <ISlimRow> [3];

            for (var i = 0; i < 3; i++)
            {
                var threadIndex = i;
                var thread      = new Thread(() =>
                {
                    results[threadIndex] = new List <ISlimRow>();
                    foreach (var row in processes[threadIndex].Evaluate().TakeRowsAndReleaseOwnership())
                    {
                        results[threadIndex].Add(row);
                    }
                });

                thread.Start();
                threads.Add(thread);
            }

            for (var i = 0; i < 3; i++)
            {
                threads[i].Join();
            }

            Assert.AreEqual(7, results[0].Count + results[1].Count + results[2].Count);
            foreach (var p in TestData.Person(context).Evaluate().TakeRowsAndReleaseOwnership())
            {
                Assert.IsTrue(
                    results[0].Any(m => m.GetAs <int>("id") == p.GetAs <int>("id")) ||
                    results[1].Any(m => m.GetAs <int>("id") == p.GetAs <int>("id")) ||
                    results[2].Any(m => m.GetAs <int>("id") == p.GetAs <int>("id")));
            }

            var exceptions = context.GetExceptions();

            Assert.AreEqual(0, exceptions.Count);
        }
Ejemplo n.º 5
0
 public static IFluentSequenceMutatorBuilder CustomCode(this IFluentSequenceMutatorBuilder builder, CustomMutator mutator)
 {
     return(builder.AddMutator(mutator));
 }
Ejemplo n.º 6
0
 public static IFluentProcessMutatorBuilder CustomCode(this IFluentProcessMutatorBuilder builder, CustomMutator mutator)
 {
     return(builder.AddMutators(mutator));
 }
Ejemplo n.º 7
0
        public void Awake()
        {
            #region Melee Mutators
            CustomMutator showMelee = RogueLibs.CreateCustomMutator("aToM:ShowMelee", true,
                                                                    new CustomNameInfo("[aToM] MELEE MUTATORS (show)"),
                                                                    new CustomNameInfo(""));
            CustomMutator hideMelee = RogueLibs.CreateCustomMutator("aToM:HideMelee", true,
                                                                    new CustomNameInfo("[aToM] MELEE MUTATORS (hide)"),
                                                                    new CustomNameInfo(""));
            hideMelee.Available = false;

            CustomMutator[] meleeDamage = ConstructMutators("Melee Damage", "All melee weapons deal [|1|.x more|.x less] damage",
                                                            new float[] { 1f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f, 999f });
            CrossConflictAndHide(meleeDamage);
            EachConflict(new string[] { "NoMelee" }, meleeDamage);

            CustomMutator[] meleeDurability = ConstructMutators("Melee Durability", "All melee weapons have [|1|.x more|.x less] durability",
                                                                new float[] { 1f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f });
            CrossConflictAndHide(meleeDurability);
            EachConflict(new string[] { "NoMelee", "InfiniteMeleeDurability" }, meleeDurability);

            CustomMutator[] meleeLunge = ConstructMutators("Melee Lunge", "All melee weapons [don't lunge||have .x longer lunges|have .x shorter lunges]",
                                                           new float[] { 0f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f });
            CrossConflictAndHide(meleeLunge);
            EachConflict(new string[] { "NoMelee" }, meleeLunge);

            CustomMutator[] meleeSpeed = ConstructMutators("Melee Speed", "All melee weapons attack [||.x faster|.x slower]",
                                                           new float[] { 0.25f, 0.5f, 2f, 4f });
            CrossConflictAndHide(meleeSpeed);
            EachConflict(new string[] { "NoMelee" }, meleeSpeed);

            showMelee.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showMelee.Available = false;
                hideMelee.Available = true;
                foreach (CustomMutator m in meleeDamage.Concat(meleeDurability).Concat(meleeLunge).Concat(meleeSpeed))
                {
                    m.Available = true;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            hideMelee.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showMelee.Available = true;
                hideMelee.Available = false;
                foreach (CustomMutator m in meleeDamage.Concat(meleeDurability).Concat(meleeLunge).Concat(meleeSpeed))
                {
                    m.Available = false;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            #endregion

            #region Thrown Mutators
            CustomMutator showThrown = RogueLibs.CreateCustomMutator("aToM:ShowThrown", true,
                                                                     new CustomNameInfo("[aToM] THROWN MUTATORS (show)"),
                                                                     new CustomNameInfo(""));
            CustomMutator hideThrown = RogueLibs.CreateCustomMutator("aToM:HideThrown", true,
                                                                     new CustomNameInfo("[aToM] THROWN MUTATORS (hide)"),
                                                                     new CustomNameInfo(""));
            hideThrown.Available = false;

            CustomMutator[] thrownDamage = ConstructMutators("Thrown Damage", "All thrown weapons deal [|1|.x more|.x less] damage",
                                                             new float[] { 1f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f, 999f });
            CrossConflictAndHide(thrownDamage);

            CustomMutator[] thrownCount = ConstructMutators("Thrown Count", "All thrown weapons appear in [|stacks of 1|.x larger stacks|.x smaller stacks]",
                                                            new float[] { 1f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f });
            CrossConflictAndHide(thrownCount);

            CustomMutator[] thrownDistance = ConstructMutators("Thrown Distance", "All thrown weapons can be thrown at [||.x smaller distance|.x larger distance]",
                                                               new float[] { 0.125f, 0.25f, 0.5f, 2f, 4f, 8f });
            CrossConflictAndHide(thrownDistance);

            showThrown.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showThrown.Available = false;
                hideThrown.Available = true;
                foreach (CustomMutator m in thrownDamage.Concat(thrownCount).Concat(thrownDistance))
                {
                    m.Available = true;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            hideThrown.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showThrown.Available = true;
                hideThrown.Available = false;
                foreach (CustomMutator m in thrownDamage.Concat(thrownCount).Concat(thrownDistance))
                {
                    m.Available = false;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            #endregion

            #region Ranged Mutators
            CustomMutator showRanged = RogueLibs.CreateCustomMutator("aToM:ShowRanged", true,
                                                                     new CustomNameInfo("[aToM] RANGED MUTATORS (show)"),
                                                                     new CustomNameInfo(""));
            CustomMutator hideRanged = RogueLibs.CreateCustomMutator("aToM:HideRanged", true,
                                                                     new CustomNameInfo("[aToM] RANGED MUTATORS (hide)"),
                                                                     new CustomNameInfo(""));
            hideRanged.Available = false;

            CustomMutator[] rangedDamage = ConstructMutators("Ranged Damage", "All ranged weapons deal [|1|.x more|.x less] damage",
                                                             new float[] { 1f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f, 999f });
            CrossConflictAndHide(rangedDamage);
            EachConflict(new string[] { "NoGuns" }, rangedDamage);

            CustomMutator[] rangedAmmo = ConstructMutators("Ranged Ammo", "All ranged weapons appear with [|1|.x more|.x less] ammo",
                                                           new float[] { 1f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f });
            CrossConflictAndHide(rangedAmmo);
            EachConflict(new string[] { "NoGuns", "InfiniteAmmo" }, rangedAmmo);

            CustomMutator[] rangedFirerate = ConstructMutators("Ranged Firerate", "All ranged weapons have [||.x faster|.x slower] rate of fire",
                                                               new float[] { 0.125f, 0.25f, 0.5f, 2f, 4f, 8f });
            CrossConflictAndHide(rangedFirerate);
            EachConflict(new string[] { "NoGuns" }, rangedFirerate);

            CustomMutator rangedFullAuto = ConstructMutator("RangedFullAuto", "Fully Automatic Ranged Weapons", "All ranged weapons are fully automatic");
            rangedFullAuto.Available = false;
            EachConflict(new string[] { "NoGuns" }, rangedFullAuto);

            showRanged.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showRanged.Available = false;
                hideRanged.Available = true;
                foreach (CustomMutator m in rangedDamage.Concat(rangedAmmo).Concat(rangedFirerate).Concat(new CustomMutator[] { rangedFullAuto }))
                {
                    m.Available = true;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            hideRanged.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showRanged.Available = true;
                hideRanged.Available = false;
                foreach (CustomMutator m in rangedDamage.Concat(rangedAmmo).Concat(rangedFirerate).Concat(new CustomMutator[] { rangedFullAuto }))
                {
                    m.Available = false;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            #endregion

            #region Projectile Mutators
            CustomMutator showProjectile = RogueLibs.CreateCustomMutator("aToM:ShowProjectile", true,
                                                                         new CustomNameInfo("[aToM] PROJECTILE MUTATORS (show)"),
                                                                         new CustomNameInfo(""));
            CustomMutator hideProjectile = RogueLibs.CreateCustomMutator("aToM:HideProjectile", true,
                                                                         new CustomNameInfo("[aToM] PROJECTILE MUTATORS (hide)"),
                                                                         new CustomNameInfo(""));
            hideProjectile.Available = false;

            CustomMutator[] projectileSpeed = ConstructMutators("Projectile Speed", "All projectiles travel at [zero||.x greater|.x lower] speed",
                                                                new float[] { 0f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f });
            CrossConflictAndHide(projectileSpeed);

            CustomMutator[] projectileType = new CustomMutator[3];
            projectileType[0] = ConstructMutator("ProjectileTypeRocket", "Rocket Projectiles", "All projectiles are rockets");
            projectileType[1] = ConstructMutator("ProjectileTypeRandom", "Random Projectiles", "All projectiles are random");
            projectileType[2] = ConstructMutator("ProjectileTypeRandomEffect", "Random Effect Projectiles", "All projectiles are Water Pistol bullets with random effects");
            CrossConflictAndHide(projectileType);

            showProjectile.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showProjectile.Available = false;
                hideProjectile.Available = true;
                foreach (CustomMutator m in projectileSpeed.Concat(projectileType))
                {
                    m.Available = true;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            hideProjectile.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showProjectile.Available = true;
                hideProjectile.Available = false;
                foreach (CustomMutator m in projectileSpeed.Concat(projectileType))
                {
                    m.Available = false;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            #endregion

            #region Explosion Mutators
            CustomMutator showExplosion = RogueLibs.CreateCustomMutator("aToM:ShowExplosion", true,
                                                                        new CustomNameInfo("[aToM] EXPLOSION MUTATORS (show)"),
                                                                        new CustomNameInfo(""));
            CustomMutator hideExplosion = RogueLibs.CreateCustomMutator("aToM:HideExplosion", true,
                                                                        new CustomNameInfo("[aToM] EXPLOSION MUTATORS (hide)"),
                                                                        new CustomNameInfo(""));
            hideExplosion.Available = false;

            CustomMutator[] explosionDamage = ConstructMutators("Explosion Damage", "All explosions deal [|1|.x more|.x less] damage",
                                                                new float[] { 1f, 0.125f, 0.25f, 0.5f, 2f, 4f, 8f, 999f });
            CrossConflictAndHide(explosionDamage);

            CustomMutator[] explosionPower = ConstructMutators("Explosion Power", "All explosions are [||.x more|.x less] powerful",
                                                               new float[] { 0.125f, 0.25f, 0.5f, 2f, 4f, 8f });
            CrossConflictAndHide(explosionPower);

            showExplosion.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showExplosion.Available = false;
                hideExplosion.Available = true;
                foreach (CustomMutator m in explosionDamage.Concat(explosionPower))
                {
                    m.Available = true;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            hideExplosion.ScrollingMenu_PushedButton = (menu, button) =>
            {
                showExplosion.Available = true;
                hideExplosion.Available = false;
                foreach (CustomMutator m in explosionDamage.Concat(explosionPower))
                {
                    m.Available = false;
                }
                GameController.gameController.mainGUI.scrollingMenuScript.OpenScrollingMenu();
                return(false);
            };
            #endregion



            #region Sorting orders and indexes
            int index = 0;
            hideMelee.SortingOrder = showMelee.SortingOrder = ++uniqueOrder;
            foreach (CustomMutator m in meleeDamage.Concat(meleeDurability).Concat(meleeLunge).Concat(meleeDamage))
            {
                m.SortingOrder = uniqueOrder; m.SortingIndex = index++;
            }

            hideThrown.SortingOrder = showThrown.SortingOrder = ++uniqueOrder;
            foreach (CustomMutator m in thrownDamage.Concat(thrownCount).Concat(thrownDistance))
            {
                m.SortingOrder = uniqueOrder; m.SortingIndex = index++;
            }

            hideRanged.SortingOrder = showRanged.SortingOrder = ++uniqueOrder;
            foreach (CustomMutator m in rangedDamage.Concat(rangedAmmo).Concat(rangedFirerate).Concat(new CustomMutator[] { rangedFullAuto }))
            {
                m.SortingOrder = uniqueOrder; m.SortingIndex = index++;
            }

            hideProjectile.SortingOrder = showProjectile.SortingOrder = ++uniqueOrder;
            foreach (CustomMutator m in projectileSpeed.Concat(projectileType))
            {
                m.SortingOrder = uniqueOrder; m.SortingIndex = index++;
            }

            hideExplosion.SortingOrder = showExplosion.SortingOrder = ++uniqueOrder;
            foreach (CustomMutator m in explosionDamage.Concat(explosionPower))
            {
                m.SortingOrder = uniqueOrder; m.SortingIndex = index++;
            }
            #endregion

            RoguePatcher patcher = new RoguePatcher(this, GetType());

            patcher.Postfix(typeof(InvItem), "SetupDetails", new Type[] { typeof(bool) });
            patcher.Prefix(typeof(Movement), "KnockForward", new Type[] { typeof(Quaternion), typeof(float), typeof(bool) });
            patcher.Postfix(typeof(Melee), "Attack", new Type[] { typeof(bool) });
            patcher.Postfix(typeof(Bullet), "SetupBullet", new Type[] { });
            patcher.Prefix(typeof(SpawnerMain), "SpawnBullet", new Type[] { typeof(Vector3), typeof(bulletStatus), typeof(PlayfieldObject), typeof(int) });
            patcher.Postfix(typeof(Gun), "SetWeaponCooldown", new Type[] { typeof(float), typeof(InvItem) });
            patcher.Postfix(typeof(Explosion), "SetupExplosion", new Type[] { });
            patcher.Prefix(typeof(Gun), "spawnBullet", new Type[] { typeof(bulletStatus), typeof(InvItem), typeof(int), typeof(bool), typeof(string) });
        }