protected virtual BattlerStats target_stats() { var result = new CombatStats(target.id, attacker.id, distance: Distance) { location_bonuses = inverse_location_bonus }; return(result); }
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; }