forked from github/server
972 lines
23 KiB
C
972 lines
23 KiB
C
/* vi: set ts=2:
|
|
+-------------------+
|
|
| | Enno Rehling <enno@eressea.de>
|
|
| Eressea PBEM host | Christian Schlittchen <corwin@amber.kn-bremen.de>
|
|
| (c) 1998 - 2008 | Katja Zedel <katze@felidae.kn-bremen.de>
|
|
| | Henning Peters <faroul@beyond.kn-bremen.de>
|
|
+-------------------+
|
|
|
|
This program may not be used, modified or distributed
|
|
without prior permission by the authors of Eressea.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include "bindings.h"
|
|
#include "bind_unit.h"
|
|
#include "bind_faction.h"
|
|
#include "bind_region.h"
|
|
#include "helpers.h"
|
|
|
|
#include <kernel/eressea.h>
|
|
|
|
#include <kernel/alliance.h>
|
|
#include <kernel/skill.h>
|
|
#include <kernel/equipment.h>
|
|
#include <kernel/calendar.h>
|
|
#include <kernel/unit.h>
|
|
#include <kernel/terrain.h>
|
|
#include <kernel/message.h>
|
|
#include <kernel/region.h>
|
|
#include <kernel/reports.h>
|
|
#include <kernel/building.h>
|
|
#include <kernel/plane.h>
|
|
#include <kernel/race.h>
|
|
#include <kernel/item.h>
|
|
#include <kernel/order.h>
|
|
#include <kernel/ship.h>
|
|
#include <kernel/teleport.h>
|
|
#include <kernel/faction.h>
|
|
#include <kernel/save.h>
|
|
|
|
#include <gamecode/creport.h>
|
|
#include <gamecode/summary.h>
|
|
#include <gamecode/laws.h>
|
|
#include <gamecode/monster.h>
|
|
|
|
#include <spells/spells.h>
|
|
#include <modules/autoseed.h>
|
|
#include <modules/score.h>
|
|
#include <attributes/key.h>
|
|
|
|
#include <util/attrib.h>
|
|
#include <util/base36.h>
|
|
#include <util/language.h>
|
|
#include <util/lists.h>
|
|
#include <util/log.h>
|
|
#include <util/rand.h>
|
|
#include <util/rng.h>
|
|
#include <util/storage.h>
|
|
|
|
#include <tolua.h>
|
|
#include <lua.h>
|
|
|
|
#include <time.h>
|
|
#include <assert.h>
|
|
|
|
int tolua_orderlist_next(lua_State *L)
|
|
{
|
|
order** order_ptr = (order **)lua_touserdata(L, lua_upvalueindex(1));
|
|
order* ord = *order_ptr;
|
|
if (ord != NULL) {
|
|
char cmd[8192];
|
|
write_order(ord, cmd, sizeof(cmd));
|
|
tolua_pushstring(L, cmd);
|
|
*order_ptr = ord->next;
|
|
return 1;
|
|
}
|
|
else return 0; /* no more values to return */
|
|
}
|
|
|
|
int tolua_spelllist_next(lua_State *L)
|
|
{
|
|
spell_list** spell_ptr = (spell_list **)lua_touserdata(L, lua_upvalueindex(1));
|
|
spell_list* slist = *spell_ptr;
|
|
if (slist != NULL) {
|
|
tolua_pushusertype(L, slist->data, TOLUA_CAST "spell");
|
|
*spell_ptr = slist->next;
|
|
return 1;
|
|
}
|
|
else return 0; /* no more values to return */
|
|
}
|
|
|
|
int tolua_itemlist_next(lua_State *L)
|
|
{
|
|
item** item_ptr = (item **)lua_touserdata(L, lua_upvalueindex(1));
|
|
item* itm = *item_ptr;
|
|
if (itm != NULL) {
|
|
tolua_pushstring(L, itm->type->rtype->_name[0]);
|
|
*item_ptr = itm->next;
|
|
return 1;
|
|
}
|
|
else return 0; /* no more values to return */
|
|
}
|
|
|
|
static int
|
|
tolua_autoseed(lua_State * L)
|
|
{
|
|
const char * filename = tolua_tostring(L, 1, 0);
|
|
int new_island = tolua_toboolean(L, 2, 0);
|
|
newfaction * players = read_newfactions(filename);
|
|
|
|
if (players!=NULL) {
|
|
while (players) {
|
|
int n = listlen(players);
|
|
int k = (n+ISLANDSIZE-1)/ISLANDSIZE;
|
|
k = n / k;
|
|
n = autoseed(&players, k, new_island?0:TURNS_PER_ISLAND);
|
|
if (n==0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int
|
|
tolua_getkey(lua_State* L)
|
|
{
|
|
const char * name = tolua_tostring(L, 1, 0);
|
|
|
|
int flag = atoi36(name);
|
|
attrib * a = find_key(global.attribs, flag);
|
|
lua_pushboolean(L, a!=NULL);
|
|
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_setkey(lua_State* L)
|
|
{
|
|
const char * name = tolua_tostring(L, 1, 0);
|
|
int value = tolua_toboolean(L, 2, 0);
|
|
|
|
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);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_rng_int(lua_State* L)
|
|
{
|
|
lua_pushnumber(L, (lua_Number)rng_int());
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_read_orders(lua_State* L)
|
|
{
|
|
const char * filename = tolua_tostring(L, 1, 0);
|
|
int result = readorders(filename);
|
|
lua_pushnumber(L, (lua_Number)result);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_message_unit(lua_State* L)
|
|
{
|
|
unit * sender = (unit *)tolua_tousertype(L, 1, 0);
|
|
unit * target = (unit *)tolua_tousertype(L, 2, 0);
|
|
const char * str = tolua_tostring(L, 3, 0);
|
|
if (!target) tolua_error(L, TOLUA_CAST "target is nil", NULL);
|
|
if (!sender) tolua_error(L, TOLUA_CAST "sender is nil", NULL);
|
|
deliverMail(target->faction, sender->region, sender, str, target);
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_message_faction(lua_State * L)
|
|
{
|
|
unit * sender = (unit *)tolua_tousertype(L, 1, 0);
|
|
faction * target = (faction *)tolua_tousertype(L, 2, 0);
|
|
const char * str = tolua_tostring(L, 3, 0);
|
|
if (!target) tolua_error(L, TOLUA_CAST "target is nil", NULL);
|
|
if (!sender) tolua_error(L, TOLUA_CAST "sender is nil", NULL);
|
|
|
|
deliverMail(target, sender->region, sender, str, NULL);
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_message_region(lua_State * L)
|
|
{
|
|
unit * sender = (unit *)tolua_tousertype(L, 1, 0);
|
|
const char * str = tolua_tostring(L, 2, 0);
|
|
|
|
if (!sender) tolua_error(L, TOLUA_CAST "sender is nil", NULL);
|
|
ADDMSG(&sender->region->msgs, msg_message("mail_result", "unit message", sender, str));
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
free_script(attrib * a)
|
|
{
|
|
lua_State * L = (lua_State *)global.vm_state;
|
|
if (a->data.i>0) {
|
|
luaL_unref(L, LUA_REGISTRYINDEX, a->data.i);
|
|
}
|
|
}
|
|
|
|
attrib_type at_script = {
|
|
"script",
|
|
NULL, free_script, NULL,
|
|
NULL, NULL, ATF_UNIQUE
|
|
};
|
|
|
|
static int
|
|
call_script(lua_State * L, struct unit * u)
|
|
{
|
|
const attrib * a = a_findc(u->attribs, &at_script);
|
|
if (a==NULL) a = a_findc(u->race->attribs, &at_script);
|
|
if (a!=NULL && a->data.i>0) {
|
|
lua_rawgeti(L, LUA_REGISTRYINDEX, a->data.i);
|
|
if (lua_pcall(L, 1, 0, 0)!=0) {
|
|
const char* error = lua_tostring(L, -1);
|
|
log_error(("call_script (%s): %s", unitname(u), error));
|
|
lua_pop(L, 1);
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static void
|
|
setscript(lua_State * L, struct attrib ** ap)
|
|
{
|
|
attrib * a = a_find(*ap, &at_script);
|
|
if (a == NULL) {
|
|
a = a_add(ap, a_new(&at_script));
|
|
} else if (a->data.i>0) {
|
|
luaL_unref(L, LUA_REGISTRYINDEX, a->data.i);
|
|
}
|
|
a->data.i = luaL_ref(L, LUA_REGISTRYINDEX);
|
|
}
|
|
|
|
static int
|
|
tolua_update_guards(lua_State * L)
|
|
{
|
|
update_guards();
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_get_turn(lua_State * L)
|
|
{
|
|
tolua_pushnumber(L, (lua_Number)turn);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_atoi36(lua_State * L)
|
|
{
|
|
const char * s = tolua_tostring(L, 1, 0);
|
|
tolua_pushnumber(L, (lua_Number)atoi36(s));
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_itoa36(lua_State * L)
|
|
{
|
|
int i = (int)tolua_tonumber(L, 1, 0);
|
|
tolua_pushstring(L, itoa36(i));
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_dice_rand(lua_State * L)
|
|
{
|
|
const char * s = tolua_tostring(L, 1, 0);
|
|
tolua_pushnumber(L, dice_rand(s));
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_addequipment(lua_State * L)
|
|
{
|
|
const char * eqname = tolua_tostring(L, 1, 0);
|
|
const char * iname = tolua_tostring(L, 2, 0);
|
|
const char * value = tolua_tostring(L, 3, 0);
|
|
int result = -1;
|
|
if (iname!=NULL) {
|
|
const struct item_type * itype = it_find(iname);
|
|
if (itype!=NULL) {
|
|
equipment_setitem(create_equipment(eqname), itype, value);
|
|
result = 0;
|
|
}
|
|
}
|
|
lua_pushnumber(L, (lua_Number)result);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_season(lua_State * L)
|
|
{
|
|
int turnno = (int)tolua_tonumber(L, 1, 0);
|
|
gamedate gd;
|
|
get_gamedate(turnno, &gd);
|
|
tolua_pushstring(L, seasonnames[gd.season]);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_learn_skill(lua_State * L)
|
|
{
|
|
unit * u = (unit *)tolua_tousertype(L, 1, 0);
|
|
const char * skname = tolua_tostring(L, 2, 0);
|
|
float chances = (float)tolua_tonumber(L, 3, 0);
|
|
skill_t sk = sk_find(skname);
|
|
if (sk!=NOSKILL) {
|
|
learn_skill(u, sk, chances);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_update_scores(lua_State * L)
|
|
{
|
|
score();
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_update_owners(lua_State * L)
|
|
{
|
|
region * r;
|
|
for (r=regions;r;r=r->next) {
|
|
update_owners(r);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_update_subscriptions(lua_State * L)
|
|
{
|
|
update_subscriptions();
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_remove_empty_units(lua_State * L)
|
|
{
|
|
remove_empty_units();
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_get_nmrs(lua_State * L)
|
|
{
|
|
int result = -1;
|
|
int n = (int)tolua_tonumber(L, 1, 0);
|
|
if (n>=0 && n<=NMRTimeout()) {
|
|
if (nmrs==NULL) {
|
|
update_nmrs();
|
|
}
|
|
result = nmrs[n];
|
|
}
|
|
tolua_pushnumber(L, (lua_Number)result);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_equipunit(lua_State * L)
|
|
{
|
|
unit * u = (unit *)tolua_tousertype(L, 1, 0);
|
|
const char * eqname = tolua_tostring(L, 2, 0);
|
|
|
|
equip_unit(u, get_equipment(eqname));
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_equipment_setitem(lua_State * L)
|
|
{
|
|
int result = -1;
|
|
const char * eqname = tolua_tostring(L, 1, 0);
|
|
const char * iname = tolua_tostring(L, 2, 0);
|
|
const char * value = tolua_tostring(L, 3, 0);
|
|
if (iname!=NULL) {
|
|
const struct item_type * itype = it_find(iname);
|
|
if (itype!=NULL) {
|
|
equipment_setitem(create_equipment(eqname), itype, value);
|
|
result = 0;
|
|
}
|
|
}
|
|
tolua_pushnumber(L, (lua_Number)result);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_levitate_ship(lua_State * L)
|
|
{
|
|
ship * sh = (ship *)tolua_tousertype(L, 1, 0);
|
|
unit * mage = (unit *)tolua_tousertype(L, 2, 0);
|
|
double power = (double)tolua_tonumber(L, 3, 0);
|
|
int duration = (int)tolua_tonumber(L, 4, 0);
|
|
int cno = levitate_ship(sh, mage, power, duration);
|
|
tolua_pushnumber(L, (lua_Number)cno);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_set_unitscript(lua_State * L)
|
|
{
|
|
struct unit * u = (struct unit *)tolua_tousertype(L, 1, 0);
|
|
if (u) {
|
|
lua_pushvalue(L, 2);
|
|
setscript(L, &u->attribs);
|
|
lua_pop(L, 1);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_set_racescript(lua_State * L)
|
|
{
|
|
const char * rcname = tolua_tostring(L, 1, 0);
|
|
race * rc = rc_find(rcname);
|
|
|
|
if (rc!=NULL) {
|
|
lua_pushvalue(L, 2);
|
|
setscript(L, &rc->attribs);
|
|
lua_pop(L, 1);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_spawn_dragons(lua_State * L)
|
|
{
|
|
spawn_dragons();
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_spawn_undead(lua_State * L)
|
|
{
|
|
spawn_undead();
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_spawn_braineaters(lua_State * L)
|
|
{
|
|
float chance = (float)tolua_tonumber(L, 1, 0);
|
|
spawn_braineaters(chance);
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_planmonsters(lua_State * L)
|
|
{
|
|
faction * f = get_monsters();
|
|
|
|
if (f!=NULL) {
|
|
unit * u;
|
|
plan_monsters();
|
|
for (u=f->units;u;u=u->nextF) {
|
|
call_script(L, u);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_init_reports(lua_State* L)
|
|
{
|
|
int result = init_reports();
|
|
tolua_pushnumber(L, (lua_Number)result);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_write_report(lua_State* L)
|
|
{
|
|
faction * f = (faction * )tolua_tousertype(L, 1, 0);
|
|
time_t ltime = time(0);
|
|
int result = write_reports(f, ltime);
|
|
|
|
tolua_pushnumber(L, (lua_Number)result);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_write_reports(lua_State* L)
|
|
{
|
|
int result;
|
|
|
|
init_reports();
|
|
result = reports();
|
|
tolua_pushnumber(L, (lua_Number)result);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_process_orders(lua_State* L)
|
|
{
|
|
++turn;
|
|
processorders();
|
|
return 0;
|
|
}
|
|
static int
|
|
tolua_write_passwords(lua_State* L)
|
|
{
|
|
int result = writepasswd();
|
|
lua_pushnumber(L, (lua_Number)result);
|
|
return 0;
|
|
}
|
|
|
|
static struct summary * sum_begin = 0;
|
|
|
|
static int
|
|
tolua_init_summary(lua_State* L)
|
|
{
|
|
sum_begin = make_summary();
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_write_summary(lua_State* L)
|
|
{
|
|
if (sum_begin) {
|
|
struct summary * sum_end = make_summary();
|
|
report_summary(sum_end, sum_begin, false);
|
|
report_summary(sum_end, sum_begin, true);
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_free_game(lua_State* L)
|
|
{
|
|
free_gamedata();
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_write_map(lua_State* L)
|
|
{
|
|
const char * filename = tolua_tostring(L, 1, 0);
|
|
if (filename) {
|
|
crwritemap(filename);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_write_game(lua_State* L)
|
|
{
|
|
const char * filename = tolua_tostring(L, 1, 0);
|
|
const char * mode = tolua_tostring(L, 2, 0);
|
|
|
|
int result, m = IO_BINARY;
|
|
if (mode && strcmp(mode, "text")==0) m = IO_TEXT;
|
|
remove_empty_factions(true);
|
|
result = writegame(filename, m);
|
|
|
|
tolua_pushnumber(L, (lua_Number)result);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_read_game(lua_State* L)
|
|
{
|
|
const char * filename = tolua_tostring(L, 1, 0);
|
|
const char * mode = tolua_tostring(L, 2, 0);
|
|
|
|
int rv, m = IO_BINARY;
|
|
if (mode && strcmp(mode, "text")==0) m = IO_TEXT;
|
|
rv = readgame(filename, m, false);
|
|
|
|
tolua_pushnumber(L, (lua_Number)rv);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_faction(lua_State* L)
|
|
{
|
|
int no = tolua_toid(L, 1, 0);
|
|
faction * f = findfaction(no);
|
|
|
|
tolua_pushusertype(L, f, TOLUA_CAST "faction");
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_region(lua_State* L)
|
|
{
|
|
int x = (int)tolua_tonumber(L, 1, 0);
|
|
int y = (int)tolua_tonumber(L, 2, 0);
|
|
struct plane * pl = findplane(x, y);
|
|
region * r;
|
|
assert(!pnormalize(&x, &y, pl));
|
|
r = findregion(x, y);
|
|
|
|
tolua_pushusertype(L, r, TOLUA_CAST "region");
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_region_byid(lua_State* L)
|
|
{
|
|
int uid = (int)tolua_tonumber(L, 1, 0);
|
|
region * r = findregionbyid(uid);
|
|
|
|
tolua_pushusertype(L, r, TOLUA_CAST "region");
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_building(lua_State* L)
|
|
{
|
|
int no = tolua_toid(L, 1, 0);
|
|
building * b = findbuilding(no);
|
|
|
|
tolua_pushusertype(L, b, TOLUA_CAST "building");
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_ship(lua_State* L)
|
|
{
|
|
int no = tolua_toid(L, 1, 0);
|
|
ship * sh = findship(no);
|
|
|
|
tolua_pushusertype(L, sh, TOLUA_CAST "ship");
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_alliance(lua_State* L)
|
|
{
|
|
int no = tolua_toid(L, 1, 0);
|
|
alliance * f = findalliance(no);
|
|
|
|
tolua_pushusertype(L, f, TOLUA_CAST "alliance");
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_unit(lua_State* L)
|
|
{
|
|
int no = tolua_toid(L, 1, 0);
|
|
unit * u = findunit(no);
|
|
|
|
tolua_pushusertype(L, u, TOLUA_CAST "unit");
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_alliance_create(lua_State* L)
|
|
{
|
|
int id = (int)tolua_tonumber(L, 1, 0);
|
|
const char * name = tolua_tostring(L, 2, 0);
|
|
|
|
alliance * alli = makealliance(id, name);
|
|
|
|
tolua_pushusertype(L, alli, TOLUA_CAST "alliance");
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_regions(lua_State* L)
|
|
{
|
|
region ** region_ptr = (region**)lua_newuserdata(L, sizeof(region *));
|
|
|
|
luaL_getmetatable(L, "region");
|
|
lua_setmetatable(L, -2);
|
|
|
|
*region_ptr = regions;
|
|
|
|
lua_pushcclosure(L, tolua_regionlist_next, 1);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_factions(lua_State* L)
|
|
{
|
|
faction ** faction_ptr = (faction**)lua_newuserdata(L, sizeof(faction *));
|
|
|
|
luaL_getmetatable(L, "faction");
|
|
lua_setmetatable(L, -2);
|
|
|
|
*faction_ptr = factions;
|
|
|
|
lua_pushcclosure(L, tolua_factionlist_next, 1);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_alliance_factions(lua_State* L)
|
|
{
|
|
alliance * self = (alliance *)tolua_tousertype(L, 1, 0);
|
|
faction_list ** faction_ptr = (faction_list**)lua_newuserdata(L, sizeof(faction_list *));
|
|
|
|
luaL_getmetatable(L, "faction_list");
|
|
lua_setmetatable(L, -2);
|
|
|
|
*faction_ptr = self->members;
|
|
|
|
lua_pushcclosure(L, tolua_factionlist_iter, 1);
|
|
return 1;
|
|
}
|
|
|
|
static int tolua_get_alliance_id(lua_State* L)
|
|
{
|
|
alliance* self = (alliance*) tolua_tousertype(L, 1, 0);
|
|
tolua_pushnumber(L, (lua_Number)self->id);
|
|
return 1;
|
|
}
|
|
|
|
static int tolua_get_alliance_name(lua_State* L)
|
|
{
|
|
alliance* self = (alliance*) tolua_tousertype(L, 1, 0);
|
|
tolua_pushstring(L, self->name);
|
|
return 1;
|
|
}
|
|
|
|
static int tolua_set_alliance_name(lua_State* L)
|
|
{
|
|
alliance* self = (alliance*)tolua_tousertype(L, 1, 0);
|
|
alliance_setname(self, tolua_tostring(L, 2, 0));
|
|
return 0;
|
|
}
|
|
|
|
#include <libxml/tree.h>
|
|
#include <util/functions.h>
|
|
#include <util/xml.h>
|
|
#include <kernel/spell.h>
|
|
|
|
static int
|
|
tolua_write_spells(lua_State* L)
|
|
{
|
|
spell_f fun = (spell_f)get_function("lua_castspell");
|
|
const char * filename = "magic.xml";
|
|
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
|
|
xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "spells");
|
|
spell_list * splist;
|
|
|
|
for (splist=spells; splist; splist=splist->next) {
|
|
spell * sp = splist->data;
|
|
if (sp->sp_function!=fun) {
|
|
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "spell");
|
|
xmlNewProp(node, BAD_CAST "name", BAD_CAST sp->sname);
|
|
xmlNewProp(node, BAD_CAST "type", BAD_CAST magic_school[sp->magietyp]);
|
|
xmlNewProp(node, BAD_CAST "rank", xml_i(sp->rank));
|
|
xmlNewProp(node, BAD_CAST "level", xml_i(sp->level));
|
|
xmlNewProp(node, BAD_CAST "index", xml_i(sp->id));
|
|
if (sp->syntax) xmlNewProp(node, BAD_CAST "syntax", BAD_CAST sp->syntax);
|
|
if (sp->parameter) xmlNewProp(node, BAD_CAST "parameters", BAD_CAST sp->parameter);
|
|
if (sp->components) {
|
|
spell_component * comp = sp->components;
|
|
for (;comp->type!=0;++comp) {
|
|
static const char * costs[] = { "fixed", "level", "linear" };
|
|
xmlNodePtr cnode = xmlNewNode(NULL, BAD_CAST "resource");
|
|
xmlNewProp(cnode, BAD_CAST "name", BAD_CAST comp->type->_name[0]);
|
|
xmlNewProp(cnode, BAD_CAST "amount", xml_i(comp->amount));
|
|
xmlNewProp(cnode, BAD_CAST "cost", BAD_CAST costs[comp->cost]);
|
|
xmlAddChild(node, cnode);
|
|
}
|
|
}
|
|
|
|
if (sp->sptyp & TESTCANSEE) {
|
|
xmlNewProp(node, BAD_CAST "los", BAD_CAST "true");
|
|
}
|
|
if (sp->sptyp & ONSHIPCAST) {
|
|
xmlNewProp(node, BAD_CAST "ship", BAD_CAST "true");
|
|
}
|
|
if (sp->sptyp & OCEANCASTABLE) {
|
|
xmlNewProp(node, BAD_CAST "ocean", BAD_CAST "true");
|
|
}
|
|
if (sp->sptyp & FARCASTING) {
|
|
xmlNewProp(node, BAD_CAST "far", BAD_CAST "true");
|
|
}
|
|
if (sp->sptyp & SPELLLEVEL) {
|
|
xmlNewProp(node, BAD_CAST "variable", BAD_CAST "true");
|
|
}
|
|
xmlAddChild(root, node);
|
|
}
|
|
}
|
|
xmlDocSetRootElement(doc, root);
|
|
xmlKeepBlanksDefault(0);
|
|
xmlSaveFormatFileEnc(filename, doc, "utf-8", 1);
|
|
xmlFreeDoc(doc);
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
tolua_get_spell_text(lua_State *L)
|
|
{
|
|
const struct locale * loc = default_locale;
|
|
spell * self = (spell *)tolua_tousertype(L, 1, 0);
|
|
lua_pushstring(L, spell_info(self, loc));
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_spell_school(lua_State *L)
|
|
{
|
|
spell * self = (spell *)tolua_tousertype(L, 1, 0);
|
|
lua_pushstring(L, magic_school[self->magietyp]);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_spell_level(lua_State *L)
|
|
{
|
|
spell * self = (spell *)tolua_tousertype(L, 1, 0);
|
|
lua_pushnumber(L, self->level);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
tolua_get_spell_name(lua_State *L)
|
|
{
|
|
const struct locale * lang = default_locale;
|
|
spell * self = (spell *)tolua_tousertype(L, 1, 0);
|
|
lua_pushstring(L, spell_name(self, lang));
|
|
return 1;
|
|
}
|
|
|
|
static int tolua_get_spells(lua_State* L)
|
|
{
|
|
spell_list * slist = spells;
|
|
if (slist) {
|
|
spell_list ** spell_ptr = (spell_list **)lua_newuserdata(L, sizeof(spell_list *));
|
|
luaL_getmetatable(L, "spell_list");
|
|
lua_setmetatable(L, -2);
|
|
|
|
*spell_ptr = slist;
|
|
lua_pushcclosure(L, tolua_spelllist_next, 1);
|
|
return 1;
|
|
}
|
|
|
|
lua_pushnil(L);
|
|
return 1;
|
|
}
|
|
int
|
|
tolua_eressea_open(lua_State* L)
|
|
{
|
|
tolua_open(L);
|
|
|
|
/* register user types */
|
|
tolua_usertype(L, TOLUA_CAST "spell");
|
|
tolua_usertype(L, TOLUA_CAST "spell_list");
|
|
tolua_usertype(L, TOLUA_CAST "order");
|
|
tolua_usertype(L, TOLUA_CAST "item");
|
|
tolua_usertype(L, TOLUA_CAST "alliance");
|
|
tolua_usertype(L, TOLUA_CAST "event");
|
|
|
|
tolua_module(L, NULL, 0);
|
|
tolua_beginmodule(L, NULL);
|
|
{
|
|
tolua_cclass(L, TOLUA_CAST "alliance", TOLUA_CAST "alliance", TOLUA_CAST "", NULL);
|
|
tolua_beginmodule(L, TOLUA_CAST "alliance");
|
|
{
|
|
tolua_variable(L, TOLUA_CAST "name", tolua_get_alliance_name, tolua_set_alliance_name);
|
|
tolua_variable(L, TOLUA_CAST "id", tolua_get_alliance_id, NULL);
|
|
tolua_variable(L, TOLUA_CAST "factions", &tolua_get_alliance_factions, NULL);
|
|
tolua_function(L, TOLUA_CAST "create", tolua_alliance_create);
|
|
}
|
|
tolua_endmodule(L);
|
|
|
|
tolua_cclass(L, TOLUA_CAST "spell", TOLUA_CAST "spell", TOLUA_CAST "", NULL);
|
|
tolua_beginmodule(L, TOLUA_CAST "spell");
|
|
{
|
|
tolua_function(L, TOLUA_CAST "__tostring", tolua_get_spell_name);
|
|
tolua_variable(L, TOLUA_CAST "name", tolua_get_spell_name, 0);
|
|
tolua_variable(L, TOLUA_CAST "school", tolua_get_spell_school, 0);
|
|
tolua_variable(L, TOLUA_CAST "level", tolua_get_spell_level, 0);
|
|
tolua_variable(L, TOLUA_CAST "text", tolua_get_spell_text, 0);
|
|
}
|
|
tolua_endmodule(L);
|
|
|
|
tolua_function(L, TOLUA_CAST "get_region_by_id", tolua_get_region_byid);
|
|
|
|
tolua_function(L, TOLUA_CAST "get_faction", tolua_get_faction);
|
|
tolua_function(L, TOLUA_CAST "get_unit", tolua_get_unit);
|
|
tolua_function(L, TOLUA_CAST "get_alliance", tolua_get_alliance);
|
|
tolua_function(L, TOLUA_CAST "get_ship", tolua_get_ship),
|
|
tolua_function(L, TOLUA_CAST "get_building", tolua_get_building),
|
|
tolua_function(L, TOLUA_CAST "get_region", tolua_get_region),
|
|
|
|
// deprecated_function(L, TOLUA_CAST "add_faction");
|
|
// deprecated_function(L, TOLUA_CAST "faction_origin");
|
|
tolua_function(L, TOLUA_CAST "factions", tolua_get_factions);
|
|
tolua_function(L, TOLUA_CAST "regions", tolua_get_regions);
|
|
|
|
tolua_function(L, TOLUA_CAST "read_game", tolua_read_game);
|
|
tolua_function(L, TOLUA_CAST "write_game", tolua_write_game);
|
|
tolua_function(L, TOLUA_CAST "free_game", tolua_free_game);
|
|
tolua_function(L, TOLUA_CAST "write_map", &tolua_write_map);
|
|
|
|
tolua_function(L, TOLUA_CAST "read_orders", tolua_read_orders);
|
|
tolua_function(L, TOLUA_CAST "process_orders", tolua_process_orders);
|
|
|
|
tolua_function(L, TOLUA_CAST "init_reports", tolua_init_reports);
|
|
tolua_function(L, TOLUA_CAST "write_reports", tolua_write_reports);
|
|
tolua_function(L, TOLUA_CAST "write_report", tolua_write_report);
|
|
|
|
tolua_function(L, TOLUA_CAST "init_summary", tolua_init_summary);
|
|
tolua_function(L, TOLUA_CAST "write_summary", tolua_write_summary);
|
|
tolua_function(L, TOLUA_CAST "write_passwords", tolua_write_passwords),
|
|
|
|
tolua_function(L, TOLUA_CAST "message_unit", tolua_message_unit);
|
|
tolua_function(L, TOLUA_CAST "message_faction", tolua_message_faction);
|
|
tolua_function(L, TOLUA_CAST "message_region", tolua_message_region);
|
|
|
|
/* scripted monsters */
|
|
tolua_function(L, TOLUA_CAST "plan_monsters", tolua_planmonsters);
|
|
tolua_function(L, TOLUA_CAST "spawn_braineaters", tolua_spawn_braineaters);
|
|
tolua_function(L, TOLUA_CAST "spawn_undead", tolua_spawn_undead);
|
|
tolua_function(L, TOLUA_CAST "spawn_dragons", tolua_spawn_dragons);
|
|
|
|
tolua_function(L, TOLUA_CAST "set_race_brain", tolua_set_racescript);
|
|
tolua_function(L, TOLUA_CAST "set_unit_brain", tolua_set_unitscript);
|
|
|
|
/* spells and stuff */
|
|
tolua_function(L, TOLUA_CAST "levitate_ship", tolua_levitate_ship);
|
|
|
|
tolua_function(L, TOLUA_CAST "update_guards", tolua_update_guards);
|
|
|
|
tolua_function(L, TOLUA_CAST "get_turn", tolua_get_turn);
|
|
tolua_function(L, TOLUA_CAST "get_season", tolua_get_season);
|
|
|
|
tolua_function(L, TOLUA_CAST "equipment_setitem", tolua_equipment_setitem);
|
|
tolua_function(L, TOLUA_CAST "equip_unit", tolua_equipunit);
|
|
tolua_function(L, TOLUA_CAST "add_equipment", tolua_addequipment);
|
|
|
|
tolua_function(L, TOLUA_CAST "atoi36", tolua_atoi36);
|
|
tolua_function(L, TOLUA_CAST "itoa36", tolua_itoa36);
|
|
tolua_function(L, TOLUA_CAST "dice_roll", tolua_dice_rand);
|
|
|
|
tolua_function(L, TOLUA_CAST "get_nmrs", tolua_get_nmrs);
|
|
tolua_function(L, TOLUA_CAST "remove_empty_units", tolua_remove_empty_units);
|
|
|
|
tolua_function(L, TOLUA_CAST "update_subscriptions", tolua_update_subscriptions);
|
|
tolua_function(L, TOLUA_CAST "update_scores", tolua_update_scores);
|
|
tolua_function(L, TOLUA_CAST "update_owners", tolua_update_owners);
|
|
|
|
tolua_function(L, TOLUA_CAST "learn_skill", tolua_learn_skill);
|
|
|
|
tolua_function(L, TOLUA_CAST "autoseed", tolua_autoseed);
|
|
|
|
tolua_function(L, TOLUA_CAST "get_key", tolua_getkey);
|
|
tolua_function(L, TOLUA_CAST "set_key", tolua_setkey);
|
|
|
|
tolua_function(L, TOLUA_CAST "rng_int", tolua_rng_int);
|
|
|
|
tolua_function(L, TOLUA_CAST "spells", tolua_get_spells);
|
|
tolua_function(L, TOLUA_CAST "write_spells", tolua_write_spells);
|
|
}
|
|
tolua_endmodule(L);
|
|
return 1;
|
|
}
|