Exemple #1
0
        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();
        }