summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game.c4
-rw-r--r--src/resources/local.mk2
-rw-r--r--src/resources/script.c82
-rw-r--r--src/resources/script.h33
-rw-r--r--src/script.c33
-rw-r--r--src/script.h8
6 files changed, 120 insertions, 42 deletions
diff --git a/src/game.c b/src/game.c
index ab58eb4..a98d336 100644
--- a/src/game.c
+++ b/src/game.c
@@ -16,7 +16,7 @@
* <http://www.gnu.org/licenses/>.
*/
-#include "script.h"
+#include "resources/script.h"
#include "logging.h"
#include "game.h"
@@ -37,7 +37,7 @@ game_load(const char *dirname)
err(1, "Failed to allocate game");
}
sprintf(path, "%s/%s", dirname, "init.lua");
- g->init_script = script_load(path);
+ g->init_script = script_get(path);
free(path);
return g;
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
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+#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
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef RESOURCES_SCRIPT_H
+#define RESOURCES_SCRIPT_H
+
+#include <lua.h>
+#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
diff --git a/src/script.c b/src/script.c
index a4e5988..9341d8a 100644
--- a/src/script.c
+++ b/src/script.c
@@ -18,10 +18,7 @@
#include <stdlib.h>
#include <lua.h>
-#include <lualib.h>
-#include <lauxlib.h>
#include "logging.h"
-#include "viewport.h"
#include "script.h"
/* LUA_OK is defined in Lua 5.2 but not 5.1. */
@@ -29,36 +26,6 @@
#define LUA_OK 0
#endif
-struct script *
-script_load(const char *path)
-{
- struct script *s;
-
- s = malloc(sizeof(*s));
- if (s == NULL) {
- err(1, "Failed to allocate script");
- }
- s->path = path;
-
- /* 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);
-
- return s;
-}
-
void
script_call(struct script *s, const char *func)
{
diff --git a/src/script.h b/src/script.h
index 662c8ea..5362a8b 100644
--- a/src/script.h
+++ b/src/script.h
@@ -19,14 +19,8 @@
#ifndef SCRIPT_H
#define SCRIPT_H
-#include <lua.h>
+#include "resources/script.h"
-struct script {
- const char *path;
- lua_State *lua_state;
-};
-
-struct script *script_load(const char *path);
void script_call(struct script *s, const char *func);
#endif