/* 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_building.h" #include "bind_unit.h" #include #include #include #include #include #include #include int tolua_buildinglist_next(lua_State * L) { building **building_ptr = (building **) lua_touserdata(L, lua_upvalueindex(1)); building *u = *building_ptr; if (u != NULL) { tolua_pushusertype(L, (void *)u, TOLUA_CAST "building"); *building_ptr = u->next; return 1; } else return 0; /* no more values to return */ } static int tolua_building_addaction(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); const char *fname = tolua_tostring(L, 2, 0); const char *param = tolua_tostring(L, 3, 0); building_addaction(self, fname, param); return 0; } static int tolua_building_get_objects(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); tolua_pushusertype(L, (void *)&self->attribs, TOLUA_CAST "hashtable"); return 1; } static int tolua_building_get_region(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); tolua_pushusertype(L, building_getregion(self), TOLUA_CAST "region"); return 1; } static int tolua_building_set_region(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); building_setregion(self, (region *) tolua_tousertype(L, 2, 0)); return 0; } static int tolua_building_get_info(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); tolua_pushstring(L, self->display); return 1; } static int tolua_building_set_info(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); const char *info = tolua_tostring(L, 2, 0); free(self->display); if (info) self->display = strdup(info); else self->display = NULL; return 0; } static int tolua_building_get_name(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); tolua_pushstring(L, building_getname(self)); return 1; } static int tolua_building_set_name(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); building_setname(self, tolua_tostring(L, 2, 0)); return 0; } static int tolua_building_get_size(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); tolua_pushnumber(L, self->size); return 1; } static int tolua_building_set_size(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); self->size = (int)tolua_tonumber(L, 2, 0); return 0; } static int tolua_building_get_units(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); unit **unit_ptr = (unit **) lua_newuserdata(L, sizeof(unit *)); unit *u = self->region->units; while (u && u->building != self) u = u->next; luaL_getmetatable(L, "unit"); lua_setmetatable(L, -2); *unit_ptr = u; lua_pushcclosure(L, tolua_unitlist_nextb, 1); return 1; } static int tolua_building_get_id(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); tolua_pushnumber(L, (lua_Number) self->no); return 1; } static int tolua_building_get_type(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); tolua_pushstring(L, self->type->_name); return 1; } static int tolua_building_get_typename(lua_State * L) { building *b = (building *) tolua_tousertype(L, 1, 0); if (b) { int size = (int)tolua_tonumber(L, 2, b->size); tolua_pushstring(L, buildingtype(b->type, b, size)); return 1; } return 0; } static int tolua_building_get_owner(lua_State * L) { building *b = (building *) tolua_tousertype(L, 1, 0); unit *u = b ? building_owner(b) : NULL; tolua_pushusertype(L, u, TOLUA_CAST "unit"); return 1; } static int tolua_building_set_owner(lua_State * L) { building *b = (building *) tolua_tousertype(L, 1, 0); unit *u = (unit *) tolua_tousertype(L, 2, 0); unit *o = b ? building_owner(b) : NULL; if (o && o != u) { freset(o, UFL_OWNER); } if (u) { fset(u, UFL_OWNER); } return 0; } static int tolua_building_create(lua_State * L) { region *r = (region *) tolua_tousertype(L, 1, 0); const char *bname = tolua_tostring(L, 2, 0); if (bname) { const building_type *btype = bt_find(bname); if (btype) { building *b = new_building(btype, r, default_locale); tolua_pushusertype(L, (void *)b, TOLUA_CAST "building"); return 1; } } return 0; } static int tolua_building_tostring(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); lua_pushstring(L, buildingname(self)); return 1; } static int tolua_building_destroy(lua_State * L) { building *self = (building *) tolua_tousertype(L, 1, 0); remove_building(&self->region->buildings, self); return 0; } void tolua_building_open(lua_State * L) { /* register user types */ tolua_usertype(L, TOLUA_CAST "building"); tolua_module(L, NULL, 0); tolua_beginmodule(L, NULL); { tolua_cclass(L, TOLUA_CAST "building", TOLUA_CAST "building", TOLUA_CAST "", NULL); tolua_beginmodule(L, TOLUA_CAST "building"); { tolua_function(L, TOLUA_CAST "create", tolua_building_create); tolua_function(L, TOLUA_CAST "destroy", tolua_building_destroy); tolua_function(L, TOLUA_CAST "__tostring", tolua_building_tostring); tolua_variable(L, TOLUA_CAST "id", tolua_building_get_id, NULL); tolua_variable(L, TOLUA_CAST "owner", tolua_building_get_owner, tolua_building_set_owner); tolua_variable(L, TOLUA_CAST "type", tolua_building_get_type, NULL); tolua_variable(L, TOLUA_CAST "name", tolua_building_get_name, tolua_building_set_name); tolua_variable(L, TOLUA_CAST "info", tolua_building_get_info, tolua_building_set_info); tolua_variable(L, TOLUA_CAST "units", tolua_building_get_units, NULL); tolua_variable(L, TOLUA_CAST "region", tolua_building_get_region, tolua_building_set_region); tolua_variable(L, TOLUA_CAST "size", tolua_building_get_size, tolua_building_set_size); tolua_function(L, TOLUA_CAST "add_action", tolua_building_addaction); tolua_function(L, TOLUA_CAST "get_typename", tolua_building_get_typename); #ifdef TODO .property("type", &building_gettype) .def_readwrite("size", &building::size) #endif tolua_variable(L, TOLUA_CAST "objects", tolua_building_get_objects, 0); } tolua_endmodule(L); } tolua_endmodule(L); }