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

View File

@ -58,6 +58,7 @@
#include <skill.h>
#include <teleport.h>
#include <unit.h>
#include <ugroup.h>
/* util includes */
#include <goodies.h>
@ -675,33 +676,58 @@ 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;
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){
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(ug) {
int i;
for(i=0; i<ug->members; 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);
}
}
}
}
static void

View File

@ -32,6 +32,7 @@
#include "ship.h"
#include "race.h"
#include "magic.h"
#include "ugroup.h"
/* util includes */
#include <base36.h>
@ -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 ? '+' : '-')));
}

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_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[];

View File

@ -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 <config.h>
@ -21,9 +21,23 @@
#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
(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)
{

View File

@ -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