"Rekrutieren nicht möglich trotz besänftigten Aufstandes"

http://eressea.upb.de/mantis/view.php?id=1265
"Turned back into a toad for no reason"
This commit is contained in:
Enno Rehling 2007-08-31 06:52:27 +00:00
parent 673cf0b7bf
commit 7dda1968ee
4 changed files with 70 additions and 83 deletions

View File

@ -778,9 +778,9 @@ use_foolpotion(struct unit *u, int targetno, const struct item_type *itype, int
static int static int
use_bloodpotion(struct unit *u, const struct item_type *itype, int amount, struct order * ord) use_bloodpotion(struct unit *u, const struct item_type *itype, int amount, struct order * ord)
{ {
if (u->race == new_race[RC_DAEMON] ) { if (u->race == new_race[RC_DAEMON]) {
change_effect(u, itype->rtype->ptype, 100*amount); change_effect(u, itype->rtype->ptype, 100*amount);
} else { } else if (u->irace == u->race) {
static race * rcfailure; static race * rcfailure;
if (!rcfailure) { if (!rcfailure) {
rcfailure = rc_find("smurf"); rcfailure = rc_find("smurf");
@ -788,12 +788,14 @@ use_bloodpotion(struct unit *u, const struct item_type *itype, int amount, struc
} }
if (rcfailure) { if (rcfailure) {
trigger * trestore = trigger_changerace(u, u->race, u->irace); trigger * trestore = trigger_changerace(u, u->race, u->irace);
if (trestore) {
int duration = 2 + rng_int() % 8; int duration = 2 + rng_int() % 8;
add_trigger(&u->attribs, "timer", trigger_timeout(duration, trestore)); add_trigger(&u->attribs, "timer", trigger_timeout(duration, trestore));
u->irace = u->race = rcfailure; u->irace = u->race = rcfailure;
} }
} }
}
use_pooled(u, itype->rtype, GET_SLACK|GET_RESERVE|GET_POOLED_SLACK, amount); use_pooled(u, itype->rtype, GET_SLACK|GET_RESERVE|GET_POOLED_SLACK, amount);
usetpotionuse(u, itype->rtype->ptype); usetpotionuse(u, itype->rtype->ptype);

View File

@ -1316,28 +1316,31 @@ do_fumble(castorder *co)
case 1: case 1:
/* Kröte */ /* Kröte */
duration = rng_int()%level/2; if (u->irace == u->race) {
if (duration<2) duration = 2;
{
/* one or two things will happen: the toad changes her race back, /* one or two things will happen: the toad changes her race back,
* and may or may not get toadslime. * and may or may not get toadslime.
* The list of things to happen are attached to a timeout * The list of things to happen are attached to a timeout
* trigger and that's added to the triggerlit of the mage gone toad. * trigger and that's added to the triggerlit of the mage gone toad.
*/ */
trigger * trestore = trigger_changerace(u, u->race, u->irace); trigger * trestore = trigger_changerace(u, u->race, u->irace);
if (chance(0.7)) { if (chance(0.7)) {
const item_type * it_toadslime = it_find("toadslime"); const item_type * it_toadslime = it_find("toadslime");
if (it_toadslime!=NULL) { if (it_toadslime!=NULL) {
t_add(&trestore, trigger_giveitem(u, it_toadslime, 1)); t_add(&trestore, trigger_giveitem(u, it_toadslime, 1));
} }
} }
duration = rng_int()%level/2;
if (duration<2) duration = 2;
add_trigger(&u->attribs, "timer", trigger_timeout(duration, trestore)); add_trigger(&u->attribs, "timer", trigger_timeout(duration, trestore));
}
u->race = new_race[RC_TOAD]; u->race = new_race[RC_TOAD];
u->irace = new_race[RC_TOAD]; u->irace = new_race[RC_TOAD];
ADDMSG(&r->msgs, msg_message("patzer6", "unit region spell", ADDMSG(&r->msgs, msg_message("patzer6", "unit region spell",
u, r, sp)); u, r, sp));
break; break;
}
/* fall-through is intentional! */
case 2: case 2:
/* temporärer Stufenverlust */ /* temporärer Stufenverlust */
@ -1581,18 +1584,19 @@ verify_unit(region * r, unit * mage, const spell * sp, spllprm * spobj, order *
/* gibt bei Misserfolg 0 zurück, bei Magieresistenz zumindeste eines /* gibt bei Misserfolg 0 zurück, bei Magieresistenz zumindeste eines
* Objektes 1 und bei Erfolg auf ganzer Linie 2 */ * Objektes 1 und bei Erfolg auf ganzer Linie 2 */
static int static void
verify_targets(castorder *co) verify_targets(castorder *co, int * invalid, int * resist, int * success)
{ {
unit *mage = co->magician.u; unit *mage = co->magician.u;
const spell *sp = co->sp; const spell *sp = co->sp;
region *target_r = co->rt; region *target_r = co->rt;
spellparameter *sa = co->par; spellparameter *sa = co->par;
int failed = 0;
int resists = 0;
int success = 0;
int i; int i;
*invalid = 0;
*resist = 0;
*success = 0;
if (sa) { if (sa) {
/* zuerst versuchen wir vorher nicht gefundene Objekte zu finden. /* zuerst versuchen wir vorher nicht gefundene Objekte zu finden.
* Wurde ein Objekt durch globalsuche gefunden, obwohl der Zauber * Wurde ein Objekt durch globalsuche gefunden, obwohl der Zauber
@ -1604,13 +1608,13 @@ verify_targets(castorder *co)
switch(spobj->typ) { switch(spobj->typ) {
case SPP_TEMP: case SPP_TEMP:
case SPP_UNIT: case SPP_UNIT:
if (!verify_unit(target_r, mage, sp, spobj, co->order)) ++failed; if (!verify_unit(target_r, mage, sp, spobj, co->order)) ++*invalid;
break; break;
case SPP_BUILDING: case SPP_BUILDING:
if (!verify_building(target_r, mage, sp, spobj, co->order)) ++failed; if (!verify_building(target_r, mage, sp, spobj, co->order)) ++*invalid;
break; break;
case SPP_SHIP: case SPP_SHIP:
if (!verify_ship(target_r, mage, sp, spobj, co->order)) ++failed; if (!verify_ship(target_r, mage, sp, spobj, co->order)) ++*invalid;
break; break;
default: default:
break; break;
@ -1637,7 +1641,7 @@ verify_targets(castorder *co)
/* Fehlermeldung */ /* Fehlermeldung */
spobj->data.i = u->no; spobj->data.i = u->no;
spobj->flag = TARGET_RESISTS; spobj->flag = TARGET_RESISTS;
++resists; ++*resist;
ADDMSG(&mage->faction->msgs, msg_message("spellunitresists", ADDMSG(&mage->faction->msgs, msg_message("spellunitresists",
"unit region command target", "unit region command target",
mage, mage->region, co->order, u)); mage, mage->region, co->order, u));
@ -1645,7 +1649,7 @@ verify_targets(castorder *co)
} }
/* TODO: Test auf Parteieigenschaft Magieresistsenz */ /* TODO: Test auf Parteieigenschaft Magieresistsenz */
++success; ++*success;
break; break;
case SPP_BUILDING: case SPP_BUILDING:
b = spobj->data.b; b = spobj->data.b;
@ -1655,13 +1659,13 @@ verify_targets(castorder *co)
{ /* Fehlermeldung */ { /* Fehlermeldung */
spobj->data.i = b->no; spobj->data.i = b->no;
spobj->flag = TARGET_RESISTS; spobj->flag = TARGET_RESISTS;
resists++; ++*resist;
ADDMSG(&mage->faction->msgs, msg_message("spellbuildingresists", ADDMSG(&mage->faction->msgs, msg_message("spellbuildingresists",
"unit region command id", "unit region command id",
mage, mage->region, co->order, spobj->data.i)); mage, mage->region, co->order, spobj->data.i));
break; break;
} }
success++; ++*success;
break; break;
case SPP_SHIP: case SPP_SHIP:
sh = spobj->data.sh; sh = spobj->data.sh;
@ -1671,12 +1675,12 @@ verify_targets(castorder *co)
{ /* Fehlermeldung */ { /* Fehlermeldung */
spobj->data.i = sh->no; spobj->data.i = sh->no;
spobj->flag = TARGET_RESISTS; spobj->flag = TARGET_RESISTS;
resists++; ++*resist;
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
"spellshipresists", "ship", sh)); "spellshipresists", "ship", sh));
break; break;
} }
success++; ++*success;
break; break;
case SPP_REGION: case SPP_REGION:
@ -1688,16 +1692,16 @@ verify_targets(castorder *co)
&& target_resists_magic(mage, tr, TYP_REGION, 0)) && target_resists_magic(mage, tr, TYP_REGION, 0))
{ /* Fehlermeldung */ { /* Fehlermeldung */
spobj->flag = TARGET_RESISTS; spobj->flag = TARGET_RESISTS;
resists++; ++*resist;
ADDMSG(&mage->faction->msgs, msg_message("spellregionresists", ADDMSG(&mage->faction->msgs, msg_message("spellregionresists",
"unit region command", mage, mage->region, co->order)); "unit region command", mage, mage->region, co->order));
break; break;
} }
success++; ++*success;
break; break;
case SPP_INT: case SPP_INT:
case SPP_STRING: case SPP_STRING:
success++; ++*success;
break; break;
default: default:
@ -1727,35 +1731,15 @@ verify_targets(castorder *co)
ADDMSG(&mage->faction->msgs, msg_message("spellregionresists", ADDMSG(&mage->faction->msgs, msg_message("spellregionresists",
"unit region command", mage, mage->region, co->order)); "unit region command", mage, mage->region, co->order));
spobj->flag = TARGET_RESISTS; spobj->flag = TARGET_RESISTS;
resists++; ++*resist;
} else { } else {
success++; ++*success;
} }
} else { } else {
success++; ++*success;
} }
} }
} }
if (failed > 0) {
/* mindestens ein Ziel wurde nicht gefunden */
if (sa->length <= failed) {
return 0;
}
if (success == 0) {
/* kein Ziel war ein Erfolg */
if (resists > 0){
/* aber zumindest ein Ziel wurde gefunden, hat nur wiederstanden */
return 1;
} else {
/* nur Fehlschläge */
return 0;
}
}
} /* kein Fehlschlag gefunden */
if (resists > 0){
return 1;
}
return 2;
} }
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
@ -2709,7 +2693,7 @@ magic(void)
for (rank = 0; rank < MAX_SPELLRANK; rank++) { for (rank = 0; rank < MAX_SPELLRANK; rank++) {
for (co = spellranks[rank].begin; co; co = co->next) { for (co = spellranks[rank].begin; co; co = co->next) {
order * ord = co->order; order * ord = co->order;
int verify, cast_level = co->level; int invalid, resist, success, cast_level = co->level;
boolean fumbled = false; boolean fumbled = false;
unit * u = co->magician.u; unit * u = co->magician.u;
const spell *sp = co->sp; const spell *sp = co->sp;
@ -2753,37 +2737,29 @@ magic(void)
* Spruch an der Magieresistenz, so ist verify_targets = 1, bei * Spruch an der Magieresistenz, so ist verify_targets = 1, bei
* Erfolg auf ganzer Linie ist verify_targets= 2 * Erfolg auf ganzer Linie ist verify_targets= 2
*/ */
verify = verify_targets(co); verify_targets(co, &invalid, &resist, &success);
if (verify==0) { if (success+resist==0) {
/* kein Ziel gefunden, Fehlermeldungen sind in verify_targets */ /* kein Ziel gefunden, Fehlermeldungen sind in verify_targets */
/* keine kosten für den zauber */ /* keine kosten für den zauber */
continue; /* äußere Schleife, nächster Zauberer */ continue; /* äußere Schleife, nächster Zauberer */
} else if (co->force>0 && verify==1) { } else if (co->force>0 && resist>0) {
/* einige oder alle Ziele waren magieresistent */ /* einige oder alle Ziele waren magieresistent */
spellparameter *pa = co->par; if (success==0) {
int n;
for (n=0; n!=pa->length;++n) {
if ((pa->param[n]->flag & (TARGET_RESISTS|TARGET_NOTFOUND)) ==0) {
/* mindestens ein erfolgreicher Zauberversuch, wir machen normal weiter */
break;
}
}
if (n==pa->length) {
co->force = 0; co->force = 0;
/* zwar wurde mindestens ein Ziel gefunden, das widerstand /* zwar wurde mindestens ein Ziel gefunden, das widerstand
* jedoch dem Zauber. Kosten abziehen und abbrechen. */ * jedoch dem Zauber. Kosten abziehen und abbrechen. */
ADDMSG(&u->faction->msgs, msg_message("spell_resist", "unit region spell", ADDMSG(&u->faction->msgs, msg_message("spell_resist", "unit region spell",
u, r, sp)); u, r, sp));
co->force = 0;
} }
} }
/* Auch für Patzer gibt es Erfahrung, müssen die Spruchkosten /* Auch für Patzer gibt es Erfahrung, müssen die Spruchkosten
* bezahlt werden und die nachfolgenden Sprüche werden teurer */ * bezahlt werden und die nachfolgenden Sprüche werden teurer */
if (co->force>0 && fumble(target_r, u, sp, co->level)) { if (co->force>0) {
if (fumble(target_r, u, sp, co->level)) {
/* zuerst bezahlen, dann evt in do_fumble alle Aura verlieren */ /* zuerst bezahlen, dann evt in do_fumble alle Aura verlieren */
fumbled = true; fumbled = true;
} else if (co->force>0) { } else {
if (sp->sp_function==NULL) { if (sp->sp_function==NULL) {
log_error(("spell '%s' has no function.\n", sp->sname)); log_error(("spell '%s' has no function.\n", sp->sname));
co->level = 0; co->level = 0;
@ -2795,6 +2771,7 @@ magic(void)
continue; continue;
} }
} }
}
pay_spell(u, sp, co->level, co->distance); pay_spell(u, sp, co->level, co->distance);
/* erst bezahlen, dann Kostenzähler erhöhen */ /* erst bezahlen, dann Kostenzähler erhöhen */
if (fumbled) do_fumble(co); if (fumbled) do_fumble(co);

View File

@ -3954,6 +3954,7 @@ sp_rallypeasantmob(castorder *co)
unit *mage = co->magician.u; unit *mage = co->magician.u;
int cast_level = co->level; int cast_level = co->level;
message * msg; message * msg;
curse * c;
for (u = r->units; u; u = un) { for (u = r->units; u; u = un) {
un = u->next; un = u->next;
@ -3967,6 +3968,11 @@ sp_rallypeasantmob(castorder *co)
} }
} }
c = get_curse(r->attribs, ct_find(oldcursename(C_RIOT)));
if (c!=NULL) {
remove_curse(&r->attribs, c);
}
msg = msg_message("cast_rally_effect", "mage region", mage, r); msg = msg_message("cast_rally_effect", "mage region", mage, r);
r_addmessage(r, NULL, msg); r_addmessage(r, NULL, msg);
msg_release(msg); msg_release(msg);
@ -4866,11 +4872,11 @@ sp_illusionary_shapeshift(castorder *co)
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, "sp_shapeshift_fail", "target race", u, rc)); ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, "sp_shapeshift_fail", "target race", u, rc));
return 0; return 0;
} }
{ if (u->irace == u->race) {
trigger * trestore = trigger_changerace(u, NULL, u->irace); trigger * trestore = trigger_changerace(u, NULL, u->irace);
add_trigger(&u->attribs, "timer", trigger_timeout((int)power+2, trestore)); add_trigger(&u->attribs, "timer", trigger_timeout((int)power+2, trestore));
}
u->irace = rc; u->irace = rc;
}
ADDMSG(&mage->faction->msgs, msg_message("shapeshift_effect", "mage target race", mage, u, rc)); ADDMSG(&mage->faction->msgs, msg_message("shapeshift_effect", "mage target race", mage, u, rc));

View File

@ -107,6 +107,8 @@ trigger_changerace(struct unit * u, const struct race * prace, const struct race
{ {
trigger * t = t_new(&tt_changerace); trigger * t = t_new(&tt_changerace);
changerace_data * td = (changerace_data*)t->data.v; changerace_data * td = (changerace_data*)t->data.v;
assert(u->race==u->irace || "!changerace-triggers cannot stack!");
td->u = u; td->u = u;
td->race = prace; td->race = prace;
td->irace = irace; td->irace = irace;