X-Git-Url: https://git.jsancho.org/?p=dungeon-master.git;a=blobdiff_plain;f=src%2Fmods.cpp;h=dea09b633b0e40261e5d25c060b849e95bc3339b;hp=a1dccfa74b437863e2d9e34b08e6e70acfa1eb93;hb=feed3accdc0482b11535c72119ea73f627f633ed;hpb=1f856dd6077fa25c8236146cf15d95e759b96b5e diff --git a/src/mods.cpp b/src/mods.cpp index a1dccfa..dea09b6 100644 --- a/src/mods.cpp +++ b/src/mods.cpp @@ -1,27 +1,82 @@ +/* Dungeon Master --- RPG Adventure Generator + Copyright © 2019 Javier Sancho + + Dungeon Master is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + Dungeon Master 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Dungeon Master. If not, see . +*/ + +#include +#include #include +#include "generators.h" #include "mods.h" +#include "paths.h" + -SCM register_generator(SCM name, SCM proc) +SCM register_scene_generator (SCM name, SCM type, SCM proc) { - printf ("Register: %s\n", scm_to_locale_string(name)); - scm_call_1(proc, scm_from_int(-1)); + SceneGenerator generator {scm_to_locale_string (name), scm_to_locale_string (type), proc }; + //register_generator (generator); + printf ("Register: %s (%s)\n", generator.name.c_str (), generator.type.c_str ()); + scm_call_1 (proc, scm_from_int (-1)); return SCM_UNSPECIFIED; } -void init_dungeon_master_module(void *unused) +void init_dungeon_master_module (void *unused) { - scm_c_define_gsubr("register-generator", 2, 0, 0, (scm_t_subr)register_generator); - scm_c_export("register-generator", NULL); + scm_c_define_gsubr ("register-scene-generator", 3, 0, 0, (scm_t_subr) register_scene_generator); + scm_c_export ("register-scene-generator", NULL); } -void scm_init_dungeon_master_module() +void scm_init_dungeon_master_module () { - scm_c_define_module("dungeon-master", init_dungeon_master_module, NULL); + scm_c_define_module ("dungeon-master", init_dungeon_master_module, NULL); } -void load_mods() +void add_to_load_path (std::string path) { - scm_init_guile(); - scm_init_dungeon_master_module(); - scm_primitive_load(scm_from_locale_string("mods/default/main.scm")); + // Add path to %load-path variable, needed for modules created in mods + std::string exp = "(add-to-load-path \"" + path + "\")"; + scm_c_eval_string (exp.c_str ()); +} + +void load_dmaster_mods () +{ + scm_init_guile (); + scm_init_dungeon_master_module (); + + std::set paths = get_dmaster_paths (); + DIR* mods_dir; + struct dirent* mod; + std::string + mods_path, + mod_main; + + for (const std::string &path : paths) + { + mods_path = path + PATH_DELIM + "mods"; + add_to_load_path (mods_path); + mods_dir = opendir (mods_path.c_str ()); + if (mods_dir != NULL) + { + while (mod = readdir (mods_dir)) + { + if (strstr (mod->d_name, ".scm") != NULL) { + mod_main = mods_path + PATH_DELIM + mod->d_name; + scm_primitive_load (scm_from_locale_string (mod_main.c_str ())); + } + } + } + closedir (mods_dir); + } }