<h2>Improved Features</h2>

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.
  *  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.
  *  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).
  *  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 puzzles<sup>1</sup>, 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.<sup>2</sup>
  *  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/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 compatibility mode is available to disable many things in order to make it more compatible in many ways.

<h2>Bug Fixes</h2>

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.
  *  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).

<h2>Footnotes</h2>

<sup>1</sup> "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 level reordering, animations, etc.

<sup>2</sup> 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.