diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index dae094d16..939d23c42 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -58,6 +58,7 @@ #include #include #include +#include /* attributes includes */ #include @@ -3034,6 +3035,9 @@ processorders (void) puts(" - Jihads setzen"); set_jihad(); + puts(" - Verbände bilden"); + ugroups(); + puts(" - Einheiten Sortieren"); reorder(); puts(" - Neue Nummern"); diff --git a/src/common/gamecode/report.c b/src/common/gamecode/report.c index 77059f412..d88d220ff 100644 --- a/src/common/gamecode/report.c +++ b/src/common/gamecode/report.c @@ -58,6 +58,7 @@ #include #include #include +#include /* util includes */ #include @@ -675,31 +676,56 @@ rps_nowrap(FILE * F, const char *s) } } -int rpu = 0; - static void rpunit(FILE * F, const faction * f, const unit * u, int indent, int mode) { strlist *S; int dh; boolean isbattle = (boolean)(mode == see_battle); - ++rpu; + ugroup *ug = findugroup(u); - if(u->race == RC_SPELL) - return; + if(u->race == RC_SPELL) return; - rnl(F); - - dh = bufunit(f, u, indent, mode); + if(isbattle || ug) { + if(is_ugroupleader(u, ug)) { + rnl(F); + dh = bufunit_ugroupleader(f, u, indent, mode); + } else { + return; + } + } else { + rnl(F); + dh = bufunit(f, u, indent, mode); + } rparagraph(F, buf, indent, (char) ((u->faction == f) ? '*' : (dh ? '+' : '-'))); + if(!isbattle){ - print_curses(F, u, TYP_UNIT, u->attribs, (u->faction == f)? 1 : 0, indent); + if(ug) { + int i; + for(i=0; imembers; i++) { + print_curses(F, u, TYP_UNIT, ug->unit_array[i]->attribs, (u->faction == f)? 1 : 0, indent); + } + } else { + print_curses(F, u, TYP_UNIT, u->attribs, (u->faction == f)? 1 : 0, indent); + } } - if (mode==see_unit && u->faction == f && u->botschaften) { - for (S = u->botschaften; S; S = S->next) { - rnl(F); - rparagraph(F, S->s, indent, 0); + if(ug) { + int i; + for(i=0; imembers; i++) { + if (mode==see_unit && ug->unit_array[i]->faction == f && ug->unit_array[i]->botschaften) { + for (S = ug->unit_array[i]->botschaften; S; S = S->next) { + rnl(F); + rparagraph(F, S->s, indent, 0); + } + } + } + } else { + if (mode==see_unit && u->faction == f && u->botschaften) { + for (S = u->botschaften; S; S = S->next) { + rnl(F); + rparagraph(F, S->s, indent, 0); + } } } } diff --git a/src/common/kernel/reports.c b/src/common/kernel/reports.c index 3140bdd57..eb5e8c271 100644 --- a/src/common/kernel/reports.c +++ b/src/common/kernel/reports.c @@ -32,6 +32,7 @@ #include "ship.h" #include "race.h" #include "magic.h" +#include "ugroup.h" /* util includes */ #include @@ -175,8 +176,7 @@ report_item(const unit * owner, const item * i, const faction * viewer, const ch } int -bufunit(const faction * f, const unit * u, int indent, - int mode) +bufunit(const faction * f, const unit * u, int indent, int mode) { int i, dh; skill_t sk; @@ -227,6 +227,7 @@ bufunit(const faction * f, const unit * u, int indent, } scat(", "); + if(u->faction != f && a_fshidden && a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) { scat("? "); @@ -434,6 +435,160 @@ bufunit(const faction * f, const unit * u, int indent, return dh; } +/* TODO: telepath_see wird nicht berücksichtigt: Parteien mit + * telepath_see sollten immer einzelne Einheiten zu sehen + * bekommen, alles andere ist darstellungsteschnisch kompliziert. + */ + +int +bufunit_ugroupleader(const faction * f, const unit * u, int indent, int mode) +{ + int i, dh; + int getarnt = fval(u, FL_PARTEITARNUNG); + attrib *a_otherfaction = NULL; + const char *pzTmp; + boolean itemcloak = is_cursed(u->attribs, C_ITEMCLOAK, 0); + attrib *a_fshidden = NULL; + item * itm; + item * show; + ugroup *ug = findugroup(u); + boolean guards = false; + boolean sieges = false; + + if(fspecial(u->faction, FS_HIDDEN)) + a_fshidden = a_find(u->attribs, &at_fshidden); + + strcpy(buf, u->name); + + a_otherfaction = a_find(u->attribs, &at_otherfaction); + + if (getarnt) { + scat(", parteigetarnt"); + } else if(a_otherfaction) { + scat(", "); + scat(factionname(findfaction(a_otherfaction->data.i))); + } else { + scat(", "); + scat(factionname(u->faction)); + } + + scat(", "); + + for(i = 0; i < ug->members; i++) { + unit *uc = ug->unit_array[i]; + if(uc->faction != f && a_fshidden + && a_fshidden->data.ca[0] == 1 && effskill(uc, SK_STEALTH) >= 6) { + scat("? "); + } else { + icat(uc->number); + scat(" "); + } + pzTmp = get_racename(uc->attribs); + if (pzTmp || u->irace != uc->race) { + if (pzTmp) + scat(pzTmp); + else + scat(locale_string(f->locale, race[uc->irace].name[uc->number != 1])); + scat(" ("); + scat(itoa36(uc->no)); + scat("), "); + } else { + scat(locale_string(f->locale, race[uc->race].name[uc->number != 1])); + scat(" ("); + scat(itoa36(uc->no)); + scat("), "); + } + if(getguard(uc)) guards = true; + if(usiege(uc)) sieges = true; + } + + if(guards == true) scat(", bewacht die Region"); + + if(sieges == true) { + scat(", belagert "); + for(i = 0; i < ug->members; i++) { + building *b = usiege(ug->unit_array[i]); + if(b) { + scat(buildingname(b)); + scat(", "); + } + } + } + + dh = 0; + show = NULL; + for(i = 0; i < ug->members; i++) { + unit *uc = ug->unit_array[i]; + if(!itemcloak && mode >= see_unit && !(a_fshidden + && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { + for (itm=uc->items;itm;itm=itm->next) { + item *ishow; + const char * ic; + int in; + report_item(u, itm, f, NULL, &ic, &in, false); + if (ic && *ic && in>0) { + for (ishow = show; ishow; ishow=ishow->next) { + const char * sc; + int sn; + if (ishow->type==itm->type) sc=ic; + else report_item(u, ishow, f, NULL, &sc, &sn, false); + if (sc==ic || strcmp(sc, ic)==0) { + ishow->number+=itm->number; + break; + } + } + if (ishow==NULL) { + ishow = i_add(&show, i_new(itm->type)); + ishow->number = itm->number; + } + } + } + } + } + for (itm=show; itm; itm=itm->next) { + const char * ic; + int in; + report_item(u, itm, f, &ic, NULL, &in, false); + if (in==0 || ic==NULL) continue; + scat(", "); + + if (!dh) { + sprintf(buf+strlen(buf), "%s: ", LOC(f->locale, "nr_inventory")); + dh = 1; + } + if (in == 1) { + scat(ic); + } else { + icat(in); + scat(" "); + scat(ic); + } + } + if(show) while(show) i_free(i_remove(&show, show)); + + i = 0; + if (u->display[0]) { + scat("; "); + scat(u->display); + + i = u->display[strlen(u->display) - 1]; + } + if (i != '!' && i != '?' && i != '.') + scat("."); + + dh=0; + if (!getarnt && f && f->allies) { + ally *sf; + for (sf = f->allies; sf && !dh; sf = sf->next) { + if (sf->status > 0 && sf->status <= HELP_ALL && sf->faction == u->faction) { + dh = 1; + } + } + } + return dh; +} + + void spskill(const struct locale * lang, const struct unit * u, skill_t sk, int *dh, int days) { @@ -500,8 +655,18 @@ void spunit(struct strlist ** SP, const struct faction * f, const unit * u, int indent, int mode) { - int dh = bufunit(f, u, indent, mode); - assert(SP); + int dh; + ugroup *ug = findugroup(u); + + if(ug) { + if(is_ugroupleader(u, ug)) { + dh = bufunit_ugroupleader(f, u, indent, mode); + } else { + return; + } + } else { + dh = bufunit(f, u, indent, mode); + } lparagraph(SP, buf, indent, (char) ((u->faction == f) ? '*' : (dh ? '+' : '-'))); } diff --git a/src/common/kernel/reports.h b/src/common/kernel/reports.h index ee7ae168b..f44b2b344 100644 --- a/src/common/kernel/reports.h +++ b/src/common/kernel/reports.h @@ -107,6 +107,7 @@ extern int months_per_year; extern void report_item(const struct unit * owner, const struct item * i, const struct faction * viewer, const char ** name, const char ** basename, int * number, boolean singular); extern void report_building(FILE *F, const struct region * r, const struct building * b, const struct faction * f, int mode); extern int bufunit(const struct faction * f, const struct unit * u, int indent, int mode); +extern int bufunit_ugroupleader(const struct faction * f, const struct unit * u, int indent, int mode); extern const char *neue_gebiete[]; extern const char *coasts[]; diff --git a/src/common/kernel/ugroup.c b/src/common/kernel/ugroup.c index 2589021f0..99dd93c17 100644 --- a/src/common/kernel/ugroup.c +++ b/src/common/kernel/ugroup.c @@ -8,7 +8,7 @@ This program may not be used, modified or distributed without prior permission by the authors of Eressea. - $Id: ugroup.c,v 1.1 2001/04/28 12:03:12 corwin Exp $ + $Id: ugroup.c,v 1.2 2001/04/28 15:39:13 corwin Exp $ */ #include @@ -21,9 +21,23 @@ #include +/* TODO: + * - Anzeige (CR) + * - Speicherung + * - Evt. NACH (Betrete/Verlasse?) des Leaders vererben auf Members. + * - Routine zur automatisch Aufsplittung. + */ + /* Nur die erste Einheit in der Liste (ugroup->unit_array[0] == u) kann NACH ausführen. */ +boolean +is_ugroupleader(unit *u, ugroup *ug) +{ + if(ug->unit_array[0] == u) return true; + return false; +} + ugroup * findugroupid(faction *f, int id) { diff --git a/src/common/kernel/ugroup.h b/src/common/kernel/ugroup.h index 20593d190..508cd1cad 100644 --- a/src/common/kernel/ugroup.h +++ b/src/common/kernel/ugroup.h @@ -8,7 +8,7 @@ This program may not be used, modified or distributed without prior permission by the authors of Eressea. - $Id: ugroup.h,v 1.1 2001/04/28 12:03:12 corwin Exp $ + $Id: ugroup.h,v 1.2 2001/04/28 15:39:13 corwin Exp $ */ #ifndef UGROUP_H @@ -23,7 +23,11 @@ typedef struct ugroup { struct ugroup *next; int id; int members; - unit **unit_array; + struct unit **unit_array; } ugroup; +boolean is_ugroupleader(struct unit *u, struct ugroup *ug); +ugroup *findugroup(struct unit *u); +void ugroups(void); + #endif