forked from github/server
"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:
parent
673cf0b7bf
commit
7dda1968ee
|
@ -780,7 +780,7 @@ use_bloodpotion(struct unit *u, const struct item_type *itype, int amount, struc
|
|||
{
|
||||
if (u->race == new_race[RC_DAEMON]) {
|
||||
change_effect(u, itype->rtype->ptype, 100*amount);
|
||||
} else {
|
||||
} else if (u->irace == u->race) {
|
||||
static race * rcfailure;
|
||||
if (!rcfailure) {
|
||||
rcfailure = rc_find("smurf");
|
||||
|
@ -788,12 +788,14 @@ use_bloodpotion(struct unit *u, const struct item_type *itype, int amount, struc
|
|||
}
|
||||
if (rcfailure) {
|
||||
trigger * trestore = trigger_changerace(u, u->race, u->irace);
|
||||
if (trestore) {
|
||||
int duration = 2 + rng_int() % 8;
|
||||
|
||||
add_trigger(&u->attribs, "timer", trigger_timeout(duration, trestore));
|
||||
u->irace = u->race = rcfailure;
|
||||
}
|
||||
}
|
||||
}
|
||||
use_pooled(u, itype->rtype, GET_SLACK|GET_RESERVE|GET_POOLED_SLACK, amount);
|
||||
usetpotionuse(u, itype->rtype->ptype);
|
||||
|
||||
|
|
|
@ -1316,28 +1316,31 @@ do_fumble(castorder *co)
|
|||
|
||||
case 1:
|
||||
/* Kröte */
|
||||
duration = rng_int()%level/2;
|
||||
if (duration<2) duration = 2;
|
||||
{
|
||||
if (u->irace == u->race) {
|
||||
/* one or two things will happen: the toad changes her race back,
|
||||
* and may or may not get toadslime.
|
||||
* 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 * trestore = trigger_changerace(u, u->race, u->irace);
|
||||
|
||||
if (chance(0.7)) {
|
||||
const item_type * it_toadslime = it_find("toadslime");
|
||||
if (it_toadslime!=NULL) {
|
||||
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));
|
||||
}
|
||||
u->race = new_race[RC_TOAD];
|
||||
u->irace = new_race[RC_TOAD];
|
||||
ADDMSG(&r->msgs, msg_message("patzer6", "unit region spell",
|
||||
u, r, sp));
|
||||
break;
|
||||
}
|
||||
/* fall-through is intentional! */
|
||||
|
||||
case 2:
|
||||
/* 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
|
||||
* Objektes 1 und bei Erfolg auf ganzer Linie 2 */
|
||||
static int
|
||||
verify_targets(castorder *co)
|
||||
static void
|
||||
verify_targets(castorder *co, int * invalid, int * resist, int * success)
|
||||
{
|
||||
unit *mage = co->magician.u;
|
||||
const spell *sp = co->sp;
|
||||
region *target_r = co->rt;
|
||||
spellparameter *sa = co->par;
|
||||
int failed = 0;
|
||||
int resists = 0;
|
||||
int success = 0;
|
||||
int i;
|
||||
|
||||
*invalid = 0;
|
||||
*resist = 0;
|
||||
*success = 0;
|
||||
|
||||
if (sa) {
|
||||
/* zuerst versuchen wir vorher nicht gefundene Objekte zu finden.
|
||||
* Wurde ein Objekt durch globalsuche gefunden, obwohl der Zauber
|
||||
|
@ -1604,13 +1608,13 @@ verify_targets(castorder *co)
|
|||
switch(spobj->typ) {
|
||||
case SPP_TEMP:
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
default:
|
||||
break;
|
||||
|
@ -1637,7 +1641,7 @@ verify_targets(castorder *co)
|
|||
/* Fehlermeldung */
|
||||
spobj->data.i = u->no;
|
||||
spobj->flag = TARGET_RESISTS;
|
||||
++resists;
|
||||
++*resist;
|
||||
ADDMSG(&mage->faction->msgs, msg_message("spellunitresists",
|
||||
"unit region command target",
|
||||
mage, mage->region, co->order, u));
|
||||
|
@ -1645,7 +1649,7 @@ verify_targets(castorder *co)
|
|||
}
|
||||
|
||||
/* TODO: Test auf Parteieigenschaft Magieresistsenz */
|
||||
++success;
|
||||
++*success;
|
||||
break;
|
||||
case SPP_BUILDING:
|
||||
b = spobj->data.b;
|
||||
|
@ -1655,13 +1659,13 @@ verify_targets(castorder *co)
|
|||
{ /* Fehlermeldung */
|
||||
spobj->data.i = b->no;
|
||||
spobj->flag = TARGET_RESISTS;
|
||||
resists++;
|
||||
++*resist;
|
||||
ADDMSG(&mage->faction->msgs, msg_message("spellbuildingresists",
|
||||
"unit region command id",
|
||||
mage, mage->region, co->order, spobj->data.i));
|
||||
break;
|
||||
}
|
||||
success++;
|
||||
++*success;
|
||||
break;
|
||||
case SPP_SHIP:
|
||||
sh = spobj->data.sh;
|
||||
|
@ -1671,12 +1675,12 @@ verify_targets(castorder *co)
|
|||
{ /* Fehlermeldung */
|
||||
spobj->data.i = sh->no;
|
||||
spobj->flag = TARGET_RESISTS;
|
||||
resists++;
|
||||
++*resist;
|
||||
ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order,
|
||||
"spellshipresists", "ship", sh));
|
||||
break;
|
||||
}
|
||||
success++;
|
||||
++*success;
|
||||
break;
|
||||
|
||||
case SPP_REGION:
|
||||
|
@ -1688,16 +1692,16 @@ verify_targets(castorder *co)
|
|||
&& target_resists_magic(mage, tr, TYP_REGION, 0))
|
||||
{ /* Fehlermeldung */
|
||||
spobj->flag = TARGET_RESISTS;
|
||||
resists++;
|
||||
++*resist;
|
||||
ADDMSG(&mage->faction->msgs, msg_message("spellregionresists",
|
||||
"unit region command", mage, mage->region, co->order));
|
||||
break;
|
||||
}
|
||||
success++;
|
||||
++*success;
|
||||
break;
|
||||
case SPP_INT:
|
||||
case SPP_STRING:
|
||||
success++;
|
||||
++*success;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1727,35 +1731,15 @@ verify_targets(castorder *co)
|
|||
ADDMSG(&mage->faction->msgs, msg_message("spellregionresists",
|
||||
"unit region command", mage, mage->region, co->order));
|
||||
spobj->flag = TARGET_RESISTS;
|
||||
resists++;
|
||||
++*resist;
|
||||
} else {
|
||||
success++;
|
||||
++*success;
|
||||
}
|
||||
} 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 (co = spellranks[rank].begin; co; co = co->next) {
|
||||
order * ord = co->order;
|
||||
int verify, cast_level = co->level;
|
||||
int invalid, resist, success, cast_level = co->level;
|
||||
boolean fumbled = false;
|
||||
unit * u = co->magician.u;
|
||||
const spell *sp = co->sp;
|
||||
|
@ -2753,37 +2737,29 @@ magic(void)
|
|||
* Spruch an der Magieresistenz, so ist verify_targets = 1, bei
|
||||
* Erfolg auf ganzer Linie ist verify_targets= 2
|
||||
*/
|
||||
verify = verify_targets(co);
|
||||
if (verify==0) {
|
||||
verify_targets(co, &invalid, &resist, &success);
|
||||
if (success+resist==0) {
|
||||
/* kein Ziel gefunden, Fehlermeldungen sind in verify_targets */
|
||||
/* keine kosten für den zauber */
|
||||
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 */
|
||||
spellparameter *pa = co->par;
|
||||
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) {
|
||||
if (success==0) {
|
||||
co->force = 0;
|
||||
/* zwar wurde mindestens ein Ziel gefunden, das widerstand
|
||||
* jedoch dem Zauber. Kosten abziehen und abbrechen. */
|
||||
ADDMSG(&u->faction->msgs, msg_message("spell_resist", "unit region spell",
|
||||
u, r, sp));
|
||||
co->force = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Auch für Patzer gibt es Erfahrung, müssen die Spruchkosten
|
||||
* 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 */
|
||||
fumbled = true;
|
||||
} else if (co->force>0) {
|
||||
} else {
|
||||
if (sp->sp_function==NULL) {
|
||||
log_error(("spell '%s' has no function.\n", sp->sname));
|
||||
co->level = 0;
|
||||
|
@ -2795,6 +2771,7 @@ magic(void)
|
|||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
pay_spell(u, sp, co->level, co->distance);
|
||||
/* erst bezahlen, dann Kostenzähler erhöhen */
|
||||
if (fumbled) do_fumble(co);
|
||||
|
|
|
@ -3954,6 +3954,7 @@ sp_rallypeasantmob(castorder *co)
|
|||
unit *mage = co->magician.u;
|
||||
int cast_level = co->level;
|
||||
message * msg;
|
||||
curse * c;
|
||||
|
||||
for (u = r->units; u; u = un) {
|
||||
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);
|
||||
r_addmessage(r, NULL, 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));
|
||||
return 0;
|
||||
}
|
||||
{
|
||||
if (u->irace == u->race) {
|
||||
trigger * trestore = trigger_changerace(u, NULL, u->irace);
|
||||
add_trigger(&u->attribs, "timer", trigger_timeout((int)power+2, trestore));
|
||||
}
|
||||
u->irace = rc;
|
||||
}
|
||||
|
||||
ADDMSG(&mage->faction->msgs, msg_message("shapeshift_effect", "mage target race", mage, u, rc));
|
||||
|
||||
|
|
|
@ -107,6 +107,8 @@ trigger_changerace(struct unit * u, const struct race * prace, const struct race
|
|||
{
|
||||
trigger * t = t_new(&tt_changerace);
|
||||
changerace_data * td = (changerace_data*)t->data.v;
|
||||
|
||||
assert(u->race==u->irace || "!changerace-triggers cannot stack!");
|
||||
td->u = u;
|
||||
td->race = prace;
|
||||
td->irace = irace;
|
||||
|
|
Loading…
Reference in New Issue