diff --git a/src/common/kernel/faction.c b/src/common/kernel/faction.c index bc71d432f..0df00df95 100644 --- a/src/common/kernel/faction.c +++ b/src/common/kernel/faction.c @@ -306,6 +306,38 @@ destroyfaction(faction * f) } } +int +get_alliance(const faction * a, const faction * b) +{ + const ally * sf = a->allies; + for (;sf!=NULL;sf=sf->next) { + if (sf->faction==b) { + return sf->status; + } + } + return 0; +} + +void +set_alliance(faction * a, faction * b, int status) +{ + ally ** sfp; + sfp = &a->allies; + while (*sfp) { + ally * sf = *sfp; + if (sf->faction==b) break; + sfp = &sf->next; + } + if (*sfp==NULL) { + ally * sf = *sfp = malloc(sizeof(ally)); + sf->next = NULL; + sf->status = status; + sf->faction = b; + return; + } + (*sfp)->status |= status; +} + #ifdef REGIONOWNERS boolean is_enemy(const struct faction * f, const struct faction * enemy) diff --git a/src/common/kernel/faction.h b/src/common/kernel/faction.h index ac63bdbf4..0074060b4 100644 --- a/src/common/kernel/faction.h +++ b/src/common/kernel/faction.h @@ -116,6 +116,9 @@ extern struct faction * addfaction(const char *email, const char* password, extern boolean checkpasswd(const faction * f, const char * passwd, boolean shortp); extern void destroyfaction(faction * f); +extern void set_alliance(struct faction * a, struct faction * b, int status); +extern int get_alliance(const struct faction * a, const struct faction * b); + #ifdef REGIONOWNERS extern boolean is_enemy(const struct faction * f, const struct faction * enemy); extern void add_enemy(struct faction * f, struct faction * enemy); diff --git a/src/eressea/lua/faction.cpp b/src/eressea/lua/faction.cpp index 81521c929..8c8c7cf47 100644 --- a/src/eressea/lua/faction.cpp +++ b/src/eressea/lua/faction.cpp @@ -82,6 +82,48 @@ operator==(const faction& a, const faction&b) return a.no==b.no; } +static struct helpmode { + const char * name; + int status; +} helpmodes[] = { + { "money", HELP_MONEY }, + { "fight", HELP_FIGHT }, + { "observe", HELP_OBSERVE }, + { "give", HELP_GIVE }, + { "guard", HELP_GUARD }, + { "stealth", HELP_FSTEALTH }, + { "travel", HELP_TRAVEL }, + { "all", HELP_ALL }, + { NULL, 0 } +}; + +static int +faction_getpolicy(const faction& a, const faction& b, const char * flag) +{ + int mode; + + for (mode=0;helpmodes[mode].name!=NULL;++mode) { + if (strcmp(flag, helpmodes[mode].name)==0) { + return get_alliance(&a, &b) & mode; + } + } + return 0; +} + +static void +faction_setpolicy(faction& a, faction& b, const char * flag, boolean value) +{ + int mode; + + for (mode=0;helpmodes[mode].name!=NULL;++mode) { + if (strcmp(flag, helpmodes[mode].name)==0) { + if (value) set_alliance(&a, &b, get_alliance(&a, &b) | mode); + else set_alliance(&a, &b, get_alliance(&a, &b) & ~mode); + break; + } + } +} + void bind_faction(lua_State * L) { @@ -93,6 +135,8 @@ bind_faction(lua_State * L) class_("faction") .def(tostring(self)) .def(self == faction()) + .def("set_policy", &faction_setpolicy) + .def("get_policy", &faction_getpolicy) .def_readonly("name", &faction::name) .def_readonly("password", &faction::passw) .def_readonly("email", &faction::email) diff --git a/src/eressea/lua/unit.cpp b/src/eressea/lua/unit.cpp index 03e0ffd61..8863d25f1 100644 --- a/src/eressea/lua/unit.cpp +++ b/src/eressea/lua/unit.cpp @@ -234,6 +234,39 @@ operator==(const unit& a, const unit&b) return a.no==b.no; } +static int +unit_getaura(const unit& u) +{ + return get_spellpoints(&u); +} + +static void +unit_setaura(unit& u, int points) +{ + return set_spellpoints(&u, points); +} + +static const char * +unit_getmagic(const unit& u) +{ + sc_mage * mage = get_mage(&u); + return mage?magietypen[mage->magietyp]:NULL; +} + +static void +unit_setmagic(unit& u, const char * type) +{ + sc_mage * mage = get_mage(&u); + magic_t mtype; + for (mtype=0;mtype!=MAXMAGIETYP;++mtype) { + if (strcmp(magietypen[mtype], type)==0) break; + } + if (mtype==MAXMAGIETYP) return; + if (mage==NULL) { + mage = create_mage(&u, mtype); + } +} + void bind_unit(lua_State * L) { @@ -256,6 +289,8 @@ bind_unit(lua_State * L) .def("set_racename", &unit_setracename) .def("add_spell", &unit_addspell) .def("remove_spell", &unit_removespell) + .property("circle", &unit_getmagic, &unit_setmagic) + .property("aura", &unit_getaura, &unit_setaura) .property("region", &unit_getregion, &unit_setregion) .property("is_familiar", &unit_isfamiliar) .property("spells", &unit_spells, return_stl_iterator) diff --git a/src/res/races.xml b/src/res/races.xml index 05fc34684..699a02d00 100644 --- a/src/res/races.xml +++ b/src/res/races.xml @@ -1,1412 +1,1430 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +