public void TestMonsterStrength([ValueSource(nameof(Monsters))] Monster monster) { TestBattleEntity playerentity = CreatePlayerEntity(monster.Requirement); TestBattleEntity monsterentity = new TestBattleEntity(monster.Level, monster.HP, monster.MP, monster.Power, monster.Defense, monster.Dexterity, 0, 1.0 / 500.0); MonsterBattleLogic battlelogic = new MonsterBattleLogic(null); battlelogic.Add(playerentity); battlelogic.Add(monsterentity); for (int i = 0; i < 1000; ++i) { battlelogic.ProcessPlayer(0); } float percent = playerentity.MaxDamage / (float)playerentity.HP; Assert.GreaterOrEqual(playerentity.Hits / 500.0, 0.35, $"{monster} hits way too rarely. Increase dexterity to fix that."); Assert.GreaterOrEqual(monsterentity.Hits / 500.0, 0.35, $"{monster} gets hit way too rarely. Decrease dexterity to fix that."); Assert.GreaterOrEqual(playerentity.Median, 0.05f * playerentity.HP, $"{monster} median damage is too low."); Assert.LessOrEqual(playerentity.Median, 0.3 * playerentity.HP, $"{monster} median damage is too high."); Assert.LessOrEqual(percent, 0.6f, $"{monster.Name} is too strong."); Assert.GreaterOrEqual(monsterentity.MaxDamage, 1 + monster.Level / 3, $"{monster} has too high defense."); Assert.LessOrEqual(monsterentity.MaxDamage / (float)monsterentity.HP, 0.4f, $"Defense of {monster} is too low."); Console.WriteLine($"Battle results vs. {monster}"); Console.WriteLine($"Monster Hitrate: {playerentity.Hits / 500.0}"); Console.WriteLine($"Player Hitrate: {monsterentity.Hits / 500.0}"); Console.WriteLine($"Monster Median Damage: {playerentity.Median}"); Console.WriteLine($"Player Median Damage: {monsterentity.Median}"); Console.WriteLine($"Monster Maximum Damage: {playerentity.MaxDamage}"); Console.WriteLine($"Player Maximum Damage: {monsterentity.MaxDamage}"); playerentity = CreatePlayerEntity(Math.Min(Levels.Length, monster.Maximum)); battlelogic = new MonsterBattleLogic(null); battlelogic.Add(playerentity); battlelogic.Add(monsterentity); for (int i = 0; i < 1000; ++i) { battlelogic.ProcessPlayer(0); } Assert.Greater(playerentity.MaxDamage, 0, $"{monster} should not appear at playerlevel {monster.Maximum} (no damage)."); }
public void ChangeStatus(Adventure adventure, AdventureStatus status, object argument = null) { if (adventure.AdventureLogic.Status != status) { switch (status) { case AdventureStatus.Exploration: adventure.AdventureLogic = explorationlogic; break; case AdventureStatus.MonsterBattle: if (argument != null) { MonsterBattleLogic battlelogic = new MonsterBattleLogic(context.GetModule <RPGMessageModule>()); battlelogic.Add(new PlayerBattleEntity(context, adventure.Player, adventure, battlelogic)); battlelogic.Add(new MonsterBattleEntity(context.GetModule <MonsterModule>().GetMonster((string)argument, context.GetModule <PlayerModule>().GetExistingPlayer(adventure.Player).Level), context, adventure, battlelogic)); adventure.AdventureLogic = battlelogic; } else { MonsterBattleLogic battlelogic = new MonsterBattleLogic(context.GetModule <RPGMessageModule>()); battlelogic.Add(new PlayerBattleEntity(context, adventure.Player, adventure, battlelogic)); battlelogic.Add(new MonsterBattleEntity(context.GetModule <MonsterModule>().GetMonster(context.GetModule <PlayerModule>().GetExistingPlayer(adventure.Player).Level), context, adventure, battlelogic)); adventure.AdventureLogic = battlelogic; } break; case AdventureStatus.SpiritRealm: context.GetModule <EffectModule>().ClearPlayerEffects(adventure.Player); adventure.AdventureLogic = new SpiritRealmLogic(context); break; } PlayerStatusChanged?.Invoke(adventure.Player, status); } adventure.Reset(); }