============================================================================= | | | Jet Set Willy: The Nightmare Edition | | | | developed 2015-16 by Jet Set Willy and Manic Miner Community | | | | jswmm.co.uk | | | ============================================================================= "Jet Set Willy: The Nightmare Edition" is a redesign of Matthew Smith's classic game "Jet Set Willy". It can be played on a real Spectrum (if you manage to transfer it to tape or load it directly into the machine) or on a computer, game console or another device using a ZX Spectrum emulator. ---------------------------------------------------------------------- I. Game History The project aiming to create a new, enhanced version of "Jet Set Willy" was launched by Spider (Andy Ford) on 26th October 2015 in the Contributor Lounge of the Jet Set Willy and Manic Miner Community (jswmm.co.uk). The founding idea was to have a new JSW build, using the existing 48K engine, "with a few minor tweaks to platforms and the like". The plan was also to have 256 items to collect and to locate them in interesting places. The project exploded in the following weeks, when several other Contributors joined in and launched an avalanche of ideas and suggestions for the new build. By the time "The Nightmare Edition" was ready for release on 26th January 2016, over 2000 posts related to it had been published. More than 100 working builds of the game were created, as well as various minor revisions and numerous working files related to the loader and loading screens. The general ethos of "The Nightmare Edition" was to work within Willy's original mansion, whilst maximising the difficulty of Matthew Smith's classic rooms. However, a few extra screens have been added, in the main inspired by the mythology surrounding the game (e.g. the notion of a 'hidden' Room 47, or the rumour that if Willy hung around on the yacht for long enough he would sail away to a desert island!). Another notable feature of "The Nightmare Edition" is that all the unused graphics that were designed by Matthew Smith back in 1984, but which remained buried in the original JSW game engine (as documented in SkoolKid's disassembly), have been recycled and placed throughout the layout. The name "Nightmare Edition", suggested by Ian Rushforth, was adopted at some point along the way to reflect the increased difficulty of the game and the devious puzzles designed to make the player suffer. The game contains a substantial number of changes, including technical novelties such as different tunes in various areas of Willy's mansion, and a suitably nightmarish font style! Unlike in the original, the time limit is a serious factor. The team of Contributors have worked hard together to convert their enthusiasm for "JSW" into a final product both enjoyable and challenging to the members of the wider ZX Spectrum community. The end result optimises the potential of Matthew Smith's original game layout, somehow managing to be both reassuringly familiar whilst at the same time fiendishly difficult - all within the 48K game engine! ---------------------------------------------------------------------- II. Credits and Thanks 1. General credits Matthew Smith should be credited first and foremost for creating the original "Jet Set Willy" and leaving the code unencrypted, which made it possible for others to introduce modifications into the game. Needless to say, most of "The Nightmare Edition" is, in fact, Matthew's work. "Jet Set Willy: The Nightmare Edition" was created by Andy Ford (Spider), Daniel Gromann (jetsetdanny), Ian Rushforth (IRF) and Stuart Brady (Zub). Andrew Broad's comprehensive JSW-related documentation was used extensively during the creation of the game. Dr Broad also provided some detailed technical comments during the creation process. Moreover, his "Lord of the Dance" coded in the JSW48 format was used as one of the in-game tunes. John Elliott's excellent "JSW Editor" ("JSWED" - http://www.seasip.info/Jsw/jswed.html) was the main tool used to create "The Nightmare Edition". John also provided a patch which fixed Willy's starting position, and his teleport overlay was used, too. Furthermore, his JSW-related documentation was helpful during the creation process. 2. Technical modifications and innovations Detailed Technical Notes are appended at the end of this document. Andy Ford's "JSW 2015 Bug Fixed Edition" (http://jswmm.co.uk/topic/76-new-jsw-2015-bug-fixed-edition/) was used as a starting point for the project. It eliminates a number of bugs present in the original 1984 release. Richard Dymond (SkoolKid)'s complete JSW disassembly (http://skoolkit.ca/disassemblies/jet_set_willy/) was instrumental in the creation and implementation of various technical novelties introduced in "The Nightmare Edition". Jonathan Graham Harston's extension of the JSW48 game engine which allows more rooms was applied (http://mdfs.net/Software/JSW/JGH/). Stuart Brady is the author of the patch which eliminated the bug in the original JSW game engine that corrupted the conveyors in "West of Kitchen", "The Nightmare Room", "The Wine Cellar" and "Tool Shed". (N.B. This bug arose whenever the attribute byte of a cell type coincided with the byte value of a row of pixels within a preceding cell type. Stuart's patch is a generic 'graphics bug fix', applied to the game engine, rather than a 'work-around' applied to the specificaly corrupted game data. As such, on top of its known beneficial effects in fixing the aforementioned conveyors, it has no doubt prevented other, unforeseeable 'graphics bugs' from arising once the authors began to alter the game's layout, cell attributes and pixel patterns.) A further fix was devised by Ian Rushforth which has fully restored the intended graphics (pixel pattern and colour scheme) of both the ramp and the conveyor cells in "The Nightmare Room". As a result both the ramp and conveyor graphics in that room are now, in all probability, as Matthew Smith originally intended. Stuart Brady is also the author of the patch which prevents Maria from extending her arm when Willy jumps in "Master Bedroom" whilst he is away from the ramp. John Elliott is the author of the teleport overlay and of the patch which makes Willy's starting position always fixed (in the original "JSW" Willy's animation frame and the direction he is facing at the start of a game are whatever they were when he died in the previous game). John's own notes and Andrew Broad's "Technical Notes on Jet Set Willy: The Lord Of The Rings" were instrumental in manually adding and editing the teleporters. Daniel Gromann is the author of the following technical novelties: setting the in-game tune individually by room, changing Willy's colour after collecting all the items and at the beginning and end of the toilet run, changing the colour of the time and item count displays at certain points in the game, doubling the in-game clock's speed (this was done implementing a concept previously expressed by Stuart Brady), reversing the item count (implementing an idea conceived by Andy Ford), altering the flying pig's animation in "The Nightmare Room" (an idea conceived by Ian Rushforth), terminating the game at noon (a deadline suggested by Ian Rushforth), having two separate Game Over screens (one for losing all lives, the other for running out of time) with the corresponding additional text screens and the animation of the clock on the "Time Up!!" screen, and the final message when the game has been completed. Andy Ford was responsible for introducing a new font into the game and extending Willy's 'death throes' when he loses a life. Geoff Eddy's changes to the original JSW code which animate the items by eight colours (like in "JSW II") were used as well as his "nice fuzzy border effect", which enriched John Elliott's teleport routine. Furthermore, Geoff's documentation related to Geoff mode was useful during the work on various technical aspects of "The Nightmare Edition". The idea of displaying the room names one row lower than in the original was put forward by Ian Rushforth and implemented by Andy Ford. Extensive and painstaking consolidation of the game code was carried out by Daniel Gromann (identifying and utilising virtually all the previously unused bytes), which allowed all of the aforementioned features to be packed into the available 48 KB. "BinaryHexConverter" (http://www.binaryhexconverter.com/) was the standard tool used to convert values back and forth between the decimal and hexadecimal systems. 3. Rooms There are two rooms ("The Belfry" and "Deserted Isle") which are renditions of rooms from "Jet Set Willy II: The Final Frontier" by Derrick P. Rowson (1985). There is one room ("April Showers") which is a rendition of the room of the same name written by Dave Nichols (as Room 47 in "Jet Set Willy: April the 1st Edition") and published by Your Spectrum in Issue 13 (April 1985). "Hornet's Nest" was designed jointly by Andy Ford, Daniel Gromann and Ian Rushforth. The name of the room was inspired by Stuart J. Hill's room "Wasp's Nest", whose screenshot was published on the Manic Miner & Jet Set Willy Yahoo! Group back in 2000 (https://groups.yahoo.com/neo/groups/manicminerandjetsetwilly/conversations/messages/1460). And finally... Room 47 of "The Nightmare Edition" was designed by Ian Rushforth. 4. Sprites The Quasimodo and ringing bell guardian sprites (as seen in "The Belfry") were copied from "Jet Set Willy II: The Final Frontier" by Derrick P. Rowson (1985). The new guardian sprites (the hornet, the bad apple, the alarm clock, the alarm clock bells, the storm cloud/lightning and SID the Spider) were designed by Ian Rushforth. The 'bad apple' was adapted from the original collectable item graphic in the Watch Tower. The pixel pattern of the alarm clock was initially inspired by a sprite by the DrUnKeN mAsTeR from his game "The F***ed Internet Resurrection", from the room "TIIIIIIMMME!!! Is on my side....". Every room in the game now has at least one fire cell and (with the exception of "Master Bedroom") at least one collectable item. To achieve this, unused fire cells and items originally designed by Matthew Smith (and previously buried in the game engine) were inserted, whilst elsewhere new fire cell/item pixel patterns were created by Ian Rushforth, Andy Ford and Daniel Gromann. 5. Music The game features four tunes. Besides the original tunes from "Jet Set Willy" ("If I Were a Rich Man") and "Manic Miner" ("In the Hall of the Mountain King", used also in "Jet Set Willy II: The Final Frontier"), both coded by Matthew Smith, there are also: "Lord of the Dance" coded by Andrew Broad (first released as an Easter egg in his 2004 game "Party Willy") and "Radetzky March" coded by Richard Hallas (first used by Philip Bee in his 1998 game "Jet-Set Willy Ivy"). Richard Hallas's document "A Miner Triad. Music in Jet-Set Willy and both versions of Manic Miner" (http://hallas.net/Software/music.htm) was instrumental in managing the music. Andrew Broad's trick described in "Technical Notes on Jet Set Willy: The Lord Of The Rings", which introduced playing as different characters, inspired the use of Offset 237 of each room to specify the tune (although the rest of the solution is different from Andrew's method). 6. Font The font was copied from "20 Character Set Fonts" (also known as "Character Set Collection") by K. Maddocks (Sigmasoft, 1985). Andrew Broad's "Technical Notes" on his 2002 game "Goodnite Luddite" were helpful in implementing the new font in "The Nightmare Edition". 7. Loader and loading screens Both the loader and the loading screens were designed by Andy Ford. "ZX Modules ZX-Paintbrush" by Claus Jahn (http://www.zx-modules.de/) was a useful tool in this process along with his "ZX Modules ZX-Block Editor". The loading screen was created using the aforementioned ZX-Paintbrush to import it from an inlay scan and then suitably tweaked to suit the Spectrum's display capability. 8. Emulation and playtesting Jonathan Needle's "Spectaculator" (http://www.spectaculator.com/), "ZX Spin" (http://www.zophar.net/sinclair/zx-spin.html) and Jan Bobrowski's "Qaop/JS" HTML5 ZX Spectrum emulator (http://torinak.com/qaop) were the main tools used to playtest "The Nightmare Edition". Daniel Gromann carried out comprehensive playtesting of the game at various stages of development and before the final release. ---------------------------------------------------------------------- III. Game Formats The game is released as a .tap and a .tzx file. The actual game code is the same in both files, only the loaders are different. The .tap file can be loaded both into a 48K and a 128K Spectrum (real or emulated). The .tzx file can be loaded into a 48K Spectrum or a 128K Spectrum in 48K mode. ---------------------------------------------------------------------- IV. Instructions The object of the game is to guide a hungover Willy around his mansion, 'tidying up' all of the 256 flashing items that have been strewn about the place during an all-night party, whilst avoiding the moving and unmoving guardians and the stationary nasties (the so-called fire cells) which may kill you (as will falling from an excessive height). With all the items collected the player needs to go to "Master Bedroom" where Maria will no longer be blocking access to Willy's bed. This has to be done before the in-game clock reaches high noon, or before Willy runs out of 'lives'. Use O-left, P-right (or a combination of keys from the top row of letters) and SPACE or any of the letters from the bottom row to jump. A-G pauses the game, H-ENTER unpauses it and also toggles the music on/off. ---------------------------------------------------------------------- V. The Legal Bit All of the new elements introduced in "The Nightmare Edition" which were designed during its creation (rooms, sprites and code) can be reused in other projects. If you do so, please acknowledge their authorship, as described above in point II. ---------------------------------------------------------------------- VI. Final Remarks Please join us on the Jet Set Willy and Manic Miner Community at jswmm.co.uk!!! Let us know what you think about "The Nightmare Edition" over there, or by e-mail at projects@jswmm.co.uk. Do let us know you have tried it even without any specific comments - the biggest gratification and encouragement for anyone designing free games is to know that someone else has played them! "Jet Set Willy: The Nightmare Edition" can be completed without losing a single life. The game has been playtested extensively and is believed to be bug-free. However, if you find any problems, please report them to us. Please visit also JSW Central at jswcentral.org. Enjoy "The Nightmare Edition"!!! JSWMM.co.uk Team, 26th January 2016 ---------------------------------------------------------------------- TECHNICAL NOTES The technical notes below describe the distribution of the major changes applied in "Jet Set Willy: The Nightmare Edition". All addresses are in Hex. 8141 - 81FF Formerly: Unused. Currently: 8141 - 8180 Tune data: "In the Hall of the Mountain King" (from "Manic Miner" and "Jet Set Willy II") 817D - 81BC Tune data: "Lord of the Dance" coded by Andrew Broad. Four bytes are shared between the first and the second tune, being the ending of the former and the beginning of the latter. 81BD - 81FC Tune data: "Radetzky March" coded by Richard Hallas. 81FD - 81FF "TNE" 8416 – 841F Formerly: Code which read through addresses 8500-FFFF, without changing their contents, introducing a pause of about 0.47s before displaying the code entry screen. Currently: Game makers' initials. 858B - 85CA Formerly: Security (password) messages. Currently: 858B - 85C7 Part of the original code which prepares the screen at the start of the game, relocated from 8813 - 8843 and enhanced (jump from 8822). 85C8 - 85CA Makes the program jump to 8844, where it continues with the original code which prepares the screen at the start of the game. 85E5 - 85FA Formerly: WRITETYPER cheat data. Currently: 85E5 - 85F4 "CONGRATULATIONS!" 85F5 - 85F8 "GAME" 85F9 - 85FA 2 spare bytes. 869F - 86FF Formerly: Beginning of the security (password) code. Currently: 869F – 86B3 Attributes for "The Nightmare Edition" on the title and Final screens. 86B4 – 86FD John Elliott's teleport routine (called from 8BA3). 86FE - 86FF 2 spares bytes. 8700 - 87C9 Formerly: Security (password) code. Currently: 8700 - 874A Subroutine which creates a part of both the "Game Over" Final Screen and the "Time Up!!" Final Screen (called from 973D). 874B – 8779 Routine which checks if Willy has reached the toilet, relocated from 9584 - 9599 (called from 89E6) plus additional code defining the colour of the toilet, printing part of the "Game completed!" message and calling the subroutine at 8BA9 to print the rest of it. 877A - 877B 2 spare bytes. 877C – 879B "Press ENTER to restart the game!" 879C – 87B4 "You have run out of time!" 87B5 – 87C9 "The Nightmare Edition" 8813 - 8843 Formerly: Part of the code which prepares the screen at the start of the game. Currently: 8813 - 8817 Code which sets Willy's colour at the start of the game. 8818 - 8821 Code which sets the colour of the toilet at the start of the game. 8822 - 8824 Makes the program jump to 858B, where a part of the original code which prepares the screen at the start of the game has been relocated. 8825 – 8841 "You have lost all your lives!" 8842 - 8843 2 spare bytes. 8915 The value of this address was changed to EE, which allowed the game engine to use 7-bit room numbers instead of 6-bit ones. 896C The value of this address was changed to 20, which allowed the room names to be displayed one row lower than in the original edition of the game. 8A0B - 8AAA Formerly: 8A0B - 8A25 Code which checks the screen flash counter and decrements it (the latter part was never executed). 8A26 - 8AAA Code which deals with the clock. Currently: 8A0B - 8A0C Jump to 8A1D. 8A0D - 8A1C Part of the code which creates the "Time Up!!" Game Over screen (called from 9B27). 8A1D - 8AAA Original routine which deals with the clock, partly modified and enhanced with extra code which doubles its speed, ends the game at noon and calls subroutines at A7F7 and 8D1C to change the colour of the time display to bright yellow and bright red at 11.31 and 11.51, respectively. 8AE1 - 8C00 Formerly: 8AE1 - 8AEA Part of the pause loop which checks whether WRITETYPER has been keyed yet. 8AEB - 8B06 Routine which cycles the INK and PAPER colours. 8B07 - 8B3B Part of the main loop (2), the last part of which toggles the in-game music. 8B3C - 8B6F Part of the main loop (2) which plays a note of the in-game music. 8B70 - 8C00 WRITETYPER cheat code. Currently: 8AE1 - 8AE5 End of the pause loop (from which the WRITETYPER check has been eliminated). 8AE6 - 8B01 Routine which cycles the INK and PAPER colours. 8B02 - 8B37 Part of the main loop (2), the last part of which toggles the in-game music. 8B38 - 8BA8 Modified code which plays a note of the in-game music, linking the tune to Offset 237 of each room. 8BA9 - 8BC1 Subroutine which prints two parts of the "Game completed!" message, called from 8776. 8BC2 - 8BFF Routine which plays the music and waits for ENTER to be pressed on the "Game Over" Final Screen and the "Time Up!!" Final Screen (called from 9740). 8C00 1 spare byte. 8C33 - 8C49 Formerly: Part of the routine dealing with loss of life. Currently: 8C33 - 8C35 Jump to A7E0. 8C36 - 8C49 Part of the code which creates both the "Game Over" Game Over screen and the "Time Up!!" Game Over screen (jump from 9B81), ending with a jump to 9B85. 8C4A - 8D32 Formerly: Routine displaying the "Game Over" sequence. Currently: 8C4A - 8C9F Code setting up parameters for creating the "Time Up!!" Game Over screen, ending with a jump to 9B00. 8CA0 – 8CD9 Code setting up parameters for creating the "Game Over" Game Over screen, ending with a jump to 9B00. 8CDA – 8CEC Geoff Eddy's fuzzy border effect routine (called from the teleporter routine at 86E8). 8CED - 8D06 Extended code which deals with when all items have been collected - the original code which updates the game mode indicator (previously at 9427 - 942B) plus new code which changes Willy's colour to yellow and the items remaining display colour to flashing bright blue. 8D07 - 8D11 Part of the code which creates the "Game Over" Game Over screen (jump from 9B2A). 8D12 - 8D1B "COMPLETED!" 8D1C - 8D24 Routine which changes the time display colour to bright red at 11.51 by setting up the parameters and then calling the routine at 8D25. 8D25 - 8D32 Routine which changes the time display colour (called from 8D21 and A7FC). 93BB - 93D0 Formerly: Unused routine. Currently: 93BB - 93C4 Gfxsearch routine, part of Stuart Brady's fix for the Cell Graphics Bug. 93C5 - 93CA Part of Stuart Brady's fix for Maria. 93CB - 93D0 "12:00p" 9427 - 942B Formerly: Code which updates the game mode indicator when all items are collected. Currently: 9427 - 9429 Calls 8CED. 942A - 942B 2 spare bytes. 9584 - 9599 Formerly: Routine which checks if Willy has reached the toilet. Currently: 9584 - 9588 Extended code which updates the game mode indicator to 2 when Willy is running to the toilet, changing Willy's colour to green. 9589 - 9599 "Remember, this is" 9692 The value of this address was changed to 15, which allowed the game engine to use the custom font located at AD00 - AFFF. 96F4 - 97FF Formerly: Unused reset code. Currently: 96F4 - 9710 Teleporter data (used by 86B9 - 86BA). 9711 - 971D Part of the code which creates both the "Game Over" Final Screen and the "Time Up!!" Final Screen (jump from 9BF1). 972D - 972C Part of the code which creates the "Time Up!!" Final Screen. 972D - 9739 Part of the code which creates the "Game Over" Final Screen. 973A - 9745 Part of the code which creates both the "Game Over" Final Screen and the "Time Up!!" Final Screen. 9746 - 977D Code which animates the clock on the "Time Up!!" Game Over screen (called from 9B7A). 977E - 977F 2 spare bytes. 9780 - 97FF Sprites - SID the Spider. 9B00 - 9BFF Formerly: Spites and attributes for password entry. Currently: 9B00 - 9BE5 Code which creates both the "Game Over" Game Over screen and the "Time Up!!" Game Over screen. 9BE6 - 9BF3 Beginning of the code which creates both the "Game Over" Final Screen and the "Time Up!!" Final Screen, ending with a jump to 9711. 9BF4 - 9BFE John Elliott's routine which fixes Willy's starting position (called from 87F5). 9BFF 1 spare byte. 9C00 - 9C3F Formerly: Assembler source-code. Currently: Sprites - the alarm clock (later phases). 9E00 - 9EFF Formerly: Password codes (data). Currently: 9E00 - 9E7F Sprites - Quasimodo. 9E80 - 9EFF Sprites - The Belfry bell. 9F00 - 9FFF Formerly: Unused. Currently: Room 095 ("Desert Isle") data; within it, at 9FF1 - 9FF4 "Up!!". A680 - AAFF Formerly: Unused. Currently: A680 – A6FF Sprites - the alarm clock (early phases), and oscillating alarm bells. A700 – A71F Sprite – the cloud. A720 – A73F Sprite – blank (makes the cloud flicker). A740 – A77F Sprites - "First Landing" cross. A780 – A79F Sprite - the short lightning. A7A0 - A7BF Sprite - the bad apple. A7C0 – A7DF Sprite - the long lightning. A7E0 - A7F6 Part of the routine dealing with loss of life, relocated from 8C33 - 8C49. A7F7 - A7FF Routine which changes the time display colour to bright yellow at 11.31 by setting up the parameters and then calling the routine at 8D25. A800 - AAFF Formerly: Unused. Currently: Original sprites relocated from AD00 - AFFF. AD00 - AFFF Formerly: Sprites. Currently: Font data. B300 – B3FF Formerly: Unused. Currently: Sprites - the hornet.