+ + +

To find resources such as sound and image files.

+ +
+ +

§1. Resource finder. This simple function is shared by the code for figures, sound effects and +internal data files. When Inform reads a sentence such as: +

+ +
+    Sound of Organ is the file "Passacaglia.mid".
+
+

it looks for the file first in the Sounds folder of the materials for the +project, and then, if it isn't there, in the Sounds folder of the materials +for the extension in which the sentence occurs (if it occurs in an extension). +Here "Sounds" is what we will call the department name for sound effects. +

+ +

This code was introduced as part of the implementation of IE-0001, and for +the first time throws problem messages is named resources do not exist. +

+ +
+int check_resources_are_present = TRUE;
+
+void ResourceFinder::set_mode(int val) {
+    check_resources_are_present = val;  set by -resource-checking at command line
+}
+
+filename *ResourceFinder::find_resource(text_stream *department, text_stream *leaf, wording W) {
+    inform_extension *E = NULL;
+    if (Wordings::nonempty(W))
+        E = Extensions::corresponding_to(Lexer::file_of_origin(Wordings::first_wn(W)));
+
+    pathname *P1 = Pathnames::down(Task::resources_path(), department);
+    pathname *P2 = E?(Pathnames::down(Extensions::materials_path(E), department)):NULL;
+    if (P1) {
+        filename *F = Filenames::in(P1, leaf);
+        FILE *HANDLE = Filenames::fopen(F, "rb");
+        if (HANDLE) {
+            fclose(HANDLE);
+            return F;
+        }
+    }
+    if (P2) {
+        filename *F = Filenames::in(P2, leaf);
+        FILE *HANDLE = Filenames::fopen(F, "rb");
+        if (HANDLE) {
+            fclose(HANDLE);
+            return F;
+        }
+    }
+
+    if (check_resources_are_present == FALSE) return Filenames::in(P1, leaf);
+
+    LOG("Tried in %p\n", P1);
+    if (P2) LOG("And also in %p\n", P2);
+
+    Problems::quote_source(1, current_sentence);
+    Problems::quote_wording(2, W);
+    Problems::quote_stream(3, department);
+    StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable));
+    Problems::issue_problem_segment(
+        "You wrote %1, which means I am looking for a file called %2, but I'm "
+        "unable to find it. ");
+    if (P2)
+        Problems::issue_problem_segment(
+            "The file should either be in the '%3' subfolder of the materials folder, "
+            "or in the 'Materials/%3' subfolder of this extension.");
+    else
+        Problems::issue_problem_segment(
+            "The file should be in the '%3' subfolder of the materials folder.");
+    Problems::issue_problem_end();
+    return NULL;
+}
+
+ + +