From a1de5d57011c7b169ae105cca87e9273a620288f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 9 Feb 2006 19:57:25 +0000 Subject: [PATCH] old eressea executable has problems with non-existing lua spells. --- src/common/kernel/battle.c | 151 ++++++++++++++++++++----------------- src/common/kernel/magic.c | 20 ++++- src/eressea/lua/unit.cpp | 7 +- 3 files changed, 103 insertions(+), 75 deletions(-) diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index 66d4d6452..63d33d745 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -1403,50 +1403,50 @@ report_failed_spell(battle * b, unit * mage, const spell * sp) void do_combatmagic(battle *b, combatmagic_t was) { - void **fi; - region *r = b->region; - castorder *co; - castorder *cll[MAX_SPELLRANK]; - int level; - int spellrank; - int sl; + void **fi; + region *r = b->region; + castorder *co; + castorder *cll[MAX_SPELLRANK]; + int level; + int spellrank; + int sl; - for (spellrank = 0; spellrank < MAX_SPELLRANK; spellrank++) { - cll[spellrank] = (castorder*)NULL; - } + for (spellrank = 0; spellrank < MAX_SPELLRANK; spellrank++) { + cll[spellrank] = (castorder*)NULL; + } - for (fi = b->fighters.begin; fi != b->fighters.end; ++fi) { - fighter * fig = *fi; - unit * mage = fig->unit; + for (fi = b->fighters.begin; fi != b->fighters.end; ++fi) { + fighter * fig = *fi; + unit * mage = fig->unit; - if (fig->alive <= 0) continue; /* fighter kann im Kampf getötet worden sein */ + if (fig->alive <= 0) continue; /* fighter kann im Kampf getötet worden sein */ - level = eff_skill(mage, SK_MAGIC, r); - if (level > 0) { + level = eff_skill(mage, SK_MAGIC, r); + if (level > 0) { double power; const spell *sp; - const struct locale * lang = mage->faction->locale; - char cmd[128]; + const struct locale * lang = mage->faction->locale; + char cmd[128]; order * ord; - switch(was) { - case DO_PRECOMBATSPELL: - sp = get_combatspell(mage, 0); - sl = get_combatspelllevel(mage, 0); - break; - case DO_POSTCOMBATSPELL: - sp = get_combatspell(mage, 2); - sl = get_combatspelllevel(mage, 2); - break; - default: - /* Fehler! */ - return; - } - if (sp == NULL) - continue; + switch(was) { + case DO_PRECOMBATSPELL: + sp = get_combatspell(mage, 0); + sl = get_combatspelllevel(mage, 0); + break; + case DO_POSTCOMBATSPELL: + sp = get_combatspell(mage, 2); + sl = get_combatspelllevel(mage, 2); + break; + default: + /* Fehler! */ + return; + } + if (sp == NULL) + continue; - snprintf(cmd, 128, "%s \"%s\"", - LOC(lang, keywords[K_CAST]), spell_name(sp, lang)); + snprintf(cmd, 128, "%s \"%s\"", + LOC(lang, keywords[K_CAST]), spell_name(sp, lang)); ord = parse_order(cmd, lang); if (cancast(mage, sp, 1, 1, ord) == false) { @@ -1454,44 +1454,47 @@ do_combatmagic(battle *b, combatmagic_t was) continue; } - level = eff_spelllevel(mage, sp, level, 1); - if (sl > 0) level = min(sl, level); - if (level < 0) { + level = eff_spelllevel(mage, sp, level, 1); + if (sl > 0) level = min(sl, level); + if (level < 0) { report_failed_spell(b, mage, sp); free_order(ord); continue; - } + } power = spellpower(r, mage, sp, level, ord); free_order(ord); - if (power <= 0) { /* Effekt von Antimagie */ + if (power <= 0) { /* Effekt von Antimagie */ report_failed_spell(b, mage, sp); pay_spell(mage, sp, level, 1); - } else if (fumble(r, mage, sp, sp->level) == true) { + } else if (fumble(r, mage, sp, sp->level) == true) { report_failed_spell(b, mage, sp); pay_spell(mage, sp, level, 1); } else { co = new_castorder(fig, 0, sp, r, level, power, 0, 0, 0); add_castorder(&cll[(int)(sp->rank)], co); } - } - } - for (spellrank = 0; spellrank < MAX_SPELLRANK; spellrank++) { - for (co = cll[spellrank]; co; co = co->next) { - fighter * fig = co->magician.fig; - const spell * sp = co->sp; - int level = co->level; - double power = co->force; - - level = ((cspell_f)sp->sp_function)(fig, level, power, sp); - if (level > 0) { - pay_spell(fig->unit, sp, level, 1); - } - } - } - for (spellrank = 0; spellrank < MAX_SPELLRANK; spellrank++) { - free_castorders(cll[spellrank]); - } + } + } + for (spellrank = 0; spellrank < MAX_SPELLRANK; spellrank++) { + for (co = cll[spellrank]; co; co = co->next) { + fighter * fig = co->magician.fig; + const spell * sp = co->sp; + int level = co->level; + double power = co->force; + if (sp->sp_function==NULL) { + log_error(("spell '%s' has no function.\n", sp->sname)); + } else { + level = ((cspell_f)sp->sp_function)(fig, level, power, sp); + if (level > 0) { + pay_spell(fig->unit, sp, level, 1); + } + } + } + } + for (spellrank = 0; spellrank < MAX_SPELLRANK; spellrank++) { + free_castorders(cll[spellrank]); + } } @@ -1561,10 +1564,14 @@ do_combatspell(troop at, int row) return; } - level = ((cspell_f)sp->sp_function)(fi, level, power, sp); - if (level > 0) { - pay_spell(mage, sp, level, 1); - at.fighter->action_counter++; + if (sp->sp_function==NULL) { + log_error(("spell '%s' has no function.\n", sp->sname)); + } else { + level = ((cspell_f)sp->sp_function)(fi, level, power, sp); + if (level > 0) { + pay_spell(mage, sp, level, 1); + at.fighter->action_counter++; + } } } @@ -1577,14 +1584,18 @@ do_combatspell(troop at, int row) static void do_extra_spell(troop at, const att *a) { - const spell *sp = a->data.sp; - fighter *fi = at.fighter; - unit *au = fi->unit; - int power; + const spell *sp = a->data.sp; + fighter *fi = at.fighter; + unit *au = fi->unit; + int power; - /* nur bei Monstern können mehrere 'Magier' in einer Einheit sein */ - power = sp->level * au->number; - ((cspell_f)sp->sp_function)(fi, sp->level, power, sp); + /* nur bei Monstern können mehrere 'Magier' in einer Einheit sein */ + power = sp->level * au->number; + if (sp->sp_function==NULL) { + log_error(("spell '%s' has no function.\n", sp->sname)); + } else { + ((cspell_f)sp->sp_function)(fi, sp->level, power, sp); + } } static int diff --git a/src/common/kernel/magic.c b/src/common/kernel/magic.c index a0cb54b7f..b8c12b23a 100644 --- a/src/common/kernel/magic.c +++ b/src/common/kernel/magic.c @@ -202,7 +202,6 @@ static int read_mage(attrib * a, FILE * F) { int i, mtype; - boolean update = false; sc_mage * mage = (sc_mage*)a->data.v; char spname[64]; @@ -1355,7 +1354,11 @@ do_fumble(castorder *co) case 5: case 6: /* Spruch gelingt, aber alle Magiepunkte weg */ - ((nspell_f)sp->sp_function)(co); + if (sp->sp_function==NULL) { + log_error(("spell '%s' has no function.\n", sp->sname)); + } else { + ((nspell_f)sp->sp_function)(co); + } set_spellpoints(u, 0); ADDMSG(&u->faction->msgs, msg_message("patzer4", "unit region spell", u, r, sp)); @@ -1366,7 +1369,11 @@ do_fumble(castorder *co) case 9: default: /* Spruch gelingt, alle nachfolgenden Sprüche werden 2^4 so teuer */ - ((nspell_f)sp->sp_function)(co); + if (sp->sp_function==NULL) { + log_error(("spell '%s' has no function.\n", sp->sname)); + } else { + ((nspell_f)sp->sp_function)(co); + } ADDMSG(&u->faction->msgs, msg_message("patzer5", "unit region spell", u, r, sp)); countspells(u, 3); @@ -2758,7 +2765,12 @@ magic(void) /* zuerst bezahlen, dann evt in do_fumble alle Aura verlieren */ fumbled = true; } else if (co->force>0) { - co->level = ((nspell_f)sp->sp_function)(co); + if (sp->sp_function==NULL) { + log_error(("spell '%s' has no function.\n", sp->sname)); + co->level = 0; + } else { + co->level = ((nspell_f)sp->sp_function)(co); + } if (co->level <= 0) { /* Kosten nur für real benötige Stufe berechnen */ continue; diff --git a/src/eressea/lua/unit.cpp b/src/eressea/lua/unit.cpp index 267f35318..be23b748f 100644 --- a/src/eressea/lua/unit.cpp +++ b/src/eressea/lua/unit.cpp @@ -197,7 +197,12 @@ unit_castspell(unit& u, const char * name) co->par = NULL; co->rt = u.region; co->sp = sp; - sp->sp_function(co); + if (sp->sp_function==NULL) { + log_error(("spell '%s' has no function.\n", sp->sname)); + co->level = 0; + } else { + sp->sp_function(co); + } free(co); } slist=slist->next;