forked from github/server
- Erste Version der Verbände. Ungetestet und noch ohne Reportanzeige.
Committed, um ekelige Konflikte in messages.xml zu vermeiden.
This commit is contained in:
parent
1444fe66d4
commit
b94f10c44b
|
@ -0,0 +1,26 @@
|
|||
/* vi: set ts=2:
|
||||
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||
| | Enno Rehling <enno@eressea-pbem.de>
|
||||
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||
| (c) 1998 - 2001 | Henning Peters <faroul@beyond.kn-bremen.de>
|
||||
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
||||
+-------------------+ Stefan Reich <reich@halbling.de>
|
||||
|
||||
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 $
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "ugroup.h"
|
||||
#include <attrib.h>
|
||||
|
||||
attrib_type at_ugroup = {
|
||||
"ugroup", NULL, NULL, NULL, NULL, NULL, ATF_UNIQUE
|
||||
};
|
||||
|
||||
void
|
||||
init_ugroup(void)
|
||||
{
|
||||
at_register(&at_ugroup);
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
/* vi: set ts=2:
|
||||
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||
| | Enno Rehling <enno@eressea-pbem.de>
|
||||
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||
| (c) 1998 - 2001 | Henning Peters <faroul@beyond.kn-bremen.de>
|
||||
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
||||
+-------------------+ Stefan Reich <reich@halbling.de>
|
||||
|
||||
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 $
|
||||
*/
|
||||
|
||||
#ifndef AUGROUP_H
|
||||
#define AUGROUP_H
|
||||
|
||||
extern struct attrib_type at_ugroup;
|
||||
void init_ugroup(void);
|
||||
#endif
|
||||
|
|
@ -0,0 +1,182 @@
|
|||
/* vi: set ts=2:
|
||||
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||
| | Enno Rehling <enno@eressea-pbem.de>
|
||||
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||
| (c) 1998 - 2001 | Henning Peters <faroul@beyond.kn-bremen.de>
|
||||
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
||||
+-------------------+ Stefan Reich <reich@halbling.de>
|
||||
|
||||
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 $
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "eressea.h"
|
||||
#include "unit.h"
|
||||
#include "region.h"
|
||||
#include "faction.h"
|
||||
#include <kernel/ugroup.h>
|
||||
#include <attributes/ugroup.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Nur die erste Einheit in der Liste
|
||||
(ugroup->unit_array[0] == u) kann NACH ausführen. */
|
||||
|
||||
ugroup *
|
||||
findugroupid(faction *f, int id)
|
||||
{
|
||||
ugroup *ug;
|
||||
|
||||
for(ug=f->ugroups;ug; ug=ug->next) {
|
||||
if(ug->id == id) return ug;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ugroup *
|
||||
findugroup(unit *u)
|
||||
{
|
||||
attrib *a = a_find(u->attribs, &at_ugroup);
|
||||
if(!a) return NULL;
|
||||
return findugroupid(u->faction, a->data.i);
|
||||
}
|
||||
|
||||
static int
|
||||
ugroupfreeid(ugroup *ug)
|
||||
{
|
||||
ugroup *ug2;
|
||||
int id = 0;
|
||||
|
||||
ug2 = ug;
|
||||
|
||||
while(ug2) {
|
||||
if(ug2->id == id) {
|
||||
id++;
|
||||
ug2 = ug;
|
||||
} else {
|
||||
ug2 = ug2->next;
|
||||
}
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
ugroup *
|
||||
createugroup(unit *uleader, unit *umember)
|
||||
{
|
||||
ugroup *ug = calloc(1,sizeof(ugroup));
|
||||
|
||||
ug->id = ugroupfreeid(uleader->faction->ugroups);
|
||||
ug->members = 2;
|
||||
ug->unit_array = malloc(2 * sizeof(unit *));
|
||||
ug->unit_array[0] = uleader;
|
||||
a_add(&uleader->attribs, a_new(&at_ugroup))->data.i = ug->id;
|
||||
ug->unit_array[1] = umember;
|
||||
a_add(&umember->attribs, a_new(&at_ugroup))->data.i = ug->id;
|
||||
ug->next = uleader->faction->ugroups;
|
||||
uleader->faction->ugroups = ug;
|
||||
|
||||
return ug;
|
||||
}
|
||||
|
||||
void
|
||||
join_ugroup(unit *u, strlist *order)
|
||||
{
|
||||
unit *u2;
|
||||
ugroup *ug;
|
||||
|
||||
u2 = getunit(u->region, u->faction);
|
||||
if(!u2 || cansee(u->faction, u->region, u2, 0) == false) {
|
||||
cmistake(u, order->s, 63, MSG_EVENT);
|
||||
return;
|
||||
}
|
||||
if(u2 == u) {
|
||||
cmistake(u, order->s, 292, MSG_EVENT);
|
||||
return;
|
||||
}
|
||||
if(u2->faction != u->faction) {
|
||||
cmistake(u, order->s, 293, MSG_EVENT);
|
||||
return;
|
||||
}
|
||||
if(u2->building != u->building || u2->ship != u->ship) {
|
||||
cmistake(u, order->s, 294, MSG_EVENT);
|
||||
return;
|
||||
}
|
||||
if(a_find(u->attribs, &at_ugroup)) {
|
||||
cmistake(u, order->s, 290, MSG_EVENT);
|
||||
return;
|
||||
}
|
||||
|
||||
ug = findugroup(u2);
|
||||
|
||||
if(ug) {
|
||||
ug->members++;
|
||||
ug->unit_array = realloc(ug->unit_array,
|
||||
ug->members * sizeof(unit *));
|
||||
ug->unit_array[ug->members-1] = u;
|
||||
a_add(&u->attribs, a_new(&at_ugroup))->data.i = ug->id;
|
||||
} else {
|
||||
createugroup(u2, u);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
leave_ugroup(unit *u, strlist *order)
|
||||
{
|
||||
attrib *a = a_find(u->attribs, &at_ugroup);
|
||||
ugroup *ug;
|
||||
boolean found = false;
|
||||
int i;
|
||||
|
||||
if(!a) {
|
||||
cmistake(u, order->s, 286, MSG_EVENT);
|
||||
return;
|
||||
}
|
||||
|
||||
ug = findugroupid(u->faction, a->data.i);
|
||||
for(i=0; i<ug->members; i++) {
|
||||
if(found == true) {
|
||||
ug->unit_array[i-1] = ug->unit_array[i];
|
||||
} else if(ug->unit_array[i] == u) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
ug->members--;
|
||||
a_remove(&u->attribs, a);
|
||||
|
||||
if(ug->members == 1) {
|
||||
a_remove(&ug->unit_array[0]->attribs, a);
|
||||
free(ug->unit_array);
|
||||
removelist(&u->faction->ugroups, ug);
|
||||
} else {
|
||||
ug->unit_array = realloc(ug->unit_array,
|
||||
ug->members * sizeof(unit *));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ugroups(void)
|
||||
{
|
||||
region *r;
|
||||
unit *u;
|
||||
strlist *o;
|
||||
|
||||
for(r=regions; r; r=r->next) {
|
||||
for(u=r->units; u; u=u->next) {
|
||||
for(o = u->orders; o; o=o->next) {
|
||||
if(igetkeyword(o->s, u->faction->locale) == K_LEAVEUGROUP) {
|
||||
leave_ugroup(u, o);
|
||||
}
|
||||
}
|
||||
}
|
||||
for(u=r->units; u; u=u->next) {
|
||||
for(o = u->orders; o; o=o->next) {
|
||||
if(igetkeyword(o->s, u->faction->locale) == K_JOINUGROUP) {
|
||||
join_ugroup(u, o);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/* vi: set ts=2:
|
||||
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||
| | Enno Rehling <enno@eressea-pbem.de>
|
||||
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||
| (c) 1998 - 2001 | Henning Peters <faroul@beyond.kn-bremen.de>
|
||||
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
||||
+-------------------+ Stefan Reich <reich@halbling.de>
|
||||
|
||||
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 $
|
||||
*/
|
||||
|
||||
#ifndef UGROUP_H
|
||||
#define UGROUP_H
|
||||
|
||||
/* Globale Liste ugroups.
|
||||
Bei jeder unit u->ugroup zeigt auf aktuelle Gruppe.
|
||||
Gruppen mit members <= 1 werden vor den Reports
|
||||
aufgelöst. */
|
||||
|
||||
typedef struct ugroup {
|
||||
struct ugroup *next;
|
||||
int id;
|
||||
int members;
|
||||
unit **unit_array;
|
||||
} ugroup;
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue