summaryrefslogtreecommitdiffstats
path: root/src/resources
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2015-08-25 02:05:53 (EDT)
committer P. J. McDermott <pj@pehjota.net>2015-08-25 02:05:53 (EDT)
commit17df899481f5e2017c644d0ac555d190bde63e05 (patch)
treedf9c7b4a112c055ddd651c829bdfe8d8e764d15e /src/resources
parent986355f3862efa32df9cadbabd19decbbf6aba61 (diff)
downloadoverworld-rpg-17df899481f5e2017c644d0ac555d190bde63e05.zip
overworld-rpg-17df899481f5e2017c644d0ac555d190bde63e05.tar.gz
overworld-rpg-17df899481f5e2017c644d0ac555d190bde63e05.tar.bz2
Manage scripts as resources
Diffstat (limited to 'src/resources')
-rw-r--r--src/resources/local.mk2
-rw-r--r--src/resources/script.c82
-rw-r--r--src/resources/script.h33
3 files changed, 117 insertions, 0 deletions
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