forked from github/server
Dungeon Updates für den XML Parser.
TODO: Skill-Limits und Max. Anzahl Personen limitieren. Monster bewegen. Monster-Spawnpoints. Zauberspruch. Gate.
This commit is contained in:
parent
da2050d1f2
commit
60419a6bb6
|
@ -24,6 +24,7 @@
|
||||||
#include <plane.h>
|
#include <plane.h>
|
||||||
#include <race.h>
|
#include <race.h>
|
||||||
#include <region.h>
|
#include <region.h>
|
||||||
|
#include <skill.h>
|
||||||
#include <unit.h>
|
#include <unit.h>
|
||||||
|
|
||||||
/* util includes */
|
/* util includes */
|
||||||
|
@ -32,6 +33,7 @@
|
||||||
|
|
||||||
/* libc includes */
|
/* libc includes */
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
typedef struct treasure {
|
typedef struct treasure {
|
||||||
const struct item_type * itype;
|
const struct item_type * itype;
|
||||||
|
@ -49,10 +51,19 @@ typedef struct monster {
|
||||||
struct itemtype_list * weapons;
|
struct itemtype_list * weapons;
|
||||||
} monster;
|
} monster;
|
||||||
|
|
||||||
|
typedef struct skilllimit {
|
||||||
|
skill_t skill;
|
||||||
|
int minskill;
|
||||||
|
int maxskill;
|
||||||
|
struct skilllimit * next;
|
||||||
|
} skilllimit;
|
||||||
|
|
||||||
typedef struct dungeon {
|
typedef struct dungeon {
|
||||||
int level;
|
int level;
|
||||||
int radius;
|
int radius;
|
||||||
int size;
|
int size;
|
||||||
|
int maxpeople;
|
||||||
|
struct skilllimit * limits;
|
||||||
double connect;
|
double connect;
|
||||||
struct monster * boss;
|
struct monster * boss;
|
||||||
struct monster * monsters;
|
struct monster * monsters;
|
||||||
|
@ -71,6 +82,7 @@ make_dungeon(const dungeon * data)
|
||||||
const struct race * bossrace = data->boss->race;
|
const struct race * bossrace = data->boss->race;
|
||||||
char name[128];
|
char name[128];
|
||||||
int size = data->size;
|
int size = data->size;
|
||||||
|
int iterations = size * size;
|
||||||
unsigned int flags = PFL_NORECRUITS;
|
unsigned int flags = PFL_NORECRUITS;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
struct faction * fmonsters = findfaction(MONSTER_FACTION);
|
struct faction * fmonsters = findfaction(MONSTER_FACTION);
|
||||||
|
@ -87,7 +99,7 @@ make_dungeon(const dungeon * data)
|
||||||
terraform(center, T_HELL);
|
terraform(center, T_HELL);
|
||||||
add_regionlist(&rlist, center);
|
add_regionlist(&rlist, center);
|
||||||
rnext = r = center;
|
rnext = r = center;
|
||||||
while (size>0) {
|
while (size>0 && iterations--) {
|
||||||
int d, o = rand() % 3;
|
int d, o = rand() % 3;
|
||||||
for (d=0;d!=3;++d) {
|
for (d=0;d!=3;++d) {
|
||||||
int index = (d+o) % 3;
|
int index = (d+o) % 3;
|
||||||
|
@ -168,16 +180,37 @@ static int
|
||||||
tagbegin(xml_stack *stack)
|
tagbegin(xml_stack *stack)
|
||||||
{
|
{
|
||||||
xml_tag * tag = stack->tag;
|
xml_tag * tag = stack->tag;
|
||||||
if (strcmp(tag->name , "dungeon")) {
|
if (strcmp(tag->name, "dungeon")==0) {
|
||||||
stack->state = calloc(sizeof(dungeon), 1);
|
dungeon * d = (dungeon*)calloc(sizeof(dungeon), 1);
|
||||||
|
d->maxpeople = xml_ivalue(tag, "maxpeople");
|
||||||
|
if (d->maxpeople==0) d->maxpeople = INT_MAX;
|
||||||
|
d->level = xml_ivalue(tag, "level");
|
||||||
|
d->radius = xml_ivalue(tag, "radius");
|
||||||
|
d->connect = xml_fvalue(tag, "connect");
|
||||||
|
d->size = xml_ivalue(tag, "size");
|
||||||
|
stack->state = d;
|
||||||
} else {
|
} else {
|
||||||
dungeon * d = (dungeon*)stack->state;
|
dungeon * d = (dungeon*)stack->state;
|
||||||
if (strcmp(tag->name, "monster")) {
|
if (strcmp(tag->name, "skilllimit")==0) {
|
||||||
|
skill_t sk = sk_find(xml_value(tag, "name"));
|
||||||
|
if (sk!=NOSKILL) {
|
||||||
|
skilllimit * skl = calloc(sizeof(skilllimit), 1);
|
||||||
|
skl->skill = sk;
|
||||||
|
if (xml_value(tag, "max")!=NULL) {
|
||||||
|
skl->maxskill = xml_ivalue(tag, "max");
|
||||||
|
} else skl->maxskill = INT_MAX;
|
||||||
|
if (xml_value(tag, "min")!=NULL) {
|
||||||
|
skl->minskill = xml_ivalue(tag, "min");
|
||||||
|
} else skl->maxskill = INT_MIN;
|
||||||
|
skl->next = d->limits;
|
||||||
|
d->limits = skl;
|
||||||
|
}
|
||||||
|
} else if (strcmp(tag->name, "monster")==0) {
|
||||||
monster * m = calloc(sizeof(monster), 1);
|
monster * m = calloc(sizeof(monster), 1);
|
||||||
m->race = rc_find(xml_value(tag, "race"));
|
m->race = rc_find(xml_value(tag, "race"));
|
||||||
m->chance = xml_fvalue(tag, "chance");
|
m->chance = xml_fvalue(tag, "chance");
|
||||||
m->avgsize = xml_ivalue(tag, "avgsize");
|
m->avgsize = max(1, xml_ivalue(tag, "size"));
|
||||||
m->maxunits = xml_ivalue(tag, "maxunits");
|
m->maxunits = min(1, xml_ivalue(tag, "maxunits"));
|
||||||
|
|
||||||
if (m->race) {
|
if (m->race) {
|
||||||
if (xml_bvalue(tag, "boss")) {
|
if (xml_bvalue(tag, "boss")) {
|
||||||
|
@ -187,7 +220,7 @@ tagbegin(xml_stack *stack)
|
||||||
d->monsters = m;
|
d->monsters = m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (strcmp(tag->name, "weapon")) {
|
} else if (strcmp(tag->name, "weapon")==0) {
|
||||||
monster * m = d->monsters;
|
monster * m = d->monsters;
|
||||||
itemtype_list * w = calloc(sizeof(itemtype_list), 1);
|
itemtype_list * w = calloc(sizeof(itemtype_list), 1);
|
||||||
w->type = it_find(xml_value(tag, "type"));
|
w->type = it_find(xml_value(tag, "type"));
|
||||||
|
|
|
@ -15,7 +15,8 @@
|
||||||
<order name="MEINUNG" disable></order>
|
<order name="MEINUNG" disable></order>
|
||||||
<order name="MAGIEGEBIET" disable></order>
|
<order name="MAGIEGEBIET" disable></order>
|
||||||
</game>
|
</game>
|
||||||
|
<include file="eressea/de/strings.xml"></include>
|
||||||
<include file="eressea/races.xml"></include>
|
<include file="eressea/races.xml"></include>
|
||||||
<include file="eressea/items.xml"></include>
|
<include file="eressea/items.xml"></include>
|
||||||
<include file="eressea/de/strings.xml"></include>
|
<include file="eressea/dungeons.xml"></include>
|
||||||
</eressea>
|
</eressea>
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<dungeon size="15" level="1" radius="5" connect="0.50" maxpeople="50">
|
||||||
|
<skilllimit name="sk_stealth" maxvalue="4"></skilllimit>
|
||||||
|
<skilllimit name="sk_magic" maxvalue="5"></skilllimit>
|
||||||
|
<monster boss size="1" max="1" chance="1.0" race="young dragon">
|
||||||
|
<treasure item="money" amount="1000"></treasure>
|
||||||
|
<treasure item="jewel" amount="100"></treasure>
|
||||||
|
</monster>
|
||||||
|
<monster size="30" max="10" chance="0.2" race="dracoid">
|
||||||
|
<weapon type="bow"></weapon>
|
||||||
|
<treasure item="money" amount="10"></treasure>
|
||||||
|
</monster>
|
||||||
|
</dungeon>
|
||||||
|
|
||||||
|
<comment>
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# # #
|
||||||
|
# #
|
||||||
|
#
|
||||||
|
</comment>
|
Loading…
Reference in New Issue