From ef4052b0f6578db6f60170063e8a8b51aca2391f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 6 Jul 2015 19:53:09 +0200 Subject: [PATCH 01/12] the outcome of a casual static analysis session. --- src/creport.c | 485 +++++++++++++++++++++--------------------- src/give.c | 21 +- src/gmtool.c | 10 +- src/jsreport.c | 4 +- src/kernel/curse.c | 22 +- src/kernel/item.c | 4 +- src/kernel/messages.c | 4 +- src/kernel/save.c | 18 +- src/laws.c | 136 ++++++------ src/move.c | 84 ++++---- src/upkeep.test.c | 3 +- src/util/log.c | 8 +- 12 files changed, 400 insertions(+), 399 deletions(-) diff --git a/src/creport.c b/src/creport.c index 59fa60ecb..2396a7476 100644 --- a/src/creport.c +++ b/src/creport.c @@ -1,4 +1,4 @@ -/* +/* +-------------------+ Enno Rehling | Eressea PBEM host | Christian Schlittchen | (c) 1998 - 2008 | Katja Zedel @@ -184,9 +184,9 @@ cr_output_curses(FILE * F, const faction * viewer, const void *obj, objtype_t ty region *r; /* Die Sichtbarkeit eines Zaubers und die Zaubermeldung sind bei - * Gebäuden und Schiffen je nach, ob man Besitzer ist, verschieden. + * Gebäuden und Schiffen je nach, ob man Besitzer ist, verschieden. * Bei Einheiten sieht man Wirkungen auf eigene Einheiten immer. - * Spezialfälle (besonderes Talent, verursachender Magier usw. werde + * Spezialfälle (besonderes Talent, verursachender Magier usw. werde * bei jedem curse gesondert behandelt. */ if (typ == TYP_SHIP) { ship *sh = (ship *)obj; @@ -743,8 +743,11 @@ static void cr_output_unit(FILE * F, const region * r, const faction * f, static const curse_type *itemcloak_ct = 0; static bool init = false; item result[MAX_INVENTORY]; + const faction *sf; + const char *prefix; - if (fval(u_race(u), RCF_INVISIBLE)) + assert(u); + if (!u || fval(u_race(u), RCF_INVISIBLE)) return; if (!init) { @@ -763,245 +766,243 @@ static void cr_output_unit(FILE * F, const region * r, const faction * f, if (str) { fprintf(F, "\"%s\";Beschr\n", str); } - { - /* print faction information */ - const faction *sf = visible_faction(f, u); - const char *prefix = raceprefix(u); - if (u->faction == f || omniscient(f)) { - const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); - const faction *otherfaction = - a_otherfaction ? get_otherfaction(a_otherfaction) : NULL; - /* my own faction, full info */ - const attrib *a = NULL; - unit *mage; + /* print faction information */ + sf = visible_faction(f, u); + prefix = raceprefix(u); + if (u->faction == f || omniscient(f)) { + const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); + const faction *otherfaction = + a_otherfaction ? get_otherfaction(a_otherfaction) : NULL; + /* my own faction, full info */ + const attrib *a = NULL; + unit *mage; - if (fval(u, UFL_GROUP)) - a = a_find(u->attribs, &at_group); - if (a != NULL) { - const group *g = (const group *)a->data.v; - fprintf(F, "%d;gruppe\n", g->gid); - } - fprintf(F, "%d;Partei\n", u->faction->no); - if (sf != u->faction) - fprintf(F, "%d;Verkleidung\n", sf->no); - if (fval(u, UFL_ANON_FACTION)) - fprintf(F, "%d;Parteitarnung\n", i2b(fval(u, UFL_ANON_FACTION))); - if (otherfaction) { - if (otherfaction != u->faction) { - fprintf(F, "%d;Anderepartei\n", otherfaction->no); - } - } - mage = get_familiar_mage(u); - if (mage) { - fprintf(F, "%u;familiarmage\n", mage->no); - } - } - else { - if (fval(u, UFL_ANON_FACTION)) { - /* faction info is hidden */ - fprintf(F, "%d;Parteitarnung\n", i2b(fval(u, UFL_ANON_FACTION))); - } - else { - const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); - const faction *otherfaction = - a_otherfaction ? get_otherfaction(a_otherfaction) : NULL; - /* other unit. show visible faction, not u->faction */ - fprintf(F, "%d;Partei\n", sf->no); - if (sf == f) { - fprintf(F, "1;Verraeter\n"); - } - if (a_otherfaction) { - if (otherfaction != u->faction) { - if (alliedunit(u, f, HELP_FSTEALTH)) { - fprintf(F, "%d;Anderepartei\n", otherfaction->no); - } - } - } - } - } - if (prefix) { - prefix = mkname("prefix", prefix); - fprintf(F, "\"%s\";typprefix\n", translate(prefix, LOC(f->locale, - prefix))); - } - } - if (u->faction != f && a_fshidden - && a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) { - fprintf(F, "-1;Anzahl\n"); - } - else { - fprintf(F, "%d;Anzahl\n", u->number); - } + if (fval(u, UFL_GROUP)) + a = a_find(u->attribs, &at_group); + if (a != NULL) { + const group *g = (const group *)a->data.v; + fprintf(F, "%d;gruppe\n", g->gid); + } + fprintf(F, "%d;Partei\n", u->faction->no); + if (sf != u->faction) + fprintf(F, "%d;Verkleidung\n", sf->no); + if (fval(u, UFL_ANON_FACTION)) + fprintf(F, "%d;Parteitarnung\n", i2b(fval(u, UFL_ANON_FACTION))); + if (otherfaction) { + if (otherfaction != u->faction) { + fprintf(F, "%d;Anderepartei\n", otherfaction->no); + } + } + mage = get_familiar_mage(u); + if (mage) { + fprintf(F, "%u;familiarmage\n", mage->no); + } + } + else { + if (fval(u, UFL_ANON_FACTION)) { + /* faction info is hidden */ + fprintf(F, "%d;Parteitarnung\n", i2b(fval(u, UFL_ANON_FACTION))); + } + else { + const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); + const faction *otherfaction = + a_otherfaction ? get_otherfaction(a_otherfaction) : NULL; + /* other unit. show visible faction, not u->faction */ + fprintf(F, "%d;Partei\n", sf->no); + if (sf == f) { + fprintf(F, "1;Verraeter\n"); + } + if (a_otherfaction) { + if (otherfaction != u->faction) { + if (alliedunit(u, f, HELP_FSTEALTH)) { + fprintf(F, "%d;Anderepartei\n", otherfaction->no); + } + } + } + } + } + if (prefix) { + prefix = mkname("prefix", prefix); + fprintf(F, "\"%s\";typprefix\n", translate(prefix, LOC(f->locale, + prefix))); + } + if (u->faction != f && a_fshidden + && a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) { + fprintf(F, "-1;Anzahl\n"); + } + else { + fprintf(F, "%d;Anzahl\n", u->number); + } - pzTmp = get_racename(u->attribs); - if (pzTmp) { - fprintf(F, "\"%s\";Typ\n", pzTmp); - if (u->faction == f && fval(u_race(u), RCF_SHAPESHIFTANY)) { - const char *zRace = rc_name_s(u_race(u), NAME_PLURAL); - fprintf(F, "\"%s\";wahrerTyp\n", - translate(zRace, LOC(f->locale, zRace))); - } - } - else { - const race *irace = u_irace(u); - const char *zRace = rc_name_s(irace, NAME_PLURAL); - fprintf(F, "\"%s\";Typ\n", - translate(zRace, LOC(f->locale, zRace))); - if (u->faction == f && irace != u_race(u)) { - assert(skill_enabled(SK_STEALTH) - || !"we're resetting this on load, so.. ircase should never be used"); - zRace = rc_name_s(u_race(u), NAME_PLURAL); - fprintf(F, "\"%s\";wahrerTyp\n", - translate(zRace, LOC(f->locale, zRace))); - } - } + pzTmp = get_racename(u->attribs); + if (pzTmp) { + fprintf(F, "\"%s\";Typ\n", pzTmp); + if (u->faction == f && fval(u_race(u), RCF_SHAPESHIFTANY)) { + const char *zRace = rc_name_s(u_race(u), NAME_PLURAL); + fprintf(F, "\"%s\";wahrerTyp\n", + translate(zRace, LOC(f->locale, zRace))); + } + } + else { + const race *irace = u_irace(u); + const char *zRace = rc_name_s(irace, NAME_PLURAL); + fprintf(F, "\"%s\";Typ\n", + translate(zRace, LOC(f->locale, zRace))); + if (u->faction == f && irace != u_race(u)) { + assert(skill_enabled(SK_STEALTH) + || !"we're resetting this on load, so.. ircase should never be used"); + zRace = rc_name_s(u_race(u), NAME_PLURAL); + fprintf(F, "\"%s\";wahrerTyp\n", + translate(zRace, LOC(f->locale, zRace))); + } + } - if (u->building) { - assert(u->building->region); - fprintf(F, "%d;Burg\n", u->building->no); - } - if (u->ship) { - assert(u->ship->region); - fprintf(F, "%d;Schiff\n", u->ship->no); - } - if (is_guard(u, GUARD_ALL) != 0) { - fprintf(F, "%d;bewacht\n", 1); - } - if ((b = usiege(u)) != NULL) { - fprintf(F, "%d;belagert\n", b->no); - } - /* additional information for own units */ - if (u->faction == f || omniscient(f)) { - order *ord; - const char *xc; - const char *c; - int i; - sc_mage *mage; + if (u->building) { + assert(u->building->region); + fprintf(F, "%d;Burg\n", u->building->no); + } + if (u->ship) { + assert(u->ship->region); + fprintf(F, "%d;Schiff\n", u->ship->no); + } + if (is_guard(u, GUARD_ALL) != 0) { + fprintf(F, "%d;bewacht\n", 1); + } + if ((b = usiege(u)) != NULL) { + fprintf(F, "%d;belagert\n", b->no); + } + /* additional information for own units */ + if (u->faction == f || omniscient(f)) { + order *ord; + const char *xc; + const char *c; + int i; + sc_mage *mage; - i = ualias(u); - if (i > 0) - fprintf(F, "%d;temp\n", i); - else if (i < 0) - fprintf(F, "%d;alias\n", -i); - i = get_money(u); - fprintf(F, "%d;Kampfstatus\n", u->status); - fprintf(F, "%d;weight\n", weight(u)); - if (fval(u, UFL_NOAID)) { - fputs("1;unaided\n", F); - } - if (fval(u, UFL_STEALTH)) { - i = u_geteffstealth(u); - if (i >= 0) { - fprintf(F, "%d;Tarnung\n", i); - } - } - xc = uprivate(u); - if (xc) { - fprintf(F, "\"%s\";privat\n", xc); - } - c = hp_status(u); - if (c && *c && (u->faction == f || omniscient(f))) { - fprintf(F, "\"%s\";hp\n", translate(c, - LOC(u->faction->locale, c))); - } - if (fval(u, UFL_HERO)) { - fputs("1;hero\n", F); - } + i = ualias(u); + if (i > 0) + fprintf(F, "%d;temp\n", i); + else if (i < 0) + fprintf(F, "%d;alias\n", -i); + i = get_money(u); + fprintf(F, "%d;Kampfstatus\n", u->status); + fprintf(F, "%d;weight\n", weight(u)); + if (fval(u, UFL_NOAID)) { + fputs("1;unaided\n", F); + } + if (fval(u, UFL_STEALTH)) { + i = u_geteffstealth(u); + if (i >= 0) { + fprintf(F, "%d;Tarnung\n", i); + } + } + xc = uprivate(u); + if (xc) { + fprintf(F, "\"%s\";privat\n", xc); + } + c = hp_status(u); + if (c && *c && (u->faction == f || omniscient(f))) { + fprintf(F, "\"%s\";hp\n", translate(c, + LOC(u->faction->locale, c))); + } + if (fval(u, UFL_HERO)) { + fputs("1;hero\n", F); + } - if (fval(u, UFL_HUNGER) && (u->faction == f)) { - fputs("1;hunger\n", F); - } - if (is_mage(u)) { - fprintf(F, "%d;Aura\n", get_spellpoints(u)); - fprintf(F, "%d;Auramax\n", max_spellpoints(u->region, u)); - } - /* default commands */ - fprintf(F, "COMMANDS\n"); - for (ord = u->old_orders; ord; ord = ord->next) { - /* this new order will replace the old defaults */ - if (is_persistent(ord)) { - fwriteorder(F, ord, f->locale, true); - fputc('\n', F); - } - } - for (ord = u->orders; ord; ord = ord->next) { - if (u->old_orders && is_repeated(ord)) - continue; /* unit has defaults */ - if (is_persistent(ord)) { - fwriteorder(F, ord, f->locale, true); - fputc('\n', F); - } - } + if (fval(u, UFL_HUNGER) && (u->faction == f)) { + fputs("1;hunger\n", F); + } + if (is_mage(u)) { + fprintf(F, "%d;Aura\n", get_spellpoints(u)); + fprintf(F, "%d;Auramax\n", max_spellpoints(u->region, u)); + } + /* default commands */ + fprintf(F, "COMMANDS\n"); + for (ord = u->old_orders; ord; ord = ord->next) { + /* this new order will replace the old defaults */ + if (is_persistent(ord)) { + fwriteorder(F, ord, f->locale, true); + fputc('\n', F); + } + } + for (ord = u->orders; ord; ord = ord->next) { + if (u->old_orders && is_repeated(ord)) + continue; /* unit has defaults */ + if (is_persistent(ord)) { + fwriteorder(F, ord, f->locale, true); + fputc('\n', F); + } + } - /* talents */ - pr = 0; - for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) { - if (sv->level > 0) { - skill_t sk = sv->id; - int esk = eff_skill(u, sk, r); - if (!pr) { - pr = 1; - fprintf(F, "TALENTE\n"); - } - fprintf(F, "%d %d;%s\n", u->number * level_days(sv->level), esk, - translate(mkname("skill", skillnames[sk]), skillname(sk, - f->locale))); - } - } + /* talents */ + pr = 0; + for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) { + if (sv->level > 0) { + skill_t sk = sv->id; + int esk = eff_skill(u, sk, r); + if (!pr) { + pr = 1; + fprintf(F, "TALENTE\n"); + } + fprintf(F, "%d %d;%s\n", u->number * level_days(sv->level), esk, + translate(mkname("skill", skillnames[sk]), skillname(sk, + f->locale))); + } + } - /* spells that this unit can cast */ - mage = get_mage(u); - if (mage) { - int i, maxlevel = effskill(u, SK_MAGIC); - cr_output_spells(F, u, maxlevel); + /* spells that this unit can cast */ + mage = get_mage(u); + if (mage) { + int i, maxlevel = effskill(u, SK_MAGIC); + cr_output_spells(F, u, maxlevel); - for (i = 0; i != MAXCOMBATSPELLS; ++i) { - const spell *sp = mage->combatspells[i].sp; - if (sp) { - const char *name = - translate(mkname("spell", sp->sname), spell_name(sp, - f->locale)); - fprintf(F, "KAMPFZAUBER %d\n", i); - fprintf(F, "\"%s\";name\n", name); - fprintf(F, "%d;level\n", mage->combatspells[i].level); - } - } - } - } - /* items */ - pr = 0; - if (f == u->faction || omniscient(f)) { - show = u->items; - } - else if (!itemcloak && mode >= see_unit && !(a_fshidden - && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { - int n = report_items(u->items, result, MAX_INVENTORY, u, f); - assert(n >= 0); - if (n > 0) - show = result; - else - show = NULL; - } - else { - show = NULL; - } - lasttype = NULL; - for (itm = show; itm; itm = itm->next) { - const char *ic; - int in; - assert(itm->type != lasttype - || !"error: list contains two objects of the same item"); - report_item(u, itm, f, NULL, &ic, &in, true); - if (in == 0) - continue; - if (!pr) { - pr = 1; - fputs("GEGENSTAENDE\n", F); - } - fprintf(F, "%d;%s\n", in, translate(ic, LOC(f->locale, ic))); - } + for (i = 0; i != MAXCOMBATSPELLS; ++i) { + const spell *sp = mage->combatspells[i].sp; + if (sp) { + const char *name = + translate(mkname("spell", sp->sname), spell_name(sp, + f->locale)); + fprintf(F, "KAMPFZAUBER %d\n", i); + fprintf(F, "\"%s\";name\n", name); + fprintf(F, "%d;level\n", mage->combatspells[i].level); + } + } + } + } + /* items */ + pr = 0; + if (f == u->faction || omniscient(f)) { + show = u->items; + } + else if (!itemcloak && mode >= see_unit && !(a_fshidden + && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { + int n = report_items(u->items, result, MAX_INVENTORY, u, f); + assert(n >= 0); + if (n > 0) + show = result; + else + show = NULL; + } + else { + show = NULL; + } + lasttype = NULL; + for (itm = show; itm; itm = itm->next) { + const char *ic; + int in; + assert(itm->type != lasttype + || !"error: list contains two objects of the same item"); + report_item(u, itm, f, NULL, &ic, &in, true); + if (in == 0) + continue; + if (!pr) { + pr = 1; + fputs("GEGENSTAENDE\n", F); + } + fprintf(F, "%d;%s\n", in, translate(ic, LOC(f->locale, ic))); + } - cr_output_curses(F, f, u, TYP_UNIT); + cr_output_curses(F, f, u, TYP_UNIT); } /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ @@ -1033,18 +1034,6 @@ static void show_alliances_cr(FILE * F, const faction * f) } } -/* prints all visible spells in a region */ -static void show_active_spells(const region * r) -{ - char fogwall[MAXDIRECTIONS]; -#ifdef TODO /* alte Regionszauberanzeigen umstellen */ - unit *u; - int env = 0; -#endif - memset(fogwall, 0, sizeof(char) * MAXDIRECTIONS); - -} - /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ /* this is a copy of laws.c->find_address output changed. */ @@ -1308,6 +1297,7 @@ static void cr_output_region(FILE * F, report_context * ctx, seen_region * sr) if (r->display && r->display[0]) fprintf(F, "\"%s\";Beschr\n", r->display); if (fval(r->terrain, LAND_REGION)) { + assert(r->land); fprintf(F, "%d;Bauern\n", rpeasants(r)); if (fval(r, RF_ORCIFIED)) { fprintf(F, "1;Verorkt\n"); @@ -1338,7 +1328,7 @@ static void cr_output_region(FILE * F, report_context * ctx, seen_region * sr) fputs("1;mourning\n", F); } } - if (r->land->ownership) { + if (r->land && r->land->ownership) { fprintf(F, "%d;morale\n", r->land->morale); } } @@ -1408,7 +1398,6 @@ static void cr_output_region(FILE * F, report_context * ctx, seen_region * sr) } /* describe both passed and inhabited regions */ - show_active_spells(r); if (fval(r, RF_TRAVELUNIT)) { bool seeunits = false, seeships = false; const attrib *ru; diff --git a/src/give.c b/src/give.c index c4fb2ceb4..c5d4f5a27 100644 --- a/src/give.c +++ b/src/give.c @@ -1,4 +1,4 @@ -/* +/* +-------------------+ Christian Schlittchen | | Enno Rehling | Eressea PBEM host | Katja Zedel @@ -299,7 +299,7 @@ message * give_men(int n, unit * u, unit * u2, struct order *ord) error = 96; } else if (u->faction != u2->faction) { - if (maxt>=0 && u2->faction->newbies + n > maxt) { + if (maxt >= 0 && u2->faction->newbies + n > maxt) { error = 129; } else if (u_race(u) != u2->faction->race) { @@ -332,7 +332,7 @@ message * give_men(int n, unit * u, unit * u2, struct order *ord) if (has_skill(u2, SK_ALCHEMY) && !has_skill(u, SK_ALCHEMY)) k += n; - /* Wenn Parteigrenzen überschritten werden */ + /* Wenn Parteigrenzen überschritten werden */ if (u2->faction != u->faction) k += n; @@ -354,14 +354,14 @@ message * give_men(int n, unit * u, unit * u2, struct order *ord) freset(u2, UFL_HERO); } - /* Einheiten von Schiffen können nicht NACH in von - * Nicht-alliierten bewachten Regionen ausführen */ + /* Einheiten von Schiffen können nicht NACH in von + * Nicht-alliierten bewachten Regionen ausführen */ sh = leftship(u); if (sh) { set_leftship(u2, sh); } transfermen(u, u2, n); - if (maxt>=0 && u->faction != u2->faction) { + if (maxt >= 0 && u->faction != u2->faction) { u2->faction->newbies += n; } } @@ -403,6 +403,7 @@ void give_unit(unit * u, unit * u2, order * ord) region *r = u->region; int maxt = max_transfers(); + assert(u); if (!rule_transfermen() && u->faction != u2->faction) { cmistake(u, ord, 74, MSG_COMMERCE); return; @@ -518,7 +519,7 @@ void give_unit(unit * u, unit * u2, order * ord) } bool can_give_to(unit *u, unit *u2) { - /* Damit Tarner nicht durch die Fehlermeldung enttarnt werden können */ + /* Damit Tarner nicht durch die Fehlermeldung enttarnt werden können */ if (!u2) { return false; } @@ -613,7 +614,7 @@ void give_cmd(unit * u, order * ord) item *itm = *itmp; const item_type *itype = itm->type; if (fval(itype, ITF_HERB) && itm->number > 0) { - /* give_item ändert im fall,das man alles übergibt, die + /* give_item ändert im fall,das man alles übergibt, die * item-liste der unit, darum continue vor pointerumsetzten */ if (give_item(itm->number, itm->type, u, u2, ord) == 0) { given = true; @@ -669,8 +670,8 @@ void give_cmd(unit * u, order * ord) return; } - /* für alle items einmal prüfen, ob wir mehr als von diesem Typ - * reserviert ist besitzen und diesen Teil dann übergeben */ + /* für alle items einmal prüfen, ob wir mehr als von diesem Typ + * reserviert ist besitzen und diesen Teil dann übergeben */ if (u->items) { item **itmp = &u->items; while (*itmp) { diff --git a/src/gmtool.c b/src/gmtool.c index f009f6dbf..3c0ad1136 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -249,6 +249,8 @@ static void paint_map(window * wnd, const state * st) int cols = getmaxx(win); int vx, vy; + assert(st); + if (!st) return; lines = lines / THEIGHT; cols = cols / TWIDTH; for (vy = 0; vy != lines; ++vy) { @@ -260,11 +262,9 @@ static void paint_map(window * wnd, const state * st) int xp = vx * TWIDTH + (vy & 1) * TWIDTH / 2; int nx, ny; if (mr) { - if (st) { - cnormalize(&mr->coord, &nx, &ny); - if (tagged_region(st->selected, nx, ny)) { - attr |= A_REVERSE; - } + cnormalize(&mr->coord, &nx, &ny); + if (tagged_region(st->selected, nx, ny)) { + attr |= A_REVERSE; } if (mr->r && (mr->r->flags & RF_MAPPER_HIGHLIGHT)) hl = 1; diff --git a/src/jsreport.c b/src/jsreport.c index e9fb5ee3f..bfbb9e33b 100644 --- a/src/jsreport.c +++ b/src/jsreport.c @@ -1,4 +1,4 @@ -#include "reports.h" +#include "reports.h" #include "jsreport.h" #include #include @@ -74,7 +74,7 @@ static int report_json(const char *filename, report_context * ctx, const char *c } return 0; } - return ferror(F); + return errno; } return 0; } diff --git a/src/kernel/curse.c b/src/kernel/curse.c index 0cad2dfa6..a667bec18 100644 --- a/src/kernel/curse.c +++ b/src/kernel/curse.c @@ -307,19 +307,23 @@ const curse_type *ct_find(const char *c) { unsigned int hash = tolower(c[0]); quicklist *ctl = cursetypes[hash]; - int qi; - for (qi = 0; ctl; ql_advance(&ctl, &qi, 1)) { - curse_type *type = (curse_type *)ql_get(ctl, qi); + if (ctl) { + size_t c_len = strlen(c); + int qi; - if (strcmp(c, type->cname) == 0) { - return type; - } - else { - size_t k = _min(strlen(c), strlen(type->cname)); - if (!_memicmp(c, type->cname, k)) { + for (qi = 0; ctl; ql_advance(&ctl, &qi, 1)) { + curse_type *type = (curse_type *)ql_get(ctl, qi); + + if (strcmp(c, type->cname) == 0) { return type; } + else { + size_t k = _min(c_len, strlen(type->cname)); + if (!_memicmp(c, type->cname, k)) { + return type; + } + } } } return NULL; diff --git a/src/kernel/item.c b/src/kernel/item.c index 229fd3568..5ac160881 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2015, Enno Rehling Katja Zedel @@ -332,7 +332,7 @@ potion_type *new_potiontype(item_type * itype, int level) } void it_set_appearance(item_type *itype, const char *appearance) { - assert(itype && itype->rtype); + assert(itype && itype->rtype && appearance); itype->_appearance[0] = _strdup(appearance); itype->_appearance[1] = appearance ? strcat(strcpy((char *)malloc(strlen((char *)appearance) + 3), (char *)appearance), "_p") : 0; diff --git a/src/kernel/messages.c b/src/kernel/messages.c index 9fa861bc6..af0e4170b 100644 --- a/src/kernel/messages.c +++ b/src/kernel/messages.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2015, Enno Rehling Katja Zedel @@ -305,7 +305,7 @@ void free_messagelist(message_list * msgs) message *add_message(message_list ** pm, message * m) { - assert(m->type); + assert(m && m->type); if (!lomem && m != NULL) { struct mlist *mnew = malloc(sizeof(struct mlist)); if (*pm == NULL) { diff --git a/src/kernel/save.c b/src/kernel/save.c index 928feedf2..0e0225f83 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2015, Enno Rehling Katja Zedel @@ -200,7 +200,7 @@ static unit *unitorders(FILE * F, int enc, struct faction *f) } } } - /* Nun wird der Befehl erzeut und eingehängt */ + /* Nun wird der Befehl erzeut und eingehängt */ *ordp = parse_order(s, u->faction->locale); if (*ordp) { ordp = &(*ordp)->next; @@ -233,8 +233,8 @@ static faction *factionorders(void) f->no, pass)); return 0; } - /* Die Partei hat sich zumindest gemeldet, so daß sie noch - * nicht als untätig gilt */ + /* Die Partei hat sich zumindest gemeldet, so daß sie noch + * nicht als untätig gilt */ /* TODO: +1 ist ein Workaround, weil cturn erst in process_orders * incrementiert wird. */ @@ -308,9 +308,9 @@ int readorders(const char *filename) /* Falls in unitorders() abgebrochen wird, steht dort entweder eine neue * Partei, eine neue Einheit oder das File-Ende. Das switch() wird erneut * durchlaufen, und die entsprechende Funktion aufgerufen. Man darf buf - * auf alle Fälle nicht überschreiben! Bei allen anderen Einträgen hier - * muß buf erneut gefüllt werden, da die betreffende Information in nur - * einer Zeile steht, und nun die nächste gelesen werden muß. */ + * auf alle Fälle nicht überschreiben! Bei allen anderen Einträgen hier + * muß buf erneut gefüllt werden, da die betreffende Information in nur + * einer Zeile steht, und nun die nächste gelesen werden muß. */ case P_NEXT: f = NULL; @@ -331,7 +331,7 @@ int readorders(const char *filename) /* ------------------------------------------------------------- */ /* #define INNER_WORLD */ -/* fürs debuggen nur den inneren Teil der Welt laden */ +/* fürs debuggen nur den inneren Teil der Welt laden */ /* -9;-27;-1;-19;Sumpfloch */ int inner_world(region * r) { @@ -988,6 +988,8 @@ void writeregion(struct gamedata *data, const region * r) const item_type *rht; struct demand *demand; rawmaterial *res = r->resources; + + assert(r->land); WRITE_STR(data->store, (const char *)r->land->name); assert(rtrees(r, 0) >= 0); assert(rtrees(r, 1) >= 0); diff --git a/src/laws.c b/src/laws.c index 2854b2cc8..06b2a0a1e 100755 --- a/src/laws.c +++ b/src/laws.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2014, Enno Rehling Katja Zedel next ist dann - * undefiniert, also muessen wir hier schon das nächste + * undefiniert, also muessen wir hier schon das nächste * Element bestimmen */ int effect = get_effect(u, oldpotiontype[P_FOOL]); @@ -193,7 +193,7 @@ static void live(region * r) reduce_skill(u, sb, weeks); ADDMSG(&u->faction->msgs, msg_message("dumbeffect", "unit weeks skill", u, weeks, (skill_t)sb->id)); - } /* sonst Glück gehabt: wer nix weiß, kann nix vergessen... */ + } /* sonst Glück gehabt: wer nix weiß, kann nix vergessen... */ change_effect(u, oldpotiontype[P_FOOL], -effect); } age_unit(r, u); @@ -335,16 +335,16 @@ static void peasants(region * r) peasants += births + luck; } - /* Alle werden satt, oder halt soviele für die es auch Geld gibt */ + /* Alle werden satt, oder halt soviele für die es auch Geld gibt */ satiated = _min(peasants, money / maintenance_cost(NULL)); rsetmoney(r, money - satiated * maintenance_cost(NULL)); /* Von denjenigen, die nicht satt geworden sind, verhungert der - * Großteil. dead kann nie größer als rpeasants(r) - satiated werden, - * so dass rpeasants(r) >= 0 bleiben muß. */ + * Großteil. dead kann nie größer als rpeasants(r) - satiated werden, + * so dass rpeasants(r) >= 0 bleiben muß. */ - /* Es verhungert maximal die unterernährten Bevölkerung. */ + /* Es verhungert maximal die unterernährten Bevölkerung. */ n = _min(peasants - satiated, rpeasants(r)); dead += (int)(0.5 + n * PEASANT_STARVATION_CHANCE); @@ -409,10 +409,10 @@ static void migrate(region * r) rsethorses(r, rhorses(r) + m->horses); /* Was macht das denn hier? * Baumwanderung wird in trees() gemacht. - * wer fragt das? Die Baumwanderung war abhängig von der + * wer fragt das? Die Baumwanderung war abhängig von der * Auswertungsreihenfolge der regionen, - * das hatte ich geändert. jemand hat es wieder gelöscht, toll. - * ich habe es wieder aktiviert, muß getestet werden. + * das hatte ich geändert. jemand hat es wieder gelöscht, toll. + * ich habe es wieder aktiviert, muß getestet werden. */ *hp = m->next; m->next = free_migrants; @@ -452,8 +452,8 @@ static void horses(region * r) /* Pferde wandern in Nachbarregionen. * Falls die Nachbarregion noch berechnet - * werden muß, wird eine migration-Struktur gebildet, - * die dann erst in die Berechnung der Nachbarstruktur einfließt. + * werden muß, wird eine migration-Struktur gebildet, + * die dann erst in die Berechnung der Nachbarstruktur einfließt. */ for (n = 0; n != MAXDIRECTIONS; n++) { @@ -467,7 +467,7 @@ static void horses(region * r) else { migration *nb; /* haben wir die Migration schonmal benutzt? - * wenn nicht, müssen wir sie suchen. + * wenn nicht, müssen wir sie suchen. * Wandernde Pferde vermehren sich nicht. */ nb = get_migrants(r2); @@ -563,11 +563,11 @@ growing_trees(region * r, const int current_season, const int last_weeks_season) a = a_find(r->attribs, &at_germs); if (a && last_weeks_season == SEASON_SPRING) { - /* ungekeimte Samen bleiben erhalten, Sprößlinge wachsen */ + /* ungekeimte Samen bleiben erhalten, Sprößlinge wachsen */ sprout = _min(a->data.sa[1], rtrees(r, 1)); - /* aus dem gesamt Sprößlingepool abziehen */ + /* aus dem gesamt Sprößlingepool abziehen */ rsettrees(r, 1, rtrees(r, 1) - sprout); - /* zu den Bäumen hinzufügen */ + /* zu den Bäumen hinzufügen */ rsettrees(r, 2, rtrees(r, 2) + sprout); a_removeall(&r->attribs, &at_germs); @@ -583,7 +583,7 @@ growing_trees(region * r, const int current_season, const int last_weeks_season) return; /* Grundchance 1.0% */ - /* Jeder Elf in der Region erhöht die Chance marginal */ + /* Jeder Elf in der Region erhöht die Chance marginal */ elves = _min(elves, production(r) / 8); if (elves) { seedchance += 1.0 - pow(0.99999, elves * RESOURCE_QUANTITY); @@ -604,19 +604,19 @@ growing_trees(region * r, const int current_season, const int last_weeks_season) } } - /* Bäume breiten sich in Nachbarregionen aus. */ + /* Bäume breiten sich in Nachbarregionen aus. */ /* Gesamtzahl der Samen: - * bis zu 6% (FORESTGROWTH*3) der Bäume samen in die Nachbarregionen */ + * bis zu 6% (FORESTGROWTH*3) der Bäume samen in die Nachbarregionen */ seeds = (rtrees(r, 2) * FORESTGROWTH * 3) / 1000000; for (d = 0; d != MAXDIRECTIONS; ++d) { region *r2 = rconnect(r, d); if (r2 && fval(r2->terrain, LAND_REGION) && r2->terrain->size) { /* Eine Landregion, wir versuchen Samen zu verteilen: - * Die Chance, das Samen ein Stück Boden finden, in dem sie - * keimen können, hängt von der Bewuchsdichte und der - * verfügbaren Fläche ab. In Gletschern gibt es weniger - * Möglichkeiten als in Ebenen. */ + * Die Chance, das Samen ein Stück Boden finden, in dem sie + * keimen können, hängt von der Bewuchsdichte und der + * verfügbaren Fläche ab. In Gletschern gibt es weniger + * Möglichkeiten als in Ebenen. */ sprout = 0; seedchance = (1000 * maxworkingpeasants(r2)) / r2->terrain->size; for (i = 0; i < seeds / MAXDIRECTIONS; i++) { @@ -633,8 +633,8 @@ growing_trees(region * r, const int current_season, const int last_weeks_season) if (is_cursed(r->attribs, C_CURSED_BY_THE_GODS, 0)) return; - /* in at_germs merken uns die Zahl der Samen und Sprößlinge, die - * dieses Jahr älter werden dürfen, damit nicht ein Same im selben + /* in at_germs merken uns die Zahl der Samen und Sprößlinge, die + * dieses Jahr älter werden dürfen, damit nicht ein Same im selben * Zyklus zum Baum werden kann */ a = a_find(r->attribs, &at_germs); if (!a) { @@ -642,13 +642,13 @@ growing_trees(region * r, const int current_season, const int last_weeks_season) a->data.sa[0] = (short)rtrees(r, 0); a->data.sa[1] = (short)rtrees(r, 1); } - /* wir haben 6 Wochen zum wachsen, jeder Same/Sproß hat 18% Chance + /* wir haben 6 Wochen zum wachsen, jeder Same/Sproß hat 18% Chance * zu wachsen, damit sollten nach 5-6 Wochen alle gewachsen sein */ growth = 1800; /* Samenwachstum */ - /* Raubbau abfangen, es dürfen nie mehr Samen wachsen, als aktuell + /* Raubbau abfangen, es dürfen nie mehr Samen wachsen, als aktuell * in der Region sind */ seeds = _min(a->data.sa[0], rtrees(r, 0)); sprout = 0; @@ -661,15 +661,15 @@ growing_trees(region * r, const int current_season, const int last_weeks_season) a->data.sa[0] = (short)(seeds - sprout); /* aus dem gesamt Samenpool abziehen */ rsettrees(r, 0, rtrees(r, 0) - sprout); - /* zu den Sprößlinge hinzufügen */ + /* zu den Sprößlinge hinzufügen */ rsettrees(r, 1, rtrees(r, 1) + sprout); /* Baumwachstum */ - /* hier gehen wir davon aus, das Jungbäume nicht ohne weiteres aus - * der Region entfernt werden können, da Jungbäume in der gleichen - * Runde nachwachsen, wir also nicht mehr zwischen diesjährigen und - * 'alten' Jungbäumen unterscheiden könnten */ + /* hier gehen wir davon aus, das Jungbäume nicht ohne weiteres aus + * der Region entfernt werden können, da Jungbäume in der gleichen + * Runde nachwachsen, wir also nicht mehr zwischen diesjährigen und + * 'alten' Jungbäumen unterscheiden könnten */ sprout = _min(a->data.sa[1], rtrees(r, 1)); grownup_trees = 0; @@ -677,11 +677,11 @@ growing_trees(region * r, const int current_season, const int last_weeks_season) if (rng_int() % 10000 < growth) grownup_trees++; } - /* aus dem Sprößlingepool dieses Jahres abziehen */ + /* aus dem Sprößlingepool dieses Jahres abziehen */ a->data.sa[1] = (short)(sprout - grownup_trees); - /* aus dem gesamt Sprößlingepool abziehen */ + /* aus dem gesamt Sprößlingepool abziehen */ rsettrees(r, 1, rtrees(r, 1) - grownup_trees); - /* zu den Bäumen hinzufügen */ + /* zu den Bäumen hinzufügen */ rsettrees(r, 2, rtrees(r, 2) + grownup_trees); } } @@ -689,10 +689,10 @@ growing_trees(region * r, const int current_season, const int last_weeks_season) static void growing_herbs(region * r, const int current_season, const int last_weeks_season) { - /* Jetzt die Kräutervermehrung. Vermehrt wird logistisch: + /* Jetzt die Kräutervermehrung. Vermehrt wird logistisch: * * Jedes Kraut hat eine Wahrscheinlichkeit von (100-(vorhandene - * Kräuter))% sich zu vermehren. */ + * Kräuter))% sich zu vermehren. */ if (current_season != SEASON_WINTER) { int i; for (i = rherbs(r); i > 0; i--) { @@ -1070,7 +1070,7 @@ int enter_building(unit * u, order * ord, int id, bool report) region *r = u->region; building *b; - /* Schwimmer können keine Gebäude betreten, außer diese sind + /* Schwimmer können keine Gebäude betreten, außer diese sind * auf dem Ozean */ if (!fval(u_race(u), RCF_WALK) && !fval(u_race(u), RCF_FLY)) { if (!fval(r->terrain, SEA_REGION)) { @@ -1186,8 +1186,8 @@ void do_enter(struct region *r, bool is_final_attempt) } if (ulast != NULL) { /* Wenn wir hier angekommen sind, war der Befehl - * erfolgreich und wir löschen ihn, damit er im - * zweiten Versuch nicht nochmal ausgeführt wird. */ + * erfolgreich und wir löschen ihn, damit er im + * zweiten Versuch nicht nochmal ausgeführt wird. */ *ordp = ord->next; ord->next = NULL; free_order(ord); @@ -1499,9 +1499,10 @@ int prefix_cmd(unit * u, struct order *ord) ap = &u->faction->attribs; if (fval(u, UFL_GROUP)) { attrib *a = a_find(u->attribs, &at_group); - group *g = (group *)a->data.v; - if (a) + if (a) { + group *g = (group *)a->data.v; ap = &g->attribs; + } } set_prefix(ap, race_prefixes[var.i]); } @@ -1961,13 +1962,13 @@ int mail_cmd(unit * u, struct order *ord) s = gettoken(token, sizeof(token)); /* Falls kein Parameter, ist das eine Einheitsnummer; - * das Füllwort "AN" muß wegfallen, da gültige Nummer! */ + * das Füllwort "AN" muß wegfallen, da gültige Nummer! */ do { cont = 0; switch (findparam_ex(s, u->faction->locale)) { case P_REGION: - /* können alle Einheiten in der Region sehen */ + /* können alle Einheiten in der Region sehen */ s = getstrtoken(); if (!s || !s[0]) { cmistake(u, ord, 30, MSG_MESSAGE); @@ -2320,7 +2321,7 @@ static bool display_race(faction * f, unit * u, const race * rc) if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); - /* b_armor : Rüstung */ + /* b_armor : Rüstung */ if (rc->armor > 0) { bytes = slprintf(bufp, size, ", %s: %d", LOC(f->locale, "stat_armor"), rc->armor); @@ -2631,7 +2632,7 @@ int combatspell_cmd(unit * u, struct order *ord) init_order(ord); s = gettoken(token, sizeof(token)); - /* KAMPFZAUBER [NICHT] löscht alle gesetzten Kampfzauber */ + /* KAMPFZAUBER [NICHT] löscht alle gesetzten Kampfzauber */ if (!s || *s == 0 || findparam(s, u->faction->locale) == P_NOT) { unset_combatspell(u, 0); return 0; @@ -2639,7 +2640,7 @@ int combatspell_cmd(unit * u, struct order *ord) /* Optional: STUFE n */ if (findparam(s, u->faction->locale) == P_LEVEL) { - /* Merken, setzen kommt erst später */ + /* Merken, setzen kommt erst später */ level = getint(); level = _max(0, level); s = gettoken(token, sizeof(token)); @@ -2654,7 +2655,7 @@ int combatspell_cmd(unit * u, struct order *ord) s = gettoken(token, sizeof(token)); if (findparam(s, u->faction->locale) == P_NOT) { - /* KAMPFZAUBER "" NICHT löscht diesen speziellen + /* KAMPFZAUBER "" NICHT löscht diesen speziellen * Kampfzauber */ unset_combatspell(u, sp); return 0; @@ -2669,7 +2670,7 @@ int combatspell_cmd(unit * u, struct order *ord) /* ------------------------------------------------------------- */ /* Beachten: einige Monster sollen auch unbewaffent die Region bewachen - * können */ + * können */ enum { E_GUARD_OK, E_GUARD_UNARMED, E_GUARD_NEWBIE, E_GUARD_FLEEING }; @@ -2712,6 +2713,7 @@ void update_guards(void) int guard_on_cmd(unit * u, struct order *ord) { assert(getkeyword(ord) == K_GUARD); + assert(u && u->faction); init_order(ord); @@ -2731,7 +2733,7 @@ int guard_on_cmd(unit * u, struct order *ord) cmistake(u, ord, 95, MSG_EVENT); } else { - /* Monster der Monsterpartei dürfen immer bewachen */ + /* Monster der Monsterpartei dürfen immer bewachen */ if (is_monsters(u->faction)) { guard(u, GUARD_ALL); } @@ -2765,7 +2767,7 @@ void sinkships(struct region * r) if (!sh->type->construction || sh->size >= sh->type->construction->maxsize) { if (fval(r->terrain, SEA_REGION) && (!enoughsailors(sh, r) || get_captain(sh) == NULL)) { - /* Schiff nicht seetüchtig */ + /* Schiff nicht seetüchtig */ float dmg = get_param_flt(global.parameters, "rules.ship.damage.nocrewocean", 0.30F); @@ -3222,7 +3224,7 @@ static void ageing(void) sp = &(*sp)->next; } - /* Gebäude */ + /* Gebäude */ for (bp = &r->buildings; *bp;) { building *b = *bp; age_building(b); @@ -3428,7 +3430,7 @@ void update_long_order(unit * u) freset(u, UFL_MOVED); freset(u, UFL_LONGACTION); if (hunger) { - /* Hungernde Einheiten führen NUR den default-Befehl aus */ + /* Hungernde Einheiten führen NUR den default-Befehl aus */ set_order(&u->thisorder, default_order(u->faction->locale)); } else { @@ -3449,7 +3451,7 @@ void update_long_order(unit * u) continue; if (is_exclusive(ord)) { - /* Über dieser Zeile nur Befehle, die auch eine idle Faction machen darf */ + /* Ãœber dieser Zeile nur Befehle, die auch eine idle Faction machen darf */ if (idle(u->faction)) { set_order(&u->thisorder, default_order(u->faction->locale)); } @@ -3461,13 +3463,13 @@ void update_long_order(unit * u) else { keyword_t keyword = getkeyword(ord); switch (keyword) { - /* Wenn gehandelt wird, darf kein langer Befehl ausgeführt + /* Wenn gehandelt wird, darf kein langer Befehl ausgeführt * werden. Da Handel erst nach anderen langen Befehlen kommt, - * muß das vorher abgefangen werden. Wir merken uns also + * muß das vorher abgefangen werden. Wir merken uns also * hier, ob die Einheit handelt. */ case K_BUY: case K_SELL: - /* Wenn die Einheit handelt, muß der Default-Befehl gelöscht + /* Wenn die Einheit handelt, muß der Default-Befehl gelöscht * werden. * Wird je diese Ausschliesslichkeit aufgehoben, muss man aufpassen * mit der Reihenfolge von Kaufen, Verkaufen etc., damit es Spielern @@ -3477,7 +3479,7 @@ void update_long_order(unit * u) case K_CAST: /* dient dazu, das neben Zaubern kein weiterer Befehl - * ausgeführt werden kann, Zaubern ist ein kurzer Befehl */ + * ausgeführt werden kann, Zaubern ist ein kurzer Befehl */ set_order(&u->thisorder, copy_order(ord)); break; @@ -3490,7 +3492,7 @@ void update_long_order(unit * u) if (hunger) { return; } - /* Wenn die Einheit handelt, muß der Default-Befehl gelöscht + /* Wenn die Einheit handelt, muß der Default-Befehl gelöscht * werden. */ if (trade) { @@ -3566,7 +3568,7 @@ void monthly_healing(void) double healingcurse = 0; if (heal_ct != NULL) { - /* bonus zurücksetzen */ + /* bonus zurücksetzen */ curse *c = get_curse(r->attribs, heal_ct); if (c != NULL) { healingcurse = curse_geteffect(c); @@ -3576,8 +3578,8 @@ void monthly_healing(void) int umhp = unit_max_hp(u) * u->number; double p = 1.0; - /* hp über Maximum bauen sich ab. Wird zb durch Elixier der Macht - * oder verändertes Ausdauertalent verursacht */ + /* hp über Maximum bauen sich ab. Wird zb durch Elixier der Macht + * oder verändertes Ausdauertalent verursacht */ if (u->hp > umhp) { u->hp -= (int)ceil((u->hp - umhp) / 2.0); if (u->hp < umhp) @@ -3604,7 +3606,7 @@ void monthly_healing(void) if (btype == bt_find("inn")) { p *= 1.5; } - /* pro punkt 5% höher */ + /* pro punkt 5% höher */ p *= (1.0 + healingcurse * 0.05); maxheal = p * maxheal; @@ -3616,7 +3618,7 @@ void monthly_healing(void) /* Aufaddieren der geheilten HP. */ u->hp = _min(u->hp + addhp, umhp); - /* soll man an negativer regeneration sterben können? */ + /* soll man an negativer regeneration sterben können? */ assert(u->hp > 0); } } @@ -3663,7 +3665,7 @@ void defaultorders(void) ord->next = NULL; free_order(ord); if (!neworders) { - /* lange Befehle aus orders und old_orders löschen zu gunsten des neuen */ + /* lange Befehle aus orders und old_orders löschen zu gunsten des neuen */ remove_exclusive(&u->orders); remove_exclusive(&u->old_orders); neworders = true; @@ -4535,8 +4537,8 @@ void processorders(void) wormholes_update(); } - /* immer ausführen, wenn neue Sprüche dazugekommen sind, oder sich - * Beschreibungen geändert haben */ + /* immer ausführen, wenn neue Sprüche dazugekommen sind, oder sich + * Beschreibungen geändert haben */ update_spells(); warn_password(); } diff --git a/src/move.c b/src/move.c index 6f55ed688..b14dfb68d 100644 --- a/src/move.c +++ b/src/move.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2014, Enno Rehling Katja Zedel items, &animals, &acap, &vehicles, &vcap); - /* Man trägt sein eigenes Gewicht plus seine Kapazität! Die Menschen - ** tragen nichts (siehe walkingcapacity). Ein Wagen zählt nur, wenn er + /* Man trägt sein eigenes Gewicht plus seine Kapazität! Die Menschen + ** tragen nichts (siehe walkingcapacity). Ein Wagen zählt nur, wenn er ** von zwei Pferden gezogen wird */ animals = _min(animals, effskill(u, SK_RIDING) * u->number * 2); if (fval(u_race(u), RCF_HORSE)) animals += u->number; - /* maximal diese Pferde können zum Ziehen benutzt werden */ + /* maximal diese Pferde können zum Ziehen benutzt werden */ vehicles = _min(animals / HORSESNEEDED, vehicles); return vehicles * vcap + animals * acap; @@ -282,7 +282,7 @@ int walkingcapacity(const struct unit *u) people = u->number; } - /* maximal diese Pferde können zum Ziehen benutzt werden */ + /* maximal diese Pferde können zum Ziehen benutzt werden */ wagen_mit_pferden = _min(vehicles, pferde_fuer_wagen / HORSESNEEDED); n = wagen_mit_pferden * vcap; @@ -295,7 +295,7 @@ int walkingcapacity(const struct unit *u) /* Genug Trolle, um die Restwagen zu ziehen? */ wagen_mit_trollen = _min(u->number / 4, wagen_ohne_pferde); - /* Wagenkapazität hinzuzählen */ + /* Wagenkapazität hinzuzählen */ n += wagen_mit_trollen * vcap; wagen_ohne_pferde -= wagen_mit_trollen; } @@ -357,16 +357,16 @@ static int canwalk(unit * u) if (walkingcapacity(u) - eff_weight(u) >= 0) return E_CANWALK_OK; - /* Stimmt das Gewicht, impliziert dies hier, daß alle Wagen ohne + /* Stimmt das Gewicht, impliziert dies hier, daß alle Wagen ohne * Zugpferde/-trolle als Fracht aufgeladen wurden: zu viele Pferde hat * die Einheit nicht zum Ziehen benutzt, also nicht mehr Wagen gezogen * als erlaubt. */ if (vehicles > maxwagen) return E_CANWALK_TOOMANYCARTS; - /* Es muß nicht zwingend an den Wagen liegen, aber egal... (man - * könnte z.B. auch 8 Eisen abladen, damit ein weiterer Wagen als - * Fracht draufpaßt) */ + /* Es muß nicht zwingend an den Wagen liegen, aber egal... (man + * könnte z.B. auch 8 Eisen abladen, damit ein weiterer Wagen als + * Fracht draufpaßt) */ return E_CANWALK_TOOHEAVY; } @@ -663,7 +663,7 @@ int check_ship_allowed(struct ship *sh, const region * r) bt_harbour = bt_find("harbour"); if (sh->region && r_insectstalled(r)) { - /* insekten dürfen nicht hier rein. haben wir welche? */ + /* insekten dürfen nicht hier rein. haben wir welche? */ unit *u; for (u = sh->region->units; u != NULL; u = u->next) { @@ -757,13 +757,13 @@ static void drifting_ships(region * r) sh->flags |= SF_FISHING; } - /* Schiff schon abgetrieben oder durch Zauber geschützt? */ + /* Schiff schon abgetrieben oder durch Zauber geschützt? */ if (!drift || fval(sh, SF_DRIFTED) || is_cursed(sh->attribs, C_SHIP_NODRIFT, 0)) { shp = &sh->next; continue; } - /* Kapitän bestimmen */ + /* Kapitän bestimmen */ for (captain = r->units; captain; captain = captain->next) { if (captain->ship != sh) continue; @@ -773,8 +773,8 @@ static void drifting_ships(region * r) break; } } - /* Kapitän da? Beschädigt? Genügend Matrosen? - * Genügend leicht? Dann ist alles OK. */ + /* Kapitän da? Beschädigt? Genügend Matrosen? + * Genügend leicht? Dann ist alles OK. */ assert(sh->type->construction->improvement == NULL); /* sonst ist construction::size nicht ship_type::maxsize */ if (captain && sh->size == sh->type->construction->maxsize @@ -784,7 +784,7 @@ static void drifting_ships(region * r) } /* Auswahl einer Richtung: Zuerst auf Land, dann - * zufällig. Falls unmögliches Resultat: vergiß es. */ + * zufällig. Falls unmögliches Resultat: vergiß es. */ d_offset = rng_int() % MAXDIRECTIONS; for (d = 0; d != MAXDIRECTIONS; ++d) { region *rn; @@ -1335,7 +1335,9 @@ static bool roadto(const region * r, direction_t dir) region *r2; static const curse_type *roads_ct = NULL; - if (dir >= MAXDIRECTIONS || dir < 0) + assert(r); + assert(dir= MAXDIRECTIONS || dir < 0) return false; r2 = rconnect(r, dir); if (r == NULL || r2 == NULL) @@ -1476,12 +1478,12 @@ static void make_route(unit * u, order * ord, region_list ** routep) /** calculate the speed of a unit * - * zu Fuß reist man 1 Region, zu Pferd 2 Regionen. Mit Straßen reist - * man zu Fuß 2, mit Pferden 3 weit. + * zu Fuß reist man 1 Region, zu Pferd 2 Regionen. Mit Straßen reist + * man zu Fuß 2, mit Pferden 3 weit. * - * Berechnet wird das mit BPs. Zu Fuß hat man 4 BPs, zu Pferd 6. - * Normalerweise verliert man 3 BP pro Region, bei Straßen nur 2 BP. - * Außerdem: Wenn Einheit transportiert, nur halbe BP + * Berechnet wird das mit BPs. Zu Fuß hat man 4 BPs, zu Pferd 6. + * Normalerweise verliert man 3 BP pro Region, bei Straßen nur 2 BP. + * Außerdem: Wenn Einheit transportiert, nur halbe BP */ static int movement_speed(unit * u) { @@ -1621,7 +1623,7 @@ static const region_list *travel_route(unit * u, landing = true; } else if ((u_race(u)->flags & RCF_WALK) == 0) { - /* Spezialeinheiten, die nicht laufen können. */ + /* Spezialeinheiten, die nicht laufen können. */ ADDMSG(&u->faction->msgs, msg_message("detectocean", "unit region", u, next)); break; @@ -1634,7 +1636,7 @@ static const region_list *travel_route(unit * u, } } else { - /* Ozeanfelder können nur von Einheiten mit Schwimmen und ohne + /* Ozeanfelder können nur von Einheiten mit Schwimmen und ohne * Pferde betreten werden. */ if (!(canswim(u) || canfly(u))) { ADDMSG(&u->faction->msgs, msg_message("detectocean", @@ -1729,7 +1731,7 @@ static const region_list *travel_route(unit * u, walkmode = 2; } - /* Berichte über Durchreiseregionen */ + /* Berichte über Durchreiseregionen */ if (mode != TRAVEL_TRANSPORTED) { arg_regions *ar = var_copy_regions(route_begin, steps - 1); @@ -1808,7 +1810,7 @@ buildingtype_exists(const region * r, const building_type * bt, bool working) return false; } -/* Prüft, ob Ablegen von einer Küste in eine der erlaubten Richtungen erfolgt. */ +/* Prüft, ob Ablegen von einer Küste in eine der erlaubten Richtungen erfolgt. */ static bool check_takeoff(ship * sh, region * from, region * to) { @@ -1858,18 +1860,18 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep) return; /* Wir suchen so lange nach neuen Richtungen, wie es geht. Diese werden - * dann nacheinander ausgeführt. */ + * dann nacheinander ausgeführt. */ k = shipspeed(sh, u); last_point = starting_point; current_point = starting_point; - /* die nächste Region, in die man segelt, wird durch movewhere () aus der + /* die nächste Region, in die man segelt, wird durch movewhere () aus der * letzten Region bestimmt. * * Anfangen tun wir bei starting_point. next_point ist beim ersten - * Durchlauf schon gesetzt (Parameter!). current_point ist die letzte gültige, + * Durchlauf schon gesetzt (Parameter!). current_point ist die letzte gültige, * befahrene Region. */ while (next_point && current_point != next_point && step < k) { @@ -1916,7 +1918,7 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep) bool storm = true; int d_offset = rng_int() % MAXDIRECTIONS; direction_t d; - /* Sturm nur, wenn nächste Region Hochsee ist. */ + /* Sturm nur, wenn nächste Region Hochsee ist. */ for (d = 0; d != MAXDIRECTIONS; ++d) { direction_t dnext = (direction_t)((d + d_offset) % MAXDIRECTIONS); region *rn = rconnect(current_point, dnext); @@ -2052,16 +2054,16 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep) sh = NULL; } - /* Nun enthält current_point die Region, in der das Schiff seine Runde - * beendet hat. Wir generieren hier ein Ereignis für den Spieler, das - * ihm sagt, bis wohin er gesegelt ist, falls er überhaupt vom Fleck - * gekommen ist. Das ist nicht der Fall, wenn er von der Küste ins + /* Nun enthält current_point die Region, in der das Schiff seine Runde + * beendet hat. Wir generieren hier ein Ereignis für den Spieler, das + * ihm sagt, bis wohin er gesegelt ist, falls er überhaupt vom Fleck + * gekommen ist. Das ist nicht der Fall, wenn er von der Küste ins * Inland zu segeln versuchte */ if (sh != NULL && fval(sh, SF_MOVED)) { unit *harbourmaster; /* nachdem alle Richtungen abgearbeitet wurden, und alle Einheiten - * transferiert wurden, kann der aktuelle Befehl gelöscht werden. */ + * transferiert wurden, kann der aktuelle Befehl gelöscht werden. */ cycle_route(ord, u, step); set_order(&u->thisorder, NULL); if (!move_on_land) { @@ -2086,7 +2088,7 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep) sh = move_ship(sh, starting_point, current_point, *routep); - /* Hafengebühren ? */ + /* Hafengebühren ? */ harbourmaster = owner_buildingtyp(current_point, bt_find("harbour")); if (sh && harbourmaster != NULL) { @@ -2434,7 +2436,7 @@ static void piracy_cmd(unit * u, struct order *ord) /* Wenn nicht, sehen wir, ob wir ein Ziel finden. */ if (target_dir == NODIRECTION) { - /* Einheit ist also Kapitän. Jetzt gucken, in wievielen + /* Einheit ist also Kapitän. Jetzt gucken, in wievielen * Nachbarregionen potentielle Opfer sind. */ for (dir = 0; dir < MAXDIRECTIONS; dir++) { @@ -2493,7 +2495,7 @@ static void piracy_cmd(unit * u, struct order *ord) set_order(&u->thisorder, create_order(K_MOVE, u->faction->locale, "%s", LOC(u->faction->locale, directions[target_dir]))); - /* Bewegung ausführen */ + /* Bewegung ausführen */ init_order(u->thisorder); move(u, true); } @@ -2604,7 +2606,7 @@ static int hunt(unit * u, order * ord) /* NACH ignorieren und Parsing initialisieren. */ init_tokens_str(command); getstrtoken(); - /* NACH ausführen */ + /* NACH ausführen */ move(u, false); return 1; /* true -> Einheitenliste von vorne durchgehen */ } @@ -2803,7 +2805,7 @@ void movement(void) if (repeat) continue; if (ships == 0) { - /* Abtreiben von beschädigten, unterbemannten, überladenen Schiffen */ + /* Abtreiben von beschädigten, unterbemannten, überladenen Schiffen */ drifting_ships(r); } r = r->next; diff --git a/src/upkeep.test.c b/src/upkeep.test.c index c7757624a..46d9a6d04 100644 --- a/src/upkeep.test.c +++ b/src/upkeep.test.c @@ -1,4 +1,4 @@ -#include +#include #include "upkeep.h" #include @@ -82,6 +82,7 @@ void test_upkeep_from_pool(CuTest * tc) assert(i_silver); r = findregion(0, 0); u1 = test_create_unit(test_create_faction(test_create_race("human")), r); + assert(u1); u2 = test_create_unit(u1->faction, r); assert(r && u1 && u2); diff --git a/src/util/log.c b/src/util/log.c index a24c4b153..fadcb532a 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -1,4 +1,4 @@ -/* +/* +-------------------+ Christian Schlittchen | | Enno Rehling | Eressea PBEM host | Katja Zedel @@ -54,13 +54,13 @@ cp_convert(const char *format, char *buffer, size_t length, int codepage) char *pos = buffer; while (pos + 1 < buffer + length && *input) { - size_t length = 0; + size_t size = 0; int result = 0; if (codepage == 437) { - result = unicode_utf8_to_cp437(pos, input, &length); + result = unicode_utf8_to_cp437(pos, input, &size); } else if (codepage == 1252) { - result = unicode_utf8_to_cp1252(pos, input, &length); + result = unicode_utf8_to_cp1252(pos, input, &size); } if (result != 0) { *pos = 0; /* just in case caller ignores our return value */ From 09db2fe278880d3d74f383758f0c8d8372aa1898 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 6 Jul 2015 20:44:47 +0200 Subject: [PATCH 02/12] jsreport: return error if file not open. add scan-build to travis --- .travis.yml | 6 ++++-- s/travis-build | 5 ++--- src/jsreport.c | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index da3381bdc..3d824ab3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,10 +2,12 @@ language: c compiler: - gcc - clang -script: s/travis-build before_install: - sudo apt-get update -qq - - sudo apt-get install -qq zlib1g-dev libtolua-dev liblua5.1-dev libncurses5-dev libsqlite3-dev libxml2-dev valgrind +install: + - sudo apt-get install -qq zlib1g-dev libtolua-dev liblua5.1-dev libncurses5-dev libsqlite3-dev libxml2-dev valgrind clang +script: + - s/travis-build os: - linux - osx diff --git a/s/travis-build b/s/travis-build index b34340266..e6d132409 100755 --- a/s/travis-build +++ b/s/travis-build @@ -4,9 +4,8 @@ set -e ROOT=`pwd` SUPP=../share/ubuntu-12_04.supp MACHINE=`uname -m` +[ -z "$CC" ] && [ ! -z `which clang` ] && CC="clang" [ -z "$CC" ] && [ ! -z `which gcc` ] && CC="gcc" -[ -z "$CC" ] && [ ! -z `which tcc` ] && CC="tcc" -[ -z "$CC" ] && [ ! -z `which cc` ] && CC="cc" BUILD="$ROOT/build-$MACHINE-$CC-Debug" inifile() { @@ -20,7 +19,7 @@ fi build() { cd $BUILD cmake -DCMAKE_MODULE_PATH=$ROOT/cmake/Modules -DCMAKE_BUILD_TYPE=Debug .. -make +scan-build make } test_valgrind_report () { diff --git a/src/jsreport.c b/src/jsreport.c index bfbb9e33b..6d9f710c2 100644 --- a/src/jsreport.c +++ b/src/jsreport.c @@ -74,7 +74,7 @@ static int report_json(const char *filename, report_context * ctx, const char *c } return 0; } - return errno; + return -1; } return 0; } From 05ec74f9ec1cf9b1a7976c248bf597ffe835e7c0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 6 Jul 2015 21:31:27 +0200 Subject: [PATCH 03/12] annotate with finds from PVS Studio trial static analysis --- src/creport.c | 2 +- src/give.c | 2 +- src/kernel/item.c | 2 +- src/kernel/save.c | 2 +- src/laws.c | 8 +- src/magic.c | 218 +++++++++++++++++++++++----------------------- src/report.c | 10 +-- src/spy.c | 4 +- src/study.c | 4 +- src/summary.c | 4 +- src/util/attrib.c | 8 +- 11 files changed, 132 insertions(+), 132 deletions(-) diff --git a/src/creport.c b/src/creport.c index 2396a7476..7db0fdee3 100644 --- a/src/creport.c +++ b/src/creport.c @@ -755,7 +755,7 @@ static void cr_output_unit(FILE * F, const region * r, const faction * f, itemcloak_ct = ct_find("itemcloak"); } if (itemcloak_ct != NULL) { - itemcloak = curse_active(get_curse(u->attribs, itemcloak_ct)); + itemcloak = curse_active(get_curse(u->attribs, itemcloak_ct)); //TODO: V595 http://www.viva64.com/en/V595 The 'u' pointer was utilized before it was verified against nullptr. Check lines: 758, 761. } assert(u && u->number); diff --git a/src/give.c b/src/give.c index c5d4f5a27..95361b5ca 100644 --- a/src/give.c +++ b/src/give.c @@ -400,7 +400,7 @@ message * disband_men(int n, unit * u, struct order *ord) { void give_unit(unit * u, unit * u2, order * ord) { - region *r = u->region; + region *r = u->region; //TODO: V595 http://www.viva64.com/en/V595 The 'u' pointer was utilized before it was verified against nullptr. Check lines: 403, 406. int maxt = max_transfers(); assert(u); diff --git a/src/kernel/item.c b/src/kernel/item.c index 5ac160881..6c37ebad2 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -333,7 +333,7 @@ potion_type *new_potiontype(item_type * itype, int level) void it_set_appearance(item_type *itype, const char *appearance) { assert(itype && itype->rtype && appearance); - itype->_appearance[0] = _strdup(appearance); + itype->_appearance[0] = _strdup(appearance); //TODO: V595 http://www.viva64.com/en/V595 The 'appearance' pointer was utilized before it was verified against nullptr. Check lines: 336, 337. itype->_appearance[1] = appearance ? strcat(strcpy((char *)malloc(strlen((char *)appearance) + 3), (char *)appearance), "_p") : 0; } diff --git a/src/kernel/save.c b/src/kernel/save.c index 0e0225f83..04575797b 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -990,7 +990,7 @@ void writeregion(struct gamedata *data, const region * r) rawmaterial *res = r->resources; assert(r->land); - WRITE_STR(data->store, (const char *)r->land->name); + WRITE_STR(data->store, (const char *)r->land->name); //TODO: V595 http://www.viva64.com/en/V595 The 'r->land' pointer was utilized before it was verified against nullptr. Check lines: 993, 1023. assert(rtrees(r, 0) >= 0); assert(rtrees(r, 1) >= 0); assert(rtrees(r, 2) >= 0); diff --git a/src/laws.c b/src/laws.c index 06b2a0a1e..65219792f 100755 --- a/src/laws.c +++ b/src/laws.c @@ -1741,7 +1741,7 @@ int name_cmd(struct unit *u, struct order *ord) for (; lang; lang = nextlocale(lang)) { const char *fdname = LOC(lang, "factiondefault"); size_t fdlen = strlen(fdname); - if (strlen(f->name) >= fdlen && strncmp(f->name, fdname, fdlen) == 0) { + if (strlen(f->name) >= fdlen && strncmp(f->name, fdname, fdlen) == 0) { //TODO: V814 http://www.viva64.com/en/V814 Decreased performance. The 'strlen' function was called multiple times inside the body of a loop. break; } } @@ -1778,14 +1778,14 @@ int name_cmd(struct unit *u, struct order *ord) for (; lang; lang = nextlocale(lang)) { const char *sdname = LOC(lang, sh->type->_name); size_t sdlen = strlen(sdname); - if (strlen(sh->name) >= sdlen + if (strlen(sh->name) >= sdlen //TODO: V814 http://www.viva64.com/en/V814 Decreased performance. The 'strlen' function was called multiple times inside the body of a loop. && strncmp(sh->name, sdname, sdlen) == 0) { break; } sdname = LOC(lang, parameters[P_SHIP]); sdlen = strlen(sdname); - if (strlen(sh->name) >= sdlen + if (strlen(sh->name) >= sdlen //TODO: V814 http://www.viva64.com/en/V814 Decreased performance. The 'strlen' function was called multiple times inside the body of a loop. && strncmp(sh->name, sdname, sdlen) == 0) { break; } @@ -2718,7 +2718,7 @@ int guard_on_cmd(unit * u, struct order *ord) init_order(ord); /* GUARD NOT is handled in goard_off_cmd earlier in the turn */ - if (getparam(u->faction->locale) == P_NOT) + if (getparam(u->faction->locale) == P_NOT) //TODO: V595 http://www.viva64.com/en/V595 The 'u->faction' pointer was utilized before it was verified against nullptr. Check lines: 2721, 2737. return 0; if (fval(u->region->terrain, SEA_REGION)) { diff --git a/src/magic.c b/src/magic.c index d91bd9658..5c9e3edc3 100644 --- a/src/magic.c +++ b/src/magic.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2014, Enno Rehling Katja Zedel faction->seenspells). Ansonsten muss nur geprüft +* kleiner war (u->faction->seenspells). Ansonsten muss nur geprüft * werden, ob dieser Magier den Spruch schon kennt, und andernfalls der -* Spruch zu seiner List-of-known-spells hinzugefügt werden. +* Spruch zu seiner List-of-known-spells hinzugefügt werden. */ static int read_seenspell(attrib * a, void *owner, struct storage *store) @@ -507,7 +507,7 @@ sc_mage *create_mage(unit * u, magic_t mtyp) } /* ------------------------------------------------------------- */ -/* Funktionen für die Bearbeitung der List-of-known-spells */ +/* Funktionen für die Bearbeitung der List-of-known-spells */ int u_hasspell(const unit *u, const struct spell *sp) { @@ -535,7 +535,7 @@ int get_combatspelllevel(const unit * u, int nr) } /* ------------------------------------------------------------- */ -/* Kampfzauber ermitteln, setzen oder löschen */ +/* Kampfzauber ermitteln, setzen oder löschen */ const spell *get_combatspell(const unit * u, int nr) { @@ -560,7 +560,7 @@ void set_combatspell(unit * u, spell * sp, struct order *ord, int level) assert(mage || !"trying to set a combat spell for non-mage"); - /* knowsspell prüft auf ist_magier, ist_spruch, kennt_spruch */ + /* knowsspell prüft auf ist_magier, ist_spruch, kennt_spruch */ if (!knowsspell(u->region, u, sp)) { /* Fehler 'Spell not found' */ cmistake(u, ord, 173, MSG_MAGIC); @@ -626,7 +626,7 @@ void unset_combatspell(unit * u, spell * sp) } /* ------------------------------------------------------------- */ -/* Gibt die aktuelle Anzahl der Magiepunkte der Einheit zurück */ +/* Gibt die aktuelle Anzahl der Magiepunkte der Einheit zurück */ int get_spellpoints(const unit * u) { sc_mage *m; @@ -652,7 +652,7 @@ void set_spellpoints(unit * u, int sp) } /* - * verändert die Anzahl der Magiepunkte der Einheit um +mp + * verändert die Anzahl der Magiepunkte der Einheit um +mp */ int change_spellpoints(unit * u, int mp) { @@ -671,7 +671,7 @@ int change_spellpoints(unit * u, int mp) return sp; } -/* bietet die Möglichkeit, die maximale Anzahl der Magiepunkte mit +/* bietet die Möglichkeit, die maximale Anzahl der Magiepunkte mit * Regionszaubern oder Attributen zu beinflussen */ static int get_spchange(const unit * u) @@ -687,13 +687,13 @@ static int get_spchange(const unit * u) /* ein Magier kann normalerweise maximal Stufe^2.1/1.2+1 Magiepunkte * haben. - * Manche Rassen haben einen zusätzlichen Multiplikator - * Durch Talentverlust (zB Insekten im Berg) können negative Werte + * Manche Rassen haben einen zusätzlichen Multiplikator + * Durch Talentverlust (zB Insekten im Berg) können negative Werte * entstehen */ -/* Artefakt der Stärke - * Ermöglicht dem Magier mehr Magiepunkte zu 'speichern' +/* Artefakt der Stärke + * Ermöglicht dem Magier mehr Magiepunkte zu 'speichern' */ /** TODO: at_skillmod daraus machen */ static int use_item_aura(const region * r, const unit * u) @@ -741,8 +741,8 @@ int change_maxspellpoints(unit * u, int csp) } /* ------------------------------------------------------------- */ -/* Counter für die bereits gezauberte Anzahl Sprüche pro Runde. - * Um nur die Zahl der bereits gezauberten Sprüche zu ermitteln mit +/* Counter für die bereits gezauberte Anzahl Sprüche pro Runde. + * Um nur die Zahl der bereits gezauberten Sprüche zu ermitteln mit * step = 0 aufrufen. */ int countspells(unit * u, int step) @@ -766,9 +766,9 @@ int countspells(unit * u, int step) } /* ------------------------------------------------------------- */ -/* Die für den Spruch benötigte Aura pro Stufe. - * Die Grundkosten pro Stufe werden hier um 2^count erhöht. Der - * Parameter count ist dabei die Anzahl der bereits gezauberten Sprüche +/* Die für den Spruch benötigte Aura pro Stufe. + * Die Grundkosten pro Stufe werden hier um 2^count erhöht. Der + * Parameter count ist dabei die Anzahl der bereits gezauberten Sprüche */ int spellcost(unit * u, const spell * sp) { @@ -786,12 +786,12 @@ int spellcost(unit * u, const spell * sp) } /* ------------------------------------------------------------- */ -/* SPC_LINEAR ist am höchstwertigen, dann müssen Komponenten für die +/* SPC_LINEAR ist am höchstwertigen, dann müssen Komponenten für die * Stufe des Magiers vorhanden sein. - * SPC_LINEAR hat die gewünschte Stufe als multiplikator, + * SPC_LINEAR hat die gewünschte Stufe als multiplikator, * nur SPC_FIX muss nur einmal vorhanden sein, ist also am * niedrigstwertigen und sollte von den beiden anderen Typen - * überschrieben werden */ + * überschrieben werden */ static int spl_costtyp(const spell * sp) { int k; @@ -805,7 +805,7 @@ static int spl_costtyp(const spell * sp) return SPC_LINEAR; } - /* wenn keine Fixkosten, Typ übernehmen */ + /* wenn keine Fixkosten, Typ übernehmen */ if (sp->components[k].cost != SPC_FIX) { costtyp = sp->components[k].cost; } @@ -814,10 +814,10 @@ static int spl_costtyp(const spell * sp) } /* ------------------------------------------------------------- */ -/* durch Komponenten und cast_level begrenzter maximal möglicher +/* durch Komponenten und cast_level begrenzter maximal möglicher * Level * Da die Funktion nicht alle Komponenten durchprobiert sondern beim - * ersten Fehler abbricht, muss die Fehlermeldung später mit cancast() + * ersten Fehler abbricht, muss die Fehlermeldung später mit cancast() * generiert werden. * */ int eff_spelllevel(unit * u, const spell * sp, int cast_level, int range) @@ -831,8 +831,8 @@ int eff_spelllevel(unit * u, const spell * sp, int cast_level, int range) return 0; if (sp->components[k].amount > 0) { - /* Die Kosten für Aura sind auch von der Zahl der bereits - * gezauberten Sprüche abhängig */ + /* Die Kosten für Aura sind auch von der Zahl der bereits + * gezauberten Sprüche abhängig */ if (sp->components[k].type == r_aura) { needplevel = spellcost(u, sp) * range; } @@ -844,18 +844,18 @@ int eff_spelllevel(unit * u, const spell * sp, int cast_level, int range) needplevel * cast_level) / needplevel; /* sind die Kosten fix, so muss die Komponente nur einmal vorhanden - * sein und der cast_level ändert sich nicht */ + * sein und der cast_level ändert sich nicht */ if (sp->components[k].cost == SPC_FIX) { if (maxlevel < 1) cast_level = 0; - /* ansonsten wird das Minimum aus maximal möglicher Stufe und der - * gewünschten gebildet */ + /* ansonsten wird das Minimum aus maximal möglicher Stufe und der + * gewünschten gebildet */ } else if (sp->components[k].cost == SPC_LEVEL) { costtyp = SPC_LEVEL; cast_level = _min(cast_level, maxlevel); - /* bei Typ Linear müssen die Kosten in Höhe der Stufe vorhanden - * sein, ansonsten schlägt der Spruch fehl */ + /* bei Typ Linear müssen die Kosten in Höhe der Stufe vorhanden + * sein, ansonsten schlägt der Spruch fehl */ } else if (sp->components[k].cost == SPC_LINEAR) { costtyp = SPC_LINEAR; @@ -882,7 +882,7 @@ int eff_spelllevel(unit * u, const spell * sp, int cast_level, int range) /* ------------------------------------------------------------- */ /* Die Spruchgrundkosten werden mit der Entfernung (Farcasting) * multipliziert, wobei die Aurakosten ein Sonderfall sind, da sie sich - * auch durch die Menge der bereits gezauberten Sprüche erhöht. + * auch durch die Menge der bereits gezauberten Sprüche erhöht. * Je nach Kostenart werden dann die Komponenten noch mit cast_level * multipliziert. */ @@ -913,12 +913,12 @@ void pay_spell(unit * u, const spell * sp, int cast_level, int range) /* ------------------------------------------------------------- */ /* Ein Magier kennt den Spruch und kann sich die Beschreibung anzeigen * lassen, wenn diese in seiner Spruchliste steht. Zaubern muss er ihn - * aber dann immer noch nicht können, vieleicht ist seine Stufe derzeit + * aber dann immer noch nicht können, vieleicht ist seine Stufe derzeit * nicht ausreichend oder die Komponenten fehlen. */ bool knowsspell(const region * r, const unit * u, const spell * sp) { - /* Ist überhaupt ein gültiger Spruch angegeben? */ + /* Ist überhaupt ein gültiger Spruch angegeben? */ if (!sp || sp->id == 0) { return false; } @@ -929,7 +929,7 @@ bool knowsspell(const region * r, const unit * u, const spell * sp) /* Um einen Spruch zu beherrschen, muss der Magier die Stufe des * Spruchs besitzen, nicht nur wissen, das es ihn gibt (also den Spruch * in seiner Spruchliste haben). - * Kosten für einen Spruch können Magiepunkte, Silber, Kraeuter + * Kosten für einen Spruch können Magiepunkte, Silber, Kraeuter * und sonstige Gegenstaende sein. */ @@ -948,7 +948,7 @@ cancast(unit * u, const spell * sp, int level, int range, struct order * ord) } /* reicht die Stufe aus? */ if (eff_skill(u, SK_MAGIC, u->region) < level) { - /* die Einheit ist nicht erfahren genug für diesen Zauber */ + /* die Einheit ist nicht erfahren genug für diesen Zauber */ cmistake(u, ord, 169, MSG_MAGIC); return false; } @@ -958,8 +958,8 @@ cancast(unit * u, const spell * sp, int level, int range, struct order * ord) const resource_type *rtype = sp->components[k].type; int itemhave; - /* Die Kosten für Aura sind auch von der Zahl der bereits - * gezauberten Sprüche abhängig */ + /* Die Kosten für Aura sind auch von der Zahl der bereits + * gezauberten Sprüche abhängig */ if (rtype == r_aura) { itemanz = spellcost(u, sp) * range; } @@ -967,7 +967,7 @@ cancast(unit * u, const spell * sp, int level, int range, struct order * ord) itemanz = sp->components[k].amount * range; } - /* sind die Kosten stufenabhängig, so muss itemanz noch mit dem + /* sind die Kosten stufenabhängig, so muss itemanz noch mit dem * level multipliziert werden */ switch (sp->components[k].cost) { case SPC_LEVEL: @@ -1004,7 +1004,7 @@ cancast(unit * u, const spell * sp, int level, int range, struct order * ord) * Spruchitems und Antimagiefeldern zusammen. Es koennen noch die * Stufe des Spruchs und Magiekosten mit einfliessen. * - * Die effektive Spruchstärke und ihre Auswirkungen werden in der + * Die effektive Spruchstärke und ihre Auswirkungen werden in der * Spruchfunktionsroutine ermittelt. */ @@ -1080,7 +1080,7 @@ spellpower(region * r, unit * u, const spell * sp, int cast_level, struct order } /* ------------------------------------------------------------- */ -/* farcasting() == 1 -> gleiche Region, da man mit Null nicht vernünfigt +/* farcasting() == 1 -> gleiche Region, da man mit Null nicht vernünfigt * rechnen kann */ static int farcasting(unit * magician, region * r) { @@ -1166,7 +1166,7 @@ double magic_resistance(unit * target) /* Bonus durch Artefakte */ /* TODO (noch gibs keine) */ - /* Bonus durch Gebäude */ + /* Bonus durch Gebäude */ { struct building *b = inside_building(target); const struct building_type *btype = b ? b->type : NULL; @@ -1179,14 +1179,14 @@ double magic_resistance(unit * target) } /* ------------------------------------------------------------- */ -/* Prüft, ob das Objekt dem Zauber widerstehen kann. - * Objekte können Regionen, Units, Gebäude oder Schiffe sein. +/* Prüft, ob das Objekt dem Zauber widerstehen kann. + * Objekte können Regionen, Units, Gebäude oder Schiffe sein. * TYP_UNIT: - * Das höchste Talent des Ziels ist sein 'Magieresistenz-Talent', Magier - * bekommen einen Bonus. Grundchance ist 50%, für jede Stufe - * Unterschied gibt es 5%, minimalchance ist 5% für jeden (5-95%) + * Das höchste Talent des Ziels ist sein 'Magieresistenz-Talent', Magier + * bekommen einen Bonus. Grundchance ist 50%, für jede Stufe + * Unterschied gibt es 5%, minimalchance ist 5% für jeden (5-95%) * Scheitert der Spruch an der Magieresistenz, so gibt die Funktion - * true zurück + * true zurück */ bool @@ -1248,8 +1248,8 @@ target_resists_magic(unit * magician, void *obj, int objtyp, int t_bonus) probability = _min(0.98, probability); /* gibt true, wenn die Zufallszahl kleiner als die chance ist und - * false, wenn sie gleich oder größer ist, dh je größer die - * Magieresistenz (chance) desto eher gibt die Funktion true zurück */ + * false, wenn sie gleich oder größer ist, dh je größer die + * Magieresistenz (chance) desto eher gibt die Funktion true zurück */ return chance(probability); } @@ -1276,7 +1276,7 @@ bool fumble(region * r, unit * u, const spell * sp, int cast_grade) { /* X ergibt Zahl zwischen 1 und 0, je kleiner, desto besser der Magier. * 0,5*40-20=0, dh wenn der Magier doppelt so gut ist, wie der Spruch - * benötigt, gelingt er immer, ist er gleich gut, gelingt der Spruch mit + * benötigt, gelingt er immer, ist er gleich gut, gelingt der Spruch mit * 20% Warscheinlichkeit nicht * */ @@ -1306,8 +1306,8 @@ bool fumble(region * r, unit * u, const spell * sp, int cast_grade) fumble_chance += CHAOSPATZERCHANCE; } - /* wenn die Chance kleiner als 0 ist, können wir gleich false - * zurückgeben */ + /* wenn die Chance kleiner als 0 ist, können wir gleich false + * zurückgeben */ if (fumble_chance <= 0) { return false; } @@ -1317,7 +1317,7 @@ bool fumble(region * r, unit * u, const spell * sp, int cast_grade) } /* ------------------------------------------------------------- */ -/* Dummy-Zauberpatzer, Platzhalter für speziel auf die Sprüche +/* Dummy-Zauberpatzer, Platzhalter für speziel auf die Sprüche * zugeschnittene Patzer */ static void fumble_default(castorder * co) { @@ -1328,7 +1328,7 @@ static void fumble_default(castorder * co) return; } -/* Die normalen Spruchkosten müssen immer bezahlt werden, hier noch +/* Die normalen Spruchkosten müssen immer bezahlt werden, hier noch * alle weiteren Folgen eines Patzers */ @@ -1390,7 +1390,7 @@ static void do_fumble(castorder * co) break; case 3: case 4: - /* Spruch schlägt fehl, alle Magiepunkte weg */ + /* Spruch schlägt fehl, alle Magiepunkte weg */ set_spellpoints(u, 0); ADDMSG(&u->faction->msgs, msg_message("patzer3", "unit region spell", u, r, sp)); @@ -1409,7 +1409,7 @@ static void do_fumble(castorder * co) case 8: case 9: default: - /* Spruch gelingt, alle nachfolgenden Sprüche werden 2^4 so teuer */ + /* Spruch gelingt, alle nachfolgenden Sprüche werden 2^4 so teuer */ co->level = sp->cast(co); ADDMSG(&u->faction->msgs, msg_message("patzer5", "unit region spell", u, r, sp)); @@ -1422,7 +1422,7 @@ static void do_fumble(castorder * co) /* ------------------------------------------------------------- */ /* Ein Magier regeneriert pro Woche W(Stufe^1.5/2+1), mindestens 1 - * Zwerge nur die Hälfte + * Zwerge nur die Hälfte */ static double regeneration(unit * u) { @@ -1439,7 +1439,7 @@ static double regeneration(unit * u) /* Einfluss von Artefakten */ /* TODO (noch gibs keine) */ - /* Würfeln */ + /* Würfeln */ aura = (rng_double() * d + rng_double() * d) / 2 + 1; aura *= MagicRegeneration(); @@ -1469,8 +1469,8 @@ void regenerate_aura(void) const struct building_type *btype = b ? b->type : NULL; reg_aura = regeneration(u); - /* Magierturm erhöht die Regeneration um 75% */ - /* Steinkreis erhöht die Regeneration um 50% */ + /* Magierturm erhöht die Regeneration um 75% */ + /* Steinkreis erhöht die Regeneration um 50% */ if (btype) reg_aura *= btype->auraregen; @@ -1609,14 +1609,14 @@ order * ord) /* ------------------------------------------------------------- */ /* Zuerst wird versucht alle noch nicht gefundenen Objekte zu finden - * oder zu prüfen, ob das gefundene Objekt wirklich hätte gefunden - * werden dürfen (nicht alle Zauber wirken global). Dabei zählen wir die + * oder zu prüfen, ob das gefundene Objekt wirklich hätte gefunden + * werden dürfen (nicht alle Zauber wirken global). Dabei zählen wir die * Misserfolge (failed). * Dann folgen die Tests der gefundenen Objekte auf Magieresistenz und - * Sichtbarkeit. Dabei zählen wir die magieresistenten (resists) + * Sichtbarkeit. Dabei zählen wir die magieresistenten (resists) * Objekte. Alle anderen werten wir als Erfolge (success) */ -/* 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 */ static void verify_targets(castorder * co, int *invalid, int *resist, int *success) @@ -1634,8 +1634,8 @@ verify_targets(castorder * co, int *invalid, int *resist, int *success) if (sa && sa->length) { /* zuerst versuchen wir vorher nicht gefundene Objekte zu finden. * Wurde ein Objekt durch globalsuche gefunden, obwohl der Zauber - * gar nicht global hätte suchen dürften, setzen wir das Objekt - * zurück. */ + * gar nicht global hätte suchen dürften, setzen wir das Objekt + * zurück. */ for (i = 0; i < sa->length; i++) { spllprm *spobj = sa->param[i]; @@ -1719,7 +1719,7 @@ verify_targets(castorder * co, int *invalid, int *resist, int *success) case SPP_REGION: /* haben wir ein Regionsobjekt, dann wird auch dieses und - nicht target_r überprüft. */ + nicht target_r überprüft. */ tr = spobj->data.r; if ((sp->sptyp & TESTRESISTANCE) @@ -1745,7 +1745,7 @@ verify_targets(castorder * co, int *invalid, int *resist, int *success) else { /* der Zauber hat keine expliziten Parameter/Ziele, es kann sich * aber um einen Regionszauber handeln. Wenn notwendig hier die - * Magieresistenz der Region prüfen. */ + * Magieresistenz der Region prüfen. */ if ((sp->sptyp & REGIONSPELL)) { /* Zielobjekt Region anlegen */ spllprm *spobj = (spllprm *)malloc(sizeof(spllprm)); @@ -1782,7 +1782,7 @@ verify_targets(castorder * co, int *invalid, int *resist, int *success) } /* ------------------------------------------------------------- */ -/* Hilfsstrukturen für ZAUBERE */ +/* Hilfsstrukturen für ZAUBERE */ /* ------------------------------------------------------------- */ static void free_spellparameter(spellparameter * pa) @@ -1799,7 +1799,7 @@ static void free_spellparameter(spellparameter * pa) default: break; } - free(pa->param[i]); + free(pa->param[i]); //TODO: V595 http://www.viva64.com/en/V595 The 'pa->param' pointer was utilized before it was verified against nullptr. Check lines: 1802, 1805. } if (pa->param) @@ -1966,7 +1966,7 @@ static spellparameter *add_spellparameter(region * target_r, unit * u, break; case '+': /* das vorhergehende Element kommt ein oder mehrmals vor, wir - * springen zum key zurück */ + * springen zum key zurück */ j = 0; --c; break; @@ -2090,7 +2090,7 @@ void free_castorder(struct castorder *co) if (co->order) free_order(co->order); } -/* Hänge c-order co an die letze c-order von cll an */ +/* Hänge c-order co an die letze c-order von cll an */ void add_castorder(spellrank * cll, castorder * co) { if (cll->begin == NULL) { @@ -2521,7 +2521,7 @@ static castorder *cast_cmd(unit * u, order * ord) init_order(ord); s = gettoken(token, sizeof(token)); param = findparam(s, u->faction->locale); - /* für Syntax ' STUFE x REGION y z ' */ + /* für Syntax ' STUFE x REGION y z ' */ if (param == P_LEVEL) { int p = getint(); level = _min(p, level); @@ -2550,8 +2550,8 @@ static castorder *cast_cmd(unit * u, order * ord) s = gettoken(token, sizeof(token)); param = findparam(s, u->faction->locale); } - /* für Syntax ' REGION x y STUFE z ' - * hier nach REGION nochmal auf STUFE prüfen */ + /* für Syntax ' REGION x y STUFE z ' + * hier nach REGION nochmal auf STUFE prüfen */ if (param == P_LEVEL) { int p = getint(); level = _min(p, level); @@ -2570,8 +2570,8 @@ static castorder *cast_cmd(unit * u, order * ord) sp = unit_getspell(u, s, u->faction->locale); - /* Vertraute können auch Zauber sprechen, die sie selbst nicht - * können. unit_getspell findet aber nur jene Sprüche, die + /* Vertraute können auch Zauber sprechen, die sie selbst nicht + * können. unit_getspell findet aber nur jene Sprüche, die * die Einheit beherrscht. */ if (!sp && is_familiar(u)) { caster = get_familiar_mage(u); @@ -2594,7 +2594,7 @@ static castorder *cast_cmd(unit * u, order * ord) /* um testen auf spruchnamen zu unterbinden sollte vor allen * fehlermeldungen die anzeigen das der magier diesen Spruch * nur in diese Situation nicht anwenden kann, noch eine - * einfache Sicherheitsprüfung kommen */ + * einfache Sicherheitsprüfung kommen */ if (!knowsspell(r, u, sp)) { /* vorsicht! u kann der familiar sein */ if (!familiar) { @@ -2607,9 +2607,9 @@ static castorder *cast_cmd(unit * u, order * ord) cmistake(u, ord, 174, MSG_MAGIC); return 0; } - /* Auf dem Ozean Zaubern als quasi-langer Befehl können + /* Auf dem Ozean Zaubern als quasi-langer Befehl können * normalerweise nur Meermenschen, ausgenommen explizit als - * OCEANCASTABLE deklarierte Sprüche */ + * OCEANCASTABLE deklarierte Sprüche */ if (fval(r->terrain, SEA_REGION)) { if (u_race(u) != get_race(RC_AQUARIAN) && !fval(u_race(u), RCF_SWIM) @@ -2632,7 +2632,7 @@ static castorder *cast_cmd(unit * u, order * ord) } } } - /* Farcasting bei nicht farcastbaren Sprüchen abfangen */ + /* Farcasting bei nicht farcastbaren Sprüchen abfangen */ range = farcasting(u, target_r); if (range > 1) { if (!(sp->sptyp & FARCASTING)) { @@ -2647,7 +2647,7 @@ static castorder *cast_cmd(unit * u, order * ord) return 0; } } - /* Stufenangabe bei nicht Stufenvariierbaren Sprüchen abfangen */ + /* Stufenangabe bei nicht Stufenvariierbaren Sprüchen abfangen */ if (!(sp->sptyp & SPELLLEVEL)) { int ilevel = eff_skill(u, SK_MAGIC, u->region); if (ilevel != level) { @@ -2680,9 +2680,9 @@ static castorder *cast_cmd(unit * u, order * ord) "mage", caster)); return 0; } - /* mage auf magier setzen, level anpassen, range für Erhöhung + /* mage auf magier setzen, level anpassen, range für Erhöhung * der Spruchkosten nutzen, langen Befehl des Magiers - * löschen, zaubern kann er noch */ + * löschen, zaubern kann er noch */ range *= 2; set_order(&caster->thisorder, NULL); level = _min(level, eff_skill(caster, SK_MAGIC, caster->region) / 2); @@ -2721,19 +2721,19 @@ static castorder *cast_cmd(unit * u, order * ord) /* ------------------------------------------------------------- */ /* Damit man keine Rituale in fremden Gebiet machen kann, diese vor * Bewegung zaubern. Magier sind also in einem fremden Gebiet eine Runde - * lang verletzlich, da sie es betreten, und angegriffen werden können, - * bevor sie ein Ritual machen können. + * lang verletzlich, da sie es betreten, und angegriffen werden können, + * bevor sie ein Ritual machen können. * * Syntax: ZAUBER [REGION X Y] [STUFE ] "Spruchname" [Einheit-1 * Einheit-2 ..] * - * Nach Priorität geordnet die Zauber global auswerten. + * Nach Priorität geordnet die Zauber global auswerten. * - * Die Kosten für Farcasting multiplizieren sich mit der Entfernung, + * Die Kosten für Farcasting multiplizieren sich mit der Entfernung, * cast_level gibt die virtuelle Stufe an, die den durch das Farcasten * entstandenen Spruchkosten entspricht. Sind die Spruchkosten nicht - * levelabhängig, so sind die Kosten nur von der Entfernung bestimmt, - * die Stärke/Level durch den realen Skill des Magiers + * levelabhängig, so sind die Kosten nur von der Entfernung bestimmt, + * die Stärke/Level durch den realen Skill des Magiers */ void magic(void) @@ -2776,11 +2776,11 @@ void magic(void) } } - /* Da sich die Aura und Komponenten in der Zwischenzeit verändert - * haben können und sich durch vorherige Sprüche das Zaubern - * erschwert haben kann, muss beim zaubern erneut geprüft werden, ob der - * Spruch überhaupt gezaubert werden kann. - * (level) die effektive Stärke des Spruchs (= Stufe, auf der der + /* Da sich die Aura und Komponenten in der Zwischenzeit verändert + * haben können und sich durch vorherige Sprüche das Zaubern + * erschwert haben kann, muss beim zaubern erneut geprüft werden, ob der + * Spruch überhaupt gezaubert werden kann. + * (level) die effektive Stärke des Spruchs (= Stufe, auf der der * Spruch gezaubert wird) */ for (rank = 0; rank < MAX_SPELLRANK; rank++) { @@ -2802,30 +2802,30 @@ void magic(void) } if (cast_level > co->level) { - /* Sprüche mit Fixkosten werden immer auf Stufe des Spruchs - * gezaubert, co->level ist aber defaultmäßig Stufe des Magiers */ + /* Sprüche mit Fixkosten werden immer auf Stufe des Spruchs + * gezaubert, co->level ist aber defaultmäßig Stufe des Magiers */ if (spl_costtyp(sp) != SPC_FIX) { ADDMSG(&u->faction->msgs, msg_message("missing_components", "unit spell level", u, sp, cast_level)); } } - /* Prüfen, ob die realen Kosten für die gewünschten Stufe bezahlt - * werden können */ + /* Prüfen, ob die realen Kosten für die gewünschten Stufe bezahlt + * werden können */ if (!cancast(u, sp, co->level, co->distance, ord)) { /* die Fehlermeldung wird in cancast generiert */ continue; } co->force = spellpower(target_r, u, sp, co->level, ord); - /* die Stärke kann durch Antimagie auf 0 sinken */ + /* die Stärke kann durch Antimagie auf 0 sinken */ if (co->force <= 0) { co->force = 0; ADDMSG(&u->faction->msgs, msg_message("missing_force", "unit spell level", u, sp, co->level)); } - /* Ziele auf Existenz prüfen und Magieresistenz feststellen. Wurde + /* Ziele auf Existenz prüfen und Magieresistenz feststellen. Wurde * kein Ziel gefunden, so ist verify_targets=0. Scheitert der * Spruch an der Magieresistenz, so ist verify_targets = 1, bei * Erfolg auf ganzer Linie ist verify_targets= 2 @@ -2833,8 +2833,8 @@ void magic(void) 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 */ + /* keine kosten für den zauber */ + continue; /* äußere Schleife, nächster Zauberer */ } else if (co->force > 0 && resist > 0) { /* einige oder alle Ziele waren magieresistent */ @@ -2847,8 +2847,8 @@ void magic(void) } } - /* Auch für Patzer gibt es Erfahrung, müssen die Spruchkosten - * bezahlt werden und die nachfolgenden Sprüche werden teurer */ + /* Auch für Patzer gibt es Erfahrung, müssen die Spruchkosten + * bezahlt werden und die nachfolgenden Sprüche werden teurer */ if (co->force > 0) { if (fumble(target_r, u, sp, co->level)) { /* zuerst bezahlen, dann evt in do_fumble alle Aura verlieren */ @@ -2857,12 +2857,12 @@ void magic(void) else { co->level = sp->cast(co); if (co->level <= 0) { - /* Kosten nur für real benötige Stufe berechnen */ + /* Kosten nur für real benötige Stufe berechnen */ continue; } } } - /* erst bezahlen, dann Kostenzähler erhöhen */ + /* erst bezahlen, dann Kostenzähler erhöhen */ if (co->level > 0) { pay_spell(u, sp, co->level, co->distance); } diff --git a/src/report.c b/src/report.c index 0644df62b..f476a5c7f 100644 --- a/src/report.c +++ b/src/report.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2015, Enno Rehling Katja Zedel @@ -552,9 +552,9 @@ static void nr_curses(stream *out, int indent, const faction *viewer, objtype_t region *r; /* Die Sichtbarkeit eines Zaubers und die Zaubermeldung sind bei - * Gebäuden und Schiffen je nach, ob man Besitzer ist, verschieden. + * Gebäuden und Schiffen je nach, ob man Besitzer ist, verschieden. * Bei Einheiten sieht man Wirkungen auf eigene Einheiten immer. - * Spezialfälle (besonderes Talent, verursachender Magier usw. werde + * Spezialfälle (besonderes Talent, verursachender Magier usw. werde * bei jedem curse gesondert behandelt. */ if (typ == TYP_SHIP) { ship *sh = (ship *)obj; @@ -945,7 +945,7 @@ static void describe(stream *out, const seen_region * sr, faction * f) bytes = (int)strlcpy(bufp, LOC(f->locale, "nr_tree"), size); } else { - bytes = (int)strlcpy(bufp, LOC(f->locale, "nr_tree_p"), size); + bytes = (int)strlcpy(bufp, LOC(f->locale, "nr_tree_p"), size); //TODO: V595 http://www.viva64.com/en/V595 The 'f' pointer was utilized before it was verified against nullptr. Check lines: 948, 956. } if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); @@ -1188,7 +1188,7 @@ static void describe(stream *out, const seen_region * sr, faction * f) } } - /* Wirkungen permanenter Sprüche */ + /* Wirkungen permanenter Sprüche */ nr_curses(out, 0, f, TYP_REGION, r); n = 0; diff --git a/src/spy.c b/src/spy.c index a7e481954..a247b6c66 100644 --- a/src/spy.c +++ b/src/spy.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2015, Enno Rehling Katja Zedel @@ -375,7 +375,7 @@ static int try_destruction(unit * u, unit * u2, const ship * sh, int skilldiff) } else if (skilldiff < 0) { /* tell the unit that the attempt was detected: */ - ADDMSG(&u2->faction->msgs, msg_message(destruction_detected_msg, + ADDMSG(&u2->faction->msgs, msg_message(destruction_detected_msg, //TODO: V595 http://www.viva64.com/en/V595 The 'u2' pointer was utilized before it was verified against nullptr. Check lines: 378, 381. "ship unit", sh, u)); /* tell the enemy whodunit: */ if (u2) { diff --git a/src/study.c b/src/study.c index 467939dbf..a302737fa 100644 --- a/src/study.c +++ b/src/study.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2015, Enno Rehling Katja Zedel @@ -743,7 +743,7 @@ int learn_cmd(unit * u, order * ord) multi *= study_speedup(u, sk, speed_rule); days = study_days(u, sk); - days = (int)((days + teach->value) * multi); + days = (int)((days + teach->value) * multi); //TODO: V595 http://www.viva64.com/en/V595 The 'teach' pointer was utilized before it was verified against nullptr. Check lines: 746, 772. /* the artacademy currently improves the learning of entertainment of all units in the region, to be able to make it cumulative with diff --git a/src/summary.c b/src/summary.c index 92405db33..deb05b08f 100644 --- a/src/summary.c +++ b/src/summary.c @@ -1,4 +1,4 @@ -/* +/* * +-------------------+ Christian Schlittchen * | | Enno Rehling * | Eressea PBEM host | Katja Zedel @@ -356,7 +356,7 @@ summary *make_summary(void) const struct resource_type *rhorse = get_resourcetype(R_HORSE); for (f = factions; f; f = f->next) { - const struct locale *lang = f->locale; + const struct locale *lang = f->locale; //TODO: V595 http://www.viva64.com/en/V595 The 'f' pointer was utilized before it was verified against nullptr. Check lines: 359, 376. struct language *plang = s->languages; while (plang && plang->locale != lang) plang = plang->next; diff --git a/src/util/attrib.c b/src/util/attrib.c index dd1120b5c..e76a42898 100644 --- a/src/util/attrib.c +++ b/src/util/attrib.c @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 1998-2015, Enno Rehling Katja Zedel @@ -69,7 +69,7 @@ static attrib_type *at_find(unsigned int hk) { const char *translate[3][2] = { { "zielregion", "targetregion" }, /* remapping: from 'zielregion, heute targetregion */ - { "verzaubert", "curse" }, /* remapping: früher verzaubert, jetzt curse */ + { "verzaubert", "curse" }, /* remapping: früher verzaubert, jetzt curse */ { NULL, NULL } }; attrib_type *find = at_hash[hk % MAXATHASH]; @@ -110,7 +110,7 @@ const attrib *a_findc(const attrib * a, const attrib_type * at) static attrib *a_insert(attrib * head, attrib * a) { - attrib **pa = &head->next; + attrib **pa = &head->next; //TODO: V595 http://www.viva64.com/en/V595 The 'head' pointer was utilized before it was verified against nullptr. Check lines: 113, 116. assert(!(a->type->flags & ATF_UNIQUE)); assert(head && head->type == a->type); @@ -250,7 +250,7 @@ int a_age(attrib ** p) { attrib **ap = p; /* Attribute altern, und die Entfernung (age()==0) eines Attributs - * hat Einfluß auf den Besitzer */ + * hat Einfluß auf den Besitzer */ while (*ap) { attrib *a = *ap; if (a->type->age) { From e25d3c8ed16163968a04d2cdf16aea6fe9f54662 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 00:49:12 +0200 Subject: [PATCH 04/12] Fix a bug reporting DETROY messages to the correct unit. Add missing not-null assertions before accessing function parameters. Eliminate all of the PVS-Studio warnings. --- src/creport.c | 9 +- src/give.c | 4 +- src/kernel/item.c | 13 +- src/kernel/save.c | 17 +- src/laws.c | 16 +- src/magic.c | 12 +- src/monster.h | 3 +- src/report.c | 12 +- src/spy.c | 2 +- src/study.c | 404 +++++++++++++++++++++++----------------------- src/summary.c | 2 +- src/util/attrib.c | 4 +- 12 files changed, 253 insertions(+), 245 deletions(-) diff --git a/src/creport.c b/src/creport.c index 7db0fdee3..42a440c8a 100644 --- a/src/creport.c +++ b/src/creport.c @@ -746,8 +746,8 @@ static void cr_output_unit(FILE * F, const region * r, const faction * f, const faction *sf; const char *prefix; - assert(u); - if (!u || fval(u_race(u), RCF_INVISIBLE)) + assert(u && u->number); + if (u != NULL || fval(u_race(u), RCF_INVISIBLE)) return; if (!init) { @@ -755,11 +755,10 @@ static void cr_output_unit(FILE * F, const region * r, const faction * f, itemcloak_ct = ct_find("itemcloak"); } if (itemcloak_ct != NULL) { - itemcloak = curse_active(get_curse(u->attribs, itemcloak_ct)); //TODO: V595 http://www.viva64.com/en/V595 The 'u' pointer was utilized before it was verified against nullptr. Check lines: 758, 761. + curse * cu = get_curse(u->attribs, itemcloak_ct); + itemcloak = cu && curse_active(cu); } - assert(u && u->number); - fprintf(F, "EINHEIT %d\n", u->no); fprintf(F, "\"%s\";Name\n", unit_getname(u)); str = u_description(u, f->locale); diff --git a/src/give.c b/src/give.c index 95361b5ca..f9879b9dd 100644 --- a/src/give.c +++ b/src/give.c @@ -400,7 +400,6 @@ message * disband_men(int n, unit * u, struct order *ord) { void give_unit(unit * u, unit * u2, order * ord) { - region *r = u->region; //TODO: V595 http://www.viva64.com/en/V595 The 'u' pointer was utilized before it was verified against nullptr. Check lines: 403, 406. int maxt = max_transfers(); assert(u); @@ -409,7 +408,7 @@ void give_unit(unit * u, unit * u2, order * ord) return; } - if (u && unit_has_cursed_item(u)) { + if (unit_has_cursed_item(u)) { cmistake(u, ord, 78, MSG_COMMERCE); return; } @@ -424,6 +423,7 @@ void give_unit(unit * u, unit * u2, order * ord) } if (u2 == NULL) { + region *r = u->region; message *msg; if (fval(r->terrain, SEA_REGION)) { msg = disband_men(u->number, u, ord); diff --git a/src/kernel/item.c b/src/kernel/item.c index 6c37ebad2..bb2282f80 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -332,10 +332,15 @@ potion_type *new_potiontype(item_type * itype, int level) } void it_set_appearance(item_type *itype, const char *appearance) { - assert(itype && itype->rtype && appearance); - itype->_appearance[0] = _strdup(appearance); //TODO: V595 http://www.viva64.com/en/V595 The 'appearance' pointer was utilized before it was verified against nullptr. Check lines: 336, 337. - itype->_appearance[1] = appearance ? - strcat(strcpy((char *)malloc(strlen((char *)appearance) + 3), (char *)appearance), "_p") : 0; + assert(itype); + assert(itype->rtype); + if (appearance) { + itype->_appearance[0] = _strdup(appearance); + itype->_appearance[1] = strcat(strcpy((char *)malloc(strlen((char *)appearance) + 3), (char *)appearance), "_p"); + } else { + itype->_appearance[0] = 0; + itype->_appearance[1] = 0; + } } const resource_type *item2resource(const item_type * itype) diff --git a/src/kernel/save.c b/src/kernel/save.c index 04575797b..d997c3216 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -978,6 +978,9 @@ static region *readregion(struct gamedata *data, int x, int y) void writeregion(struct gamedata *data, const region * r) { + assert(r); + assert(data); + WRITE_INT(data->store, r->uid); WRITE_STR(data->store, region_getinfo(r)); WRITE_TOK(data->store, r->terrain->_name); @@ -988,9 +991,9 @@ void writeregion(struct gamedata *data, const region * r) const item_type *rht; struct demand *demand; rawmaterial *res = r->resources; - - assert(r->land); - WRITE_STR(data->store, (const char *)r->land->name); //TODO: V595 http://www.viva64.com/en/V595 The 'r->land' pointer was utilized before it was verified against nullptr. Check lines: 993, 1023. + + assert(r->land); + WRITE_STR(data->store, (const char *)r->land->name); assert(rtrees(r, 0) >= 0); assert(rtrees(r, 1) >= 0); assert(rtrees(r, 2) >= 0); @@ -1020,11 +1023,9 @@ void writeregion(struct gamedata *data, const region * r) WRITE_INT(data->store, rherbs(r)); WRITE_INT(data->store, rpeasants(r)); WRITE_INT(data->store, rmoney(r)); - if (r->land) { - for (demand = r->land->demands; demand; demand = demand->next) { - WRITE_TOK(data->store, resourcename(demand->type->itype->rtype, 0)); - WRITE_INT(data->store, demand->value); - } + for (demand = r->land->demands; demand; demand = demand->next) { + WRITE_TOK(data->store, resourcename(demand->type->itype->rtype, 0)); + WRITE_INT(data->store, demand->value); } WRITE_TOK(data->store, "end"); write_items(data->store, r->land->items); diff --git a/src/laws.c b/src/laws.c index 65219792f..b165511e4 100755 --- a/src/laws.c +++ b/src/laws.c @@ -1738,10 +1738,11 @@ int name_cmd(struct unit *u, struct order *ord) } else { const struct locale *lang = locales; + size_t f_len = strlen(f->name); for (; lang; lang = nextlocale(lang)) { const char *fdname = LOC(lang, "factiondefault"); size_t fdlen = strlen(fdname); - if (strlen(f->name) >= fdlen && strncmp(f->name, fdname, fdlen) == 0) { //TODO: V814 http://www.viva64.com/en/V814 Decreased performance. The 'strlen' function was called multiple times inside the body of a loop. + if (f_len >= fdlen && strncmp(f->name, fdname, fdlen) == 0) { break; } } @@ -1775,18 +1776,17 @@ int name_cmd(struct unit *u, struct order *ord) } else { const struct locale *lang = locales; + size_t sh_len = strlen(sh->name); for (; lang; lang = nextlocale(lang)) { const char *sdname = LOC(lang, sh->type->_name); size_t sdlen = strlen(sdname); - if (strlen(sh->name) >= sdlen //TODO: V814 http://www.viva64.com/en/V814 Decreased performance. The 'strlen' function was called multiple times inside the body of a loop. - && strncmp(sh->name, sdname, sdlen) == 0) { + if (sh_len >= sdlen && strncmp(sh->name, sdname, sdlen) == 0) { break; } sdname = LOC(lang, parameters[P_SHIP]); sdlen = strlen(sdname); - if (strlen(sh->name) >= sdlen //TODO: V814 http://www.viva64.com/en/V814 Decreased performance. The 'strlen' function was called multiple times inside the body of a loop. - && strncmp(sh->name, sdname, sdlen) == 0) { + if (sh_len >= sdlen && strncmp(sh->name, sdname, sdlen) == 0) { break; } @@ -2713,13 +2713,15 @@ void update_guards(void) int guard_on_cmd(unit * u, struct order *ord) { assert(getkeyword(ord) == K_GUARD); - assert(u && u->faction); + assert(u); + assert(u->faction); init_order(ord); /* GUARD NOT is handled in goard_off_cmd earlier in the turn */ - if (getparam(u->faction->locale) == P_NOT) //TODO: V595 http://www.viva64.com/en/V595 The 'u->faction' pointer was utilized before it was verified against nullptr. Check lines: 2721, 2737. + if (getparam(u->faction->locale) == P_NOT) { return 0; + } if (fval(u->region->terrain, SEA_REGION)) { cmistake(u, ord, 2, MSG_EVENT); diff --git a/src/magic.c b/src/magic.c index 5c9e3edc3..287f8fd55 100644 --- a/src/magic.c +++ b/src/magic.c @@ -1789,9 +1789,10 @@ static void free_spellparameter(spellparameter * pa) { int i; - /* Elemente free'en */ - for (i = 0; i < pa->length; i++) { + assert(pa->param); + for (i = 0; i < pa->length; i++) { + assert(pa->param[i]); switch (pa->param[i]->typ) { case SPP_STRING: free(pa->param[i]->data.s); @@ -1799,12 +1800,9 @@ static void free_spellparameter(spellparameter * pa) default: break; } - free(pa->param[i]); //TODO: V595 http://www.viva64.com/en/V595 The 'pa->param' pointer was utilized before it was verified against nullptr. Check lines: 1802, 1805. + free(pa->param[i]); } - - if (pa->param) - free(pa->param); - /* struct free'en */ + free(pa->param); free(pa); } diff --git a/src/monster.h b/src/monster.h index fc3ca94a2..476bcb73e 100644 --- a/src/monster.h +++ b/src/monster.h @@ -31,8 +31,7 @@ extern "C" { void make_zombie(struct unit * u); #define MONSTER_ID 666 -#define is_monsters(f) (f && fval(f, FFL_NPC) && f==get_monsters()) - +#define is_monsters(f) (fval(f, FFL_NPC) && f==get_monsters()) #ifdef __cplusplus } diff --git a/src/report.c b/src/report.c index f476a5c7f..98740aef2 100644 --- a/src/report.c +++ b/src/report.c @@ -840,7 +840,7 @@ bool see_border(const connection * b, const faction * f, const region * r) static void describe(stream *out, const seen_region * sr, faction * f) { - const region *r = sr->r; + const region *r; int n; bool dh; direction_t d; @@ -862,6 +862,11 @@ static void describe(stream *out, const seen_region * sr, faction * f) size_t size = sizeof(buf); int bytes; + assert(out); + assert(f); + assert(sr); + + r = sr->r; for (d = 0; d != MAXDIRECTIONS; d++) { /* Nachbarregionen, die gesehen werden, ermitteln */ region *r2 = rconnect(r, d); @@ -945,7 +950,7 @@ static void describe(stream *out, const seen_region * sr, faction * f) bytes = (int)strlcpy(bufp, LOC(f->locale, "nr_tree"), size); } else { - bytes = (int)strlcpy(bufp, LOC(f->locale, "nr_tree_p"), size); //TODO: V595 http://www.viva64.com/en/V595 The 'f' pointer was utilized before it was verified against nullptr. Check lines: 948, 956. + bytes = (int)strlcpy(bufp, LOC(f->locale, "nr_tree_p"), size); } if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); @@ -953,7 +958,7 @@ static void describe(stream *out, const seen_region * sr, faction * f) } /* iron & stone */ - if (sr->mode == see_unit && f != (faction *)NULL) { + if (sr->mode == see_unit) { resource_report result[MAX_RAWMATERIALS]; int n, numresults = report_resources(sr, result, MAX_RAWMATERIALS, f); @@ -1410,7 +1415,6 @@ static void durchreisende(stream *out, const region * r, const faction * f) } } } - /* TODO: finish localization */ if (size > 0) { if (maxtravel == 1) { bytes = _snprintf(bufp, size, " %s", LOC(f->locale, "has_moved_one")); diff --git a/src/spy.c b/src/spy.c index a247b6c66..7d9c6529a 100644 --- a/src/spy.c +++ b/src/spy.c @@ -375,7 +375,7 @@ static int try_destruction(unit * u, unit * u2, const ship * sh, int skilldiff) } else if (skilldiff < 0) { /* tell the unit that the attempt was detected: */ - ADDMSG(&u2->faction->msgs, msg_message(destruction_detected_msg, //TODO: V595 http://www.viva64.com/en/V595 The 'u2' pointer was utilized before it was verified against nullptr. Check lines: 378, 381. + ADDMSG(&u->faction->msgs, msg_message(destruction_detected_msg, "ship unit", sh, u)); /* tell the enemy whodunit: */ if (u2) { diff --git a/src/study.c b/src/study.c index a302737fa..ec377f0f7 100644 --- a/src/study.c +++ b/src/study.c @@ -542,6 +542,9 @@ int learn_cmd(unit * u, order * ord) int maxalchemy = 0; int speed_rule = (study_rule_t)get_param_int(global.parameters, "study.speedup", 0); static int learn_newskills = -1; + struct building *b = inside_building(u); + const struct building_type *btype = b ? b->type : NULL; + if (learn_newskills < 0) { const char *str = get_param(global.parameters, "study.newskills"); if (str && strcmp(str, "false") == 0) @@ -603,220 +606,217 @@ int learn_cmd(unit * u, order * ord) return 0; } /* Akademie: */ - { - struct building *b = inside_building(u); - const struct building_type *btype = b ? b->type : NULL; + b = inside_building(u); + btype = b ? b->type : NULL; - if (btype && btype == bt_find("academy")) { - studycost = _max(50, studycost * 2); - } - } + if (btype && btype == bt_find("academy")) { + studycost = _max(50, studycost * 2); + } - if (sk == SK_MAGIC) { - if (u->number > 1) { - cmistake(u, ord, 106, MSG_MAGIC); - return 0; - } - if (is_familiar(u)) { - /* Vertraute zaehlen nicht zu den Magiern einer Partei, - * koennen aber nur Graue Magie lernen */ - mtyp = M_GRAY; - if (!is_mage(u)) - create_mage(u, mtyp); - } - else if (!has_skill(u, SK_MAGIC)) { - int mmax = skill_limit(u->faction, SK_MAGIC); - /* Die Einheit ist noch kein Magier */ - if (count_skill(u->faction, SK_MAGIC) + u->number > mmax) { - ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_magicians", - "amount", mmax)); - return 0; - } - mtyp = getmagicskill(u->faction->locale); - if (mtyp == M_NONE || mtyp == M_GRAY) { - /* wurde kein Magiegebiet angegeben, wird davon - * ausgegangen, dass das normal gelernt werden soll */ - if (u->faction->magiegebiet != 0) { - mtyp = u->faction->magiegebiet; - } - else { - /* Es wurde kein Magiegebiet angegeben und die Partei - * hat noch keins gewaehlt. */ - mtyp = getmagicskill(u->faction->locale); - if (mtyp == M_NONE) { - cmistake(u, ord, 178, MSG_MAGIC); - return 0; - } - } - } - if (mtyp != u->faction->magiegebiet) { - /* Es wurde versucht, ein anderes Magiegebiet zu lernen - * als das der Partei */ - if (u->faction->magiegebiet != 0) { - cmistake(u, ord, 179, MSG_MAGIC); - return 0; - } - else { - /* Lernt zum ersten mal Magie und legt damit das - * Magiegebiet der Partei fest */ - u->faction->magiegebiet = mtyp; - } - } - if (!is_mage(u)) - create_mage(u, mtyp); - } - else { - /* ist schon ein Magier und kein Vertrauter */ - if (u->faction->magiegebiet == 0) { - /* die Partei hat noch kein Magiegebiet gewaehlt. */ - mtyp = getmagicskill(u->faction->locale); - if (mtyp == M_NONE) { - mtyp = getmagicskill(u->faction->locale); - if (mtyp == M_NONE) { - cmistake(u, ord, 178, MSG_MAGIC); - return 0; - } - } - /* Legt damit das Magiegebiet der Partei fest */ - u->faction->magiegebiet = mtyp; - } - } - } - if (sk == SK_ALCHEMY) { - maxalchemy = eff_skill(u, SK_ALCHEMY, r); - if (!has_skill(u, SK_ALCHEMY)) { - int amax = skill_limit(u->faction, SK_ALCHEMY); - if (count_skill(u->faction, SK_ALCHEMY) + u->number > amax) { - ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_alchemists", - "amount", amax)); - return 0; - } - } - } - if (studycost) { - int cost = studycost * u->number; - money = get_pooled(u, get_resourcetype(R_SILVER), GET_DEFAULT, cost); - money = _min(money, cost); - } - if (money < studycost * u->number) { - studycost = p; /* Ohne Univertreurung */ - money = _min(money, studycost); - if (p > 0 && money < studycost * u->number) { - cmistake(u, ord, 65, MSG_EVENT); - multi = money / (double)(studycost * u->number); - } - } + if (sk == SK_MAGIC) { + if (u->number > 1) { + cmistake(u, ord, 106, MSG_MAGIC); + return 0; + } + if (is_familiar(u)) { + /* Vertraute zaehlen nicht zu den Magiern einer Partei, + * koennen aber nur Graue Magie lernen */ + mtyp = M_GRAY; + if (!is_mage(u)) + create_mage(u, mtyp); + } + else if (!has_skill(u, SK_MAGIC)) { + int mmax = skill_limit(u->faction, SK_MAGIC); + /* Die Einheit ist noch kein Magier */ + if (count_skill(u->faction, SK_MAGIC) + u->number > mmax) { + ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_magicians", + "amount", mmax)); + return 0; + } + mtyp = getmagicskill(u->faction->locale); + if (mtyp == M_NONE || mtyp == M_GRAY) { + /* wurde kein Magiegebiet angegeben, wird davon + * ausgegangen, dass das normal gelernt werden soll */ + if (u->faction->magiegebiet != 0) { + mtyp = u->faction->magiegebiet; + } + else { + /* Es wurde kein Magiegebiet angegeben und die Partei + * hat noch keins gewaehlt. */ + mtyp = getmagicskill(u->faction->locale); + if (mtyp == M_NONE) { + cmistake(u, ord, 178, MSG_MAGIC); + return 0; + } + } + } + if (mtyp != u->faction->magiegebiet) { + /* Es wurde versucht, ein anderes Magiegebiet zu lernen + * als das der Partei */ + if (u->faction->magiegebiet != 0) { + cmistake(u, ord, 179, MSG_MAGIC); + return 0; + } + else { + /* Lernt zum ersten mal Magie und legt damit das + * Magiegebiet der Partei fest */ + u->faction->magiegebiet = mtyp; + } + } + if (!is_mage(u)) + create_mage(u, mtyp); + } + else { + /* ist schon ein Magier und kein Vertrauter */ + if (u->faction->magiegebiet == 0) { + /* die Partei hat noch kein Magiegebiet gewaehlt. */ + mtyp = getmagicskill(u->faction->locale); + if (mtyp == M_NONE) { + mtyp = getmagicskill(u->faction->locale); + if (mtyp == M_NONE) { + cmistake(u, ord, 178, MSG_MAGIC); + return 0; + } + } + /* Legt damit das Magiegebiet der Partei fest */ + u->faction->magiegebiet = mtyp; + } + } + } + if (sk == SK_ALCHEMY) { + maxalchemy = eff_skill(u, SK_ALCHEMY, r); + if (!has_skill(u, SK_ALCHEMY)) { + int amax = skill_limit(u->faction, SK_ALCHEMY); + if (count_skill(u->faction, SK_ALCHEMY) + u->number > amax) { + ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_alchemists", + "amount", amax)); + return 0; + } + } + } + if (studycost) { + int cost = studycost * u->number; + money = get_pooled(u, get_resourcetype(R_SILVER), GET_DEFAULT, cost); + money = _min(money, cost); + } + if (money < studycost * u->number) { + studycost = p; /* Ohne Univertreurung */ + money = _min(money, studycost); + if (p > 0 && money < studycost * u->number) { + cmistake(u, ord, 65, MSG_EVENT); + multi = money / (double)(studycost * u->number); + } + } - if (teach == NULL) { - a = a_add(&u->attribs, a_new(&at_learning)); - teach = (teaching_info *)a->data.v; - teach->teachers[0] = 0; - } - if (money > 0) { - use_pooled(u, get_resourcetype(R_SILVER), GET_DEFAULT, money); - ADDMSG(&u->faction->msgs, msg_message("studycost", - "unit region cost skill", u, u->region, money, sk)); - } + if (teach == NULL) { + a = a_add(&u->attribs, a_new(&at_learning)); + teach = (teaching_info *)a->data.v; + assert(teach); + teach->teachers[0] = 0; + } + if (money > 0) { + use_pooled(u, get_resourcetype(R_SILVER), GET_DEFAULT, money); + ADDMSG(&u->faction->msgs, msg_message("studycost", + "unit region cost skill", u, u->region, money, sk)); + } - if (get_effect(u, oldpotiontype[P_WISE])) { - l = _min(u->number, get_effect(u, oldpotiontype[P_WISE])); - teach->value += l * 10; - change_effect(u, oldpotiontype[P_WISE], -l); - } - if (get_effect(u, oldpotiontype[P_FOOL])) { - l = _min(u->number, get_effect(u, oldpotiontype[P_FOOL])); - teach->value -= l * 30; - change_effect(u, oldpotiontype[P_FOOL], -l); - } + if (get_effect(u, oldpotiontype[P_WISE])) { + l = _min(u->number, get_effect(u, oldpotiontype[P_WISE])); + teach->value += l * 10; + change_effect(u, oldpotiontype[P_WISE], -l); + } + if (get_effect(u, oldpotiontype[P_FOOL])) { + l = _min(u->number, get_effect(u, oldpotiontype[P_FOOL])); + teach->value -= l * 30; + change_effect(u, oldpotiontype[P_FOOL], -l); + } - if (p != studycost) { - /* ist_in_gebaeude(r, u, BT_UNIVERSITAET) == 1) { */ - /* p ist Kosten ohne Uni, studycost mit; wenn - * p!=studycost, ist die Einheit zwangsweise - * in einer Uni */ - teach->value += u->number * 10; - } + if (p != studycost) { + /* ist_in_gebaeude(r, u, BT_UNIVERSITAET) == 1) { */ + /* p ist Kosten ohne Uni, studycost mit; wenn + * p!=studycost, ist die Einheit zwangsweise + * in einer Uni */ + teach->value += u->number * 10; + } - if (is_cursed(r->attribs, C_BADLEARN, 0)) { - teach->value -= u->number * 10; - } + if (is_cursed(r->attribs, C_BADLEARN, 0)) { + teach->value -= u->number * 10; + } - multi *= study_speedup(u, sk, speed_rule); - days = study_days(u, sk); - days = (int)((days + teach->value) * multi); //TODO: V595 http://www.viva64.com/en/V595 The 'teach' pointer was utilized before it was verified against nullptr. Check lines: 746, 772. + multi *= study_speedup(u, sk, speed_rule); + days = study_days(u, sk); + days = (int)((days + teach->value) * multi); - /* the artacademy currently improves the learning of entertainment - of all units in the region, to be able to make it cumulative with - with an academy */ + /* the artacademy currently improves the learning of entertainment + of all units in the region, to be able to make it cumulative with + with an academy */ - if (sk == SK_ENTERTAINMENT - && buildingtype_exists(r, bt_find("artacademy"), false)) { - days *= 2; - } + if (sk == SK_ENTERTAINMENT + && buildingtype_exists(r, bt_find("artacademy"), false)) { + days *= 2; + } - if (fval(u, UFL_HUNGER)) - days /= 2; + if (fval(u, UFL_HUNGER)) + days /= 2; - while (days) { - if (days >= u->number * 30) { - learn_skill(u, sk, 1.0); - days -= u->number * 30; - } - else { - double chance = (double)days / u->number / 30; - learn_skill(u, sk, chance); - days = 0; - } - } - if (a != NULL) { - if (teach != NULL) { - int index = 0; - while (teach->teachers[index] && index != MAXTEACHERS) { - unit *teacher = teach->teachers[index++]; - if (teacher->faction != u->faction) { - bool feedback = alliedunit(u, teacher->faction, HELP_GUARD); - if (feedback) { - ADDMSG(&teacher->faction->msgs, msg_message("teach_teacher", - "teacher student skill level", teacher, u, sk, - effskill(u, sk))); - } - ADDMSG(&u->faction->msgs, msg_message("teach_student", - "teacher student skill", teacher, u, sk)); - } - } - } - a_remove(&u->attribs, a); - a = NULL; - } - fset(u, UFL_LONGACTION | UFL_NOTMOVING); + while (days) { + if (days >= u->number * 30) { + learn_skill(u, sk, 1.0); + days -= u->number * 30; + } + else { + double chance = (double)days / u->number / 30; + learn_skill(u, sk, chance); + days = 0; + } + } + if (a != NULL) { + int index = 0; + while (teach->teachers[index] && index != MAXTEACHERS) { + unit *teacher = teach->teachers[index++]; + if (teacher->faction != u->faction) { + bool feedback = alliedunit(u, teacher->faction, HELP_GUARD); + if (feedback) { + ADDMSG(&teacher->faction->msgs, msg_message("teach_teacher", + "teacher student skill level", teacher, u, sk, + effskill(u, sk))); + } + ADDMSG(&u->faction->msgs, msg_message("teach_student", + "teacher student skill", teacher, u, sk)); + } + } + a_remove(&u->attribs, a); + a = NULL; + } + fset(u, UFL_LONGACTION | UFL_NOTMOVING); - /* Anzeigen neuer Traenke */ - /* Spruchlistenaktualiesierung ist in Regeneration */ + /* Anzeigen neuer Traenke */ + /* Spruchlistenaktualiesierung ist in Regeneration */ - if (sk == SK_ALCHEMY) { - const potion_type *ptype; - faction *f = u->faction; - int skill = eff_skill(u, SK_ALCHEMY, r); - if (skill > maxalchemy) { - for (ptype = potiontypes; ptype; ptype = ptype->next) { - if (skill == ptype->level * 2) { - attrib *a = a_find(f->attribs, &at_showitem); - while (a && a->type == &at_showitem && a->data.v != ptype) - a = a->next; - if (a == NULL || a->type != &at_showitem) { - a = a_add(&f->attribs, a_new(&at_showitem)); - a->data.v = (void *)ptype->itype; - } - } - } - } - } - else if (sk == SK_MAGIC) { - sc_mage *mage = get_mage(u); - if (!mage) { - mage = create_mage(u, u->faction->magiegebiet); - } - } + if (sk == SK_ALCHEMY) { + const potion_type *ptype; + faction *f = u->faction; + int skill = eff_skill(u, SK_ALCHEMY, r); + if (skill > maxalchemy) { + for (ptype = potiontypes; ptype; ptype = ptype->next) { + if (skill == ptype->level * 2) { + attrib *a = a_find(f->attribs, &at_showitem); + while (a && a->type == &at_showitem && a->data.v != ptype) + a = a->next; + if (a == NULL || a->type != &at_showitem) { + a = a_add(&f->attribs, a_new(&at_showitem)); + a->data.v = (void *)ptype->itype; + } + } + } + } + } + else if (sk == SK_MAGIC) { + sc_mage *mage = get_mage(u); + if (!mage) { + mage = create_mage(u, u->faction->magiegebiet); + } + } - return 0; + return 0; } diff --git a/src/summary.c b/src/summary.c index deb05b08f..cd6e912e0 100644 --- a/src/summary.c +++ b/src/summary.c @@ -356,7 +356,7 @@ summary *make_summary(void) const struct resource_type *rhorse = get_resourcetype(R_HORSE); for (f = factions; f; f = f->next) { - const struct locale *lang = f->locale; //TODO: V595 http://www.viva64.com/en/V595 The 'f' pointer was utilized before it was verified against nullptr. Check lines: 359, 376. + const struct locale *lang = f->locale; struct language *plang = s->languages; while (plang && plang->locale != lang) plang = plang->next; diff --git a/src/util/attrib.c b/src/util/attrib.c index e76a42898..330664146 100644 --- a/src/util/attrib.c +++ b/src/util/attrib.c @@ -110,11 +110,11 @@ const attrib *a_findc(const attrib * a, const attrib_type * at) static attrib *a_insert(attrib * head, attrib * a) { - attrib **pa = &head->next; //TODO: V595 http://www.viva64.com/en/V595 The 'head' pointer was utilized before it was verified against nullptr. Check lines: 113, 116. - + attrib **pa; assert(!(a->type->flags & ATF_UNIQUE)); assert(head && head->type == a->type); + pa = &head->next; while (*pa && (*pa)->type == a->type) { pa = &(*pa)->next; } From 1e669472a6f9c2317b9c5d6e28574d81a9e66679 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 09:29:43 +0200 Subject: [PATCH 05/12] add a test and fix potential crashes in SABOTAGE command. sometimes even a simple test will uncover a ton of small errors. --- src/spy.c | 37 +++++++++++++++++++++++-------------- src/spy.test.c | 27 +++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/spy.c b/src/spy.c index 7d9c6529a..73af0148f 100644 --- a/src/spy.c +++ b/src/spy.c @@ -394,7 +394,7 @@ static int try_destruction(unit * u, unit * u2, const ship * sh, int skilldiff) return 1; /* success */ } -static void sink_ship(region * r, ship * sh, const char *name, unit * saboteur) +static void sink_ship(region * r, ship * sh, unit * saboteur) { unit **ui, *u; region *safety = r; @@ -404,6 +404,9 @@ static void sink_ship(region * r, ship * sh, const char *name, unit * saboteur) message *sink_msg = NULL; faction *f; + assert(r); + assert(sh); + assert(saboteur); for (f = NULL, u = r->units; u; u = u->next) { /* slight optimization to avoid dereferencing u->faction each time */ if (f != u->faction) { @@ -426,7 +429,7 @@ static void sink_ship(region * r, ship * sh, const char *name, unit * saboteur) } } } - for (ui = &r->units; *ui; ui = &(*ui)->next) { + for (ui = &r->units; *ui;) { unit *u = *ui; /* inform this faction about the sinking ship: */ @@ -471,12 +474,13 @@ static void sink_ship(region * r, ship * sh, const char *name, unit * saboteur) add_message(&u->faction->msgs, msg); msg_release(msg); if (dead == u->number) { - /* the poor creature, she dies */ - if (remove_unit(ui, u) != 0) { - ui = &u->next; + if (remove_unit(ui, u) == 0) { + /* ui is already pointing at u->next */ + continue; } } } + ui = &u->next; } if (sink_msg) msg_release(sink_msg); @@ -487,19 +491,21 @@ static void sink_ship(region * r, ship * sh, const char *name, unit * saboteur) int sabotage_cmd(unit * u, struct order *ord) { const char *s; - int i; + param_t p; ship *sh; unit *u2; - char buffer[DISPLAYSIZE]; - region *r = u->region; - int skdiff; + region *r; + int skdiff = INT_MAX; + + assert(u); + assert(ord); init_order(ord); s = getstrtoken(); - i = findparam(s, u->faction->locale); + p = findparam(s, u->faction->locale); - switch (i) { + switch (p) { case P_SHIP: sh = u->ship; if (!sh) { @@ -507,10 +513,13 @@ int sabotage_cmd(unit * u, struct order *ord) return 0; } u2 = ship_owner(sh); - skdiff = - eff_skill(u, SK_SPY, r) - crew_skill(r, u2->faction, sh, SK_PERCEPTION); + r = u->region; + if (u2->faction != u->faction) { + skdiff = + eff_skill(u, SK_SPY, r) - crew_skill(r, u2->faction, sh, SK_PERCEPTION); + } if (try_destruction(u, u2, sh, skdiff)) { - sink_ship(r, sh, buffer, u); + sink_ship(r, sh, u); } break; default: diff --git a/src/spy.test.c b/src/spy.test.c index e0f8c2043..7e0f715c0 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -5,9 +5,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -16,6 +18,7 @@ #include "spy.h" +#include #include #include @@ -98,12 +101,36 @@ static void test_all_spy_message(CuTest *tc) { test_cleanup(); } +static void test_sabotage_self(CuTest *tc) { + unit *u; + region *r; + order *ord; + struct locale *lang; + test_cleanup(); + lang = get_or_create_locale("de"); + locale_setstring(lang, parameters[P_SHIP], "SCHIFF"); + test_create_world(); + init_locales(); + + r = test_create_region(0, 0, NULL); + assert(r); + u = test_create_unit(test_create_faction(NULL), r); + assert(u && u->faction && u->region==r); + u->ship = test_create_ship(r, test_create_shiptype("boat")); + assert(u->ship); + ord = create_order(K_SABOTAGE, lang, "SCHIFF"); + assert(ord); + CuAssertIntEquals(tc, 0, sabotage_cmd(u, ord)); + CuAssertPtrEquals(tc, 0, r->ships); + test_cleanup(); +} CuSuite *get_spy_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_simple_spy_message); SUITE_ADD_TEST(suite, test_all_spy_message); + SUITE_ADD_TEST(suite, test_sabotage_self); return suite; } From d7e5876c62001e1848fdc7c2dc12d7e1483cdc79 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 09:44:24 +0200 Subject: [PATCH 06/12] fix build, missing limits.h include --- src/spy.c | 3 ++- src/spy.test.c | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/spy.c b/src/spy.c index 73af0148f..a440ab3aa 100644 --- a/src/spy.c +++ b/src/spy.c @@ -53,6 +53,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include /* in spy steht der Unterschied zwischen Wahrnehmung des Opfers und * Spionage des Spions */ @@ -61,7 +62,7 @@ void spy_message(int spy, const unit * u, const unit * target) const char *str = report_kampfstatus(target, u->faction->locale); ADDMSG(&u->faction->msgs, msg_message("spyreport", "spy target status", u, - target, str)); + target, str)); if (spy > 20) { sc_mage *mage = get_mage(target); /* for mages, spells and magic school */ diff --git a/src/spy.test.c b/src/spy.test.c index 7e0f715c0..46b52e32d 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -68,9 +68,9 @@ static void test_simple_spy_message(CuTest *tc) { static void set_factionstealth(unit *u, faction *f) { attrib *a = a_find(u->attribs, &at_otherfaction); if (!a) - a = a_add(&u->attribs, make_otherfaction(f)); + a = a_add(&u->attribs, make_otherfaction(f)); else - a->data.v = f; + a->data.v = f; } static void test_all_spy_message(CuTest *tc) { @@ -92,11 +92,11 @@ static void test_all_spy_message(CuTest *tc) { spy_message(99, fix.spy, fix.victim); assert_messages(tc, fix.spy->faction->msgs->begin, fix.msg_types, 5, true, - M_BASE, - M_MAGE, - M_FACTION, - M_SKILLS, - M_ITEMS); + M_BASE, + M_MAGE, + M_FACTION, + M_SKILLS, + M_ITEMS); test_cleanup(); } @@ -116,7 +116,7 @@ static void test_sabotage_self(CuTest *tc) { r = test_create_region(0, 0, NULL); assert(r); u = test_create_unit(test_create_faction(NULL), r); - assert(u && u->faction && u->region==r); + assert(u && u->faction && u->region == r); u->ship = test_create_ship(r, test_create_shiptype("boat")); assert(u->ship); ord = create_order(K_SABOTAGE, lang, "SCHIFF"); @@ -128,9 +128,9 @@ static void test_sabotage_self(CuTest *tc) { CuSuite *get_spy_suite(void) { - CuSuite *suite = CuSuiteNew(); - SUITE_ADD_TEST(suite, test_simple_spy_message); - SUITE_ADD_TEST(suite, test_all_spy_message); - SUITE_ADD_TEST(suite, test_sabotage_self); - return suite; + CuSuite *suite = CuSuiteNew(); + SUITE_ADD_TEST(suite, test_simple_spy_message); + SUITE_ADD_TEST(suite, test_all_spy_message); + SUITE_ADD_TEST(suite, test_sabotage_self); + return suite; } From f9130fcb38b9c22835fa369a2f97f6f59c4bba9c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 13:38:14 +0200 Subject: [PATCH 07/12] some more easy tests for sabotage. --- src/kernel/ship.c | 15 +++++++++++ src/kernel/ship.h | 5 ++-- src/move.c | 14 ---------- src/move.h | 1 - src/spy.test.c | 65 +++++++++++++++++++++++++++++++++++++++++++---- 5 files changed, 78 insertions(+), 22 deletions(-) diff --git a/src/kernel/ship.c b/src/kernel/ship.c index 1ae81b436..c5aded3cd 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -445,3 +445,18 @@ const char *ship_getname(const ship * self) { return self->name; } + +unit *get_captain(const ship * sh) +{ + const region *r = sh->region; + unit *u; + + for (u = r->units; u; u = u->next) { + if (u->ship == sh && u->number + && eff_skill(u, SK_SAILING, r) >= sh->type->cptskill) + return u; + } + + return NULL; +} + diff --git a/src/kernel/ship.h b/src/kernel/ship.h index 809e678a4..f123242df 100644 --- a/src/kernel/ship.h +++ b/src/kernel/ship.h @@ -121,9 +121,10 @@ extern "C" { extern void free_ship(struct ship *s); extern void free_ships(void); - extern const char *ship_getname(const struct ship *self); - extern void ship_setname(struct ship *self, const char *name); + const char *ship_getname(const struct ship *self); + void ship_setname(struct ship *self, const char *name); int shipspeed(const struct ship *sh, const struct unit *u); + struct unit *get_captain(const struct ship *sh); #ifdef __cplusplus } diff --git a/src/move.c b/src/move.c index b14dfb68d..f29dd08ce 100644 --- a/src/move.c +++ b/src/move.c @@ -2130,20 +2130,6 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep) } } -unit *get_captain(const ship * sh) -{ - const region *r = sh->region; - unit *u; - - for (u = r->units; u; u = u->next) { - if (u->ship == sh && u->number - && eff_skill(u, SK_SAILING, r) >= sh->type->cptskill) - return u; - } - - return NULL; -} - /* Segeln, Wandern, Reiten * when this routine returns a non-zero value, movement for the region needs * to be done again because of followers that got new MOVE orders. diff --git a/src/move.h b/src/move.h index f1c20d622..f35012b07 100644 --- a/src/move.h +++ b/src/move.h @@ -64,7 +64,6 @@ extern "C" { int enoughsailors(const struct ship *sh, const struct region *r); bool canswim(struct unit *u); bool canfly(struct unit *u); - struct unit *get_captain(const struct ship *sh); void travelthru(const struct unit *u, struct region *r); struct ship *move_ship(struct ship *sh, struct region *from, struct region *to, struct region_list *route); diff --git a/src/spy.test.c b/src/spy.test.c index 46b52e32d..7f97eb171 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -101,10 +102,7 @@ static void test_all_spy_message(CuTest *tc) { test_cleanup(); } -static void test_sabotage_self(CuTest *tc) { - unit *u; - region *r; - order *ord; +static void setup_sabotage(void) { struct locale *lang; test_cleanup(); @@ -112,25 +110,82 @@ static void test_sabotage_self(CuTest *tc) { locale_setstring(lang, parameters[P_SHIP], "SCHIFF"); test_create_world(); init_locales(); +} +static void test_sabotage_self(CuTest *tc) { + unit *u; + region *r; + order *ord; + + setup_sabotage(); r = test_create_region(0, 0, NULL); assert(r); u = test_create_unit(test_create_faction(NULL), r); assert(u && u->faction && u->region == r); u->ship = test_create_ship(r, test_create_shiptype("boat")); assert(u->ship); - ord = create_order(K_SABOTAGE, lang, "SCHIFF"); + ord = create_order(K_SABOTAGE, u->faction->locale, "SCHIFF"); assert(ord); CuAssertIntEquals(tc, 0, sabotage_cmd(u, ord)); CuAssertPtrEquals(tc, 0, r->ships); test_cleanup(); } + +static void test_sabotage_other_fail(CuTest *tc) { + unit *u, *u2; + region *r; + order *ord; + + setup_sabotage(); + r = test_create_region(0, 0, NULL); + assert(r); + u = test_create_unit(test_create_faction(NULL), r); + u2 = test_create_unit(test_create_faction(NULL), r); + assert(u && u2); + u2->ship = test_create_ship(r, test_create_shiptype("boat")); + assert(u2->ship); + u->ship = u2->ship; + ship_update_owner(u->ship); + assert(ship_owner(u->ship) == u); + ord = create_order(K_SABOTAGE, u->faction->locale, "SCHIFF"); + assert(ord); + CuAssertIntEquals(tc, 0, sabotage_cmd(u2, ord)); + CuAssertPtrNotNull(tc, r->ships); + test_cleanup(); +} + + +static void test_sabotage_other_success(CuTest *tc) { + unit *u, *u2; + region *r; + order *ord; + + setup_sabotage(); + r = test_create_region(0, 0, NULL); + assert(r); + u = test_create_unit(test_create_faction(NULL), r); + u2 = test_create_unit(test_create_faction(NULL), r); + assert(u && u2); + u2->ship = test_create_ship(r, test_create_shiptype("boat")); + assert(u2->ship); + u->ship = u2->ship; + ship_update_owner(u->ship); + assert(ship_owner(u->ship) == u); + ord = create_order(K_SABOTAGE, u->faction->locale, "SCHIFF"); + assert(ord); + set_level(u2, SK_SPY, 1); + CuAssertIntEquals(tc, 0, sabotage_cmd(u2, ord)); + CuAssertPtrEquals(tc, 0, r->ships); + test_cleanup(); +} CuSuite *get_spy_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_simple_spy_message); SUITE_ADD_TEST(suite, test_all_spy_message); SUITE_ADD_TEST(suite, test_sabotage_self); + SUITE_ADD_TEST(suite, test_sabotage_other_fail); + SUITE_ADD_TEST(suite, test_sabotage_other_success); return suite; } From 391a123a3ed3a1eeac5885b9dda7c762e9c58d88 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 14:42:07 +0200 Subject: [PATCH 08/12] test that correct messages are sent to correct factions. --- src/kernel/ship.c | 5 +---- src/spy.test.c | 6 ++++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/kernel/ship.c b/src/kernel/ship.c index c5aded3cd..a01326bdd 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -435,10 +435,7 @@ void write_ship_reference(const struct ship *sh, struct storage *store) void ship_setname(ship * self, const char *name) { free(self->name); - if (name) - self->name = _strdup(name); - else - self->name = NULL; + self->name = name ? _strdup(name) : 0; } const char *ship_getname(const ship * self) diff --git a/src/spy.test.c b/src/spy.test.c index 7f97eb171..085cc5675 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -136,6 +136,7 @@ static void test_sabotage_other_fail(CuTest *tc) { unit *u, *u2; region *r; order *ord; + message *msg; setup_sabotage(); r = test_create_region(0, 0, NULL); @@ -151,6 +152,10 @@ static void test_sabotage_other_fail(CuTest *tc) { ord = create_order(K_SABOTAGE, u->faction->locale, "SCHIFF"); assert(ord); CuAssertIntEquals(tc, 0, sabotage_cmd(u2, ord)); + msg = test_get_last_message(u2->faction->msgs); + CuAssertStrEquals(tc, "destroy_ship_1", test_get_messagetype(msg)); + msg = test_get_last_message(u->faction->msgs); + CuAssertStrEquals(tc, "destroy_ship_3", test_get_messagetype(msg)); CuAssertPtrNotNull(tc, r->ships); test_cleanup(); } @@ -179,6 +184,7 @@ static void test_sabotage_other_success(CuTest *tc) { CuAssertPtrEquals(tc, 0, r->ships); test_cleanup(); } + CuSuite *get_spy_suite(void) { CuSuite *suite = CuSuiteNew(); From 3a0504a72db12b65c584f99537b53b521fc1c04b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 15:13:06 +0200 Subject: [PATCH 09/12] test travis/slack integration --- .travis.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3d824ab3a..741757f02 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,17 @@ language: c compiler: - - gcc - - clang +- gcc +- clang before_install: - - sudo apt-get update -qq +- sudo apt-get update -qq install: - - sudo apt-get install -qq zlib1g-dev libtolua-dev liblua5.1-dev libncurses5-dev libsqlite3-dev libxml2-dev valgrind clang +- sudo apt-get install -qq zlib1g-dev libtolua-dev liblua5.1-dev libncurses5-dev libsqlite3-dev + libxml2-dev valgrind clang script: - - s/travis-build +- s/travis-build os: - - linux - - osx +- linux +- osx +notifications: + slack: + secure: Ha/kqXxCUqmI+gy0F2OFyCrCYauT/dYfWqjjMb9faqcWj/rP2iLnMMi1k2DEKFyP+g79cx6dCjedBQbJgqE3ZDrEnci2GVTLPorWpJ56EoHvzE7bH1sphAlfyxS6Lxm44OSLTegj9ZbRnPcGNYZ+TJuGiGKGN7RLWq0riZHwvps= From 7912418b1f49ffa1b91997dce1688dac5cb4763b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 15:34:11 +0200 Subject: [PATCH 10/12] Revert "test travis/slack integration" This reverts commit 3a0504a72db12b65c584f99537b53b521fc1c04b. --- .travis.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 741757f02..3d824ab3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,13 @@ language: c compiler: -- gcc -- clang + - gcc + - clang before_install: -- sudo apt-get update -qq + - sudo apt-get update -qq install: -- sudo apt-get install -qq zlib1g-dev libtolua-dev liblua5.1-dev libncurses5-dev libsqlite3-dev - libxml2-dev valgrind clang + - sudo apt-get install -qq zlib1g-dev libtolua-dev liblua5.1-dev libncurses5-dev libsqlite3-dev libxml2-dev valgrind clang script: -- s/travis-build + - s/travis-build os: -- linux -- osx -notifications: - slack: - secure: Ha/kqXxCUqmI+gy0F2OFyCrCYauT/dYfWqjjMb9faqcWj/rP2iLnMMi1k2DEKFyP+g79cx6dCjedBQbJgqE3ZDrEnci2GVTLPorWpJ56EoHvzE7bH1sphAlfyxS6Lxm44OSLTegj9ZbRnPcGNYZ+TJuGiGKGN7RLWq0riZHwvps= + - linux + - osx From 7400f614a684e5f5a45c8c1806f9491dc35b81e0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 15:36:21 +0200 Subject: [PATCH 11/12] do not notify slack from my personal fork (this is crazy hard). --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b94f25302..3d824ab3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,3 @@ script: os: - linux - osx -notifications: - slack: - secure: F89aXLWaE125PaJIlETv12jT4EfH6wLXJmGCPZzrN3OcLn2ahDWqjwuzR7lOEDf2nAISmeMPyDZMhEHXLNHAE5qP6lg9yliYQw5hzGmDK9m1xUq/pPEne/b2Y7K3my1mkRZ6n3asbHgSmBWAfCIk1JN8R5Rv+rmbLuWLc+zofts= From 35c60eb0dece27352eccf395559b3b0552b2add8 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 7 Jul 2015 15:41:41 +0200 Subject: [PATCH 12/12] Revert "do not notify slack from my personal fork (this is crazy hard)." This reverts commit 7400f614a684e5f5a45c8c1806f9491dc35b81e0. I have an open PR that I made from my develop branch, which is terrible, so this change accidentally got into it. have to fix... --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 3d824ab3a..b94f25302 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,3 +11,6 @@ script: os: - linux - osx +notifications: + slack: + secure: F89aXLWaE125PaJIlETv12jT4EfH6wLXJmGCPZzrN3OcLn2ahDWqjwuzR7lOEDf2nAISmeMPyDZMhEHXLNHAE5qP6lg9yliYQw5hzGmDK9m1xUq/pPEne/b2Y7K3my1mkRZ6n3asbHgSmBWAfCIk1JN8R5Rv+rmbLuWLc+zofts=