ChimaraIFZmachineVersion interpreter_number;
gint random_seed;
gboolean random_seed_set;
+ gchar *graphics_file;
/* Holding buffers for input and response */
gchar *input;
GString *response;
PROP_TYPO_CORRECTION,
PROP_INTERPRETER_NUMBER,
PROP_RANDOM_SEED,
- PROP_RANDOM_SEED_SET
+ PROP_RANDOM_SEED_SET,
+ PROP_GRAPHICS_FILE
};
enum {
priv->flags = CHIMARA_IF_TYPO_CORRECTION;
priv->interpreter_number = CHIMARA_IF_ZMACHINE_DEFAULT;
priv->random_seed_set = FALSE;
+ priv->graphics_file = NULL;
priv->input = NULL;
priv->response = g_string_new("");
priv->random_seed_set = g_value_get_boolean(value);
g_object_notify(object, "random-seed-set");
break;
+ case PROP_GRAPHICS_FILE:
+ priv->graphics_file = g_strdup(g_value_get_string(value));
+ g_object_notify(object, "graphics-file");
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
case PROP_RANDOM_SEED_SET:
g_value_set_boolean(value, priv->random_seed_set);
break;
+ case PROP_GRAPHICS_FILE:
+ g_value_set_string(value, priv->graphics_file);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
static void
chimara_if_finalize(GObject *object)
{
+ CHIMARA_IF_USE_PRIVATE(object, priv);
+ g_free(priv->graphics_file);
G_OBJECT_CLASS(chimara_if_parent_class)->finalize(object);
}
g_param_spec_boolean("random-seed-set", _("Random seed set"),
_("Whether the seed for the random number generator should be set manually"), FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_LAX_VALIDATION | G_PARAM_STATIC_STRINGS));
-
+ /**
+ * ChimaraIF:graphics-file:
+ *
+ * Some Z-machine interpreters accept an extra argument that indicates a
+ * separate Blorb file containing graphics and sound resources. The
+ * interpreter will check if the file specified in this property really
+ * exists, and if so, use it as a resource file. If this property is set to
+ * %NULL, the interpreter will not look for an extra file.
+ *
+ * Only affects Frotz and Nitfol.
+ */
+ g_object_class_install_property(object_class, PROP_GRAPHICS_FILE,
+ g_param_spec_string("graphics-file", _("Graphics file"),
+ _("Location in which to look for a separate graphics Blorb file"), NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_LAX_VALIDATION | G_PARAM_STATIC_STRINGS));
/* Private data */
g_type_class_add_private(klass, sizeof(ChimaraIFPrivate));
}
GSList *args = NULL;
gchar *terpnumstr = NULL, *randomstr = NULL;
args = g_slist_prepend(args, pluginpath);
- args = g_slist_prepend(args, gamefile);
switch(interpreter)
{
case CHIMARA_IF_INTERPRETER_FROTZ:
;
}
+ /* Game file and external blorb file */
+ args = g_slist_prepend(args, gamefile);
+ if(priv->graphics_file
+ && (interpreter == CHIMARA_IF_INTERPRETER_FROTZ || interpreter == CHIMARA_IF_INTERPRETER_NITFOL)
+ && g_file_test(priv->graphics_file, G_FILE_TEST_EXISTS)) {
+ args = g_slist_prepend(args, priv->graphics_file);
+ }
+
/* Allocate argv to hold the arguments */
int argc = g_slist_length(args);
args = g_slist_prepend(args, NULL);
GSList *ptr;
for(count = 0, ptr = args; ptr; count++, ptr = g_slist_next(ptr))
argv[count] = ptr->data;
-
+
/* Set the story name */
/* We peek into ChimaraGlk's private data here, because GObject has no
equivalent to "protected" */
CHIMARA_GLK_USE_PRIVATE(self, glk_priv);
glk_priv->story_name = g_path_get_basename(gamefile);
g_object_notify(G_OBJECT(self), "story-name");
-
- /* Check if an external blorb file is present */
- /* FIXME: hardcoded path */
- if(format == CHIMARA_IF_FORMAT_Z5
- || format == CHIMARA_IF_FORMAT_Z6
- || format == CHIMARA_IF_FORMAT_Z8
- || format == CHIMARA_IF_FORMAT_GLULX) {
- gchar *path = g_path_get_dirname(gamefile);
- gchar *scratch = g_path_get_basename(gamefile);
- *(strrchr(scratch, '.')) = '\0';
- gchar *blorbfile = g_strconcat(path, "/../Resources/", scratch, ".blb", NULL);
- if(g_file_test(blorbfile, G_FILE_TEST_EXISTS)) {
- glk_priv->open_external_blorb = TRUE;
- glk_priv->external_blorb_pathname = blorbfile;
- } else {
- g_free(blorbfile);
- }
- g_free(path);
- g_free(scratch);
- }
gboolean retval = chimara_glk_run(CHIMARA_GLK(self), pluginpath, argc, argv, error);
g_free(argv);