diff --git a/src/common/gamecode/creport.c b/src/common/gamecode/creport.c index 6f3ef3c23..4f5b016de 100644 --- a/src/common/gamecode/creport.c +++ b/src/common/gamecode/creport.c @@ -1443,7 +1443,7 @@ report_computer(FILE * F, faction * f, struct seen_region ** seen, const faction /* describe both passed and inhabited regions */ show_active_spells(r); - { + if (fval(r, RF_TRAVELUNIT)) { boolean seeunits = false, seeships = false; const attrib * ru; /* show units pulled through region */ diff --git a/src/common/gamecode/report.c b/src/common/gamecode/report.c index 9735bc2b3..074d8386f 100644 --- a/src/common/gamecode/report.c +++ b/src/common/gamecode/report.c @@ -1434,24 +1434,26 @@ static void durchreisende(FILE * F, const region * r, const faction * f) { attrib *ru; - int wieviele; + int maxtravel; int counter; - wieviele = counter = 0; + maxtravel = counter = 0; /* Wieviele sind aufzulisten? Für die Grammatik. */ - for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { - unit * u = (unit*)ru->data.v; - if (cansee_durchgezogen(f, r, u, 0) > 0 && r!=u->region) { - if (u->ship && !fval(u, UFL_OWNER)) - continue; - wieviele++; - } - } + if (fval(r, RF_TRAVELUNIT)) { + for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { + unit * u = (unit*)ru->data.v; + if (cansee_durchgezogen(f, r, u, 0) > 0 && r!=u->region) { + if (u->ship && !fval(u, UFL_OWNER)) + continue; + maxtravel++; + } + } - if (!wieviele) - return; + if (!maxtravel) + return; + } else return; /* Auflisten. */ @@ -1474,15 +1476,15 @@ durchreisende(FILE * F, const region * r, const faction * f) } else { scat(unitname(u)); } - if (counter + 1 < wieviele) { + if (counter + 1 < maxtravel) { scat(", "); - } else if (counter + 1 == wieviele) { + } else if (counter + 1 == maxtravel) { scat(" und "); } } } - if (wieviele == 1) { + if (maxtravel == 1) { scat(" hat die Region durchquert."); rparagraph(F, buf, 0, 0); } else { @@ -2636,11 +2638,13 @@ prepare_report(faction * f) free_regionlist(rlist); } - if (modeattribs, &at_travelunit); ru; ru = ru->nexttype) { - unit * u = (unit*)ru->data.v; - if (u->faction == f) { - mode = see_travel; - break; + if (modeattribs, &at_travelunit); ru; ru = ru->nexttype) { + unit * u = (unit*)ru->data.v; + if (u->faction == f) { + mode = see_travel; + break; + } } } diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index 29235f006..4b72b23dd 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -689,39 +689,39 @@ weapon_effskill(troop t, troop enemy, const weapon * w, boolean attacking, boole int skill; const weapon_type * wtype = w?w->type:NULL; - if (wtype==NULL) { - /* Ohne Waffe: Waffenlose Angriffe */ - skill = weapon_skill(NULL, tu, attacking); - } else { - if (attacking) { - skill = w->attackskill; - } else { - skill = w->defenseskill; - } - if (wtype->modifiers!=NULL) { - /* Pferdebonus, Lanzenbonus, usw. */ - int m; - unsigned int flags = WMF_SKILL|(attacking?WMF_OFFENSIVE:WMF_DEFENSIVE); + if (wtype==NULL) { + /* Ohne Waffe: Waffenlose Angriffe */ + skill = weapon_skill(NULL, tu, attacking); + } else { + if (attacking) { + skill = w->attackskill; + } else { + skill = w->defenseskill; + } + if (wtype->modifiers!=NULL) { + /* Pferdebonus, Lanzenbonus, usw. */ + int m; + unsigned int flags = WMF_SKILL|(attacking?WMF_OFFENSIVE:WMF_DEFENSIVE); - if (riding(t)) flags |= WMF_RIDING; - else flags |= WMF_WALKING; - if (riding(enemy)) flags |= WMF_AGAINST_RIDING; - else flags |= WMF_AGAINST_WALKING; + if (riding(t)) flags |= WMF_RIDING; + else flags |= WMF_WALKING; + if (riding(enemy)) flags |= WMF_AGAINST_RIDING; + else flags |= WMF_AGAINST_WALKING; - for (m=0;wtype->modifiers[m].value;++m) { - if ((wtype->modifiers[m].flags & flags) == flags) { - race_list * rlist = wtype->modifiers[m].races; - if (rlist!=NULL) { - while (rlist) { - if (rlist->data == tu->race) break; - rlist = rlist->next; - } - if (rlist==NULL) continue; - } - skill += wtype->modifiers[m].value; - } - } - } + for (m=0;wtype->modifiers[m].value;++m) { + if ((wtype->modifiers[m].flags & flags) == flags) { + race_list * rlist = wtype->modifiers[m].races; + if (rlist!=NULL) { + while (rlist) { + if (rlist->data == tu->race) break; + rlist = rlist->next; + } + if (rlist==NULL) continue; + } + skill += wtype->modifiers[m].value; + } + } + } } /* Burgenbonus, Pferdebonus */ diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index e5c89b887..1525abcce 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -978,20 +978,21 @@ int alliedgroup(const struct plane * pl, const struct faction * f, const struct faction * f2, const struct ally * sf, int mode) { - attrib *a; while (sf && sf->faction!=f2) sf=sf->next; if (sf==NULL) { mode = mode & autoalliance(pl, f, f2); } mode = ally_mode(sf, mode) | (mode & autoalliance(pl, f, f2)); - if((a = a_find(f->attribs, &at_npcfaction)) != NULL) { - return mode; - } - if((a = a_find(f2->attribs, &at_npcfaction)) != NULL) { - return mode; - } - if (AllianceRestricted() && f->alliance!=f2->alliance) { - mode &= ~AllianceRestricted(); + if (AllianceRestricted()) { + if (a_findc(f->attribs, &at_npcfaction)) { + return mode; + } + if (a_findc(f2->attribs, &at_npcfaction)) { + return mode; + } + if (f->alliance!=f2->alliance) { + mode &= ~AllianceRestricted(); + } } return mode; } @@ -2152,14 +2153,16 @@ lastregion (faction * f) if (f->last == r) continue; #endif /* search the region for travelthru-attributes: */ - for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { - u = (unit*)ru->data.v; - if (u->faction == f) { - f->last = r; - break; - } - } - if (f->last == r) continue; + if (fval(r, RF_TRAVELUNIT)) { + for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { + u = (unit*)ru->data.v; + if (u->faction == f) { + f->last = r; + break; + } + } + } + if (f->last == r) continue; if (check_leuchtturm(r, f)) f->last = r; if (p && is_watcher(p, f)) { @@ -2193,11 +2196,13 @@ firstregion (faction * f) } if (f->first == r->next) continue; - for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { - u = (unit*)ru->data.v; - if (u->faction == f) { - return f->first = r; - } + if (fval(r, RF_TRAVELUNIT)) { + for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { + u = (unit*)ru->data.v; + if (u->faction == f) { + return f->first = r; + } + } } if (check_leuchtturm(r, f)) { return f->first = r; @@ -2452,7 +2457,7 @@ attrib_type at_germs = { /*********************/ /* at_guard */ /*********************/ -static attrib_type at_guard = { +attrib_type at_guard = { "guard", DEFAULT_INIT, DEFAULT_FINALIZE, @@ -2466,11 +2471,16 @@ void setguard(unit * u, unsigned int flags) { /* setzt die guard-flags der Einheit */ - attrib * a = a_find(u->attribs, &at_guard); - if(flags == GUARD_NONE) { - if(a) a_remove(&u->attribs, a); + attrib * a = NULL; + if (fval(u, UFL_GUARD)) { + a = a_find(u->attribs, &at_guard); + } + if (flags == GUARD_NONE) { + freset(u, UFL_GUARD); + if (a) a_remove(&u->attribs, a); return; } + fset(u, UFL_GUARD); if (!a) a = a_add(&u->attribs, a_new(&at_guard)); a->data.i = (int)flags; } @@ -2478,11 +2488,12 @@ setguard(unit * u, unsigned int flags) unsigned int getguard(const unit * u) { - attrib *a; - if(u->region->terrain == T_OCEAN) return GUARD_NONE; - a = a_find(u->attribs, &at_guard); - if (a) return (unsigned int)a->data.i; + if (u->region->terrain == T_OCEAN) return GUARD_NONE; + if (fval(u, UFL_GUARD)) { + attrib * a = a_find(u->attribs, &at_guard); + if (a) return (unsigned int)a->data.i; + } return GUARD_NONE; } diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h index ea060f238..30edd5371 100644 --- a/src/common/kernel/eressea.h +++ b/src/common/kernel/eressea.h @@ -1187,6 +1187,7 @@ extern int entertainmoney(const struct region * r); extern int freadstr(FILE * F, char * str, size_t size); extern int fwritestr(FILE * F, const char * str); +extern attrib_type at_guard; #ifdef __cplusplus } #endif diff --git a/src/common/kernel/movement.c b/src/common/kernel/movement.c index ef223c9b8..36c10b673 100644 --- a/src/common/kernel/movement.c +++ b/src/common/kernel/movement.c @@ -498,6 +498,8 @@ travelthru(const unit * u, region * r) { attrib *ru = a_add(&r->attribs, a_new(&at_travelunit)); + fset(r, RF_TRAVELUNIT); + ru->data.v = (void*)u; /* the first and last region of the faction gets reset, because travelthrough diff --git a/src/common/kernel/region.h b/src/common/kernel/region.h index d14b1b2a2..532a83ebc 100644 --- a/src/common/kernel/region.h +++ b/src/common/kernel/region.h @@ -50,6 +50,9 @@ extern "C" { #define RF_DH (1<<18) +/* flags that speed up attribute access: */ +#define RF_TRAVELUNIT (1<<19) + #define RF_ALL 0xFFFFFF #define RF_SAVEMASK (RF_CHAOTIC|RF_MALLORN|RF_BLOCKED|RF_BLOCK_NORTHWEST|RF_BLOCK_NORTHEAST|RF_BLOCK_EAST|RF_BLOCK_SOUTHEAST|RF_BLOCK_SOUTHWEST|RF_BLOCK_WEST|RF_ENCOUNTER|RF_ORCIFIED) diff --git a/src/common/kernel/unit.c b/src/common/kernel/unit.c index 8cf5e6458..3ccdaa63a 100644 --- a/src/common/kernel/unit.c +++ b/src/common/kernel/unit.c @@ -1038,7 +1038,7 @@ get_modifier(const unit *u, skill_t sk, int level, const region *r, boolean noit skill += rc_skillmod(u->race, r, sk); skill += att_modification(u, sk); - if(noitem == false) { + if (noitem == false) { skill = item_modification(u, sk, skill); } skill = skillmod(u->attribs, u, r, sk, skill, SMF_ALWAYS); diff --git a/src/common/kernel/unit.h b/src/common/kernel/unit.h index b64b41b54..55b11a9f5 100644 --- a/src/common/kernel/unit.h +++ b/src/common/kernel/unit.h @@ -57,11 +57,14 @@ struct skill; #define UFL_ORDERS (1<<24) /* Einheit hat Befehle erhalten */ #define UFL_TAKEALL (1<<25) /* Einheit nimmt alle Gegenstände an */ +/* flags that speed up attribute access: */ +#define UFL_GUARD (1<<27) + /* Flags, die gespeichert werden sollen: */ #ifndef HEROES -# define UFL_SAVEMASK (UFL_MOVED | UFL_NOAID | UFL_OWNER | UFL_PARTEITARNUNG | UFL_LOCKED | UFL_HUNGER | UFL_TAKEALL) +# define UFL_SAVEMASK (UFL_MOVED | UFL_NOAID | UFL_OWNER | UFL_PARTEITARNUNG | UFL_LOCKED | UFL_HUNGER | UFL_TAKEALL | UFL_GUARD) #else -# define UFL_SAVEMASK (UFL_MOVED | UFL_NOAID | UFL_OWNER | UFL_PARTEITARNUNG | UFL_LOCKED | UFL_HUNGER | UFL_TAKEALL | UFL_HERO) +# define UFL_SAVEMASK (UFL_MOVED | UFL_NOAID | UFL_OWNER | UFL_PARTEITARNUNG | UFL_LOCKED | UFL_HUNGER | UFL_TAKEALL | UFL_GUARD | UFL_HERO) #endif #define UNIT_MAXSIZE 50000 diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c index 66a49c398..a5776898d 100644 --- a/src/eressea/korrektur.c +++ b/src/eressea/korrektur.c @@ -1012,6 +1012,25 @@ nothing(void) return 0; } +static int +fix_attribflags(void) +{ + region * r; + for (r = regions; r; r=r->next) { + unit * u = r->units; + for (u=r->units;u!=NULL;u=u->next) { + const attrib *a = r->attribs; + while (a) { + if (a->type!=&at_guard) { + fset(u, UFL_GUARD); + } + a = a->next; + return a; + } + } + } +} + static int fix_chaosgates(void) { @@ -1051,6 +1070,7 @@ korrektur(void) } do_once("chgt", fix_chaosgates()); + do_once("attr", fix_attribflags()); fix_astralplane(); fix_firewalls(); fix_gates(); @@ -1092,13 +1112,3 @@ korrektur(void) enable_fuzzy = true; #endif } - -void -korrektur_end(void) -{ -} - -void -init_conversion(void) -{ -} diff --git a/src/eressea/korrektur.h b/src/eressea/korrektur.h index 7107f1b42..e89365c1e 100644 --- a/src/eressea/korrektur.h +++ b/src/eressea/korrektur.h @@ -14,8 +14,7 @@ extern "C" { #endif extern void korrektur(void); - extern void korrektur_end(void); - extern void init_conversion(void); + #ifdef __cplusplus } #endif diff --git a/src/eressea/lua/eressea.cpp b/src/eressea/lua/eressea.cpp index e2b49249a..92cb56802 100644 --- a/src/eressea/lua/eressea.cpp +++ b/src/eressea/lua/eressea.cpp @@ -2,6 +2,7 @@ #include #include "script.h" +#include "../korrektur.h" #include #include @@ -52,7 +53,10 @@ get_turn(void) static int read_game(const char * filename) { - return readgame(filename, false); + int rv = readgame(filename, false); + printf(" - Korrekturen Runde %d\n", turn); + korrektur(); + return rv; } static int diff --git a/src/eressea/main.c b/src/eressea/main.c index 5ca586696..09f17e026 100644 --- a/src/eressea/main.c +++ b/src/eressea/main.c @@ -27,8 +27,6 @@ #include #include "eressea.h" -#include "korrektur.h" - /* initialization - TODO: init in separate module */ #include #include @@ -198,7 +196,6 @@ game_init(void) #ifdef INFOCMD_MODULE init_info(); #endif - init_conversion(); #ifdef MUSEUM_MODULE register_museum(); @@ -267,8 +264,6 @@ processturn(char *filename) readshortpwds("passwords"); #endif begin = make_summary(); - printf(" - Korrekturen Runde %d\n", turn); - korrektur(); turn++; if ((i=readorders(filename))!=0) return i; if (!nomonsters) { @@ -288,7 +283,6 @@ processturn(char *filename) } score(); remove_unequipped_guarded(); - korrektur_end(); if (!noreports) reports(); free_units(); puts(" - Beseitige leere Parteien"); diff --git a/src/eressea/server.cpp b/src/eressea/server.cpp index 377b403fa..a3c8171d2 100644 --- a/src/eressea/server.cpp +++ b/src/eressea/server.cpp @@ -28,7 +28,6 @@ #include #include -#include "korrektur.h" #include "console.h" /* initialization - TODO: init in separate module */ @@ -243,7 +242,6 @@ game_init(void) #ifdef INFOCMD_MODULE init_info(); #endif - init_conversion(); #ifdef REMOVE_THIS render_init(); @@ -361,13 +359,10 @@ process_orders() #ifdef SHORTPWDS readshortpwds("passwords"); #endif - printf(" - Korrekturen Runde %d\n", turn); - korrektur(); turn++; processorders(); score(); remove_unequipped_guarded(); - korrektur_end(); update_subscriptions(); return 0;