From 17df899481f5e2017c644d0ac555d190bde63e05 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Tue, 25 Aug 2015 02:05:53 -0400 Subject: Manage scripts as resources --- (limited to 'src/resources') diff --git a/src/resources/local.mk b/src/resources/local.mk index 5858ec6..f5d20d2 100644 --- a/src/resources/local.mk +++ b/src/resources/local.mk @@ -7,6 +7,8 @@ boukengine_SOURCES += \ src/resources/palette.h \ src/resources/resource.c \ src/resources/resource.h \ + src/resources/script.c \ + src/resources/script.h \ src/resources/tileset.c \ src/resources/tileset.h \ src/resources/tmx.c \ diff --git a/src/resources/script.c b/src/resources/script.c new file mode 100644 index 0000000..5212219 --- /dev/null +++ b/src/resources/script.c @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2013 Patrick "P. J." McDermott + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program. If not, see + * . + */ + +#include +#include +#include +#include "../logging.h" +#include "../viewport.h" +#include "script.h" +#include "resource.h" + +/* LUA_OK is defined in Lua 5.2 but not 5.1. */ +#ifndef LUA_OK +#define LUA_OK 0 +#endif + +static struct resource_table script_res; + +struct script * +script_get(const char *path) +{ + struct script *s; + + s = (struct script *) resource_get(&script_res, path); + if (s != NULL) { + resource_use((struct resource *) s); + return s; + } + + s = resource_alloc(path, sizeof(*s)); + + /* Load the script. */ + s->lua_state = luaL_newstate(); + luaL_openlibs(s->lua_state); + if (luaL_loadfile(s->lua_state, path) != LUA_OK) { + err(1, "Error loading script: %s\n", + lua_tostring(s->lua_state, -1)); + } + + /* Run the script once to let it define functions. */ + if (lua_pcall(s->lua_state, 0, 0, 0) != LUA_OK) { + err(1, "Error running script: %s\n", + lua_tostring(s->lua_state, -1)); + } + + lua_register(s->lua_state, "init_viewport", init_viewport_lua); + + resource_use((struct resource *) s); + resource_add(&script_res, path, (struct resource *) s); + + return s; +} + +void +script_free(struct script *script) +{ + lua_State *data; + + if (script == NULL) { + return; + } + + data = script->lua_state; + if (resource_free(&script_res, (struct resource *) script)) { + lua_close(data); + } +} diff --git a/src/resources/script.h b/src/resources/script.h new file mode 100644 index 0000000..12dac85 --- /dev/null +++ b/src/resources/script.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2013 Patrick "P. J." McDermott + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program. If not, see + * . + */ + +#ifndef RESOURCES_SCRIPT_H +#define RESOURCES_SCRIPT_H + +#include +#include "resource.h" + +struct script { + struct resource res; + lua_State *lua_state; +}; + +struct script *script_get(const char *path); +void script_free(struct script *script); + +#endif -- cgit v0.9.1