diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index ea5553243..919c4d477 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -538,28 +538,49 @@ reportcasualties(battle * b, fighter * fig, int dead) msg_release(m); } +static int +contest_classic(int skilldiff, const armor_type * ar, const armor_type * sh) +{ + int p, vw = BASE_CHANCE - TDIFF_CHANGE * skilldiff; + double mod = 1.0; + + if (ar != NULL) + mod *= (1 + ar->penalty); + if (sh != NULL) + mod *= (1 + sh->penalty); + vw = (int)(100 - ((100 - vw) * mod)); + + do { + p = rng_int() % 100; + vw -= p; + } + while (vw >= 0 && p >= 90); + return (vw <= 0); +} + +/** new rule for Eressea 1.5 + * \param skilldiff - the attack skill with every modifier applied + */ +static int +contest_new(int skilldiff, const troop dt, const armor_type * ar, const armor_type * sh) +{ + double tohit = 0.5 + skilldiff * 0.1; + if (tohit<0.5) tohit = 0.5; + if (chance(tohit)) { + int defense = effskill(dt.fighter->unit, SK_STAMINA); + double tosave = defense * 0.05; + return !chance(tosave); + } + return 0; +} static int -contest(int skilldiff, const armor_type * ar, const armor_type * sh) +contest(int skdiff, const troop dt, const armor_type * ar, const armor_type * sh) { if (skill_formula==FORMULA_ORIG) { - int p, vw = BASE_CHANCE - TDIFF_CHANGE * skilldiff; - double mod = 1.0; - - if (ar != NULL) - mod *= (1 + ar->penalty); - if (sh != NULL) - mod *= (1 + sh->penalty); - vw = (int)(100 - ((100 - vw) * mod)); - - do { - p = rng_int() % 100; - vw -= p; - } - while (vw >= 0 && p >= 90); - return (vw <= 0); + return contest_classic(skdiff, ar, sh); } else { - return 1; + return contest_new(skdiff, dt, ar, sh); } } @@ -1842,7 +1863,7 @@ hits(troop at, troop dt, weapon * awp) /* Verteidiger bekommt eine Rüstung */ armor = select_armor(dt, true); shield = select_armor(dt, false); - if (contest(skdiff, armor, shield)) { + if (contest(skdiff, dt, armor, shield)) { if (bdebug) { debug_hit(at, awp, dt, dwp, skdiff, dist, true); } @@ -2311,8 +2332,8 @@ PopulationDamage(void) { static double value = -1.0; if (value<0) { - const char * str = get_param(global.parameters, "battle.populationdamage"); - value = str?atof(str):(BATTLE_KILLS_PEASANTS/100.0); + int damage = get_param_int(global.parameters, "rules.combat.populationdamage", BATTLE_KILLS_PEASANTS); + value = damage/100.0; } return value; } @@ -2323,9 +2344,11 @@ battle_effects(battle * b, int dead_players) { region * r = b->region; int dead_peasants = MIN(rpeasants(r), (int)(dead_players*PopulationDamage())); - deathcounts(r, dead_peasants + dead_players); - chaoscounts(r, dead_peasants / 2); - rsetpeasants(r, rpeasants(r) - dead_peasants); + if (dead_peasants) { + deathcounts(r, dead_peasants + dead_players); + chaoscounts(r, dead_peasants / 2); + rsetpeasants(r, rpeasants(r) - dead_peasants); + } } static void @@ -3402,7 +3425,7 @@ battle_report(battle * b) } } - printf(" %d", b->turn); + if (verbosity>0) log_stdio(stdout, " %d", b->turn); fflush(stdout); for (bf=b->factions;bf;bf=bf->next) { @@ -4055,7 +4078,7 @@ do_battle(region * r) do_combatmagic(b, DO_PRECOMBATSPELL); print_stats(b); /* gibt die Kampfaufstellung aus */ - log_stdio(stdout, "%s (%d, %d) : ", rname(r, NULL), r->x, r->y); + if (verbosity>0) log_stdio(stdout, "%s (%d, %d) : ", rname(r, NULL), r->x, r->y); for (;battle_report(b) && b->turn<=max_turns;++b->turn) { if (bdebug) { @@ -4079,7 +4102,7 @@ do_battle(region * r) #endif /* KARMA_MODULE */ } - printf("\n"); + if (verbosity>0) log_stdio(stdout, "\n"); /* Auswirkungen berechnen: */ aftermath(b); diff --git a/src/res/changes.txt b/src/res/changes.txt index afdce13f8..c04460958 100644 --- a/src/res/changes.txt +++ b/src/res/changes.txt @@ -22,6 +22,7 @@ Kampf: = done (rules.combat_turns) - neue Trefferchanceberechnung - neue Beuteregelung +- Gegnerlimits Gegenstände: - Waffen mit höherem Schaden. @@ -29,7 +30,7 @@ Gegenstände: Diverse: - neue Terraintypen (weniger Bauern, knappere Ressourcen) -- limitierte Rekrutieren von Migranten erlauben +- limitiertes Rekrutieren von Migranten erlauben - Parteitarnung fällt weg = done (disable TARNEN) - Monster entfernen diff --git a/src/res/eressea2.xml b/src/res/eressea2.xml index c59af7742..8ca10bfc7 100644 --- a/src/res/eressea2.xml +++ b/src/res/eressea2.xml @@ -11,6 +11,7 @@ + @@ -102,6 +103,7 @@ + diff --git a/src/res/kingdoms.xml b/src/res/kingdoms.xml index 901feae81..58ba7b32c 100644 --- a/src/res/kingdoms.xml +++ b/src/res/kingdoms.xml @@ -101,7 +101,7 @@ - +