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 --- 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 @@ * . */ -#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 + * . + */ + +#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 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 #include -#include -#include #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 +#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 -- cgit v0.9.1