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); }
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); }
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); }
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); }
public static IFluentSequenceMutatorBuilder CustomCode(this IFluentSequenceMutatorBuilder builder, CustomMutator mutator) { return(builder.AddMutator(mutator)); }
public static IFluentProcessMutatorBuilder CustomCode(this IFluentProcessMutatorBuilder builder, CustomMutator mutator) { return(builder.AddMutators(mutator)); }
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) }); }