forked from github/server
New code:
"equipment-sets" in the XML definition files (equipment.xml) can define skills and items for a unit. these can be applied using the equip_unit() function (from both LUA and C). I've rewritten the random first encounters and addplayer() functions to use these. As a result, there's now even less dependency on fixed item types in the source, and I can take more items out.
This commit is contained in:
parent
5358c876d2
commit
49bd595d69
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
/* tweakable features */
|
/* tweakable features */
|
||||||
#define ENCODE_SPECIAL 1
|
#define ENCODE_SPECIAL 1
|
||||||
#define RENDER_CRMESSAGES 1
|
#define RENDER_CRMESSAGES
|
||||||
|
|
||||||
/* modules include */
|
/* modules include */
|
||||||
#include <modules/score.h>
|
#include <modules/score.h>
|
||||||
|
@ -477,7 +477,7 @@ render_messages(FILE * F, faction * f, message_list *msgs)
|
||||||
boolean printed = false;
|
boolean printed = false;
|
||||||
const struct message_type * mtype = m->msg->type;
|
const struct message_type * mtype = m->msg->type;
|
||||||
unsigned int hash = hashstring(mtype->name);
|
unsigned int hash = hashstring(mtype->name);
|
||||||
#if RENDER_CRMESSAGES
|
#ifdef RENDER_CRMESSAGES
|
||||||
char nrbuffer[1024*32];
|
char nrbuffer[1024*32];
|
||||||
nrbuffer[0] = '\0';
|
nrbuffer[0] = '\0';
|
||||||
if (nr_render(m->msg, f->locale, nrbuffer, sizeof(nrbuffer), f)>0 && nrbuffer[0]) {
|
if (nr_render(m->msg, f->locale, nrbuffer, sizeof(nrbuffer), f)>0 && nrbuffer[0]) {
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <kernel/battle.h>
|
#include <kernel/battle.h>
|
||||||
#include <kernel/building.h>
|
#include <kernel/building.h>
|
||||||
#include <kernel/curse.h>
|
#include <kernel/curse.h>
|
||||||
|
#include <kernel/equipment.h>
|
||||||
#include <kernel/faction.h>
|
#include <kernel/faction.h>
|
||||||
#include <kernel/item.h>
|
#include <kernel/item.h>
|
||||||
#include <kernel/karma.h>
|
#include <kernel/karma.h>
|
||||||
|
@ -339,33 +340,7 @@ get_allies(region * r, unit * u)
|
||||||
return;
|
return;
|
||||||
newunit = createunit(r, u->faction, rand() % 8 + 2, u->faction->race);
|
newunit = createunit(r, u->faction, rand() % 8 + 2, u->faction->race);
|
||||||
set_string(&newunit->name, "Söldner");
|
set_string(&newunit->name, "Söldner");
|
||||||
set_money(newunit, (rand() % 80 + 20) * newunit->number);
|
equip_unit(newunit, get_equipment("random_plain"));
|
||||||
|
|
||||||
switch (rand() % 4) {
|
|
||||||
case 0:
|
|
||||||
set_level(newunit, SK_MELEE, 1+rand()%3);
|
|
||||||
set_item(newunit, I_SWORD, newunit->number);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
set_level(newunit, SK_SPEAR, 1+rand()%3);
|
|
||||||
set_item(newunit, I_SPEAR, newunit->number);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
set_level(newunit, SK_CROSSBOW, 1+rand()%3);
|
|
||||||
set_item(newunit, I_CROSSBOW, newunit->number);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
set_level(newunit, SK_LONGBOW, 1+rand()%3);
|
|
||||||
set_item(newunit, I_LONGBOW, newunit->number);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (rand() % 100 < 40) {
|
|
||||||
set_item(newunit, I_CHAIN_MAIL, rand() % (newunit->number + 1));
|
|
||||||
}
|
|
||||||
if (rand() % 100 < 30) {
|
|
||||||
set_item(newunit, I_HORSE, newunit->number);
|
|
||||||
set_level(newunit, SK_RIDING, 1+rand()%3);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
if (eff_skill(u, SK_LONGBOW, r) < 3
|
if (eff_skill(u, SK_LONGBOW, r) < 3
|
||||||
|
@ -375,14 +350,7 @@ get_allies(region * r, unit * u)
|
||||||
}
|
}
|
||||||
newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race);
|
newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race);
|
||||||
set_string(&newunit->name, "Waldbewohner");
|
set_string(&newunit->name, "Waldbewohner");
|
||||||
set_money(newunit, (rand() % 20 + 10) * newunit->number);
|
equip_unit(newunit, get_equipment("random_forest"));
|
||||||
set_level(newunit, SK_LONGBOW, 2+rand()%3);
|
|
||||||
set_item(newunit, I_LONGBOW, newunit->number);
|
|
||||||
set_level(newunit, SK_OBSERVATION, 2+rand()%2);
|
|
||||||
set_level(newunit, SK_STEALTH, 1+rand()%2);
|
|
||||||
if (rand() % 100 < 20) {
|
|
||||||
set_level(newunit, SK_HERBALISM, 1+rand()%2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -392,10 +360,7 @@ get_allies(region * r, unit * u)
|
||||||
}
|
}
|
||||||
newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race);
|
newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race);
|
||||||
set_string(&newunit->name, "Sumpfbewohner");
|
set_string(&newunit->name, "Sumpfbewohner");
|
||||||
set_money(newunit, (rand() % 20 + 10) * newunit->number);
|
equip_unit(newunit, get_equipment("random_swamp"));
|
||||||
set_level(newunit, SK_SPEAR, 2+rand()%3);
|
|
||||||
set_item(newunit, I_SPEAR, newunit->number);
|
|
||||||
set_level(newunit, SK_STEALTH, 2+rand()%3);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_DESERT:
|
case T_DESERT:
|
||||||
|
@ -404,13 +369,7 @@ get_allies(region * r, unit * u)
|
||||||
}
|
}
|
||||||
newunit = createunit(r, u->faction, rand() % 12 + 2, u->faction->race);
|
newunit = createunit(r, u->faction, rand() % 12 + 2, u->faction->race);
|
||||||
set_string(&newunit->name, "Berber");
|
set_string(&newunit->name, "Berber");
|
||||||
set_money(newunit, (rand() % 30 + 20) * newunit->number);
|
equip_unit(newunit, get_equipment("random_desert"));
|
||||||
set_level(newunit, SK_MELEE, 1+rand()%2);
|
|
||||||
set_item(newunit, I_SWORD, newunit->number);
|
|
||||||
set_level(newunit, SK_TRADE, 1+rand()%3);
|
|
||||||
set_level(newunit, SK_RIDING, 2+rand()%2);
|
|
||||||
set_item(newunit, I_HORSE, newunit->number);
|
|
||||||
set_level(newunit, SK_HORSE_TRAINING, 2+rand()%2);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_HIGHLAND:
|
case T_HIGHLAND:
|
||||||
|
@ -419,9 +378,7 @@ get_allies(region * r, unit * u)
|
||||||
}
|
}
|
||||||
newunit = createunit(r, u->faction, rand() % 8 + 2, u->faction->race);
|
newunit = createunit(r, u->faction, rand() % 8 + 2, u->faction->race);
|
||||||
set_string(&newunit->name, "Hochlandbarbaren");
|
set_string(&newunit->name, "Hochlandbarbaren");
|
||||||
set_money(newunit, (rand() % 10 + 20) * newunit->number);
|
equip_unit(newunit, get_equipment("random_highland"));
|
||||||
set_level(newunit, SK_MELEE, 1+rand()%2);
|
|
||||||
set_item(newunit, I_SWORD, newunit->number);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_MOUNTAIN:
|
case T_MOUNTAIN:
|
||||||
|
@ -431,14 +388,8 @@ get_allies(region * r, unit * u)
|
||||||
}
|
}
|
||||||
newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race);
|
newunit = createunit(r, u->faction, rand() % 6 + 2, u->faction->race);
|
||||||
set_string(&newunit->name, "Bergbewohner");
|
set_string(&newunit->name, "Bergbewohner");
|
||||||
set_money(newunit, (rand() % 40 + 60) * newunit->number);
|
equip_unit(newunit, get_equipment("random_mountain"));
|
||||||
set_level(newunit, SK_MELEE, 2+rand()%2);
|
|
||||||
set_item(newunit, I_SWORD, newunit->number);
|
|
||||||
set_level(newunit, SK_ARMORER, 2+rand()%2);
|
|
||||||
set_level(newunit, SK_TRADE, 1+rand()%3);
|
|
||||||
if (rand() % 100 < 60) {
|
|
||||||
set_item(newunit, I_PLATE_ARMOR, newunit->number);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_GLACIER:
|
case T_GLACIER:
|
||||||
|
@ -448,10 +399,8 @@ get_allies(region * r, unit * u)
|
||||||
}
|
}
|
||||||
newunit = createunit(r, u->faction, rand() % 4 + 2, u->faction->race);
|
newunit = createunit(r, u->faction, rand() % 4 + 2, u->faction->race);
|
||||||
set_string(&newunit->name, "Eisleute");
|
set_string(&newunit->name, "Eisleute");
|
||||||
set_money(newunit, (rand() % 20 + 20) * newunit->number);
|
equip_unit(newunit, get_equipment("random_glacier"));
|
||||||
set_level(newunit, SK_MELEE, 2+rand()%2);
|
|
||||||
set_item(newunit, I_SWORD, newunit->number);
|
|
||||||
set_level(newunit, SK_ARMORER, 2+rand()%2);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include "eressea.h"
|
#include "eressea.h"
|
||||||
#include "faction.h"
|
#include "faction.h"
|
||||||
|
|
||||||
|
#include "equipment.h"
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
#include "race.h"
|
#include "race.h"
|
||||||
#include "region.h"
|
#include "region.h"
|
||||||
|
@ -142,7 +144,9 @@ addplayer(region *r, faction * f)
|
||||||
assert(f->units==NULL);
|
assert(f->units==NULL);
|
||||||
set_ursprung(f, 0, r->x, r->y);
|
set_ursprung(f, 0, r->x, r->y);
|
||||||
u = createunit(r, f, 1, f->race);
|
u = createunit(r, f, 1, f->race);
|
||||||
give_starting_equipment(r, u);
|
equip_unit(u, get_equipment("new_faction"));
|
||||||
|
equip_unit(u, get_equipment(u->race->_name[0]));
|
||||||
|
give_starting_equipment(u);
|
||||||
fset(u, UFL_ISNEW);
|
fset(u, UFL_ISNEW);
|
||||||
if (f->race == new_race[RC_DAEMON]) {
|
if (f->race == new_race[RC_DAEMON]) {
|
||||||
race_t urc;
|
race_t urc;
|
||||||
|
|
|
@ -178,6 +178,9 @@
|
||||||
<File
|
<File
|
||||||
RelativePath=".\alchemy.h">
|
RelativePath=".\alchemy.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\alliance.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\battle.h">
|
RelativePath=".\battle.h">
|
||||||
</File>
|
</File>
|
||||||
|
@ -199,6 +202,9 @@
|
||||||
<File
|
<File
|
||||||
RelativePath=".\curse.h">
|
RelativePath=".\curse.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\equipment.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\eressea.h">
|
RelativePath=".\eressea.h">
|
||||||
</File>
|
</File>
|
||||||
|
@ -299,9 +305,6 @@
|
||||||
<File
|
<File
|
||||||
RelativePath=".\alliance.c">
|
RelativePath=".\alliance.c">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\alliance.h">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\battle.c">
|
RelativePath=".\battle.c">
|
||||||
</File>
|
</File>
|
||||||
|
@ -323,6 +326,9 @@
|
||||||
<File
|
<File
|
||||||
RelativePath=".\curse.c">
|
RelativePath=".\curse.c">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\equipment.c">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\eressea.c">
|
RelativePath=".\eressea.c">
|
||||||
</File>
|
</File>
|
||||||
|
|
|
@ -172,83 +172,38 @@ set_show_item(faction *f, item_t i)
|
||||||
a->data.v = (void*)olditemtype[i];
|
a->data.v = (void*)olditemtype[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct equipment {
|
int
|
||||||
const struct race * rc;
|
unit_max_hp(const unit * u)
|
||||||
item * items;
|
|
||||||
int skills[MAXSKILLS];
|
|
||||||
struct equipment * next;
|
|
||||||
} equipment;
|
|
||||||
|
|
||||||
static equipment * starting_equipment;
|
|
||||||
|
|
||||||
static equipment *
|
|
||||||
make_equipment(const struct race * rc)
|
|
||||||
{
|
{
|
||||||
equipment ** eqp = &starting_equipment;
|
int h;
|
||||||
while (*eqp) {
|
double p;
|
||||||
struct equipment * eq = *eqp;
|
static const curse_type * heal_ct = NULL;
|
||||||
if (eq->rc==rc) break;
|
h = u->race->hitpoints;
|
||||||
eqp = &eq->next;
|
if (heal_ct==NULL) heal_ct = ct_find("healingzone");
|
||||||
|
|
||||||
|
|
||||||
|
p = pow(effskill(u, SK_AUSDAUER) / 2.0, 1.5) * 0.2;
|
||||||
|
h += (int) (h * p + 0.5);
|
||||||
|
|
||||||
|
if(fspecial(u->faction, FS_UNDEAD)) {
|
||||||
|
h *= 2;
|
||||||
}
|
}
|
||||||
if (*eqp == NULL) {
|
|
||||||
struct equipment * eq = malloc(sizeof(equipment));
|
/* der healing curse verändert die maximalen hp */
|
||||||
eq->rc = rc;
|
if (heal_ct) {
|
||||||
eq->next = NULL;
|
curse *c = get_curse(u->region->attribs, heal_ct);
|
||||||
eq->items = NULL;
|
if (c) {
|
||||||
memset(eq->skills, 0, sizeof(eq->skills));
|
h = (int) (h * (1.0+(curse_geteffect(c)/100)));
|
||||||
*eqp = eq;
|
|
||||||
} else {
|
|
||||||
struct equipment * eq = *eqp;
|
|
||||||
eq->rc = rc;
|
|
||||||
eq->items = NULL;
|
|
||||||
}
|
}
|
||||||
return *eqp;
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
startup_skill(skill_t sk, int value, const struct race * rc)
|
give_starting_equipment(struct unit *u)
|
||||||
{
|
{
|
||||||
if (value>0) {
|
struct region *r = u->region;
|
||||||
equipment * eq = make_equipment(rc);
|
|
||||||
eq->skills[sk] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
startup_equipment(const item_type * itype, int number, const struct race * rc)
|
|
||||||
{
|
|
||||||
if (itype!=NULL && number>0) {
|
|
||||||
equipment * eq = make_equipment(rc);
|
|
||||||
i_change(&eq->items, itype, number);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
give_equipment(unit * u, const struct race * rc)
|
|
||||||
{
|
|
||||||
equipment * eq = starting_equipment;
|
|
||||||
while (eq && eq->rc!=rc) {
|
|
||||||
eq = eq->next;
|
|
||||||
}
|
|
||||||
if (eq) {
|
|
||||||
skill_t sk;
|
|
||||||
item * itm;
|
|
||||||
for (sk=0;sk!=MAXSKILLS;++sk) {
|
|
||||||
if (eq->skills[sk]>0) {
|
|
||||||
set_level(u, sk, eq->skills[sk]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (itm=eq->items;itm!=NULL;itm=itm->next) {
|
|
||||||
i_add(&u->items, i_new(itm->type, itm->number));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
give_starting_equipment(struct region *r, struct unit *u)
|
|
||||||
{
|
|
||||||
give_equipment(u, NULL);
|
|
||||||
give_equipment(u, u->race);
|
|
||||||
|
|
||||||
switch(old_race(u->race)) {
|
switch(old_race(u->race)) {
|
||||||
case RC_ELF:
|
case RC_ELF:
|
||||||
|
@ -284,34 +239,6 @@ give_starting_equipment(struct region *r, struct unit *u)
|
||||||
u->hp = unit_max_hp(u);
|
u->hp = unit_max_hp(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
unit_max_hp(const unit * u)
|
|
||||||
{
|
|
||||||
int h;
|
|
||||||
double p;
|
|
||||||
static const curse_type * heal_ct = NULL;
|
|
||||||
h = u->race->hitpoints;
|
|
||||||
if (heal_ct==NULL) heal_ct = ct_find("healingzone");
|
|
||||||
|
|
||||||
|
|
||||||
p = pow(effskill(u, SK_AUSDAUER) / 2.0, 1.5) * 0.2;
|
|
||||||
h += (int) (h * p + 0.5);
|
|
||||||
|
|
||||||
if(fspecial(u->faction, FS_UNDEAD)) {
|
|
||||||
h *= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* der healing curse verändert die maximalen hp */
|
|
||||||
if (heal_ct) {
|
|
||||||
curse *c = get_curse(u->region->attribs, heal_ct);
|
|
||||||
if (c) {
|
|
||||||
h = (int) (h * (1.0+(curse_geteffect(c)/100)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
r_insectstalled(const region * r)
|
r_insectstalled(const region * r)
|
||||||
{
|
{
|
||||||
|
|
|
@ -181,9 +181,7 @@ extern int read_race_reference(const struct race ** rp, FILE * F);
|
||||||
|
|
||||||
extern const char * raceprefix(const struct unit *u);
|
extern const char * raceprefix(const struct unit *u);
|
||||||
|
|
||||||
extern void startup_equipment(const struct item_type * itype, int number, const struct race * rc);
|
extern void give_starting_equipment(struct unit *u);
|
||||||
extern void startup_skill(skill_t sk, int value, const struct race * rc);
|
|
||||||
extern void give_starting_equipment(struct region *r, struct unit *u);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ without prior permission by the authors of Eressea.
|
||||||
|
|
||||||
/* kernel includes */
|
/* kernel includes */
|
||||||
#include "building.h"
|
#include "building.h"
|
||||||
|
#include "equipment.h"
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "message.h"
|
#include "message.h"
|
||||||
#include "race.h"
|
#include "race.h"
|
||||||
|
@ -869,9 +870,9 @@ parse_resources(xmlDocPtr doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_items(xmlNodeSetPtr nsetItems, const race * rc)
|
add_items(equipment * eq, xmlNodeSetPtr nsetItems)
|
||||||
{
|
{
|
||||||
if (nsetItems!=NULL) {
|
if (nsetItems!=NULL && nsetItems->nodeNr>0) {
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i!=nsetItems->nodeNr;++i) {
|
for (i=0;i!=nsetItems->nodeNr;++i) {
|
||||||
xmlNodePtr node = nsetItems->nodeTab[i];
|
xmlNodePtr node = nsetItems->nodeTab[i];
|
||||||
|
@ -883,22 +884,20 @@ add_items(xmlNodeSetPtr nsetItems, const race * rc)
|
||||||
itype = it_find((const char*)property);
|
itype = it_find((const char*)property);
|
||||||
xmlFree(property);
|
xmlFree(property);
|
||||||
if (itype!=NULL) {
|
if (itype!=NULL) {
|
||||||
int num = 0;
|
|
||||||
property = xmlGetProp(node, BAD_CAST "amount");
|
property = xmlGetProp(node, BAD_CAST "amount");
|
||||||
if (property!=NULL) {
|
if (property!=NULL) {
|
||||||
num = atoi((const char*)property);
|
equipment_setitem(eq, itype, (const char*)property);
|
||||||
xmlFree(property);
|
xmlFree(property);
|
||||||
}
|
}
|
||||||
startup_equipment(itype, num, rc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_skills(xmlNodeSetPtr nsetSkills, const race * rc)
|
add_skills(equipment * eq, xmlNodeSetPtr nsetSkills)
|
||||||
{
|
{
|
||||||
if (nsetSkills!=NULL) {
|
if (nsetSkills!=NULL && nsetSkills->nodeNr>0) {
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i!=nsetSkills->nodeNr;++i) {
|
for (i=0;i!=nsetSkills->nodeNr;++i) {
|
||||||
xmlNodePtr node = nsetSkills->nodeTab[i];
|
xmlNodePtr node = nsetSkills->nodeTab[i];
|
||||||
|
@ -910,18 +909,73 @@ add_skills(xmlNodeSetPtr nsetSkills, const race * rc)
|
||||||
sk = sk_find((const char*)property);
|
sk = sk_find((const char*)property);
|
||||||
xmlFree(property);
|
xmlFree(property);
|
||||||
if (sk!=NOSKILL) {
|
if (sk!=NOSKILL) {
|
||||||
int num = 0;
|
|
||||||
property = xmlGetProp(node, BAD_CAST "level");
|
property = xmlGetProp(node, BAD_CAST "level");
|
||||||
if (property!=NULL) {
|
if (property!=NULL) {
|
||||||
num = atoi((const char*)property);
|
equipment_setskill(eq, sk, (const char*)property);
|
||||||
xmlFree(property);
|
xmlFree(property);
|
||||||
}
|
}
|
||||||
startup_skill(sk, num, rc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_subsets(xmlDocPtr doc, equipment * eq, xmlNodeSetPtr nsetSkills)
|
||||||
|
{
|
||||||
|
xmlXPathContextPtr xpath = xmlXPathNewContext(doc);
|
||||||
|
if (nsetSkills!=NULL && nsetSkills->nodeNr>0) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
eq->subsets = calloc(nsetSkills->nodeNr+1, sizeof(subset));
|
||||||
|
for (i=0;i!=nsetSkills->nodeNr;++i) {
|
||||||
|
xmlXPathObjectPtr xpathResult;
|
||||||
|
xmlNodePtr node = nsetSkills->nodeTab[i];
|
||||||
|
xmlChar * property;
|
||||||
|
|
||||||
|
eq->subsets[i].chance = 1.0f;
|
||||||
|
property = xmlGetProp(node, BAD_CAST "chance");
|
||||||
|
if (property!=NULL) {
|
||||||
|
eq->subsets[i].chance = (float)atof((const char *)property);
|
||||||
|
xmlFree(property);
|
||||||
|
}
|
||||||
|
xpath->node = node;
|
||||||
|
xpathResult = xmlXPathEvalExpression(BAD_CAST "set", xpath);
|
||||||
|
if (xpathResult->nodesetval) {
|
||||||
|
xmlNodeSetPtr nsetSets = xpathResult->nodesetval;
|
||||||
|
float totalChance = 0.0f;
|
||||||
|
|
||||||
|
if (nsetSets->nodeNr>0) {
|
||||||
|
int set;
|
||||||
|
eq->subsets[i].sets = calloc(nsetSets->nodeNr+1, sizeof(subsetitem));
|
||||||
|
for (set=0;set!=nsetSets->nodeNr;++set) {
|
||||||
|
xmlNodePtr nodeSet = nsetSets->nodeTab[set];
|
||||||
|
float chance = 1.0f;
|
||||||
|
|
||||||
|
property = xmlGetProp(nodeSet, BAD_CAST "chance");
|
||||||
|
if (property!=NULL) {
|
||||||
|
chance = (float)atof((const char *)property);
|
||||||
|
xmlFree(property);
|
||||||
|
}
|
||||||
|
totalChance += chance;
|
||||||
|
|
||||||
|
property = xmlGetProp(nodeSet, BAD_CAST "name");
|
||||||
|
assert(property!=NULL);
|
||||||
|
eq->subsets[i].sets[set].chance = chance;
|
||||||
|
eq->subsets[i].sets[set].set = create_equipment((const char*)property);
|
||||||
|
xmlFree(property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (totalChance>1.0f) {
|
||||||
|
log_error(("total chance exceeds 1.0: %f in equipment set %s.\n",
|
||||||
|
totalChance, eq->name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xmlXPathFreeObject(xpathResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xmlXPathFreeContext(xpath);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
parse_equipment(xmlDocPtr doc)
|
parse_equipment(xmlDocPtr doc)
|
||||||
{
|
{
|
||||||
|
@ -929,31 +983,35 @@ parse_equipment(xmlDocPtr doc)
|
||||||
xmlXPathObjectPtr xpathRaces;
|
xmlXPathObjectPtr xpathRaces;
|
||||||
|
|
||||||
/* reading eressea/races/race */
|
/* reading eressea/races/race */
|
||||||
xpathRaces = xmlXPathEvalExpression(BAD_CAST "/eressea/equipment/startup", xpath);
|
xpathRaces = xmlXPathEvalExpression(BAD_CAST "/eressea/equipment/set", xpath);
|
||||||
if (xpathRaces->nodesetval) {
|
if (xpathRaces->nodesetval) {
|
||||||
xmlNodeSetPtr nsetRaces = xpathRaces->nodesetval;
|
xmlNodeSetPtr nsetRaces = xpathRaces->nodesetval;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0;i!=nsetRaces->nodeNr;++i) {
|
for (i=0;i!=nsetRaces->nodeNr;++i) {
|
||||||
xmlNodePtr node = nsetRaces->nodeTab[i];
|
xmlNodePtr node = nsetRaces->nodeTab[i];
|
||||||
const struct race * rc = NULL;
|
xmlChar * property = xmlGetProp(node, BAD_CAST "name");
|
||||||
xmlChar * property = xmlGetProp(node, BAD_CAST "race");
|
|
||||||
xmlXPathObjectPtr xpathResult;
|
|
||||||
|
|
||||||
if (property!=NULL) {
|
if (property!=NULL) {
|
||||||
rc = rc_find((const char*)property);
|
equipment * eq = create_equipment((const char*)property);
|
||||||
assert(rc!=NULL);
|
xmlXPathObjectPtr xpathResult;
|
||||||
}
|
|
||||||
|
|
||||||
xpath->node = node;
|
xpath->node = node;
|
||||||
|
|
||||||
xpathResult = xmlXPathEvalExpression(BAD_CAST "item", xpath);
|
xpathResult = xmlXPathEvalExpression(BAD_CAST "item", xpath);
|
||||||
add_items(xpathResult->nodesetval, rc);
|
add_items(eq, xpathResult->nodesetval);
|
||||||
xmlXPathFreeObject(xpathResult);
|
xmlXPathFreeObject(xpathResult);
|
||||||
|
|
||||||
xpath->node = node;
|
|
||||||
xpathResult = xmlXPathEvalExpression(BAD_CAST "skill", xpath);
|
xpathResult = xmlXPathEvalExpression(BAD_CAST "skill", xpath);
|
||||||
add_skills(xpathResult->nodesetval, rc);
|
add_skills(eq, xpathResult->nodesetval);
|
||||||
xmlXPathFreeObject(xpathResult);
|
xmlXPathFreeObject(xpathResult);
|
||||||
|
|
||||||
|
xpathResult = xmlXPathEvalExpression(BAD_CAST "subset", xpath);
|
||||||
|
add_subsets(doc, eq, xpathResult->nodesetval);
|
||||||
|
xmlXPathFreeObject(xpathResult);
|
||||||
|
|
||||||
|
xmlFree(property);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
// kernel includes
|
// kernel includes
|
||||||
#include <kernel/alliance.h>
|
#include <kernel/alliance.h>
|
||||||
|
#include <kernel/equipment.h>
|
||||||
#include <kernel/faction.h>
|
#include <kernel/faction.h>
|
||||||
#include <kernel/item.h>
|
#include <kernel/item.h>
|
||||||
#include <kernel/plane.h>
|
#include <kernel/plane.h>
|
||||||
|
@ -38,13 +39,11 @@
|
||||||
using namespace luabind;
|
using namespace luabind;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
lua_addequipment(const char * iname, int number, const char * rcname)
|
lua_addequipment(const char * eqname, const char * iname, const char * value)
|
||||||
{
|
{
|
||||||
race * rc = rc_find(rcname);
|
|
||||||
const struct item_type * itype = it_find(iname);
|
const struct item_type * itype = it_find(iname);
|
||||||
if (rc==NULL && strlen(rcname)>0) return -1;
|
|
||||||
if (itype==NULL) return -1;
|
if (itype==NULL) return -1;
|
||||||
startup_equipment(itype, number, rc);
|
equipment_setitem(create_equipment(eqname), itype, value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,6 +211,12 @@ lua_writereports(void)
|
||||||
return reports();
|
return reports();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lua_equipunit(unit& u, const char * eqname)
|
||||||
|
{
|
||||||
|
equip_unit(&u, get_equipment(eqname));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
bind_eressea(lua_State * L)
|
bind_eressea(lua_State * L)
|
||||||
{
|
{
|
||||||
|
@ -229,10 +234,12 @@ bind_eressea(lua_State * L)
|
||||||
def("write_summary", &write_summary),
|
def("write_summary", &write_summary),
|
||||||
def("read_orders", &readorders),
|
def("read_orders", &readorders),
|
||||||
def("process_orders", &process_orders),
|
def("process_orders", &process_orders),
|
||||||
def("startup_equipment", &lua_addequipment),
|
def("equipment_setitem", &lua_addequipment),
|
||||||
def("get_turn", &get_turn),
|
def("get_turn", &get_turn),
|
||||||
def("remove_empty_units", &remove_empty_units),
|
def("remove_empty_units", &remove_empty_units),
|
||||||
|
|
||||||
|
def("equip_unit", &lua_equipunit),
|
||||||
|
|
||||||
/* scripted monsters */
|
/* scripted monsters */
|
||||||
def("plan_monsters", &lua_planmonsters),
|
def("plan_monsters", &lua_planmonsters),
|
||||||
def("spawn_braineaters", &spawn_braineaters),
|
def("spawn_braineaters", &spawn_braineaters),
|
||||||
|
|
|
@ -1,41 +1,44 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<equipment>
|
<equipment>
|
||||||
<!-- removed. only used by the mapper's seed function.
|
|
||||||
<item name="conquesttoken" amount="1"/>
|
<!-- one equipment-set per player-race for the first unit in a faction -->
|
||||||
<item name="log" amount="30"/>
|
<set name="dwarf">
|
||||||
<item name="stone" amount="30"/>
|
|
||||||
<item name="money" amount="4200"/>
|
|
||||||
-->
|
|
||||||
<startup race="dwarf">
|
|
||||||
<item name="axe" amount="1"/>
|
<item name="axe" amount="1"/>
|
||||||
<item name="chainmail" amount="1"/>
|
<item name="chainmail" amount="1"/>
|
||||||
<skill name="sk_melee" level="1"/>
|
<skill name="sk_melee" level="1"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="elf">
|
|
||||||
|
<set name="elf">
|
||||||
<item name="fairyboot" amount="1"/>
|
<item name="fairyboot" amount="1"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="uruk">
|
|
||||||
|
<set name="uruk">
|
||||||
<skill name="sk_spear" level="4"/>
|
<skill name="sk_spear" level="4"/>
|
||||||
<skill name="sk_melee" level="4"/>
|
<skill name="sk_melee" level="4"/>
|
||||||
<skill name="sk_crossbow" level="4"/>
|
<skill name="sk_crossbow" level="4"/>
|
||||||
<skill name="sk_catapult" level="4"/>
|
<skill name="sk_catapult" level="4"/>
|
||||||
<skill name="sk_bow" level="4"/>
|
<skill name="sk_bow" level="4"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="goblin">
|
|
||||||
|
<set name="goblin">
|
||||||
<item name="roi" amount="1"/>
|
<item name="roi" amount="1"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="troll">
|
|
||||||
|
<set name="troll">
|
||||||
<skill name="sk_building" level="1"/>
|
<skill name="sk_building" level="1"/>
|
||||||
<skill name="sk_perception" level="3"/>
|
<skill name="sk_perception" level="3"/>
|
||||||
<item name="stone" amount="50"/>
|
<item name="stone" amount="50"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="demon">
|
|
||||||
|
<set name="demon">
|
||||||
<skill name="sk_stamina" level="15"/>
|
<skill name="sk_stamina" level="15"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="insect">
|
|
||||||
|
<set name="insect">
|
||||||
<item name="nestwarmth" amount="9"/>
|
<item name="nestwarmth" amount="9"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="halfling">
|
|
||||||
|
<set name="halfling">
|
||||||
<skill name="sk_trade" level="1"/>
|
<skill name="sk_trade" level="1"/>
|
||||||
<skill name="sk_riding" level="2"/>
|
<skill name="sk_riding" level="2"/>
|
||||||
<item name="horse" amount="2"/>
|
<item name="horse" amount="2"/>
|
||||||
|
@ -47,12 +50,121 @@
|
||||||
<item name="oil" amount="5"/>
|
<item name="oil" amount="5"/>
|
||||||
<item name="silk" amount="5"/>
|
<item name="silk" amount="5"/>
|
||||||
<item name="incense" amount="5"/>
|
<item name="incense" amount="5"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="cat">
|
|
||||||
|
<set name="cat">
|
||||||
<item name="roi" amount="1"/>
|
<item name="roi" amount="1"/>
|
||||||
</startup>
|
</set>
|
||||||
<startup race="aquarian">
|
|
||||||
|
<set name="aquarian">
|
||||||
<skill name="sk_sailing" level="1"/>
|
<skill name="sk_sailing" level="1"/>
|
||||||
</startup>
|
</set>
|
||||||
|
|
||||||
|
<!-- equipment-sets for random encounters -->
|
||||||
|
<set name="random_desert">
|
||||||
|
<skill name="sk_melee" level="d2"/>
|
||||||
|
<skill name="sk_trade" level="d3"/>
|
||||||
|
<skill name="sk_riding" level="d2+1"/>
|
||||||
|
<skill name="sk_training" level="d2+1"/>
|
||||||
|
<item name="horse" amount="1"/>
|
||||||
|
<item name="sword" amount="1"/>
|
||||||
|
<item name="money" amount="d30+19"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_swamp">
|
||||||
|
<skill name="sk_stealth" level="d3+1"/>
|
||||||
|
<skill name="sk_spear" level="d3+1"/>
|
||||||
|
<item name="spear" amount="1"/>
|
||||||
|
<item name="money" amount="d20+9"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_glacier">
|
||||||
|
<skill name="sk_armorer" level="d2+1"/>
|
||||||
|
<skill name="sk_melee" level="d2+1"/>
|
||||||
|
<item name="sword" amount="1"/>
|
||||||
|
<item name="money" amount="d20+19"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_mountain">
|
||||||
|
<skill name="sk_armorer" level="d2+1"/>
|
||||||
|
<skill name="sk_melee" level="d2+1"/>
|
||||||
|
<skill name="sk_trade" level="d3"/>
|
||||||
|
<item name="sword" amount="1"/>
|
||||||
|
<item name="money" amount="d40+59"/>
|
||||||
|
<subset chance="0.6">
|
||||||
|
<set name="random_plate"/>
|
||||||
|
</subset>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_highland">
|
||||||
|
<skill name="sk_melee" level="d2"/>
|
||||||
|
<item name="sword" amount="1"/>
|
||||||
|
<item name="money" amount="d10+19"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_forest">
|
||||||
|
<skill name="sk_stealth" level="d2"/>
|
||||||
|
<skill name="sk_perception" level="d2+1"/>
|
||||||
|
<skill name="sk_bow" level="d3+1"/>
|
||||||
|
<item name="bow" amount="1"/>
|
||||||
|
<item name="money" amount="d20+9"/>
|
||||||
|
<subset chance="0.2">
|
||||||
|
<set name="random_herbalist"/>
|
||||||
|
</subset>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_herbalist">
|
||||||
|
<skill name="sk_herbalism" level="d2"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_plain">
|
||||||
|
<item name="money" amount="d80+19"/>
|
||||||
|
<subset>
|
||||||
|
<set name="random_sword" chance="0.25"/>
|
||||||
|
<set name="random_spear" chance="0.25"/>
|
||||||
|
<set name="random_crossbow" chance="0.25"/>
|
||||||
|
<set name="random_bow" chance="0.25"/>
|
||||||
|
</subset>
|
||||||
|
<subset chance="0.4">
|
||||||
|
<set name="random_chain"/>
|
||||||
|
</subset>
|
||||||
|
<subset chance="0.3">
|
||||||
|
<set name="random_rider"/>
|
||||||
|
</subset>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_spear">
|
||||||
|
<skill name="sk_spear" level="d3"/>
|
||||||
|
<item name="spear" amount="1"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_sword">
|
||||||
|
<skill name="sk_sword" level="d3"/>
|
||||||
|
<item name="sword" amount="1"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_crossbow">
|
||||||
|
<skill name="sk_crossbow" level="d3"/>
|
||||||
|
<item name="crossbow" amount="1"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_bow">
|
||||||
|
<skill name="sk_bow" level="d3"/>
|
||||||
|
<item name="bow" amount="1"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_plate">
|
||||||
|
<item name="plate" amount="1"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_chain">
|
||||||
|
<item name="chainmail" amount="1"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<set name="random_rider">
|
||||||
|
<item name="horse" amount="1"/>
|
||||||
|
<skill name="sk_riding" level="d3"/>
|
||||||
|
</set>
|
||||||
|
|
||||||
</equipment>
|
</equipment>
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,10 @@ end
|
||||||
|
|
||||||
function process(orders)
|
function process(orders)
|
||||||
-- initialize starting equipment for new players
|
-- initialize starting equipment for new players
|
||||||
startup_equipment("conquesttoken", 1, "");
|
equipment_setitem("new_faction", "conquesttoken", "1");
|
||||||
startup_equipment("wood", 30, "");
|
equipment_setitem("new_faction", "wood", "30");
|
||||||
startup_equipment("stone", 30, "");
|
equipment_setitem("new_faction", "stone", "30");
|
||||||
startup_equipment("money", 4200, "");
|
equipment_setitem("new_faction", "money", "4200");
|
||||||
|
|
||||||
file = "" .. get_turn()
|
file = "" .. get_turn()
|
||||||
if read_game(file)~=0 then
|
if read_game(file)~=0 then
|
||||||
|
|
|
@ -54,10 +54,10 @@ end
|
||||||
|
|
||||||
function process(orders)
|
function process(orders)
|
||||||
-- initialize starting equipment for new players
|
-- initialize starting equipment for new players
|
||||||
startup_equipment("conquesttoken", 1, "");
|
equipment_setitem("new_faction", "conquesttoken", "1");
|
||||||
startup_equipment("log", 30, "");
|
equipment_setitem("new_faction", "log", "30");
|
||||||
startup_equipment("stone", 30, "");
|
equipment_setitem("new_faction", "stone", "30");
|
||||||
startup_equipment("money", 4200, "");
|
equipment_setitem("new_faction", "money", "4200");
|
||||||
|
|
||||||
file = "" .. get_turn()
|
file = "" .. get_turn()
|
||||||
if read_game(file)~=0 then
|
if read_game(file)~=0 then
|
||||||
|
|
|
@ -124,7 +124,7 @@ skills = {
|
||||||
|
|
||||||
function wdw_setup()
|
function wdw_setup()
|
||||||
-- initialize starting equipment for new players
|
-- initialize starting equipment for new players
|
||||||
-- startup_equipment("magicskillboost", 1, "")
|
-- equipment_setitem("new_faction", "magicskillboost", "1")
|
||||||
|
|
||||||
init_positions()
|
init_positions()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue