Exploit, Magier heilen Truppen höher als ihre HP vor dem Kampf waren.
This commit is contained in:
Enno Rehling 2005-03-06 13:17:22 +00:00
parent c297b20177
commit 2dc454a5fd
3 changed files with 46 additions and 64 deletions

View File

@ -1599,6 +1599,46 @@ sp_keeploot(fighter * fi, int level, double power, spell * sp)
return level;
}
static int
heal_fighters(cvector *fgs, int * power, boolean heal_monsters)
{
int healhp = *power;
int healed = 0;
void **fig;
for (fig = fgs->begin; fig != fgs->end; ++fig) {
fighter *df = *fig;
if (healhp<=0) break;
/* Untote kann man nicht heilen */
if (fval(df->unit->race, RCF_NOHEAL)) continue;
/* wir heilen erstmal keine Monster */
if (heal_monsters || playerrace(df->unit->race)) {
int n, hp = df->unit->hp / df->unit->number;
int rest = df->unit->hp % df->unit->number;
for (n = 0; n < df->unit->number; n++) {
int wound = hp - df->person[n].hp;
if (rest>n) ++wound;
if (wound > 0 && wound < hp) {
int heal = min(healhp, wound);
assert(heal>=0);
df->person[n].hp += heal;
healhp = max(0, healhp - heal);
++healed;
if (healhp<=0) break;
}
}
}
}
*power = healhp;
return healed;
}
int
sp_healing(fighter * fi, int level, double power, spell * sp)
{
@ -1606,11 +1646,9 @@ sp_healing(fighter * fi, int level, double power, spell * sp)
unit *mage = fi->unit;
int minrow = FIGHT_ROW;
int maxrow = AVOID_ROW;
int healhp;
int hp, wound;
int n, j = 0;
int j = 0;
int healhp = (int)power;
cvector *fgs;
void **fig;
sprintf(buf, "%s kümmert sich um die Verletzten", unitname(mage));
@ -1630,58 +1668,10 @@ sp_healing(fighter * fi, int level, double power, spell * sp)
fgs = fighters(b, fi, minrow, maxrow, FS_HELP);
v_scramble(fgs->begin, fgs->end);
healhp = (int)power;
for (fig = fgs->begin; fig != fgs->end; ++fig) {
fighter *df = *fig;
if (healhp<=0) break;
/* wir heilen erstmal keine Monster */
if (!playerrace(df->unit->race))
continue;
hp = unit_max_hp(df->unit);
for (n = 0; n < df->unit->number; n++) {
if (!healhp)
break;
wound = hp - df->person[n].hp;
if ( wound > 0 && wound < hp) {
int heal = min(healhp, wound);
assert(heal>=0);
df->person[n].hp += heal;
healhp = max(0, healhp - heal);
j++;
}
}
}
/* haben wir noch HP übrig, so heilen wir nun auch Monster */
for (fig = fgs->begin; fig != fgs->end; ++fig) {
fighter *df = *fig;
if (healhp<=0) break;
/* Untote kann man nicht heilen */
if (fval(df->unit->race, RCF_NOHEAL))
continue;
hp = unit_max_hp(df->unit);
for (n = 0; n < df->unit->number; n++) {
if (healhp<=0) break;
wound = hp - df->person[n].hp;
if ( wound > 0 && wound < hp) {
int heal = min(healhp, wound);
assert(heal>=0);
df->person[n].hp += heal;
healhp = max(0, healhp - heal);
j++;
}
}
}
j += heal_fighters(fgs, &healhp, false);
j += heal_fighters(fgs, &healhp, true);
cv_kill(fgs);
if (j == 0) {
scat(", doch niemand mußte magisch geheilt werden.");
level = 0;

View File

@ -291,15 +291,7 @@ unit_max_hp(const unit * u)
return h;
}
/*
boolean is_undead(const unit *u)
{
return u->race == RC_UNDEAD || u->race == RC_SKELETON
|| u->race == RC_SKELETON_LORD || u->race == RC_ZOMBIE
|| u->race == RC_ZOMBIE_LORD || u->race == RC_GHOUL
|| u->race == RC_GHOUL_LORD;
}
*/
boolean
r_insectstalled(const region * r)
{