From a01526fdf506fa9cc6f1b989a4e614bdf974c5d1 Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Sun, 17 Nov 2024 12:02:18 +0000 Subject: [PATCH] Fixed minor bug in makefile and in very first rule code --- README.md | 2 +- build.txt | 4 +- docs/Architecture32Kit/S-glk.html | 61 +++++++++++++------ docs/Architecture32Kit/S-io.html | 12 ++++ docs/assertions-module/6-bl.html | 4 +- docs/basic_inform/S-gag.html | 16 ++--- docs/lexicon-module/P-wtmd.html | 6 +- inform7/Downloads/excerpts-diagnostics.txt | 6 +- inform7/Downloads/preform-diagnostics.txt | 6 +- inform7/Figures/memory-diagnostics.txt | 44 ++++++------- inform7/Figures/timings-diagnostics.txt | 25 ++++---- .../Inter/Architecture16Kit/kit_metadata.json | 2 +- .../Inter/Architecture32Kit/kit_metadata.json | 2 +- .../Inter/BasicInformKit/kit_metadata.json | 2 +- .../Basic Inform.i7xd/Source/Basic Inform.i7x | 2 +- .../EnglishLanguageKit/kit_metadata.json | 2 +- .../Inter/CommandParserKit/kit_metadata.json | 2 +- .../Inter/DialogueKit/kit_metadata.json | 2 +- .../Inter/WorldModelKit/kit_metadata.json | 2 +- .../Chapter 6/Booking Lists.w | 4 +- .../basic_inform/Sections/Glulx and Glk.w | 2 +- scripts/inform.mkscript | 8 ++- .../Figures/excerpts-diagnostics.txt | 6 +- 23 files changed, 132 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index b9e05e253..ef0e4580e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Inform 7 -[Version](notes/versioning.md): 10.2.0-beta+6X81 'Krypton' (14 November 2024) +[Version](notes/versioning.md): 10.2.0-beta+6X82 'Krypton' (17 November 2024) ## About Inform diff --git a/build.txt b/build.txt index 28ddbbe4f..b32f75cdc 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ Prerelease: beta -Build Date: 14 November 2024 -Build Number: 6X81 +Build Date: 17 November 2024 +Build Number: 6X82 diff --git a/docs/Architecture32Kit/S-glk.html b/docs/Architecture32Kit/S-glk.html index e9765ec91..b8c7d7b23 100644 --- a/docs/Architecture32Kit/S-glk.html +++ b/docs/Architecture32Kit/S-glk.html @@ -139,8 +139,10 @@

statuswin_cursize = 0; gg_foregroundchan = 0; gg_backgroundchan = 0; +#Ifdef COMMAND_STREAM; gg_commandstr = 0; gg_command_reading = false; +#Endif; rfalse; ]; @@ -183,6 +185,9 @@

gg_savestr = current_glk_object_reference; GG_SCRIPTSTR_ROCK: gg_scriptstr = current_glk_object_reference; + } +#Ifdef COMMAND_STREAM; + switch (current_glk_object_rock) { GG_COMMANDWSTR_ROCK: gg_commandstr = current_glk_object_reference; gg_command_reading = false; @@ -190,6 +195,7 @@

gg_commandstr = current_glk_object_reference; gg_command_reading = true; } +#Endif; rfalse; ]; @@ -417,8 +423,12 @@

} Fix the coordinates of grid window mouse events if (win_obj.glk_window_type == wintype_TextGrid) { - val1 = val1--; - val2 = val2--; + val1--; + val2--; + } + if (val1 < 0 || val2 < 0) { + IssueRTP("EventInvalidMouseCoords", "GLK_EVENT_TY_New: Glk mouse event created with invalid coordinates.", Architecture32KitRTPs); + return ev; } } ev-->GLK_EVENT_TYPE_SF = evtype; @@ -444,17 +454,19 @@

return nothing; ]; -[ GLK_EVENT_TY_Value1 ev; - switch (ev-->GLK_EVENT_TYPE_SF) { - evtype_CharInput: - return MapGlkKeyCodeToUnicode(ev-->GLK_EVENT_VALUE1_SF); - evtype_MouseInput: - if ((ev-->GLK_EVENT_WINDOW_SF).glk_window_type == wintype_TextGrid) { - return ev-->GLK_EVENT_VALUE1_SF + 1; - } - return ev-->GLK_EVENT_VALUE1_SF; - evtype_Hyperlink: - return ev-->GLK_EVENT_VALUE1_SF; +[ GLK_EVENT_TY_Value1 ev evtype; + if (evtype == ev-->GLK_EVENT_TYPE_SF) { + switch (evtype) { + evtype_CharInput: + return MapGlkKeyCodeToUnicode(ev-->GLK_EVENT_VALUE1_SF); + evtype_MouseInput: + if ((ev-->GLK_EVENT_WINDOW_SF).glk_window_type == wintype_TextGrid) { + return ev-->GLK_EVENT_VALUE1_SF + 1; + } + return ev-->GLK_EVENT_VALUE1_SF; + evtype_Hyperlink: + return ev-->GLK_EVENT_VALUE1_SF; + } } IssueRTP("EventWrongType", "GLK_EVENT_TY_Value1: Glk event phrase called for wrong event type.", Architecture32KitRTPs); return 0; @@ -540,7 +552,7 @@

event_struct-->3 = ev-->GLK_EVENT_VALUE2_SF; ]; -

§10. GLK_EVENT_TY_Process applies a glk event onto the current glk event, and +

§10. GLK_EVENT_TY_Handle_Instead applies a glk event onto the current glk event, and tells glk_select to re-run the glk event handling rules. It also ensures that if there are any pending keyboard input requests they will be cancelled if the new event is a keyboard event. @@ -548,9 +560,19 @@

 Array current_glk_event --> [ BLK_BVBITMAP_SBONLY; GLK_EVENT_TY; 0; 0; 0; 0; 0; 0; 0; ];
-Global glk_event_replaced;
 
-[ GLK_EVENT_TY_Process ev evtype win_obj;
+Constant GLK_EVENT_HANDLING_INACTIVE   0;
+Constant GLK_EVENT_HANDLING_ACTIVE     1;
+Constant GLK_EVENT_HANDLING_REHANDLING 2;
+Global glk_event_handling_status = GLK_EVENT_HANDLING_INACTIVE;
+
+[ GLK_EVENT_TY_Handle_Instead ev evtype win_obj;
+    if (glk_event_handling_status == GLK_EVENT_HANDLING_INACTIVE) {
+        IssueRTP("EventHandledWhileInactive", "Cannot handle new event while not handling events.", Architecture32KitRTPs);
+        RulebookSucceeds();
+        rtrue;
+    }
+
     evtype = ev-->GLK_EVENT_TYPE_SF;
     win_obj = ev-->GLK_EVENT_WINDOW_SF;
 
@@ -581,7 +603,7 @@ 

current_glk_event-->GLK_EVENT_VALUE2_SF = ev-->GLK_EVENT_VALUE2_SF; RulebookSucceeds(); - glk_event_replaced = 1; + glk_event_handling_status = GLK_EVENT_HANDLING_REHANDLING; ];

§11. To handle events we intercept the glk_select function. This allows us to handle @@ -600,9 +622,10 @@

@push debug_rules; @push say__p; @push say__pc; debug_rules = false; ClearParagraphing(1); do { - glk_event_replaced = 0; + glk_event_handling_status = GLK_EVENT_HANDLING_ACTIVE; FollowRulebook(GLK_EVENT_HANDLING_RB, current_glk_event-->GLK_EVENT_TYPE_SF, true); - } until (glk_event_replaced == 0); + } until (glk_event_handling_status == GLK_EVENT_HANDLING_ACTIVE); + glk_event_handling_status = GLK_EVENT_HANDLING_INACTIVE; @pull say__pc; @pull say__p; @pull debug_rules; GLK_EVENT_TY_To_Struct(current_glk_event, event_struct); diff --git a/docs/Architecture32Kit/S-io.html b/docs/Architecture32Kit/S-io.html index f38212354..e64a0633e 100644 --- a/docs/Architecture32Kit/S-io.html +++ b/docs/Architecture32Kit/S-io.html @@ -76,8 +76,10 @@

Constant GG_QUOTEWIN_ROCK 203; Constant GG_SAVESTR_ROCK 301; Constant GG_SCRIPTSTR_ROCK 302; +#Ifdef COMMAND_STREAM; Constant GG_COMMANDWSTR_ROCK 303; Constant GG_COMMANDRSTR_ROCK 304; +#Endif; Constant GG_SCRIPTFREF_ROCK 401; Constant GG_FOREGROUNDCHAN_ROCK 410; Constant GG_BACKGROUNDCHAN_ROCK 411; @@ -204,8 +206,10 @@

Global gg_statuswin = 0; Global gg_quotewin = 0; Global gg_savestr = 0; +#Ifdef COMMAND_STREAM; Global gg_commandstr = 0; Global gg_command_reading = 0; true if gg_commandstr is being replayed +#Endif; Global gg_foregroundchan = 0; Global gg_backgroundchan = 0; @@ -248,6 +252,7 @@

[ VM_KeyChar win done res ix jx ch; jx = ch; squash compiler warnings if (win == 0) win = gg_mainwin; +#Ifdef COMMAND_STREAM; if (gg_commandstr ~= 0 && gg_command_reading ~= false) { done = glk_get_line_stream(gg_commandstr, gg_arguments, 31); if (done == 0) { @@ -278,6 +283,7 @@

jump KCPContinue; } } +#Endif; done = false; glk_request_char_event(win); while (~~done) { @@ -290,6 +296,7 @@

} } } +#Ifdef COMMAND_STREAM; if (gg_commandstr ~= 0 && gg_command_reading == false) { if (res < 32 || res >= 256 || (res == '\' or ' ')) { glk_put_char_stream(gg_commandstr, '\'); @@ -312,6 +319,7 @@

glk_put_char_stream(gg_commandstr, 10); newline } .KCPContinue; +#Endif; return MapGlkKeyCodeToUnicode(res); ]; @@ -334,6 +342,7 @@

Constant UnicodeWhitespaceLen = 8; [ VM_ReadKeyboard a_buffer a_table done ix chr; +#Ifdef COMMAND_STREAM; if (gg_commandstr ~= 0 && gg_command_reading ~= false) { done = glk_get_line_stream_uni(gg_commandstr, a_buffer+WORDSIZE, (INPUT_BUFFER_LEN-1)-1); @@ -352,6 +361,7 @@

jump KPContinue; } } +#Endif; done = false; glk_request_line_event_uni(gg_mainwin, a_buffer+WORDSIZE, INPUT_BUFFER_LEN-1, 0); while (~~done) { @@ -371,11 +381,13 @@

glk_set_style(style_Normal); glk_put_char(10); newline } +#Ifdef COMMAND_STREAM; if (gg_commandstr ~= 0 && gg_command_reading == false) { glk_put_buffer_stream(gg_commandstr, a_buffer+WORDSIZE, a_buffer-->0); glk_put_char_stream(gg_commandstr, 10); newline } .KPContinue; +#Endif; for ( ix = 1 : ix <= (a_buffer-->0) : ix++ ) { chr = a_buffer-->ix; diff --git a/docs/assertions-module/6-bl.html b/docs/assertions-module/6-bl.html index 4a8c358a0..2ec84004c 100644 --- a/docs/assertions-module/6-bl.html +++ b/docs/assertions-module/6-bl.html @@ -392,12 +392,14 @@

move forward to final valid first rule (if any exist) while ((insert_after->next_booking != end_rule) - && (insert_after->next_booking->placement == FIRST_PLACEMENT)) + && ((insert_after->next_booking->placement == VERY_FIRST_PLACEMENT) || + (insert_after->next_booking->placement == FIRST_PLACEMENT))) insert_after = insert_after->next_booking; move forward past other middle rules if they are not less specific while ((insert_after->next_booking != end_rule) stop before \(p\) leaves valid range && (insert_after->next_booking->placement != LAST_PLACEMENT) or reaches a last rule + && (insert_after->next_booking->placement != VERY_LAST_PLACEMENT) or a very last rule && (RuleBookings::cmp(insert_after->next_booking, new_br, log) >= 0)) or a rule less specific than the new one insert_after = insert_after->next_booking; diff --git a/docs/basic_inform/S-gag.html b/docs/basic_inform/S-gag.html index 2c304528c..d0dda660c 100644 --- a/docs/basic_inform/S-gag.html +++ b/docs/basic_inform/S-gag.html @@ -210,19 +210,19 @@

To decide what unicode character is the character value of (ev - glk event) (documented at ph_glkeventcharactervalue): - (- GLK_EVENT_TY_Value1({ev}) -). + (- GLK_EVENT_TY_Value1({ev}, evtype_CharInput) -). To decide what number is the x coordinate of (ev - glk event): - (- GLK_EVENT_TY_Value1({ev}) -). + (- GLK_EVENT_TY_Value1({ev}, evtype_MouseInput) -). To decide what number is the y coordinate of (ev - glk event): (- GLK_EVENT_TY_Value2({ev}) -). To decide what number is the row of (ev - glk event): (- GLK_EVENT_TY_Value2({ev}) -). -To decide what number is the column of (ev - glk event): - (- GLK_EVENT_TY_Value1({ev}) -). +To decide what number is the column/col of (ev - glk event): + (- GLK_EVENT_TY_Value1({ev}, evtype_MouseInput) -). To decide what number is the hyperlink value of (ev - glk event): - (- GLK_EVENT_TY_Value1({ev}) -). + (- GLK_EVENT_TY_Value1({ev}, evtype_Hyperlink) -). To decide what text is the text of (ev - glk event) (documented at ph_glkeventtextvalue): @@ -240,12 +240,12 @@

The current glk event initialiser is a glk event variable. The current glk event initialiser variable is defined by Inter as "current_glk_event". -First glk event handling rule for a glk event type +Very first glk event handling rule for a glk event type (this is the set glk event processing variables rule): now the event is the current glk event initialiser. -To process (ev - glk event): - (- GLK_EVENT_TY_Process({ev}); rtrue; -). +To handle (ev - glk event): + (- GLK_EVENT_TY_Handle_Instead({ev}); rtrue; -). Glk event handling rule for a screen resize event (this is the redraw the status line rule): redraw the status window; diff --git a/docs/lexicon-module/P-wtmd.html b/docs/lexicon-module/P-wtmd.html index 2d3cf1a0d..126642dbb 100644 --- a/docs/lexicon-module/P-wtmd.html +++ b/docs/lexicon-module/P-wtmd.html @@ -180,9 +180,9 @@

number of successes.
-Size of lexicon: 3657 excerpt meanings
-  Stored among 939 words out of total vocabulary of 10997
-  802 words have a start list: longest belongs to report (with 296 meanings)
+Size of lexicon: 3658 excerpt meanings
+  Stored among 940 words out of total vocabulary of 10998
+  803 words have a start list: longest belongs to report (with 296 meanings)
   23 words have an end list: longest belongs to digits (with 7 meanings)
   29 words have a middle list: longest belongs to matches (with 6 meanings)
   111 words have a subset list: longest belongs to street (with 4 meanings)
diff --git a/inform7/Downloads/excerpts-diagnostics.txt b/inform7/Downloads/excerpts-diagnostics.txt
index 174c9531f..1117589e5 100644
--- a/inform7/Downloads/excerpts-diagnostics.txt
+++ b/inform7/Downloads/excerpts-diagnostics.txt
@@ -1,6 +1,6 @@
-Size of lexicon: 3657 excerpt meanings
-  Stored among 939 words out of total vocabulary of 10997
-  802 words have a start list: longest belongs to report (with 296 meanings)
+Size of lexicon: 3658 excerpt meanings
+  Stored among 940 words out of total vocabulary of 10998
+  803 words have a start list: longest belongs to report (with 296 meanings)
   23 words have an end list: longest belongs to digits (with 7 meanings)
   29 words have a middle list: longest belongs to matches (with 6 meanings)
   111 words have a subset list: longest belongs to street (with 4 meanings)
diff --git a/inform7/Downloads/preform-diagnostics.txt b/inform7/Downloads/preform-diagnostics.txt
index 169c95a97..572c0ed55 100644
--- a/inform7/Downloads/preform-diagnostics.txt
+++ b/inform7/Downloads/preform-diagnostics.txt
@@ -7371,11 +7371,11 @@
         very first rule  
           (hits 0/311) constraint DS = {19} extremes [4, infinity)
         very first  
-          (hits 0/329) constraint DS = {19} extremes [3, infinity)
+          (hits 1/329) (matched long text) constraint DS = {19} extremes [3, infinity)
         first rule  
-          (hits 0/329) constraint DS = {19} extremes [3, infinity)
+          (hits 0/328) constraint DS = {19} extremes [3, infinity)
         first  
-          (hits 9/338) (matched long text) constraint DS = {19} extremes [2, infinity)
+          (hits 8/337) (matched: 'first check an actor locking something with') constraint DS = {19} extremes [2, infinity)
         last rule  
           (hits 0/320) constraint DS = {19} extremes [3, infinity)
         last  
diff --git a/inform7/Figures/memory-diagnostics.txt b/inform7/Figures/memory-diagnostics.txt
index 0d8b6be83..12a06b297 100644
--- a/inform7/Figures/memory-diagnostics.txt
+++ b/inform7/Figures/memory-diagnostics.txt
@@ -1,31 +1,31 @@
-Total memory consumption was 153750K = 150 MB
+Total memory consumption was 153343K = 150 MB
 
- ---- was used for 2280388 objects, in 402674 frames in 0 x 800K = 0K = 0 MB:
+ ---- was used for 2279554 objects, in 402632 frames in 0 x 800K = 0K = 0 MB:
 
-    28.8%  inter_tree_node_array                    63 x 8192 = 516096 objects, 45418464 bytes
-    19.8%  text_stream_array                        5560 x 100 = 556000 objects, 31313920 bytes
-    18.1%  linked_list                              51083 objects, 28606480 bytes
+    28.9%  inter_tree_node_array                    63 x 8192 = 516096 objects, 45418464 bytes
+    19.9%  text_stream_array                        5554 x 100 = 555400 objects, 31280128 bytes
+    18.2%  linked_list                              51083 objects, 28606480 bytes
     10.2%  scan_directory                           3900 objects, 16099200 bytes
      9.6%  inter_symbol_array                       142 x 1024 = 145408 objects, 15126976 bytes
      9.1%  inter_error_stash_array                  110 x 1024 = 112640 objects, 14421440 bytes
-     6.9%  parse_node                               137360 objects, 10988800 bytes
+     6.9%  parse_node                               137361 objects, 10988880 bytes
      4.8%  verb_conjugation                         165 objects, 7657320 bytes
      3.7%  parse_node_annotation_array              368 x 500 = 184000 objects, 5899776 bytes
      2.3%  pcalc_prop_array                         27 x 1000 = 27000 objects, 3672864 bytes
-     2.1%  inter_name_array                         72 x 1000 = 72000 objects, 3458304 bytes
+     2.2%  inter_name_array                         72 x 1000 = 72000 objects, 3458304 bytes
      1.7%  kind_array                               70 x 1000 = 70000 objects, 2802240 bytes
      1.4%  inter_schema_token                       14673 objects, 2230296 bytes
-     1.3%  inter_name_generator_array               55 x 1000 = 55000 objects, 2201760 bytes
+     1.4%  inter_name_generator_array               55 x 1000 = 55000 objects, 2201760 bytes
      1.2%  package_request                          22153 objects, 1949464 bytes
-     1.1%  vocabulary_entry_array                   168 x 100 = 16800 objects, 1886976 bytes
-     1.1%  dict_entry_array                         562 x 100 = 56200 objects, 1816384 bytes
-     0.9%  inter_symbols_table                      27947 objects, 1565032 bytes
+     1.2%  vocabulary_entry_array                   168 x 100 = 16800 objects, 1886976 bytes
+     1.1%  dict_entry_array                         560 x 100 = 56000 objects, 1809920 bytes
+     0.9%  inter_symbols_table                      27946 objects, 1564976 bytes
      0.9%  i6_schema_array                          25 x 100 = 2500 objects, 1500800 bytes
      0.9%  match_trie_array                         11 x 1000 = 11000 objects, 1496352 bytes
-     0.8%  map_data                                 843 objects, 1416240 bytes
-     0.8%  inter_package                            27947 objects, 1341456 bytes
+     0.9%  map_data                                 843 objects, 1416240 bytes
+     0.8%  inter_package                            27946 objects, 1341408 bytes
      0.7%  id_body                                  1058 objects, 1210352 bytes
-     0.7%  excerpt_meaning                          3657 objects, 1140984 bytes
+     0.7%  excerpt_meaning                          3658 objects, 1141296 bytes
      0.6%  adjective_meaning                        218 objects, 1079536 bytes
      0.6%  inter_schema_node                        9398 objects, 1052576 bytes
      0.5%  individual_form                          2791 objects, 937776 bytes
@@ -34,7 +34,7 @@ Total memory consumption was 153750K = 150 MB
      0.5%  ptoken                                   8795 objects, 914680 bytes
      0.4%  unary_predicate_array                    17 x 1000 = 17000 objects, 680544 bytes
      0.3%  local_variable_array                     52 x 100 = 5200 objects, 500864 bytes
-     0.2%  dictionary                               8266 objects, 396768 bytes
+     0.2%  dictionary                               8263 objects, 396624 bytes
      0.2%  verb_usage                               1148 objects, 394912 bytes
      0.2%  rule                                     494 objects, 387296 bytes
      0.2%  verb_form                                392 objects, 354368 bytes
@@ -48,7 +48,7 @@ Total memory consumption was 153750K = 150 MB
      0.1%  linguistic_stock_item                    3541 objects, 169968 bytes
      ----  rule_family_data                         408 objects, 150144 bytes
      ----  nascent_array                            2299 objects, 147136 bytes
-     ----  filename                                 3610 objects, 144400 bytes
+     ----  filename                                 3626 objects, 145040 bytes
      ----  nonterminal                              778 objects, 143152 bytes
      ----  markdown_item_array                      1 x 1000 objects, 136032 bytes
      ----  inference                                1779 objects, 128088 bytes
@@ -119,7 +119,7 @@ Total memory consumption was 153750K = 150 MB
      ----  adjective_iname_holder                   337 objects, 13480 bytes
      ----  booking_list                             417 objects, 13344 bytes
      ----  web_bibliographic_datum                  203 objects, 12992 bytes
-     ----  uniqueness_count                         533 objects, 12792 bytes
+     ----  uniqueness_count                         486 objects, 11664 bytes
      ----  inter_construct                          32 objects, 11008 bytes
      ----  md_doc_state                             2 objects, 10480 bytes
      ----  heading_tree                             33 objects, 10296 bytes
@@ -271,16 +271,16 @@ Total memory consumption was 153750K = 150 MB
 
 100.0% was used for memory not allocated for objects:
 
-    64.4%  text stream storage                      101506060 bytes in 580271 claims
-     3.9%  dictionary storage                       6186112 bytes in 8266 claims
+    64.4%  text stream storage                      101232096 bytes in 579699 claims
+     3.9%  dictionary storage                       6168192 bytes in 8263 claims
      ----  sorting                                  20984 bytes in 2656 claims
      4.5%  source text                              7200000 bytes in 3 claims
      6.8%  source text details                      10800000 bytes in 2 claims
      0.1%  documentation fragments                  262144 bytes in 1 claim
      ----  linguistic stock array                   81920 bytes in 2 claims
      ----  small word set array                     105600 bytes in 22 claims
-     3.1%  inter symbols storage                    4906496 bytes in 29427 claims
-    10.7%  inter bytecode storage                   16898464 bytes in 15 claims
+     3.1%  inter symbols storage                    4905872 bytes in 29425 claims
+    10.6%  inter bytecode storage                   16773620 bytes in 15 claims
      3.9%  inter links storage                      6222976 bytes in 11 claims
      0.1%  inter tree location list storage         191232 bytes in 32 claims
      1.7%  instance-of-kind counting                2715904 bytes in 1 claim
@@ -289,5 +289,5 @@ Total memory consumption was 153750K = 150 MB
      ----  code generation workspace for objects    3616 bytes in 19 claims
      0.1%  emitter array storage                    295200 bytes in 2112 claims
 
--139.-9% was overhead - -220299032 bytes = -215135K = -210 MB
+-140.-2% was overhead - -220258432 bytes = -215096K = -210 MB
 
diff --git a/inform7/Figures/timings-diagnostics.txt b/inform7/Figures/timings-diagnostics.txt
index 47781cb91..d396ad0e5 100644
--- a/inform7/Figures/timings-diagnostics.txt
+++ b/inform7/Figures/timings-diagnostics.txt
@@ -1,11 +1,11 @@
 100.0% in inform7 run
-     65.8% in compilation to Inter
-         43.3% in //Sequence::undertake_queued_tasks//
-          4.4% in //MajorNodes::pre_pass//
-          3.7% in //MajorNodes::pass_1//
+     66.4% in compilation to Inter
+         43.9% in //Sequence::undertake_queued_tasks//
+          4.1% in //MajorNodes::pre_pass//
+          3.4% in //MajorNodes::pass_1//
           2.0% in //RTKindConstructors::compile//
           1.7% in //ImperativeDefinitions::assess_all//
-          1.7% in //RTPhrasebook::compile_entries//
+          1.3% in //RTPhrasebook::compile_entries//
           1.0% in //Sequence::lint_inter//
           0.6% in //ImperativeDefinitions::compile_first_block//
           0.6% in //MajorNodes::pass_2//
@@ -15,17 +15,16 @@
           0.3% in //Sequence::undertake_queued_tasks//
           0.3% in //Sequence::undertake_queued_tasks//
           0.3% in //Task::make_built_in_kind_constructors//
-          4.1% not specifically accounted for
-     26.9% in running Inter pipeline
-          8.8% in step 14/15: generate inform6 -> auto.inf
-          7.1% in step 5/15: load-binary-kits
-          5.4% in step 6/15: make-synoptic-module
+          4.9% not specifically accounted for
+     26.2% in running Inter pipeline
+          8.6% in step 14/15: generate inform6 -> auto.inf
+          6.9% in step 5/15: load-binary-kits
+          5.5% in step 6/15: make-synoptic-module
           2.0% 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.7% not specifically accounted for
-      6.4% in supervisor
-      0.7% not specifically accounted for
+      6.2% in supervisor
+      1.1% not specifically accounted for
diff --git a/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/Architecture16Kit/kit_metadata.json b/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/Architecture16Kit/kit_metadata.json
index aa10153c6..e8a274b99 100644
--- a/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/Architecture16Kit/kit_metadata.json	
+++ b/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/Architecture16Kit/kit_metadata.json	
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "Architecture16Kit",
-        "version": "10.2.0-beta+6X81"
+        "version": "10.2.0-beta+6X82"
     },
     "compatibility": "16-bit",
     "kit-details": {
diff --git a/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/Architecture32Kit/kit_metadata.json b/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/Architecture32Kit/kit_metadata.json
index 213f1f88b..ce02f36b4 100644
--- a/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/Architecture32Kit/kit_metadata.json	
+++ b/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/Architecture32Kit/kit_metadata.json	
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "Architecture32Kit",
-        "version": "10.2.0-beta+6X81"
+        "version": "10.2.0-beta+6X82"
     },
     "compatibility": "32-bit",
     "kit-details": {
diff --git a/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/BasicInformKit/kit_metadata.json b/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/BasicInformKit/kit_metadata.json
index e31fdbbc2..1c48f6302 100644
--- a/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/BasicInformKit/kit_metadata.json	
+++ b/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Materials/Inter/BasicInformKit/kit_metadata.json	
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "BasicInformKit",
-        "version": "10.2.0-beta+6X81"
+        "version": "10.2.0-beta+6X82"
     },
     "needs": [ {
         "need": {
diff --git a/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Source/Basic Inform.i7x b/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Source/Basic Inform.i7x
index 0ca785e50..48cb51a3b 100644
--- a/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Source/Basic Inform.i7x	
+++ b/inform7/Internal/Extensions/Graham Nelson/Basic Inform.i7xd/Source/Basic Inform.i7x	
@@ -1844,7 +1844,7 @@ The glk event handling rulebook has a glk event called the event.
 The current glk event initialiser is a glk event variable.
 The current glk event initialiser variable is defined by Inter as "current_glk_event".
 
-First glk event handling rule for a glk event type
+Very first glk event handling rule for a glk event type
 	(this is the set glk event processing variables rule):
 	now the event is the current glk event initialiser.
 
diff --git a/inform7/Internal/Extensions/Graham Nelson/English Language.i7xd/Materials/Inter/EnglishLanguageKit/kit_metadata.json b/inform7/Internal/Extensions/Graham Nelson/English Language.i7xd/Materials/Inter/EnglishLanguageKit/kit_metadata.json
index 341629e77..88403f6ef 100644
--- a/inform7/Internal/Extensions/Graham Nelson/English Language.i7xd/Materials/Inter/EnglishLanguageKit/kit_metadata.json	
+++ b/inform7/Internal/Extensions/Graham Nelson/English Language.i7xd/Materials/Inter/EnglishLanguageKit/kit_metadata.json	
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "EnglishLanguageKit",
-        "version": "10.2.0-beta+6X81"
+        "version": "10.2.0-beta+6X82"
     },
     "needs": [ {
         "need": {
diff --git a/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/CommandParserKit/kit_metadata.json b/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/CommandParserKit/kit_metadata.json
index b3cbf9e4f..070d44a76 100644
--- a/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/CommandParserKit/kit_metadata.json	
+++ b/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/CommandParserKit/kit_metadata.json	
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "CommandParserKit",
-        "version": "10.2.0-beta+6X81"
+        "version": "10.2.0-beta+6X82"
     },
     "needs": [ {
         "need": {
diff --git a/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/DialogueKit/kit_metadata.json b/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/DialogueKit/kit_metadata.json
index 7bace6b99..efa52ae31 100644
--- a/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/DialogueKit/kit_metadata.json	
+++ b/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/DialogueKit/kit_metadata.json	
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "DialogueKit",
-        "version": "10.2.0-beta+6X81"
+        "version": "10.2.0-beta+6X82"
     },
     "activates": [ "dialogue" ],
     "kit-details": {
diff --git a/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/WorldModelKit/kit_metadata.json b/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/WorldModelKit/kit_metadata.json
index 54fa6528e..e8163c2c9 100644
--- a/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/WorldModelKit/kit_metadata.json	
+++ b/inform7/Internal/Extensions/Graham Nelson/Standard Rules.i7xd/Materials/Inter/WorldModelKit/kit_metadata.json	
@@ -2,7 +2,7 @@
     "is": {
         "type": "kit",
         "title": "WorldModelKit",
-        "version": "10.2.0-beta+6X81"
+        "version": "10.2.0-beta+6X82"
     },
     "needs": [ {
         "need": {
diff --git a/inform7/assertions-module/Chapter 6/Booking Lists.w b/inform7/assertions-module/Chapter 6/Booking Lists.w
index 6a8425fa5..1b92dc085 100644
--- a/inform7/assertions-module/Chapter 6/Booking Lists.w	
+++ b/inform7/assertions-module/Chapter 6/Booking Lists.w	
@@ -267,12 +267,14 @@ last rule, if there is one.
 
 	/* move forward to final valid first rule (if any exist) */
 	while ((insert_after->next_booking != end_rule)
-		&& (insert_after->next_booking->placement == FIRST_PLACEMENT))
+		&& ((insert_after->next_booking->placement == VERY_FIRST_PLACEMENT) ||
+			(insert_after->next_booking->placement == FIRST_PLACEMENT)))
 		insert_after = insert_after->next_booking;
 
 	/* move forward past other middle rules if they are not less specific */
 	while ((insert_after->next_booking != end_rule) /* stop before $p$ leaves valid range */
 		&& (insert_after->next_booking->placement != LAST_PLACEMENT) /* or reaches a last rule */
+		&& (insert_after->next_booking->placement != VERY_LAST_PLACEMENT) /* or a very last rule */
 		&& (RuleBookings::cmp(insert_after->next_booking, new_br,
 			log) >= 0)) /* or a rule less specific than the new one */
 		insert_after = insert_after->next_booking;
diff --git a/inform7/extensions/basic_inform/Sections/Glulx and Glk.w b/inform7/extensions/basic_inform/Sections/Glulx and Glk.w
index dd9f5352b..c93638e02 100644
--- a/inform7/extensions/basic_inform/Sections/Glulx and Glk.w	
+++ b/inform7/extensions/basic_inform/Sections/Glulx and Glk.w	
@@ -185,7 +185,7 @@ The glk event handling rulebook has a glk event called the event.
 The current glk event initialiser is a glk event variable.
 The current glk event initialiser variable is defined by Inter as "current_glk_event".
 
-First glk event handling rule for a glk event type
+Very first glk event handling rule for a glk event type
 	(this is the set glk event processing variables rule):
 	now the event is the current glk event initialiser.
 
diff --git a/scripts/inform.mkscript b/scripts/inform.mkscript
index ffa7c77bd..d4c2e9c05 100644
--- a/scripts/inform.mkscript
+++ b/scripts/inform.mkscript
@@ -295,11 +295,15 @@ forceextensions:
 
 .PHONY: kits
 kits:
-	$(INBUILDX) -build -contents-of $(INFORM7WEB)/Internal/Inter
+	$(INBUILDX) -build -contents-of $(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/Standard\ Rules.i7xd/Materials/Inter
+	$(INBUILDX) -build -contents-of $(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/Basic\ Inform.i7xd/Materials/Inter
+	$(INBUILDX) -build -contents-of $(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/English\ Language.i7xd/Materials/Inter
 
 .PHONY: forcekits
 forcekits:
-	$(INBUILDX) -rebuild -contents-of $(INFORM7WEB)/Internal/Inter
+	$(INBUILDX) -rebuild -contents-of $(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/Standard\ Rules.i7xd/Materials/Inter
+	$(INBUILDX) -rebuild -contents-of $(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/Basic\ Inform.i7xd/Materials/Inter
+	$(INBUILDX) -rebuild -contents-of $(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/English\ Language.i7xd/Materials/Inter
 
 # -----------------------------------------------------------------------------
 # Target "tools"
diff --git a/services/lexicon-module/Figures/excerpts-diagnostics.txt b/services/lexicon-module/Figures/excerpts-diagnostics.txt
index 174c9531f..1117589e5 100644
--- a/services/lexicon-module/Figures/excerpts-diagnostics.txt
+++ b/services/lexicon-module/Figures/excerpts-diagnostics.txt
@@ -1,6 +1,6 @@
-Size of lexicon: 3657 excerpt meanings
-  Stored among 939 words out of total vocabulary of 10997
-  802 words have a start list: longest belongs to report (with 296 meanings)
+Size of lexicon: 3658 excerpt meanings
+  Stored among 940 words out of total vocabulary of 10998
+  803 words have a start list: longest belongs to report (with 296 meanings)
   23 words have an end list: longest belongs to digits (with 7 meanings)
   29 words have a middle list: longest belongs to matches (with 6 meanings)
   111 words have a subset list: longest belongs to street (with 4 meanings)