-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathreleasenotes.txt
1333 lines (1222 loc) · 72.3 KB
/
releasenotes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Upcoming release:
- Fixed: Calling property routines with 0 arguments in z3 actually sent 1 argument, with the value zero. This could cause problems in Infocom's Z-code interpreters.
=======
v5.12: bug fix and new feature release (21 January 2025)
- Fixed a mistake from PunyInform v1.6: TestScope would return true for any object if meta=1, which is neither useful nor consistent with I6lib.
- Fixed: incomplete sentences with multiple preposition lists didn't produce an error message
- Made ext_flags.h 32 bytes shorter (if you use AnyFlagIsSet and AnyFlagIsClear).
- Made sure error message about too many floating objects isn't obscured by statusline in z5.
- Reset matching object count when _ParseNounPhrase starts.
- Changed two objectloops in Look routine, so they use the fast way of iterating over objects in another object.
- Made the parser give lower priority to an object the actor isn't in, when the action is ##Exit.
- Fixed: Using a number as a synonym for an object gave weird responses from the parser.
- talk_menu extension: A relative reference to a topic to be activated can now be negative as well as positive. If it's negative, the number has to preceded by TM_ACTIVATE, and the number has to be in parentheses. E.g. TM_ACTIVATE (-1)
- talk_menu extension: A topic can now inactivate another topic, by specifying TM_INACTIVATE followed by either a positive or negative relative reference (e.g. (-1) means the previous topic), or an absolute ID 300-600.
- Statusline prints spaces to cover parts of long room name which could show between Score and Moves, and to the right of Moves.
- New debug verb for talk_menu: tmtest - Looks for incorrect entries in talk_menu arrays. Type "tmtest" or e.g. "tmtest bob" to use it.
=======
v5.11: bug fix and new feature release (14 December 2024)
- talk_menu: A TM_MAYBE_ADD_LIST line can now specify a flag instead of an array to decide if the sub-array should be included.
- cheap_scenery: If you want to set the default message to be used for interactions with cheap scenery items (CS_DEFAULT_MSG), it can now be set to a routine (Until now, it could only be a string).
- Fixed that parser_all_found wasn't always reset when parsing a new command, which gave confusing error messages.
- Fixed: _InitObjects was called too late in main() in puny.h, resulting in games using PlayerTo() in Initialise not getting any floating objects in location, including the cheap scenery object.
- Fixed: Orders to NPCs should only be single objects
- Fixed: tkers submitted a pull request to improve the consult grammar rule
- Fixed bugs in cheap_scenery routines CSHasNoun, CSHasAdjective and CSHasWord, which were introduced in v4.5, but have never worked properly.
- Documented cheap_scenery routines CSHasNoun, CSHasAdjective and CSHasWord, so users will know that they're there, and how to use them.
=======
v5.10: bug fix and new feature release (24 November 2024)
Important to note when upgrading:
- ext_talk_menu: Procedure TMPrintLine has changed. If you redefine it in your own source, you need to copy the procedure from ext_talk_menu.h and modify it to suit your needs.
- ext_talk_menu: A relative topic reference could previously be a number between 1 and 29. From now on it can be in the range 1-20.
Changes:
- Bugfix: Parser will no longer confuse an out_to property value with a parse_name routine, if the value isn't a valid routine address.
- Bugfix: PlayerTo(obj, 2) used to always print a long description, while it should print a short description if the game was in superbrief mode or the game was in brief mode and the player had already visited the location. Fixed now.
- Added option in ext_talk_menu to conditionally add sub-arrays of topics. Updated howto/talk_menu.inf to use this.
- Bugfix: Arrays which_object and multiple_objects in globals.h were one word too small, leading to buffer overruns when the parser handles multiple objects.
- Bugfix: howto/adjectives.inf had a bug which broke matching for AdjObject objects which didn't have an adj_name property.
- talk_menu now uses pagination of topics even in z3 format.
- Fixed a buffer overrun error when wrong value given to parser_two for _ParseNounPhrase.
- Added a buffer overrun check when copying data into multiple_objects.
=======
v5.9: bug fix and new feature release (17 November 2024)
- New debug verbs FOREST, ROOMS, GOTO <name>/<number>.
- Debug verb TREE can now take a number as argument, e.g. "tree 10"
- Format of output of debug verb TREE has been updated.
- Debug verb GONEAR will now stop the player from going to an object without parent.
- Added runtime error message when buffer is overrun (can only happen in debug mode, when doing "goto <room name>".
=======
v5.8: bug fix and new feature release (9 November 2024)
- Fixed: PrintOrRun() would read a property value before checking if the property holds an array. This would give an error in strict mode, if the property held an array.
- Fixed: An empty, closed, transparent container would get the following text in a list: "(which is closed) (which is open but empty)"
- The open/closed status of a transparent container is now always printed by PrintContents.
- Flags extension: A negative flag ID now performs the opposite modification or check, e.g. SetFlag(F1,-F2) sets F1 and clears F2. FlagIsClear(-F1,F2) returns true if F1 is set and F2 is clear.
- PrintContents will now merge open/closed status and contents, e.g. "(which is open) (which contains a ball)" becomes "(which is open and contains a ball)".
=======
v5.7: bug fix and new feature release (28 Sep 2024)
- Added support for GPR_NOUN, GPR_HELD, GPR_MULTI* and GPR_CREATURE return
values from ParseToken, see test-gprheld.inf
- The parser can now handle a specified number of similar objects in inputs
such as "take two coins", "drop 1 coin"
- Made code for printing the full score shorter.
- Optimization in PrintOrRun routine (Issue #130).
- Improved responses for plurals matching the held parse token.
=======
v5.6: bug fix and new feature release (25 Aug 2024)
- Dropping an item in darkness now forces a scope update, so the item isn't still in scope.
- Removed superfluous code in DropSub.
- Rearranged and cleaned up parts of the manual.
- New library message: MSG_EMPTY_NOT_CONTAINER, e.g. "The ball can't contain things."
- The text "(which is open)" is no longer displayed in tall inventory for permanently open, non-empty containers (e.g. a bucket). (Issue #127)
- The text "(which is empty)" in an inventory listing has been changed to "(which is open but empty)", and is now only displayed for openable containers.
- New globals to say what the action input by the player was: input_action, input_noun, input_second, input_direction.
- Changed so action_to_be is set to NULL (-1) before action is performed.
- New test file for input_action.
- New public routines: DoorDir(door_object) and DoorTo(door_object), returning the effective values of these properties, even for simple doors.
- Changed TryToTakeNoun routine to fire before and after routines for Take action, unless called from TakeSub. (Issue #128)
- Changed TransferSub to add before and after stage for ##Take when applicable, and fire after stage for ##Transfer when action managed to move the noun to second.
=======
v5.5.2: bug fix and optimization release (29 Jul 2024)
- Saved some bytes in parser.h and puny.h.
- Removed unnecessary initialization of task_done array.
- Fixed a bug where UnknownVerb wasn't called for dictionary words
that didn't have the verb flag. Only non-dictionary words were called.
- Rewrote pronoun/pronouns grammar to work the same for both v3 and v5, and to work with new compiler versions.
- runtest.rb now supports an optional compiler path argument
- Saved 18 bytes in messages.h (Issue #122)
- Made cheap scenery extension compatible with the standard library again (this was accidentally lost when making cheap scenery distinguish between singular and plural nouns).
- Stopped AfterLife from running after Quit (Issue #124).
=======
v5.5.1: bug fix and optimization release (13 Jul 2024)
- The following verbs were truncated (all in z3, some also in z5+) when using the VerbName print rule: consult, discard, disrobe, noscript, objects, purchase, squeeze, superbrief, swallow, transcript, transfer, uncover, unscript, verbose, version.
- Saved 96-144 bytes in z3 by printing verbs smarter in VerbName.
- Saved 130 bytes in parser.h
- Made scope calculation slightly faster
=======
v5.5: bug fix and new feature release (8 Jun 2024)
- The z5+ statusline routine (DrawStatusline) has been changed to print a full line of reversed spaces before printing the actual text on the statusline. This means that the statusline flashes briefly every move (only visible on slow platforms), and it means the statusline is slightly slower (~0.10 s vs 0.09 s, on a C64). This change has been made to increase compatibility with older interpreters, as some of them don't support the get_cursor opcode, which is required for the old statusline routine. The most important interpreters that don't support it are MaxZip on classic MacOS and Infocom's Amiga-interpreter.
- There is a new constant OPTIONAL_NON_FLASHING_STATUSLINE. Define it in z5+ games if you want to use the old, non-flashing statusline routine.
- Optimized: automatic setting of reactive attribute is now 20% faster and shorter (total time for a full-size z3 game is typically 1.5 s)
- Optimized: Finding floating objects at game start is faster and shorter
- Optimized the z3 versions of _CopyInputArray and _CopyParseArray routines in parser.
- The Flags extension would define the symbol TM_NOT_PUNY if the extension was used without the PunyInform library. This was the wrong name, and wasn't used for anything, so it's been removed.
=======
v5.4: bug fix and new feature release (10 Apr 2024)
- Fixed: Added DisallowTakeAnimate support for GET ALL.
- Made talk_menu adapt better to narrow screens for z5 by providing alternate,
shorter, customizable messages to end conversation and to show next page of
topics.
- Made talk menu not include message to show next page of topics when built
for z3.
=======
v5.3.1: bug fix release (5 Jan 2024)
- Fixed: add_to_scope didn't work properly.
- Optimized: Don't force a scope update when calling a property routine if the
property value is 0 or NULL.
=======
v5.3: bug fix and new feature release (19 Dec 2023)
- action and action_to_be is now set to NULL when game starts, instead of 0,
which means action ##Take.
- action_to_be is updated when the player types a direction.
- Disambiguation of a complex noun phrase where a parse_name didn't
consume all words failed without a response.
- Improved grammar for 'remove' when removing clothing.
- The variable scope_reason is now supported, and can be checked in InScope.
TALKING_REASON is not supported - PARSING_REASON is used instead.
- InScope is now always consulted when deciding whether to recalculate scope
or reuse the cached scope copy.
=======
v5.2: bug fix and new feature release (26 Nov 2023)
- Quote boxes weren't centered on screen in z5+ games, like they should.
- Parse buffer is emptied when leaving a menu in ext_menu in z3, so ending it
with "q" can never be misunderstood as the player trying to quit the game.
- ext_menu ends with <<Look>>; but this can now be skipped by defining the
constant M_NO_LOOK.
- Saved 34 bytes in cheap scenery extension.
- Added option to assign an ID to a cheap scenery object.
- New procedure in cheap scenery: CSPerformAction(action, ID, second) -
Works like <action noun second>; but for a cheap scenery object.
Give second as -(object) to flip the order, so the cheap scenery object gets
to be second.
- Global cs_parse_name_id in cheap scenery extension has been removed.
Instead, give the object an ID in the cheap scenery list.
- Fixed bug in cheap scenery: If an entry using CS_PARSE_NAME starts with
CS_THEM, the object was still considered an IT-object if it had a parse_name
routine and it didn't set parser_action = ##PluralFound.
- Fixed parser bug: If all matched objects had concealed, and 2+ objects
matched, the parser would ask a disambiguation question.
- New global in cheap scenery: cs_match_id. Can be used to check ID of matched
cheap scenery object in location before-routines etc.
- Enter action has a new message: MSG_ENTER_HELD, which is used when trying to
enter something which is (possibly indirectly) held by the player.
=======
v5.1: bug fix and new feature release (10 Oct 2023)
- Ifdefs instead of stubs for entry point routines, saving up to 178 bytes,
and adding performance.
- Fixed bug in CSTEST action in cheap scenery, which said a reaction string or
routine was expected after a CS_PARSE_NAME + routine, when there was in fact
no problem.
- Optimized routines _CopyInputArray and _CopyParseArray for z5.
- Let action routines return a message# to be printed, and have
PerformPreparedAction print this, saving 344 bytes.
- Moved NotifyOff-, NotifyOn- and Oops-messages to messages.h.
- TenSpaces array is now private (_TenSpaces) and resides in static memory.
- Saved 6 bytes in z3 and 20 bytes in z5 in _ParseToken, while improving
performance.
- Saved 12 bytes in z5 in NumberWord (used by OPTIONAL_ALLOW_WRITTEN_NUMBERS),
while improving performance.
- Fixed parser bug which gave a strange message for "get blue book and all
books but blue."
- Created internal parser routine _ObjInMultipleObjects, reducing logic
duplication and saving 48 bytes in z3 and 64 bytes in z5.
- Made StartDaemon faster and 15 bytes shorter for z5.
- Made StopDaemon faster and a few bytes shorter for z5.
- Saved 15 bytes in _ParsePattern for z5.
- Made resetting of task_done array in main shorter and faster in z5.
- Made FastSpaces routine tolerate negative argument.
- Made quote box extension faster and smaller in z5, by using FastSpaces
routine.
- Created routine _CheckForAndObject in parser, to save 18 bytes.
- Updated abbreviations, saving 108 bytes for a minimal game using the
built-in abbreviations.
=======
v5.0.1: bug fix release (25 Sep 2023)
- Bugfix: Cheap scenery would match adjectives without a noun following them.
- Modified library_of_horror.inf to use the recently added cheap scenery
option to mark some objects or words as "them"-words.
- Optimized library_of_horror.inf to produce a smaller Z-code file.
=======
v5.0: bug fix and new feature release (10 Sep 2023)
Important to note when upgrading:
- If you use talk menu: Split up your talk_array into one array per actor. End
each array with TM_END. Instead of giving each actor a talk_start property,
give them a talk_array property, with the name of their own talk array as
the value.
- If you use talk_menu, remove any calls to InitTalk(), as they are no longer
needed.
- If you use talk menu and have replaced the TMPrintLine routine, copy the
latest version from ext_talk_menu.h and modify it to your liking.
- Cheap scenery entries that use the standard form of adjective + noun will
now match any combination of these words, e.g. noun adjective noun. Re-test
your cheap scenery objects.
- Cheap scenery now matches the object that matches the highest number of
words in player input, rather than the first object that matches any word.
Re-test your cheap scenery objects.
Changes:
- Improved _PatternLength to count preposition alternatives correctly.
- Change in talk menu: Split up talk_array into one array per actor. End each
array with TM_END. Instead of giving each actor a talk_start property, give
them a talk_array property, with their own talk array as the value.
- Change in talk menu: The user definable routine TMPRintLine takes different
arguments than before, the code has changed, and it now prints quote marks
around lines by default.
- Change in talk menu: Routines _TMCallOrPrint, _SetTopic, ActivateTopic,
InActivateTopic, GetTopicStatus, RunTalk and TalkSub have been altered.
- Change in talk menu: Routine InitTalk has been removed.
- Change in talk menu: The debug action TalkSetup has been removed, along with
the grammar to activate it.
- Updated howto/talk_menu.inf to reflect the changes in talk menu.
- Optimized word matching in cheap scenery extension for z5.
- Optimized the cheap scenery extension for code size.
- Changed the standard adjective + noun form for cheap scenery entries to
match any combination of these words.
- Changed cheap scenery so the longest match ( = matching the highest number
of consecutive words in player input) is used, rather than the first match.
In case of a tie, the first match of this length is used.
- Changed cheap scenery so "them" will refer to the cheap scenery object if
a plural word was used, e.g. "x shelves", or if entry begins with CS_THEM,
or if it has a parse_name routine which sets parser_action = ##PluralFound.
- Bugfix: You could refer to the cheap scenery object with "it" even after
moving to a new room, e.g. "x window. e. open it"
- New cheap scenery feature: CS_MAYBE_ADD_LIST [function] [object] [propery]
adds the list if the function returns true.
- New debug verb for cheap scenery: 'cstest'. Checks the integrity of all
cheap_scenery arrays in the game.
- Improved error printing in cheap scenery: The property name is now printed
as well (useful when including extra lists of cheap scenery, not necessarily
stored in the cheap_scenery property).
- Made flags functions FlagIsSet and FlagIsClear slightly shorter.
- New function in flags extension: AnyFlagIsSet(flag1, flag2, flag3) -
returns true if any of two or three flags are set.
- New function in flags extension: AnyFlagIsClear(flag1, flag2, flag3) -
returns true if any of two or three flags are clear.
=======
v4.7: bug fix and new feature release (27 Aug 2023)
- The default message in the cheap scenery extension can now be changed by
setting CS_DEFAULT_MSG to a string before including the extension. This
is mainly to support extensions that need to replace it.
- Moved two more messages from parser.h to messages.h, so they can be
customized: MSG_PARSER_NO_IT and MSG_PARSER_CANT_SEE_IT.
- New file: howto/adjectives.inf, with a class to add adjectives and many
synonyms to objects in all Z-code versions.
- Added an optional call to ChooseObjectsFinal when a noun token matches
a list of indistinguishable objects. If ChooseObjectsFinal reduces this
to a single match, then it is accepted. In effect this means that we
pick and use one random item from a set of indistinguishable objects.
- In addition to the PUNYINFORM_MAJOR_VERSION and PUNYINFORM_MINOR_VERSION
constants, there is now a third version constant for PunyInform:
PUNYINFORM_PATCH_VERSION. It is normally 0, but if we need to make a
patch release between major/minor releases, we set this to a number > 0.
If it's 0, it is not printed in the banner.
- Changed MoveFloatingObjects to use location rather than real_location, i.e.
floating objects can also exist in the thedark location (like in I6lib).
- Added functionality in MoveFloatingObjects to accept a class ID in a
found_in array, i.e. if location belongs to this class, the object is
present (like in I6lib).
- Added functionality in MoveFloatingObjects to accept a regular object in a
found_in array, and if this object's parent is location, the floating object
should also be present (like in I6lib).
- Changed MoveFloatingObjects to only move an object to location if it's not
already there, in order not to disturb the order of the objects more than
necessary (like in I6lib).
- Added functionality in MoveFloatingObjects so a floating object that is held
by the player is no longer considered to be floating (like in I6lib).
- Optimized IndirectlyContains function for speed.
- Improved pattern matching so that shorter patterns are preferred, which
provides better responses when using OPTIONAL_GUESS_MISSING_NOUN (issue 112)
=======
v4.6: bug fix and new feature release (24 May 2023)
- Fixed bug where time_left wasn't set correctly and runtime error check to
see if timer object provides time_left wasn't performed if timer was set
to 0.
- Runtime errors now include the error number + text message when
RUNTIME_ERRORS is set to 2. This should make it easier to refer to the
error, and find it in the documentation.
- In DEBUG mode, the flags extension would print a warning about using flag 0,
but treat it as an error and abort the operation.
- Consolidated runtime error messages in extensions, making builds with
RUNTIME_ERRORS smaller, and the error messages adhere to the same form.
- Changed so check if maximum # of timers/daemons is about to be exceeded is
performed even when RUNTIME_ERRORS is 0, to avoid array overrun.
- Cleaned up support for coloured text.
- _ReadPlayerInput() now supports two arguments: p_no_prompt (not new) stops
the routine from printing a prompt, and p_no_statusline (new) stops the
routine from printing the statusline under z5 (It's safe to call it
with this parameter even under z3 though).
- The YesOrNo() routine no longer causes the statusline to be redrawn.
- New library routine for z5: ClearScreen(window); where window can be
WIN_ALL (default), WIN_MAIN or WIN_STATUS. Also sets colours if clr_on is
set to true.
- New library procedure: ChangeFgColour(colour); Changes the foreground
colour variable clr_fg and, if clr_on is true, instructs the interpreter to
change the foreground colour accordingly. For z3, this routine exists but
does nothing.
=======
v4.5: bug fix and new feature release (22 April 2023)
- An R is added after the library version in the banner if RUNTIME_ERRORS > 0.
- Fixed talk_menu bug: activating a relative topic# would also set the flag
with that number.
- Fixed talk_menu bug where talk menu could behave erratically for games
larger than half the allowed size for the Z-code version.
- talk_menu now allows a topic to have multiple IDs
- talk_menu functions can now match multiple topics. For maximum performance,
authors can turn this off at any time with talk_menu_multi_mode = false;
When reading the current status of a topic, the status of the first
matching topic will be returned.
- Change in functionality: talk_menu will no longer consider it an error if
it tries to activate a topic and it turns out the topic is stale. Not
finding a topic is still an error.
- Made DEBUG REACTIVE command return a lot less false positives (i.e.
locations which provide an exit that's an alias of one of the reactive
properties, like react_before.
- Fixed _FixIncompleteSentenceOrComplain bug when completing sentences that
match patterns that include the topic token
- You can now specify up to 9 adjectives + 9 nouns for a cheap scenery object,
by entering 10*adjectives+nouns and then the words, e.g.
23 'small' 'green 'ant' 'insect' 'animal' "It's so small!".
- SceneryReply gets the first adjective and the first noun for the matched
cheap scenery object as parameters word1 and word2.
- Breaks backward compatibility: A cheap scenery object having the value
CS_NO_ADJ ( =1 ) as its first value, would get word1 = 1 when SceneryReply
was called. It will now get word1 = 0, to make the behaviour coherent with
when the first value is 2-9 (object has multiple nouns but no adjectives).
- New cheap scenery routines, meant to be used in SceneryReply:
CSHasAdjective(x) returns true if x is one the adjectives for the last
matched cheap scenery object. CSHasNoun(x) does the same thing for nouns.
CSHasWord(x) returns true if x is either an adjective or noun for the
object. Programmers can use values 200-600 as markers to trigger certain
behaviours in SceneryReply.
- New talk menu routine: TMPrintLine, prints a line spoken by the player or
an NPC. Author can define their own version before including talk menu.
- talk menu: Author can add a string or routine before and/or after the
player's line, to convey non-verbal events and reactions. Add one of the
following constnants just after the topic: TM_ADD_BEFORE, TM_ADD_AFTER,
TM_ADD_BEFORE_AND_AFTER, then add the strings/routines before and/or after
the player's line.
- talk_menu: A string can now be used as an effect of a topic.
- talk_menu: To mute a line by the player or an NPC, replace it with
TM_NO_LINE.
=======
v4.4: bug fix and new feature release (18 March 2023)
- Replaced some veneer routines with shorter versions (optimized and not
printing error messages) when building a game without DEBUG or Strict mode,
and with RUNTIME_ERRORS set to 0.
- Optimized DrawStatusline, making it 9% faster and a few bytes smaller.
- Minor optimization in parser, making it a little faster and smaller.
- Fixed serious bug in talk menu extension - if you specified a routine to be
run if a certain option was selected, and the story file was larger than
half the maximum story file size for the Z-code version, it would result
in runtime errors.
- Extended howto/talk_menu.inf to demostrate how to customize the messages
printed by the talk_menu extension.
- Made the dashes array in talk_menu static.
- Functions in flags extension can now take up to three flags in a call, e.g.
if(FlagIsSet(F_BOB, F_STEVE, F_LINDA)) returns true if all three flags are
set. To make this work, flag number 0 has been deprecated. Old code using
flag 0 will still work, but will produce a warning in debug mode.
- Fixed a bug in _PrintPatternSyntax to handle patterns with routine calls
- Optimized code to run react_before, react_after and each_turn, making it
100+ bytes smaller.
- New optional feature OPTIONAL_MANUAL_SCOPE_BOOST, speeding up turns for
games with manual scope updates, where the player will often have many
non-reactive objects in scope. More info in the manual.
- Fixed a bug where a wide list would print "which contains is ..." for
a container placed on a supporter.
- Default value of MAX_SCOPE is changed from 32 to 50.
- Game author's guide has been updated and content reordered. *Every* author
should read chapter 1-3.
=======
v4.3: bug fix and new feature release (2 February 2023)
- Non-existent constants MSG_LOCK_YOU_CANT, MSG_UNLOCK_YOU_CANT and
MSG_WEAR_YOU_CANT were mistakenly referred to in messages.h, instead of the
constants that should have been used.
- Added runtime error for when a door fails to define door_to or door_dir.
- Error message when you try to start a timer and the object lacks the
time_out property now prints the offending object.
- Routine RunTimeError was renamed to _RunTimeError, to reflect that it's
not a routine game programmers are likely to call.
- Updated library messages to reflect when the noun has pluralname:
- That's hardly portable => That's/They're hardly portable
- That's not something you can open/close/enter/lock/unlock/wear => You
can't [verb] that/those
- That's fixed in place => That's/They're fixed in place
- That's plainly inedible => That's/They're plainly inedible
- It's already open => It's/They're already open
- It seems to be locked => It's/They're locked
- You can't put things on top of that => You can't put things on top of
that/those
- Fixed a lot of minor issues in the manual.
=======
v4.2: bug fix and new feature release (21 January 2023)
- Added entry point routine ChooseObjectsFinal, letting the programmer
influence the final choice of object.
- Added a demo game howto/indistinguishable.inf to show how a game can
have (a small number of) indistinguishable objects.
- Fixed visibility_ceiling bug which prevented correct calls in PlayerTo
and removed the visiblity_ceiling global.
- Improved parsing of multiexcept so disambiguation doesn't give the same
priority to objects in/on the second noun phrase in the grammar.
- Fixed bad parsing of 'get Xs and Y' patterns, i.e. where the Xs is a word
in plural form, possibly referring to several objects.
- Fixed warnings and confusing text in test programs.
- Changed weight of ChooseObjects score to make it always trump library score.
This is how it works in the standard library too.
- Added an optional suffix to the library version, e.g. "dev" for v4.1dev.
- Added suggestion to Game Author's Guide to initialize the talk_menu
extension manually.
- Internal routine _CheckNoun was renamed to _ParseNounPhrase. The constant
to make it print debug information was renamed to DEBUG_PARSENOUNPHRASE.
=======
v4.1: bug fix and new feature release (19 November 2022)
- Routines _CheckNoun, _CheckPatterns renamed to _ParseNounPhrase,
_PrintGrammarPattern.
- _ParseNounPhrase routine has been made smaller and faster.
- Fixed a bug where patterns containing prepositions that didn't match
at all didn't produce any response from the parser.
- Allow author to define timer_order as a common property if they want, when
using OPTIONAL_ORDERED_TIMERS.
- Fixed a bug where direction variables were incorrectly set for
non-directional nouns when the parser was perfoming an action for a list
of objects, i.e. "TAKE EAST AND BOOK".
- Added OPTIONAL_LANGUAGE_NUMBER to support the routine LanguageNumber(n), to
print e.g. "twenty-five".
- Added OPTIONAL_LIST_TOGETHER to support list_together property (but
indistinguishable objects are still not supported).
- Added howto/list_together.inf
- Improved differentiation between directions and objects that caused a bug
in the Cloak of Darkness game ("x floor" referred both to down and floor)
=======
v4.0: bug fix and new feature release (11 May 2022)
- Fixed 'ask actor to topic' conversion to 'actor, topic' (issue 107)
- Library now runs _NoteObjectAcquisitions whenever child(player) has changed,
so forgetting to set update_moved typically doesn't cause problems.
- Stopped 'again' from triggering an endless loop after an empty input line
- Fixed 'ask George to look' and similar to generate the <verb> order callback
- Bugfix: Setting second to the first word in topic for ##Tell
- Parser won't try to auto-take object for a held token, if the object has
static, scenery or animate, except animate objects which have been made
takeable through the use of a DisallowTakeAnimate routine. This allows before
routines to react to "eat whale", "attack troll with steamroller" etc.
- Cheap scenery description routines are now reaction routines, which work like
before routines, allowing them to trap all actions on the object.
- Support for global no_implicit_actions, to let game tell library not to use
implicit actions.
- _ImplicitGrabIfNotHeld routine has been renamed to ImplicitGrabIfNotHeld
and has been documented in the manual and quickref document.
- _ImplicitDisrobeIfWorn routine has been renamed to ImplicitDisrobeIfWorn
and has been documented in the manual and quickref document.
- 'look north' etc. now works
=======
v3.6: bug fix and new feature release (12 April 2022)
- ext_talk_menu has a new global variable talk_menu_talking. A routine in
talk_array can set it to false to end the conversation prematurely.
- Added strict mode indicator for v5 (issue 104)
- Improved 'take off' for objects not being worn (issue 103)
- Added a way for SceneryReply routine (used with cheap scenery extension)
to tell different inline parse_name routines apart.
- Added howto/cheapscenerydemo.inf to show how to use Cheap Scenery.
- Added 'enter' and 'exit' for in_dir, out_dir in rooms (issue 105)
- Minor optimisations for speed and size in handling of ordered timers.
- Fixed GuessMissingNoun bug for phrases with missing noun without second.
- Added feel, fondle and grope as synonyms to touch.
- Fixed pattern scoring bug when some patterns contained the scope token.
- Added messages for empty inputs (issue 106)
- Minor optimizations for speed and size in parser.
=======
v3.5: bug fix and new feature release (14 February 2022)
- Don't print the option to UNDO if the player has won the game, only if they
lost.
- If the game defines DEATH_MENTION_UNDO, print the option to undo even if the
player won.
- Don't print the option to UNDO if the interpreter says it doesn't support it.
- Slight optimization of Directions.parse_name for z5.
- Fix routine _ListObjsMsg in grammar.h, which was called with one argument
but didn't have any local variables, as this caused a warning in Infocom's
terps for Motorola 68K platforms.
- Fixed grammar property bug, where -verb responses has a bad parser offset
- The grammar property is now checking the parser_one variable to make sure
that -verb replies are parsed correctly regardless of memory allocation.
- New extension: ext_talk_menu.h, for menu-driven conversations.
- New example game: howto/talk_menu.inf
- PunyInform now expects the Inform compiler to be version 6.36.
=======
v3.4: bug fix and new feature release (2 January 2022)
- _IsSentenceDivider was using dictionary words directly for 'then' and 'and'
although there are constants to be used. Fixed.
- Slight optimization in Direction.parse_name
- ext_menu.h got a new constant EXT_MENU_STDLIB_MODE - if defined, item_width
should be set to half the name length of the item, just the way DoMenu works
in the standard library (issue 96)
- Fixed bad messsage for enter action with missing preposition (issue 95)
- Fixed missing "(which is empty)" for container holding only scenery or
concealed objects (issue 99).
- Added grammar for "look on table" (issue 97).
- Improved "search (supporter)" message to use is/are more correctly.
- Improved PrintContents to use is/are more correctly for supporters.
- Changed workflag-parameter for PrintContents to be called p_style. It can be
omitted or 0, or you can add one or more bit values. The ones currently
supported are ISARE_BIT (print "is" or "are" before list), WORKFLAG_BIT
(only print objects which have workflag set), and NEWLINE_BIT (print each
object indented, on a new line). Existing calls to PrintContents don't have
to be changed.
- Added new mode for calling PrintContents: p = PrintContents(1, obj). Returns:
0 if there are no printable objects in/on p_obj
1 if there's exactly one printable object and it doesn't have pluralname
2 if there are 2+ printable objects or one object with pluralname
- New routine _IsAreString(p) to return string "is " or "are ". Used by
_PrintContents. Note: Not a public routine.
- Added comments to all messages in messages.h which receive one or two
arguments.
- More precise error messages failing with a missing preposition.
- Game code can change the inventory format by setting inventory_format to
0 (tall) or 1 (wide).
- New constant OPTIONAL_FLEXIBLE_INVENTORY enables "i tall/wide" to switch
inventory format.
- New public routine FastSpaces(n) to print n space characters efficiently.
- ext_cheap_scenery has a new option: Give CS_PARSE_NAME (=2) as the adjective
value and a routine that works like a parse_name routine as the noun value
to allow for long names and names with certain rules. However, two items in
the cheap_scenery list can never compete - the first one that matches at
least one word wins.
- ext_cheap_scenery has a new option: Give CS_ADD_LIST (=3) as the adjective
value and an object as the noun value and a property name as the description
value, to include a list of cheap scenery objects in the current list.
- New optimization tip added to Game Author's Guide.
=======
v3.3: bug fix and new feature release (18 December 2021)
- Added a 'score' verb for games with no score, which just prints a message
saying there is no score in this game.
- Exclude code to call LibraryMessages unless it's defined.
- Stopped the parser from trying to pick up object for Held grammar token
when actor isn't player.
- Added an example of how to add random comments to a game
(howto/comments.inf).
- Fix so noun is the first recognized word in topic, and second is the actor,
when action == ##NotUnderstood
- Fix so that NPC's can't use wildcards, such as "take all"
- Fixed bug which made parser not recognize NPC name if player first did
"go (direction)" or asked an NPC to do it, e.g. "John, go east"
"John, take the sweater".
- Set lower priority in parser for objects that aren't held when issuing an
action that expects a held object.
- Set lower priority in parser for held objects when issuing a Take command,
even for NPCs.
- Implemented ChooseObjects
- Improved parsing of complex disambiguation messages such as
'get blue book and books' and 'get blue book and all books except blue'
- Fixed bad call to each_turn when aborting a disambiguation question
=======
v3.2: bug fix release (11 November 2021)
- Updated techreport.
- Added markdown version of QuickRef document.
- Don't print "(providing light)" for animated objects with light attribute.
- Added missing ##Going after rule call when moving between rooms.
- Fixed bad NPC order handling (##NotUnderstood and ##Answer callbacks).
- Fixed scope token handling of pattern with more than one object.
Now the scope modification is only valid during the parsing of the
scope token, and then reset to normal scoping rules.
- _UpdateScope changed so it remembers if the last calculated scope was
for a scope routine.
- ext_menu.h and ext_quote_box.h now force a resplit for the statusline
upon exit.
- Fixed bad is/are for MSG_SEARCH_CANT_SEE_CLOSED (issue 92)
- Fixed ThatorThose response for the player object (issue 91)
- Fixed bug in howto/change_player.inf that was introduced in v3.0 and
made nothing work as it should with the PC swapping.
- Made non-transparent actors have their possessions in scope.
- Fixed setup of noun/second for NPC orders.
- Added error message when addressing a misspelled or missing NPC.
- Added an error message when player is giving a too vague specification
of an object in an order to an NPC.
- Optimized parser to gain some speed and make it a little smaller.
- Made Banner() smaller by checking if Story and Headline are defined.
- Optimized lookmode messages, to make minimal library smaller AND
allow for more generic abbreviations which will benefit games better.
- Updated the abbreviations.
- Updated quickref document.
- Fixed parser bug which would sometimes make it print "I think you wanted to
(verb) *someone*" when it should have been *something*.
=======
v3.1: bug fix and new feature release (23 October 2021)
- Fixed two incorrect direction names in howto/custom_directions.inf.
- Changed so library doesn't check if header says it's a timed game
before updating time, if STATUSLINE_TIME has been defined.
- Fixed noun/second setup for Consult, Answer and Ask action.
- Added UNDO to end of game message.
- Fixed so we don't risk duplicates in scope when InScope is used.
- OPTIONAL_GUESS_MISSING_NOUN function would sometimes reveal a concealed
object.
- removed ObjectIsInvisible which is no longer needed. Use TestScope instead.
- Remove duplicates from match list when player specifies same object twice
for a multi token.
- When parse_name returned -1 wn was not reset.
- Optimized _CheckNoun to save 70 bytes.
- Optimized code order to let virtual memory systems shift out parts of the
library for long times, for speed.
- Added support for ParseNoun, at the cost of ~20 bytes if you use it, and no
cost if you don't. Called *before* parse_name, unlike I6lib.
- Fixed error reporting from ParseToken with TT_SCOPE parameter.
- Fixed that actions sometimes didn't print a message in large games.
- Fixed compile-time error if SACK_OBJECT and OPTIONAL_NO_DARKNESS were defined.
- Implemented the grammar property as described in DM4.
- Fixed a bad noun flag test in _CheckNoun.
- Fixed bad num_words value after disambiguation question.
- Fixed a side effect from the num_words fix above (issue 90)
- Fixed error reporting from general parse routines.
- Fixed bug in scope routines that match multiple nouns.
- Fixed that a direction instead of a disambiguation reply didn't work.
- Fixed so that parser_action can be set to PluralFound in parse_name.
- Optimized disambiguation code to save ~70 bytes.
=======
v3.0: bug fix and new feature release (20 September 2021)
- Part of the message MSG_RESTART_RESTORE_OR_QUIT was compiled even if
the message had been replaced by the game, wasting space and printing a
warning.
- Fixed some action routines which didn't set scope_modified when they
should.
- Fixed bug which made for incorrect display when player didn't carry
anything, if MSG_INVENTORY_DEFAULT had been replaced.
- ##Wait now runs after-routines.
- ##Inv now runs after-routines, even if the player is empty-handed.
- Optimized running of after-routines in action routines, saving ~140
bytes.
- Changed so "routines on" doesn't print double messages under z5+.
- Added code so parse_name calls are also printed after "routines on",
under all Z-code versions.
- Added constant CUSTOM_PLAYER_OBJECT - set it to your own player object,
and the library won't create the default selfobj.
- Optimized parsing of directions, saving 84 bytes in minimal config.
- Removed deprecated arrays abbr_direction_array and
full_direction_array.
- Added file howto/custom_directions.inf to show how one can create a
custom set of directions, complementing or replacing the standard
directions.
- Fixed pattern offset bug in error handling of incomplete noun lists,
leading to better error message for input like "take ball and"
- Added documentation on statusline to manual.
- Actions defined by ext_waittime.h now run AfterRoutines() as well.
- Changed direction_properties_array to be a byte array instead of a
table. This means it must be accessed with "->" instead of "-->", and
the first entry does not hold the number of elements.
- Changed direction_name_array to be a word arrary instead of a table.
This means the first entry does not hold the number of elements.
- Slight updates to game author's guide, hopefully making it clearer.
- Fixed parser problems when player refers to multiple directions in one
command, like "take e and w" or "push e w", since direction object
can't remember different matches.
- Fixed so Directions object remembers the correct direction even when
the parsed sentence contains an object that begins with a direction,
like "look to the east of the north statue" (in a game where the look
verb has been extended to allow this).
- Changed compiler requirements to Inform 6.35
=======
v2.8.3: bug fix release (26 August 2021)
- Fixed compilation error when building with OPTIONAL_NO_DARKNESS.
=======
v2.8.2: mistake, identical to v2.8.1 (26 August 2021).
=======
v2.8.1: bug fix release (26 August 2021)
- The library version is now printed correctly at start of game and when player
enters VERSION. Documentation updated.
=======
v2.8: bug fix and new feature release (26 August 2021)
- Slight updates to Game Author's Guide
- Fixed a bug in _UserFilter which caused problems when using a filter function
for second.
- Added howto/pushdir.inf to show how to program items that can be pushed to
other locations.
- Removed the common property "number".
- Changed all message identifiers ending with "_SUCCESS" to end with
"_DEFAULT" - MSG_ANSWER_SUCCESS, MSG_ASK_SUCCESS, MSG_ASKFOR_SUCCESS,
MSG_ASKTO_SUCCESS, MSG_ATTACK_SUCCESS, MSG_CLOSE_SUCCESS,
MSG_DISROBE_SUCCESS, MSG_EAT_SUCCESS, MSG_ENTER_SUCCESS, MSG_EXIT_SUCCESS,
MSG_GIVE_SUCCESS, MSG_INSERT_SUCCESS, MSG_INVENTORY_SUCCESS,
MSG_KISS_SUCCESS, MSG_LISTEN_SUCCESS, MSG_LOCK_SUCCESS, MSG_OPEN_SUCCESS,
MSG_PULL_SUCCESS, MSG_PUSH_SUCCESS, MSG_PUTON_SUCCESS, MSG_REMOVE_SUCCESS,
MSG_SAVE_SUCCESS, MSG_SCORE_SUCCESS, MSG_SHOUT_SUCCESS, MSG_SHOUTAT_SUCCESS,
MSG_SHOW_SUCCESS, MSG_SMELL_SUCCESS, MSG_SWITCH_OFF_SUCCESS,
MSG_SWITCH_ON_SUCCESS, MSG_TAKE_SUCCESS, MSG_TELL_SUCCESS,
MSG_THROW_SUCCESS, MSG_TOUCH_SUCCESS, MSG_TURN_SUCCESS, MSG_UNLOCK_SUCCESS,
MSG_WAIT_SUCCESS, MSG_WAKE_SUCCESS, MSG_WAKEOTHER_SUCCESS, MSG_WEAR_SUCCESS
- Changed so complex library messages shared by multiple identifiers are now
omitted if all identifiers have been replaced by custom messages.
- Changed InsertSub and PutOnSub to call a common routine, to save bytes.
- Fixed bug: TryToTakeNoun would return true, signalling that take failed,
if original supporter/container's after routine returned true for ##LetGo.
- Added support for "move object to floor" (gets translated to
"get object. drop it")
- MSG_REMOVED_CLOSED has changed from "The (object) is closed." to
"You can't, since the (object) is closed."
- MSG_ENTER_NOT_OPEN, MSG_EXIT_NOT_OPEN, MSG_INSERT_NOT_OPEN,
MSG_GO_DOOR_CLOSED, MSG_EMPTY_IS_CLOSED, MSG_REMOVE_CLOSED now print
"are closed" for pluralname objects.
- TransferSub no longer tries to drop something if it couldn't be picked up.
- TransferSub now runs AfterRoutines().
- New messages: MSG_INSERT_ANIMATE, MSG_PUTON_ANIMATE, MSG_TRANSFER_ALREADY.
- Removed message MSG_EMPTY_CANT_CONTAIN.
=======
v2.7: bug fix and new feature release (19 July 2021)
- Removed the text "revealing..." when opening a container from the inside.
- Added grammar for "shout (topic) at (creature)", triggering the Answer action
('to' was recognized before, 'at' is a new synonym)
- Added a new action ShoutAt, triggered by "shout to/at (noun)"
- Added grammar for "jump in (noun)", triggering the Enter action. ('into' was
recognized before, 'in' is a new synonym)
- New constants OPTIONAL_SL_NO_SCORE and OPTIONAL_SL_NO_MOVES to hide score and
moves from the statusline in z5+ games. Defining NO_SCORE will define
OPTIONAL_SL_NO_SCORE automatically.
- Added routines NumberWords and WordValue (described in DM4)
- Moved PronounNotice routine to a better place in parser.h, considering
virtual memory handling in Ozmoo and other 8-bit terps.
=======
v2.6: bug fix and new feature release (8 June 2021)
- Fixed a pronoun update bug when trying to talk to inamimate objects.
- Added rule to not include held objects when disambiguate for the take action
- Added 'sniff' as a synonym to 'smell'
- Made statusline drawing faster in ext_menu.h (only affects z5+).
- Made RunRoutines() faster for all common properties.
- Try to set scope_modified in the correct places in the library files.
- Changed so 'shout' is not a synonym of 'say' but has its own grammar and has
'scream' and 'yell' as synonyms. "shout hello to John" still triggers the
##Answer action. "shout hello" or just "shout" triggers the new ##Shout
action.
- Made the noun guessing code faster and shorter.
- Made 'place' a synonym of 'put'.
- Now printing all prepositions when complaining that the input is incomplete
- Parsing "go" (without a direction or object) correctly.
- Fixed so that noun filters are applied when parsing pronouns.
- Improved message for incomplete sentences ('take ladder and')
- Improved messages for putting things in/on itself.
- Fixed broken 'again me' response (issue 81)
- Fixed shortname for Directions ('put sweater in s')
- Changed PushDir to use the ADirection filter for the direction argument
- Fixed that consult_words sometimes held a value when it shouldn't.
=======
v2.5: bug fix and new feature release (14 May 2021)
- Changed the library messages for searching a container or supporter
(MSG_SEARCH_IN_IT_ISARE, MSG_SEARCH_ON_IT_ISARE)
- The (undocumented) routine SearchInOnNoun() was removed.
- Fixed warning in ext_cheap_scenery when SceneryReply is not defined.
- Changed so "actions" debug verb doesn't print object name when noun or second
is a number.
- Changed 'moved' and scoring to work like I6, added _NoteObjectAcquisitions
Note: Game author must set update_moved to true when moving objects into
player's inventory!
- Fixed: MoveFloatingObjects didn't set scope_modified.
- Fixed bug: QuoteBox cleared the screen in z5, even when the second parameter
was set as to not wait for keypress, making the quote box disappear
immediately.
- Fixed a bug that made it impossible to customize
MSG_PARSER_BAD_PATTERN_PREFIX and MSG_PARSER_BAD_PATTERN_SUFFIX.
- Messages MSG_PARSER_BAD_PATTERN_PREFIX and MSG_PARSER_BAD_PATTERN_SUFFIX
were changed to be complex messages instead of static strings.
- Fixed bug in ext_quote_box.h which made quote box stay on screen forever.
- Changed newlines before and after quote box.
- PunyInform Technical report added (documentation/techreport.pdf)
- Fixed a bug in scoring objects with the scored attribute. (Bug was introduced
in v2.5)
- Changed MSG_TAKE_ALREADY_HAVE from a static string to a complex message,
merging it with another message.
- Fixed a bug where patterns with 'topic' got too much impact (issue 77)
- Game Author's Guide has been updated with more material on optimization,
thanks to Hugo Labrande.
=======
v2.4: bug fix and new feature release (20 April 2021)
- Fixed bug in ext_quote_box (which crashed some interpreters in z3 just after
quote box was printed.)
- Fixed bad parsning of topic followed by multiple preposition alternatives.
- Merged a library message into another, to save some bytes.
- Removed before and after for thedark.
- Changed so before and after are run for real_location rather than
location.
- Reworked howto/semidark.inf to work without using thedark.before().
- Added climb and climb up/over to grammar, new action Climb.
- Improved parser response when refering to objects outside scope (issue 75)
- Fixed so cant_go property can hold a routine or string, not just a string.
- Reordered properties to put those that have to be fast at the end.
- Improved detection of pluralword flag when parsing a noun phrase
- Improved selection of incomplete patterns ("show XXX" with missing obj)
- Fixed consult_from bug (would only work the first time)
- Switched to fixed-width font for quote box in z3.
- Added a second parameter for QuoteBox() to not wait for keypress after quote
box.
- Fixed bug in detection of multiple words from the room's name property
=======
v2.3: bug fix and new feature release (8 April 2021)
- Made use of reactive attribute for add_to_scope as well, and (optionally)
for parse_name.
- Better parser response when a dictionary word failed to parse a noun
- Made _UpdateScope code shorter
- Fixed scope bug: add_to_scope was not run for the objects in an add_to_scope
list.
- Added objects in the dark to scope.
- Added AddToScope as a synonym for PlaceInScope.
- The death/win message is now printed in bold in z5.
- Removed full stop after You have won/died messages.
=======
v2.2: bug fix release (27 March 2021)
- Changed so BeforeRoutines() is not executed for meta verbs (issue 74)
- Fixed 'take all except X' offset error
- Fixed take multiple bug (would silently ignore held objects)
- Changed when scope_modified is set, for PutOn, Insert, Take, Drop and Purloin
- Made ExamineSub return correctly after printing "There's nothing special
about (the item)."
- The banner now has an empty line first, just as in I6 lib.
- OPTIONAL_PRINT_SCENERY_CONTENTS will no longer cause Look to print contents of
objects which have concealed attribute, unless they *also* have scenery.
- The global "turns" now holds -1 until the first turn begins, at which time
it's set to 0.
- NO_SCORE constant is now supported and saves 310+ bytes if defined.
- Optimized matching of directions.
- Removed superfluous global scope_copy_is_good
- Better parser response when grammar missing (e.g. Extend 'close' replace;)
- Better parser responses when trying to parse unknown words
- Better parser responses to bad input such as 'i blue' and 'open all'
- Better parser response when list of nouns found where it isn't allowed
=======
v2.1: bug fix and new feature release (5 March 2021)
- New entry point routine: DisallowTakeAnimate. Have it return false if the
player should be able to pick up noun.
- Implicit actions only occur when the actor==player, to stop for example
"bob, give me knife" from doing unexpected things with the knife.
- Made GetScopeCopy faster.
- Removed unnecessary check for duplicates in ScopeWithin.
- Made UpdateScope avoid adding duplicates when called after a scope routine
which has already added objects.
- Optimized checking of react_before and react_after.
- Added attribute reactive which must be set for all objects providing
react_before, react_after or each_turn. By default it is set automatically at
game start, but an author can define OPTIONAL_MANUAL_REACTIVE to set it
manually. The use of this attribute speeds up the game.
- Added debug verb "debug reactive" which shows objects which need to get or
lose attribute reactive.
- Fixed bug in handling fake directions, which made code like <GO FAKE_N_OBJ>
break every time.
- Optimized loops in BeforeRoutine, AfterRoutines and RunEachTurn.
- Optimized so scope_copy can often be reused several times.
- Moved oops, again and score notifications messages to messages.inf
- Fixed "x me.g.g" bug (disallowing complex again commands)
- Fixed pattern filter bug that stopped some commands from reaching phase 2.
- Fixed bug that didn't restore scope after using a scope=XXX grammar token.
=======
v2.0: bug fix and new feature release (17 February 2021)
- Added OPTIONAL_SIMPLE_DOORS for an easier way to create doors, which also
saves space if you have more than six doors.
- Referring to undefined pronouns now give better responses (issue 68)
- Fixed something/someone response when second missing (issue 70)
- Changed to allow multiexpect to respond without filtering (issue 71)
- Changed to show concealed/scenery items in inventory lists (issue 72)
- Added new Game User's Guide
- Fixed creature testing bug (issue 73)
- Changed so the capacity property is an alias of nw_to, to save a common
property. This leads to capacity not having a proper default value. To read
the capacity property, call ObjectCapacity(object). The default value is the
value of the constant DEFAULT_CAPACITY, which is 100 unless the game code
defines it.
- Added optional undo support
- Added OPTIONAL_SCORED to support the 'scored' attribute for places and
objects. NOTE: Games that use scored will now need to define this!
- Added a line to summary in FullScoreSub, for "noteworthy actions". This sums
up score added in code, like "score = score + 10;".
- Moved messages from FullScoreSub to messages.h
=======
v1.9: bug fix and new feature release (17 January 2021)
- Fixed bad quit message (issue 56)
- Print a newline before calling Initialise for v5 games, so first line of
text isn't covered by statusline.
- Added code to howto/change_player.inf so all would-be PCs accept gifts from
the player.
- Made scope update at turn start rely on scope_modified_flag.
- Fixed bug where "get off (supporter)" would not let the supporter's after
routine react to the Exit action.
- Changed MSG_OPEN_SUCCESS to also reveal the contents of the container being
opened, if the container is non-transparent.
- Added constant OPTIONAL_NO_DARKNESS which removes handling of light and dark.
- Fixed bug with scope not being updated when the player is in a dark
container and opens it.
- Fixed bug in BeforeParsing call
- Fixed inconsistent message format (issue 58)
- Added auto-disrobe action for actions Drop, ThrowAt, Insert and PutOn.
- Put auto-take message in messages.h as MSG_AUTO_TAKE.
- DROP ALL and PUT ALL IN BOX will no longer include worn objects.
- Stopped 'held' and 'creature' no match all and all-but sentences.
- Changed PrintMsg to be a global variable, to save 150+ bytes. Doesn't affect
anything from a game programmer's point of view.
- Fixed issue 60 (parsing error with multiple sentences containing directions)
- Removed empty lines before room descriptions to fit more on small screens
- Fixed bug in matching of 'creature' token.
- Added OPTIONAL_ORDERED_TIMERS, allowing programmer to decide order of
different timers/daemons.
- Changed multiexcept token to generate before/after calls for all objects
- "put me in box" is changed to "enter box" (a before routine can capture any of
the actions). Same with "put me on chair".
- Added 'them' as a pronoun for pluralname objects
- Rewrote CheckNoun to improve Disambiguation (issue 63)
- New feature: To make sure debug verbs like purloin can match an object which
has a parse_name routine and may not have a parent, define a routine
DebugParseNameObject(object) which returns true if the object is such an
object. (See manual, under Debugging)