Exemplo n.º 1
0
        protected virtual BattlerStats target_stats()
        {
            var result = new CombatStats(target.id, attacker.id, distance: Distance)
            {
                location_bonuses = inverse_location_bonus
            };

            return(result);
        }
Exemplo n.º 2
0
        private void rebalance_arena_fight()
        {
            // Mess with stats if people can't hit/damage
            Global.game_system.In_Arena = true;
            int dmg, hit;
            var stats = new Calculations.Stats.CombatStats(
                unit.id, opponent.id, distance: Actual_Distance);
            var opponent_stats = new Calculations.Stats.CombatStats(
                opponent.id, unit.id, distance: Actual_Distance);
            // Rounds for unit to kill gladiator
            int rounds_to_kill = (int)Math.Ceiling(
                ((float)opponent.actor.maxhp) / Math.Max(1, dmg = stats.dmg_per_round()));

            // While gladiator rounds to kill unit is more than unit's (max 6), increase gladiator Pow
            while ((dmg = opponent_stats.dmg_per_round()) <=
                   unit.actor.maxhp / Math.Max(2, Math.Min(6, rounds_to_kill - 1)) &&
                   !opponent.actor.get_capped(Stat_Labels.Pow))
            {
                opponent.actor.gain_stat(Stat_Labels.Pow, 2);
                opponent.actor.gain_stat(Stat_Labels.Def, -1);
                opponent.actor.gain_stat(Stat_Labels.Res, -1);
            }
            // While gladiator can one round unit, decrease Pow
            while ((dmg = opponent_stats.dmg_per_round()) >=
                   unit.actor.maxhp &&
                   opponent.actor.stat(Stat_Labels.Pow) > 0)
            {
                opponent.actor.gain_stat(Stat_Labels.Pow, -1);
                opponent.actor.gain_stat(Stat_Labels.Def, 1);
                opponent.actor.gain_stat(Stat_Labels.Res, 1);
            }
            while ((hit = opponent_stats.hit()) <= Config.MIN_ARENA_HIT &&
                   !opponent.actor.get_capped(Stat_Labels.Skl))
            {
                opponent.actor.gain_stat(Stat_Labels.Skl, 3);
                opponent.actor.gain_stat(Stat_Labels.Spd, -1);
                opponent.actor.gain_stat(Stat_Labels.Lck, -2);
            }
            while ((dmg = stats.dmg_per_round()) <=
                   (opponent.actor.maxhp / Config.MAX_ARENA_DMG_ROUNDS) &&
                   (opponent.actor.stat(Stat_Labels.Def) > 0 || opponent.actor.stat(Stat_Labels.Res) > 0))
            {
                opponent.actor.gain_stat(Stat_Labels.Def, -1);
                opponent.actor.gain_stat(Stat_Labels.Res, -1);
            }
            while ((hit = stats.hit()) <= Config.MIN_ARENA_HIT &&
                   (opponent.actor.stat(Stat_Labels.Spd) > 0 || opponent.actor.stat(Stat_Labels.Lck) > 0))
            {
                opponent.actor.gain_stat(Stat_Labels.Spd, -1);
                opponent.actor.gain_stat(Stat_Labels.Lck, -1);
            }
            Global.game_system.In_Arena = false;
        }