Improved Features
Free Hero Mesh can have many improvements from EKS. Here is a list of the intention so far:
- It is Free Software.
- A puzzle set is now stored in four files. One stores pictures and sounds, one stores class definitions, one stores levels, and one stores solutions. Other than the class definitions, they are all Hamster archives. The .level file may be a symlink in case you want to work with multiple solution sets and/or if all the levels need to be solved in multiple ways because of multiple sets of rules for the puzzles.
- Levels and pictures are now compressed.
- Class definitions are stored in a plain text file, allowing them to be edited by any text editor of your choice, and retaining however you format it, so that the formatting isn't lost, and so that a class editor need not be implemented. The .class and .xclass files may also be symlinks in case you are sharing classes between multiple puzzle sets.
- Solutions may optionally include a timestamp. They may also include comments.
- Maximum grid size is up to 64 by 64. The level still stores the maximum size for that level which may be less than that; objects cannot be created or move outside of the maximum area defined by the level (29 by 21 for all converted levels).
- No longer a limit of 512 pictures per puzzle set; the limit is 16383 classes and 32768 pictures.
- Many attributes are now signed 32-bit numbers. This means you can for example define objects with a negative Weight or Volume.
- All values now include a type. This avoids some of the problems with improper puzzles1, and prevents segfaults, since pointers to objects are stored with the generation number.
- AltImage and GlobalBool and ExplainDeath are no longer available. This avoids problems with improper puzzles. Instead they are converted into constants (0 for AltImage and GlobalBool, 1 for ExplainDeath). There is a AltImage setting, but it is not used by class codes; it is used to select which picture to load if multiple pictures of an appropriate size are available.
- WinLevel ends execution of all class codes, and does advance the level (or a user setting may change this).
- GotoLevel and Link no longer exist; both are replaced with a new instruction called LoseLevel.
- PopupMisc() is no longer available; it is converted into "Misc1 Misc2 Misc3 (PopUp 2)", which does the same thing.
- Animations are handled differently, in order to avoid improper puzzles.2,3
- Signed comparison and division operators are now available, although the unsigned ones still exist and are used by converted puzzle sets.
- The Level global variable works differently. Instead of being the zero-based level number, it is a 16-bit number which is defined by the level itself and does not change if the levels are reordered (you can use it as an extra parameter to mean whatever you want in the puzzle set). Converted levels retain their existing value though.
- LevelCount is no longer available and is converted to -1 (because converted puzzle sets always use unsigned comparison operators, it should not make a mistake).
- PuzzleSetNumber is no longer available; all references to it in class codes are replaced by its value at the time of conversion.
- IgnoreKey() does some things to avoid improper puzzles and bugs.
- You can now access class attributes without needing to create an object of that class. (Having typed values helps with this.)
- Global definitions are now possible, including global variables, global functions, and default message codes.
- PopupColor() is gone. It is replaced by doing nothing.
- A new "MaxInventory" command. Causes loss of game if the number of inventory items is greater than the specified number. In a converted puzzle set, all instances of "SetInventory" are followed by "5 MaxInventory".
- A new "GetInventory" command.
- New flow controls (begin/while/repeat, begin/until, and begin/again), so that goto need not be used as much. Goto is still available though; sometimes it is helpful to use goto instead of structured flow controls.
- VisualOnly no longer implies Stealthy (except in compatibility mode).
- New user settings to control various things (including key bindings, whether or not to save solutions, colours, etc).
- You can view all values of all objects at a given position by clicking. This means there is no longer any hidden information (unless you choose not to look). However, the new Quiz flag can be used to hide an object's variables; this flag cannot be read or written at runtime, and can be overridden by user settings.
- The ability to search for and/or list level titles.
- Additional colours are available.
- The level border colours are no longer available.
- Arrays are automatically initialized to zero (although you can still use InitArray to reset it to zero or fill it with a different value). This avoids improper puzzles.
- More operations are available by keyboard; the menu for mouse and toolbar icons are no longer available because you can use keyboard commands to do such things as rewind, access a specific level number, etc.
- You can click on the recording to rewind or advance it.
- A third message argument. Use SendEx or ,SendEx or BroadcastEx commands to call a message with its value set to nonzero.
- IntMove and ,IntMove command which calls the internal Move() function without initializing Inertia.
- MoveTo and ,MoveTo commands which call the internal MoveTo() function without triggering the JUMPED message.
- PopupModal and (PopupModal) commands, which can be used to create modal popups that block execution.
- Cleanup phase triggers.
- Assassinate and ,Assassinate commands to stealthily destroy an object without triggering the DESTROY and DESTROYED messages.
- QueueInput command, which can be used to force a given input next turn automatically without the player entering it or it being entered into the move list (before the player gets another turn).
- QueueMessage and ,QueueMessage command to insert triggers before the end phase.
- Add a ,WinLevel command which is like WinLevel but allows for alternative scoring.
A compatibility mode is available to disable many things in order to make it more compatible in many ways.
Bug Fixes
There are also several bugs that Free Hero Mesh would correct.
Bugs that would be fixed:
- If you select a class without the dialog box and then activate the class selection dialog box again and image 0 is not available in the editor, it will mistakenly select image 0 anyways.
- Restarting a puzzle (by pushing escape) while an object is busy will improperly cause triggers to occur that aren't supposed to occur.
- Bombs exploding in Hero Defiant sometimes cause a GPF. I believe this is due to things that improperly depend animation timing, and this is corrected as mentioned in the section above. (Even if this is not the reason, it is probably fixed anyways.)
- Multiple popups, by right-clicking on objects and displaying popups by class codes and displaying the level startup text all at the same time, can cause several kind of problems, including recording keys that are never actually executed.
- If a popup message is displayed and IgnoreKey is used, the key code to dismiss the popup is still recorded even though it is not executed; this results in a recording which does not match the state of the puzzle.
- You cannot assign to a standard variable of another object if that another object is a read-only variable; you must first assign the object pointer to a temporary variable in order to do so.
- Move(Self,constant) increases Inertia by Strength instead of setting Inertia equal to Strength. For compatibility with puzzles that depend on this, it is handled in a special way during conversion (see mbtofhm.c for details).
- Changing the density of or otherwise tampering with the density of the backmost object can cause problems (including memory leaks and GPF).
Footnotes
1 "Improper puzzles" means that the operation of the puzzle can be affected by things that it is not supposed to be affected by, such as: randomness, timing, internal numbers assigned to classes/messages/objects, level reordering, animations, etc.
2 It may be necessary to figure out how to properly handle Roller animations (and possibly the irregular Hero animations) in this way. Even if such problems occur, the only thing expected to happen is an improper display; the puzzle would otherwise still work.
3 Some puzzle sets may use object pointers as random number seeds for doing animation. This is no longer supported, although the Lava_bubble class in Hero Defiant does not do this, so it can still work.