#include #include #include "bindings.h" #include #include #include // kernel includes #include #include #include #include #include #include #include #include #include #include #include // lua includes #include #include #include // util includes #include #include #include #include #include #include using namespace luabind; static int lua_addequipment(const char * eqname, const char * iname, const char * value) { if (iname==NULL) return -1; const struct item_type * itype = it_find(iname); if (itype==NULL) return -1; equipment_setitem(create_equipment(eqname), itype, value); return 0; } static int get_turn(void) { return turn; } static int get_nmrs(int n) { if (n<=NMRTimeout()) { if (nmrs==NULL) update_nmrs(); return nmrs[n]; } return 0; } static int find_plane_id(const char * name) { plane * pl = getplanebyname(name); return pl?pl->id:0; } static bool get_flag(const char * name) { int flag = atoi36(name); attrib * a = find_key(global.attribs, flag); return (a!=NULL); } static void set_flag(const char * name, bool value) { int flag = atoi36(name); attrib * a = find_key(global.attribs, flag); if (a==NULL && value) { add_key(&global.attribs, flag); } else if (a!=NULL && !value) { a_remove(&global.attribs, a); } } static const char * get_gamename(void) { return global.gamename; } static void lua_setstring(const char * lname, const char * key, const char * str) { struct locale * lang = find_locale(lname); locale_setstring(lang, key, str); } static const char * lua_getstring(const char * lname, const char * key) { struct locale * lang = find_locale(lname); return locale_getstring(lang, key); } #define ISLANDSIZE 20 #define TURNS_PER_ISLAND 4 static void lua_autoseed(const char * filename, bool new_island) { newfaction * players = read_newfactions(filename); if (players!=NULL) { rng_init(players->subscription); while (players) { int n = listlen(players); int k = (n+ISLANDSIZE-1)/ISLANDSIZE; k = n / k; n = autoseed(&players, k, new_island || (turn % TURNS_PER_ISLAND)==0); if (n==0) { break; } } } } #ifdef LUABIND_NO_EXCEPTIONS static void error_callback(lua_State * L) { } #endif static int get_direction(const char * name) { for (int i=0;i!=MAXDIRECTIONS;++i) { if (strcasecmp(directions[i], name)==0) return i; } return NODIRECTION; } static void lua_equipunit(unit& u, const char * eqname) { equip_unit(&u, get_equipment(eqname)); } static void update_subscriptions(void) { FILE * F; char zText[MAX_PATH]; faction * f; strcat(strcpy(zText, basepath()), "/subscriptions"); F = fopen(zText, "r"); if (F==NULL) { log_info((0, "could not open %s.\n", zText)); return; } for (;;) { char zFaction[5]; int subscription, fno; if (fscanf(F, "%d %s", &subscription, zFaction)<=0) break; fno = atoi36(zFaction); f = findfaction(fno); if (f!=NULL) { f->subscription=subscription; } } fclose(F); sprintf(zText, "subscriptions.%u", turn); F = fopen(zText, "w"); for (f=factions;f!=NULL;f=f->next) { fprintf(F, "%s:%u:%s:%s:%s:%u:\n", itoa36(f->no), f->subscription, f->email, f->override, dbrace(f->race), f->lastorders); } fclose(F); } static void lua_learnskill(unit& u, const char * skname, float chances) { skill_t sk = sk_find(skname); if (sk!=NOSKILL) { learn_skill(&u, sk, chances); } } bool is_function(struct lua_State * luaState, const char * fname) { #if LUABIND_BETA>7 || (LUABIND_BETA==7 && LUABIND_DEVEL>=2) object g = globals(luaState); object fun = g[fname]; if (fun.is_valid()) { if (type(fun)==LUA_TFUNCTION) { return true; } log_warning(("Lua global object %s is not a function, type is %u\n", fname, type(fun))); if (type(fun)!=LUA_TNIL) { log_warning(("Lua global object %s is not a function, type is %u\n", fname, type(fun))); } } #else object g = get_globals(luaState); object fun = g[fname]; if (fun.is_valid()) { if (fun.type()==LUA_TFUNCTION) { return true; } if (fun.type()!=LUA_TNIL) { log_warning(("Lua global object %s is not a function, type is %u\n", fname, fun.type())); } } #endif return false; } void bind_eressea(lua_State * L) { module(L)[ def("atoi36", &atoi36), def("itoa36", &itoa36), def("dice_roll", &dice_rand), def("equipment_setitem", &lua_addequipment), def("get_turn", &get_turn), def("get_nmrs", &get_nmrs), def("remove_empty_units", &remove_empty_units), def("update_subscriptions", &update_subscriptions), def("update_scores", &score), def("equip_unit", &lua_equipunit), def("learn_skill", &lua_learnskill), /* map making */ def("autoseed", lua_autoseed), /* string to enum */ def("direction", &get_direction), /* localization: */ def("set_string", &lua_setstring), def("get_string", &lua_getstring), def("set_flag", &set_flag), def("get_flag", &get_flag), def("get_gamename", &get_gamename), /* planes not really implemented */ def("get_plane_id", &find_plane_id) ]; #ifdef LUABIND_NO_EXCEPTIONS luabind::set_error_callback(error_callback); #endif }