]> git.jsancho.org Git - dungeon-master.git/commitdiff
register scene generators
authorJavier Sancho <jsf@jsancho.org>
Wed, 10 Jun 2020 16:54:01 +0000 (18:54 +0200)
committerJavier Sancho <jsf@jsancho.org>
Wed, 10 Jun 2020 16:54:01 +0000 (18:54 +0200)
Makefile.am
src/generators.cpp [new file with mode: 0644]
src/generators.h
src/main.cpp
src/mods.cpp
src/mods.h
src/paths.cpp
src/paths.h

index eb984b73ce2e7a4f3e185848c8c3cd075483ddc4..05cea9536ace478ddfcf9dc8b53d4847868411f0 100644 (file)
@@ -1,5 +1,6 @@
 bin_PROGRAMS = dmaster
 dmaster_SOURCES = \
+  src/generators.cpp \
   src/main.cpp \
   src/mods.cpp \
   src/paths.cpp
diff --git a/src/generators.cpp b/src/generators.cpp
new file mode 100644 (file)
index 0000000..b82377b
--- /dev/null
@@ -0,0 +1,48 @@
+/* Dungeon Master --- RPG Adventure Generator
+   Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+
+   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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <libguile.h>
+#include <list>
+#include <map>
+#include "generators.h"
+
+struct compare_strings
+{
+  bool operator() (const char* a, const char* b) const
+  {
+    return strcmp (a, b) < 0;
+  }
+};
+
+std::map<char*,
+         std::list<SceneGenerator*>,
+         compare_strings> registered_generators;
+
+SceneGenerator*
+register_generator (char* name,
+                    char* type,
+                    SCM proc)
+{
+  SceneGenerator* generator = (SceneGenerator*) malloc (sizeof (SceneGenerator));
+  generator->name = name;
+  generator->type = type;
+  generator->proc = proc;
+
+  registered_generators[type].push_back (generator);
+
+  return generator;
+}
index cc897707b87b5bc47d79ffc86f7a9dc59f4a8acb..ab044bcc92e2c1c56bd802aedd0d32157dc4c3bc 100644 (file)
 
 #include <libguile.h>
 
-struct SceneGenerator
+typedef struct
 {
-  std::string name;
-  std::string type;
+  char* name;
+  char* type;
   SCM proc;
-};
+} SceneGenerator;
 
-int register_generator (SceneGenerator generator);
+SceneGenerator*
+register_generator (char* name,
+                    char* type,
+                    SCM proc);
index 4a522aacc1fe9ad8a9f8571bede47c5e9652fa51..16c6fac0455a0dea0fa5999cc716a3a0b75dcf6a 100644 (file)
@@ -23,7 +23,8 @@ using namespace core;
 using namespace video;
 using namespace gui;
 
-int main ()
+int
+main ()
 {
   load_dmaster_mods ();
 
index dea09b633b0e40261e5d25c060b849e95bc3339b..7b9115e6320618ce749112f79ec9a15203e2c8a5 100644 (file)
 */
 
 #include <dirent.h>
-#include <iostream>
 #include <libguile.h>
 #include "generators.h"
 #include "mods.h"
 #include "paths.h"
 
-
-SCM register_scene_generator (SCM name, SCM type, SCM proc)
+SCM
+register_scene_generator (SCM name,
+                          SCM type,
+                          SCM proc)
 {
-  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));
+  SceneGenerator* generator =
+    register_generator (scm_to_utf8_string (name),
+                        scm_to_utf8_string (scm_symbol_to_string (type)),
+                        proc);
+  printf ("Register: %s (%s)\n", generator->name, generator->type);
+  scm_call_1 (generator->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-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);
 }
 
-void add_to_load_path (std::string path)
+void
+add_to_load_path (std::string path)
 {
-  // Add path to %load-path variable, needed for modules created in mods
+  // Add path to %load-path variable, needed for mods structured like modules
   std::string exp = "(add-to-load-path \"" + path + "\")";
   scm_c_eval_string (exp.c_str ());
 }
 
-void load_dmaster_mods ()
+void
+load_dmaster_mods ()
 {
   scm_init_guile ();
   scm_init_dungeon_master_module ();
index e5fd4a5980ae5cbbc9824f9d45ad71ac62190397..f8cd154a08b21c4a906c2862a39eb0c69a37403d 100644 (file)
@@ -15,4 +15,5 @@
    along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
 */
 
-void load_dmaster_mods ();
+void
+load_dmaster_mods ();
index 02aee3f28264a1be1ceac9849dd5238ba6a676f2..b7a8374f0ae6e49fdc138bfcd02d741ffe4e1fcb 100644 (file)
@@ -18,7 +18,8 @@
 #include <unistd.h>
 #include "paths.h"
 
-std::string get_exec_path ()
+std::string
+get_exec_path ()
 {
   char pBuf[256];
   size_t len = sizeof (pBuf);
@@ -35,12 +36,14 @@ std::string get_exec_path ()
   return exec_path.substr (0, exec_path.rfind (PATH_DELIM) + 1);
 }
 
-std::string get_home_path ()
+std::string
+get_home_path ()
 {
   return (std::string) getenv ("HOME") + PATH_DELIM + "." + PROGRAM_NAME;
 }
 
-std::set<std::string> get_dmaster_paths () {
+std::set<std::string>
+get_dmaster_paths () {
   std::set<std::string> paths;
   paths.insert (get_exec_path ());
   paths.insert (DATA_PATH);
index 38cb13aa1a05337f1ef3ac045f026a0df430b1a7..66033734c31d753f729a3f25795349aaf87a9f11 100644 (file)
@@ -28,4 +28,5 @@
 #define PROGRAM_NAME "dmaster"
 #endif
 
-std::set<std::string> get_dmaster_paths ();
+std::set<std::string>
+get_dmaster_paths ();