X-Git-Url: https://git.jsancho.org/?p=dungeon-master.git;a=blobdiff_plain;f=src%2Fmods.cpp;h=06a5b2fc67244e76eeda8296fb355410165ac159;hp=bbbd6c46818095814f8cfa6e7ab525ef282ba774;hb=602500ffe32004dc0437ed55ac2d25ec69fc9e25;hpb=c4a0774d367b5e8ff7a2aeebf1bbe4386621b51f diff --git a/src/mods.cpp b/src/mods.cpp index bbbd6c4..06a5b2f 100644 --- a/src/mods.cpp +++ b/src/mods.cpp @@ -1,19 +1,41 @@ +/* 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)); + 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) { - 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() @@ -23,12 +45,27 @@ void scm_init_dungeon_master_module() void load_mods() { + scm_init_guile(); + scm_init_dungeon_master_module(); + std::set paths = get_dm_paths(); + DIR* mods_dir; + struct dirent* mod; + std::string + mods_path, + mod_main; + for (const std::string &path : paths) { - std::cout << path << std::endl; + mods_path = path + DIR_DELIM + "mods"; + mods_dir = opendir(mods_path.c_str()); + if (mods_dir != NULL) { + while (mod = readdir(mods_dir)) { + if (strcmp(mod->d_name, ".") != 0 && strcmp(mod->d_name, "..") != 0) { + mod_main = mods_path + DIR_DELIM + mod->d_name + DIR_DELIM + "main.scm"; + scm_primitive_load(scm_from_locale_string(mod_main.c_str())); + } + } + } + closedir(mods_dir); } - - scm_init_guile(); - scm_init_dungeon_master_module(); - scm_primitive_load(scm_from_locale_string("mods/default/main.scm")); }