Inform - Support - Suggestions

About Suggestions  

Under consideration  
Accepted for next release  
Complete list  

Suggestions under consideration

These suggestions will be considered for inclusion in future releases of Inform.

Anybody is welcome to submit a suggestion; please keep it succinct and in the style of the proposals already published here.

180.  Better handling in Locale of objects found on a scenic supporter, for example using their 'initial' properties.
179.  Extend -l compiler switch to list current switch settings.
178.  Overload the "concealed" attribute to also hide an object from the player's inventory display. The usage is reasonably intuitive as per "concealed from view but present".
177.  There are a few places in the library where a bunch of globals have to be saved and restored. Usually, local vars are used, but in a few cases the globals have to be pushed and popped from the stack, which means #if statements to check for Z-code or Glulx. How about a special block statement: preserve (var1,var2,var3,...) {...} which pushes the listed variables onto the stack, executes the block, and pops them back off. This reduces semantic clutter in those places where local vars are currently used, and avoids assembly where you can't use them, and incidentally guarantees that you don't mismatch the push and pop statements..
176.  Enable a routine's arguments to be addressed as an array. Thus, the current [ myRoutine x y z; ... could also be specified as [ myRoutine a-->2;..., where a-->0, a-->1 and a-->2 are equivalent to x, y and z respectively.
174.  Define an 'infer_second' property to provide a standard hook whereby [UN]LOCK NOUN could automatically infer the correct key, if available. Potentially, this mechanism could also apply to HIT|LIGHT|DIG|OPEN| NOUN.
173.  Allow for "lock noun" and "unlock noun" without providing a key. If the object is lockable and its with_key value is 'nothing', allow the action with "You unlock <the noun>." This is, of course, unless a before or react_before has intercepted the action.
172.  Object print routines, such as "initial", should return TRUE/FALSE to indicate whether anything was printed, and the library should then suppress the carriage return it puts out if the return was FALSE. I can see this is slightly tricky because the library puts out its new-line first, regardless of what the object does.
171.  Better behavior on switches with duplicated cases. The code

switch (n) {
  1, 4: print "square ";
  2, 4: print "even ";
  default: print "neither ";

will currently just show "square" when n is 4; it should either show both "square" and "even" (probably too much to get this effect if default is allowed), or refuse to compile with a 'duplicated case' error.
170.  If you write an assignment as the expression in an if-statement, the Inform compiler gives a useful warning: "'=' used as condition: '==' intended?". I think it would be good to have a similar warning for '~' and '~~'. For example, if I write a condition '~self.opened' rather than '~~self.opened', it compiles without warnings but the condition succeeds when self.opened is any value except -1 (NULL). I doubt most people use the bitwise operators, and anyone who did insist on using one as a condition and didn't like the warning could either make the test explicit ( ~= 0 ) or stick an extra pair of brackets around it.
169.  Devise an object-oriented ChooseObjects( ) supplement. For example:object.choose_n( ) to choose the noun, object.choose_s( ) to choose the second, and object.choose_m( ) to handle being included in multi lists. They'd act like "before" and "after", switching with action_to_be to evaluate the object and returning a value as per the existing ChooseObjects. They'll need to be additive properties, of course, so that a chocolate door would inherit the choose_* rules from your TwoWayLockedDoor class and from your FoodAsScenery class.
168.  Ensure that ChooseObjects( ) can determine whether it's been called in the context of 'noun' or 'second'.
167.  In parserm.h, after the call to AfterGameOver( ), add a line if (deadflag == 0) jump very__late__error;.
166.  The grammar lines for ##Disrobe are defined with the [held] token and once, in the case of 'take off' with [worn]. Wouldn't it be better to change the tokens to [noun] and enforce the held condition in the second line of DisrobeSub, together with the worn check? That wouldn't try to pick up an item only to remark that it can't be taken off right now.
165.  It ought to be possible for an interpreter to start up, load the game file, and then immediately load a saved game (without executing any of the game code until the restore is successful.) This is a standard gimmick in GUI interfaces -- Zoom and MaxZip can do it for Z-code. Glulx can *nearly* handle this, if you hack an interpreter to do a restore before the execution loop, but two things go wrong. First, the way the library is written, the @setiosys opcode (which initializes Glk output) is not in GGRecoverObjects( ). Second, the library's GGRecoverObjects( ) assumes that the basic two windows already exist. This is a valid assumption after the player types RESTORE or UNDO, but not after an auto-restore at terp startup.
164.  If you know C++ or Java, then it's easy to understand: there are not (as far as I know) static methods in Inform. If you create a method inside a class, then you won't be able to execute it until you have an object of that class. This makes it difficult to create certain patterns in Inform, such as the object factory.

Static methods are normal functions; the only difference is that they are inside a namespace (the name of the class). They don't have access to the attributes of the object, because they are not related to its state. I'm afraid this involves modifying the compiler (static methods are not copied to new objects), and probably add a modifier to methods:

Class C(200)
    with static createNewC[; return C.create( ); ];

[ Initialise;
    C::createNewC( );  ! C++ style (probably not very homogeneous)
    C.createNewC( );   ! Java Style
163.  Be able to deal with classes as with objects. As far as I understand how Inform works, this shouldn't be difficult. I think that in Inform, classes are plain objects. It would be nice to be able to do something like:

Class Characters
  with static prepare [;
       ! To be overwritten by derived classes
       ... ;

Class Warriors
  class Characters
  with prepare [; ... ],
       ... ;

Class Dwarfs
  class Characters
  with prepare [; ... ],
       ... ;

[ Initialise cl;
    classloop (cl ofclass Characters) {
        cl.prepare( ); ! cl::prepare( ) ?
162.  Add a "#Ifndef NO_TURNS" check to the relevant part of the DrawStatusLine routine, enabling the display of turns to be turned off by adding NO_TURNS to your code, just as the display of the score can be turned off by adding NO_SCORE.
161.  Why isn't there a COMMANDS or SHOWCOMMANDS command?
160.  Make IN an alias for ENTER when a noun is given.
159.  Let games use mood MIDIs.
158.  Give all objects and rooms aliases which can be named and renamed by an appropriate command. Go to then moves the character to where the object was, or to the named room, either using the last open path or the shortest calculated path.
157.  I don't like the corrupted language of the "You haven't got that." message. Can you straighten it?
156.  Commands to turn Strict mode on and off for certain bits of code.
155.  It would be very clever if the compiler detected the expression "(A .# B) / K", for constant K, and threw a warning if K was not 2 (in Zcode) or 4 (in Glulx).
154.  Give a compiler warning for 'surprising' expressions of the form ~~x && y -- where '~~' can also be '~' and '&&' can also be '&', '||' or '|' -- but not when parentheses are used to clarify the association: (~~x) && y or ~~(x && y).
153.  Create different extentions for Z-machine and Glulx blorb files.
152.  Emulate DOS "F3" key funtion, i.e. print last command typed as new text. This is useful for editing a long miskeyed command, like "Get torch, turn it on, then put it on tablr". In any DOS v3-5 game, this works. Maybe "again", in singular use, could do this, and to bypass it you would simply hit "g(return,return)" Or even a command like "typo", or "oops".
148.  Add bibliographic data as blorb chunks or ID3-like tags.
147.  It might be useful for preprocessors if there were a way to indicate that errors should be reported at a given file and line number.
144.  Provide a macro facility for Inform.
143.  Support "compile-time" print formatting.
142.  Provide a way to access the 16-bit opcodes in Glulx.
141.  Allow arbitrary flags to be set on dictionary words, so along with 'cats//p', one might say 'furniture//m' to mark mass nouns .
140.  After having failed to open an Included filename as is, try the filename converted to lower-case.
135.  Support block comments in Inform.
129.  Control of word separators, e.g. if you don't want to use '.' as a separator, or do want to use '?' as one.
125.  In the Compiler, provide the ability to define arbitrary constants (not just DEBUG) in ICL.
113.  Make UNDO repeatable: UNDO.G.G.G should undo the last four actions.
110.  Enhance #Include by: accepting a comma-separated list of files.
105.  Support unless (condition)... to complement if (condition)....
98.  To make the syntax of the has operator consistent with the syntax of the give command, allow it to take more than one attribute like this: if (item has animate ~flying male creature) whereas now you'd have to use the following instead: if (item has animate && item hasnt flying && item has male && item has creature).
97.  The ability to define grammar tables arranged by action rather than verb (word).
84.  Consolidated messages when handling multiple objects, so take TAKE ALL APPLES replies "4 apples: Taken" rather than "Apple: Taken" four times.
83.  Compiler to read Unicode source files.
79.  A NO_DARKNESS constant to shine light everywhere.
77.  The compiler could eliminate unreferenced routines.
75.  Re-enable support for v3 games.
73.  Removing one level of indentation in the veneer strings would save about 10K on the compiler size. (BTW if there's a compilation error in the veneer, which of course should never happen, the quoted line is missing its first character.)
71.  Unicode support for Glulx targets.
64.  It would be nice if Class Foo(0) was treated as Class Foo, thus allowing classes to be dynamic or not based on a constant (for example).
62.  Create a WriteListFromWithSeparators( ) which has parameters for the separators (one for between words and one for the final word). The standard WriteListFrom(obj,style) would just be rewritten to call WriteListFromWithSeparators(obj,style,",",AND__TX), but a 'choices' list -- A, B, C or D -- would also be possible.
51.  Support Z-Spec 1.1 opcodes.
49.  The library has support for only three different genders. Swedish, and possibly other languages as well, has four genders, which necessitates changing some arrays and the routines which access them, making it less likely that Swedish.h can be used with a newer version of the library. There's no obvious reason for providing support for only three genders -- four is just as easy. Going beyond four is slightly trickier, since it means the possible GNA values can't be held in a 16-bit integer anymore.
48.  Make it possible to temporarily disable parser inference messages in circumstances where they add no value.
47.  A route back into the Parser when an action routine realizes that it needs more information and wants to issue the disambiguation message "What do you want to XXXXX that with?".
40.  If dictionary words, AND ONLY dictionary words, could be enclosed in backquotes (ASCII 96; 'a'-1), then that would get rid of that darn ugly 'a//' notation.
36.  Maybe also include some contributed libraries as optional within the package, such as WaterElement and pname.
34.  "Int" and "Ext" room classes, the former with walls and a ceiling (or some alternative simple way of reinstating walls where needed).
32.  A constant, which, when defined, will cause referring to names of the current location to print the location description, rather than the usual "You don't need to refer to that".
14.  Make Stubs do something much better. See the implementation of GNU C's "#pragma weak" for an idea of what would be useful.
13.  Generalize Entry Points into 'event listeners', so that multiple library extensions or game modules can arrange to receive entry point notifications.
12.  Provide easy override for disambiguation rules, so that the designer controls the question "Which pen do you mean, the red one or the blue one?".
9.  Support Global X value; for symmetry with the three forms of Constant. Also provide Variable as a synonym.
8.  Permit objects to be both containers and supporters.
7.  Replace Fake actions by before_second and after_second properties.

Last updated 17 April 2013. This web site has not been fully supported since April 2008. Information may be out of date. This page was originally managed by Roger Firth.