spells must deal with resisting targets, or sigsegv will happen

This commit is contained in:
Enno Rehling 2021-02-12 20:15:32 +01:00
parent 8d286d5e23
commit b756fde006
1 changed files with 100 additions and 57 deletions

View File

@ -723,15 +723,15 @@ static int sp_transferaura(castorder * co)
struct sc_mage *scm_dst, *scm_src = get_mage(mage); struct sc_mage *scm_dst, *scm_src = get_mage(mage);
assert(scm_src); assert(scm_src);
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND)
return 0;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber /* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */ * abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS) if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level; return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag)
return 0;
/* Wieviel Transferieren? */ /* Wieviel Transferieren? */
aura = pa->param[1]->data.i; aura = pa->param[1]->data.i;
u = pa->param[0]->data.u; u = pa->param[0]->data.u;
@ -805,8 +805,13 @@ static int sp_goodwinds(castorder * co)
ship *sh; ship *sh;
unit *u; unit *u;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) if (pa->param[0]->flag)
return 0; return 0;
sh = pa->param[0]->data.sh; sh = pa->param[0]->data.sh;
@ -958,8 +963,13 @@ static int sp_blessstonecircle(castorder * co)
spellparameter *p = co->par; spellparameter *p = co->par;
message *msg; message *msg;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (p->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (p->param[0]->flag == TARGET_NOTFOUND) if (p->param[0]->flag)
return 0; return 0;
b = p->param[0]->data.b; b = p->param[0]->data.b;
@ -1297,7 +1307,7 @@ static int sp_rosthauch(castorder * co)
if (force <= 0) if (force <= 0)
break; break;
if (pa->param[n]->flag & (TARGET_RESISTS | TARGET_NOTFOUND)) if (pa->param[n]->flag)
continue; continue;
for (; iweapon != NULL; iweapon = iweapon->next) { for (; iweapon != NULL; iweapon = iweapon->next) {
@ -1387,8 +1397,7 @@ static int sp_kaelteschutz(castorder * co)
if (force < 1) if (force < 1)
break; break;
if (pa->param[n]->flag == TARGET_RESISTS if (pa->param[n]->flag)
|| pa->param[n]->flag == TARGET_NOTFOUND)
continue; continue;
u = pa->param[n]->data.u; u = pa->param[n]->data.u;
@ -1440,15 +1449,15 @@ static int sp_sparkle(castorder * co)
int duration = cast_level + 1; int duration = cast_level + 1;
double effect; double effect;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND)
return 0;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber /* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */ * abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS) if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level; return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag)
return 0;
u = pa->param[0]->data.u; u = pa->param[0]->data.u;
effect = (float)(rng_int() % 0xffffff); effect = (float)(rng_int() % 0xffffff);
create_curse(caster, &u->attribs, &ct_sparkle, (float)cast_level, create_curse(caster, &u->attribs, &ct_sparkle, (float)cast_level,
@ -1785,7 +1794,7 @@ static int sp_treewalkenter(castorder * co)
unit *u = pa->param[n]->data.u; unit *u = pa->param[n]->data.u;
spllprm *param = pa->param[n]; spllprm *param = pa->param[n];
if (param->flag & (TARGET_RESISTS | TARGET_NOTFOUND)) { if (param->flag) {
continue; continue;
} }
@ -1913,8 +1922,7 @@ static int sp_treewalkexit(castorder * co)
/* fuer jede Einheit in der Kommandozeile */ /* fuer jede Einheit in der Kommandozeile */
for (n = 1; n < pa->length; n++) { for (n = 1; n < pa->length; n++) {
if (pa->param[n]->flag == TARGET_RESISTS if (pa->param[n]->flag)
|| pa->param[n]->flag == TARGET_NOTFOUND)
continue; continue;
u = pa->param[n]->data.u; u = pa->param[n]->data.u;
@ -2222,8 +2230,7 @@ static int sp_stormwinds(castorder * co)
if (force <= 0) if (force <= 0)
break; break;
if (pa->param[n]->flag == TARGET_RESISTS if (pa->param[n]->flag)
|| pa->param[n]->flag == TARGET_NOTFOUND)
continue; continue;
sh = pa->param[n]->data.sh; sh = pa->param[n]->data.sh;
@ -2491,8 +2498,13 @@ static int sp_fumblecurse(castorder * co)
curse *c; curse *c;
spellparameter *pa = co->par; spellparameter *pa = co->par;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) if (pa->param[0]->flag)
return 0; return 0;
target = pa->param[0]->data.u; target = pa->param[0]->data.u;
@ -2733,8 +2745,7 @@ static int sp_unholypower(castorder * co)
const race *target_race; const race *target_race;
unit *u; unit *u;
if (pa->param[i]->flag == TARGET_RESISTS if (pa->param[i]->flag)
|| pa->param[i]->flag == TARGET_NOTFOUND)
continue; continue;
u = pa->param[i]->data.u; u = pa->param[i]->data.u;
@ -3405,15 +3416,15 @@ static int sp_analysesong_unit(castorder * co)
double force = co->force; double force = co->force;
spellparameter *pa = co->par; spellparameter *pa = co->par;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND)
return 0;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber /* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */ * abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS) if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level; return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag)
return 0;
u = pa->param[0]->data.u; u = pa->param[0]->data.u;
magicanalyse_unit(u, mage, force); magicanalyse_unit(u, mage, force);
@ -3492,8 +3503,13 @@ static int sp_charmingsong(castorder * co)
int resist_bonus = 0; int resist_bonus = 0;
int tb = 0; int tb = 0;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) if (pa->param[0]->flag)
return 0; return 0;
target = pa->param[0]->data.u; target = pa->param[0]->data.u;
@ -3745,8 +3761,13 @@ static int sp_migranten(castorder * co)
int max_force = (int) co->force; int max_force = (int) co->force;
spellparameter *pa = co->par; spellparameter *pa = co->par;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return co->level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) if (pa->param[0]->flag)
return 0; return 0;
target = pa->param[0]->data.u; /* Zieleinheit */ target = pa->param[0]->data.u; /* Zieleinheit */
@ -4030,8 +4051,13 @@ static int sp_pump(castorder * co)
spellparameter *pa = co->par; spellparameter *pa = co->par;
int cast_level = co->level; int cast_level = co->level;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) if (pa->param[0]->flag)
return 0; return 0;
target = pa->param[0]->data.u; /* Zieleinheit */ target = pa->param[0]->data.u; /* Zieleinheit */
@ -4092,8 +4118,13 @@ static int sp_seduce(castorder * co)
int cast_level = co->level; int cast_level = co->level;
double force = co->force; double force = co->force;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) { if (pa->param[0]->flag) {
return 0; return 0;
} }
@ -4183,8 +4214,13 @@ static int sp_calm_monster(castorder * co)
double effect; double effect;
message *msg; message *msg;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) if (pa->param[0]->flag)
return 0; return 0;
target = pa->param[0]->data.u; /* Zieleinheit */ target = pa->param[0]->data.u; /* Zieleinheit */
@ -4238,8 +4274,13 @@ static int sp_headache(castorder * co)
target = pa->param[0]->data.u; /* Zieleinheit */ target = pa->param[0]->data.u; /* Zieleinheit */
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (target->number == 0 || pa->param[0]->flag == TARGET_NOTFOUND) if (target->number == 0 || pa->param[0]->flag)
return 0; return 0;
/* finde das groesste Talent: */ /* finde das groesste Talent: */
@ -4480,15 +4521,15 @@ int sp_illusionary_shapeshift(castorder * co)
spellparameter *pa = co->par; spellparameter *pa = co->par;
const race *irace; const race *irace;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND)
return 0;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber /* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */ * abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS) if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level; return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag)
return 0;
u = pa->param[0]->data.u; u = pa->param[0]->data.u;
rc = findrace(pa->param[1]->data.xs, mage->faction->locale); rc = findrace(pa->param[1]->data.xs, mage->faction->locale);
@ -4538,15 +4579,15 @@ int sp_analysedream(castorder * co)
int cast_level = co->level; int cast_level = co->level;
spellparameter *pa = co->par; spellparameter *pa = co->par;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND)
return 0;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber /* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */ * abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS) if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level; return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag)
return 0;
u = pa->param[0]->data.u; u = pa->param[0]->data.u;
magicanalyse_unit(u, mage, cast_level); magicanalyse_unit(u, mage, cast_level);
@ -4666,15 +4707,15 @@ int sp_dreamreading(castorder * co)
double power = co->force; double power = co->force;
message *msg; message *msg;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND)
return 0;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber /* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */ * abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS) if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level; return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag)
return 0;
u = pa->param[0]->data.u; u = pa->param[0]->data.u;
/* Illusionen und Untote abfangen. */ /* Illusionen und Untote abfangen. */
@ -4724,8 +4765,7 @@ int sp_sweetdreams(castorder * co)
if (opfer < 1) if (opfer < 1)
break; break;
if (pa->param[n]->flag == TARGET_RESISTS || if (pa->param[n]->flag)
pa->param[n]->flag == TARGET_NOTFOUND)
continue; continue;
/* Zieleinheit */ /* Zieleinheit */
@ -4851,8 +4891,13 @@ int sp_itemcloak(castorder * co)
double power = co->force; double power = co->force;
int duration = (int)fmax(2.0, power + 1); /* works in the report, and ageing this round would kill it if it's <=1 */ int duration = (int)fmax(2.0, power + 1); /* works in the report, and ageing this round would kill it if it's <=1 */
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) if (pa->param[0]->flag)
return 0; return 0;
/* Zieleinheit */ /* Zieleinheit */
@ -4901,8 +4946,7 @@ int sp_resist_magic_bonus(castorder * co)
if (victims < 1) if (victims < 1)
break; break;
if (pa->param[n]->flag == TARGET_RESISTS if (pa->param[n]->flag)
|| pa->param[n]->flag == TARGET_NOTFOUND)
continue; continue;
u = pa->param[n]->data.u; u = pa->param[n]->data.u;
@ -4975,7 +5019,7 @@ int sp_enterastral(castorder * co)
/* fuer jede Einheit in der Kommandozeile */ /* fuer jede Einheit in der Kommandozeile */
for (n = 0; n < pa->length; n++) { for (n = 0; n < pa->length; n++) {
if (pa->param[n]->flag == TARGET_NOTFOUND) if (pa->param[n]->flag)
continue; continue;
u = pa->param[n]->data.u; u = pa->param[n]->data.u;
@ -5318,7 +5362,7 @@ int sp_fetchastral(castorder * co)
int w; int w;
message *m; message *m;
if (pa->param[n]->flag & TARGET_NOTFOUND) if (pa->param[n]->flag)
continue; continue;
if (u->region != ro) { if (u->region != ro) {
@ -5360,7 +5404,7 @@ int sp_fetchastral(castorder * co)
} }
if (!ucontact(u, mage)) { if (!ucontact(u, mage)) {
if (power > 12 && !(pa->param[n]->flag & TARGET_RESISTS)) { if (power > 12 && !(pa->param[n]->flag == TARGET_RESISTS)) {
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"feedback_no_contact_no_resist", "target", u)); "feedback_no_contact_no_resist", "target", u));
ADDMSG(&u->faction->msgs, msg_message("send_astral", "unit target", ADDMSG(&u->faction->msgs, msg_message("send_astral", "unit target",
@ -5680,15 +5724,15 @@ int sp_permtransfer(castorder * co)
const spell *sp = co->sp; const spell *sp = co->sp;
message *msg; message *msg;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND)
return 0;
/* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber /* wenn Ziel gefunden, dieses aber Magieresistent war, Zauber
* abbrechen aber kosten lassen */ * abbrechen aber kosten lassen */
if (pa->param[0]->flag == TARGET_RESISTS) if (pa->param[0]->flag == TARGET_RESISTS)
return cast_level; return cast_level;
/* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag)
return 0;
tu = pa->param[0]->data.u; tu = pa->param[0]->data.u;
aura = pa->param[1]->data.i; aura = pa->param[1]->data.i;
@ -6020,8 +6064,7 @@ int sp_speed2(castorder * co)
if (maxmen < 1) if (maxmen < 1)
break; break;
if (pa->param[n]->flag == TARGET_RESISTS if (pa->param[n]->flag)
|| pa->param[n]->flag == TARGET_NOTFOUND)
continue; continue;
u = pa->param[n]->data.u; u = pa->param[n]->data.u;