Пример #1
0
        public PlayerCharacterController(PartyDataWrapper party)
        {
            PartyId    = (uint)party.PartyId.GetHashCode();
            Characters = party.Characters;

            GameStateUpdatedSignal = new GameStateUpdated();
            CombatCompleteSignal   = new CombatComplete();
        }
Пример #2
0
        public static CombatResults CreateSuccess(IReadOnlyCollection <ICharacterActor> enemies, PartyDataWrapper party)
        {
            uint GetStatTotal(IReadOnlyCollection <ICharacterActor> actors)
            {
                uint total = 0u;

                foreach (ICharacterActor actor in actors)
                {
                    for (StatType statType = StatType.STR; statType <= StatType.CHA; statType++)
                    {
                        total += actor.Stats[statType];
                    }
                }

                return(total);
            }

            uint  enemyStatTotal  = GetStatTotal(enemies);
            uint  playerStatTotal = GetStatTotal(party.Characters);
            float modifier        = enemyStatTotal / (float)playerStatTotal;

            float baseExp   = enemies.Count * 150f;
            float expReward = baseExp * modifier;

            float goldReward = 250f * modifier;

            return(new CombatResults()
            {
                Success = true,
                ExpReward = (uint)Math.Ceiling(expReward),
                GoldReward = (uint)Math.Ceiling(goldReward)
            });
        }
Пример #3
0
        public static CombatSettings CreateFromEnemyTypes(IReadOnlyCollection <EnemyDefinition> enemyTypes, CombatDifficulty difficulty, PartyDataWrapper playerParty)
        {
            uint GetStatTotal(IReadOnlyCollection <ICharacterActor> actors)
            {
                uint total = 0u;

                foreach (ICharacterActor actor in actors)
                {
                    for (StatType statType = StatType.STR; statType <= StatType.CHA; statType++)
                    {
                        total += actor.Stats[statType];
                    }
                }

                return(total);
            }

            uint GetStatTarget(uint totalStats, CombatDifficulty diff)
            {
                switch (diff)
                {
                case CombatDifficulty.Normal:
                    return((uint)(totalStats * 0.75f));

                case CombatDifficulty.Hard:
                    return((uint)(totalStats * 1f));

                case CombatDifficulty.Easy:
                default:
                    return((uint)(totalStats * 0.5f));
                }
            }

            uint partyId = (uint)Guid.NewGuid().GetHashCode();

            // Generate Enemies
            List <Character> enemies = new List <Character>(enemyTypes.Count);

            foreach (EnemyDefinition enemyDefinition in enemyTypes)
            {
                var newEnemy = ClassUtil.CreateCharacter(
                    ClassUtil.NextId,
                    partyId,
                    enemyDefinition.NameGenerator.GetName(),
                    enemyDefinition.CharacterClass);
                enemies.Add(newEnemy);
            }

            // Scale Enemies for Difficulty
            uint totalPartyStats       = GetStatTotal(playerParty.Characters);
            uint targetTotalEnemyStats = GetStatTarget(totalPartyStats, difficulty);
            uint totalEnemyStats       = GetStatTotal(enemies);

            while (totalEnemyStats < targetTotalEnemyStats)
            {
                Character enemy = enemies[RANDOM.Next(enemies.Count)];
                enemy.Stats = enemy.Class.LevelUpStats.Increment(enemy.Stats, RANDOM);
                enemy.Stats.ModifyStat(StatType.LVL, 1);

                totalEnemyStats = GetStatTotal(enemies);
            }

            return(CreateFromEnemies(enemies));
        }
Пример #4
0
        public static CombatSettings CreateFromEnemyGroup(EnemyGroup enemyGroup, CombatDifficulty difficulty, PartyDataWrapper playerParty)
        {
            int enemyCount = 1;

            switch (difficulty)
            {
            case CombatDifficulty.Easy:
                enemyCount = Math.Max(1, RANDOM.Next(1, playerParty.Characters.Count));
                break;

            case CombatDifficulty.Normal:
                enemyCount = Math.Max(2, RANDOM.Next(playerParty.Characters.Count - 1, playerParty.Characters.Count + 1));
                break;

            case CombatDifficulty.Hard:
                enemyCount = Math.Max(2, RANDOM.Next(playerParty.Characters.Count - 1, playerParty.Characters.Count + 2));
                break;
            }

            List <EnemyDefinition> enemyTypes = new List <EnemyDefinition>(enemyCount);

            for (int i = 0; i < enemyCount; i++)
            {
                enemyTypes.Add(RandomResultGenerator.Get(enemyGroup.EnemyTypesByRarity));
            }

            return(CreateFromEnemyTypes(enemyTypes, difficulty, playerParty));
        }
Пример #5
0
 public static CombatSettings CreateFromDifficulty(CombatDifficulty difficulty, PartyDataWrapper playerParty)
 {
     return(CreateFromEnemyGroup(HackUtil.GetRandomEnemyGroup(), difficulty, playerParty));
 }