/* vi: set ts=2: +-------------------+ | | Enno Rehling | Eressea PBEM host | Christian Schlittchen | (c) 1998 - 2008 | Katja Zedel | | Henning Peters +-------------------+ This program may not be used, modified or distributed without prior permission by the authors of Eressea. */ #include #include "bind_faction.h" #include "bind_unit.h" #include "bindings.h" #include #include #include #include #include #include #include #include #include #include #include #include int tolua_factionlist_next(lua_State *L) { faction** faction_ptr = (faction **)lua_touserdata(L, lua_upvalueindex(1)); faction * f = *faction_ptr; if (f != NULL) { tolua_pushusertype(L, (void*)f, TOLUA_CAST "faction"); *faction_ptr = f->next; return 1; } else return 0; /* no more values to return */ } int tolua_factionlist_iter(lua_State *L) { faction_list** faction_ptr = (faction_list **)lua_touserdata(L, lua_upvalueindex(1)); faction_list* flist = *faction_ptr; if (flist != NULL) { tolua_pushusertype(L, (void*)flist->data, TOLUA_CAST "faction"); *faction_ptr = flist->next; return 1; } else return 0; /* no more values to return */ } static int tolua_faction_get_units(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); unit ** unit_ptr = (unit**)lua_newuserdata(L, sizeof(unit *)); luaL_getmetatable(L, TOLUA_CAST "unit"); lua_setmetatable(L, -2); *unit_ptr = self->units; lua_pushcclosure(L, tolua_unitlist_nextf, 1); return 1; } int tolua_faction_add_item(lua_State *L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); const char * iname = tolua_tostring(L, 2, 0); int number = (int)tolua_tonumber(L, 3, 0); int result = -1; if (iname!=NULL) { const item_type * itype = it_find(iname); if (itype!=NULL) { item * i = i_change(&self->items, itype, number); result = i?i->number:0; } // if (itype!=NULL) } lua_pushnumber(L, result); return 1; } static int tolua_faction_get_maxheroes(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number)maxheroes(self)); return 1; } static int tolua_faction_get_heroes(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number)countheroes(self)); return 1; } static int tolua_faction_get_score(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number)self->score); return 1; } static int tolua_faction_get_id(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number)self->no); return 1; } static int tolua_faction_set_id(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); int id = (int)tolua_tonumber(L, 2, 0); if (findfaction(id)==NULL) { renumber_faction(self, id); lua_pushboolean(L, 1); } else { lua_pushboolean(L, 0); } return 1; } static int tolua_faction_get_age(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number)self->age); return 1; } static int tolua_faction_set_age(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); int age = (int)tolua_tonumber(L, 2, 0); self->age = age; return 0; } static int tolua_faction_get_flags(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number)self->flags); return 1; } static int tolua_faction_get_options(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number)self->options); return 1; } static int tolua_faction_set_options(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); int options = (int)tolua_tonumber(L, 2, self->options); self->options = options; return 1; } static int tolua_faction_get_lastturn(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number)self->lastorders); return 1; } static int tolua_faction_set_lastturn(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); if (self) { self->lastorders = (int)tolua_tonumber(L, 2, self->lastorders); } return 0; } static int tolua_faction_renumber(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); int no = (int)tolua_tonumber(L, 2, 0); renumber_faction(self, no); return 0; } static int tolua_faction_get_objects(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); tolua_pushusertype(L, (void*)&self->attribs, TOLUA_CAST "hashtable"); return 1; } static int tolua_faction_get_policy(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); faction * other = (faction *)tolua_tousertype(L, 2, 0); const char * policy = tolua_tostring(L, 3, 0); int result = 0, mode; for (mode=0;helpmodes[mode].name!=NULL;++mode) { if (strcmp(policy, helpmodes[mode].name)==0) { result = get_alliance(self, other) & mode; break; } } tolua_pushnumber(L, (lua_Number)result); return 1; } static int tolua_faction_set_policy(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); faction * other = (faction *)tolua_tousertype(L, 2, 0); const char * policy = tolua_tostring(L, 3, 0); int value = tolua_toboolean(L, 4, 0); int mode; for (mode=0;helpmodes[mode].name!=NULL;++mode) { if (strcmp(policy, helpmodes[mode].name)==0) { if (value) { set_alliance(self, other, get_alliance(self, other) | helpmodes[mode].status); } else { set_alliance(self, other, get_alliance(self, other) & ~helpmodes[mode].status); } break; } } return 0; } static int tolua_faction_normalize(lua_State* L) { faction * f = (faction *)tolua_tousertype(L, 1, 0); region * r = (region * )tolua_tousertype(L, 2, 0); if (r) { plane * pl = rplane(r); int nx = r->x, ny = r->y; pnormalize(&nx, &ny, pl); adjust_coordinates(f, &nx, &ny, pl, r); tolua_pushnumber(L, (lua_Number)nx); tolua_pushnumber(L, (lua_Number)ny); return 2; } return 0; } static int tolua_faction_set_origin(lua_State* L) { faction * f = (faction *)tolua_tousertype(L, 1, 0); region * r = (region *)tolua_tousertype(L, 2, 0); plane * pl = rplane(r); int id = pl?pl->id:0; set_ursprung(f, id, r->x - plane_center_x(pl), r->y - plane_center_y(pl)); return 0; } static int tolua_faction_get_origin(lua_State* L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); ursprung * origin = self->ursprung; int x, y; while (origin!=NULL && origin->id!=0) { origin = origin->next; } if (origin) { x = origin->x; y = origin->y; } else { x = 0; y = 0; } tolua_pushnumber(L, (lua_Number)x); tolua_pushnumber(L, (lua_Number)y); return 2; } static int tolua_faction_destroy(lua_State* L) { faction* f = (faction*) tolua_tousertype(L, 1, 0); destroyfaction(f); return 0; } static int tolua_faction_create(lua_State* L) { const char * email = tolua_tostring(L, 1, 0); const char * racename = tolua_tostring(L, 2, 0); const char * lang = tolua_tostring(L, 3, 0); struct locale * loc = find_locale(lang); faction * f = NULL; const struct race * frace = rc_find(racename); if (frace==NULL) frace = findrace(racename, find_locale("de")); if (frace==NULL) frace = findrace(racename, find_locale("en")); if (frace!=NULL) { f = addfaction(email, NULL, frace, loc, 0); } if (!f) { log_error(("faction.create(%s, %s, %s)\n", email, racename, lang)); } tolua_pushusertype(L, f, TOLUA_CAST "faction"); return 1; } static int tolua_faction_get_password(lua_State* L) { faction* self = (faction*) tolua_tousertype(L, 1, 0); tolua_pushstring(L, faction_getpassword(self)); return 1; } static int tolua_faction_set_password(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); faction_setpassword(self, tolua_tostring(L, 2, 0)); return 0; } static int tolua_faction_get_email(lua_State* L) { faction* self = (faction*) tolua_tousertype(L, 1, 0); tolua_pushstring(L, faction_getemail(self)); return 1; } static int tolua_faction_set_email(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); faction_setemail(self, tolua_tostring(L, 2, 0)); return 0; } static int tolua_faction_get_locale(lua_State* L) { faction* self = (faction*) tolua_tousertype(L, 1, 0); tolua_pushstring(L, locale_name(self->locale)); return 1; } static int tolua_faction_set_locale(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); const char * name = tolua_tostring(L, 2, 0); self->locale = find_locale(name); return 0; } static int tolua_faction_get_race(lua_State* L) { faction* self = (faction*) tolua_tousertype(L, 1, 0); tolua_pushstring(L, self->race->_name[0]); return 1; } static int tolua_faction_set_race(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); const char * name = tolua_tostring(L, 2, 0); race * rc = rc_find(name); if (rc!=NULL) { self->race = rc; } return 0; } static int tolua_faction_get_name(lua_State* L) { faction* self = (faction*) tolua_tousertype(L, 1, 0); tolua_pushstring(L, faction_getname(self)); return 1; } static int tolua_faction_set_name(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); faction_setname(self, tolua_tostring(L, 2, 0)); return 0; } static int tolua_faction_get_uid(lua_State* L) { faction* f = (faction*) tolua_tousertype(L, 1, 0); tolua_pushnumber(L, f->subscription); return 1; } static int tolua_faction_set_uid(lua_State* L) { faction* f = (faction*)tolua_tousertype(L, 1, 0); f->subscription = (int)tolua_tonumber(L, 2, 0); return 0; } static int tolua_faction_get_info(lua_State* L) { faction* self = (faction*) tolua_tousertype(L, 1, 0); tolua_pushstring(L, faction_getbanner(self)); return 1; } static int tolua_faction_set_info(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); faction_setbanner(self, tolua_tostring(L, 2, 0)); return 0; } static int tolua_faction_get_alliance(lua_State* L) { faction* self = (faction*) tolua_tousertype(L, 1, 0); tolua_pushusertype(L, f_get_alliance(self), TOLUA_CAST "alliance"); return 1; } static int tolua_faction_set_alliance(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); alliance* alli = (alliance*)tolua_tousertype(L, 2, 0); setalliance(self, alli); return 0; } static int tolua_faction_get_items(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); item ** item_ptr = (item **)lua_newuserdata(L, sizeof(item *)); luaL_getmetatable(L, TOLUA_CAST "item"); lua_setmetatable(L, -2); *item_ptr = self->items; lua_pushcclosure(L, tolua_itemlist_next, 1); return 1; } static int tolua_faction_tostring(lua_State *L) { faction * self = (faction *)tolua_tousertype(L, 1, 0); lua_pushstring(L, factionname(self)); return 1; } static int tolua_faction_get_spells(lua_State* L) { faction* self = (faction*)tolua_tousertype(L, 1, 0); spell_list * slist = self->spellbook; if (slist) { spell_list ** spell_ptr = (spell_list **)lua_newuserdata(L, sizeof(spell_list *)); luaL_getmetatable(L, TOLUA_CAST "spell_list"); lua_setmetatable(L, -2); *spell_ptr = slist; lua_pushcclosure(L, tolua_spelllist_next, 1); return 1; } lua_pushnil(L); return 1; } void tolua_faction_open(lua_State* L) { /* register user types */ tolua_usertype(L, TOLUA_CAST "faction"); tolua_usertype(L, TOLUA_CAST "faction_list"); tolua_module(L, NULL, 0); tolua_beginmodule(L, NULL); { tolua_cclass(L, TOLUA_CAST "faction", TOLUA_CAST "faction", TOLUA_CAST "", NULL); tolua_beginmodule(L, TOLUA_CAST "faction"); { tolua_function(L, TOLUA_CAST "__tostring", tolua_faction_tostring); tolua_variable(L, TOLUA_CAST "id", tolua_faction_get_id, tolua_faction_set_id); tolua_variable(L, TOLUA_CAST "uid", &tolua_faction_get_uid, &tolua_faction_set_uid); tolua_variable(L, TOLUA_CAST "name", &tolua_faction_get_name, &tolua_faction_set_name); tolua_variable(L, TOLUA_CAST "info", &tolua_faction_get_info, &tolua_faction_set_info); tolua_variable(L, TOLUA_CAST "units", tolua_faction_get_units, NULL); tolua_variable(L, TOLUA_CAST "heroes", tolua_faction_get_heroes, NULL); tolua_variable(L, TOLUA_CAST "spells", tolua_faction_get_spells, 0); tolua_variable(L, TOLUA_CAST "maxheroes", tolua_faction_get_maxheroes, NULL); tolua_variable(L, TOLUA_CAST "password", tolua_faction_get_password, tolua_faction_set_password); tolua_variable(L, TOLUA_CAST "email", tolua_faction_get_email, tolua_faction_set_email); tolua_variable(L, TOLUA_CAST "locale", tolua_faction_get_locale, tolua_faction_set_locale); tolua_variable(L, TOLUA_CAST "race", tolua_faction_get_race, tolua_faction_set_race); tolua_variable(L, TOLUA_CAST "alliance", tolua_faction_get_alliance, tolua_faction_set_alliance); tolua_variable(L, TOLUA_CAST "score", tolua_faction_get_score, NULL); tolua_variable(L, TOLUA_CAST "age", tolua_faction_get_age, tolua_faction_set_age); tolua_variable(L, TOLUA_CAST "options", tolua_faction_get_options, tolua_faction_set_options); tolua_variable(L, TOLUA_CAST "flags", tolua_faction_get_flags, NULL); tolua_variable(L, TOLUA_CAST "lastturn", tolua_faction_get_lastturn, tolua_faction_set_lastturn); tolua_function(L, TOLUA_CAST "set_policy", &tolua_faction_set_policy); tolua_function(L, TOLUA_CAST "get_policy", &tolua_faction_get_policy); tolua_function(L, TOLUA_CAST "get_origin", &tolua_faction_get_origin); tolua_function(L, TOLUA_CAST "set_origin", &tolua_faction_set_origin); tolua_function(L, TOLUA_CAST "normalize", &tolua_faction_normalize); tolua_function(L, TOLUA_CAST "add_item", tolua_faction_add_item); tolua_variable(L, TOLUA_CAST "items", tolua_faction_get_items, NULL); tolua_function(L, TOLUA_CAST "renumber", &tolua_faction_renumber); tolua_function(L, TOLUA_CAST "create", &tolua_faction_create); tolua_function(L, TOLUA_CAST "destroy", &tolua_faction_destroy); #ifdef TODO def("faction_origin", &faction_getorigin, pure_out_value(_2) + pure_out_value(_3)), .def_readwrite("subscription", &faction::subscription) .property("x", &faction_getorigin_x, &faction_setorigin_x) .property("y", &faction_getorigin_y, &faction_setorigin_y) .def("add_notice", &faction_addnotice) #endif tolua_variable(L, TOLUA_CAST "objects", tolua_faction_get_objects, NULL); } tolua_endmodule(L); } tolua_endmodule(L); }