Merge branch 'Bug-1525-and-1872' of github.com:CTD1/eressea-server-bugfixing into CTD1-Bug-1525-and-1872

This commit is contained in:
Enno Rehling 2014-08-14 20:06:14 +02:00
commit fa0c999d3e
2 changed files with 33 additions and 21 deletions

View File

@ -42,6 +42,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "ship.h" #include "ship.h"
#include "skill.h" #include "skill.h"
#include "terrain.h" #include "terrain.h"
#include "terrainid.h"
#include "teleport.h" #include "teleport.h"
#include "unit.h" #include "unit.h"
@ -839,48 +840,48 @@ static void caught_target(region * r, unit * u)
} }
} }
/* TODO: Unsichtbarkeit bedenken ! */
static unit *bewegung_blockiert_von(unit * reisender, region * r) static unit *bewegung_blockiert_von(unit * reisender, region * r)
{ {
unit *u; unit *u;
double prob = 0.0; double prob = 0.0;
bool contact = false;
unit *guard = NULL; unit *guard = NULL;
int guard_count = 0;
int stealth = eff_stealth(reisender, r); int stealth = eff_stealth(reisender, r);
static int gamecookie = -1; static int gamecookie = -1;
static double base_prob = -999; static double base_prob = -999;
static double skill_prob = -999; static double skill_prob = -999;
static double amulet_prob = -999; static double amulet_prob = -999;
static double guard_number_prob = -999;
static double castle_prob = -999;
static double region_type_prob = -999;
const struct resource_type *ramulet = get_resourcetype(R_AMULET_OF_TRUE_SEEING); const struct resource_type *ramulet = get_resourcetype(R_AMULET_OF_TRUE_SEEING);
if (gamecookie < 0 || gamecookie != global.cookie) { if (gamecookie < 0 || gamecookie != global.cookie) {
base_prob = base_prob = get_param_flt(global.parameters, "rules.guard.base_stop_prob", .3f);
get_param_flt(global.parameters, "rules.guard.base_stop_prob", .3f); skill_prob = get_param_flt(global.parameters, "rules.guard.skill_stop_prob", .1f);
skill_prob = amulet_prob = get_param_flt(global.parameters, "rules.guard.amulet_stop_prob", .1f);
get_param_flt(global.parameters, "rules.guard.skill_stop_prob", .1f); guard_number_prob = get_param_flt(global.parameters, "rules.guard.guard_number_stop_prob", .001f);
amulet_prob = castle_prob = get_param_flt(global.parameters, "rules.guard.castle_stop_prob", .1f);
get_param_flt(global.parameters, "rules.guard.amulet_stop_prob", .1f); region_type_prob = get_param_flt(global.parameters, "rules.guard.region_type_stop_prob", .1f);
gamecookie = global.cookie; gamecookie = global.cookie;
} }
if (fval(u_race(reisender), RCF_ILLUSIONARY)) if (fval(u_race(reisender), RCF_ILLUSIONARY))
return NULL; return NULL;
for (u = r->units; u && !contact; u = u->next) { for (u = r->units; u; u = u->next) {
if (is_guard(u, GUARD_TRAVELTHRU)) { if (is_guard(u, GUARD_TRAVELTHRU)) {
int sk = eff_skill(u, SK_PERCEPTION, r); int sk = eff_skill(u, SK_PERCEPTION, r);
if (invisible(reisender, u) >= reisender->number) if (invisible(reisender, u) >= reisender->number)
continue; continue;
if (u->faction == reisender->faction) if ((u->faction == reisender->faction) || (ucontact(u, reisender)) || (alliedunit(u, reisender->faction, HELP_GUARD)))
contact = true; guard_count = guard_count - u->number;
else if (ucontact(u, reisender))
contact = true;
else if (alliedunit(u, reisender->faction, HELP_GUARD))
contact = true;
else if (sk >= stealth) { else if (sk >= stealth) {
guard_count =+ u->number;
double prob_u = (sk - stealth) * skill_prob; double prob_u = (sk - stealth) * skill_prob;
/* amulet counts at most once */ /* amulet counts at most once */
prob_u += _min(1, _min(u->number, i_get(u->items, ramulet->itype))) * amulet_prob; prob_u += _min (1, _min(u->number, i_get(u->items, ramulet->itype))) * amulet_prob;
if (u->building && (u->building->type == bt_find("castle")) && u == building_owner(u->building))
prob_u += castle_prob*buildingeffsize(u->building, 0);
if (prob_u >= prob) { if (prob_u >= prob) {
prob = prob_u; prob = prob_u;
guard = u; guard = u;
@ -888,14 +889,25 @@ static unit *bewegung_blockiert_von(unit * reisender, region * r)
} }
} }
} }
if (!contact && guard) { if (guard) {
prob += base_prob; /* 30% base chance */ prob += base_prob; /* 30% base chance */
prob = +guard_count*guard_number_prob;
if (r->terrain = newterrain(T_GLACIER))
prob = +region_type_prob*2;
if (r->terrain = newterrain(T_SWAMP))
prob = +region_type_prob*2;
if (r->terrain = newterrain(T_MOUNTAIN))
prob = +region_type_prob;
if (r->terrain = newterrain(T_VOLCANO))
prob = +region_type_prob;
if (r->terrain = newterrain(T_VOLCANO_SMOKING))
prob = +region_type_prob;
if (chance(prob)) { if (prob > 0 && chance(prob)) {
return guard; return guard;
} }
} }
return NULL; return NULL;
} }
static bool is_guardian_u(const unit * guard, unit * u, unsigned int mask) static bool is_guardian_u(const unit * guard, unit * u, unsigned int mask)

View File

@ -4626,7 +4626,7 @@ void init_processor(void)
} }
p += 10; /* can't allow reserve before siege (weapons) */ p += 10; /* can't allow reserve before siege (weapons) */
add_proc_region(p, &enter_1, "Betreten (3. Versuch)"); add_proc_region(p, &enter_1, "Betreten (3. Versuch)"); /* to claim a castle after a victory and to be able to DESTROY it in the same turn */
if (get_param_int(global.parameters, "rules.reserve.twophase", 0)) { if (get_param_int(global.parameters, "rules.reserve.twophase", 0)) {
add_proc_order(p, K_RESERVE, &reserve_self, 0, "RESERVE (self)"); add_proc_order(p, K_RESERVE, &reserve_self, 0, "RESERVE (self)");
p += 10; p += 10;