------------------------ Version 1.2: 5-Feb-2017 ------------------------ . GUI editor has an improved overall interface: o Command list is moved to left-hand side when user is editing on the right o TAB now works as an autodraw toggle; same as world editor o Spacebar now draws selected char from ENTER o When normal text typed, spacebar reverts to drawing ordinary space character o Ctrl+K shows the color dialog o Shift+Arrow, Ctrl+C, and Ctrl+V block copying implemented . Options menu is improved. There are now text descriptions for all configurable options, and a better interface for selecting them. . Confirmation dialog buttons now take the non-selected button background directly from the cell underneath instead of selecting a blue background. As people create GUIs without the common blue background often found in ZZT, the non-selected button status needs to stand out more from the selected status (bright green/red). . Super ZZT scrolling now matches original engine much more closely. The unusual boundary triggers were never exact-center focus (Left=10, Right=11, Top=9, Bottom=7), and some worlds had been built to explicitly hide areas based on these loose boundaries. The LEGACYCAMERA setting now prevents exact centering during camera focus in Super ZZT worlds. Notably, PASSAGE and TRANSPORTER navigation always re-center the camera on the PLAYER. Such re-centering will still occur even with LEGACYCAMERA set to 1. . PLAYRETENTION only configures channels now. Reverb is now configured by PLAYREVERB. . Two additional octaves are supported by #PLAY syntax: O00 and O01. The lowest octave has a few virtual tones, because the original speaker sound hardware would not have allowed 16-bit counters to reach below about 19 Hz. . #PLAY statements support directly setting octaves with "Onn". The original range of octaves (02 to 07) is still modifiable via the "+" and "-" codes. However, the new octaves (00 and 01) can only be set using "Onn". This is because original playback conventions would otherwise be ruined if the original octave range were not respected (MUST clip those songs at 2 and 7). . #KILLPOS command kills any status element at the coordinates. . The commands #PUT, #SPAWN, and #SETPOS now support "pseudo-directions." These directions are UNDER and OVER. When used, the directions create a vertically stacked set of status elements with the status elements under the "pile" remaining in ghosted status without any tick iterations. When the square again becomes "free" after the object above moves off the square, the ghosted element automatically unghosts itself and starts executing commands again. . Statless passages now have proper blink behavior. . Hint processing message now works from the SZT intro GUI. . The "scroll trick" on board navigation now works completely. Originally, the scroll interface would be shown, but the player needed to perform a second move before board navigation would occur. Now navigation happens automatically. . #CHANGE no longer causes variable-not-found errors when the destination is a color starting with a # symbol. . OBJMAGICNUMBER is configurable to something other than 32. One can make the total number of available commands per turn of OBJECT types larger or smaller. . Region names in enhanced ZZT-OOP must now appear as expressions (string literals if not looked up from a variable). Compatibility is still maintained for earlier non-quoted string literals. . The #GIVE and #TAKE commands now work with properties not originally defined in the ZZT/SZT inventory system. When a unique name is picked (e.g. COINS), it is created if it does not already exist. The quantity can be manipulated as any other property could be within ZZT Ultra. #TAKE works the same way with the new property as it does with every other inventory quantity. . A new property, EXTRAINVTIMEOUT, controls how long the "extra" inventory label and value appear when such a counter is changed. The labels that show extra inventory are only provided as a quick-and-dirty convenience for marginally enhanced worlds; a better solution for a designer is to customize the GUI and property dispatched message handlers. . The "I" key now acts as a universal "inventory" key, so that the cheat box does not need to be used. The INVENTORYFLAG config property controls what the "I" key does. It can set a flag ("I" is the default), or it can clear a flag by preceding the text of the property with a hyphen. Evil Sorceror's Party works if INVENTORYFLAG is set to "I". Pepper Bolette works works if INVENTORYFLAG is set to "-M". . STONE type is no longer pushable. . Centipede LEADER and FOLLOWER attributes are now set to 65535 when saving in legacy format. Previous value of 65534 had broken worlds saved in ZZT/SZT. . TRANSPORTER navigation had been using CANPUSH to evaluate viability of transfer through portals when given pushability clearance. In fact, this should have been SAFEPUSH1. Centipedes and BULLETs should not be squashed from the player's move through a TRANSPORTER; they now block such navigation rigidly. . #SCROLLSTR command greatly facilitates scrolling marquees in toast messages. There are several options for controlling marquee size, controlling scroll direction (left or right), controlling scroll speed, and queueing text in a fashion that does not require re-queueing of text after being pushed. As the #TEXTTOGUI and #TEXTTOGRID commands can alter the output target for text, a marquee could also appear in the GUI or board itself if the user wants. . Scroll interface colors are now fully configurable. The #SCROLLCOLOR command sets seven different color quantities: border, drop-shadow, background, main text, center text, button, and arrow. . Several new configuration properties exist, which implicitly act as a #SCROLLCOLOR invocation upon world load: SCRCOLBORDER, SCRCOLSHADOW, SCRCOLBG, SCRCOLTEXT, SCRCOLCENTERTEXT, SCRCOLBUTTON, SCRCOLARROW. . DEMO.WAD's use of #SETPLAYER used an obsolete main type code handler. Main type code and DEMO.WAD implementation fixed. . Ecco the Dolphin now works . Avarice (SZT) now works ------------------------ Version 1.1: 4-Jan-2017 ------------------------ . Sound system modified to support better Hall of Music features. . Remote file parsing engine supports special "embedded all-in-one" builds. . Minor fixes to engine, such as in utils. ------------------------ Version 1.0: 6-Aug-2016 ------------------------ . Slightly improved and compartmentalized main menu; direct link to documentation is now present. . Group movement rim test had been mistakenly counting ghosted objects as part of the rim. Now ghosted objects aren't counted. . #FOREACH, #FORREGION, and #FORMASK had been mistakenly searching for ending #FORNEXT from the start of the code instead of from the "for" statement itself, resulting in some odd breaking loop behavior when no list iterations were present. . New #SPAWNGHOST command allows for status elements to be placed in the board starting with ghosted status. A provided LValue is assigned an object pointer for the purpose of tracking the ghosted status element, as the grid itself will not retain a record of it after creation. . Fixed problem with TYPE member within status element occasionally becoming corrupted after the user makes changes in the type editor. . $PLAYER variable was getting retained incorrectly during save in the editor. The individual boards no longer save playerSE value as part of save; this status element is always inferred from the CPY member when loading the world. . VERSION is now purged from WADs when saving occurs. . Player status element had been malfunctioning when killed and set to a different status element. The status element should no longer generate errors during autosave. . Player held-down input movement and shot directions had been carried over unexpectedly from the end of one game session to the start of the next. Now movement and shot directions are reset upon world load and board state wipe operation. . Configuration property DUPSOUNDDIST controls the maximum number of squares away from the player from which a DUPLICATOR's sound can be heard. This defaults to 1000 (functionally, heard from anywhere), but it can be set to something much less as a way to silence duplication noises unless the player is relatively close. Setting this to zero silences the sound completely (PLAYER can't physically get that close to the duplicator). . Unnn: #PLAY code introduced, which affects tempo for a #PLAY string for the current channel only. The original Unnn without the colon still sets the tempo for all channels. . Download package now comes bundled with both SMASHZZT.WAD. . Smash TV Circuit 1, 2, and 3 added to Hall of Music. . "The Stick" (from NARC) added to Hall of Music. ------------------------- Version 0.20: 8-Apr-2016 ------------------------- . #MASTERVOLUME command allows volume level to be set on a higher level for each channel (independent of Vnn level set at any one time in channel playback timeline). . MASTERVOLUME configuration property now sets master volume for all channels when world is loaded. Default is 50, which is max volume (no attenuation). . #STOPSOUND 0 15 now called when sound is muted. . OLDTORCHBAR configuration property shows four legacy "bar" units in place of finer, solid bar. . #DRAWBAR fractional rounding improved to favor closest level instead of truncated- towards-zero level. . Toast message color now cycles from 9-15. . Toast message timeout now synched to the real-time clock in ZZT Ultra only when in unpaused state and a game-oriented GUI is active. This prevents the message from cycling through the timeout when the player actively attempts to pause the game. . #DRAWCHAR/#ERASECHAR is now clipped against viewport boundaries. . #DYNTEXT centering option has been removed. . Common global variables interface in editor could not display array types correctly. Arrays are no longer shown in the common display; the "all variables" display must be used to edit them now. . Mouse cursor can no longer be dragged beyond the edge of the board when a small board size is being edited. . When types are resynched after an edit, UNDERIDs of SEs are now resynched properly. UNDERIDs had been unexpectedly changing whenever the user edited custom types in the type editor. . New configuration properties directly control player appearance in basic contexts: PLAYERCHARNORM and PLAYERCOLORNORM control normal look of player, while PLAYERCHARHURT and PLAYERCOLORHURT control "hurt" look of player. . Normal player character and color display hook routines are now implemented in the main type code, which are called $PLAYERCHARDISPLAY and $PLAYERCOLORDISPLAY. If four-directional player character selection is desired, the $PLAYERCHARDISPLAY code has comments suggesting how this can be done if the routine is overridden. . "Energizer" animation now has its own hook routine in the main type code, called $ENERGIZERDISPLAY, which can be overridden. . PAUSEANIMATED configuration property can be used to inhibit player pause animation. . It is now possible to create OBJECT types with an immediate bind to an existing name. As long as the named object exists somewhere on the board (such as CUSTOMBULLET), one can program something like #PUT E GREEN OBJECT;BIND="CUSTOMBULLET" and have the object immediately resemble the CUSTOMBULLET code. . In a similar vein as above, BIND (or ONAME) can be used in a #CHANGE statement to identify objects only resembling the specified name. For example, #CHANGE OBJECT;ONAME="CUSTOMBULLET" GEM will only select OBJECT types named or bound to CUSTOMBULLET for the change operation into gems, leaving alone all other OBJECTs. . FREESCROLLING configuration property controls whether the viewport regularly scrolls to center the player. This defaults to 1 for Super ZZT mode and 0 for all other types of worlds. This can be set to 1 for a WAD for large boards, although this comes at the cost of not being able to program the camera manually. . SENDALLENTER configuration property controls whether SEND ALL:ENTER is invoked when the player enters a board. This defaults to 1 only for Super ZZT, but it can also be set for a WAD if on-enter messages are desired. . MAXSTATELEMENT now defaults to 9999 instead of 151. WAD worlds had been handicapped unnecessarily at the original status element limit of 151. Although the user can store any limit within the WAD, the default is more sensible now. . High scores are now supported. The high score functionality is complex based on the origin of the world, the user's configuration options, and the server-side configuration for the site. o The #POSTHS command posts a single high score line for a world, with the modified, sorted list implicitly fetched for later use with #GETHSENTRY. o The #GETHS command fetches a sorted high score list for later use with #GETHSENTRY. o The #GETHSENTRY command sets a variable to a specific high score field when given a row and column. When a high score line is posted, it is comma-separated (#DYNTEXTVAR is the best way to create a comma-separated high score line). The original ZZT storage format of SCORE,NAME is supported by default, but it is possible to post any number of custom fields to a high score file. The list can be sorted, in forward or reverse order, with any of these comma-separated fields acting as the sort key. High score "files" are an abstraction, unlike the original .HI files in ZZT. The lists are identified by name, which by default is set to the WORLDNAME property. The actual storage of the "file" will depend on the location from which the world was loaded originally. Files loaded from local storage are kept in the HIGHSCORE config property (an AS3 shared object) and keyed by filename. If desired, one can delete a local high score list by invoking #DELCONFIGVAR "HIGHSCORE" filename. Files loaded from a deployed (site) configuration are managed server-side via the eval_hs.php resource. The ZZT Ultra download package provides a copy of this file with suggestions as to how to implement high scores on a server. There are many tweaks available to this script that can streamline or expand the behavior of high scores based on the webmaster's preferences, such as sizing limits, which files to allow storage, and words blocked from user entry. Several configuration properties control high score posting functionality on the client side: o HIGHSCOREACTIVE: Set to 1 if high score functionality is active. High scores will not work if 0. o HIGHSCOREMIN: Set to a minimum posting requirement for the SCORE property. A high score prompt will not appear unless the user scores at least this high. o HIGHSCOREPROMPT: This controls the context of a high score prompt. 0 = No prompt 1 = Prompt for any type of game end 2 = Prompt only when $PLAYERMODE is 2 (player lost all health or #ENDGAME) The user can do certain things in ZZT Ultra that disable high score functionality implicitly. Executing any cheat sets HIGHSCOREACTIVE to zero immediately, which can only be rescinded by reloading a world file. If the user actively executes any console action, or attempts to manipulate SCORE in the configuration, ZZT Ultra internally disables high score functionality for the remainder of the session (even reloading a world will not rescind this). -------------------------- Version 0.19: 15-Mar-2016 -------------------------- . Configuration Options GUI now splits general options into categories for easier editing and identification. . The "modern", "classic", ZZT-specific, and SZT-specific configuration properties are now stored as configuration hives (i.e. Flash shared objects). These will be remembered from session to session of ZZT Ultra unless shared objects are purged. . ZZT and Super ZZT GUIs have been fine-tuned to more accurately resemble original engines. For the in-game GUIs, a separate set has been developed for the "classic" configuration style, since new and legacy features will be difficult to reconcile with a singular, common interface going forward. . SCANLINES can be set to alter the scanline mode when a ZZT or Super ZZT world is shown: 0=CGA (8 pixels), 1=EGA (14 pixels), 2=VGA (16 pixels). . World loading from ZZT or SZT title screens (the so-called "World" menu item) now supports multifaceted site/local load options. SITELOADCHOICE is a new configuration property that controls what the site configuration actually shows when #LOADWORLD 0 is invoked: SITELOADCHOICE=0: Local files of same type of world only SITELOADCHOICE=1: Choice of local files of any type of world; no site options SITELOADCHOICE=2: Only site configuration; no local load options SITELOADCHOICE=3: The default; shows site configuration AND local load options . Several new configuration properties control message and sound inhibition for common terrain interactions, including WATERSOUND, WATERMSG, INVISIBLESOUND, INVISIBLEMSG, FORESTSOUND, FORESTMSG, and FAKEMSG. . New configuration properties MOUSEEDGENAV and MOUSEEDGEPOINTER control how mouse pointer interacts with edges of board. MOUSEEDGENAV controls percentage of cell at fringe of board that counts as an edge nav (0=None, 1=50%, 2=100%, with 1 being the default). MOUSEEDGEPOINTER controls whether the nav pointer arrow is shown when a click would trigger edge-nav. . New configuration property BOARDEDGETRANS controls the transition type shown when edge-nav occurs: (0=Scroll always, 1=Scroll only when against an actual board edge, 2=Never scroll). If scroll transition is not used, the dissolve effect is used instead. . New configuration properties ALLOWINGAMERESTORE, ALLOWINGAMECONSOLE, and ALLOWINGAMECHEAT control whether certain in-game actions can be triggered or not. These will options apply regardless of whether or not a label for the action is visible within the GUI. . New configuration property FASTCHEATFLAG allows cheat-entry of a single flag name without a plus symbol to work the same way as if a plus symbol had been entered. . OVERLAYSCROLL configuration property controls whether modern or classic scroll interfaces are shown. OVERLAYSCROLL=0 looks worse, but it is much closer to the original interface. . The original "Loading...*/" animation is implemented. Modern loading times make it difficult to see this animation except for very large files or slow network speeds. . Scroll transition no longer shows players on BOTH sides of each board. . River-based edge-nav improved. Possibility of multi-board nav in same direction is no longer possible. Camera is also fixed when edge-navigating to same board. . DUPLICATOR no longer causes the CLONE to inherit the background color of the destination for status elements without FULLCOLOR defined. . Centipede HEAD now reassigns the next segment to a HEAD type instead of replacing it completely with a new HEAD. . Keypress fallthrough in JSON interfaces had continued to persist in rare circumstances. Problem has been eliminated by disabling the text control when it is not shown to the user. . GUI editor has an improved interface: o Mouse click sets GUI editor cursor during text entry o Shift+Enter now picks up character and color together o GUI label property can be added with F3 during text entry o MouseInput label property can be added with F4 during text entry . Title screen initial load state is now remembered when loading current world in editor; object editing had been problematic when performed on non-initial state. . Immediate scroll behavior is no longer dependent on IMMEDIATESCROLL within editor. Instead, immediate scroll-open happens whenever editor is active. . Editing a SE field from a scroll now erases the text box properly after editing. . CHAR member in SE editor shows character and number together. . Resizing board dimensions no longer causes rare problems with uninitialized data in the new space; EMPTY always placed in new space now. . Internal grid storage structures automatically expand for board sizes stretched beyond the original theoretical maximum of SZT 96x80. It should be possible in theory to support any grid size now (limited only by integer word size). . Type editor improved. New types and edited types now post the relevant type at the top of the JSON dictionary, instead of at the bottom or middle. All types not subject to specific editing are alphabetized, so their locations no longer "move around" whenever the JSON interface is opened. . Save dialog remembers last save filename. . Text colors are now "picked up" and placed properly in world editor. . Full range of colors now selectable for DOOR and PASSAGE types in editor. The foreground, background, and blink colors are honored explicitly instead of using the convoluted FG/BG swapping per the original editors. . New command: #LEN measures array and string lengths. . New command: #GETTYPEINFO Type Expr LValue. This lets ZZT-OOP query property information about a type. . New command: #SETTYPEINFO Type Expr Value. This lets ZZT-OOP alter property information for a type, within reason. . Download package now comes bundled with both DEMO.WAD and CHARDEMO.WAD. . Never Gonna Give You Up (by Rick Astley) added to Hall of Music. . Metal Gear Solid works -------------------------- Version 0.18: 21-Feb-2016 -------------------------- . If inventory counter is missing from a #GIVE or #TAKE, it is set to 0 by default. . Moved toast label offset in Super ZZT left by 1 square. . Fixed long-cycle timing issue for LEGACYTICK; some objects were taking extra steps unexpectedly. . Better handling of non-standard #PLAY character syntax. . Centipede synchronization had been thrown off by the LEGACYTICK change. Centipedes should now invert promptly when blocked and form new heads from segments without problems. . Centipede segments now have smarter re-linking behavior to previously detached HEAD and SEGMENTS portions. . Additional Banana Quest hack: #OHHDREA is now translated to #ENDGAME. . The PWAD "PBF0.WAD" is automatically imposed on the site for the worlds MACGYVER.ZZT, NYAN.ZZT, and SMILEY.ZZT, while "PBF0_SZT.WAD" is imposed for VOYAGE.SZT. Play testing had revealed that these worlds require POINTBLANKFIRING to be set to 0. These PWADs apply the POINTBLANKFIRING mod whenever these worlds are loaded. . Hall of Music caching issue--page reloads a PHP resource to prevent caching. . The line-wall border that surrounds the SWF embedded object grows to twice its original size when the "large" or "huge" size is picked. . Nyan Cat's Adventures in Nyan Land works . Portal ZZT Demo works . Fantasy Land works . Long Voyage (SZT) works . Great Pyramid of ZZT works . The Wild Chase works . War of ZZT works -------------------------- Version 0.17: 7-Feb-2016 -------------------------- . TOUCH message in remote board results in sent message to OBJECT type, even if if unable to transition to that board. Will process that message when the board is transitioned in a way that doesn't block the player (and object's IP can iterate). . SCROLL entered from an adjacent board will "warn" player without actual edge nav. . DOORs are now unlockable from adjacent board. . PASSAGE and DOOR colors are now set properly when overwritten by ZZT-OOP commands (including DOOR -> PASSAGE and PASSAGE -> DOOR). Notable that ZZT-OOP in original ZZT engine is not necessarily consistent about target colors (depends on the actual #PUT direction) . #PUT no longer squashes point-blank type prior to replacing it. . MAXPLAYERSHOTS now adds back bullets destroyed casually after being #PUT or #CHANGE'ed out of existence. . Bombs now destroy player clones. . Super ZZT has PLAYER clones fire only from pressing space, not from Shift+Dir. . PLAYER first movement after pause does NOT move clones. Set a flag that allows such pause-originated movement to cancel clone-movement initially. . #CHAR and #CYCLE no longer show errors when number missing. . +dark and -dark actually modify the ISDARK board property in addition to the DARK global flag. . Cheat "z" increases Z property by 1. Cheat "noz" clears the Z flag label and sets Z property to -1. The way the cheat was done in ZZT Ultra, "noz" does not clear the flag (anyone wanting it to be changed would have to clear it on their own anyways). . ZZT supports wind tunnels as the _WINDTUNNEL type. A board with a stat'ed EMPTY is translated into this type, to which the PLAYER reacts when crossed. Note that _WINDTUNNEL does not itself have stats. The PLAYER zips over all wind tunnels when moving right or down, and zips only one additional time when moving left or up. . Many interactions within ZZT Ultra treat _WINDTUNNEL synonymously with EMPTY. It is not realistic to expect perfect emulation of stat'ed EMPTY for every type in the original engine, because such behavior is very non-deterministic (CYCLE, direction and parameter changes, skipping that may or may not be like the PLAYER's). . Super ZZT does not appear to support wind tunnels, even if EMPTY is stat'ed. SZT world load translation does not generate _WINDTUNNEL. . In Super ZZT, #CHANGE for a colored square appears to filter only the lower 7 bits of the FG color, although only the 8-15 colors can serve as a possible #CHANGE destination. Thus GREEN FAKE will account for both attributes 2 and 10. The original ZZT does NOT appear to apply this liberal filter--the color MUST match all 4 FG bits in ZZT. Implemented LIBERALCOLORCHANGE property, set to 1 only for Super ZZT. . One of the Super ZZT flags sets the Z inventory label: "Z" + "LABEL" will be shown in place of the "Stone" label we have now. . The Super ZZT "ENTER" message hadn't been sent properly unless the room had been entered once already. Now it is subject to an "nth-room counter" that inhibits sent messages on the starting and title screen, but will send for all rooms afterwards. . #BIND and duplication work differently. Duplication of an OBJECT takes a snapshot of the entire code, including the zap history, in a fashion that the duplicated OBJECT and the original OBJECT have separate codes with their own independent zap timelines. The #CLONE command will signal that this needs to be done whenever the CLONE type is placed in the board for a status element with its own code. #BIND, however, just reassigned the code ID, rather than creating new code entirely. . ZZT Encyclopedia Volume 1 works. . ZZT Encyclopedia Volume 2 works. . Super ZZT Encyclopedia works. . Lemmings Demo works. . Frost Part 1 works. . Chrono Wars 2 works. . Banana Quest added to Hall of Music. . Burger Joint added to Hall of Music. . Dragon Woods added to Hall of Music. . Eli's House added to Hall of Music. . Ezanya added to Hall of Music. . Frost Part 1 added to Hall of Music. . Jacky T added to Hall of Music. . Lebensraum added to Hall of Music. . Merbotia added to Hall of Music. . Ned the Knight added to Hall of Music. -------------------------- Version 0.16: 27-Jan-2016 -------------------------- . Switching to editor stops all sound channels . ENERGIZEREND sound effect early cutoff removed . "Bomb activated!" message now shown . SHARK default color is now 7, not 15 . Color KEY inventory syntax blocked from ZZT/SZT compilation namespace . GEM now gives a score of 10 upon collection . GAMESPEED persists after SAVEBOARD -1 is called . LEGACYTICK configuration property added, which defaults to 1 for ZZT/SZT and 0 for WAD. When set to 1, classic mechanism used to tie delay to universal 1...420 master tick and modulo-comparison with SE index number within vector. When set to 0, ZZT Ultra's preferred mechanism of storing individual delays within each SE is used. Legacy timing is needed for more deterministic object iteration, including worlds like Burger Joint. . Custom types now reset properly after loading a WAD that has them . Numeric constant is blocked from processing after movement commands when compiling in ZZT mode . Scrolls allow for @name to be posted from text . #DYNTEXT processes strings as case-sensitive instead of forced-uppercase . Toast message centering is truer to original ZZT engine . Toast message background GUI color now honored for Super ZZT engine . Blank spaces after movement commands on same line treated as blank text lines . Singular blank lines cancel toast message only when shown in Ultra mode; such lines are ignored completely in ZZT/SZT mode . OBJECT consistently leaves behind UNDERCOLOR in ZZT mode after #BECOME FAKE . #PUT and #CHANGE attempt to retain original color of square when not specifying a destination color and replacing a status element with a non-status element . #PUT and #CHANGE replace the underneath type of the target with EMPTY when a blocking non-status element is replaced with a status element . Changing to EMPTY forces the odd 0x70 color attribute for the tile . Placing a color-qualified EMPTY fails in ZZT/SZT mode; still works for Ultra mode . Attempting to change a color-qualified EMPTY fails. . Placing a status element on an EMPTY without specifying a destination color will use the color of the EMPTY, but discard its background color bits . DOOR coloration translates correctly now after being overwritten by #PUT or #CHANGE, or overwriting another type without destination color specification. The internal storage of the colors is actually reversed from what it was in the original engine: FG and BG bits are swapped in order to maintain color-identification matches. . Presence of a color ONLY where a type is expected now refers to a BOARDEDGE of that color. Needed for Mission: Enigma. . PWAD support during ZZT/SZT/WAD load . PWADdler PWAD generator application from ZZT/SZT/WAD and another saved WAD . Player clones now interact with many different collectable types, as well as doors . Item-collection must happen when an item is "duplicated" into ANY player, including a clone. The so-called "duplicated-activation code" includes this: . GEM, AMMO (source not destroyed) . TORCH, ENERGIZER (source destroyed) . KEY (source destroyed but not visibly. Ultra always removes key from view. Nothing happens if key in inventory already) . DOOR (shows "locked" message if no key; destroys source if key present) . BOMB (bomb activated at source if dormant; run-time error if not. Player just pushed in Ultra.) . FOREST (source destroyed; clearing message) . FAKE (fake wall message; source not destroyed) . INVISIBLE (invisible wall message; source is made NORMAL) . WATER (water blocked message) . TRANSPORTER (nothing, in any direction) . BOARDEDGE (triggers right-movement edge nav, even if last dir is not east) . BOULDER (run-time error...! Player just pushed in Ultra.) . SLIDERNS (run-time error...! Player just pushed in Ultra.) . SLIDEREW (run-time error...! Player just pushed in Ultra.) . BQDELTA.WAD development patches Banana Quest world files... o BQUESTHACK world property set to 1 o GUI label Mute/Unmute replaces Be Quiet/Be Noisy) o BQUEST custom WAD lump present (for character set) ripped from BQUEST.COM o SCANLINES set to 2 implicitly o Custom character set BQUEST set implicitly (14-line set) o Globals containing banana-color text look-ups present: "BQUESTCOLORS":["Black","Blue","Green","Cyan","Red","Purple", "Yellow","White", "Black","Blue","Green","Cyan","Red","Purple", "Yellow","White"], o Sound effect for READSCROLL replaced: Z00P11:@V40K0:0:ICDFSEIC-GT99996666 o Files patched include: BQUE.ZZT, BQUEST.ZZT, BQUEST-B.ZZT, BQUEST-C.ZZT o Corner-activator object patched into each file (at position 60,1) which executes the following: #SCANLINES 2 #CHARSELECT "BQUEST" 8 14 1 256 0 #CLONE -1,+0 #GHOST SELF 1 #SPAWN +0,+0 CLONE :REPLOOP /i #REPLOOP o TOUCH, END, PLAY, CYCLE commands and label implement string replacement hacks o BOMB text replaced: "BoomBoom Ticker" o WATER-contact message now says: "M.O.E.: That might be water. " o Fake wall discovery now says: "Floors Floors Floors Floors.." o Time-out message now says: "Running out of time!" o Invisible wall discovery now says, "AAh! You hit a cursed invisible wall!" o Key collection, overcollection, door unlock, and door locked messages replaced o Most cheats were disabled in the hacked executable, but BQDELTA.WAD in its current form does not attempt to disable cheats within ZZT Ultra. . Burger Joint works (sometimes) . Crypt works . Dungeon Master's Gallery . Escape from Socialism works . Kudzu works . Landing works . Legend of Brandonia works . Merbotia works . Mooseka Rules with an Iron Fist works . Winter works -------------------------- Version 0.15: 20-Dec-2015 -------------------------- . WAD Manager implemented, which lets users upload files into the WAD file as custom WAD lumps. Support for extra lumps is needed for character sets and palette blocks. . ASCII / UTF-8 character conversion problems fixed when saving in editor. . GUI properties are now case-insensitive (e.g. GuiWidth == GUIWIDTH). . Fastest game speed can be made to run faster than 30 Hz. The FASTESTFPS configuration world property can be set to any number between 1 and 10000. . The ORIGINALSCROLL configuration world property can be set to 1 to allow for vertical-only scroll opening, as opposed to horizontal-and-vertical scroll opening as implemented now. . #BIT7ATTR sets color attribute bit 7 to act as either blink or high-intensity color. The world property BIT7ATTR stores the last value sent to the command. . You can set BIT7ATTR as a GUI property to have BIT7ATTR setting pegged to a GUI. . Editor toggles BIT7ATTR with "Shift+K". Any WAD file saved with BIT7ATTR changed will retain this as a world property, such that the GUIs will have high-intensity background unless they are changed later. . #PALETTECOLOR and #PALETTEBLOCK implemented; these modify one or more of the 16 palette color registers to a new RGB combination. . #FADETOCOLOR and #FADETOBLOCK implemented; these fade to a solid color or to a palette over the specified number of milliseconds. . You can set PALETTE as a GUI property to have the GUI load a palette upon activation. . #SCANLINES implemented; this changes the scanline mode to (0=CGA, 200 scanlines), (1=EGA, 350 scanlines), or (2=VGA, 400 scanlines). Default is VGA. . There are three default fonts stored for ZZT Ultra now, one for each scanline mode. Previously, only the VGA (char height=16) font set had been stored. . You can set SCANLINES as a GUI property to have SCANLINES setting pegged to a GUI. . A new character editing interface is present in the world editor. Press "=" to use. . #CHARSELECT implemented; this changes some or all of the character set to a customized set within the world file. -------------------------- Version 0.14: 3-Dec-2015 -------------------------- . Rendering system was completely overhauled, resulting in significant performance improvements. The original setup involved thousands of individual Flash DisplayObject cells, but the new setup just uses a single bitmap for the screen, five back buffers for various GUI/viewport splits, and simple bit-block copying w/out alpha blending from source bitmaps to destination bitmaps. This new system has proven to be nearly lag-free, even on older machines. More importantly, the system can be easily tailored to future enhancements like character set customizations, VGA palette DAC emulation, etc. . #SET no longer respects value after global variable name when original code is compiled in ZZT or SZT mode. . #Target:Msg works now even if Target is a valid command. Parsing should look for colon and treat the entire body as a #SEND Target:Msg. . Flag cheat works more consistently now. Problem was that text was re-interpreted as a direction instead of an ordinary LValue expression. LValue compilation now explicitly screens out nonconformances (defaults to global variable names). . #RESTORE early-out behavior made more specific (text following comment must start with an alpha character; it cannot be just any text). . Super ZZT bomb explosion is supposed to be "taller" than ZZT bomb explosion. New mask for SZT-specific worlds is SZTBOMB, while all other types of worlds use BOMB. . Spinning gun firing rate was too rapid. Range of firing rate test should actually be 1 to 9, not -1 to 7. Strange that lowest firing rate will NEVER fire, but that was the original ZZT behavior. . "Statless" types that are supposed to have status elements are handled better now. ZZT Ultra continues to create status elements for these types, but with very specific conditions: these elements start with the FL_LOCKED, FL_IDLE, and FL_NOSTAT flags. This allows them to keep processing dispatched messages and handle custom drawing correctly, but they are functionally "dead" in terms of sent messages and most other code-execution contexts. Note that the ZZT Ultra editor does not permit stat removal for content saved in the WAD format (it is an exploit and shouldn't be present as a best practice). . A "statless" PLAYER clone does not actually count as a clone for the purpose of warped player actions or clone-bullet firing. . If "statless" types are present, they do not count towards the status element upper limit if one exists. . Edge-navigation that would move the legitimate PLAYER into a clone in the target board does not actually move the PLAYER to the target location--the original PLAYER stays where it was in the target board. Link II requires this behavior. . When a type is expected in the compiler and nothing appears (e.g. #BECOME with no type), the type defaults to BOARDEDGE. This allows you to get out of bed in Link II. . Editor displays BOARDEDGE as "E", but it appears as a space during the game. . Shift+arrow now moves the cursor 10 spaces in the Super ZZT editor, and does not wrap around to the opposite end of the board. Unshifted arrows still wrap the board. . Corrupted board data no longer stops ZZT Ultra from loading the world, or even playing the corrupted boards. Any board that fails size spec validation or has other logical inconsistencies will be replaced by an empty board with the player in the upper left. Link's Adventure 2 and 3, plus Ned the Knight, will now load correctly. . Cat, Cat, That Damn Cat works . Link's Adventure works . Link's Adventure 2 works -------------------------- Version 0.13: 31-Oct-2015 -------------------------- . Main menu screen (the DEBUGMENU GUI) has been re-designed to act as a more generalized launch screen and not an incidental sidebar. Version information is now set to labels on this GUI directly upon redraw. Other useful actions like loading of featured worlds are also much more intuitive now. . Smilymzx suggested patched-in GUI labels for displaying custom status bar info. Allow for dynamic modification of GUI labels after a GUI is loaded. The command looks like this: #MODGUILABEL label col row length color rj1present . Smilymzx suggested having a flag that allows keys of all colors to be collected. Current behavior (which is REQUIRED for some ZZT and SZT games) aliases all dark colors as light colors. Flag would inhibit aliasing, so that dark-colored keys would be set as KEY0 through KEY7. This is implemented as ALLCOLORKEYS, which defaults to 0. For all WAD files, though, ALLCOLORKEYS is ignored. Setting the option ALLCOLORKEYS to 1 forces a ZZT or SZT file to respect all key colors, with no aliasing (like WAD files). It is important to note the new behavior works on doors saved by ZZT Ultra, but doors imported from ZZT / SZT are still aliased as matching up to KEY8 through KEY15. There is no seamless way to map oddball door colors, unfortunately, because the color attributes for doors were already well into funny territory. It makes more sense from a design point of view for the world designer to customize types and appearances to display, interpret, and handle the logic for KEY0 through KEY7 directly, instead of using tweaks to the existing default code. . Z-Pinball game has many commands after #IF and #TRY that lead into multiple movement or idle followed by a # statement on a single line. To handle these statements properly, the jump-over conditions need to be evaluated carefully, and single movement-processing is inadequate when a ? or / is encountered after an #IF. . Discussion forum page . ZZT "play game to log in" CAPTCHA, coined now as a "ZAPTCHA" . More fault-tolerance for whitespace-separated ZZT-OOP args: allow for commas where only whitespace would be expected. Also allow coordinate pairs to be whitespace- separated in case the comma is forgotten. . Clicked general type GUI labels in ZZT Ultra editor (F1, F2, F3) had been subject to click fallthrough, automatically selecting the type "below it" in the next GUI. Fixed. . Overall music processing should be more fault-tolerant of codes w/out numbers . Hall of Music should process "#PLAY " text as @ . PLAYSYNC should kick in only after a minimum continuous play time of one whole note's worth of notes and/or rests (tempo does not matter). Some silly "jumping forward" of sound effect-playing objects had been happening for short-duration sounds. -------------------------- Version 0.12: 23-Sep-2015 -------------------------- . Made "SOUNDOFF" property more sensible; now is integer instead of string label . PLAYSYNC property implemented, which tows an object's IP forward if it is waiting on an idle cycle after a #PLAY string queue expires. This actually works far better than it was originally intended, because it makes background music cycling a lot more pervasive than it should have been, even for a CPU speed that is too "slow" in processing idle cycles. It even works when the action is paused, as long as an object only executes @, :, ', #SEND, #CYCLE, #ZAP, #RESTORE, /i, or #PLAY. Attempting anything else, including non-idle movement, will terminate sync and leave IP alone. . Binding of objects was a bit screwy. The presence of a @ anywhere within an OBJECT code now sets ONAME member immediately. . Names were not being shown when end of a program reached without an #END. . Player clones now navigate to passages on move attempt as well as main player. . Multiline scrolls had been getting walked over. $SCROLLMSG detection had been off a bit; now fixed. . Zapped re-entry no longer starts player on the passage (space beyond passage picked instead). This prevents the passage from being destroyed after zapped re-entry. . Aura now works . Little Square Things now works . Unreal-A demo now works (it's still an unfinished demo) . Dreams Demo now works . MacGyver ZZT now works . PASSAGE "real" color is now being updated to match background color whenever it is drawn and a change is detected. Passage navigation had suffered when unusual color combos for passages were being created. . Editor adapts better to PLAYER types with CPY=1; translated to CPY=0 (non-clone) when only a single PLAYER is in the board with CPY=1 . P3 passage not being set from scroll interface (+/- still works) . Passage and door colors: proper setting . GUI extraction on ENTER . Default direction for most status elements in editor is now IDLE, not EAST . Key fallthrough issue for text boxes (short delay implemented) . Unsaved asterisk indicator shows up next to Save command in editor GUIs . Direct mouse selection of pattern and color tables . Mouse shortcut (GUI title on row 2) that toggles editor types ------------------------- Version 0.11: 4-Sep-2015 ------------------------- . Added C.H.A.D.'s Broken Wind (from Super Meat Boy) to Hall of Music . Hall of Music takes GET variable song name as "SONG=" and auto-selects it for playing . WAD files without critical default world properties are given defaults . Main type code was not resetting properly after being overridden . Fixed PLAYER accounting within WAD file (rare bug set wrong type to PLAYER) . Fixed GUI Manager writing mismatched lengths for extra GUIs . Fixed RNDNE and RNDNS probabilities . MAJOR, MINOR, and TOWARDS directions not working; fixed . Fixed direction-specific ALIGNED and CONTACT conditions . Masks were not being saved in WAD files correctly . Sound effects were not being saved in WAD files correctly . Improved "R" repeat code in sound system . New commands: . GROUPSETPOS . GROUPGO . GROUPTRY . GROUPTRYNOPUSH . ATAN2 . SMOOTHTEST . SMOOTHMOVE . DRAWCHAR . DRAWGUICHAR . ERASECHAR . ERASEGUICHAR . GHOST . SETCONFIGVAR . GETCONFIGVAR . DELCONFIGVAR . DELCONFIGHIVE . READKEY . READMOUSE . TEXTTOGUI . TEXTTOGRID ------------------------- Version 0.10: 2-Aug-2015 ------------------------- . ZZT Imager now on download page . Integrated World Editor (finally) . Torches now have ALWAYSLIT attribute . World editor docs . Touching up of ZZT-OOP reference . Touching up of fine details . Touching up of object/type behavior . Start preliminary in-engine editor. Design should be hybrid of ZZT/Super ZZT/KevEdit features, but it should also expose full capabilities of ZZT Ultra. . Type definition editor . Load/Save features: . WAD . Legacy ZZT/SZT with formatting alerts, etc. . Type selection page . Floor . Non-stat . Stat . World properties . Board properties . Board change . Text entry . Placement, pickup, drawing, INSERT: copy to pattern w/out edit . Pattern editing . Color editing . Blink toggle . New world: N . Clear board: Z . !: Text editor . Ctrl+O: Hidden object reveal (temporary) . Ctrl+T: Show tile type info; allow stat editing . Ctrl+S: List all status elements; allow stat editing . T: Board transfer (one-board WAD loading) . K: Color dialog (swatches) . D: Toggle whether color selection overrides color of placed type . Shift+Tab: auto-drawing with backbuffer cycling . Page Up/Page Down: Quick change of board . f = floodfill; Shift + F = random floodfill . g = gradient fill; HARD . / = lock/unlock buffer . > < inc/dec size of buffer . 0 = select empty in buffer . 1-9 select buffer position . a = acquire tile in buffer; like TAB except each movement copies to buffer . Mouse / SHIFT-held selections: . x: "flood-fill" selection to buffer . X: Select all similar tiles . f: Fill . F: Random fill . g: Gradient . Ctrl+X, Ctrl+V, Ctrl+X: cut and paste ------------------------- Version 0.9: 22-May-2015 ------------------------- . Deployment configuration #1: Content paths . Need recursion level tested . Want to screen out non-filename chars at start of name (Ex: no "?") . GET variable support for DEP_AUTORUNZIP, DEP_STARTUPFILE, DEP_EXTRAFILTER . Current implementation doesn't appear to read these now . Need to create "FlashVars" parameters using tweaks to the JS on the web page. This eliminates the ExternalInterface security issues. . Deployment configuration #2: Static index . Deployment configuration #3: Dynamic index resource . ZIP file support . DEP_AUTORUNZIP . DEP_STARTUPFILE . DEP_STARTUPGUI . DEP_EXTRAFILTER . Large text file browser support . File links in ZZT-OOP: have a single type represent customized text that is compiled quickly and dynamically when needed. The file link would occupy, for example, type 254, and be updated whenever a new file link is invoked. The code stays put as long as no other file link is loaded, and attempts to invoke text that hit this location have the effect of sending a "dispatched message" text link to this code. Note that this will only apply to deployed content or ZIP files-- local uploads can only take a single ZZT file, a single SZT file, etc. . Hall of Music now hosted on website . Deployment package now officially released on downloads page . Links and copyright are WideUpdate'd . Change ZZTUltra.html to ZZTUltra.php, which tweaks resolution based on WIDTH and HEIGHT . News page . eval_dir.php needs to take recursive "level" variable ------------------------- Version 0.8: 15-Apr-2015 ------------------------- . Multiple blank lines no longer display as a completely blank scroll . Incremental board save feature . When game exited, title screen (and remainder of world) should reset to original state, discarding saves, etc. . Broken-apart text works more smoothly now, such as when a #CHANGE occurs between sections of text to be displayed in a scroll interface. . New debugging commands #DUMPSE and #DUMPSEAT; useful for code inspection . New SWITCHVALUE statement . There should be a different color mask used when combining FG/BG colors for status elements. Instead of the more intuitive FG=0-3 / BG=4-7 split, it should be something like FG=0-3,7 / BG=4-6. This way, the blink bit is only retained for status elements that have a naturally occurring blink bit (not sure if any actually do). This will also have the effect of making it far easier to handle over-water display or stars and bullets, because they won't need to change the blink bit on their own. . Note when fixing the above, will need to -REVERT- the change to bullet and star types. . Super ZZT #UPDATEVIEWPORT could save on redrawing if incremental shifting implemented . Long lag time for slower computers occurs for screen transitions. Implement a delayed-action redrawing if lag detected (use the flash.utils getTimer function to detect whether deltas are a multiple of 33.33333 milliseconds). . Reconfigure sprite bank to map image permutations for FG colors for each character. Although there will be 16 x 256 images instead of only 256, it eliminates the need to provide a color transform for the character itself, which should improve drawing performance overall when a character cell needs to be set. Noted that this didn't seem to yield any obvious performance gains, at least on my super-fast development computer. Need to see if gains are realized on laptop. . Unfound target in #ZAP/#RESTORE target:label no longer reported as an error . Improved #TRY when multiple #TRY commands chained together on one line. . #TRY IDLE counts as a failed move and will perform alternate action. . Limits on squashing of bears--is this definitely working now? Fixed it for pushers but objects still seem to have problems. Ans: Was incorrect earlier about bears being squashable but not pushable--they actually are pushable. . Long Voyage requires that #DIE create EMPTY rather than restoring under-type. Will leave real lava in place of fake lava otherwise. General policy for #DIE might be configurable as an attribute? Or is it floor-dependent? Ans: #DIE definitely leaves behind a WHITE EMPTY regardless of context or ZZT/SZT. We use #DIE with under-tile restore by default most of the time; could set the behavior as empty-creating setting for OBJECT types only. . Need instant flag change cheat: -flag and +flag. . New config property: REENTRYMOVESTYPE. If set to 1, the original buggy "fake pickup" behavior for passages applies. Default is 0, which makes passages behave the same way as edge-navigation, which does not have "fake pickup." . New config property: SCORELIMIT. There really isn't a practical need to limit the score to the original hard ceiling of 32767, so ZZT Ultra has a default of 2 billion. ------------------------- Version 0.7: 26-Mar-2015 ------------------------- . Mouse Y-position is now relative to scroll interface move the red arrows, altering the link location that is triggered. . Mouse click on board when $PLAYERMODE is 1, 2, or 3 will result in smart nav. . Fixed scroll interface buttons; drawn with button once too far to the right. . Confirmation labels should place special "Yes" and "No" buttons below or to the side of the message, which are activate from the mouse. These go away (write original text and coloration when choice is picked). Will always choose below unless the confirmation message is displayed on line 25, in which case, it is placed to right. . Point-blank squash protection is preventing pushing even if normal pushing would work. Need to allow normal push to succeed. This only appears to happen when there is ONLY ONE squashable in the push direction, and if the square beyond is free. But the issue isn't manifested when the square beyond IS pushable. . Spacebar shoot direction should actually be last moved OR shot, not just shot. . When status elements are #CHANGE'd into non-stats, like gems, the color should match the stat, not the tile underneath, as long as non-stat is blocking. . Savegames are not saving zapped label state in program code. . #DONEDISPATCH for THUD message should re-instate the 32-command magic number. THUD or other messages delegated like this might block indefinitely otherwise. . Objects moving into teleporters should be prevented with TELOBJECT. . Completed regression testing on _underscore labels and globals to $dollar; prevent general world namespace pollution. . MacGyver ZZT timing fixed; #TRY turn usage now works. . Smiley locking system is messed up for Dr. Z. Fixed THUD message delay. ------------------------- Version 0.6: 16-Mar-2015 ------------------------- . Rare coincidental type #CHANGE/#PUT bug fixed . Blinking (color attribute bit 7) . GUI labels respond to mouse-over and click events. . Super ZZT scroll interface needs to be smaller-width, repositioned, and 40-col. . Bind and zap/restore target labels now only read target's name up to space. . Figure out what to do with black passage nav; not always ignored. One note: passages can still look "black" and have slightly different base attributes. For example, in KevEdit, low-intensity and high-intensity passages are drawn the same color, but they might not lead to the same destinations. The trick is that KevEdit and ZZT force the color to be conventional FG=15, while other editors can allow for unconventional FG+BG combinations. What we could do is have the #CHANGE-oriented color scheme resemble one of the base 8-15 colors, while the passage also tracks an "internal" color attribute for display purposes. This is one useful end-run around the originally ponderous passage-color-matching code, since it appears to take all 8 bits of the attribute together when searching for a valid destination. . Noted that passage same-board nav had been iterated according to teletype fashion. But this isn't the case for ZZT--the actual iteration order appears to favor rightmost before bottommost (not unlike Kroz-style level setup). . Elis_h_1 has an odd chained "#if not tarini if contact c" code line. The implication here is that false command conditions should go to next line immediately, and end parsing on the spot. If more than one command, or a complex command, exists as the conditional portion, it adds up to possibly more than one command that must be skipped at once, rather than the relatively simple "ignore one" convention used by ZZT Ultra now. Will need to engineer a "multiple skip" solution that will advance forward beyond a specific number of command bytes established earlier. This will also need to be taken into consideration when given reverse-engineering requirements. . Elis_h_1 relies upon no PLAYER instances existing on the title screen. Prevent ANY condition from identifying PLAYER in this case, because it should be MONITOR in the original engine. . Wayne's Adventures does not trigger block door opening in 1st door to left. The reason is that a direction is being provided, which, in theory, would move west, but it apparently means "go to label if it exists" otherwise...this is going to be problematic, because the direction is effectively aliased as a label. If no label can be found, presumably, it should simply move west as normal? Strangely enough, it appears ZZT generates an error with #(direction). ------------------------- Version 0.5: 11-Mar-2015 ------------------------- . #PUT restricts placement on bottom row of grid in ZZT (not SZT). Make configurable. . Restore behavior needed to respect a next-line alpha test, not just an after- label alpha test. It appears #RESTORE restores all labels, but DOES NOT restore a label (it early-outs) when it encounters displayed text on the line following the label it would restore. Note that it is still restores the label (and DOES NOT early out) if THE VERY FIRST label it restored had displayed text on the line following that label. It does not appear that the Roton source code completely indicates that this behavior would happen. The "next alpha" character, presumably used to catch EOL, somehow chains together the search with the text on the following line. . Debug menu "Options" needs to give user a set of "overrides" and "current" properties for use in tweaking games. . New "Console" interface from ZZT and SZT gameplay menu. . Smiley giant insect dies before it is shot; this requires POINTBLANKFIRING=0. . MacGyver ZZT stage 3-1 blows panels immediately; this requires POINTBLANKFIRING=0. ------------------------ Version 0.4: 3-Mar-2015 ------------------------ . Squash behavior is slightly different for pushers, stars, etc. compared with PLAYER. PLAYER can squash 100% of squashables, but others can only squash all but ONE. The behavior appears to "take pity" on the very first squashable item, causing the overall push operation to fail if only one squashable was found. Could modify the existing search behaviors in assessPushability to allow for "pity" factor. . PLAYER pushability should... . Work on rivers, floors, etc. even though normal terrains don't. . Automatically update camera and torch auras. . Player should regain movement ability if health restored following endgame, but with game speed-up unchanged . Edge-motion tests for all types: overall issue is that effect is not honored. The movement simply has the player move normally on top of type, not collecting, etc. . Pushables do not push; they block player . Forest is overwritten but not removed . #ENDGAME should let player get "unkilled" if health restored on same frame. . Passage/Duplicator instant teleport hack appears to cause player clone to move through teleporter if present. . Energizer doesn't give points when enemies collide with player . Duplicators containing enemies don't kill source when player on other side. . PLAYER clone behavior: define... . When the player attempts to move, a cloned player that is not blocked in the attempted move direction must "teleport" the real player to that direction, without actually moving the clone. If the cloned player is blocked, movement occurs normally. . When clone contacts a board edge, it should do nothing. . If cloned player would touch an OBJECT, the TOUCH message is handled. . Shooting should cause all clones to shoot in same direction, and each shot should decrement inventory. Can't shoot from clones if ammo exhausted. . ANY type of damage kills clones. #PUT and #CHANGE don't. . Fine-tuned duplicator timing . Slime timing at fastest speed much closer to original ZZT behavior . Intelligence: should be 10-90% seek chance range. . RUFFIAN resting time: 10%-90% chance of changing modes between still and moving. . Tigers and spinning guns seem to be shooting too often. . Allow showing of Super ZZT "I"=Introduction screen in temporary fashion. . "W" key works to change worlds when ZZT/Super ZZT title screen displayed; will only try to load worlds of the same format unless user backs out to debug menu. . Bombs should destroy gems. . Super ZZT #WALK has different behavior: it DOES allow objects to push content. . Spacebar should shoot in last move/shoot direction. . Proving Grounds has Dr. Bob's Hideout lions turning green and "multiplying." City of ZZT has similar problem with lions turning brown or black. The problem is "multiple status elements" for a board, which occurs when a board has multiple status elements "stacked" over a single square. Not sure why this only seems to be present with lions? Anyway, we should only respect singular status elements when loading a board, and "kill" the others if they are "stacked." . Cycle delays on startup are creating weird start/stop behavior for walk operations. Notable occasions are "fast-step" of initial walk of Guardian of the Key in Town, and failure of the back part of the rocket to follow the front in the Lost Forest battle against the Purple Land Squid. . Caves change of GEM to TIGER still leaves gems below the tigers! . 1:1 tests for enemy behavior when given DEMO.ZZT . Darby's Crazy Town has bad "#BIND VICE". I guess #BIND is entire line, not just kw. . Caves entryway-to-hell demon creates lions, but "black" centipede heads. . MacGyver ZZT is "locking" code without making it die or unlocking somehow. Applies to fireballs when bombed, commandos in challenge when they walk into walls, and buttons in challenges that fail to reset promptly. Cuprit could be that THUD message is not being handled with correct timing. If THUD is reached via a dispatch, lock behavior, for example, is ignored completely. Lock behavior should NOT be ignored with THUD. ------------------------- Version 0.3: 23-Feb-2015 ------------------------- . OBJECT types need to have IP set from virtual script position in code . OBJECT types need to have virtual bind ID honored in code . #BIND does not always work to create a working "carbon copy." . PUSHER does not move if step direction is idle. . #GO IDLE should block indefinitely. . Ensure "infinite number" of CW, CCW, etc. prefixes would work. . Impose flag limit with last-flag replacement . Gems shouldn't be destroyed by enemy-originated bullets. . Player move-to-own-bullet destruction steals a player's "one shot" away permanently for the board; needs to decrement counter when destroyed this way. . Should be able to squash BULLET type. . Centipedes have faulty inversion logic now; leaving a segment behind. . Super ZZT tigers on Stage 2 generating random errors when shot by friendly bullets? Issue seems to be consistent when comments are encountered (code 253). . Super ZZT has slightly different same-board passage nav: looks for last in sequence but IGNORES the passage of origin, allowing two-way destinations. . Proving Grounds pushers after door opened: should these move over FLOOR? . There is secondary FLOOR-copying algorithm in some circumstances: the presence of EMPTY, BOULDER, SLIDERNS, SLIDEREW in surrounding four directions automatically set the tile to EMPTY. . ZZT and Super ZZT should tweak key color collection from dark->light. . Super ZZT scrolls leaving behind EMPTY instead of under-ID. . Super ZZT "bears" are supposed to be "dragon-shaped" with character 235. . Adjacent-tile floor spreading upon pickup does not pick up -all- types; it only works with FLOOR types. Does not appear to work with web, water current, fake, etc. While the "under the player's type" strategy seems reasonable, it is not what SZT actually does. ------------------------- Version 0.2: 14-Feb-2015 ------------------------- . Show world name and game speed selection in ZZT title screen GUI . TRANSPORTER and PUSHER types should have CUSTOMDRAW; they have a delayed-direction establishment on the very first frame . Allow #(direct-mode command) for cheats . High harmonics during playback: eliminate by imposing simplest lowpass averaging filter. . Spawn-over code for #PUT, #CHANGE, etc. should retain status element members ONLY in the situation when the source and destination types are the SAME. In all other spawn contexts, the newly spawned type should get an idle step vector and all of P1, P2, and P3 set to zero. . Pushing is supposed to cause error when in idle direction. Ignore in ZZT Ultra. . #BECOME does not try to keep the existing SE attributes. . #PUT IDLE does not actually place anything. . Be quiet/Be noisy setting currently has no effect; make property internal . Super ZZT "hint" was being sent to @HINT instead of ALL. . Super ZZT "enter" message isn't sent following dam opening in Lost Forest . Super ZZT toast text is not properly broken down to two-line variants . Super ZZT toast text labels need to be longer horizontally . Super ZZT two-line label does not display messages correctly starting with $ . Super ZZT scrolls are not showing colors correctly when on non-black BG . MONSTER level 2 Grues not picking up on all six banana flags . ZZT and Super ZZT handle object death differently: . ZZT: Keep under-color if under-type is same as #BECOME'd type. . Super ZZT: Always use object's own color, not under-color. . Super ZZT ammo not giving correct amount per pickup; should be 10 instead of 5. . Super ZZT GUIs messed up: . Ammo, gems, score, etc. in wrong locations. . Hint key 'H' not performing #SEND HINT:HINT . Super ZZT camera control misses a few frames: item collection, pushing, etc. . Super ZZT camera control not set in destination when changing board . Many problems with code execution in Princely Conquests . Duplicators cause problems in generated status elements . #BECOME TIGER creates some odd issues, like ability to be "killed" without actually dying (sound plays, score awarded, but tiger fails to die). Still possible to kill tiger by ramming it. . Arziel causes errors during fight when he presses against a spiker (movement or shooting?). Seems to be a larger problem with remote- dispatched messages, which sometimes, but not always, causes errors. . #TAKE HEALTH isn't hitting alternative label during inventory awards . A RUFFIAN in the forest has similar "unkillable" issue; does not move. . Zap/Restore handling summary: . #restore x: Restores ALL 'x labels . #restore electro: Restores 'electro1 if 'electro1, 'electro2 exist. . #restore the: Actually restores label w/spaces 'The code here...; . Found that restoration has odd early-out behavior: all labels should be restored . Rule of thumb is: If number is on end, #restore only hits one label. If no number on end, restore hits all labels. . The command #ZAP ObjName:Label should work for targets. HOWEVER, it only is supposed to hit the object name once--not every instance that might bind it. The reason for this is global name buffer overwrite. Not sure if this should be reproduced too faithfully; just expected behavior is okay. . Strange "#" command logic Label matching appears to find "startswith" match, and it remains satisfied only if the character beyond the original length of keyword is NOT alpha or _. . #/w Works as if # is not there. . #######die: Same as #die. . #die-now: Same as #die. Parsing ends after non-KW apparently. . #yes: This heads to label yes; no ambiguity about partials/suffixes. . #eat pizza: Only honors stuff up to space (#eat). . #12: Toasts the number 12 . #######(what?): Shows (what?) . # lol: Navigates to :lol label defined with text "lol" . #send 3: Goes to a blank label (:) instead of :3. . #t11: Actually goes to t11 (not t1 if earlier?!!) . #die123die123: Entire command considered bad; triggers error. . # lol: Shows text "lol" if :lol label defined with text "lol" . #t1: This heads to label t12 if that appears before t11, t1, etc. . #t: This heads to label t2 if that appears before t1, t, etc. . #t123123: This heads to label t1231231 before t123123. . #######d(what?): Triggers an error (D is bad command) . # lol: Triggers error if : lol label defined . Strange #IF parsing handlers: . #if k 99 bottles of beer: Shows text, starting at 99 . #if not q then#shoot n: Shoots; parsing begins after "then" . #if then#shoot n: If no flag appears, "then" is assumed to be flag. . #if#shoot n: Shoots north, always. . #if 99 bottles of beer: Shows text, starting at 99, always. . #if not 99 bottles of beer: Never shows anything. . #if #k: Navigates to :k label, always. . #if not a !t;Take a lolly: Acts as text link. . Strange character setting: . #char 3 2: Should be fine; expression stops after end. . #char -3: Does nothing. . /i#char 4: Changes character after a moment. Should be fine. ------------------------ Version 0.1: 4-Feb-2015 ------------------------ . "Save World" feature . Non-text statement no longer stops text display . "Magic number" of 32 is used to stop infinite execution when the commands ENDGAME, CHAR, CYCLE, CLEAR, SET, GIVE, TAKE, IF, LOCK, UNLOCK, ZAP, RESTORE, PLAY, RESTART, SEND, SENDTONAME, PUT, and CHANGE appear. . Player shots at point-blank range now deduct from AMMO . OBJECT types appear to linger before they set a #CYCLE value; should force the delay to 2 no matter what the starting cycle is, ignoring implied delay upon load . Improve cycle staggering. Tentative formula online took into account the object number: 0 == (mainTick + objNum) % cycle. Approximate object number via bumping up a virtual delay counter with each new SE created, which is always modded by cycle before being set. . Implement staggered-delay start for status element creation at board init . Policy for when multiple status elements point to a single square: erase old . Repair status element errors (type w/requirements but no status element for board) . Impose status element limits (player doesn't count in 150 in ZZT, so it's 151. . Super ZZT board-to-board scrolling was hitting wrong camera location . Implemented #ALL:ENERGIZE when energizer collected . Reworked ENERGIZED to not act as a condition and not a global variable . Line and web drawing needed to treat board edge as a valid join-tile . Status element counts as valid join-tile if UNDERID is also web . Conveyor timing is REALLY slow--improve using #SWITCHVALUE and #OFFSETBYDIR command. . Create SWITCHTYPE statement and code variants . Overall improvement in label-finding algorithm: . For non-custom code, during compilation, have a separate set of label-jump-to items, which allow for type-specific look-up of indexed array of destination locations in code when label must be found. . To distinguish between a jump to an indexed array and an ordinary jump from custom code, have the "string" label pointer indicate a negative value. . #GIVE and #TAKE need to keep going even if inventory isn't recognized (can't be error). . Super ZZT status element colors were corrupted . Super ZZT river movement had problems . ZZT title screen was corrupted after exiting from game . Super ZZT player Y-position started 6-7 spots above actual grid position . New command needed for inhibitting display temporarily (#SUSPENDDISPLAY) . Dark rooms: torch logic and drawing . Show all information in ZZT game GUI . Sometimes player's pause event does not show character (.CHAR remains zero) . PASSAGE navigation should replace the PASSAGE type after the PLAYER moves off it . New type attribute to support: FullColor. This makes an object take an entire color with it when it moves (not just FG color). . Cheats (requires #TEXTENTRY): . +/-dark . ammo . gems . health . torches . time . z . keys . zap . Have just "dark" do "+dark" . light . Change "time" to subtract 30 from time . score . kill (kills player) . Fixed overall pushing system . Teleportation: fixed . Point-blank behavior for bullets completely established . Problems with >= 16 empty color for .UNDERCOLOR; remove BG if empty . Doors, forest, etc. with >= 16 color creating non-black BG empties . Scroll link messages broken when originating from OBJECT . Scroll links not erasing properly on right-hand side . "BLOCKEDAT" #IF clause . Super ZZT forest sound effect navigation . Game speed was not resetting to normal after player death . Implement stack-related commands . Toast messages had a frame delay before flashing for first time (should have none) . Bombs: implemented . Blink walls: implemented . Duplicators: implemented . Centipede inversion fixed . #CLONE copies all status element properties, but should not copy MYID . #CHANGE needs to inherit status element P1, P2, P3, STEPX, STEPY, UNDERID, UNDERCOLOR, and all extras . Edge-navigation implements SCROLLTOVISUALS instead of DISSOLVEVIEWPORT . Fixed strange color issue with player when dissolving to new location . Board grid info not being saved during a board change event . "Game over" sound should not occur with #ENDGAME; only when player's life depleted . Stop playback when starting or ending a game for a world . Create command to perform simultaneous eval for drawing line, web, etc. . Support arrays in ZZT-OOP (all arrays are global): . #SET (name[expr]) Expr: Sets array element to expression . #SET LValue (name[expr]): Sets LValue to array element . #SETARRAY name size: sets global "name" to an array of size "size" . #PUSHARRAY name Expr: Pushes Expr on to end of array . #POPARRAY name LValue: Pops off last element of array ------------------------------------------------ Original Version released in December 2014: 0.0 ------------------------------------------------