- Verbände, nächster Schritt

This commit is contained in:
Christian Schlittchen 2001-04-28 15:39:13 +00:00
parent b94f10c44b
commit a9efe2898e
6 changed files with 234 additions and 20 deletions

View File

@ -58,6 +58,7 @@
#include <pool.h> #include <pool.h>
#include <building.h> #include <building.h>
#include <group.h> #include <group.h>
#include <ugroup.h>
/* attributes includes */ /* attributes includes */
#include <attributes/racename.h> #include <attributes/racename.h>
@ -3034,6 +3035,9 @@ processorders (void)
puts(" - Jihads setzen"); puts(" - Jihads setzen");
set_jihad(); set_jihad();
puts(" - Verbände bilden");
ugroups();
puts(" - Einheiten Sortieren"); puts(" - Einheiten Sortieren");
reorder(); reorder();
puts(" - Neue Nummern"); puts(" - Neue Nummern");

View File

@ -58,6 +58,7 @@
#include <skill.h> #include <skill.h>
#include <teleport.h> #include <teleport.h>
#include <unit.h> #include <unit.h>
#include <ugroup.h>
/* util includes */ /* util includes */
#include <goodies.h> #include <goodies.h>
@ -675,31 +676,56 @@ rps_nowrap(FILE * F, const char *s)
} }
} }
int rpu = 0;
static void static void
rpunit(FILE * F, const faction * f, const unit * u, int indent, int mode) rpunit(FILE * F, const faction * f, const unit * u, int indent, int mode)
{ {
strlist *S; strlist *S;
int dh; int dh;
boolean isbattle = (boolean)(mode == see_battle); boolean isbattle = (boolean)(mode == see_battle);
++rpu; ugroup *ug = findugroup(u);
if(u->race == RC_SPELL) if(u->race == RC_SPELL) return;
return;
rnl(F); if(isbattle || ug) {
if(is_ugroupleader(u, ug)) {
dh = bufunit(f, u, indent, mode); 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 ? '+' : '-'))); rparagraph(F, buf, indent, (char) ((u->faction == f) ? '*' : (dh ? '+' : '-')));
if(!isbattle){ if(!isbattle){
print_curses(F, u, TYP_UNIT, u->attribs, (u->faction == f)? 1 : 0, indent); if(ug) {
int i;
for(i=0; i<ug->members; 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) { if(ug) {
for (S = u->botschaften; S; S = S->next) { int i;
rnl(F); for(i=0; i<ug->members; i++) {
rparagraph(F, S->s, indent, 0); 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);
}
} }
} }
} }

View File

@ -32,6 +32,7 @@
#include "ship.h" #include "ship.h"
#include "race.h" #include "race.h"
#include "magic.h" #include "magic.h"
#include "ugroup.h"
/* util includes */ /* util includes */
#include <base36.h> #include <base36.h>
@ -175,8 +176,7 @@ report_item(const unit * owner, const item * i, const faction * viewer, const ch
} }
int int
bufunit(const faction * f, const unit * u, int indent, bufunit(const faction * f, const unit * u, int indent, int mode)
int mode)
{ {
int i, dh; int i, dh;
skill_t sk; skill_t sk;
@ -227,6 +227,7 @@ bufunit(const faction * f, const unit * u, int indent,
} }
scat(", "); scat(", ");
if(u->faction != f && a_fshidden if(u->faction != f && a_fshidden
&& a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) { && a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) {
scat("? "); scat("? ");
@ -434,6 +435,160 @@ bufunit(const faction * f, const unit * u, int indent,
return dh; 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 void
spskill(const struct locale * lang, const struct unit * u, skill_t sk, int *dh, int days) 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, spunit(struct strlist ** SP, const struct faction * f, const unit * u, int indent,
int mode) int mode)
{ {
int dh = bufunit(f, u, indent, mode); int dh;
assert(SP); 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 ? '+' : '-'))); lparagraph(SP, buf, indent, (char) ((u->faction == f) ? '*' : (dh ? '+' : '-')));
} }

View File

@ -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_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 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(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 *neue_gebiete[];
extern const char *coasts[]; extern const char *coasts[];

View File

@ -8,7 +8,7 @@
This program may not be used, modified or distributed This program may not be used, modified or distributed
without prior permission by the authors of Eressea. 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 <config.h> #include <config.h>
@ -21,9 +21,23 @@
#include <stdlib.h> #include <stdlib.h>
/* TODO:
* - Anzeige (CR)
* - Speicherung
* - Evt. NACH (Betrete/Verlasse?) des Leaders vererben auf Members.
* - Routine zur automatisch Aufsplittung.
*/
/* Nur die erste Einheit in der Liste /* Nur die erste Einheit in der Liste
(ugroup->unit_array[0] == u) kann NACH ausführen. */ (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 * ugroup *
findugroupid(faction *f, int id) findugroupid(faction *f, int id)
{ {

View File

@ -8,7 +8,7 @@
This program may not be used, modified or distributed This program may not be used, modified or distributed
without prior permission by the authors of Eressea. 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 #ifndef UGROUP_H
@ -23,7 +23,11 @@ typedef struct ugroup {
struct ugroup *next; struct ugroup *next;
int id; int id;
int members; int members;
unit **unit_array; struct unit **unit_array;
} ugroup; } ugroup;
boolean is_ugroupleader(struct unit *u, struct ugroup *ug);
ugroup *findugroup(struct unit *u);
void ugroups(void);
#endif #endif