From 2ccc89a93e857dc7d66aa3475400656e8e575401 Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Mon, 10 Apr 2023 22:54:14 +0100 Subject: [PATCH] More on IE-0001 --- README.md | 2 +- build.txt | 4 +- docs/supervisor-module/2-ce.html | 2 +- docs/supervisor-module/2-cps.html | 4 +- docs/supervisor-module/2-rqr.html | 2 +- docs/supervisor-module/4-ebm.html | 2 +- docs/supervisor-module/5-es.html | 78 ++++++++++++++----- docs/supervisor-module/5-ps2.html | 4 +- docs/supervisor-module/6-hdn.html | 2 +- docs/supervisor-module/6-inc.html | 6 +- docs/supervisor-module/6-st.html | 6 +- docs/supervisor-module/7-cns.html | 2 +- docs/supervisor-module/7-ip2.html | 11 +-- .../Chapter 5/Extension Services.w | 31 ++++++++ .../Chapter 7/Individual Pages.w | 11 +-- inform7/Figures/timings-diagnostics.txt | 34 ++++---- .../BasicInformExtrasKit/kit_metadata.json | 2 +- .../Inter/BasicInformKit/kit_metadata.json | 2 +- .../Inter/CommandParserKit/kit_metadata.json | 2 +- .../EnglishLanguageKit/kit_metadata.json | 2 +- .../Inter/WorldModelKit/kit_metadata.json | 2 +- 21 files changed, 140 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 971f8c10f..4f0d56b1e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Inform 7 -[Version](notes/versioning.md): 10.2.0-beta+6W25 'Krypton' (21 March 2023) +[Version](notes/versioning.md): 10.2.0-beta+6W26 'Krypton' (10 April 2023) ## About Inform diff --git a/build.txt b/build.txt index fa8e83961..e0d3bafd0 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ Prerelease: beta -Build Date: 21 March 2023 -Build Number: 6W25 +Build Date: 10 April 2023 +Build Number: 6W26 diff --git a/docs/supervisor-module/2-ce.html b/docs/supervisor-module/2-ce.html index def830ff4..6a14690f8 100644 --- a/docs/supervisor-module/2-ce.html +++ b/docs/supervisor-module/2-ce.html @@ -126,7 +126,7 @@ fields are blank. return CE; } -copy_error *CopyErrors::new_T(int cat, int subcat, text_stream *NB) { +copy_error *CopyErrors::new_T(int cat, int subcat, text_stream *NB) { copy_error *CE = CopyErrors::new(cat, subcat); CE->details = Str::duplicate(NB); return CE; diff --git a/docs/supervisor-module/2-cps.html b/docs/supervisor-module/2-cps.html index 344c1b8c8..b6a746cab 100644 --- a/docs/supervisor-module/2-cps.html +++ b/docs/supervisor-module/2-cps.html @@ -147,7 +147,7 @@ for later reporting. These are stored in a list.

-void Copies::attach_error(inbuild_copy *C, copy_error *CE) {
+void Copies::attach_error(inbuild_copy *C, copy_error *CE) {
     if (C == NULL) internal_error("no copy to attach to");
     CopyErrors::supply_attached_copy(CE, C);
     ADD_TO_LINKED_LIST(CE, copy_error, C->errors_reading_source_text);
@@ -177,7 +177,7 @@ for later reporting. These are stored in a list.
     return C->source_text_read;
 }
 
-wording Copies::get_source_text(inbuild_copy *C) {
+wording Copies::get_source_text(inbuild_copy *C) {
     if (C->source_text_read == FALSE) {
         C->source_text_read = TRUE;
         if (LinkedLists::len(C->errors_reading_source_text) > 0) {
diff --git a/docs/supervisor-module/2-rqr.html b/docs/supervisor-module/2-rqr.html
index a60675d87..758537b3c 100644
--- a/docs/supervisor-module/2-rqr.html
+++ b/docs/supervisor-module/2-rqr.html
@@ -243,7 +243,7 @@ a requirement, then so will all other copies of it.
 

-int Requirements::meets(inbuild_edition *edition, inbuild_requirement *req) {
+int Requirements::meets(inbuild_edition *edition, inbuild_requirement *req) {
     if (req == NULL) return TRUE;
     if (req->work) {
         if (req->work->genre)
diff --git a/docs/supervisor-module/4-ebm.html b/docs/supervisor-module/4-ebm.html
index 5ac2fba59..2c51bf20f 100644
--- a/docs/supervisor-module/4-ebm.html
+++ b/docs/supervisor-module/4-ebm.html
@@ -134,7 +134,7 @@ which stores data about extensions used by the Inform compiler.
                 if (Str::get(pos) == '.')
                     Str::put(pos, '_');
             WRITE_TO(new_name, "%S-v%S.i7xd", C->edition->work->title, new_version);
-            if (Extensions::rename_directory(P, new_name)) {
+            if (Extensions::rename_directory(P, new_name)) {
                 Str::clear(key);
                 WRITE_TO(key, "%p", P);
                 apparent_V = C->edition->version;
diff --git a/docs/supervisor-module/5-es.html b/docs/supervisor-module/5-es.html
index 727dec8be..4b79d6e7a 100644
--- a/docs/supervisor-module/5-es.html
+++ b/docs/supervisor-module/5-es.html
@@ -60,7 +60,7 @@ function togglePopup(material_id) {
     
 

Behaviour specific to copies of the extension genre.

-
+

§1. Scanning metadata. An extension has a title and an author name, each of which is limited in length to one character less than the following constants: @@ -75,6 +75,7 @@ length to one character less than the following constants: struct wording body_text; Body of source text supplied in extension, if any int body_text_unbroken; Does this contain text waiting to be sentence-broken? struct wording documentation_text; Documentation supplied in extension, if any + int documentation_sought; Has it yet been looked for? int standard; the (or perhaps just a) Standard Rules extension int authorial_modesty; Do not credit in the compiled game struct text_stream *rubric_as_lexed; brief description found in opening lines @@ -141,6 +142,7 @@ compatibility notes given (such as "for Glulx only"). E->body_text = EMPTY_WORDING; E->body_text_unbroken = FALSE; E->documentation_text = EMPTY_WORDING; + E->documentation_sought = FALSE; E->standard = FALSE; E->authorial_modesty = FALSE; E->read_into_file = NULL; @@ -197,7 +199,7 @@ alone, and the version number is returned. if (Str::ne_insensitive(correct_leafname, Filenames::get_leafname(extension_source_filename))) { int allow = FALSE; if ((repair_mode) && - (Extensions::rename_file(extension_source_filename, correct_leafname))) + (Extensions::rename_file(extension_source_filename, correct_leafname))) allow = TRUE; if (allow == FALSE) { TEMPORARY_TEXT(error_text) @@ -688,7 +690,7 @@ in a minimal sort of way, with just an -inform_extension *Extensions::from_copy(inbuild_copy *C) { +inform_extension *Extensions::from_copy(inbuild_copy *C) { inform_extension *ext = ExtensionBundleManager::from_copy(C); if (ext == NULL) ext = ExtensionManager::from_copy(C); return ext; @@ -1007,13 +1009,47 @@ and no documentation. E->body_text_unbroken = TRUE; mark this to be sentence-broken

-

§11. When the extension source text was read from its source_file, we +

§11. In directory extensions, documentation can be stored separately: +

+ +
+wording Extensions::get_documentation_text(inform_extension *E) {
+    if (E == NULL) return EMPTY_WORDING;
+    Copies::get_source_text(E->as_copy);  in the unlikely event this has not happened yet
+    if (E->documentation_sought == FALSE) {
+        if (E->as_copy->location_if_path) {
+            pathname *D = Pathnames::down(E->as_copy->location_if_path, I"Documentation");
+            filename *F = Filenames::in(D, I"Documentation.txt");
+            if (TextFiles::exists(F)) Fetch wording from stand-alone file11.1;
+        }
+        E->documentation_sought = TRUE;
+    }
+    return E->documentation_text;
+}
+
+

§11.1. Fetch wording from stand-alone file11.1 = +

+ +
+    if (Wordings::nonempty(E->documentation_text)) {
+        TEMPORARY_TEXT(error_text)
+        WRITE_TO(error_text,
+            "this extension provides documentation both as a file and in its source");
+        Copies::attach_error(E->as_copy, CopyErrors::new_T(EXT_MISWORDED_CE, -1, error_text));
+        DISCARD_TEXT(error_text)
+    } else {
+        source_file *sf = SourceText::read_file(E->as_copy, F, NULL, TRUE, FALSE);
+        if (sf) E->documentation_text = sf->text_read;
+    }
+
+ +

§12. When the extension source text was read from its source_file, we attached a reference to say which inform_extension it was, and here we make use of that:

-inform_extension *Extensions::corresponding_to(source_file *sf) {
+inform_extension *Extensions::corresponding_to(source_file *sf) {
     if (sf == NULL) return NULL;
     inbuild_copy *C = RETRIEVE_POINTER_inbuild_copy(sf->your_ref);
     if (C == NULL) return NULL;
@@ -1021,7 +1057,7 @@ make use of that:
     return Extensions::from_copy(C);
 }
 
-

§12. Miscellaneous.

+

§13. Miscellaneous.

 void Extensions::write(OUTPUT_STREAM, inform_extension *E) {
@@ -1037,7 +1073,7 @@ make use of that:
     WRITE("%S", E->as_copy->edition->work->raw_author_name);
 }
 
-

§13. Three pieces of information will be set later on, by other parts of Inform +

§14. Three pieces of information will be set later on, by other parts of Inform calling the routines below.

@@ -1055,12 +1091,12 @@ that happens, the following function will be called to set the rubric. LOGIF(EXTENSIONS_CENSUS, "Extension rubric: %S\n", E->rubric_as_lexed); } -text_stream *Extensions::get_rubric(inform_extension *E) { +text_stream *Extensions::get_rubric(inform_extension *E) { if (E == NULL) return NULL; return E->rubric_as_lexed; }
-

§14. The optional extra credit line is used to acknowledge I6 sources, +

§15. The optional extra credit line is used to acknowledge I6 sources, collaborators, translators and so on.

@@ -1071,7 +1107,7 @@ collaborators, translators and so on. LOGIF(EXTENSIONS_CENSUS, "Extension extra credit: %S\n", E->extra_credit_as_lexed); } -

§15. The use option "authorial modesty" is unusual in applying to the extension +

§16. The use option "authorial modesty" is unusual in applying to the extension it is found in, not the whole source text. When we read it, we call one of the following routines, depending on whether it was in an extension or in the main source text: @@ -1087,21 +1123,21 @@ the main source text: general_authorial_modesty = TRUE; } -

§16. The inclusion sentence for an extension is where it was Included in a +

§17. The inclusion sentence for an extension is where it was Included in a project's syntax tree (if it was). It isn't used in compilation, only for problem messages and the index.

-void Extensions::set_inclusion_sentence(inform_extension *E, parse_node *N) {
+void Extensions::set_inclusion_sentence(inform_extension *E, parse_node *N) {
     E->inclusion_sentence = N;
 }
-parse_node *Extensions::get_inclusion_sentence(inform_extension *E) {
+parse_node *Extensions::get_inclusion_sentence(inform_extension *E) {
     if (E == NULL) return NULL;
     return E->inclusion_sentence;
 }
 
-

§17. An extension is "standard" if it's either the Standard Rules or Basic Inform. +

§18. An extension is "standard" if it's either the Standard Rules or Basic Inform.

@@ -1110,33 +1146,33 @@ problem messages and the index.
     return E->standard;
 }
 
-

§18. Version requirements. When it's known that an extension must satisfy a given version requirement — +

§19. Version requirements. When it's known that an extension must satisfy a given version requirement — say, being version 7.2.1 or better — the following is called. Note that if incompatible requirements are placed on it, the range in E->must_satisfy becomes empty and stays that way.

-void Extensions::must_satisfy(inform_extension *E, inbuild_requirement *req) {
+void Extensions::must_satisfy(inform_extension *E, inbuild_requirement *req) {
     if (E->must_satisfy == NULL) E->must_satisfy = req;
     else VersionNumberRanges::intersect_range(E->must_satisfy->version_range, req->version_range);
 }
 
-

§19. And it is certainly possible, if an extension is loaded for multiple +

§20. And it is certainly possible, if an extension is loaded for multiple reasons with different versioning needs, that the extension no longer meets its requirements (even though it did when first loaded). This tests for that:

-int Extensions::satisfies(inform_extension *E) {
+int Extensions::satisfies(inform_extension *E) {
     if (E == NULL) return FALSE;
     return Requirements::meets(E->as_copy->edition, E->must_satisfy);
 }
 
-

§20. File hierarchy tidying.

+

§21. File hierarchy tidying.

-int Extensions::rename_directory(pathname *P, text_stream *new_name) {
+int Extensions::rename_directory(pathname *P, text_stream *new_name) {
     TEMPORARY_TEXT(task)
     WRITE_TO(task, "(Changing directory name '%p' to '%S')\n", P, new_name);
     int rv = Directories::rename(P, new_name);
@@ -1144,7 +1180,7 @@ its requirements (even though it did when first loaded). This tests for that:
     return rv;
 }
 
-int Extensions::rename_file(filename *F, text_stream *new_name) {
+int Extensions::rename_file(filename *F, text_stream *new_name) {
     TEMPORARY_TEXT(task)
     WRITE_TO(task, "(Changing file name '%f' to '%S')\n", F, new_name);
     int rv = Filenames::rename(F, new_name);
diff --git a/docs/supervisor-module/5-ps2.html b/docs/supervisor-module/5-ps2.html
index d14381be1..d35f26da6 100644
--- a/docs/supervisor-module/5-ps2.html
+++ b/docs/supervisor-module/5-ps2.html
@@ -1127,10 +1127,10 @@ each extension against the intersection of all requirements put on it:
 void Projects::check_extension_versions_d(inform_project *proj, build_vertex *V) {
     if ((V->as_copy) && (V->as_copy->edition->work->genre == extension_genre)) {
         inform_extension *E = Extensions::from_copy(V->as_copy);
-        if (Extensions::satisfies(E) == FALSE) {
+        if (Extensions::satisfies(E) == FALSE) {
             copy_error *CE = CopyErrors::new_T(SYNTAX_CE, ExtVersionTooLow_SYNERROR,
                 I"two incompatible versions");
-            CopyErrors::supply_node(CE, Extensions::get_inclusion_sentence(E));
+            CopyErrors::supply_node(CE, Extensions::get_inclusion_sentence(E));
             Copies::attach_error(proj->as_copy, CE);
         }
     }
diff --git a/docs/supervisor-module/6-hdn.html b/docs/supervisor-module/6-hdn.html
index 67ea776ab..4ac1a549d 100644
--- a/docs/supervisor-module/6-hdn.html
+++ b/docs/supervisor-module/6-hdn.html
@@ -789,7 +789,7 @@ file and a line number of at least 1).
 
 inform_extension *Headings::get_extension_containing(heading *h) {
     if ((h == NULL) || (h->start_location.file_of_origin == NULL)) return NULL;
-    return Extensions::corresponding_to(h->start_location.file_of_origin);
+    return Extensions::corresponding_to(h->start_location.file_of_origin);
 }
 

§19. Although Implied (0) headings do have text, contrary to the implication of diff --git a/docs/supervisor-module/6-inc.html b/docs/supervisor-module/6-inc.html index 40d50f55b..239eb76ad 100644 --- a/docs/supervisor-module/6-inc.html +++ b/docs/supervisor-module/6-inc.html @@ -325,7 +325,7 @@ Sausages by Mr Punch, and loaded it, but then read the sentence LOOP_OVER(E, inform_extension) if ((Requirements::meets(E->as_copy->edition, req)) && (Copies::source_text_has_been_read(E->as_copy))) { - Extensions::must_satisfy(E, req); + Extensions::must_satisfy(E, req); return E; } Read the extension file into the lexer, and break it into body and documentation6.1; @@ -343,7 +343,7 @@ Sausages by Mr Punch, and loaded it, but then read the sentence Nests::search_for_best(req, Projects::nest_list(for_project)); if (search_result) { E = Extensions::from_copy(search_result->copy); - Extensions::set_inclusion_sentence(E, at); + Extensions::set_inclusion_sentence(E, at); Extensions::set_associated_project(E, for_project); if (Nests::get_tag(search_result->nest) == INTERNAL_NEST_TAG) E->loaded_from_built_in_area = TRUE; @@ -378,7 +378,7 @@ report this problem at the inclusion line.

     copy_error *CE = CopyErrors::new_T(SYNTAX_CE, ExtInadequateVM_SYNERROR, C->parsed_from);
-    CopyErrors::supply_node(CE, Extensions::get_inclusion_sentence(E));
+    CopyErrors::supply_node(CE, Extensions::get_inclusion_sentence(E));
     Copies::attach_error(inclusions_errors_to, CE);
 
diff --git a/docs/supervisor-module/6-st.html b/docs/supervisor-module/6-st.html index d03e12978..d2f29d38b 100644 --- a/docs/supervisor-module/6-st.html +++ b/docs/supervisor-module/6-st.html @@ -98,7 +98,7 @@ perhaps combining our feed with that of others.

-source_file *SourceText::read_file(inbuild_copy *C, filename *F, text_stream *synopsis,
+source_file *SourceText::read_file(inbuild_copy *C, filename *F, text_stream *synopsis,
     int documentation_only, int primary) {
     currently_lexing_into = C;
     general_pointer ref = STORE_POINTER_inbuild_copy(NULL);
@@ -157,7 +157,7 @@ source files.
 text_stream *SourceText::describe_source_file(text_stream *paraphrase,
     source_file *referred, text_stream *file) {
     paraphrase = I"source text";
-    inform_extension *E = Extensions::corresponding_to(referred);
+    inform_extension *E = Extensions::corresponding_to(referred);
     if (E) {
         inbuild_work *work = E->as_copy->edition->work;
         if ((work) && (Works::is_standard_rules(work)))
@@ -176,7 +176,7 @@ source files.
 
 void SourceText::gloss_extension(text_stream *OUT, source_file *referred) {
-    inform_extension *E = Extensions::corresponding_to(referred);
+    inform_extension *E = Extensions::corresponding_to(referred);
     if (E) WRITE(" in the extension %X", E->as_copy->edition->work);
 }
 
diff --git a/docs/supervisor-module/7-cns.html b/docs/supervisor-module/7-cns.html index c7fedcc6e..f2f0dbfae 100644 --- a/docs/supervisor-module/7-cns.html +++ b/docs/supervisor-module/7-cns.html @@ -128,7 +128,7 @@ since the inbuild_search_result fo
 text_stream *ExtensionCensus::ecd_rubric(extension_census_datum *ecd) {
-    return Extensions::get_rubric(Extensions::from_copy(ecd->found_as->copy));
+    return Extensions::get_rubric(Extensions::from_copy(ecd->found_as->copy));
 }
 
 int ExtensionCensus::installation_region(extension_census_datum *ecd) {
diff --git a/docs/supervisor-module/7-ip2.html b/docs/supervisor-module/7-ip2.html
index 725105c72..9a5459b04 100644
--- a/docs/supervisor-module/7-ip2.html
+++ b/docs/supervisor-module/7-ip2.html
@@ -252,9 +252,10 @@ easily be scrolled down off screen when the user first visits the page.
 

-    if (Wordings::nonempty(E->documentation_text)) {
+    wording DW = Extensions::get_documentation_text(E);
+    if (Wordings::nonempty(DW)) {
         HTML_OPEN("p");
-        DocumentationRenderer::table_of_contents(E->documentation_text, OUT, leaf);
+        DocumentationRenderer::table_of_contents(DW, OUT, leaf);
         HTML_CLOSE("p");
     }
 
@@ -263,9 +264,9 @@ easily be scrolled down off screen when the user first visits the page.

-    if (Wordings::nonempty(E->documentation_text))
-        no_egs = DocumentationRenderer::set_body_text(E->documentation_text, OUT,
-            eg_number, leaf);
+    wording DW = Extensions::get_documentation_text(E);
+    if (Wordings::nonempty(DW))
+        no_egs = DocumentationRenderer::set_body_text(DW, OUT, eg_number, leaf);
     else {
         HTML_OPEN("p");
         WRITE("The extension provides no documentation.");
diff --git a/inbuild/supervisor-module/Chapter 5/Extension Services.w b/inbuild/supervisor-module/Chapter 5/Extension Services.w
index d87b88f2f..88bfb0f25 100644
--- a/inbuild/supervisor-module/Chapter 5/Extension Services.w	
+++ b/inbuild/supervisor-module/Chapter 5/Extension Services.w	
@@ -15,6 +15,7 @@ typedef struct inform_extension {
 	struct wording body_text; /* Body of source text supplied in extension, if any */
 	int body_text_unbroken; /* Does this contain text waiting to be sentence-broken? */
 	struct wording documentation_text; /* Documentation supplied in extension, if any */
+	int documentation_sought; /* Has it yet been looked for? */
 	int standard; /* the (or perhaps just a) Standard Rules extension */
 	int authorial_modesty; /* Do not credit in the compiled game */
 	struct text_stream *rubric_as_lexed; /* brief description found in opening lines */
@@ -76,6 +77,7 @@ void Extensions::scan(inbuild_copy *C) {
 	E->body_text = EMPTY_WORDING;
 	E->body_text_unbroken = FALSE;
 	E->documentation_text = EMPTY_WORDING;
+	E->documentation_sought = FALSE;
 	E->standard = FALSE;
 	E->authorial_modesty = FALSE;
 	E->read_into_file = NULL;
@@ -810,6 +812,35 @@ and no documentation.
 	if (<>) E->documentation_text = GET_RW(, 2);
 	E->body_text_unbroken = TRUE; /* mark this to be sentence-broken */
 
+@ In directory extensions, documentation can be stored separately:
+
+=
+wording Extensions::get_documentation_text(inform_extension *E) {
+	if (E == NULL) return EMPTY_WORDING;
+	Copies::get_source_text(E->as_copy); /* in the unlikely event this has not happened yet */
+	if (E->documentation_sought == FALSE) {
+		if (E->as_copy->location_if_path) {
+			pathname *D = Pathnames::down(E->as_copy->location_if_path, I"Documentation");
+			filename *F = Filenames::in(D, I"Documentation.txt");
+			if (TextFiles::exists(F)) @;
+		}
+		E->documentation_sought = TRUE;
+	}
+	return E->documentation_text;
+}
+
+@ =
+	if (Wordings::nonempty(E->documentation_text)) {
+		TEMPORARY_TEXT(error_text)
+		WRITE_TO(error_text,
+			"this extension provides documentation both as a file and in its source");
+		Copies::attach_error(E->as_copy, CopyErrors::new_T(EXT_MISWORDED_CE, -1, error_text));
+		DISCARD_TEXT(error_text)					
+	} else {
+		source_file *sf = SourceText::read_file(E->as_copy, F, NULL, TRUE, FALSE);
+		if (sf) E->documentation_text = sf->text_read;
+	}
+
 @ When the extension source text was read from its |source_file|, we
 attached a reference to say which |inform_extension| it was, and here we
 make use of that:
diff --git a/inbuild/supervisor-module/Chapter 7/Individual Pages.w b/inbuild/supervisor-module/Chapter 7/Individual Pages.w
index 773e15d36..34e74afff 100644
--- a/inbuild/supervisor-module/Chapter 7/Individual Pages.w	
+++ b/inbuild/supervisor-module/Chapter 7/Individual Pages.w	
@@ -159,16 +159,17 @@ If the TOC were directly at the top of the supplied documentation, it might
 easily be scrolled down off screen when the user first visits the page.
 
 @ =
-	if (Wordings::nonempty(E->documentation_text)) {
+	wording DW = Extensions::get_documentation_text(E);
+	if (Wordings::nonempty(DW)) {
 		HTML_OPEN("p");
-		DocumentationRenderer::table_of_contents(E->documentation_text, OUT, leaf);
+		DocumentationRenderer::table_of_contents(DW, OUT, leaf);
 		HTML_CLOSE("p");
 	}
 
 @ =
-	if (Wordings::nonempty(E->documentation_text))
-		no_egs = DocumentationRenderer::set_body_text(E->documentation_text, OUT,
-			eg_number, leaf);
+	wording DW = Extensions::get_documentation_text(E);
+	if (Wordings::nonempty(DW))
+		no_egs = DocumentationRenderer::set_body_text(DW, OUT, eg_number, leaf);
 	else {
 		HTML_OPEN("p");
 		WRITE("The extension provides no documentation.");
diff --git a/inform7/Figures/timings-diagnostics.txt b/inform7/Figures/timings-diagnostics.txt
index 8f6ba8ce4..39c48207d 100644
--- a/inform7/Figures/timings-diagnostics.txt
+++ b/inform7/Figures/timings-diagnostics.txt
@@ -1,29 +1,29 @@
 100.0% in inform7 run
-     67.7% in compilation to Inter
-         46.1% in //Sequence::undertake_queued_tasks//
-          4.5% in //MajorNodes::pre_pass//
-          3.4% in //MajorNodes::pass_1//
-          1.7% in //ImperativeDefinitions::assess_all//
-          1.3% in //RTKindConstructors::compile//
-          1.3% in //RTPhrasebook::compile_entries//
+     66.9% in compilation to Inter
+         45.0% in //Sequence::undertake_queued_tasks//
+          4.7% in //MajorNodes::pre_pass//
+          3.6% in //MajorNodes::pass_1//
+          1.8% in //ImperativeDefinitions::assess_all//
+          1.4% in //RTKindConstructors::compile//
+          1.4% in //RTPhrasebook::compile_entries//
           1.0% in //Sequence::lint_inter//
-          0.6% in //MajorNodes::pass_2//
-          0.6% in //Sequence::undertake_queued_tasks//
-          0.6% in //World::stage_V//
+          0.7% in //MajorNodes::pass_2//
           0.3% in //CompletionModule::compile//
           0.3% in //ImperativeDefinitions::compile_first_block//
           0.3% in //Sequence::undertake_queued_tasks//
-          4.9% not specifically accounted for
-     28.1% in running Inter pipeline
-          8.6% in step 5/15: load-binary-kits
+          0.3% in //Sequence::undertake_queued_tasks//
+          0.3% in //World::stage_V//
+          5.1% not specifically accounted for
+     28.7% in running Inter pipeline
+          9.0% in step 5/15: load-binary-kits
           8.3% in step 14/15: generate inform6 -> auto.inf
-          5.5% in step 6/15: make-synoptic-module
-          2.0% in step 9/15: make-identifiers-unique
+          5.8% in step 6/15: make-synoptic-module
+          1.8% in step 9/15: make-identifiers-unique
           0.3% in step 11/15: eliminate-redundant-labels
           0.3% in step 12/15: eliminate-redundant-operations
           0.3% in step 4/15: compile-splats
           0.3% in step 7/15: shorten-wiring
           0.3% in step 8/15: detect-indirect-calls
           1.8% not specifically accounted for
-      3.1% in supervisor
-      1.1% not specifically accounted for
+      3.6% in supervisor
+      0.8% not specifically accounted for
diff --git a/inform7/Internal/Inter/BasicInformExtrasKit/kit_metadata.json b/inform7/Internal/Inter/BasicInformExtrasKit/kit_metadata.json
index a59da28ca..1e83d22f5 100644
--- a/inform7/Internal/Inter/BasicInformExtrasKit/kit_metadata.json
+++ b/inform7/Internal/Inter/BasicInformExtrasKit/kit_metadata.json
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "BasicInformExtrasKit",
-        "version": "10.2.0-beta+6W25"
+        "version": "10.2.0-beta+6W26"
     },
     "kit-details": {
         "has-priority": 1
diff --git a/inform7/Internal/Inter/BasicInformKit/kit_metadata.json b/inform7/Internal/Inter/BasicInformKit/kit_metadata.json
index acf560f29..a165a6dbf 100644
--- a/inform7/Internal/Inter/BasicInformKit/kit_metadata.json
+++ b/inform7/Internal/Inter/BasicInformKit/kit_metadata.json
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "BasicInformKit",
-        "version": "10.2.0-beta+6W25"
+        "version": "10.2.0-beta+6W26"
     },
     "needs": [ {
         "unless": {
diff --git a/inform7/Internal/Inter/CommandParserKit/kit_metadata.json b/inform7/Internal/Inter/CommandParserKit/kit_metadata.json
index 696a3115a..0df5b3316 100644
--- a/inform7/Internal/Inter/CommandParserKit/kit_metadata.json
+++ b/inform7/Internal/Inter/CommandParserKit/kit_metadata.json
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "CommandParserKit",
-        "version": "10.2.0-beta+6W25"
+        "version": "10.2.0-beta+6W26"
     },
     "needs": [ {
         "need": {
diff --git a/inform7/Internal/Inter/EnglishLanguageKit/kit_metadata.json b/inform7/Internal/Inter/EnglishLanguageKit/kit_metadata.json
index 7d0e35032..e7420258c 100644
--- a/inform7/Internal/Inter/EnglishLanguageKit/kit_metadata.json
+++ b/inform7/Internal/Inter/EnglishLanguageKit/kit_metadata.json
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "EnglishLanguageKit",
-        "version": "10.2.0-beta+6W25"
+        "version": "10.2.0-beta+6W26"
     },
     "needs": [ {
         "need": {
diff --git a/inform7/Internal/Inter/WorldModelKit/kit_metadata.json b/inform7/Internal/Inter/WorldModelKit/kit_metadata.json
index c635c0835..814250150 100644
--- a/inform7/Internal/Inter/WorldModelKit/kit_metadata.json
+++ b/inform7/Internal/Inter/WorldModelKit/kit_metadata.json
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "WorldModelKit",
-        "version": "10.2.0-beta+6W25"
+        "version": "10.2.0-beta+6W26"
     },
     "needs": [ {
         "need": {