2003-11-10 00:36:11 +01:00
|
|
|
#include <config.h>
|
|
|
|
#include <eressea.h>
|
2004-03-07 13:50:53 +01:00
|
|
|
#include "list.h"
|
2003-11-10 00:36:11 +01:00
|
|
|
|
2004-02-05 20:04:58 +01:00
|
|
|
// Atributes includes
|
|
|
|
#include <attributes/racename.h>
|
|
|
|
|
2003-11-10 00:36:11 +01:00
|
|
|
// kernel includes
|
2004-02-17 00:58:47 +01:00
|
|
|
#include <kernel/race.h>
|
2003-12-14 11:02:29 +01:00
|
|
|
#include <kernel/region.h>
|
|
|
|
#include <kernel/item.h>
|
|
|
|
#include <kernel/faction.h>
|
|
|
|
#include <kernel/skill.h>
|
|
|
|
#include <kernel/unit.h>
|
2004-03-07 13:50:53 +01:00
|
|
|
#include <kernel/magic.h>
|
2004-03-09 01:00:07 +01:00
|
|
|
#include <kernel/spell.h>
|
2003-11-10 00:36:11 +01:00
|
|
|
|
|
|
|
// lua includes
|
|
|
|
#include <lua.hpp>
|
|
|
|
#include <luabind/luabind.hpp>
|
|
|
|
#include <luabind/iterator_policy.hpp>
|
|
|
|
|
|
|
|
using namespace luabind;
|
2003-12-14 11:02:29 +01:00
|
|
|
|
2004-03-07 13:50:53 +01:00
|
|
|
class bind_spell_ptr {
|
|
|
|
public:
|
|
|
|
static spell_ptr * next(spell_ptr * node) { return node->next; }
|
|
|
|
static spell * value(spell_ptr * node) { return find_spellbyid(node->spellid); }
|
|
|
|
};
|
|
|
|
|
|
|
|
static eressea::list<spell, spell_ptr, bind_spell_ptr>
|
|
|
|
unit_spells(const unit& u) {
|
|
|
|
sc_mage * mage = get_mage(&u);
|
|
|
|
if (mage==NULL) return eressea::list<spell, spell_ptr, bind_spell_ptr>(NULL);
|
|
|
|
spell_ptr * splist = mage->spellptr;
|
|
|
|
return eressea::list<spell, spell_ptr, bind_spell_ptr>(splist);
|
|
|
|
}
|
|
|
|
|
|
|
|
class bind_spell_list {
|
|
|
|
public:
|
|
|
|
static spell_list * next(spell_list * node) { return node->next; }
|
|
|
|
static spell * value(spell_list * node) { return node->data; }
|
|
|
|
};
|
|
|
|
|
|
|
|
static eressea::list<spell, spell_list, bind_spell_list>
|
|
|
|
unit_familiarspells(const unit& u) {
|
|
|
|
spell_list * spells = familiarspells(u.race);
|
|
|
|
return eressea::list<spell, spell_list, bind_spell_list>(spells);
|
|
|
|
}
|
|
|
|
|
2003-12-14 17:34:00 +01:00
|
|
|
static unit *
|
|
|
|
add_unit(faction * f, region * r)
|
|
|
|
{
|
|
|
|
if (f->units==NULL) return addplayer(r, f);
|
|
|
|
return createunit(r, f, 0, f->race);
|
|
|
|
}
|
|
|
|
|
2003-12-14 11:02:29 +01:00
|
|
|
static void
|
|
|
|
unit_setnumber(unit& u, int number)
|
|
|
|
{
|
2003-12-14 20:17:59 +01:00
|
|
|
if (u.number==0) {
|
|
|
|
set_number(&u, number);
|
|
|
|
u.hp = unit_max_hp(&u) * number;
|
2004-04-11 01:59:03 +02:00
|
|
|
} else {
|
|
|
|
scale_number(&u, number);
|
2003-12-14 20:17:59 +01:00
|
|
|
}
|
2003-12-14 11:02:29 +01:00
|
|
|
}
|
|
|
|
|
2004-02-05 20:04:58 +01:00
|
|
|
static void
|
|
|
|
unit_setracename(unit& u, const char * name)
|
|
|
|
{
|
|
|
|
set_racename(&u.attribs, name);
|
|
|
|
}
|
|
|
|
|
2003-12-14 11:02:29 +01:00
|
|
|
static int
|
|
|
|
unit_getnumber(const unit& u)
|
|
|
|
{
|
|
|
|
return u.number;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
unit_getitem(const unit& u, const char * iname)
|
|
|
|
{
|
|
|
|
const item_type * itype = it_find(iname);
|
|
|
|
if (itype!=NULL) {
|
|
|
|
return i_get(u.items, itype);
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
unit_additem(unit& u, const char * iname, int number)
|
|
|
|
{
|
|
|
|
const item_type * itype = it_find(iname);
|
|
|
|
if (itype!=NULL) {
|
|
|
|
item * i = i_change(&u.items, itype, number);
|
|
|
|
return i?i->number:0;
|
|
|
|
} // if (itype!=NULL)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
unit_getskill(const unit& u, const char * skname)
|
|
|
|
{
|
|
|
|
skill_t sk = sk_find(skname);
|
|
|
|
if (sk!=NOSKILL) {
|
|
|
|
skill * sv = get_skill(&u, sk);
|
2004-01-04 17:02:02 +01:00
|
|
|
if (sv==NULL) return 0;
|
2003-12-14 11:02:29 +01:00
|
|
|
return sv->level;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
unit_effskill(const unit& u, const char * skname)
|
|
|
|
{
|
|
|
|
skill_t sk = sk_find(skname);
|
|
|
|
if (sk!=NOSKILL) {
|
|
|
|
return effskill(&u, sk);
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
unit_setskill(unit& u, const char * skname, int level)
|
|
|
|
{
|
|
|
|
skill_t sk = sk_find(skname);
|
|
|
|
if (sk!=NOSKILL) {
|
|
|
|
set_level(&u, sk, level);
|
|
|
|
return level;
|
|
|
|
} // if (sk!=NULL)
|
|
|
|
return -1;
|
|
|
|
}
|
2003-11-10 00:36:11 +01:00
|
|
|
|
2004-02-17 00:58:47 +01:00
|
|
|
static const char *
|
|
|
|
unit_getrace(const unit& u)
|
|
|
|
{
|
|
|
|
return u.race->_name[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
unit_setrace(unit& u, const char * rcname)
|
|
|
|
{
|
|
|
|
race * rc = rc_find(rcname);
|
|
|
|
if (rc!=NULL) {
|
|
|
|
u.race = rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-03-09 01:00:07 +01:00
|
|
|
static void
|
|
|
|
unit_addspell(unit& u, const char * name)
|
|
|
|
{
|
|
|
|
bool add = false;
|
2004-04-10 22:25:40 +02:00
|
|
|
spell_list * slist = spells;
|
|
|
|
while (slist!=NULL) {
|
|
|
|
spell * sp = slist->data;
|
2004-03-09 01:00:07 +01:00
|
|
|
if (strcmp(name, sp->sname)==0) {
|
|
|
|
if (add) log_error(("two spells are called %s.\n", name));
|
|
|
|
addspell(&u, sp->id);
|
|
|
|
add = true;
|
|
|
|
}
|
2004-04-10 22:25:40 +02:00
|
|
|
slist=slist->next;
|
2004-03-09 01:00:07 +01:00
|
|
|
}
|
|
|
|
if (!add) log_error(("spell %s could not be found\n", name));
|
|
|
|
}
|
|
|
|
|
2004-03-19 01:14:41 +01:00
|
|
|
static bool
|
|
|
|
unit_isfamiliar(const unit& u)
|
|
|
|
{
|
2004-04-10 22:25:40 +02:00
|
|
|
return is_familiar(&u)!=0;
|
2004-03-19 01:14:41 +01:00
|
|
|
}
|
|
|
|
|
2004-03-09 01:00:07 +01:00
|
|
|
static void
|
|
|
|
unit_removespell(unit& u, const spell * sp)
|
|
|
|
{
|
|
|
|
sc_mage * mage = get_mage(&u);
|
|
|
|
if (mage!=NULL) {
|
|
|
|
spell_ptr ** isptr = &mage->spellptr;
|
|
|
|
while (*isptr && (*isptr)->spellid != sp->id) {
|
|
|
|
isptr = &(*isptr)->next;
|
|
|
|
}
|
|
|
|
if (*isptr) {
|
|
|
|
spell_ptr * sptr = *isptr;
|
|
|
|
*isptr = sptr->next;
|
|
|
|
free(sptr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-03-19 00:48:40 +01:00
|
|
|
static int
|
|
|
|
unit_hpmax(const unit& u)
|
|
|
|
{
|
|
|
|
return unit_max_hp(&u);
|
|
|
|
}
|
2004-03-09 01:00:07 +01:00
|
|
|
|
2004-04-11 01:21:58 +02:00
|
|
|
static void
|
|
|
|
unit_setregion(unit& u, region& r)
|
|
|
|
{
|
|
|
|
move_unit(&u, &r, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static region *
|
|
|
|
unit_getregion(const unit& u)
|
|
|
|
{
|
|
|
|
return u.region;
|
|
|
|
}
|
|
|
|
|
2003-11-10 00:36:11 +01:00
|
|
|
void
|
|
|
|
bind_unit(lua_State * L)
|
|
|
|
{
|
|
|
|
module(L)[
|
|
|
|
def("get_unit", &findunit),
|
2003-12-14 17:34:00 +01:00
|
|
|
def("add_unit", &add_unit),
|
2003-11-10 00:36:11 +01:00
|
|
|
|
|
|
|
class_<struct unit>("unit")
|
2004-04-11 02:12:03 +02:00
|
|
|
.def_readwrite("name", &unit::name)
|
2003-12-14 11:02:29 +01:00
|
|
|
.def_readonly("faction", &unit::faction)
|
2003-11-10 00:36:11 +01:00
|
|
|
.def_readonly("id", &unit::no)
|
2004-03-19 01:07:32 +01:00
|
|
|
.def_readwrite("hp", &unit::hp)
|
2003-12-14 11:02:29 +01:00
|
|
|
.def("get_item", &unit_getitem)
|
|
|
|
.def("add_item", &unit_additem)
|
|
|
|
.def("get_skill", &unit_getskill)
|
|
|
|
.def("eff_skill", &unit_effskill)
|
|
|
|
.def("set_skill", &unit_setskill)
|
2004-02-05 20:04:58 +01:00
|
|
|
.def("set_racename", &unit_setracename)
|
2004-03-09 01:00:07 +01:00
|
|
|
.def("add_spell", &unit_addspell)
|
|
|
|
.def("remove_spell", &unit_removespell)
|
2004-04-11 01:21:58 +02:00
|
|
|
.property("region", &unit_getregion, &unit_setregion)
|
2004-03-19 01:14:41 +01:00
|
|
|
.property("is_familiar", &unit_isfamiliar)
|
2004-03-07 13:50:53 +01:00
|
|
|
.property("spells", &unit_spells, return_stl_iterator)
|
|
|
|
.property("familiarspells", &unit_familiarspells, return_stl_iterator)
|
2003-12-14 11:02:29 +01:00
|
|
|
.property("number", &unit_getnumber, &unit_setnumber)
|
2004-02-17 00:58:47 +01:00
|
|
|
.property("race", &unit_getrace, &unit_setrace)
|
2004-03-19 01:07:32 +01:00
|
|
|
.property("hp_max", &unit_hpmax)
|
2003-11-10 00:36:11 +01:00
|
|
|
];
|
|
|
|
}
|