================================================ | Willy's New Mansion | | | | by Daniel Gromann | | | | (www.jswcentral.org) | | | | Original Edition 2004 | | | | Special Edition 2016 | ================================================ "Willy's New Mansion" Special 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 load it into the machine), on the Sinclair ZX Spectrum Vega/Vega+ or on a computer, game console or another device using a ZX Spectrum emulator. ---------------------------------------------------------------------- SPOILER WARNING! This document contains information which may spoil your pleasure of discovering the game and its surprises. On the other hand, it may be useful to help you solve the mysteries and meet the challenges of Willy's New Mansion. ---------------------------------------------------------------------- Contents I. Abbreviations used in this document II. Acknowledgements and thanks III. Instructions IV. The story V. Game history and background information VI. The Original Edition VII. The Special Edition VIII. Room descriptions and credits IX. Technical notes 1. More than 64 rooms 2. In-game tune set individually in each room 3. No deterioration of the in-game tune when lives are lost 4. The colour of arrows set individually in each room 5. Global Seamlessness of the screen 6. Items animated by eight colours 7. Guardian Aura Bug Fix 8. Cell Graphics Bug Fix 9. Doubled speed of the in-game clock 10. Time running out at noon 11. Time display changing colour when noon draws near 12. Room names displayed one row lower than in the original "JSW" 13. Optimised code which draws ropes 14. Optimised Game Over sequence 15. Two Game Over screens and two Final Screens 16. Teleportation 17. Willy's "death throes" extended when he loses a life 18. Extensions to the code after Willy has collected the last item and at the beginning and end of the toilet run 19. Customised check related to Maria 20. Patch Vectors 20.1 General info 20.2 Geoff Eddy's PVs 20.3 Daniel Gromann's PVs 20.4 Ian Rushforth's PVs 20.5 Daniel Gromann and Ian Rushforth's PVs 21. Memory layout X. Internet links XI. The legal bit XII. Final remarks ---------------------------------------------------------------------- I. Abbreviations used in this document "JSW" refers to the original "Jet Set Willy" by Matthew Smith (Software Projects, 1984) and "MM" - to the original "Manic Miner" by Matthew Smith (Bug-Byte, 1983); these abbreviations are also used without quotation marks to refer to games using the respective game engines. "WNM" refers to "Willy's New Mansion". OE refers to the Original Edition of "Willy's New Mansion" (2004). SE refers to the Special Edition of "Willy's New Mansion" (2016). "WNM SE" refers to the Special Edition of "Willy's New Mansion" (2016). "JSW: TNE" refers to "Jet Set Willy: The Nightmare Edition" (2016). JSW48 game engine refers to the 48K game engine used by the original "JSW" (as distinct from the 128K JSW game engines developed by John Elliott, known as JSW128 and JSW64). PV refers to a Main Loop patch vector, a subroutine called from the Main Loop in order to produce some special effect(s) in the room in which it is called, first introduced by Geoff Eddy. IDS refers to an infinite-death scenario – an in-game situation in which Willy gets killed repeatedly until running out of lives (or: infinitely, if an immortality POKE has been applied). ---------------------------------------------------------------------- II. Acknowledgements and thanks I would like to express my gratitude to: - Matthew Smith, for the original "JSW". - John Elliott, for his: - excellent JSW Editor (JSWED, http://www.seasip.info/Jsw/jswed.html), which was the main tool I used to create the game, both the OE (v. 2.0.3) and the SE (v. 2.3.7); - teleport overlay; - adjacent ropes patch; - help with the code which makes sure that Willy's direction and sprite frame is always the same at the start of the game; - JSW-related documentation which was very helpful during the creation process. - Richard Hallas, for his: - kindly allowing me to use some of the sprites from his classic JSW remake "Join The Jet-Set!"; - "Radetzky March" coded in the JSW48 format, which is used as one of the in-game tunes; - document "A Miner Triad. Music in Jet-Set Willy and both versions of Manic Miner" (http://hallas.net/Software/music.htm), which was instrumental (no pun intended) in managing the music. - Adam Britton, for kindly allowing me to use a sprite from his three JSW remakes: "The Continuing Adventures SE", "Willy's Holiday" and "The Deadly Mission". - Andrew Broad, for his: - "Lord of the Dance" coded in the JSW48 format, which is used as one of the in-game tunes; - comprehensive JSW-related documentation which was used extensively during the creation of the game; - longstanding contribution to the development of MM and JSW games for the ZX Spectrum. - Geoff Eddy, for his: - PVs, many of which have been used in "WNM SE", and their comprehensive documentation, which allowed their modification and tailoring to the needs of "WNM SE" and inspired the creation of new PVs; - "nice fuzzy border effect", which enriched John Elliott's teleport routine and was used in some of the newly-created PVs; - optimised code which draws ropes; - changes to the original JSW code which animate the items by eight colours. - Ian Rushforth (IRF) and Andy Ford (Spider) for their: - serious involvement with the project - almost 1500 private messages concerning "WNM SE" were exchanged among the three of us on the messenger system at jswmm.co.uk by the time of the game's release; - prioritising "WNM SE" over the other projects they were working on together, in particular "Jet Set Mini". - Ian Rushforth (IRF), for his: - Guardian Aura Bug Fix; - Screen Flash effect triggered by Willy jumping PV; - Intermittent Fire Cell PV; - Fix to prevent Willy from getting stuck after falling from "Above the Front Door" PV; - trick of doubling the speed of the in-game tune; - co-authorship of some of the technical novelties introduced into the game engine (especially the Global Seamlessness routine, and setting the in-game tune and the colour of the arrows individually in each room); - co-authorship of several PVs applied in the game, in particular the ones related to colour-changing arrows, the Swooshing Arrow & Flashing Border/Status Bar Effect, the Arrow-Induced Fuzzy Border Effect and the colouring of cells; - help on and contribution to various technical issues (such as integrating Stuart Brady's Cell Graphics Bug Fix into the Main Loop, using the Occupied Room Screen Buffer in some PVs and providing fixes for various problems which arose during the creation of the game); - identifying unused space and numerous suggestions for code optimisation, which allowed me to introduce a significant number of additional elements in "WNM SE" beyond what I had planned; - relentless encouragement to use the available space to the very last byte; - various suggestions for improvement concerning sprites, room layout and technical issues; - proofreading of this Readme file and significant contribution to its contents with numerous suggestions and, in some cases, entire portions of the text; - complete playtesting of the game and providing an RZX recording of the playtest, resulting in some suggestions for eliminating imperfections. Ian deserves special, exceptional thanks for his deep, meticulous, proactive, time-consuming and wonderfully efficient involvement with this project. The final shape of the game would not be what it is without Ian's multiple contributions! - Andy Ford (Spider), for his: - extremely helpful suggestions on creating the BASIC loader and the final TAP and TZX files; - making the game Sinclair ZX Spectrum Vega-ready by creating (with some input from Ian Rushforth) a ZXK file to map the Vega control buttons to the ZX Spectrum keys used by the game; - technical input into "JSW: TNE" (such as extending Willy's "death throes" when he loses a life, displaying the room names one row lower than in the original, etc. carried over into "WNM SE"; - playtesting of the game, including on "real hardware" - the 48K Spectrum with Kempston interface (Ram Turbo) - and on the Sinclair ZX Spectrum Vega console, and proofreading of this Readme file; - creation and maintenance of the friendly JetSet Willy & Manic Miner Community (http://jswmm.co.uk), which is now the focal point for everyone interested in the subject. - Jonathan Graham Harston, for his extension of the JSW48 game engine which allows more than 64 rooms (http://mdfs.net/Software/JSW/JGH/). - Stuart Brady (Zub) for his Cell Graphics Bug Fix and for some conceptual assistance in doubling the in-game clock's speed. - Richard Dymond (SkoolKid), for his complete JSW disassembly (http://skoolkid.github.io/jetsetwilly/ in hexadecimal and http://skoolkit.ca/disassemblies/jet_set_willy/ in decimal), which was absolutely instrumental in the creation and implementation of various technical novelties introduced in "WNM SE" as well as shifting and optimisation of the code, and also very helpful in creating the disassemblies of new code in section IX below. - Claus Jahn, for his ZX-Modules (http://www.zx-modules.de), particularly ZX-Blockeditor, which I used to create the final TAP and TZX files of the game, and ZX-Paintbrush, which I used during the creation of the loading screen. - Leszek Chmielewski, for his BMP2SCR 2.11, which was an essential tool in the creation of the loading screen. - Sendy (Alex Cornhill) and Igor Makovsky for sending me some comments about the OE after it was released, which I took into consideration when creating the SE. - Vaggelis Kapartzianis, for his zx32 Spectrum Emulator 2.00 (http://www.oocities.org/zx32home/), which I used to test the OE. - Jonathan Needle, for his Spectaculator (http://www.spectaculator.com), which I used to test the SE. - The ZX Spin team, for their ZX Spin (http://www.zophar.net/sinclair/zx-spin.html), which Ian Rushforth and I used to test the SE. - Jan Bobrowski, for his Qaop/JS HTML5 ZX Spectrum emulator, which Ian Rushforth used to test the SE. - The authors of Binary Hex Converter (http://www.binaryhexconverter.com/) which was the standard tool Ian Rushforth and I used to convert values back and forth between the decimal, binary and hexadecimal systems. - My parents, who back in 1986 bought me my first computer - a Spectrum- compatible Timex 48K - in a special hard currency store for $130, at a time when a monthly salary in my native Poland under communist regime averaged $30. - My wife Margaret, for help with the title screen picture in the SE and for her patience during the long hours I spent designing both editions of the game. - My children: Michael, who is 14, and Anna, who is 4, who are a great source of joy and inspiration for me and TO WHOM I DEDICATE "WNM SE". - Xabier Vázquez, for hosting my JSW website "JSW Corner" since December 2004. - All authors of JSW/MM games and all members of the JSW/MM community, wherever you may be, for sharing the interest in and fascination for Miner Willy and his weird little worlds :-). ---------------------------------------------------------------------- III. Instructions The object of the game is to guide Willy and collect all of the flashing items scattered around his New Mansion and its surroundings, avoiding the moving and unmoving guardians and the stationary nasties which may kill you (as will falling from an excessive height). With all the items collected, the player needs to go to "The Cosy Upstairs 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/RETURN unpauses it (as do the movement keys) and also toggles the music ON/OFF. Poke 35899,0 will *not* give you infinite lives in "WNM SE". You can find an infinite lives POKE yourself, or it may surface on the web at some point. However, saving and reloading snapshots on an emulator or using the Rollback feature is both a more effective and elegant way to complete the game. "WNM SE" is not recognised as a JSW game when loaded into JSWED; only the Hex editor is available. Modifying some bytes and resaving the game can allow it to be recognised properly after being reloaded into JSWED. If you are interested in making "WNM SE" JSWEDitable and cannot figure out yourself what needs to be done, please contact me at jetsetdanny@yahoo.com and I will supply you with the necessary know-how. ---------------------------------------------------------------------- IV. The story Twenty years have passed since Willy first stepped into his mansion and realised he had to clean it before Maria would let him enter the bedroom. He has gone through countless adventures over those 20 years: he travelled extensively, went to space, fought vampires, computer bugs and the powers of darkness, got drunk, kept dying and coming to life again, and collected millions of items flickering mysteriously. In the end, he decided to get some rest. He bought a new mansion, with some elements eerily reminiscent of his original house, and looked forward to a few happy hours in his cosy upstairs bedroom. Alas, Maria is in his way again, ordering him to clean up the mansion before high noon! And so poor Willy has to collect 256 items scattered around the 66 screens of the house and its surroundings. Can he count on your help? ---------------------------------------------------------------------- V. Game history and background information I became a proud owner of a Spectrum-compatible Timex computer back in 1986. "JSW" was one of the first (if not *the* first) games I ever loaded into it, and I fell in love with it right from the beginning. I still had fond memories of the countless hours I had spent playing both parts of "JSW" long after I had stopped using my Timex altogether. I was blissfully ignorant of the existence of ZX Spectrum emulators for PC computers until 2001. Then I suddenly became interested in the subject, for no apparent reason, and I also discovered and downloaded the already numerous fan-made MM and JSW games. I had a brief look at them, arranged convenient shortcuts to them in my Windows start menu with the intention to play them at some point, but then, after reformatting the HDD, I let them slip into oblivion again. At the beginning of 2004, after another reinstallation of my operating system (Windows 98 SE, back then), I fired up John Elliott's JSWED v. 2.0.3 and played around with it for a while, designing a room which later became "Jump'n'Jive". And then I started working on another room, and then another, until I realised I wasn't getting enough sleep and I was definitely neglecting my family... And then I knew I wanted to finish and release my first JSW game. As a point of curiosity, in real-world terms, the OE was created in Havana, Cuba, where I lived and worked at the time. "Willy's New Mansion" was released on 10th November 2004 and announced in message 4593 on the Manic Miner & Jet Set Willy Yahoo! Group (https://groups.yahoo.com/neo/groups/manicminerandjetsetwilly/conversations/messages/4593), of which I then became an active member. In the following years I completed a number of other JSW projects. I created games of which I am a co-author: "Jet Set Willy: The 2005 Megamix" (2005), "Jet Set Willy: Mind Control" (2005), "Willy's Hoard" (2006) and "JSW: The 2010 Megamix" (2010). I also created, with their respective authors' permission, the Special Edition of "Willy vs The Vampire Lord" and the Final Edition of "Jet Set Emily: Baby On The Go", I recorded walkthroughs of numerous MM and JSW games for RZX Archive (http://www.rzxarchive.co.uk) and I took part in various other activities on the MM/JSW scene. In 2005 I used graphical elements, sprites and design patterns from "WNM" in various rooms of "Jet Set Willy: The 2005 Megamix". "Dynamite Dan would love this" inspired "The Arrival - Dyn Dan Style", "Entrance to the Cellar" inspired "The Lair of the Diagonal Monster", "The Underground Pantry" inspired "Under the Cave Mouth" and "Willy's Private Fort Knox" inspired "In the Freezer!!!". Later on two more rooms from "WNM" contributed to "JSW: The 2010 Megamix": "Willy's Personal Hideout" was one of the inspirations for "Homo erectus" and "Copin' with Ropin'" was remade as "Problem Roping? Use Some Doping!". In 2005 Willy's New Mansion became the starting point for the story behind "Jet Set Willy: Mind Control": "While basking in the sun in his New Mansion, Willy was suddenly abducted by aliens. They carried him to an unknown planet and marooned him there, with a headband fixed firmly on his head with a chip in its rear part, which served to monitor his movements and control his mind functions. (...) Can you help him, so that he can fly back to his New Mansion and free his mind, getting rid of the alien headband?" I used graphical elements, sprites and design patterns from "WNM" in various rooms of "Jet Set Willy: Mind Control". "Upper Balcony" was remade as "Climbing up the Castle Tower" and "The Cellar" was remade as "Scary Dungeon". Furthermore, the initial room of "WNM" became the final room of "Jet Set Willy: Mind Control" - after a successful toilet run (which in that game is a flight through outer space in a flying saucer), Willy lands on the ramp in his New Mansion and throws his hands up in triumph. In 2006 I redesigned "Rocky Road to Double Inn" as "The Lost Highway" in "Willy's Hoard". One sprite and a couple of cell graphics from "WNM" were also used in that game. I first announced the intention to create a SE of "WNM" on 22nd March 2006 in message 5737 on the Manic Miner & Jet Set Willy Yahoo! Group (https://groups.yahoo.com/neo/groups/manicminerandjetsetwilly/conversations/messages/5737). In a discussion about the merits (or lack thereof) of Special Editions of games, I expressed the opinion that "there are many good things about SEs being released" and I mentioned five possible reasons to create them. --- 1. One can eliminate all bugs and problems and offer the MM/JSW community a better, and in many cases completable game at last. (...) A SE is a good occasion to eliminate non-critical bugs as well. For example, in "Willy's New Mansion" there are a number of instances where vertical guardians have their starting position set to 0, or another value which is above their upper boundary. This makes them "jump" at the moment of entering the room, appearing for a split second at the top of the screen and then moving instantaneously to their upper boundary. I believe now that it is very inelegant, and I will eliminate it in the SE. But at the time of creating "Willy's New Mansion" I wasn't aware of the phenomenon. {2016 comment: I always thought that this vertical guardian "jump" was seen both in JSWED and during actual playing of the game, until Ian Rushforth called my attention to the fact that it is *only* seen in JSWED's Graphical User Interface, because within the game guardians are moved when Willy first enters a room, *before* they are first drawn. Nevertheless, this issue has been corrected in "WNM SE", as well as possibly the biggest weakness of the OE – various IDSes, many of them clearly unfair.} 2. One can enrich the game with elements / features which were not introduced from the beginning because at the time of creating the original edition the author didn't know about them or didn't know how to introduce them. In the SE of "Willy's New Mansion", for example, I am planning to introduce new music (probably not /really/ new, but copied from some other game, perhaps the original "MM"). I wouldn't have known how to do it back in 2004 when I created the game; now I think I know and I would like to make use of it. {2016 comment: Not only has the tune from "MM" been introduced into "WNM SE", but a whole new arrangement has been made with the in-game tune being set individually in each room, so that the game uses four proper in-game tunes plus one "quasi-tune". Many other new elements have been introduced in the SE; they are listed below in section VII.} 3. One can enrich the game with elements which were not introduced from the beginning because the original game engine did not allow it. That will be a common case with SEs of older games released as JSW64, I believe. {2016 comment: This does not apply to "WNM SE" in the sense of it using a different game engine - the SE still uses the JSW48 game engine, albeit with various enhancements.} 4. One can make full use of the possibilities offered by the original game engine. {2016 comment: The original game engine has been enhanced in "WNM SE" in various ways and the available memory has been used up virtually to the last byte.} 5. One can generally improve the game by improving graphics, guardian movement, adding new rooms, etc. {2016 comment: Room graphics and guardian sprites have been improved in "WNM SE" in the few cases where I felt improvement was really necessary. Two new rooms have been added to the game.} --- I reiterated the intention to create a SE of "WNM" on the Manic Miner & Jet Set Willy Yahoo! Group in messages: 5849 (30th May 2006), 5892 (12th August 2006; I called it "my firm commitment") and 6086 (9th March 2007; I mentioned the possibility of adding a loading screen). In April 2007 I had a brief go at starting the creation of "WNM SE" using the Softricks variant of the JSW48 game engine (with a double-length guardian class table and hence twice as many guardian classes as in the original "JSW"), but I abandoned the project at a very early stage of development. In 2010 I mentioned the SE of "WNM" - "which I yet have to create" - in the Readme accompanying "JSW: The 2010 Megamix", listing it among "the products which I would like to be remembered in the future as my contribution to the MM/JSW scene". In March 2015 I became a member of JetSet Willy & Manic Miner Community (http://jswmm.co.uk), a vibrant forum created by Andy Ford a few months earlier. In October 2015 a collaboration project got under way over there, which three months later resulted in the release of "JSW: TNE", a remix of the original "JSW" meant to be both reassuringly familiar and fiendishly difficult (http://jswmm.co.uk/topic/161-file-jet-set-willy-the-nightmare-edition/). I created a number of technical novelties for that project, never before applied in JSW games, such as setting the in-game tune individually in each 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, reversing the item count, terminating the game at noon, having two separate Game Over screens (one for losing all lives, the other for running out of time) with the corresponding additional Final text screens, and the final message printed when the game has been completed. Some of these novelties were created implementing suggestions or concepts expressed by the other members of the JSWMM.co.uk Team involved in this project (namely, Andy Ford [Spider] and Ian Rushforth [IRF] - please see the Readme file which accompanies "JSW: TNE" for details). The work on the code of "JSW: TNE" inspired me to start creating the SE of "WNM". I set off on this task just before Christmas 2015 and continued intense work on it in the following months. Meanwhile, in mid-April 2015, I started work on another project, a multiple-choice quiz relating to MM and JSW games for the ZX Spectrum created between 1983 and 2013, using the JSW64 V game engine and called "Willy Games: The First 30 Years Quiz". I stopped working on it in December 2015, after reaching a certain stage of development and also encountering some technical problems (which John Elliott kindly helped me solve afterwards), and focused on "WNM SE" from that time on. My work on "Willy Games: The First 30 Years Quiz" produced a synergy with the development of "WNM SE", by inspiring the use of PVs which print things on the screen in the latter, and by introducing two separate Game Over screens (one for losing all lives, the other for running out of time) with the corresponding additional Final text screens in the former. Furthermore, when I restarted work on "Willy Games: The First 30 Years Quiz" in September 2016, I worked out a way to animate the decorative guardian on the Final screens, a solution which I then introduced also in "WNM SE". The first Release Candidate of "WNM SE" was ready in April 2016. Ian Rushforth made a very significant contribution to the development of the game in the months that followed, pointing to various areas of unused code, suggesting possibilities for further byte-saving optimisations, offering ready-made solutions for optimising the code and adding new elements and helping to solve various problems which arose. His input made it possible to introduce many additional PVs and some other features into the game, the last ones as late as the end of October 2016. In real-world terms, the SE was created in Warsaw, Poland (my home town), with some work done on holidays on the island of Madeira and in Novi Vinodolski, Croatia. Ian Rushforth worked on his contributions in Liverpool in the UK (Matthew Smith's home town - where it all began!), and Andy Ford playtested "WNM SE" on real hardware in Derby, also in the UK. "WNM SE" was released on 10th November 2016, twelve years to the day since the release of the OE. ---------------------------------------------------------------------- VI. The Original Edition My goal when creating the OE was to design a brand-new game that would keep the flavour and atmosphere of the original "JSW". Therefore, most of the sprites I used as well as a number of graphical elements visible in the room and item design were taken from Matthew Smith's original. I added three of my favourite sprites from Richard Hallas's game "Join The Jet-Set!" (the fish, the sun and the waggling joystick) and one sprite from Adam Britton's JSW games (most visible in "JSW: The Continuing Adventures SE", in "WNM" first encountered on the lower right-hand side of "West Wing Bedroom" or on the conveyor in "Entrance to the Cellar"), plus some sprites of my own design. The game was guardian-intensive, which I hoped would give it some liveliness with the continuous movement. It had a generally logical layout, with some exceptions. The OE was not extremely difficult, but it had some challenging moments that required precise positioning and good timing. It was meant to be enjoyable to play for everybody. Generally speaking, it did not use tricks related to the quirky features of the game engine (with some exceptions). The original goal was to create a game space that would be welcoming to the player, giving them a feeling that they were at home, that it was their mansion, rather than discourage the player from the very first moment by confronting them with hosts of insurmountable difficulties. The OE was released in TAP and SNA formats. The original ZIP, including also a text-based and a picture-based maps of the game and the original Readme, is included in the release of the SE. The OE can be completed without losing a single life. An RZX recording of a walkthrough made by Robin Clive has been hosted on RZX Archive since 25th November 2005 (http://www.rzxarchive.co.uk/j.php#jswmansion). ---------------------------------------------------------------------- VII. The Special Edition The general ethos of my work on the SE was not to take anything away from the OE, only to add to it. Therefore, the SE is everything that the OE was, and MUCH more. The SE features the following improvements over the OE: - All unfair IDSes and many other IDSes (which could be considered fair for various reasons) have been eliminated. - Strong indications of where the player can / should or cannot / should not go have been introduced in places where IDSes are still a threat (such as e.g. in the Great Descent cluster of rooms). - My own insect sprites have been improved (the vertical one features a modified version first introduced in "Jet Set Willy: Mind Control"; the horizontal one has been designed from scratch for the SE). - Small modifications have been applied to room layouts, cell patterns and item distribution, both for aesthetic and functional reasons. Furthermore, the SE features a lot of things the OE does not have, including some absolute technical novelties: - The game has two additional rooms (66 in total, i.e. 10% more than in the original "JSW"). - The game has a custom BASIC loader which allows the player to choose the time challenge level, and a loading screen. - The game has an "advanced" title screen. - The game features teleportation. - The in-game tune is set individually in each room and the game features four proper in-game tunes and one "quasi-tune" (a portion of the title-screen tune being played by the in-game tune routine). - The colour of the arrows is set individually in each room. The game features arrows of different colours and shapes (from "traditional" thin arrows with a "point and feathers" pixel pattern either side, to solid colour blocks), including arrows changing colour in mid-flight or changing colour depending on which side of the room Willy is on. - The game features a "Global Seamlessness" of the screens: the PAPER colour of the top two thirds of the screen (the playing area), the lower third (the status bar) and the border is the same in all rooms. - Time is a real factor which may prevent the player from completing the game successfully (unlike in the original "JSW" or the OE). This is because the in-game clock's speed has been doubled and the game ends at noon. The player has to choose the time challenge level after the game has loaded. "Easy" sets the starting time to 4:00 am, "Medium" to 5:00 am, "Hard" to 6:00 am and "Expert" to 7:00 am. Even the "Easy" level provides more of a time constraint than in the OE or the original "JSW"! - There are two separate Game Over screens: one for losing all lives, the other one for running out of time. - There is an additional Final Screen after each of the two Game Over screens, with an appropriate text message, an animated decorative guardian and some music. - PVs are applied in EVERY SINGLE ROOM of the game (a historical first), producing a lot of interesting and, in many cases, never-before-seen effects beyond what the standard JSW48 game engine supports. Some of the PVs are copied from Geoff Eddy's games, some come from his games but have been modified, and many are brand-new ones, created especially for "WNM SE". The effects produced by the new PVs include: various Flashing Screen, Coloured Screen, sound and border effects, various kinds of messages (signboards) and guardians printed on the screen, the flickering of the "HELLO!" sign on the initial screen, Shimmering Willy, Willy's Colour Changed on Entrance to the Room, Time Trap, Swooshing Arrow & Flashing Border/Status Bar effect, Intermittent Fire Cell and the change of the in-game tune in mid-room. The effects produced by Geoff Eddy's PVs include: changes of Willy's colour, changes of the colour of one or more guardians, harmful or harmless squares flying across the screen, a moving platform which can carry Willy over obstacles, periodic reversal of the direction of the conveyor, gaps opening in walls, ramps going in both directions and the glimmering of some parts of the room. - Willy's colour changes after the last item has been collected and also at the beginning and end of the toilet run. - The colour of the time display changes from green to yellow and then to red as high noon draws near. - The colour of the number of items collected display changes after the last item has been collected. - A Game Completed message is printed on the screen and the in-game tune starts playing at double speed once the game has been completed. There are very few things present in the OE which have disappeared from the SE: The Writetyper cheat has been dismantled and the space it occupied in memory, including all code related to it, has been used for other things. This is because the game is not supposed to be completed using any cheats. The code related to the inactivity timer present in the OE and in the original "JSW" has also been eliminated. One sprite (Richard Hallas's waggling joystick) has been removed in order to make room for other things. It only made a few appearances in the OE, in environments where it did not seem to be (with the benefit of hindsight) very suitable thematically. The SE is somewhat more difficult than the OE. It is still far away from the most difficult games of the genre, though, and it is meant to be enjoyable to most players. The SE is released as a TAP and a TZX file. The actual game code is the same in both files. The relation between the OE and the SE is the same as between "JSW: The 2005 Megamix" and "JSW: The 2010 Megamix" – the latter is a complete, final product, while the former is - from today's perspective - a halfway product only (although it may not have looked that way at the time of its release, since it is, in each case, a finished and fully completable game). The OE and the SE are *not* two different games and they should not be listed as such. My preference is that "WNM SE" should be listed only – as the final product - with historical info about the OE. The original ZIP of the OE is included in the ZIP file of the SE so that there is no need to host the OE separately any more. I would encourage everyone interested who has not played the game yet to play just the SE, as the final, complete revision of the game. ---------------------------------------------------------------------- VIII. Room descriptions and credits The list is ordered by technical room numbers. Since the colour setup of the lower third of the in-game screen (the status bar) has been modified and the border colour has been changed in most rooms, every screen in the SE is different from its counterpart in the OE in these areas. Therefore, any comments below concerning visual changes between the OE and the SE (or lack thereof) refer to the upper two thirds of the in-game screen only (the playing area). The SE takes advantage of the property of the game engine which makes Willy always bright in rooms where the Air cells' INK is bright, and always non-bright where the Air cells' INK is non-bright. It also uses the way the Air's INK colour affects Willy's colour (the one that is actually displayed) if Willy is non-white. One of the differences between a room in the OE and the SE may be, therefore, that Willy is non-bright white in the OE and, for example, bright magenta in the SE in that particular room. These differences may not be discussed in detail in the descriptions below. 00. In the Forest The room features sprites from the original "JSW" and a "moving tree trunk" sprite which is, in fact, the assembler source code residing at #9C00 - #9C3F in the original "JSW". I used it for the tree sprite in the OE. While working on the SE, I thought I would modify the code to make it "meaningful" (e.g. a PV routine) while still serving as the tree sprite. However, I could not find any code which I would like as the tree sprite equally to the original, so in the end – in order not to take anything of value away from the OE - I left the old assembler code in the game. The room is visually almost unchanged from the OE. A one-cell ramp, looking almost identical to the Fire cells, has been introduced to confuse the player when they try to collect one of the items. Four items have been removed to be used elsewhere. A modified version of Geoff Eddy's PV originally applied in the room "Willy gets some 3D glasses" (45) in "Willy the Hacker" makes the rightmost guardian change colour continuously. 01. In the Backwoods The room is a companion to "In the Forest" and shares various elements of the description above (concerning the guardians, little visual change in relation to the OE and a new, harmless ramp looking almost identical to the Fire cells). The only other change introduced was opening an exit to the right rather than downwards in the right hand corner, due to a change in the game map's layout. A PV of my design based on the Screen Flash code (unused in the original "JSW", where it resides at #8A11 – #8A25) makes the screen go green from time to time – a colour appropriate for a deep forest. After the release of the OE I was asked if the two forest rooms had been inspired by the room "The Old Forest" (05) from Andrew Broad's "Jet Set Willy: The Lord of the Rings". I answered truthfully that they had not, because I had not played "JSW: LOTR" before the release of "WNM". In fact, I played it later and it was my introduction to the fascinating world of the quirky features of the game engine. 02. At the Edge of the Forest The room, featuring classic guardian sprites from the original "JSW", has been modified slightly in the SE in order to intimidate the player: the PV applied in this room draws a dummy guardian which seems to block the player's passage (this happens depending on Willy's y-coordinate) and a conveyor looking like a Fire cell seems to be protecting one of the items. Meanwhile, the real Fire cells, representing stars, have been redesigned to look better. 03. The River of No Return The room is named after the 1954 western movie starring Robert Mitchum and Marilyn Monroe. The name reflects the fact that the player can only cross it in one direction. Its visual aspect has been modified in the SE slightly, and its gameplay – significantly. The room is much more challenging now than in the OE. Geoff Eddy's PV originally applied in the room "The Network Port" (21) in his game "ZX Willy the Bug Slayer" makes it possible to have two ramps in the room going in opposite directions. In fact, they are Water-conveyor-ramps thanks to setting the same attributes for Water, conveyor and ramp cells. They use the pixel pattern defined for Water cells, which has been carefully selected, so that their form sits well, visually, in ramps that slope in either direction, and so that they do not display any visible conveyor animation. Two bright red arrows have been added, increasing the challenge. As a result, the first rightwards jump underneath Esmerelda (probably a Water Maiden in this case) is one of the most challenging in the whole game. Moreover, the newly-added item, whose shape was copied from the room "The Tabernacle" (00) from Adban de Corcy's game "Willy's Afterlife" (v. 2.00), can only be collected without loss of life whilst traversing leftwards through the room. The left side of the room has been modified in order to eliminate possible IDSes when jumping in from "The Meadow". The room combines sprites from the original "JSW" with Richard Hallas's fish (whose movement has been improved thanks to Ian Rushforth's suggestions) and sun. The Fire cells (representing the water in the river) and the Earth cells come from the original "JSW". 04. The Meadow Small changes have been introduced in relation to the OE, mainly aimed at making the room fairer to the player. Four green arrows, including two of a kind not seen in the OE, spice the room up a little bit. A PV of my design based on the use of the routine which produces sound and border effects when the title-screen message is scrolling causes a disconcerting reaction when the player is jumping in the upper part of the playing area. The first signs of a summer storm approaching, perhaps? 05. The Back Door The "storm clouds" have been edited and the item distribution modified so that it is now necessary for the player to visit the top of the lowest cloud (which is a harmless off conveyor). Furthermore, the room now features an improved vertical insect's sprite (in addition to classic sprites from the original "JSW") and has a PV which draws a dummy barrier and prints the initials of "Willy's New Mansion" on the wall. The door is more door-like in the SE, too. Furthermore, two newly-added yellow arrows increase the difficulty level. 06. Abandoned Subterranean Passage The room, now featuring two items, has been spiced up with four bright white arrows and a conveyor which is located in a place not particularly convenient to the player. Richard Hallas's fish's movement is improved in relation to the OE thanks to Ian Rushforth's suggestions. A PV of my design draws a dummy guardian seemingly blocking the right exit (which only appears when Willy is in the right half of the screen) and a mysterious date on the old brick wall. "1884" – wasn't that a hundred years before Willy purchased his first mansion...? 07. The Single Item Cave In the SE this room can only be accessed after all items have been collected in "Maths Lab". Geoff Eddy's PV, originally applied in the rooms "Phew, That Was Lucky!" (11) and "The Arches of Despair, I fear" (18) in his game "Willy Takes a Trip", reverses the direction of the conveyor every 32 ticks. A PV of my design prints a dummy guardian which does not show all the time – the rule for when it shows and when it does not may not be immediately obvious to the player. Two bright cyan arrows have been added to increase the difficulty level a little bit. Thanks to Stuart Brady's Cell Graphics Bug Fix, the conveyor now looks as it was originally designed (in the OE it is affected by the bug). 08. The Mammoth Cave The room is almost unchanged in the SE in relation to the OE. Geoff Eddy's PV originally applied in the room "but no sympathy" (53) in his game "Willy Takes a Trip", appropriately modified, makes it possible to access the right hand side of the room only after all items have been collected in "Maths Lab". In response to some criticism after the release of the OE, the vertical guardians on the lower left do not transmogrify any more. 09. Jump'n'Jive This was the very first JSW room I ever designed, on the evening of 10th March 2004. In the SE it is very close to its original shape, apart from the starting position of the green vertical guardians (modified in order to minimize the possibility of an IDS when jumping into this room from the right) and the use of Geoff Eddy's PV originally applied in "The Room of Stippled Blocks" (09) in his game "Willy Takes a Trip", which sends two killer squares flying across the screen. The PV, modified to make the squares red in this room (to be precise: bright magenta INK on red PAPER, so they colour magenta the pixels of the guardians or Water cells they pass over), increases the difficulty level significantly. 10. Out on the Balcony The room's Air was bright in the OE in order to prevent the effects of the Guardian Aura Bug. It has been reverted to non-bright in the SE (following the original design concept) thanks to Ian Rushforth's fix which eliminated the bug. An additional Fire cell prevents the player from a possibly unfair IDS which occurred when stepping off the right edge of the lowermost platform. There are possibilities of other IDSes initiating in this room (by stepping off the other platforms floating in mid-air or missing a jump from one to another), but hopefully they are not too unfair, as the room's design should alert the player that they should be particularly careful here. A new item has been added in a place where it is not quite obvious as to how it can be collected. A PV of my design which draws a dummy guardian will hopefully confuse some players for a second or two, while the newly-added arrow (a black one – a first in JSW games, I believe!) may cause an occasional loss of life. The horizontal insect features a redesigned sprite. The room is a prime example of the Global Seamlessness of the screen. 11. The Observatory The towers, featuring my telescope sprites on top, have been redesigned slightly to improve their look. The telescopes do not have a halo around them any more, thanks to Ian Rushforth's Guardian Aura Bug Fix. A PV of my design which uses the routine that cycles the INK and PAPER colours produces a special effect when Willy rises above the base of the towers. A reflection of the changes constantly taking place in the universe? 12. Copin' with Ropin' Small design changes have been introduced in order to make this room fairer to the player: all downward exits (leading to IDSes) have been closed off, a platform has been introduced on the right to facilitate the transit to and from "Willy's Personal Hideout", the platform on the left has been moved one column to the right, and a Fire cell has been introduced at its edge to stop the player from walking off to the left, which would lead to an IDS. Furthermore, changes in the layout of stars in the upper part of the screen have diminished the number of possible IDSes when exiting "The Observatory" downwards. Five new arrows have been added (making six in total), increasing the difficulty of the room significantly. This was possible thanks to John Elliott's adjacent ropes patch (new), which allowed the two ropes to be placed next to each other in the guardian list, leaving six slots available for other guardians. A PV of my design using Geoff Eddy's "nice fuzzy border effect" routine will hopefully startle the player when they happen to be at one particular y-coordinate. "Copin' with Ropin'" was remade as "Problem Roping? Use Some Doping!" (212) in "Jet Set Willy: The 2010 Megamix", with the difficulty level increased significantly because of the challenge of ropes carrying the player into Fire cells. 13. Willy's Personal Hideout Two additional Fire cells prevent the player from suffering controversial IDSes which happen in the OE when stepping off any of the platforms. A PV of my design prints a four-part motivational message in the middle of the screen. Ian Rushforth's Shimmering Willy PV [Optimised] makes the protagonist shimmer in white and yellow. The sun no longer has a halo around it thanks to Ian Rushforth's Guardian Aura Bug Fix. Three newly-added magenta arrows increase the difficulty level of the room. In the SE, it is no longer possible to enter "Willy's Personal Hideout" from the right (which in the OE happens after jumping out of "Gateway to the Unknown" to the left). "Willy's Personal Hideout" was one of the inspirations for the creation of the room "Homo erectus" (178) in "Jet Set Willy: The 2010 Megamix". 14. The Great Descent Small changes have been introduced to make the room fairer to the player (by preventing some possible IDSes through the placement of Fire cells and marking with an item the spot where the player should exit the room downwards) and improve it visually (the design of the Fire cells). An additional item has been added on the right, forcing the player to climb the rooms which belong to the Great Descent cluster back up again (and thus, effectively, to do the descent twice). Two bright cyan arrows have been added to increase the difficulty level of this screen. Geoff Eddy's PV originally applied in the room "Holy Floor!" (46) in his game "Willy Takes a Trip" changes the colour of the bird depending on Willy's coordinates. 15. Into the Abyss Similarly to "The Great Descent", some changes have been introduced in order to make the room fairer to the player (by preventing some possible IDSes through the placement of Fire cells and marking with an item the spot where the player should exit the room downwards) and improve it visually (the design of the Fire cells). Three arrows have been added to increase the difficulty level of this screen. A PV designed by Ian Rushforth and myself makes the arrows alternate between red and yellow, every other tick. Part One of my Time Trap PV is applied here, registering the current time. After the player has successfully got out of the time trap, the clock will be reset to the time registered here. 16. On the Sun Deck The shape of the Fire cells has been modified to make them look like glasses (sunglasses in this case, presumably) and some changes have been introduced to the room design in order to diminish the number of possible IDSes when jumping into "The Cosy Upstairs Bedroom". My Shimmering Willy PV [Complex], combined with the setting of the Air's INK colour, makes the protagonist shimmer in white and yellow, which effectively means he is invisible half of the time, because the Air's PAPER is also yellow, so Willy blends in with the background when he is yellow. Ian Rushforth's Guardian Aura Bug Fix has eliminated the halo around the sun. The room is a prime example of the Global Seamlessness of the screen. The invisible conveyor present in the OE has been scrapped and the area below the right deckchair has now become Forbidden Holy Ground (a place which the player cannot ever access). Therefore, the two items which used to be there have been transferred elsewhere. However, a new interesting challenge has been introduced. When Willy exits "On the Sun Deck", he can emerge in the next room either white or yellow (with a 50% chance for either). However, he has to be white in order to be able to collect items. So when he jumps into "The Cosy Upstairs Bedroom" and turns out to be yellow, he cannot collect any items there and has to make a long detour through "On the Sun Deck", "The Reading Room", "Internet Cafe", "Maths Lab", "Internet Cafe" again and "The Reading Room" again in order to return to "On the Sun Deck" and repeat the jump into "The Cosy Upstairs Bedroom", hoping to emerge white on arrival there. This will put some additional strain on the player's time, and time *is* a factor in the SE. There is no guarantee, of course, that the second jump into "The Cosy Upstairs Bedroom" will result in Willy being white there. If it does not, and if that situation repeats several times, the resulting loss of time may indeed affect the player's ability to complete the game on time. Furthermore, the exit leftwards from "The Cosy Upstairs Bedroom" is now meant to be by just stepping out of the room (jumping out is possible from some positions, but can lead to an IDS easily), which makes the player drop down to "The Reading Room". Even when the player was white in "The Cosy Upstairs Bedroom", he may still emerge red at the top of "The Reading Room". In such case, he will have to go around through "Internet Cafe", "Maths Lab", "Internet Cafe" again and "The Reading Room" again in order to return to "On the Sun Deck" and (with a little luck) drop down from it white back into "The Reading Room" and resume his quest for items. This time-consuming exercise may cost him dearly, especially if the Expert or Hard level of the time challenge was chosen at the beginning of the game. It may not be a big deal when one plays on an emulator, saving and reloading snapshots or using the Rollback feature; however, facing these challenges on a real machine, with the in-game time ticking away mercilessly, must be very frustrating. 17. Entomological Research Station This screen is room 34 in the OE. It was swapped with "Gateway to the Unknown" as part of an optimisation involving teleporter data, which was later abandoned (but the rooms have not been reverted back to their original locations in the code). All insects in this room – from which this screen's name originates - feature improved sprites. The lower left corner of the room has been redesigned so as to make it part of the teleporter detour (using John Elliott's teleport overlay). One item has been relocated there. The lowermost guardian walks into the conveyor. However, this causes no problems as the conveyor's shape has been designed so that none of its pixels collide with any of the guardian's pixels. Two bright white arrows of a kind not seen in the OE have been added to increase the difficulty level of the room, with the associated Arrow-Induced Fuzzy Border Effect, brought about by a PV created by Ian Rushforth and myself. Another PV, of my design, prints the abbreviation of the room's name in the middle of it. The player can touch two of the letters safely, but the third one will kill them instantly... 18. Above the Abyss The central part of the screen at the ground level has been redesigned in order to prevent a very unfair IDS, which occurs in the OE when the player arrives in this room from the right and then just steps off the platform, having no reason to expect any danger. The waggling joystick has been replaced with a guardian from the original "JSW" (featured there, for example, on the floor of "The Bow"). A previously unused cell type – a (non-animated) conveyor – has been added, looking like a spike, in order to make the player hesitate for an instant before walking through it. A PV of my design based on the Screen Flash code (unused in the original "JSW", where it resides at #8A11 – #8A25) makes the screen go black and white from time to time for about three seconds and then flash ominously for about six seconds; perhaps it is a warning that a deep and dangerous chasm is awaiting the player below... The rock graphics from "Above the Abyss" and the Great Descent cluster of rooms were used in the rooms "But Willy'll be lucky, will he?" (012), "Source of the Underground River" (104), "The Underground River" (105), "Dangerous Rapids" (106) and "The Underground Waterfall" (107) in "Jet Set Willy: Mind Control", as well as in "Three Quirky Compartments" (46) in "Willy's Hoard". 19. Stairway (Starryway) to Heaven This screen is room 47 in the OE. It has been swapped with "The Cellar" so that the PV at #D3FB – #D400 can include the first byte of the data of the following room (at #D400, which conveniently happens to be #EA) to direct the continuation of the PV to the proper address. The lower left part of the screen, inaccessible in the OE, has been redesigned to make it part of the teleporter detour (which uses John Elliott's teleport overlay). One item has been relocated there. The number of stars on the screen has been reduced in comparison with the OE so as to avoid their excessive congestion. Two yellow arrows have been added to spice the room up. A double PV is applied in this room. Its first part, designed by Ian Rushforth, makes the screen flash whenever Willy jumps. The second part, of my design, prints a ghost on the ramp and a ghostly message which tells Willy which way to go (as if he needed it!). The ghost and the message are visible when Willy passes through them or when Ian's PV is in operation. 20. Dynamite Dan would love this! The room is a tribute to one of my favourite ZX Spectrum games (other than "MM" and "JSW") and, in particular, its second part. The zeppelin has been enlarged in comparison with the one from the OE by filling in the whole upper row of cells. Geoff Eddy's PV originally used in the room "3D PacVaders" (61) in his game "ZX Willy the Bug Slayer" makes most of them shimmer joyously. A PV of my design prints the address of JSW Central, my MM/JSW website, in the middle of the zeppelin if Willy is above a certain y-coordinate. When the sign is not printed, the space it otherwise occupies is blank (with a red background) when playing on a 48K machine. When playing on a 128K machine, however, when the sign is not printed, its space is occupied by an intricate pattern. This variation, due to the difference in the 48K and 128K ROMs at addresses #3C00 - #3C07 (corresponding to an ASCII code of #00), may be the first instance of the player's experience of a JSW48 game being visually different depending on whether it is played on a 48K or 128K machine! An exclamation mark has been added at the end of the room name in the SE, since it seemed appropriate. The design of the zeppelin from the OE was used in the opening room of "Jet Set Willy: The 2005 Megamix": "The Arrival - Dyn Dan style" (088 and 174), in "Jet Set Willy: The 2010 Megamix" called "The Arrival - Dyn Dan Style" (033 and 252). 21. Double Inn This remake of "The Off Licence" is enhanced in the SE, in relation to the OE, with a PV of my design which prints a signboard, a permanent dummy guardian and two dummy guardians in the form of vertical arrows which appear and disappear depending on the direction of the barrels' movement. The signboard appropriately doubles the room name on the screen, while the dummy guardians are meant to scare the player, being, in fact, totally harmless. The "flow of the items" (the way they flicker before they are collected, determined by their relative positions in the code) has been adjusted thanks to Ian Rushforth's suggestion. 22. Entrance to the Caves The general design of this room in the SE is almost unchanged in relation to the OE. An additional Fire cell makes it impossible to get onto the conveyor by jumping up from the top of the brick wall below it. An additional guardian is printed by a PV of my design – but this time it is not a dummy, it is lethal. Thanks to Stuart Brady's Cell Graphics Bug Fix, the conveyor now looks as it was originally designed (in the OE it is affected by the bug). 23. Cavernous Crossroads One of the items has been moved to a different location in the same room, creating an additional challenge. Some pertinent layout changes have been applied. The waggling joystick has been replaced with my shortened Macaroni Ted / periscope guardian. Geoff Eddy's PV originally applied in the room "Willy's Inner Sanctum" (16) in his game "J4 (The Fourth Remix)" makes it multicolour. Two bright cyan arrows have been added, raising the difficulty level of the room a little bit. 24. East Stairway In the OE, there is a loophole which allows the player to reach the three upper items by jumping through the ramp from the left, thus avoiding the difficult jumps necessary to pass the vertical guardians. This loophole has been closed in the SE. One of the two blocks of the platform between the vertical guardians has been turned into a conveyor, which has increased the challenge of this already difficult manoeuvre. A PV of my design prints a lethal guardian at the floor level. An Earth cell has been added to make it possible to jump over the guardian in both directions. However, it makes coming out of "Cavernous Crossroads" safely one of the particularly difficult moments in the game. 25. Main Hallway East The room features several minor layout changes in the SE. One item has been removed in order to be used elsewhere (which has not diminished the overall challenge of collecting the items in this room). One Fire cell has been removed for aesthetical reasons (with no functional change in the room layout), and one for functional reasons (to avoid an IDS when jumping in from "The Dining Hall"), while one has been added. Some minor readjustments of the platforms have also been applied in order to accommodate a dummy guardian, which is printed by a PV of my design if Willy is above a certain y-coordinate. The vertical insect features an improved sprite. A bright green arrow has been added at the floor level. It triggers the Swooshing Arrow & Flashing Border/Status Bar Effect, thanks to a PV designed by Ian Rushforth and myself. 26. Rocky Road to Double Inn The layout of this room – whose name is a tribute, based on a play on words, to the song "Rocky Road to Dublin" – is unchanged in the SE in comparison to the OE. Three items have been removed and one relocated within the same room, while the overall challenge involved in collecting the items in this room remains the same as in the OE. The design of the Fire cells has been modified, reflecting the change introduced in the Great Descent cluster of rooms. Contrary to the OE, the red ice cream guardian is bright in the SE. The change was applied thanks to Ian Rushforth's Guardian Aura Bug Fix – in the OE the guardian was made non-bright so that a guardian belonging to the same class did not have a halo around it in "A Room with a View". A PV of my design, based on the use of the routine which produces sound and border effects when the title-screen message is scrolling, spices the room up when the player is jumping in the upper part of the screen. Three arrows, including one of a kind not seen in the OE, have been added to increase the difficulty level of the room. A PV designed by Ian Rushforth and myself makes them alternate between red, magenta, green and cyan, changing colour every tick. "Rocky Road to Double Inn" was redesigned as "The Lost Highway" (41) in "Willy's Hoard". 27. Willy's Private Fort Knox Geoff Eddy's PV originally applied in the room "but no sympathy" (53) in his game "Willy Takes a Trip", appropriately modified, opens the way to the treasure trove after all items have been collected in "Maths Lab". The waggling joysticks at the lower level have been replaced with more ominous-looking guardians (including two of Adam Britton's design) and the colours of two guardians have been changed. Ian Rushforth's PV places an Intermittent Fire Cell in the player's way, both when going for the items and on the return trip. The challenge is actually greater on the way back. The PV also gives off a warning buzz, to remind the player of the security systems in place. On Ian's suggestion, the room has been enhanced with two more bright magenta security cameras (in additional to the original one present in the OE), which force the player to perform a couple of quirky jumps. An additional element of the PV "disguises" the Fire cells' attributes, to restore them back to their original colour, since creating the Intermittent Fire Cell necessitated a change to the Fire cell attribute value for this room. This screen inspired the creation of the room "In the Freezer!!!" (room 150 in "Jet Set Willy: The 2005 Megamix" and room 139 in "Jet Set Willy: The 2010 Megamix"). 28. The Reading Room This screen is room 40 in the OE. It has been swapped with "The Writetyping Office" ("The Old Writetyping Office" in the SE) in order to accommodate the "double items" effect satisfactorily. The room has been redesigned slightly in order to prevent unfair IDSes happening in the OE after entering from "Internet Cafe" or exiting to "The Cinema". Two items have been removed to be used elsewhere and the others have been redistributed (without affecting the overall challenge of collecting the items in this room). A PV of my design based on the Screen Flash code (unused in the original "JSW", where it resides at #8A11 – #8A25) makes the screen go yellow from time to time – a reflection of the intense sunlight pouring in from the screen above. 29. The Hypnotherapy Room Geoff Eddy's PV originally applied in the room "Weeds" (59) in his game "Willy Takes a Trip" makes Willy's colour change depending on his x-coordinate. The room has been redesigned to have all of the items on the far left, since Willy can only collect them when he is white. It is still necessary to cross both the upper and middle level from right to left. A jump through a so-called Innocent-Looking Block (ILB) is required to get down safely from the middle level to the lower one (it can be performed successfully from only one position). Composite Water-conveyor cells have been introduced in order to achieve the desired design. The horizontal guardian in the centre of the upper level has a different colour than in the OE. This screen features an exclusive in-game tune, which does not play in any other room in the game. Fittingly, it is an excerpt from the "Moonlight Sonata" - the in-game tune routine plays data which is normally played by the title-screen tune routine. 30. A Room with a View A PV of my design which draws a dummy wall will hopefully confuse some players for a moment or two. The insect of my design flying up and down outside the window features an improved sprite. The chandelier no longer has a halo around it thanks to Ian Rushforth's Guardian Aura Bug Fix. The room is a good example of the Global Seamlessness of the screen. The tree graphics from this room were used in some of the rooms in "Jet Set Willy: The 2005 Megamix" and "Jet Set Willy: The 2010 Megamix", namely in "First Landing" (room 152/034, respectively), "Second Landing" (090/035), "Among the Branches" (061/138 and 175/253) and "Branches You Don't Want to See" (254, present in the latter game only). 31. Emergency Exit on the Roof The room has been redesigned in order to prevent various kinds of IDSes which can arise in the OE when exiting leftwards or downwards or entering from the left. A PV of my design which uses the routine that cycles the INK and PAPER colours produces a very disconcerting effect when Willy is in the central part of the screen. Another PV of mine prints a signboard in the path of the guardian at the floor level. Following Ian Rushforth's advice, the PV uses the Occupied Room Screen Buffer (starting at #6000). As a result, the guardian passes through the sign without any collision, colouring it from behind on each pass. Previously unused cell types (Fire and ramp) have been added to the room. Two bright green arrows have also been added, increasing the difficulty level of this screen. The insect guardians now feature improved sprites. The design of the rope, the platforms onto which the player jumps from the rope and the related vertical guardians was repeated in the room "Yes! Willy's a lucky bastard!!!" (098) in "Jet Set Willy: Mind Control". 32. Upper Balcony The room is unmodified in the SE in relation to the OE except for the improved sprite of the insect guardian and a dummy guardian printed by a PV of my design. It appears when Willy is to the right of a certain x-coordinate. A modified version of this screen was included in "Jet Set Willy: Mind Control", as room 059 "Climbing up the Castle Tower". 33. The Multi-Toilet Bathroom The colour of the toilets has been changed to bright white, and the speed of the flapping of the "guardian toilets" has been doubled, to reflect the speed of the flapping of the "real toilet". A PV of my design using Geoff Eddy's "nice fuzzy border effect" routine kicks in when Willy is running to the toilet, making it a troubled toilet run, indeed. Once Willy has reached the toilet, his colour changes to bright cyan and the speed of the in-game tune doubles (thanks to a trick invented by Ian Rushforth), reflecting the painful crescendo of Willy's regurgitation. A Game Completed message is also printed, reassuring the player that this is really the end of the game. 34. Gateway to the Unknown This screen is room 17 in the OE. It has been swapped with "Entomological Research Station" as part of an optimisation involving teleporter data, which was later abandoned (but the rooms have not been reverted back to their original locations in the code). The room is virtually unchanged from the OE, with the exception of the improved movement of the fish (thanks to Ian Rushforth's advice) and the application of Part Three of my Time Trap PV. "The unknown" is unveiled in the SE in a different way than in the OE: as "The Temple of Passing Time", one of the two new rooms, rather than a shortcut to "Willy's Personal Hideout". The player has to pass through this screen twice: once to enter "The Temple of Passing Time" (and complete it), and once to climb back up again - this has to be done in order to collect the newly-added item in "The Great Descent". 35. The Cosy Upstairs Bedroom The distribution of the items in this room has been modified. A PV of my design draws a dummy guardian, making it seemingly impossible to collect the item placed between it and the wall. Maria's colour has been changed to a fiery red, while the pillow is not bright any more. The bed is now an off conveyor, which eliminates Willy's getting seemingly stuck on it if he jumped onto it after all items have been collected and Maria has disappeared. This problem occurs in the original "JSW" and in the OE – Willy seems stuck at the edge of the bed after jumping upon it, but the toilet run can still be induced by pressing any of the Right keys except for "P". In the OE, if Willy collected the items in this room (located to the left of the dividing wall) as the last ones, he would start the toilet run immediately, getting stuck against the wall, without being able to complete the game. This bug has been eliminated in the SE, where the items on the left side of the dividing wall can be collected safely as the last ones, without triggering the toilet run. The code which makes Maria stop tapping her foot and gradually raise her arm has been rewritten to make it happen only when Willy is on the ramp (never when he is to the left of the diving wall). Willy changes colour to bright green when he commences the toilet run - he has just started feeling sick... 36. Internet Cafe This screen is room 39 in the OE. It has been swapped with "Maths Lab" in order to accommodate the "double items" effect satisfactorily. Geoff Eddy's PV originally applied in the room "The Underground Laboratory" (01) in his game "Willy Takes a Trip" moves bright white squares across the top and bottom rows of the screen, in opposite directions. They are harmless and they seem very appropriate for a room dedicated to the World Wide Web: they are like packets of information speeding along it. Four arrows have been added in order to make the room a little more difficult. They look like solid white blocks, just like the harmless ones, increasing the "internet traffic" on the screen. One item has been removed from the room and one moved within it, without affecting the overall challenge involved in collecting the items in this screen. Unfair IDSes when exiting right and left have been eliminated thanks to changes introduced in "Maths Lab" and "The Reading Room", respectively. 37. The Olympic Swimming Pool The room design remains almost unchanged in relation to the OE, with the exception of one Water cell replaced with an Earth cell at the right edge of the pool, and an Earth cell replaced with a Water cell near the left-hand side of the room. A PV created by Ian Rushforth and myself colours two Water cells (one red and one green), which will hopefully make the player unsure whether these non-standard blocks are lethal (while they are actually perfectly safe, preserving the functional characteristics of "regular" Water cells). Geoff Eddy's PV originally applied in the rooms "Phew, That Was Lucky!" (11) and "The Arches of Despair, I fear" (18) in his game "Willy Takes a Trip" reverses the direction of the conveyor every 32 ticks. This may result in a fatal outcome for the player if they try to position Willy for the jump onto the rope, by first jumping up vertically onto the conveyor and holding a Left key to stand still (which they can do in the OE).Geoff Eddy's PV originally applied in the rooms "Phew, That Was Lucky!" (11) and "The Arches of Despair, I fear" (18) in his game "Willy Takes a Trip" reverses the direction of the conveyor every 32 ticks. This may result fatal for the player if they try to position Willy for the jump onto the rope by first jumping up vertically onto the conveyor and holding a Left key to stand still (which they can do in the OE). Both insects feature my improved sprites and both fish feature Richard Hallas's sprites whose movement has been tweaked thanks to Ian Rushforth's suggestions. Contrary to the OE, the yellow vertical insect is bright in the SE. The change was applied thanks to Ian Rushforth's Guardian Aura Bug Fix – in the OE the guardian was made non-bright so that a guardian belonging to the same class did not have a halo around it in "A Room with a View". The jump-from-the-conveyor-over-the-guardian-onto-the-rope challenge in this room was later developed in the room "Failed Suicide Attempt Vol. 2" (095) in "Jet Set Willy: Mind Control", used also in "Treacherous Cavern" (195) in "Jet Set Willy: The 2010 Megamix". 38. The Gym (Hurdle Practice) The upper right corner of the room has been redesigned to provide a "landing pad" for the player arriving, via teleportation, from "A Forest Clearing on Fire!". An item has been added there which can only be collected upon such arrival. The extension of the wall prompted the change of the rightmost guardian's sprite from Maria to the loudspeaker. The wall made it feasible for the loudspeaker to be moving up and down alongside it and thus create the only instance of a moving loudspeaker in the game. The lower right corner has been redesigned to eliminate possible IDSes when jumping in from "The Olympic Swimming Pool". Two bright magenta arrows have been added to increase the difficulty level of this screen. A PV of my design using Geoff Eddy's "nice fuzzy border effect" routine kicks in twice for each of Willy's jumps over the hurdles. Contrary to the OE, the leftmost vertical guardian is bright. The change was applied thanks to Ian Rushforth's Guardian Aura Bug Fix – in the OE this guardian was made non-bright so that a guardian belonging to the same class did not have a halo around it in "Upper Balcony". 39. Maths Lab This screen is room 36 in the OE. It has been swapped with "Internet Cafe" in order to accommodate the "double items" effect satisfactorily. Two items have been moved within the room and another one has been added. The three items located within the geometrical figures can only be collected in "The Temple of Passing Time". After all of the items in "Maths Lab" have been collected, gaps open in walls in "Willy's Private Fort Knox" and "The Mammoth Cave", making it possible to access the treasure trove in the former room and the right hand side of the latter room (and, consequently, also "The Single Item Cave"). A PV of my design using Geoff Eddy's "nice fuzzy border effect" routine kicks in at various times when Willy is airborne, which will hopefully unnerve the player. The Fire cell in the lower left corner has been eliminated so as to prevent the particularly unfair IDS which happens in the OE when entering the room from the left. Some other Fire cells have been removed, and only those have been left which are necessary to stop the player from falling downwards or collecting the lower left item in "A Room with a View" without worrying about the dummy wall to its right. The name of the room has been changed from "Math" to "Maths" to respect the British spelling. 40. The Old Writetyping Office This screen is room 28 in the OE. It has been swapped with "The Reading Room" in order to accommodate the "double items" effect satisfactorily. The rightmost item can only be collected in "A Forest Clearing on Fire!". "The Old Writetyping Office" is the only instance (apart from the exclamation mark added to "Dynamite Dan would love this!", the lower case used in "Primum non nocere" and the "s" added to "Math" in "Maths Lab") of a change in the room name in relation with the OE. In the OE the room name was a clear indication to the player that this is where the Writetyper cheat should be activated. However, the cheat has been totally erased in the SE, and so the room name has been changed accordingly. Thanks to a PV of my design, though, a ghost of "WRITETYPER" appears when Willy walks along the bottom of the screen... 41. The Studio The room's design is identical with that in the OE. A vertical guardian (the blue one) and four arrows have been added, increasing the difficulty of this screen. A PV of my design prints a dummy guardian to make the player hesitate when crossing the room from left to right. Thanks to a PV of Ian Rushforth's and my design, the colour of the arrows changes depending on whether Willy is on the right or left side of the room (from bright cyan to bright magenta, respectively). A side effect of the PV is also that the dummy guardian is only printed when Willy is on the right side of the room (but after that it remains in place even if Willy moves to the left side). 42. Main Hallway West This screen is room 52 in the OE. It has been swapped with "The Cinema" as part of a rather complicated optimisation which allowed the PV at #D3FB – #D400 to include the first byte of the data of the following room (at #D400, with a value of #EA). The room layout is almost identical to its predecessor in the OE, apart from the removal of one item (put to a better use elsewhere), which has not diminished the overall challenge of collecting the items in this room. Geoff Eddy's PV originally applied in the room "Willy's Inner Sanctum" (16) in his game "J4 (The Fourth Remix)" makes the guardian on the floor multicolour, and a PV of my design prints a dummy guardian, which will hopefully stop some players for a moment of reflection before collecting the upper left item. A bright red arrow has been added at the floor level. It triggers the Swooshing Arrow & Flashing Border/Status Bar Effect, thanks to a PV designed by Ian Rushforth and myself. Ian has come up with significant code optimisation in order to be able to add the arrow and the Swooshing Arrow & Flashing Border/Status Bar Effect in this room, so as to have the effect in both parts of the Main Hallway "diptych". His solution includes using the room data reserved for the Fire cells' definition in this room for other purposes, and code creating decorative "pseudo-Fire cells" in the ceiling (to preserve the look of the room from the OE; the Fire cells in both the OE and the SE are unreachable by Willy). 43. The Volleyball Court The sprites of all three moving guardians have been changed. Cell types unused in the OE (a ramp and a conveyor) have been added, both for practical reasons (to eliminate an IDS which could occur when jumping in from the right) and visual ones. The right unmoving guardian has been repositioned so that the effect of its colouring the Water cell below the *left* guardian has been eliminated. The left item has been moved so as to make its collection more challenging. Geoff Eddy's PV originally applied in the room "Holy Floor!" (46) in his game "Willy Takes a Trip" changes the colour of the central guardian depending on Willy's coordinates. A bright red arrow has been added, of a kind unseen in the OE, to make the room a little bit more difficult. 44. The Changing Room The upper left part of the room has been modified in order to eliminate various possible IDSes when dropping down from "A Bit of Fresh Air". Geoff Eddy's PV originally applied in the room "Weeds" (59) in his game "Willy Takes a Trip" makes Willy change colour depending on his x-coordinate – fittingly for "The Changing Room". It has been modified, however, so that Willy alternates between white and yellow only. Contrary to the OE, the red vertical guardian is bright in the SE. The change was applied thanks to Ian Rushforth's Guardian Aura Bug Fix – in the OE the guardian was made non-bright so that a guardian belonging to the same class did not have a halo around it in "A Room with a View". 45. Up on the Roof The room has been redesigned to eliminate IDSes or instances of Willy getting irredeemably stuck which may occur in the OE when exiting this screen downwards. Its visual aspect has been improved at the same time. The items have been raised by one row, which may marginally increase the difficulty of collecting the rightmost and leftmost ones. A PV of my design prints the initials of "Willy's New Mansion" on the roof. The room's Air was bright in the OE in order to prevent the effects of the Guardian Aura Bug. It has been reverted to non-bright in the SE (following the original design concept) thanks to Ian Rushforth's fix which eliminated the bug. The room is a good example of the Global Seamlessness of the screen. "Up on the Roof" was a minor inspiration in the creation of "Extended Belfry Tower" (211) in "Jet Set Willy: The 2010 Megamix". 46. The Underground Pantry The shape of the Fire cells has been modified in order to make them look good both when hanging down from the ceiling and sticking out from the ground. Two Earth cells have been added to create a solid support for the conveyor. Geoff Eddy's PV originally applied in the rooms "Phew, That Was Lucky!" (11) and "The Arches of Despair, I fear" (18) in his game "Willy Takes a Trip" reverses the direction of the conveyor every 32 ticks. This may confuse the player, but it can also be used to their advantage, by giving them a second chance (or, in fact, multiple chances) to time their moves right versus the horizontal guardian. A PV of my design prints a dummy guardian depending on Willy's y-coordinate. In practical terms, the guardian appears once Willy has dropped onto the conveyor, which will hopefully unnerve some players. The layout of this screen and its main conveyor-guardians challenge inspired the design of "Under the Cave Mouth" (room 144 in "Jet Set Willy: The 2005 Megamix" and room 086 in "Jet Set Willy: The 2010 Megamix"). 47. The Cellar This screen is room 19 in the OE. It has been swapped with "Stairway (Starryway) to Heaven" as part of a rather complicated optimisation which allowed the PV at #D3FB – #D400 to include the first byte of the data of the following room (at #D400, with a value of #EA). The room is visually unchanged from the OE. Nevertheless, there is more to it than meets the eye. It has now become the entry (and exit) point of the teleporter detour. Geoff Eddy's PV originally applied in the room "Willy's Inner Sanctum" (16) in his game "J4 (The Fourth Remix)" makes the horizontal guardian multicolour. A modified version of this screen was included in "Jet Set Willy: Mind Control", as room 097 "Scary Dungeon". 48. Primum non nocere The name of this room is meant to continue the tradition of room names in Latin (or seemingly in Latin) started by "Nomen Luni" in the original "JSW" and continued by "Rigor Mortis" in "Jet Set Willy II: The Final Frontier" and "Nelli Secundus" in Richard Hallas's "Join The Jet-Set!". Meaning "First, do no harm", it is, of course, one of the principal precepts of bioethics and an appropriate name for a room with seven lethal guardians which can kill Willy easily enough. The name was spelled in upper case in the OE, but in the SE it is spelled in sentence case, following the rule that capitalisation of letters in titles, or lack thereof, corresponds to the rules of the language the room name is in. One Fire cell has been added, making it impossible to exit the room to the right from the rightmost yellow platform, and thus preventing the resultant IDS. It also makes the U-turn more difficult. Geoff Eddy's PV originally applied in the room "Magic Mushrooms" (58) in his game "Willy Takes a Trip" makes the guardians in this screen change colour constantly. 49. Entrance to the Cellar The layout of the room is unchanged in relation to the OE. The colour of the ramp has been changed and the Fire cells have been made non-bright. Two bright yellow arrows have been added to increase the difficulty level. A PV of my design based on the Screen Flash code (unused in the original "JSW", where it resides at #8A11 – #8A25) makes the screen go blue from time to time – symbolic of the darkness which you may encounter when you enter a cellar. "The Lair of the Diagonal Monster" (room 143 in "Jet Set Willy: The 2005 Megamix" and room 059 in "Jet Set Willy: The 2010 Megamix") is loosely based on the design of "Entrance to the Cellar". 50. Willy's Problematic Heaven Parts of the room have been redesigned to eliminate the IDSes which occur in the OE when exiting the screen downwards or leftwards. My Shimmering Willy PV [Complex], combined with the setting of the Air's INK colour, makes the protagonist shimmer in white and magenta. The arrows in this room flash in white and yellow, being the only instance of flashing arrows in the game. It seems somehow appropriate for deadly angelic missiles... The cloud graphics from this room were used in some of the rooms in "Jet Set Willy: The 2005 Megamix" and "Jet Set Willy: The 2010 Megamix", namely "A Glimpse of the Castle" (room 096/093, respectively) and "Another MegaTree?" (089/105), as well as in the rooms "A Nightmarish Walk in the Clouds" (044) and "There's an item in the clouds!!!" (099) in "Jet Set Willy: Mind Control". 51. The Dining Hall This room is almost unchanged in the SE in relation to the OE, with the exception of two items added on the upper left table for full symmetry, and two Fire cells on the lower right moved one block to the left for symmetry and to minimise the possible IDSes. An IDS may still occur when jumping into the room from either side. However, there is no reason to perform either jump whatsoever, so I have decided to leave this particular IDS possibility in the game to punish careless players. A PV of my design using Geoff Eddy's "nice fuzzy border effect" routine is activated momentarily at two points of Willy's jump over the blue vertical guardian. 52. The Cinema This screen is room 42 in the OE. It has been swapped with "Main Hallway West" as part of a rather complicated optimisation which allowed the PV at #D3FB – #D400 to include the first byte of the data of the following room (at #D400, with a value of #EA). Geoff Eddy's PV originally applied in the room "Magic Mushrooms" (58) in his game "Willy Takes a Trip" makes the guardians in this room change colour constantly. The PV has been modified, though, so that the colour change is only between white and cyan, reflecting the flickering of the silver screen (the screen's attributes have been altered in relation to the OE). Furthermore, Ian Rushforth's Shimmering Willy PV [Optimised] makes Willy himself flicker between white and cyan. This creates a special challenge. The player can leave "The Cinema" with Willy either being white or cyan. If Willy is cyan, he will not be able to collect items in other rooms, so he has to leave "The Cinema" being white. However, due to a feature of the game engine which makes Willy's colour dependent on the colour of the Air cells' INK in the room he is currently in (discussed in section 20.3.D below), after entering either of the adjacent rooms ("The Studio" or "The Reading Room"), the player will not know whether Willy is white or cyan, because he is displayed white in both rooms regardless of whether his technical colour (determined by the value stored at #962D) is #07 (white) or #05 (cyan). Consequently, the player will only find out in the second room in either direction ("A Bit of Fresh Air" or "Internet Cafe") whether Willy is white or cyan (while in "On the Sun Deck" Willy's colour will change again, being determined by the Shimmering Willy PV [Complex] operating there). If the player finds out that Willy is cyan, they will have to do something about it, e.g. go back to "The Cinema" and try to leave that room being white. However, once again they will not know whether Willy is white or cyan until getting to "The Studio" or "The Reading Room". It can get pretty frustrating for the player. The ramp has been extended upwards by one block, eliminating the unfair IDS which happens in the OE when entering the room on the upper right. 53. Above the Front Door In the OE, the player can reach this room after exiting "In the Backwoods" downwards (which allows them to access the upper part of "The Front Door"). In the SE, the player arrives in "Above the Front Door" via teleportation from "The Temple of Passing Time". The room's Air was bright in the OE in order to prevent the effects of the Guardian Aura Bug. It has been reverted to non-bright in the SE (following the original design concept) thanks to Ian Rushforth's fix which eliminated the bug. Apart from this, the room has not been modified visually, but some important functional changes have been introduced in the SE. The Fire and Earth cells have been swapped and the direction of the conveyor has been reversed. As a result, after collecting the upper item, the player has to go back the same way they have traversed while going for the item, which now involves a tricky jump over the blue guardian. This makes the room more difficult than in the OE. Two items have been added within the tower-like structure, to mark the proper way downwards. Once the player has descended safely to "The Front Door" (having collected the items), they should know that there is no point in trying to jump to the right from the bottom edge of the structure in the room above. Such a jump will result in the player's getting killed for no apparent reason. This is thanks to a fix devised by Ian Rushforth, which - by killing the player once - prevents them from getting trapped on the upper right of "The Front Door", the only way out of which would lead to an IDS in "The Anteroom". Since this screen is one of the two possible exit points from "The Temple of Passing Time", Part Three of my Time Trap PV has been applied here. Therefore, the player arrives in "Above the Front Door" with the same in-game time they had back in "Into the Abyss". 54. The Forgotten Tower Two Fire cells have been added in order to prevent IDSes when stepping off either edge of the lowermost platform. A third one was added to prevent a shortcut through the room. The Fire cells' shape has been modified accordingly, to make them look good both when hanging down from the ceiling and in mid-air. A previously-unused ramp has been added, looking like a couple of arrows, meant to intimidate the player at the end of the conveyor and possibly confuse them for a second (a Jump key has to be pressed in order to progress across the ramp). Three bright cyan arrows, including one of a kind unseen in the OE, have been added to make the room more difficult. Willy's Colour Changed on Entrance to the Room PV makes Willy red upon his first entrance into the Tower. This means that he cannot collect any items and has to go around the room and down through "Above the West Wing Bedroom" and "West Wing Bedroom" unproductively, wasting time. By way of consolation, when Willy is red in this room, he does not get hurt by the arrows. Willy can only turn white again – and so be able to collect items once more – by re-entering this room or by losing a life inside it. 55. West Wing Bedroom The Fire cells on the left have been rearranged to improve their visual aspect and to eliminate a possible IDS resulting from dropping down to the room below. An item has been added which can only be collected by jumping *into* the Earth cell to its right. This was inspired by the same challenge introduced in "West Bedroom" (55) in "JSW: TNE". The Fire cell which guarded access to the rightmost item in the OE has been replaced with a dummy guardian printed by a PV of my design. Hopefully, some players will lose a life or two unnecessarily trying to jump over it and hitting the green loudspeaker in the process. A yellow arrow of a kind unseen in the OE has been added as one more challenge for the player in this room. This bedroom has no bed, but hey, it was the same in Willy's old mansion... 56. A Bit of Fresh Air The room's Air was bright in the OE in order to prevent the effects of the Guardian Aura Bug. It has been reverted to non-bright in the SE (following the original design concept) thanks to Ian Rushforth's fix which eliminated the bug. The brightness, or lack thereof, of the Earth and Fire cells has been swapped, so that the Fire cells are bright in the SE and the Earth cells - non-bright. In the OE the shape of the ramp was defined (it is visible in JSWED); however, since composite Water-ramp cells were created by giving both cell types the same attributes, only the shape of the Water cells is visible in-game. As a result, the ramp in the OE is made of clouds, which does not seem to be very logical. This has been corrected in the SE by eliminating the ramp altogether and reshaping the steps below it. The clouds are still composite Water-ramp cells, preserving their peculiar properties. Possible IDSes when exiting down to "The Changing Room" have been eliminated thanks to the changes to the upper left of that room. Geoff Eddy's PV originally applied in the room "Holy Floor!" (46) in his game "Willy Takes a Trip" changes the colour of the bird depending on Willy's coordinates. Both insects feature improved sprites. The cloud graphics from this room were used in some of the rooms in "Jet Set Willy: The 2005 Megamix" and "Jet Set Willy: The 2010 Megamix", namely "A Glimpse of the Castle" (room 096/093, respectively) and "Another MegaTree?" (089/105), as well as in the rooms "A Nightmarish Walk in the Clouds" (044) and "There's an item in the clouds!!!" (099) in "Jet Set Willy: Mind Control". 57. Above the West Wing Bedroom Both sides of the room have been redesigned; the left one mainly to improve its visual aspect, the right one to stop possible IDSes when exiting the room to the right. Three Fire cells have been added in the central part of the room for functional reasons (to prevent an exit downwards which would lead to an IDS in the room below, and to prevent the possibility of jumping through the ramp to collect the item in the central part of the room). One item has been relocated to a spot which is a Promised Land area when entering the room from the right or from below. In fact, it is a "triple Promised Land" item, because if you play without losing any lives or cheating, you can only collect it upon the *fourth* entrance to the room (the second entrance from above, when Willy is white again). The yellow guardian's sprite has been changed from a flag to the moon so as to add variety, because in the OE the same sprite is used for a guardian belonging to the same class in the adjacent room "A Bit of Fresh Air". A PV of my design based on the use of the routine which produces sound and border effects when the title-screen message is scrolling is meant to unnerve the player when traversing the central platform. 58. West Stairway Geoff Eddy's PV originally applied in the room "Holy Floor!" (46) in his game "Willy Takes a Trip" changes the colour of the centremost horizontal guardian depending on Willy's coordinates. A PV of my design prints "2004" (release date of the OE) in the guardian's path. Following Ian Rushforth's advice, the PV uses the Occupied Room Screen Buffer (starting at #6000). As a result, the guardian passes through the "2004" sign without any collision, colouring it from behind on each pass. Two Earth cells have been added to provide support for the upper edge of the ramp and improve the room visually. No other changes have been made to this screen in relation to the OE. 59. The Anteroom Geoff Eddy's PV originally applied in "The Room of Stippled Blocks" (09) in his game "Willy Takes a Trip", which sends two killer squares flying across the screen, should make the player realise in this second room they will visit that the SE is more difficult than the OE. The PV has been modified to make the squares cyan. No other changes have been made to this room in relation to the OE. 60. The Front Door An Earth cell added on the right prevents the player from jumping out of this room to an IDS in "The Anteroom". A PV of my design prints the initials of "Willy's New Mansion" above the right item and makes the in-game tune change in mid-room. It is "In the Hall of the Mountain King" (from "Manic Miner", also used in "Jet Set Willy II: The Final Frontier") when Willy is outside the house, and it turns to "If I Were a Rich Man" (from the original "JSW") as soon as he steps inside. Another PV of my design makes the "HELLO!" sign flicker, welcoming the player to this new adventure. In the OE (and 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. In the SE, Willy always starts the game on top of the ramp, standing with his legs together, facing left, over the lake. These are his last moments of quiet contemplation, staring out over the expanse of water, before setting out on the difficult and hazardous task of collecting the items... This room was used as the final screen in "Jet Set Willy: Mind Control". Upon successfully completing the final sequence in that game (a flight through outer space in a flying saucer), Willy lands on the ramp in "Willy's New Mansion – Front Door" (033), throwing his hands up in triumph. 61. Altar to a Well-Known God My Shimmering Willy PV [Complex] makes the protagonist shimmer in white and red (money-related red-hot fever?). Two Fire cells have been added following a suggestion by Ian Rushforth, who spotted the fact that Willy could get irredeemably stuck within the lower right of the dollar sign (after which the player could only reset the game if they were not able to reload an earlier snapshot or use the Rollback feature). One of the Fire cells provides a "cyanide pill" for Willy; the other serves aesthetic purposes only, providing symmetry. No other changes have been made to this room in relation to the OE. 62. JSW's 20th Anniversary Party Geoff Eddy's PV originally applied in the room "Willy gets some 3D glasses" (45) in his game "Willy the Hacker" makes the horizontal "1984" / "2004" guardian change colour depending on which side of the room it is on. The guardian's animation is twice as fast as in the OE. This is because the number of sprite frames it uses has been reduced by half, which yielded 64 bytes of spare space (used for other purposes). In the OE, the guardian's sprites occupy half of an entire sprite page (128 bytes), with "1984" and "2004" each repeated twice; the animation frame mask of the guardian is set to 3. In the SE, the sprite occupies only a quarter of the sprite page (64 bytes), with no repetitions; the animation frame mask of the guardian is set to 1. The title of this room inspired the title of "Jet Set Willy's 25th Birthday" (223) in "Jet Set Willy: The 2010 Megamix". 63. Altar to an Unknown God The composite priest guardian is featured in the SE just like in the OE, but the way it is created is different. Its two unmoving parts are printed by a PV of my design. As a result, the number of "proper" guardians in the room has been reduced, which allowed the addition of three bright red arrows, increasing the difficulty level. Following Ian Rushforth's advice, one of the arrows serves as a "cyanide pill" for Willy if he gets stuck at either edge of the conveyor, unable to commit suicide against the priest guardian above. Geoff Eddy's PV originally used in the room "3D PacVaders" (61) in his game "ZX Willy the Bug Slayer", modified appropriately, makes the upper part of the altar shimmer. The insect features an improved sprite. Graphical elements and inspiration from this room were used in the creation of "The Mystic Room of Many Exits" (113) in "Jet Set Willy: Mind Control". The Fire cell graphics were also used in "Henry's Bedroom" (35) in "Willy's Hoard". 103. The Temple of Passing Time A brand new room, created especially for the SE. When the player enters "The Temple of Passing Time", Part Two of my Time Trap PV sets the in-game clock to 11:53 am if the "Expert" time limit level was chosen after the game had loaded (or to 11:52 if the "Hard" time limit was chosen, to 11:51 if the "Medium" time limit was chosen or to 11:50 if the "Easy" time limit level was chosen), independently of what time it was just a moment before in "Gateway to the Unknown". Therefore, the player has just between 7 and 10 in-game minutes to complete this room or else they will run out of time and lose the whole game (hint: if it is 11:59 am and the player is sure they will not complete the room before the clock strikes noon, losing a life will set the clock back to 11:53 am or whatever it was when they first entered the room; the player's progress through the room will be lost, because their position will be set back to the entrance to the room, but at least they will get another chance to complete this room, rather than lose the whole game). Three of the items in this room can be collected here, while the fourth one - in "Maths Lab". The way out of this room (other than going back to "Gateway to the Unknown") is by teleportation. Applied using John Elliott's teleport overlay, it takes the player to "Above the Front Door", where the in-game time is restored to what it was back in "Into the Abyss". The design and name of this room were inspired by the room "Temple of the Circle" (57) from Stuart J. Hill's 2000 game "Utility Cubicles". 104. A Forest Clearing on Fire! A new room, created especially for the SE. It is a rendering of the room "FOREST CLEARING" (49) from "Henry's Hoard" (by Martyn Brown and Andy Bigos, Alternative Software Ltd, 1985), renamed "PADDY's PATCH" in the version of "Henry's Hoard" which appeared on Side A of MicroHobby Issue 188: Tape 7. That room was also included, as "Forest Clearing" (05), in "Willy's Hoard". Geoff Eddy's PV originally applied in the room "A Quiet Corner to rest in" (10) in his game "Willy Takes a Trip" creates a moving platform which can carry Willy over the fire. The PV has been modified to use an Earth cell from another room (rather than from this one) as the moving platform. Only one of the items visible in this room can be collected here. The other two can be collected in "The Old Writetyping Office". After collecting the item, teleportation (applied using John Elliott's teleport overlay) takes Willy to the upper right of "The Gym (Hurdle Practice)" where an otherwise unreachable item can now be collected. Guardians designed by Adam Britton make life difficult for Willy in the lower part of this screen, and three arrows increase the overall difficulty level of the room even further. A PV designed by Ian Rushforth and myself makes the arrows alternate between red and yellow, every other tick, reflecting the glare of the fire. --------------------------------------------------------------------- IX. Technical notes "WNM SE" uses the classical JSW48 game engine, modified and enhanced in various ways. Some of these enhancements repeat solutions applied in the past; some are novel contributions to the JSW scene. The most important modifications and extensions are presented below. ------ 1. More than 64 rooms This solution was invented by Jonathan Graham Harston. The value of the address #8916 (corresponding to #8915 in the original "JSW") has been changed from #F6 to #EE, i.e. from an OR opcode to an XOR opcode. This allows the game engine to use 7-bit (or, in theory, even 8-bit) room numbers instead of 6-bit ones. As J. G. Harston explains, the rooms are mapped to the following areas of memory: Room numbers: Memory: 000-063 #C000 - #FFFF 064-127 #8000 - #BFFF 128-191 #4000 - #7FFF 192-255 #0000 - #3FFF The 64 original rooms from "WNM" are found in the #C000 - #FFFF range and the two new rooms are in the #8000 - #BFFF range (namely, "The Temple of Passing Time" is at #A700 - #A7FF and "A Forest Clearing on Fire!" is at #A800 - #A8FF). J. G. Harston's suggestion of extending the item table so that the code that deals with it would allow 7-bit room numbers as well has *not* been applied. This created the "double items" effect - rooms 0+x appear to have the same items in them as rooms 64+x. This was exploited purposefully by creating rooms in which some items are visible, but cannot be collected (they can only be collected in other rooms whose room numbers, expressed in binary, share the same lower 6 bits). ------ 2. In-game tune set individually in each room This solution was created jointly by Daniel Gromann and Ian Rushforth. It was developed in several stages, starting with a more complicated modified routine playing a note of the in-game music (applied in "JSW: TNE"), going through a simplified routine (applied in unreleased, development versions of "WNM SE") and culminating in the final, simple, efficient and elegant solution present in "WNM SE". Offsets #DF and #E0 in each room's data specify the (reversed) address of the in-game tune to be used in this room. The instruction at #8B59 - #8B5B loads this address (from the room's data copied into the room buffer) so that the routine which plays a note of the in-game music knows where to look for the tune. If this solution were to be applied in the original "JSW", the instruction LD HL,#865F [21 5F 86] at #8B4D - #8B4F would have to be changed to LD HL,(#80DF) [2A DF 80], so that instead of the permanent address #865F, the start of the tune would be defined by the value of Offsets #DF and #E0 in the room buffer. Needless to say, the appropriate values for the start of each tune would have to be set in each room's data. "WNM SE" features: - the original tune from "Jet Set Willy" ("If I Were a Rich Man"), coded by Matthew Smith; - the original tune from "Manic Miner" ("In the Hall of the Mountain King"), used also in "Jet Set Willy II: The Final Frontier", coded by Matthew Smith; - "Lord of the Dance", coded by Andrew Broad (first released as an Easter egg in his 2004 game "Party Willy"); - "Radetzky March", coded by Richard Hallas (first used by Philip Bee in his 1998 game "Jet-Set Willy Ivy"); - a portion of "Moonlight Sonata", coded by Matthew Smith as the title-screen tune, played as the in-game tune in "The Hypnotherapy Room". ------ 3. No deterioration of the in-game tune when lives are lost This solution was provided by Andy Ford and Ian Rushforth. Its initial version was applied by Andy in his "JSW 2015 Bug Fixed Edition" (http://jswmm.co.uk/topic/76-file-jsw-2015-bug-fixed-edition/). Andy explained: "The code that causes the in-game tune to deteriorate with each loss of life was disabled. Although intentional I've always considered it a bug in some way". Later, however, "following general feedback that's been received", since many people felt that "this was an original feature after all", he released an alternative version where the deterioration of the tune had been restored for those who wished it. In "JSW 2015 Bug Fixed Edition", the original code which picks up the number of lives remaining (to be used by the in-game tune routine): 8B51 3A CC 85 LD A,(#85CC) was substituted with the fixed number #08 (corresponding to Willy's having eight lives remaining; in the original "JSW" the number would be #07 at the start of the game): 8B51 3E 08 LD A,#08 8B53 00 NOP A different solution to avoid the deterioration of the in-game tune was applied in "WNM SE". Following Ian Rushforth's advice, some more bytes from the original code were removed (corresponding to the code from #8B51 to #8B5B in the original "JSW"), while the instruction at #8B5F and #8B68 in the original "JSW" (at #8B6D and #8B76 in "WNM SE") was changed from LD E,D (5A) to LD E,(HL) (5E). This optimisation has allowed some additional spare bytes to be gained. ------ 4. The colour of arrows set individually in each room This solution was created jointly by Ian Rushforth and Daniel Gromann. In the original "JSW", all arrows are white. The following code sets the arrow's colour there: 9286 7E LD A,(HL) 9287 F6 07 OR #07 set the INK to #07 (white) regardless of the background's INK colour ("background" here meaning whatever character square the arrow is passing through) 9289 77 LD (HL),A set the INK to white at the arrow's location Andrew Broad made arrows cyan in his 2002 game "Goodnite Luddite". He achieved it by changing the operand of the OR instruction at #9288 from #07 to #05. He explains the details in the Readme file accompanying the game (http://www.oocities.org/andrewbroad/spectrum/download/goodnite_luddite.zip). In "WNM SE", the code has been modified in the following way (the code is moved by two bytes for other reasons): 9288 3A ED 80 LD A,(#80ED) pick up the arrow's attributes from Offset #ED in the room buffer 928B 77 LD (HL),A set these attributes at the arrow's location As a result, the arrow's attributes are defined in Offset #ED of each room (unused in the original "JSW"). In rooms with no arrows the value of this Offset has been set to #00 (it could be anything, as it has no bearing on the game). It has to be noted that while the colour of the arrow as defined in Offset #ED is clearly visible during the arrow's passage through the room, it is also possible, by pausing the game using the pause function on the emulator, to "catch" the arrow being a different colour, namely, the colour of the Air's INK (the same thing happens in the original "JSW", this quirk is independent from the modification introduced in "WNM SE"). The reason for this glitch is because, in the Main Loop, the graphics bytes are copied (in "WNM SE", at #89F4) to the display file momentarily before the attribute bytes are copied (at #8A23) to the attribute file. So one briefly sees the arrow drawn onto the next cell along its trajectory, just before the associated colour is "moved on". This phenomenon can actually be observed with *any* moving "entity" whose INK setting differs from that of its host cell(s). A classic example in the original "JSW" would be when Willy falls into "Entrance to Hades", where the Air's INK colour is set to green, so Willy's legs intermittently turn green as he drops past a cell-row boundary. It is perhaps *particularly* noticeable with arrows, because they are moved along by one whole cell-column per time-frame (per "tick"), so when it happens, the whole arrow is "discoloured". However, if the game is paused "in-game" (using keys A-G), it will always freeze with the arrows displayed in white (in the original "JSW") or whatever is stored at #80ED (in "WNM SE"), because pausing the game is done after both of the above processes (in "WNM SE", at #8AC2). To ensure that arrows have an entirely homogenous colour at all times it is necessary to set the Air's INK to the same colour as the arrow's INK, as defined in Offset #ED. Furthermore, Offset #ED, which defines the arrow's attributes, can have any value between #00 and #FF. Thus you can have "inverted" arrows (with the arrow's INK set to the Air's PAPER colour and the arrow's PAPER set to the Air's INK colour), flashing arrows, solid colour blocks and so on. In the case of a "traditional arrow" (a shaft with a "point and feathers" pixel pattern either side), as opposed to a "solid flying block", in order to avoid an ugly colour clash like the "Guardian Aura Bug", all the non-INK settings (PAPER/BRIGHT/FLASH) of Offset #ED should be set to match those of the Air cells (since arrows typically spend most, if not all, of their time on screen passing through Air). The notable exception to the above rule is that, in rooms with a black background only (black PAPER for the Air cells), bright or non-bright arrows can be selected (on black PAPER, of course) and there will be no colour clash regardless of the Air's brightness setting (because there is no distinction between bright black and non-bright black). In "WNM SE" most of the arrows are "traditional" in their shape. Some exceptions are: solid white blocks in "Internet Cafe" (fitting in nicely with the harmless blocks going back and forth, produced by Geoff Eddy's PV) and arrows flashing in white and yellow in "Willy's Problematic Heaven" - deadly angelic missiles... ------ 5. Global Seamlessness of the screen This solution was created by Daniel Gromann and Ian Rushforth. "WNM SE" is the first game ever to feature "Global Seamlessness of the screen" (this term has been coined by Ian Rushforth) – the PAPER colour of the top two thirds of the screen, the lower third (the status bar) and the border is the same in all rooms. When creating the OE, I did not pay any particular attention to the colour of the border in each room. I used Vaggelis Kapartzianis's ZX-32 Spectrum Emulator 2.00 at that time, configured so that it did not show the borders at all. I have since come to appreciate the importance of setting the border colour right, and I have developed a taste for borders of the same colour as the screen's predominant background. I applied this rule in "WNM SE" and then developed it even further: I wrote a code which allows the background of the whole screen, including the borders, to be of the same colour. My solution was applied in unreleased revisions of the game while it was work in progress. Later on, Ian Rushforth provided a significant rewrite of the code, resulting in a decisive saving of space. The solution works in the following way: The border colour, as defined in each room's data, is always the same as the PAPER of the Air cells in the top two thirds of the screen. The code first sets the "standard" attributes to the bottom third of the screen (which are various pre-defined non-bright INK colours on black PAPER) and makes sure the time display has the correct colour, depending on the hour (green until 11.29 am, yellow from 11.30 am till 11.49 am, and red from 11.50 am till 11.59 am). It does so by calling appropriate subroutines dealing with each of these issues. The code then ensures that the border has the proper colour, as defined in the current room buffer. If the border colour is black, then the BRIGHTNESS of the status bar is set to on (otherwise BRIGHTNESS remains off). Next, the appropriate border colour is allocated to the PAPER colour of the status bar, and then a loop is set up, in which all 256 characters of the status bar are considered in turn: the INK value of each character is merged with the PAPER and BRIGHTNESS settings that were defined for the entire status bar in the previous steps. As a result of the way the code works, in rooms with a black border and black PAPER of the top two thirds of the screen (the playing area), everything in the bottom third of the screen is bright INK (of various colours) on black PAPER. In rooms with blue, cyan and yellow PAPER of the top two thirds of the screen (the playing area) and the border of corresponding colour, everything in the bottom third of the screen (the status bar) is non-bright INK (of various colours) on PAPER the same colour as the border. The following code achieves it: 8B0F CD F9 C1 CALL #C1F9 the subroutine at #C1F9 calls up, in turn, the sub-subroutine which sets fixed attributes for the bottom third of the screen (#99FF), then the sub-subroutine which sets the colour of the time display depending on the hour (#9ECB) #8B12 CD F9 99 CALL #99F9 call up the code at the end of Geoff Eddy's "nice fuzzy border effect" routine, in order to set the correct border colour for the current room; coming out of this code, the A register holds the current room's border colour (in bits 0-2), which the subsequent code uses to set the PAPER colour for the status bar #8B15 07 RLCA rotate the bits of A leftwards three #8B16 07 RLCA times, so that the current room's border #8B17 07 RLCA colour is stored in bits 3-5 (the regular location of the PAPER bits of screen cells) #8B18 B7 OR A if the border colour is black (#00), then this sets the Zero Flag #8B19 20 02 JR NZ #8B1D if the Zero Flag isn't set (i.e. the border isn't black), then jump past the next two bytes #8B1B CB F7 SET 6,A set bit 6 of the A register, which ensures that the status bar is BRIGHT if the border is black (for any other border colour, this command is skipped, so the status bar is non-BRIGHT) #8B1D 21 00 5A LD HL,#5A00 point HL at the first character of the status bar #8B20 06 00 LD B,#00 B will count all 256 characters of the status bar, for the loop that follows #8B22 E6 78 AND #78 select only bits 3-6 of the value stored in the A register (bits 3-5: PAPER colour, bit 6: brightness); this doesn't have any effect during the first pass through the loop, but in subsequent loops it discards the previous INK settings from consideration #8B24 B6 OR (HL) merge A with the value stored at the address pointed at by HL (which was earlier "initialised" to the appropriate value for the character under consideration by the subroutine at #99FF, and then modified, if applicable [i.e. when considering, at certain points in the game, the clock], by the subroutine at #9ECB) #8B25 77 LD (HL),A load up the value of A into the address pointed at by HL; now the character of the status bar under consideration has the appropriate INK, PAPER and BRIGHT settings #8B26 23 INC HL point HL at the next character on the status bar #8B27 10 F9 DJNZ #8B22 loop back to #8B22 to set the attribute for the next status bar character, until B has counted down to zero (in the first instance, B is decremented from #00 to #FF, so the loop is executed 256 times in total - once for each character of the status bar) #8B29 C9 RET then exit ------ 6. Items animated by eight colours This solution was created by Geoff Eddy and improved by Ian Rushforth. It was first applied in his game "J4 (The Fourth Remix)" and it consists in the change of the value of the addresses (in the original "JSW") #9434 - #9437 from: 9434 E6 03 AND #03 9436 C6 03 ADD A,#03 to: 9434 C6 07 ADD A,#07 9436 E6 07 AND #07 which animates the items by eight colours rather than four. Ian Rushforth noticed that the ADD A,#07 instruction is not necessary with 8-colour items and can be NOPped out. He used the additional spare bytes to insert a PUSH / POP instruction, necessary to make sure that his code which makes the number of items collected flash upon reaching 256 (at #9EA6 - #9EB0) works well. The rewritten code is now: 9427 20 05 JR NZ #942E jump if there are any items still to be collected 9429 E5 PUSH HL 942A CD 9A 9E CALL #9E9A call the code which changes the game mode indicator to 1 when all items have been collected, changes Willy's colour to yellow and makes the number of items collected (256) flash 942D E1 POP HL 942E CB B6 RES 6,(HL) reset bit 6 of the first byte of the entry in the item table: the item has been collected 9430 18 20 JR#9452 jump to consider the next entry in the item table 9432 3A 5C 99 LD A,(#995C) generate the INK colour for the item from 9435 85 ADD A,L the value of the minute counter at #995C 9436 E6 07 AND #07 and the index of the item in the item 9438 4F LD C,A table ------ 7. Guardian Aura Bug Fix This solution was created by Ian Rushforth. The Guardian Aura Bug Fix eliminates the problem of bright guardians projecting a bright "halo" around them on screens with non-bright, non-black backgrounds (like in "On a Branch Over the Drive" in the original "JSW" or "The Observatory" in the OE) and non-bright guardians projecting a dark shadow around them on screens with bright, non-black backgrounds. Ian Rushforth's fix - applied in "WNM SE" for the first time ever in a released game - allows for both bright and non-bright guardians on the black background screens. At the same time, on non-black background screens all guardians conform with the Air cells' brightness (or lack thereof), independently of their individual settings: on non-bright screens all guardians are non-bright; on bright screens they are all bright. In the OE, the Air cells' INK had been set to bright in some of the non-black background rooms in order to avoid the problem. In the SE, the Air in these rooms was made non-bright. Furthermore, some of the guardians which were non-bright in the OE (because they appeared, among others, in rooms with non-bright, non-black backgrounds) were made bright in the SE (so that their brightness can be appreciated in the rooms with black backgrounds in which they also appear). This fix was achieved via an amendment to part of the "Draw the guardians" routine. The pertinent section of the routine defines the attribute byte for the guardian and assigns it to the C register (prior to this section of the routine, HL has been defined as the address of the guardian's current location in the Occupied Room Attribute Buffer [#5C00 - #5DFF]). This is the original "JSW" code: 91EE DD 7E 01 LD A,(IX+#01) pick up the second byte of the guardian definition 91F1 E6 0F AND #0F keep only bits 0-2 (INK colour) and 3 (BRIGHT value) 91F3 C6 38 ADD A,#38 push bit 3 up to bit 6 91F5 E6 47 AND #47 keep only bits 0-2 (INK colour) and 6 (BRIGHT value) 91F7 4F LD C,A save this value in C temporarily 91F8 7E LD A,(HL) pick up the room attribute byte at the guardian's location from the Occupied Room Attribute Buffer (#5C00 - #5DFF) 91F9 E6 38 AND #38 keep only bits 3-5 (PAPER colour) 91FB A9 XOR C merge the INK colour and BRIGHT value from C 91FC 4F LD C,A copy this attribute value to C This is the amended code in "WNM SE": 91EE C3 ED B0 JP #B0ED jump to #B0ED (because of space constraints in the "Draw the guardians" part of the code) B0ED 7E LD A,(HL) pick up the room attribute byte at the guardian's location from the Occupied Room Attribute Buffer (#5C00 - #5DFF) B0EE E6 38 AND #38 keep only bits 3-5 (PAPER colour) B0F0 C2 F2 91 JP NZ,#91F2 if the PAPER colour of the guardian's host cell is not black, then jump back to #91F2 in the "Draw the guardians" routine, where the alternative code that assigns an attribute byte to the guardian is located If the PAPER colour of the guardian's host cell is black, then continue on into #B0F3, where a slightly modified version of the original code has been relocated: B0F3 4F LD C,A save the value of the PAPER colour of the guardian's host cell in C temporarily B0F4 DD 7E 01 LD A,(IX+#01) pick up the second byte of the guardian definition B0F7 E6 0F AND #0F keep only bits 0-2 (INK colour) and 3 (BRIGHT value) B0F9 C6 38 ADD A,#38 push bit 3 up to bit 6 B0FB E6 47 AND #47 keep only bits 0-2 (INK colour) and 6 (BRIGHT value) B0FD C3 FB 91 JP #91FB jump to #91FB in the "Draw the guardians' routine, where the INK colour and BRIGHT value of the guardian (stored in A) are merged with the PAPER colour of the host cell (stored in C) The following is the alternative code that assigns an attribute byte to a guardian if it occupies non-black background cells: 91F2 DD 7E 01 LD A,(IX+#01) pick up the second byte of the guardian definition 91F5 E6 07 AND #07 keep only bits 0-2 (INK colour) 91F7 4F LD C,A save this value in C temporarily 91F8 7E LD A,(HL) pick up the room attribute byte at the guardian's location from the Occupied Room Attribute Buffer (#5C00 - #5DFF) 91F9 E6 78 AND #78 keep only bit 3-5 (PAPER colour) and 6 (BRIGHT value) in the A register The above code continues into the code below, which is also the entry point from #B0FD: 91FB A9 XOR C merge the INK colour from C, with the PAPER colour and BRIGHT value from A (unless we have arrived here via a jump from #B0FD) 91FC 4F LD C,A copy this attribute value to C ------ 8. Cell Graphics Bug Fix This solution was created by Stuart Brady (Zub). In "WNM SE" the pertinent code has been integrated into the Main Loop thanks to Ian Rushforth's helpful suggestions. The Cell Graphics Bug Fix eliminates the bug in the original JSW game engine which arises whenever the attribute byte of a cell type coincides with the byte value of a row of pixels within a preceding cell type. The bug corrupts the conveyors in "West of Kitchen", "The Nightmare Room", "The Wine Cellar" and "Tool Shed" in the original "JSW", and in "The Single Item Cave" and "Entrance to the Caves" in the OE. Stuart's fix is a generic one which prevents any possible occurrences of the Cell Graphics Bug. The following disassembly, presenting the entire routine which draws the current room to the screen buffer at #7000, was prepared using Richard Dymond (SkoolKid)'s JSW disassembly and Stuart Brady's notes published on JetSet Willy & Manic Miner Community. 8D2C CD 65 8D CALL #8D65 fill the buffer at #5E00 with attribute bytes for the current room 8D2F DD 21 00 5E LD IX,#5E00 point IX at the first byte of the attribute buffer at #5E00 8D33 3E 70 LD A,#70 set the operand of the LD D,#n 8D35 32 58 8D LD (#8D58),A instruction at #8D57 to #70 8D38 CD 40 8D CALL #8D40 draw the cells for the top half of the room to the screen buffer at #7000 8D3B 3E 78 LD A,#78 set the operand of the LD D,#n 8D3D 32 58 8D LD (#8D58),A instruction at #8D57 to #78 8D40 0E 00 LD C,#00 C will count 256 cells The following loop draws 256 cells (for either the top half or the bottom half of the room) to the screen buffer at 7000: 8D42 DD 7E 00 LD A,(IX+#00) pick up an attribute byte from the buffer at #5E00 - this identifies the type of cell (Air, Water, Earth, Fire, ramp or conveyor) to be drawn 8D45 21 A0 80 LD HL,#80A0 move HL through the attribute bytes and graphic data of the Air, Water, Earth, Fire, ramp and conveyor cells starting at #80A0 until we find a byte that matches the attribute byte of the cell to be drawn 8D48 06 06 LD B,#06 search in the next six graphic definitions (Air, Water, Earth, Fire, ramp and conveyor) 8D4A 11 08 00 LD DE,#0008 each cell consists of 8 bytes of pixel data Graphics search: 8D4D BE CP (HL) see if we have found a matching attribute byte 8D4E 23 INC HL increment HL to point at the pixel data, leaving flags unmodified 8D4F 28 03 JR Z,#8D54 if we have found a match, draw it 8D51 19 ADD HL,DE skip the pixel data (8 bytes) 8D52 10 F9 DJNZ #8D4D repeat for the next graphics definition Graphics found: 8D54 06 08 LD B,#08 there are eight bytes in the cell 8D56 59 LD E,C E holds the least significant byte of the screen buffer address 8D57 16 #n LD D,#n #n is set to either #70 or #78 above; now DE holds the appropriate address in the screen buffer at #7000 8D59 7E LD A,(HL) copy the cell graphic data to the screen buffer at #7000 8D5A 12 LD (DE),A 8D5B 23 INC HL 8D5C 14 INC D 8D5D 10 FA DJNZ #8D59 8D5F DD 23 INC IX move IX along to the next byte in the attribute buffer 8D61 0C INC C have we drawn 256 tiles yet? 8D62 20 DE JR NZ,#8D42 if not, jump back to draw the next one 8D64 C9 RET the first time this command is reached, it returns back to #8D3B, to draw the cells for the bottom half of the room to the screen buffer at #7000; the second time it is reached, it returns the program to the "Room Set-up" routine ------ 9. Doubled speed of the in-game clock This solution was created by Daniel Gromann (implementing a concept previously expressed by Stuart Brady). It was first applied in "JSW: TNE". In the original "JSW" one in-game minute has 256 ticks. The following code does it: 8A49 3A CB 85 LD A,(#85CB) pick up the timer (tick counter) 8A4C 3C INC A increment it 8A4D 32 CB 85 LD (#85CB),A 8A50 20 59 JR NZ,#8AAB jump unless the timer has ticked over to 0 (in which case a minute of in- game time has passed and the clock is updated accordingly) In "WNM SE" one in-game minute has 128 ticks, so it is 50% shorter than in the original "JSW". Therefore, in-game time passes twice as quickly. The modified code (the code is moved by five bytes for other reasons): 8A3A 3A 5C 99 LD A,(#995C) pick up the timer (tick counter) 8A3D 3C INC A increment it 8A3E 32 5C 99 LD (#995C),A 8A41 E6 7F AND #7F do it every 128 ticks 8A43 20 4C JR NZ,#8A91 jump unless the timer has ticked over to #00 or #80 (in which case a minute of in-game time has passed and the clock is updated accordingly) ------ 10. Time running out at noon This solution was created by Daniel Gromann. It was first applied in "JSW: TNE". The original "JSW" uses a 12-hour am/pm clock. The code has a bug, due to which the hour after 11 am is 12 am (the code changes "a" to "p" when it changes "12" to " 1"). Furthermore, time does not run out at midnight(as advertised), but at 1 am (after the hour the game calls "12 pm"). Andrew Broad introduced 24-hour clock in his 2002 game "Goodnite Luddite". He explained the details of his solution, as well as the way the clock works in the original "JSW", in the Readme file accompanying the game. In the original "JSW", when a minute of in-game time has passed and the clock should be updated accordingly, the units digit of the minute is incremented and then there is code dealing further with the units digit of the minute and the tens digit of the minute. Then there is a check of the tens digit of the hour and the units digit of the hour (at #8A72 - #8A82). It is followed by a check of am/pm and the code changing "a" to "p" (at #8A83 - #8A96). If it is determined that the hour is 12.59 am, it is changed to 1.00 pm. If it is determined that the hour is 12.59 pm, the game returns to the title screen, because time has run out (in fact, the Game Over screen would seem a more appropriate consequence of running out of time). 8A72 DD 7E 00 LD A,(IX+#00) pick up the tens digit of the hour 8A75 FE 31 CP #31 is it currently 1? 8A77 20 20 JR NZ,#8A99 jump if not 8A79 DD 34 01 INC (IX+#01) increment the units digit of the hour 8A7C DD 7E 01 LD A,(IX+#01) pick up the new units digit 8A7F FE 33 CP #33 was it 2 before? (i.e. is it 3 now?) 8A81 20 28 JR NZ,#8AAB jump if not 8A83 The check of am/pm and the code changing "a" to "p" starts here. In the SE, after the check of the tens digit of the hour and the units digit of the hour (at #8A65 - #8A75), a jump to the "Time Up!!" Game Over screen follows (at #8A76 - #8A78). If it is determined that the hour is 11.59 am, the program displays the "Time Up!!" Game Over screen (unless the game has been completed and Willy is with his head down the toilet, in which case the program simply returns to the title screen). It starts with printing a flashing bright red "12:00 pm" on the time display, to drive home the message that it is high noon. 8A65 DD 7E 00 LD A,(IX+#00) pick up the tens digit of the hour 8A68 FE 31 CP #31 is it currently 1? 8A6A 20 0D JR NZ,#8A79 jump if not 8A6C DD 34 01 INC (IX+#01) increment the units digit of the hour 8A6F DD 7E 01 LD A,(IX+#01) pick up the new units digit 8A72 FE 32 CP #32 was it 1 before? (i.e. is it 2 now?) 8A74 20 15 JR NZ,#8A8B jump if not 8A76 C3 06 8C JP #8C06 jump to the code which prepares and executes the "Time Up!!" Game Over screen ------ 11. Time display changing colour when noon draws near This solution was created by Daniel Gromann. It was first applied, using different code, in "JSW: TNE". The game ends at noon. The time display colour is set to green (bright green on black PAPER screens) from the beginning of the game until 11.30. At 11.30 it changes to yellow (bright yellow on black PAPER screens) and at 11.50 it changes to red (bright red on black PAPER screens) to warn the player of the approaching deadline. The code which achieves it is as follows: 9ECB 3A 7F 85 LD A,(#857F) pick up the tens digit of the hour 9ECE FE 31 CP #31 is it 1? 9ED0 20 DE JR NZ,#9EB0 if it's not (i.e. it's before 10 am), make the display green 9ED2 3A 80 85 LD A,(#8580) pick up the units digit of the hour 9ED5 FE 30 CP #30 is it 0? 9ED7 28 D7 JR Z,#9EB0 if it is (i.e. it's before 11 am), make the display green 9ED9 3A 82 85 LD A,(#8582) pick up the tens digit of the minute 9EDC FE 33 CP #33 is it 3? 9EDE 28 D4 JR Z,#9EB4 if it is (i.e. it's between 11.30 and 11.39), make the display yellow 9EE0 FE 34 CP #34 is it 4? 9EE2 28 D0 JR Z,#9EB4 if it is (i.e. it's between 11.40 and 11.49), make the display yellow 9EE4 FE 35 CP #35 is it 5? 9EE6 28 D0 JR Z,#9EB8 if it is (i.e. it's between 11.50 and 11.59), make the display red 9EE8 18 C6 JR Z,#9EB0 make the display green The code which changes the colour of the time display is as follows: Set the value for green: 9EB0 3E 04 LD A,#04 set the colour to #04 (green) 9EB2 18 06 JR #9EBA jump to the continuation of the code Set the value for yellow: 9EB4 3E 06 LD A,#06 set the colour to #06 (yellow) 9EB6 18 02 JR #9EBA jump to the continuation of the code Set the value for red: 9EB8 3E 02 LD A,#02 set the colour to #02 (red) Change the colour and exit (this portion of the code is common to all three colours): 9EBA 32 C7 9E LD (#9EC7),A set the colour variable at #9EC7 to the appropriate value 9EBD 21 79 5A LD HL,#5A79 the change of INK colour will affect 9EC0 11 7A 5A LD DE,#5A7A the first seven blocks from the right 9EC3 01 06 00 LD BC,#0006 in the fifth row from the bottom 9EC6 36 #n LD (HL),#n change the colour to the value of the 9EC8 ED B0 LDIR address #9EC7 (#04 for green, #06 for yellow or #02 for red) 9ECA C9 RET and exit After this subroutine has been called up from #8A8B in the Main Loop, upon returning from the subroutine, the code which merges the INK colour of the time display with the PAPER colour and brightness setting of that part of the bottom third of the screen is enacted (via a call, at #8A8E, to #8B12). Following Ian Rushforth's advice, two parts of the Main Loop code - one of which prints the current time, and another part which updates the clock (when applicable) - have been transposed. Thanks to this modification, the colour change occurs at exactly the right time, i.e. 11:30am / 11:50am (and not a minute later, like in "JSW: TNE"). ------ 12. Room names displayed one row lower than in the original "JSW" This novelty was invented by Andy Ford, implementing an idea put forward by Ian Rushforth. It was first applied in "JSW: TNE". It uses the simple solution of modifying the value of the address #896D (#896C in the original "JSW") which defines the low byte of the room name's position on the screen. ------ 13. Optimised code which draws ropes This solution was created by Geoff Eddy. The solution, "rewritten for compactness" and using BCDE to store constants, was used in "WNM SE" on Ian Rushforth's advice. The following disassembly is based on Geoff Eddy's description of the code. 90D9 DD 7E 01 LD A,(IX+#01) 90DC DD CB 00 7E BIT 7,(IX+#00) depending on the direction 90E0 28 0C JR Z,#90EE 90E2 01 80 94 LD BC,#9480 we need different constants 90E5 11 12 00 LD DE,#0012 90E6 CB 7F BIT 7,A 90EA 28 19 JR Z,#9105 90EC 18 0A JR #90F8 90EE 01 00 14 LD BC,#1400 90F1 11 92 80 LD DE,#8092 90F4 CB 7F BIT 7,A 90F6 20 0D JR NZ,#9105 jump if moving right 90F8 D6 02 SUB #02 90FA B8 CP B 90FB 30 0F JR NC,#910C 90FD D6 02 SUB #02 90FF B9 CP C 9100 20 0A JR NZ,#910C 9102 7A LD A,D 9103 18 07 JR #910C 9105 C6 02 ADD #02 9107 BB CP E 9108 30 02 JR NC,#910C 910A C6 02 ADD #02 910C DD 77 01 LD (IX+#01),A 910F E6 7F AND #7F 9111 DD BE 07 CP (IX+#07) have we reached the end of the swing? 9114 C2 B6 91 JP NZ,#91B6 9117 DD 7E 00 LD A,(IX+#00) change direction if so 911A EE 80 XOR #80 911C DD 77 00 LD (IX+#00),A 911F C3 B6 91 JP #91B6 ------ 14. Optimised Game Over sequence This solution was created by Ian Rushforth. It makes a new subroutine of a chunk of code repeated several times in the original "JSW": E4F9 3C INC A E4FA E6 07 AND #07 E4FC F6 40 OR #40 E4FE C9 RET which is called eight times from the optimised Game Over sequence. In the first instance, the subroutine has a later entry point of #E4FA (so that the INC A is bypassed, as per the original code). ------ 15. Two Game Over screens and two Final Screens This extension was created by Daniel Gromann. It was applied, in a slightly different form, in "JSW: TNE". Before that, Final Screens were created for "Willy's Hoard" and "Jet Set Willy: The 2010 Megamix" (these games have no "Time Up!!" screens, however). When Willy loses his last life or runs out of time, before the program jumps to the Game Over sequence proper, certain variables are set to appropriate values in the Game Over sequence code, depending on the cause of the game's end. They include the addresses of the message text and the sprites to print, as well as the value of a relative jump within the routine which creates the Final Screens. Preparation of the "Game Over" Game Over and Final screens: 8787 21 FC CA LD HL,#CAFC set the correct address from which 878A 22 C5 8C LD (#8CC5),HL to pick up the text string "Game" 878D 21 FC ED LD HL,#EDFC set the correct address from which 8790 22 D1 8C LD (#8CD1),HL to pick up the text string "Over" 8793 3E 60 LD A,#60 set the correct address from which 8795 32 5F 8C LD (#8C5F),A to pick up the barrel sprite 8798 3E 40 LD A,#40 set the correct address from which 879A 32 79 8C LD (#8C79),A to pick up the foot sprite 879D 3E 46 LD A,#46 set the correct attributes 879F 32 A3 8C LD (#8CA3),A for the "Game Over" Game Over screen 87A2 3E 42 LD A,#42 set the correct attributes 87A4 32 AA 8C LD (#8CAA),A for the "Game Over" Game Over screen 87A7 3E 0F LD A,#0F set the correct value for the 87A9 32 28 97 LD (#9728),A relative jump during the creation of the Final Screen (to create the "Game Over" Final Screen) 87AC C3 42 8C JP #8C42 jump to the start of the Game Over sequence proper Preparation of the "Time Up!!" Game Over and Final screens: Restart the game if it has been completed: 8C06 3A 2B 8D LD A,(#8D2B) pick up the game mode indicator 8C09 FE 03 CP #03 is it 3? (i.e. is Willy with his head down the toilet?) 8C0B CA C7 87 JP Z,#87C7 if so, restart the game (it would be unfair to tell the player they have run out of time when in fact they have completed the game) Prepare the screen and print the flashing bright red "12:00pm": 8C0E CD FF 99 CALL #99FF call the routine which sets fixed attributes of the bottom third of the screen 8C11 3E C2 LD A,#C2 set the colour value to #C2 (flashing bright red on black) 8C13 CD BC 9E CALL #9EBC call the code which modifies the colour variable at #9EC9 and then changes the colour of the time display accordingly 8C16 DD 21 DE 85 LD IX,#85DE where to take the text from 8C1A 11 79 50 LD DE,#5079 where to print it on the screen 8C1D CD CB 8B CALL #8BCB call the code which will print it 8BCB 0E 06 LD C,#06 how long it will be 8BCD C3 90 9B JP #9B90 jump to the continuation of the code 9B90 CD 80 96 CALL #9680 print it 9B93 C9 RET and exit (i.e. in this case jump back to #8C20) Prepare the "Time Up!!" Game Over and Final screens: 8C20 3E 20 LD A,#20 set the correct address from which 8C22 32 5F 8C LD (#8C5F),A to pick up the clock sprite 8C25 AF XOR A set the correct address from which 8C26 32 79 8C LD (#8C79),A to pick up the arrow sprite 8C29 32 28 97 LD (#9728),A and the relative jump during the creation of the Final Screen (to create the "Time Up!!" Final Screen) 8C2C 3E 47 LD A,#47 set the correct attributes 8C2E 32 A3 8C LD (#8CA3),A for the "Time Up!!" Game Over screen 8C31 3E 43 LD A,#43 set the correct attributes 8C33 32 AA 8C LD (#8CAA),A for the "Time Up!!" Game Over screen 8C36 21 99 A7 LD HL,#A799 set the correct address from which 8C39 22 C5 8C LD (#8CC5),HL to pick up the text string "Time" 8C3C 21 A6 9B LD HL,#9BA6 set the correct address from which 8C3F 22 D1 8C LD (#8CD1),HL to pick up the text string "Up!!" The setting of the correct variables for the "Game Over" Game Over and Final screens ends with a jump to #8C42 where the Game Over sequence proper starts. In case of the preparation of the "Time Up!!" Game Over and Final screens there is no need for a jump, as the Game Over sequence proper is simply a direct continuation of the code which sets up the variables for the creation of the "Time Up!!" Game Over and Final screens. After the preparation is finished, the Game Over sequence proper runs its course, displaying different messages and different sprites depending on what caused the end of the game. When it ends, the game does not go back directly to the title screen, but to one of the Final Screens, depending on the reason for the end of the game (an absolute jump, from #8D19 to #971B, replaces the previous jump from #8D30 to ##87CA in the original "JSW"). The following code creates the Final Screens: Create a part of both the "Game Over" Final Screen and the "Time Up!!" Final Screen: 971B CD FA 88 CALL #88FA clear the entire display file 971E 21 00 58 LD HL,#5800 set the attributes for the entire 9721 11 01 58 LD DE,#5801 screen... (continued below) 9724 01 FF 17 LD BC,#17FF 9727 18 0F / 00 JR #9738 / #9729 jump to the continuation of the code; to #9738 for the "Game Over" Final Screen (the value of #9728 will have been set to #0F) or to #9729 for the "Time Up!!" Final Screen (the value of #9728 will have been set to #00) Create a part of the "Time Up!!" Final Screen: 9729 36 45 LD (HL),#45 ... (set the attributes for the 972B ED B0 LDIR screen) to bright cyan on black Print "You have run out of time!": 972D DD 21 6F 87 LD IX,#876F where to take the text from 9731 11 44 40 LD DE,#4044 where to print it on the screen 9734 0E 19 LD C,#19 how long it will be 9736 18 0D JR #9745 jump to the continuation of the code Create a part of the "Game Over" Final Screen: 9738 36 46 LD (HL),#46 ... (set the attributes for the 973A ED B0 LDIR screen) to bright yellow on black Print "You have lost all your lives!": 973C DD 21 8B 85 LD IX,#858B where to take the text from 9740 11 42 40 LD DE,#4042 where to print it on the screen 9743 0E 1D LD C,#1D how long it will be Create the rest of both the "Game Over" Final Screen and the "Time Up!!" Final Screen: 9745 CD 80 96 CALL #9680 print it ("You have run out of time!" or "You have lost all your lives!") 9748 21 C0 59 LD HL,#59C0 set the attributes for rows 15 and 974B 11 C1 59 LD DE,#59C1 16 of the screen 974E 01 3F 00 LD BC,#003F (i.e. where the skull will be) 9751 36 42 LD (HL),#42 - make them bright red on black 9753 ED B0 LDIR 9755 21 66 59 LD HL,#5966 set the attributes for 9758 11 67 59 LD DE,#5967 "WILLY'S NEW MANSION." 975B 01 13 00 LD BC,#0013 975E 36 43 LD (HL),#43 - make them bright magenta on black 9760 ED B0 LDIR Print "You have failed to meet": 9762 DD 21 D6 83 LD IX,#83D6 where to take the text from 9766 11 A5 40 LD DE,#40A5 where to print it on the screen 9769 0E 17 LD C,#17 how long it will be 976B CD 80 96 CALL #9680 print it Print "the challenge of": 976E DD 21 EC 83 LD IX,#83EC where to take the text from 9772 11 08 48 LD DE,#4808 where to print it on the screen 9775 0E 10 LD C,#10 how long it will be 9777 CD 80 96 CALL #9680 print it Print "WILLY'S NEW MANSION": 977A DD 21 41 81 LD IX,#8141 where to take the text from 977E 11 66 48 LD DE,#4866 where to print it on the screen 9781 0E 14 LD C,#14 how long it will be 9783 CD 80 96 CALL #9680 print it Reset the timer (tick counter): 9786 AF XOR A reset the timer to 0 so that the same 9787 32 5C 99 LD (#995C),A frame of the skull (No. 4) is always printed first Print the skull: 978A CD D6 97 CALL #97D6 call the subroutine which prints one of the four animation frames of the skull depending on the timer; since the timer has just been reset, the subroutine will always print frame No. 4 Play a short tune and check whether ENTER, 0 or the fire button is being pressed and, if so, restart the game: 978D 3E FF LD A,#FF set the value of the address #81A3 978F 32 A3 81 LD (#81A3),A to #FF (so that it will terminate the tune when the tune-playing routine reaches it) 9792 21 84 81 LD HL,#8184 point HL at the "In the Hall of the Mountain King" tune data at #8184 9795 CD A2 96 CALL #96A2 play the tune 9798 C2 C7 87 JP NZ,#87C7 restart the game if ENTER, 0 or the fire button is being pressed Set the attributes for "Press ENTER to restart the game!": 979B 21 40 5A LD HL,#5A40 979E 11 41 5A LD DE,#5A41 97A1 01 1F 00 LD BC,#001F 97A4 3A 40 5A LD A,(#5A40) pick up the current attribute (it's bright yellow on black on the "Game Over" Final Screen and bright cyan on black on the "Time Up!!" Final Screen) 97A7 C6 40 ADD A,#40 increment the attribute by #40 (which 97A9 77 LD (HL),A will keep the same colours but make 97AA ED B0 LDIR them flash and non-bright) Print "Press ENTER to restart the game!": 97AC 21 55 81 LD HL,#8155 where to take the text from 97AF 11 40 50 LD DE,#5040 where to print it on the screen 97B2 0E 20 LD C,#20 how long it will be 97B4 CD 80 96 CALL #9680 print it The final loop Make a short pause: 97B7 21 00 FF LD HL,#FF00 read through addresses FF00-FFFF, 97BA 4E LD C,(HL) without changing their contents; 97BB 7D LD A,L the pause is introduced so that the 97BC A9 XOR C animation of the skull happens at 97BD AC XOR H an optimal speed 97BE 71 LD (HL),C 97BF 23 INC HL 97C0 CB 7C BIT 7,H 97C2 20 F6 JR NZ,#97BA Increase the timer: 97C4 3A 5C 99 LD A,(#995C) 97C7 3C INC A 97C8 32 5C 99 LD (#995C),A Print the animated skull: 97CB CD D6 97 CALL #97D6 call the subroutine which prints one of the four animation frames of the skull depending on the timer Check whether ENTER, 0 or the fire button is being pressed and, if so, restart the game: 97CE CD C9 96 CALL #96C9 check whether ENTER, 0 or the fire button is being pressed 97D1 C2 C7 87 JP NZ,#87C7 restart the game if it is 97D4 18 E1 JR #97B7 otherwise jump back to the start of the final loop Subroutine which prints and animates the skull: 97D6 21 CF 48 LD HL,#48CF where to print it on the screen 97D9 16 BA LD D,#BA the high byte of the address from which to take the sprite will be #BA 97DB 3A 5C 99 LD A,(#995C) pick up the timer (this will determine the skull's animation frame) 97DE B7 OR A is it #00? 97DF 28 13 JR Z,#97F4 if it is, jump to the code which will print the skull's animation frame No. 4 97E1 FE 40 CP #40 is it #40? 97E3 28 13 JR Z,#97F8 if it is, jump to the code which will print the skull's animation frame No. 1 97E5 FE 80 CP #80 is it #80? 97E7 28 13 JR Z,#97FC if it is, jump to the code which will print the skull's animation frame No. 2 97E9 FE C0 CP #C0 is it #C0? 97EB 28 01 JR Z,#97EE if it is, jump to the code which will print the skull's animation frame No. 3 97ED C9 RET otherwise exit 97EE 1E 40 LD E,#40 the low byte of the address from which to take the sprite will be #40 (i.e. the sprite will be taken from #BA40) 97F0 CD 56 94 CALL #9456 print it 97F3 C9 RET and exit 97F4 1E 60 LD E,#60 the low byte of the address from which to take the sprite will be #60 (i.e. the sprite will be taken from #BA60) 97F6 18 F8 JR #97F0 jump to the continuation of the code to print the sprite and exit 97F8 1E 00 LD E,#00 the low byte of the address from which to take the sprite will be #00 (i.e. the sprite will be taken from #BA00) 97FA 18 F4 JR #97F0 jump to the continuation of the code to print the sprite and exit 97FC 1E 20 LD E,#20 the low byte of the address from which to take the sprite will be #20 (i.e. the sprite will be taken from #BA20) 97FE 18 F0 JR #97F0 jump to the continuation of the code to print the sprite and exit The Final-Screen tune features a part of an in-game tune played by the title-screen tune routine. It ends thanks to the address #81A3 in the "In the Hall of the Mountain King" tune data being changed to #FF. When the game is restarted, it is necessary to restore the proper value (#56) of this address so that "In the Hall of the Mountain King" plays correctly as an in-game tune. This is done at #880C – #8810. ------ 16. Teleportation This solution was created by John Elliott. It is documented on his website at http://seasip.info/Jsw/jswtel.html. Andrew Broad's document "Technical Notes on Jet Set Willy: The Lord Of The Rings" (http://www.oocities.org/andrewbroad/spectrum/download/tolkien.zip) contains useful notes describing how to apply John's teleporter extension, including its disassembly, which I have used for the disassembly presented below. In "WNM SE" the teleporter extension has been enriched with a call to Geoff Eddy's "nice fuzzy border effect" routine. Furthermore, it has been shortened by eliminating unnecessary PUSH and POP instructions thanks to Ian Rushforth's analysis and helpful insight. The teleporter extension is called from #8B7E and has the following code: 86B4 DD 21 64 83 LD IX,#8364 point to the start of teleporter data 86B8 11 04 00 LD DE,#04 4 bytes for each teleporter 86BB DD 46 00 LD B,(IX+0) pick up the number of teleporters 86BE DD 23 INC IX IX now points to the first teleporter 86C0 78 LD A,B 86C1 B7 OR A 86C2 C8 RET Z exit if no teleporters 86C3 3A 20 84 LD A,(#8420) pick up the current room - does it 86C6 DD BE 00 CP (IX+0) match the source room of teleporter? 86C9 20 1F JR NZ,#86EA if not, then jump to the next teleporter 86CB 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate 86CE DD BE 01 CP (IX+1) does it match that of teleporter? 86D1 20 17 JR NZ,#86EA if not, then jump to the next teleporter 86D3 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 86D6 E6 1F AND #1F (just the 5 least significant bits) 86D8 DD BE 02 CP (IX+2) does it match that of teleporter? 86DB 20 0D JR NZ,#86EA if not, then jump to the next teleporter 86DD DD 7E 03 LD A,(IX+3) 86E0 32 20 84 LD (#8420),A set current room to target room 86E3 CD EC 99 CALL #99EC call Geoff Eddy's "nice fuzzy border effect" routine 86E6 C1 POP BC 86E7 C3 13 89 JP #8913 enter and draw the destination room 86EA DD 19 ADD IX,DE next teleporter (IX:= IX + 4) 86EC 10 D5 DJNZ #86C3 loop back to #86C3 86EE C9 RET exit ------ 17. Willy's "death throes" extended when he loses a life This solution was created by Andy Ford. It was first applied in "JSW: TNE". It uses the simple trick of modifying the value of the address #9E57 (corresponding to #8C02 in the original "JSW") to #57, which produces three rapid "sneeze" noises as the screen background flashes through red, blue and black. ------ 18. Extensions to the code after Willy has collected the last item and at the beginning and end of the toilet run These extensions were created by Daniel Gromann. The doubling of the speed of the in-game tune (applied at the end of the toilet run) was invented by Ian Rushforth. The code making the number of items collected flash upon reaching 256 was written by Ian Rushforth to conform with the Global Seamlessness concept. After Willy has collected the last item: 9E9A 3E 01 LD A,#01 change the game mode indicator 9E9C 32 2B 8D LD (#8D2B),A to 1 (all items collected) 9E9F 3E 06 LD A,#06 change Willy's colour 9EA1 32 2D 96 LD (#962D),A to #06 (yellow) 9EA4 21 70 5A LD HL,(#5A70) the address of the first flashing character on the status bar 9EA7 CB FE SET 7,(HL) set the FLASH bit 9EA9 23 INC HL move along to the next character 9EAA CB FE SET 7,(HL) set the FLASH bit 9EAC 23 INC HL move along to the next character 9EAD CB FE SET 7,(HL) set the FLASH bit 9EAF C9 RET and exit There is an initialisation command in the "Display the title screen and play the theme tune" routine, which restores Willy's colour to white at the start of the next game. In relation to Willy's colour change upon collecting all items, see also the discussion in Section 20.3.D of this document. At the start of the toilet run: 957F 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate 9582 FE 50 CP #50 is he (the top of his head) 5 rows from the top of the screen? 9584 D0 RET NC exit if he's more than that (i.e. in the lower part of the room) 9585 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 9588 E6 1F AND #1F (just the 5 least significant bits) 958A FE 06 CP #06 is he 6 columns from the left edge of the screen? 958C D0 RET NC exit if he's more than that (i.e. he hasn't reached the bed yet) 958D 3E 44 LD A,#44 change Willy's colour 958F 32 2D 96 LD (#962D),A to #44 (bright green) 9592 3E 02 LD A,#02 change the game mode indicator 9594 32 2B 8D LD (#8D2B),A to 2 (Willy's on the toilet run) 9597 C RET and exit This modified code which checks whether Willy has reached the bed in "The Cosy Upstairs Bedroom" (with all items collected, after Maria has disappeared) eliminates a glitch in the OE which Ian Rushforth has spotted. In the OE, if Willy collects the items on the left side of the dividing wall in "The Cosy Upstairs Bedroom" as the last ones, the toilet run starts as soon as Willy reaches the x-coordinate of the right edge of the bed (six columns from the left). As a result, Willy runs rightwards and gets stuck against the dividing wall, meaning that the game cannot be completed. In the SE, the modified code does not start the toilet run if Willy is below the level of the upper floor. The items on the left side of the dividing wall can therefore be collected as the last ones safely. At the end of the toilet run: 9B5A 3A 20 84 LD A,(#8420) pick up the current room 9B5D FE 21 CP #21 is it "The Multi-Toilet Bathroom"? 9B5F C0 RET NZ exit if it is not 9B60 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 9B63 FE BC CP #BC is it 28 (where the toilet is)? 9B65 C0 RET NZ exit if it is not 9B66 AF XOR A reset the timer to 0 so that we get 9B67 32 5C 99 LD (#995C),A to see Willy's head down the toilet for at least a whole in-game minute 9B6A 3E 03 LD A,#03 change the game mode indicator 9B6C 32 2B 8D LD (#8D2B),A to 3 (Willy's head is down the toilet) 9B6F 21 45 45 LD HL,#4545 set the colour of the toilet and 9B72 22 BF 95 LD (#95BF),HL Willy in it to #45 (bright cyan) 9B75 21 3F 00 LD HL,#003F modify the addresses #8B64 and #8B65 9B78 22 64 8B LD (#8B64),HL to double the speed of the in-game tune 9B7B DD 21 11 9B LD IX,#9B11 where to take the text from 9B7F 11 EE 70 LD DE,#70EE where to print it on the screen 9B82 0E 0A LD C,#0A how long it will be 9B84 CD 80 96 CALL #9680 print "WELL DONE!" 9B87 DD 21 FE 9A LD IX,#9AFE where to take the text from 9B8B 11 2C 78 LD DE,#782C where to print it on the screen 9B8E 0E 0F LD C,#0F how long it will be 9B90 CD 80 96 CALL #9680 print "GAME COMPLETED!" 9B93 C9 RET and exit Ian Rushforth's change to the in-game tune routine doubles the speed of the tune once Willy has reached the toilet. It is necessary to revert that effect at the start of the next game, hence the code at #8817 – #881C which initialises the proper values for the in-game tune playing at regular speed. There is also an initialisation command in the "Display the title screen and play the theme tune" routine, which restores the colour of the toilet to white at the start of the next game. ------ 19. Customised check related to Maria In the original "JSW", in "Master Bedroom" Maria stops stomping her foot and half-raises her arm when Willy is between one and eight pixels above the floor level. When he is more than eight pixels above the floor level, she raises her arm fully and points her finger to tell him to go and clean the mansion. The code which assures this involves two checks against Willy's y-coordinates. In "WNM SE", in "The Cosy Upstairs Bedroom", the code has been tailored to the needs of the game, involving checks both for Willy's x- and y-coordinates, so that Maria stops stomping her foot and half-raises her arm when Willy is one third of the way up the ramp leading to the actual bedroom, and raises her arm fully when he is two thirds of the way up the ramp. However, when Willy is in the lower left part of the room, from which there is no passage to the ramp or the actual bedroom, Maria ignores his close physical presence as if she knew that he cannot enter the actual bedroom this way. The following code achieves it: 9541 3A 5C 99 LD A,(#995C) pick up the timer (this will determine Maria's animation frame) 9544 E6 02 AND #02 keep only bit 1, move it to bit 5 and set bit 7 9546 0F RRCA 9547 0F RRCA 9548 0F RRCA 9549 0F RRCA 954A F6 80 OR #80 954C 5F LD E,A now E=#80 (foot down) or #A0 (foot raised) 954D 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 9550 E6 1F AND #1F (just the 5 least significant bits) 9552 FE 14 CP #14 is he 20 columns from the left edge of the room (i.e. to the left of the dividing wall)? 9554 38 0F JR C,#9565 if so or less, jump to the code which draws Maria 9556 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate 9559 FE A0 CP #A0 is he (the top of his head) 10 rows from the top of the screen (i.e. is he one third of the way up along the ramp?) 955B 30 08 JR NC,#9565 if so or more (i.e. if he is lower), jump to the code which draws Maria 955D 1E C0 LD E,#C0 E=#C0 (Maria is raising her arm) 955F FE 70 CP #70 is he (the top of his head) 7 rows from the top of the screen (i.e. is he two thirds of the way up along the ramp?) 9561 30 02 JR NC,#9565 if so or more (i.e. if he is lower), jump to the code which draws Maria 9563 1E E0 LD E,#E0 E=#E0 (Maria's arm is fully raised) 9565 Start of the code which draws Maria. It is the same code as in the original "JSW" (where it starts at #955C), with the exception of the values which define Maria's attributes. In the original "JSW" these are: at #956A and #956B (#45, #45 for bright cyan - top half of Maria's sprite) and at #9570 and #9571 (#07, #07 for white - bottom half of Maria's sprite). In "WNM SE" they are at #9573 and #9574 (top half of Maria's sprite) and at #9579 and #957A (bottom half of Maria's sprite), and they are all #42 for bright red. ------ 20. Patch Vectors 20.1 General info One of the notable features of "WNM SE" is that it uses the so-called Patch Vectors (PVs). They draw on the technical innovations introduced into JSW games over a decade ago by Geoff Eddy. Back in 1999-2002 he released four games which used two kinds of a modified JSW48 game engine, whose characteristic feature was the use of PVs. These games were: "J4 (The Fourth Remix)", "Willy the Hacker", "Willy Takes a Trip" (all three using the so-called Geoff Mode 1 of the game engine) and "ZX Willy the Bug Slayer" (using the so-called Geoff Mode 2 of the game engine). Main Loop PVs are subroutines called from the Main Loop to produce some special effects in the room in which they are called. As Geoff himself explained: "Two bytes within the room data specify the location of a subroutine which is called every tick, after Willy and all the guardians, items and arrows have been displayed but before the room data is finally copied to the screen. This subroutine, which may be different for each room, is known as the 'patch vector', for now-forgotten reasons." I have written a simple instruction of how to apply PVs in JSW48 games. It is available on JetSet Willy & Manic Miner Community at http://jswmm.co.uk/topic/180-inserting-patch-vectors-in-jsw48-games/?st=0. PVs are applied in all rooms of "WNM SE". Some of them have been copied from Geoff Eddy's games (in many cases – with modifications and adjustments); the rest are PVs created by myself (Daniel Gromann), or by Ian Rushforth, or by us both together. ------ 20.2 Geoff Eddy's PVs Geoff Eddy offered a disassembly of his PVs on his website. It has sadly been offline for a while, but its old copies can still be retrieved via the Wayback Machine, e.g. at https://web.archive.org/web/20050227204009/http://www.cix.co.uk/~morven/jsw/patches.html. Geoff's disassemblies were an invaluable help which allowed the use and customisation of his PVs in "WNM SE". Selected PVs from all of his games have been used in "WNM SE". An exhaustive list follows. Geoff's descriptions in his disassembly have been widely used for the descriptions of his PVs in this Readme. A. PV from "J4 (The Fourth Remix)" by Geoff Eddy, Iain Eddy and Alasdair Swanson (1999) PV used in the room "Willy's Inner Sanctum" (16), which changes the colour of one of the guardians, making it look like a multicolour guardian, is applied in "The Cellar", "Cavernous Crossroads" and "Main Hallway West". The PV is modified from its original form, because it uses the timer ("tick counter") at #995C rather than the tens digit of the hour at #8585 (which Geoff Eddy calls a "timer" in the disassembly of "J4 (The Fourth Remix)", as the time format in that game is modified in relation to the original "JSW"). 8174 21 D3 85 LD HL,#85D3 pick up Willy's x-coordinate 8177 11 01 81 LD DE,#8101 pick up the colour of the first guardian 817A 3A 5C 99 LD A,(#995C) pick up the timer 817D AE XOR (HL) not quite a random number 817E E6 0F AND #0F mask off bottom 4 bits 8180 F6 E0 OR #E0 this is an 8-position sprite 8182 12 LD (DE),A change its colour 8183 C9 RET and exit B. PV from "Willy the Hacker" by Geoff Eddy (1999) PV used in the room "Willy gets some 3D glasses" (45), which changes the colour of one of the horizontal guardians depending on its horizontal position, is applied in "In the Forest" (in a modified form wherein the change is continuous rather than depending on which half of the screen the guardian is currently in) and in "JSW's 20th Anniversary Party" (in the original form). "In the Forest" DBFB 3E 02 LD A,#02 set register A to #02 DBFD C3 F9 D8 JP #D8F9 jump to the continuation of the code D8F9 32 A3 86 LD (#86A3),A set the value of the address #86A3 to #02 D8FC C3 9F 86 JP #869F jump to the continuation of the code 869F 3A 02 81 LD A,(#8102) pick up the x-coordinate of the first guardian 86A2 E6 02 AND #02 do it every two columns 86A4 0E 04 LD C,#04 it becomes green 86A6 28 02 JR Z,#86AA or 86A8 OE 07 LD C,#07 it becomes white 86AA 3A 01 81 LD A,(#8101) clobber current colour 86AD E6 F0 AND #F0 86AF B1 OR C set it to 86B0 32 01 81 LD (#8101),A what we really want 86B3 C9 RET and exit --- "JSW's 20th Anniversary Party" E8FB 3E 10 LD A,#10 set register A to #10 E8FD C3 F9 D8 JP #D8F9 jump to the continuation of the code D8F9 32 A3 86 LD (#86A3),A set the value of the address #86A3 to #10 D8FC C3 9F 86 JP #869F jump to the continuation of the code 869F 3A 02 81 LD A,(#8102) pick up the x-coordinate of the first guardian 86A2 E6 10 AND #10 if it's in the left half 86A4 0E 04 LD C,#04 it becomes green 86A6 28 02 JR Z,#86AA otherwise 86A8 OE 07 LD C,#07 it is white 86AA 3A 01 81 LD A,(#8101) clobber current colour 86AD E6 F0 AND #F0 86AF B1 OR C set it to 86B0 32 01 81 LD (#8101),A what we really want 86B3 C9 RET and exit C. PVs from "Willy Takes a Trip" by Geoff Eddy (2000) a. PV used in the room "The Underground Laboratory" (02), which moves bright white squares across the top and bottom rows of the screen, in opposite directions, is applied in "Internet Cafe". 86FE 3A 5C 99 LD A,(#995C) pick up the timer 8701 E6 1F AND #1F chop to range 0-31 (#00 - #1F) 8703 26 5C LD H,#5C beginning of attributes 8705 6F LD L,A i.e. the top line on the screen 8706 36 FF LD (HL),#FF drop a white square 8708 24 INC H move to the bottom half of the screen 8709 3E FF LD A,#FF flip the bits 870B AD XOR L so we're on the bottom line 870C 6F LD L,A but moving in the opposite direction 870D 36 FF LD (HL),#FF drop the other white square 870F C9 RET and exit b. PV used in "The Room of Stippled Blocks" (09), which sends two killer squares flying across the screen, is applied in "Jump'n'Jive" and "The Anteroom" (with a modification from the original concerning the attributes of the killer blocks). "The Anteroom" 8574 3E 2D LD A,#2D set the value of the address #96E5 8576 32 E5 96 LD (#96E5),A to #2D 8579 C3 DE 96 JP #96DE jump to the continuation of the code 96DE 3A 5C 99 LD A,(#995C) pick up the timer 96E1 26 5C LD H,#5C look in the top half 96E3 6F LD L,A of the attributes buffer 96E4 3E 2D LD A,#2D set the attributes to cyan on cyan 96E6 4F LD C,A always 96E7 7E LD A,(HL) if Willy's been 96E8 3C INC A hit by one of the blocks 96E9 E6 07 AND #07 it will have INK #07 (now 0) 96EB 28 0D JR Z,#96FA so we jump forward 96ED 71 LD (HL),C drop the square 96EE 7D LD A,L move to the lower half 96EF 24 INC H of the screen and 96F0 2F CPL invert the address 96F1 6F LD L,A so they meet in the middle 96F2 7E LD A,(HL) check once again 96F3 3C INC A to see if Willy's been hit 96F4 E6 07 AND #07 96F6 28 02 JR Z,#96FA 96F8 71 LD (HL),C drop the square again 96F9 C9 RET and exit 96FA E1 POP HL clean up the stack 96FB 3A 5C 99 LD A,(#995C) flag Willy as killed 96FE C6 02 ADD A,#02 increase the timer to ensure that the block that killed Willy has moved on before he "respawns", so as to avoid an IDS 9700 32 5C 99 LD (#995C),A 9703 C3 53 9E JP #9E53 and do the rest as normal The PV in "Jump'n'Jive" works in the same way, with the only exception being that the attributes of the killer blocks are set to bright magenta INK on red PAPER (#53) at the beginning: E5FB 3E 53 LD A,#53 set register A to #53 E5FD C3 76 85 JP #8576 jump to the continuation of the code c. PV used in the room "A Quiet Corner to rest in" (10), which provides a moving platform which can carry Willy over obstacles, is applied in "A Forest Clearing on Fire!" (in a modified form, using an Earth cell from another room rather than from the same one as the lift). 8722 08 5F DEFW #5F08 important address: the middle of the screen 8724 ED 5B 22 87 LD DE,(#8722) get hold of it 8728 21 A0 F3 LD HL,#F3A0 start of the Air cell data in "The Dining Hall" 872B CD A4 8F CALL #8FA4 print it 872E 3A 5C 99 LD A,(#995C) pick up the timer 8731 CB 7F BIT 7,A if it is > 127 8733 28 01 JR Z,#8736 then invert it so that 8735 2F CPL A goes from 0 to 127 and back 8736 FE 60 CP #60 make sure that A 8738 38 02 JR C,#873C is always between 873A 3E 60 LD A,#60 #60 and #20 873C FE 20 CP #20 so that the lift 873E 30 02 JR NC,#8742 waits for a bit at each end 8740 3E 20 LD A,#20 of its travels 8742 CB 3F SRL A divide A by 4 so that 8744 CB 3F SRL A the lift moves slowly enough 8746 5F LD E,A to be walked on 8747 21 B2 F3 LD HL,#F3B2 start of the Earth cell data in "The Dining Hall" 874A CD A4 8F CALL #8FA4 print it 874D ED 53 22 87 LD (#8722),DE and save its location 8751 C9 RET and exit print a single platform block pointed to by HL at DE in attributes: 8FA4 E5 PUSH HL 8FA5 D5 PUSH DE 8FA6 C5 PUSH BC 8FA7 7E LD A,(HL) 8FA8 12 LD (DE),A attribute 8FA9 23 INC HL 8FAA 7A LD A,D 8FAB D6 5C SUB #5C 8FAD 07 RLCA 8FAE 07 RLCA 8FAF 07 RLCA 8FB0 C6 60 ADD #60 8FB2 57 LD D,A now DE holds display address 8FB3 06 08 LD B,#08 8FB5 7E LD A,(HL) 8FB6 12 LD (DE),A 8FB7 14 INC D 8FB8 23 INC HL 8FB9 10 FA DJNZ #8FB5 8FBB C1 POP BC 8FBC D1 POP DE 8FBD E1 POP HL 8FBE C9 RET d. PV used in the rooms "Phew, That Was Lucky! (11) and "The Arches of Despair, I fear" (18), which reverses the direction of the conveyor every 32 ticks, is applied in "The Single Item Cave", "The Olympic Swimming Pool" and "The Underground Pantry". 8411 3A 5C 99 LD A,(#995C) pick up the timer 8414 E6 1F AND #1F do it every 32 ticks 8416 C0 RET NZ only 8417 3A D6 80 LD A,(#80D6) direction of the conveyor 841A EE 01 XOR #01 alternate it between #00 (left) and #01 (right) 841C 32 D6 80 LD (#80D6),A apply the change 841F C9 RET and exit e. PV used in the room "Holy Floor!" (46), which changes the colour of one of the guardians, is applied in "The Great Descent", "The Volleyball Court", "A Bit of Fresh Air" and "West Stairway". 9706 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 9709 47 LD B,A 970A 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate 970D A8 XOR B 970E E6 0F AND #0F 9710 47 LD B,A 9711 3A 01 81 LD A,(#8101) pick up the colour of the first guardian 9714 E6 F0 AND #F0 9716 B0 OR B 9717 32 01 81 LD (#8101),A change the colour of the first guardian 971A C9 RET and exit f. PV used in the room "but no sympathy" (53), which opens a gap in the wall after all items in another room have been collected, is applied (in a modified form so that the gaps are located at different coordinates) in "The Mammoth Cave" and "Willy's Private Fort Knox". "Willy's Private Fort Knox" Preparation of the variables for this room: 9A51 21 AB 5F LD HL,#5FAB set the value of the addresses #9A66 9A54 22 66 9A LD (#9A66),HL - #9A67 to #AB and #5F, respectively 9A57 3E CB LD A,#CB set the value of the address #9A6C 9A59 32 6C 9A LD (#9A6C),A to #CB PV proper: 9A5C CD 7B 9A CALL #9A7B count the items 9A5F 78 LD A,B if some are 9A60 A7 AND A still left, 9A61 C0 RET NZ quit 9A62 21 A0 80 LD HL,#80A0 start of the Air cell data 9A65 11 AB 5F LD DE,#5FAB location on the screen where the top half of the gap will be opened 9A68 CD A4 8F CALL #8FA4 print it 9A6B 1E CB LD E,#CB bottom of gap 9A6D C3 A4 8F JP #8FA4 print it The item-counting subroutine: 9A7B AF XOR A the index of the first item (there are 256 items in the game) 9A7C 26 A4 LD H,#A4 the item table 9A7E 06 00 LD B,#00 counts items still to collect 9A80 6F LD L,A the first item 9A81 4E LD C,(HL) get the room number 9A82 CB B9 RES 7,C by killing top bit 9A84 3E 27 LD A,#27 room number 39 9A86 F6 40 OR #40 has this item 9A88 B9 CP C been collected? 9A89 20 01 JR NZ,#9A8C jump if not 9A8B 04 INC B increment count 9A8C 2C INC L look at the next item 9A8D 20 F2 JR NZ,#9A81 go round again 9A8F C9 RET exit The PV in "The Mammoth Cave" works in the same way. It begins with setting the proper values for this room: C2F5 21 27 5E LD HL,#5E27 set the value of the addresses #9A66 C2F8 22 66 9A LD (#9A66),HL - #9A67 to #27 and #5E, respectively C2FB 3E 47 LD A,#47 set register A to #47 C2FD C3 59 9A JP #9A59 jump to the continuation of the code 9A59 32 6C 9A LD (#9A6C),A set the value of the address #9A6C to #47 and the rest is the same as in "Willy's Private Fort Knox". g. PV used in the room "Magic Mushrooms" (58), which changes the colour of the guardians, is applied in "The Cinema" (in a modified form which makes the guardians flicker in white and cyan only – in this case, both colours are also non-bright – even where the guardian, such as the Chef, is originally set, in the guardian definition bytes, to be bright) and in "Primum non nocere" (in the original form). "The Cinema" 85AC 3E F5 LD A,#F5 set the value of the address #85C1 85AE 32 C1 85 LD (#85C1),A to #F5 85B1 3A 5C 99 LD A,(#995C) pick up the timer 85B4 E6 02 AND #02 do it every other tick 85B6 C8 RET Z only 85B7 06 07 LD B,#07 7 guardians 85B9 21 01 81 LD HL,#8101 address of the colour of the first guardian 85BC 11 08 00 LD DE,#0008 number of bytes of data 85BF 7E LD A,(HL) change the colour 85C0 E6 F5 AND #F5 85C2 4F LD C,A 85C3 7E LD A,(HL) 85C4 E6 07 AND #07 85C6 3C INC A 85C7 B1 OR C 85C8 77 LD (HL),A 85C9 19 ADD HL,DE 85CA 10 F3 DJNZ #85BF repeat until done 85CC C9 RET then exit The value #07 at #85B8, corresponding to 7 guardians, is proper for the other room where this PV is used – "Primum non nocere", but it does not affect its performance in "The Cinema" adversely. In "Primum non nocere" the value of #85C1 is set to be #F8 at the beginning of the PV: 85A8 3E F8 LD A,#F8 set register A to #F8 85AA 18 02 JR #85AE jump to the continuation of the code This allows the effect in "Primum non nocere" to be exactly as in Geoff Eddy's "Magic Mushrooms" (with the guardians cycling through eight colours, whilst retaining their original brightness setting), while the value of #F5 in "The Cinema" makes the guardians alternate between non-bright white and cyan only. h. PV used in the room "Weeds" (59), which changes Willy's colour according to his x-coordinate, is applied in "The Hypnotherapy Room" (in its original form) and in "The Changing Room" (in a modified form which alternates Willy's colour between white and yellow only). "The Hypnotherapy Room" F4FB 3E 07 LD A,#07 set register A to #07 F4FD C3 D0 8B JP #8BD0 jump to the continuation of the code 8BD0 32 D9 8B LD (#8BD9),A set the value of the address #8BD9 to #07 8BD3 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 8BD6 0F RRCA divide by four 8BD7 0F RRCA 8BD8 E6 07 AND #07 and force it into the range #00 - #07 8BDA EE 07 XOR #07 brightest at left 8BDC 4F LD C,A 8BDD 06 00 LD B,#00 8BDF 2A D3 85 LD HL,(#85D3) start of the routine which does the actual colouring 8BE2 11 1F 00 LD DE,#001F 8BE5 CD FF 8B CALL #8BFF 8BE8 23 INC HL 8BE9 CD FF 8B CALL #8BFF 8BEC 19 ADD HL,DE 8BED CD FF 8B CALL #8BFF 8BF0 23 INC HL 8BF1 CD FF 8B CALL #8BFF 8BF4 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate 8BF7 E6 0F AND #0F 8BF9 C8 RET Z 8BFA 19 ADD HL,DE 8BFB CD FF 8B CALL #8BFF 8BFE 23 INC HL 8BFF 7E LD A,(HL) 8C00 E6 B8 AND #B8 8C02 B0 OR B 8C03 B1 OR C 8C04 77 LD (HL),A 8C05 C9 RET exit In "The Changing Room" the value of #8BD9 is set to #01: C8FB 3E 01 LD A,#01 set register A to #01 C8FD C3 D0 8B JP #8BD0 jump to the continuation of the code which makes Willy alternate between white and yellow every four columns, instead of going through all colours (from black to white) depending on his x-coordinate (from right to left). D. PVs from "ZX Willy the Bug Slayer" by Geoff Eddy (2002) a. PV used in the room "Network Port" (21), which makes the ramps go in both directions, is applied in "The River of No Return". 8710 21 DA 80 LD HL,#80DA pick up the direction of the ramp 8713 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 8716 E6 1F AND #1F (just the 5 least significant bits) 8718 FE 10 CP #10 is he in the right half? 871A 30 03 JR NC,#871F if he is, jump to the code which will make the ramp go left 871C 36 01 LD (HL),#01 otherwise make it go right 871E C9 RET and exit 871F 36 00 LD (HL),#00 make the ramp go left 8721 C9 RET and exit b. PV used in the room "3D PacVaders" (61), which animates the attributes on top of the screen, is applied in "Dynamite Dan would love this!" (in the original form) and in "Altar to an Unknown God" (in a modified form so that only the top of the altar glimmers). "Dynamite Dan would love this!" 9BD5 21 01 5C LD HL,#5C01 the first attribute 9BD8 06 1E LD B,#1E 30 attributes to change 9BDA 18 14 JR #9BF0 jump to the continuation of the code 9BF0 3A 5C 99 LD A,(#995C) pick up the timer 9BF3 E6 01 AND #01 A = 0 or 1 9BF5 07 RLCA A = 0 or 2 9BF6 07 RLCA A = 0 or 4 9BF7 C6 02 ADD A,#02 A = 2 or 6 (00000010 or 00000110 in binary) 9BF9 77 LD (HL),A change it 9BFA 23 INC HL move to the next one 9BFB EE 04 XOR #04 swap colour (00000100 in binary) – toggles bit 2 9BFD 10 FA DJNZ #9BF9 do more 9BFF C9 RET and exit The PV in "Altar to an Unknown God" works in the same way, but changes only 6 attributes located in a different spot than the ones which are changed in "Dynamite Dan would love this!": 9BEB 21 29 5C LD HL,#5C29 the first attribute 9BEE 06 06 LD B,#06 6 attributes to change and then the same code starting at #9BF0 continues. ------ 20.3 Daniel Gromann's PVs A number of PVs used in "WNM SE" were created by myself (Daniel Gromann). Below are their disassemblies, offered in the hope that these PVs may be reused in other people's games or will inspire the creation of still new ones. A. Printing sprites and messages PVs of this type are used in many rooms in "WNM SE", sometimes making the print dependent on Willy's coordinates or other factors. Various examples are given below. They cover all important aspects of the PVs of this kind in "WNM SE" - the PVs which have not been described below do not bring new quality into the subject. --- "The Cosy Upstairs Bedroom" – a simple PV which prints a dummy guardian. 9B0C 21 B6 78 LD HL,#78B6 where to print it on the screen 9B0F 18 42 JR #9B53 jump to the continuation of the code 9B53 11 20 9C LD DE,#9C20 where to take the sprite from 9B56 CD 56 94 CALL #9456 print it 9B59 C9 RET and exit The jump to the continuation of the code is done in order to optimise the use of space – the portion of the code at #9B53 - #9B59 (and even more so at #9B56 - #9B59) is used by various PV. --- "On the Roof" - a simple PV which prints a message (signboard). 9B38 DD 21 51 84 LD IX,#8451 where to take the text from 9B3C 11 4F 78 LD DE,#784F where to print it on the screen 9B3F 0E 03 LD C,#03 how long it will be 9B41 18 4D JR #9B90 jump to the continuation of the code 9B90 CD 80 96 CALL #9680 print it 9B93 C9 RET and exit The jump to the continuation of the code is done in order to optimise the use of space – the portion of the code at #9B90 - #9B93 is used by more than one PV. --- "West Stairway" – PV which prints a sign (technically: a sprite) which is always visible and does not collide with the guardian passing behind it. C3C5 21 D5 60 LD HL,#60D5 where to print it on the screen C3C8 11 60 B1 LD DE,#B160 where to take the sprite from C3CB 18 30 JR #C3FD jump to the continuation of the code C3FD C3 C5 D2 JP #D2C5 jump to the continuation of the code D2C5 CD 56 94 CALL #9456 print it D2C8 C3 06 97 JP #9706 jump to #9706, to the start of the PV which changes the colour of one of the guardians The idea to print a sprite to a location in the Occupied Room Screen Buffer (starting at #6000), so that a guardian can safely pass through it (or rather "behind" it), was suggested by Ian Rushforth. --- "Emergency Exit on the Roof" – PV which prints a sign which is always visible and does not collide with the guardian passing behind it. F2C5 DD 21 C4 CB LD IX,#CBC4 where to take the text from F2C9 C3 CE F4 JP #F4CE jump to the continuation of the code F4CE 11 CB 68 LD DE,#68CB where to print it on the screen F4D1 0E 08 LD C,#08 how long it will be F4D3 C3 C5 F8 JP #F8C5 jump to the continuation of the code F8C5 CD 80 96 CALL #9680 print it F8C8 C3 F3 8A JP #8AF3 jump to the start of the Flashing Screen and Border PV This PV also takes advantage of an idea put forward by Ian Rushforth, concerning printing the sprite to a location in the Occupied Room Screen Buffer. --- "Main Hallway East" - PV which prints a dummy guardian when Willy is above a certain y-coordinate. F5F7 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate F5FA FE 70 CP #70 is he (the top of his head) 7 rows from the top of the screen? F5FC DA F9 D2 JP C,#D2F9 if it's less than that, jump to the code which will print the dummy guardian F5FF C9 RET otherwise exit D2F9 21 24 78 LD HL,#7824 where to print it on the screen D2FC C3 99 9B JP #9B99 jump to the continuation of the code 9B99 11 80 AD LD DE,#AD80 where to take the sprite from 9B9C 18 B8 JR #9B56 jump to the continuation of the code 9B56 CD 56 94 CALL #9456 print it 9B59 C9 RET and exit Once the dummy guardian is printed on the screen, it is visible even if Willy goes below the y-coordinate in question again. --- "Upper Balcony" – PV which prints a dummy guardian when Willy is to the right of a certain x-coordinate. EFF9 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate EFFC E6 1F AND #1F (just the 5 least significant bits) EFFE C3 F9 C0 JP # C0F9 jump to the continuation of the code C0F9 FE 10 CP #10 is he in the right half? C0FB D2 1F 9B JP NC,#9B1F if he is, jump to the code which prints the dummy guardian C0FE C9 RET otherwise exit 9B1F 21 35 78 LD HL,#7835 where to print it on the screen 9B22 18 27 JR #9B4B jump to the continuation of the code 9B4B 11 60 AF LD DE,#AF60 where to take the sprite from 9B4E 18 06 JR #9B56 jump to the continuation of the code 9B56 CD 56 94 CALL #9456 print it 9B59 C9 RET and exit --- "The Underground Pantry" – a PV which prints a dummy guardian visible only when Willy is below a certain y-coordinate. CCA9 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate CCAC FE 78 CP #78 is he (the top of his head) 7.5 rows from the top of the screen? CCAE 30 19 JR NC,#CCC9 if it's more than that, jump to the code which prints a full sprite CCB0 18 12 JR #CCC4 otherwise jump to the code which prints an empty sprite CCC4 11 00 C3 LD DE,#C300 where to take the empty sprite from CCC7 18 03 JR #CCCC jump to the continuation of the code CCC9 11 60 9C LD DE,#9C60 where to take the full sprite from CCCC 21 6C 78 LD HL,#786C where to print it on the screen CCCF CD 56 94 CALL #9456 print it CCD2 C3 11 84 JP #8411 jump to the start of the PV which changes the direction of the conveyor every 32 ticks (and ends with a RET instruction) --- "Dynamite Dan would love this!" – PV which prints a signboard visible only when Willy is above a certain y-coordinate. C9B2 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate C9B5 FE D0 CP #D0 is he (the top of his head) 13 rows from the top of the screen? C9B7 38 11 JR C,#C9CA if it's less than that, jump to the code which prints a full text C9B9 18 09 JR #C9C4 otherwise jump to the code which prints an empty text C9C4 DD 21 B8 9F LD IX,#9FB8 where to take the (empty) text from C9C8 18 04 JR #C9CE jump to the continuation of the code C9CA DD 21 56 83 LD IX,#8356 where to take the full text from C9CE 11 69 70 LD DE,#7069 where to print it on the screen C9D1 0E 0E LD C,#0E how long it will be C9D3 CD 80 96 CALL #9680 print it C9D6 C3 D5 9B JP #9BD5 jump to the PV which animates the attributes on top of the screen (and ends with a RET instruction) --- "Abandoned Subterranean Passage" – a PV which prints a signboard (always visible) and a dummy guardian (visible only if Willy is in the right half of the screen). Printing the signboard: 9BB8 DD 21 FB A3 LD IX,#A3FB where to take the text from 9BBC 11 39 70 LD DE,#7039 where to print it on the screen 9BBF 0E 04 LD C,#04 how long it will be 9BC1 CD 80 96 CALL #9680 print it Printing the dummy guardian: 9BC4 21 BE 78 LD HL,#78BE where to print it on the screen 9BC7 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 9BCA E6 1F AND #1F (just the 5 least significant bits) 9BCC FE 0F CP #0F is he in the right half? 9BCE 38 C4 JR C,#9B94 if not, jump to the code which prints an empty sprite 9BD0 11 80 AF LD DE,#AF80 where to take the sprite from 9BD3 18 81 JR #9B56 jump to the call to the print instruction 9B56 CD 56 94 CALL #9456 print it 9B59 C9 RET and exit If Willy is not in the right half of the screen: 9B94 11 00 C3 LD DE,#C300 where to take the (empty) sprite from 9B97 18 BD JR #9B56 jump to the call to the print instruction 9B56 CD 56 94 CALL #9456 print it 9B59 C9 RET and exit --- "The Single Item Cave" – PV which prints a dummy guardian visible only when the horizontal guardian on the ground level is more than 11 columns from the left edge of the room. F0C4 3A 0A 81 LD A,(#810A) pick up the guardian's x-coordinate F0C7 E6 1F AND #1F (just the 5 least significant bits) F0C9 C3 C4D9 JP #D9C4 jump to the continuation of the code D9C4 FE 0B CP #0B is it 11 columns from the left? D9C6 DA E1 CC JP C,#CCE1 if less than that, jump to the code which prints an empty sprite D9C9 C3 D5 CC JP #CCD5 otherwise jump to the code which prints a full sprite Printing a full sprite: CCD5 11 E0 BF LD DE,#BFE0 where to take the full sprite from CCD8 00 NOP high byte of the location of the conveyor in the attribute buffer - the PV code "glides over" it, treating it as a NOPped out byte CCD9 00 NOP the conveyor length byte for "Copin' with Ropin'" (i.e. no conveyor in this room) – the PV code "glides over" it, treating it as a NOPped out byte CCDA 18 08 JR #CCE4 jump to the continuation of the code CCE4 21 F9 70 LD HL,#70F9 where to print it on the screen CCE7 18 E6 JR #CCCF jump to the continuation of the code CCCF CD 56 94 CALL #9456 print it CCD2 C3 11 84 JP #8411 jump to the start of the PV which changes the direction of the conveyor every 32 ticks (and ends with a RET instruction) Printing an empty sprite: CCE1 11 00 C3 LD DE,#C300 where to take the empty sprite from CCE4 21 F9 70 LD HL,#70F9 where to print it on the screen CCE7 18 E6 JR #CCCF jump to the continuation of the code CCCF CD 56 94 CALL #9456 print it CDD2 C3 11 84 JP #8411 jump to the start of the PV which changes the direction of the conveyor every 32 ticks (and ends with a RET instruction) --- "Double Inn" – PV which prints a signboard (always visible) and three dummy guardians, one of which is always visible and two are visible only when the barrels are moving down. E4BB 3A 04 81 LD A,(#8104) pick up the pixel y-coordinate increment of one of the barrels E4BE FE 0A CP #0A is it #0A (is the barrel going down)? E4C0 C2 CD E1 JP NZ,#E1CD if it is not, jump to the code which prints the empty sprites of both arrows Printing the full sprite of the first arrow: E4C3 11 00 9C LD DE,#9C00 otherwise proceed to where to take the full sprite from E4C6 21 28 70 LD HL,#7028 where to print it on the screen E4C9 CD 56 94 CALL #9456 print it Printing the full sprite of the second arrow: E4CC 11 00 9C LD DE,#9C00 where to take the full sprite from E4CF 21 3A 70 LD HL,#703A where to print it on the screen E4D2 CD 56 94 CALL #9456 print it E4D5 C3 24 9B JP #9B24 jump to the continuation of the code Printing the empty sprite of the first arrow: E1CD 11 00 C3 LD DE,#C300 where to take the empty sprite from E1D0 21 28 70 LD HL,#7028 where to print it on the screen E1D3 CD 56 94 CALL #9456 print it E1D6 C3 CD F2 JP #F2CD jump to the continuation of the code Printing the empty sprite of the second arrow: F2CD 11 00 C3 LD DE,#C300 where to take the empty sprite from F2D0 21 3A 70 LD HL,#703A where to print it on the screen F2D3 CD 56 94 CALL #9456 print it F2D6 C3 24 9B JP #9B24 jump to the continuation of the code Printing the signboard: 9B24 DD 21 92 DA LD IX,#DA92 where to take the text from 9B28 11 0B 70 LD DE,#700B where to print it on the screen 9B2B 0E 0A LD C,#0A how long it will be 9B2D CD 80 96 CALL #9680 print it Printing the ghost: 9B30 21 36 70 LD HL,#7036 where to print it on the screen 9B33 11 40 B4 LD DE,#B440 where to take the sprite from 9B36 18 1E JR #9B56 jump to the call to the print instruction 9B56 CD 56 94 CALL #9456 print it 9B59 C9 RET and exit --- "Willy's Personal Hideout" – PV which prints a looping four-part message. This PV is preceded by another PV – Shimmering Willy [Optimised] – which ends with a jump to the start of this PV. The four parts of the text which are printed are at #F7CD – #F7D6, #F8CD – #F8D6, #F9CD – #F9D6 and #FACD – #FAD6. Therefore, the second part of their address is always "#CD" and the first part can be #F7, #F8, #F9 or #FA, i.e. its value increments by one. This PV depends on the variable at #DCD8. Its initial value is #F7. Combined with "#CD", it gives the address of where the first part of the message should be taken from by the printing routine. The variable is subsequently increased by one so that the following parts of the message are printed. However, once the variable at #DCD8 reaches the value #FA (the high byte of the address of the last part of the message), it is reset to #F7, so that the next time the printing routine kicks in, it will print the first part of the message again – and so on, infinitely. The timer check makes sure that the whole process happens once every 16 ticks, so that the player has enough time to read each part of the message. E2C4 3A 5C 99 LD A,(#995C) pick up the timer E2C7 E6 0F AND #0F do it every 16 ticks E2C9 C0 RET NZ only E2CA C3 C4 DC JP #DCC4 jump to the continuation of the code DCC4 3A D8 DC LD A,(#DCD8) load the variable at #DCD8 into register A DCC7 FE FA CP #FA is the value #FA? DCC9 CA CD E7 JP C,#E7CD if it is, jump to #E7CD DCCC DD 2E CD LD IXL,#CD the low byte of the address of where to take the sprite from will be #CD DCCF DD 67 LD IXH,A the high byte of the address of where to take the sprite from will be the value of register A DCD1 3C INC A increase the value of register A DCD2 32 D8 DC LD (#DCD8),A and write it to #DCD8 (so that the next time the PV kicks in the following part of the message will be printed) DCD5 C3 C4 E7 JP #E7C4 jump to the continuation of the code E7C4 11 C7 70 LD DE,#70C7 where to print the text on the screen E7C7 0E 0A LD C,#0A how long it will be E7C9 CD 80 96 CALL #9680 print it E7CC C9 RET and exit This is what happens if the value of the variable at #DCD8 is #FA (i.e. the last part of the message is printed): E7CD DD 2E CD LD IXL,#CD the low byte of the address of where to take the sprite from will be #CD E7D0 DD 67 LD IXH,A the high byte of the address of where to take the sprite from will be the value of register A, i.e. #FA E7D2 3E F7 LD A,#F7 set the value of the variable at #DCD8 E7D4 32 D8 DC LD (#DCD8),A to #F7 (so that the next time the PV kicks in, the first part of the message will be printed) E7D7 18 EB JR #E7C4 jump to #E7C4 to print the text and exit --- It is possible to enhance the screens of a JSW game with various elements printed by PVs. The outcome is dependent on what kind of cell the text or sprite is printed on. What is overprinted has the same quality as the cell "underneath it". Furthermore, it has the same attributes as that cell. If the text/sprite is printed on Air cells, Willy can pass/fall through it. This creates "dummy guardians", like in "Abandoned Subterranean Passage" or "The Studio", for example. If the Air's INK is black, what is printed will only show momentarily when Willy passes through it (and then it will have Willy's colour). This creates "ghost messages" and "ghost guardians" – like in "The Old Writetyping Office" or "Stairway (Starryway) to Heaven". If the text/sprite is printed on Earth or Water cells, it will behave like they do. See, for example, "Entomological Research Station" or "Double Inn". If the text/sprite is printed on Fire cells, it will be lethal to Willy. See, for example, "Entomological Research Station", "Entrance to the Caves" or "East Stairway". All of the above is true if the printing happens to a location in the Empty Room Screen Buffer (starting at #7000). In addition, printing to a location in the Occupied Room Screen Buffer (starting at #6000) allows you to have messages or sprites on the screen which do not interact with other entities (like guardians or Willy) in any other way than being coloured by them when they pass through (or rather behind). The concept of printing things dependent on predetermined factors opens up a whole array of new, exciting possibilities of enhancing future games. B. Screen Flash effects There are several PVs in "WNM SE" which produce various kinds of Screen Flash effects, affecting either the top two thirds of the screen or the whole screen, including the border. --- Flashing Screen This PV, used in "Above the Abyss", works by setting the value of the Screen Flash counter and thus activating the Screen Flash code (which is unused in the original "JSW", where it resides at #8A11 – #8A25). C8CD 3A 5C 99 LD A,(#995C) pick up the timer (the "tick counter" - load its current value to register A) C8D0 E6 E0 AND #E0 set the Zero Flag if the timer (register A) holds any value between 0 (#00) and 31 (#1F) - thus A retains a value of 0 (#00) for the first 32 ticks in each 256-tick cycle, then assumes a value of 32 (#20) and increments in steps of #20 every 32 ticks, before returning to a value of 0 (#00) when the timer reaches zero C8D2 C0 RET NZ otherwise exit (return back to the Main Loop if the Zero Flag is NOT set, i.e. if A has a value other than zero) C8D3 3E 40 LD A,#40 set the Screen Flash counter C8D5 32 CD 85 LD (#85CD),A to #40 C8D8 C9 RET and exit Ian Rushforth has kindly analysed and provided a description of the way that the Screen Flash code (at #8A10 – #8A21) is activated by this PV (which I designed by trial and error, without fully understanding its operation): The first thing the Screen Flash code does is to check the value of the Screen Flash counter and, if it is zero, bypasses the subsequent code. This should normally be the case if Willy enters the room during "ticks" 32-255 (#20 - #FF) of the game cycle. If Willy enters (or is still within) the room when the "tick" counter is in the range 0 to 31 (#00 - #1F), then the Screen Flash counter will be set to a fixed value of #40 (01000000). But before it does anything else, the code decrements the Screen Flash counter to #3F (00111111). Next, bits 0-2 of the Screen Flash counter are rotated into bits 3-5. Then only bits 3-5 are picked out, and all other bits are reset to zero, so the screen displays as black INK on white PAPER. Because the value of the Screen Flash counter is set to a fixed value (and then decremented by 1) every tick, the colour of the screen remains the same throughout game "ticks" 0 to 31 (#00 - #1F). Then when the "tick" counter reaches 32 (#20), the Screen Flash counter ceases to be set to that fixed value, and starts to decrement by 1 for every pass through the Main Loop. So a period of "static" screen colours for 32 (#20) ticks is followed by the "regular" screen flash, cycling downwards through the PAPER colours (with INK colours remaining black throughout), from #3F to #00. This causes eight colour cycles in total, as set by the operand of the LD A,#00 instruction. Once the Screen Flash counter reaches zero, the Screen Flash code is bypassed and so the screen colours (both PAPER and INK) return to normal. --- Coloured Screen This PV, used in "In the Backwoods", "The Reading Room" and "Entrance to the Cellar", basically works by setting the value of the Screen Flash counter and thus activating the Screen Flash code (which is unused in the original "JSW", where it resides at #8A11 – #8A25), albeit almost without flashing. "In the Backwoods" 9828 3E 05 LD A,#05 set register A to #05 (the colour of the screen during the effect will be green) 982A 32 34 98 LD (#9834),A set the value of the address #9834 to #05 982D 3A 5C 99 LD A,(#995C) pick up the timer(the "tick counter" - load its current value to register A) 9830 E6 C0 AND #C0 set the Zero Flag if the timer (register A) holds any value between 0 (#00) and 63 (#3F) - thus A retains a value of 0 (#00) for the first 64 ticks in each 256-tick cycle, then assumes a value of 64 (#40) and increments in steps of #40 every 64 ticks, before returning to a value of 0 (#00) when the timer reaches zero 9832 C0 RET NZ otherwise exit (return back to the Main Loop if the Zero Flag is NOT set, i.e. if A has a value other than zero) 9833 3E 05 LD A,#05 set the Screen Flash counter to #05 (the 9835 32 CD 85 LD (#85CD),A value which has been set at #9834 by the code at #9828 - #982C) 9838 C9 RET and exit The PVs in "The Reading Room" and "Entrance to the Cellar" work in the same way, it is just that a different colour value is set in the "introductory" part: "The Reading Room" F9FB 3E 07 LD A,#07 set register A to #07 (the colour of the screen during the effect will be yellow) F9FD C3 2A 98 JP #982A jump to #982A "Entrance to the Cellar" F8FB 3E 02 LD A,#02 set register A to #02 (the colour of the screen during the effect will be blue) F8FD C3 2A 98 JP #982A jump to #982A Ian Rushforth has kindly analysed and provided a description of the way that the Screen Flash code (at #8A10 – #8A21) is activated by this PV (which I designed by trial and error, without fully understanding its operation): This is essentially the same as the PV used in "Above the Abyss", with two "tweaks": Firstly, the operand of the AND command has been altered (from #E0 to #C0), which makes the initial "fixed screen colour" phase lasts longer (i.e. the first 64 ticks of each 256-tick game cycle, instead of the first 32 ticks). Secondly, the operand of the LD A,#00 instruction is set to a lower value (in the range #00 to #07), so that when the Screen Flash effect eventually kicks in (cycling downwards through the PAPER colours), it is terminated as soon as the screen's PAPER colour reaches black (because the Screen Flash counter has arrived at a value of zero, and so the Screen Flash code is bypassed). As before, the value of A is decremented by 1 before the Screen Flash code is brought to bear upon the attribute buffer, thus a value of #02 yields blue PAPER, etc. So the two PVs in "WNM SE" are essentially the same, but the initial "fixed screen colour" and subsequent "screen flash" phases are of different lengths. (end of Ian's description) This PV is divided into two parts because of free space limitations in "WNM SE". Normally, if it is to be used in one room only, it should have just one part: 3A 5C 99 E6 C0 C0 can be modified at will to alter the effect C0 3E 05 #05 is a sample colour. Since the value of A is decremented by 32 CD 85 1 before the Screen Flash code is brought to bear upon the attribute buffer, the value of the colour here needs to be that colour's normal value plus one (so e.g. #05 turns the screen green, while green is normally #04) C9 If it is to be used in more than one room, it should have two parts. The first, "introductory" one modifies the value of the address (in "WNM SE" #9834) which is later used by the "PV proper". This value defines the colour to which the screen will be changed. In "WNM SE" #9834 has a value of #00 at the start of the game, but by the time the program gets to this part of the code, this value will have been set to #05 (green) for "In the Backwoods", #07 (yellow) for "The Reading Room" or #02 (blue) for "Entrance to the Cellar". --- Flashing Screen and Border This PV, used in "The Observatory" and "Emergency Exit on the Roof", produces changes of attributes on all parts of the screen (the upper two thirds, the lower third and the border) by using the routine which cycles the INK and PAPER colours, which resides at #8AEB - #8B06 in the original "JSW" and is used there while the title-screen message is scrolling across the screen, and while the game is paused. The PV kicks in (or not) depending on Willy's y-coordinates (in a different way in either of the rooms mentioned above). Furthermore, in "Emergency Exit on the Roof" the effect takes place uninterruptedly, therefore being much more "aggressive" than in "The Observatory", where it takes place every 4 ticks. A notable aspect of this PV is that, in both screens where it occurs, the effect is subtly different when the in-game music is playing, compared to when the music is switched off. The border flashes with the music on. With the music off, it does not flash: it is yellow in "Emergency Exit on the Roof" and cyan in "The Observatory". The border also flashes when Willy is jumping or falling, even with the music off. The PV does two checks: one against Willy's y-coordinate and one against the variable at #9598. In "Emergency Exit on the Roof" the PV only kicks in if Willy (or, to be precise: the top of his head) is lower than 4.5 rows from the top of the screen and higher than 7.5 rows from the top of the screen; in "The Observatory" – if Willy is higher than 4 rows from the bottom of the screen. Regarding the variable at #9598, if it is #00 (as set at the start of the game) the PV "knows" that it is not necessary to call the Global Seamlessness routine (because the attributes of the bottom third of the screen are in order). It only calls that routine if the value of the variable is #01. This prevents the PV from calling the routine constantly when its main effect is not happening (when Willy is outside of the vertical range in which the effect occurs). Calling the Global Seamlessness routine constantly would cause an unnecessary flickering of the bottom third of the screen. "Emergency Exit on the Roof" 8ACD 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate 8AD0 FE 48 CP #48 is he (the top of his head) 4.5 rows from the top of the screen? 8AD2 38 32 JR C,#8B06 if it's less than that (i.e. Willy is higher), jump to the check of the variable at #9598 to see if it is necessary to call the routine which sets the attributes of the bottom third of the screen in accordance with the border colour 8AD4 FE 78 CP #78 is it 7.5 rows from the top of the screen? 8AD6 30 2E JR NC,#8B06 if it's more than that (i.e. Willy is lower), jump to the check of the variable at #9598 to see if it is necessary to call the routine which sets the attributes of the bottom third of the screen in accordance with the border colour 8AD8 3E 01 LD A,#01 set the value of the variable at #9598 8ADA 32 98 95 LD (#9598),A to #01 (to let the PV know that once the effect is over, it will need to call the routine which sets the attributes of the bottom third of the screen in accordance with the border colour) 8ADD Start of the routine which cycles the INK and PAPER colours 8B06 3A 98 95 LD A,(#9598) pick up the variable at #9598 8B09 B7 OR A is it 0? 8B0A C8 RET Z return if it is 8B0B AF XOR A set the value of the variable at #9598 8B0C 32 98 95 LD (#9598),A to #00 8B0F Start of the Global Seamlessness routine (ending with a RET instruction) --- "The Observatory" 8AF9 3A 5C 99 LD A,(#995C) pick up the timer 8AFC E6 03 AND #03 do it every 4 ticks 8AFE C0 RET NZ only 8AFF 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate 8B02 FE C0 CP #C0 is he (the top of his head) 12 rows from the top of the screen (i.e. 4 rows from the bottom)? 8B04 38 D2 JR C,#8AD8 if it's less than that (i.e. Willy is higher), jump to #8AD8 to set the value of the variable at #9598 to #01 and then continue into the routine which cycles the INK and PAPER colours 8B06 3A 98 95 LD A,(#9598) pick up the variable at #9598 8B09 B7 OR A is it 0? 8B0A C8 RET Z return if it is 8B0B AF XOR A set the value of the variable at #9598 8B0C 32 98 95 LD (#9598),A to #00 8B0F Start of the Global Seamlessness routine (ending with a RET instruction) C. Sound and border effects Several PVs in "WNM SE" activate sound and border effects under certain conditions. The way they all work is similar. They check certain variables (such as Willy's y-coordinate) and, if the result is positive, call or jump to subroutines which produce certain sound and border effects (which are "originally" used in the game in other contexts, such as to accompany the scrolling message on the title screen or to accompany teleportation). In some cases they do it every n ticks only. The routine which produces a sound and border effect is present in the original "JSW" code. However, the way in which it works here is quite different, as it is based on Willy's pixel y-coordinate (input into the routine via the A register). So rather than a note that starts high and descends (as occurs during the scrolling message), the pitch rises and then falls when Willy makes a jump. This ingenious use of a pre-existing routine produces a result which is very distinctive from the original. "The Meadow" and "Rocky Road to Double Inn" EEF7 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate EEFA FE 50 CP #50 is he (the top of his head) 5 rows from the top of the screen? EEFC DA E5 85 JP C,#85E5 if it's less than that (i.e. Willy is higher), jump to the routine which produces sound and border effects EEFF C9 RET otherwise exit --- "Above the West Wing Bedroom" E0F7 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate E0FA FE 70 CP #70 is he (the top of his head) 7 rows from the top of the screen? E0FC CA E5 85 JP Z,#85E5 if it's exactly that, jump to the routine which produces sound and border effects E0FF C9 RET otherwise exit --- "Above the Front Door" 88EF CD E5 85 CALL #85E5 call the routine which produces a sound and border effect 88F2 C3 C0 99 JP #99C0 jump to the Time Trap PV Part Three The Time Trap PV Part Three (discussed below in section 20.3.F) deactivates itself after performing its main function (setting the desired in-game time) by changing the PV's address in the room buffer (#80EE - #80EF) to #8D1C, the PV which prevents Willy from getting stuck in the top-right corner of "The Front Door". Therefore, the routine which produces sound and border effects is called in "Above the Front Door" only once, after Willy has entered the room (it is also called after the room is refreshed because he has lost a life). Since negotiating this room involves leaving and re-entering it at least twice (during the "leaps of faith" necessary to collect the uppermost item and return), the player will see the brief effect at least three times. In the case of "Above the Front Door", when the sound and border effect PV is enacted during the first "tick" within that room, the input value of A (which determines the pitch and duration of the sound, as well as the visual appearance of the border) is not actually specified at the onset of the PV. Instead, the A register retains its previously-assigned value of #75. This is determined by the technical room number of "Above the Front Door" (#35 in hex), with #40 added (technically, bit 6 is set) as a result of the precise mechanics of the "Draw the items" routine (which is called from the Main Loop directly before the Main PV is called). Consequently, if the same PV were applied to another room in the same manner, then the parameters of the sound and border effect would be different. --- "The Gym (Hurdle Practice)", "The Dining Hall" and "Copin' with Ropin'" "The Gym (Hurdle Practice)" D4FB 3E B0 LD A,#B0 set A to #B0 D4FD C3 FB D3 JP #D3FB jump to #D3FB D3FB 32 BF EA LD (#EABF),A set the value of the address #EABF to #B0 D3FE C3 BB EA JP #EABB jump to #EABB EABB 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate EABE FE #B0 CP #B0 is he (the top of his head) 11 rows from the top of the screen? EAC0 CA EC 99 JP Z,#99EC if it's exactly that, jump to Geoff Eddy's "nice fuzzy border effect" routine EAC3 C9 RET otherwise exit The fuzzy border effect: 99EC 0E FF LD C,#FF 99EE 06 80 LD B,#80 99F0 10 FE JRNZ #99F0 99F2 D3 FE OUT (FE),A 99F4 C6 03 ADD #03 99F6 0D DEC C 99F7 20 F5 JR NZ,#99EE 99F9 3A DE 80 LD A,(#80DE) 99FC D3 FE OUT (FE),A 99FE C9 RET Since this PV is applied in "WNM SE" in more than one room, it basically comprises two parts. The operand at #EABF – executed by "the PV proper" - is first modified by the "introductory" part of the PV. It is #B0 for "The Gym (Hurdle Practice)" (176 in decimal, which effectively means - in regard to Willy's y-coordinate – 11 rows from the top of the screen [11x8x2]) and #40 for "The Dining Hall" and "Copin' with Ropin'" (64 in decimal, which means - in regard to Willy's y-coordinate – 4 rows from the top of the screen [4x8x2]). So the PV in "The Dining Hall" and "Copin' with Ropin'" works in the same way as the one in "The Gym (Hurdle Practice)", with the only exception being that the distance from the top of the screen which determines whether or not the PV will kick into action is first set to #40: F2FB 3E 40 LD A,#40 set register A to #40 F2FD C3 FB D3 JP #D3FB jump to the continuation of the code This PV is split into four parts in "WNM SE" due to the free space constraints. The jump at #D3FE – #D400 takes advantage of the fact that the first byte of next room's data is #EA; it is used as the high byte of the address to which the program should jump. If free space was not a constraint, the PV should have only one part if it were to be used in one room only, or two parts if it were to be used in more than one room, including a modification of the distance-from-the-top-of-the-screen variable. --- "The Multi-Toilet Bathroom" E7F7 3A 2B 8D LD A,(#8D2B) pick up the game mode indicator E7FA FE 02 CP #02 is it 2 (is Willy on the toilet run)? E7FC CC EC 99 CALL Z, #99EC if it is, call Geoff Eddy's "nice fuzzy border effect" routine E7FF C9 RET otherwise exit This PV produces Geoff Eddy's "nice fuzzy border effect" only when Willy is on the toilet run, illustrating his increasing pain and nausea before vomiting. --- "Maths Lab" 99E1 3A 5C 99 LD A,(#995C) pick up the timer and 99E4 E6 03 AND #03 do it every 4 ticks 99E6 C0 RET NZ only 99E7 3A D1 85 LD A,(#85D1) pick up Willy's airborne status indicator 99EA B7 OR A is it zero? 99EB C8 RET Z exit if it is 99EC Start of Geoff Eddy's "nice fuzzy border effect" routine This PV produces Geoff Eddy's "nice fuzzy border effect", every four ticks, only when Willy is airborne. Feeling brain fried, perhaps, from too many arithmetic calculations? D. Shimmering Willy [Complex] This PV, used in "On the Sun Deck", "Willy's Problematic Heaven" and "Altar to a Well-Known God", causes a constant interchange of Willy's colour between two values, which results in a visual effect of Willy shimmering. After I designed and applied this PV, Ian Rushforth suggested that the same effect could be achieved more efficiently, using fewer bytes, with a XOR instruction. I applied Ian's solution in "Willy's Personal Hideout" and "The Cinema", and left mine in place in the three rooms mentioned above. Since both PVs produce the same result, the same name is used for them, with the differentiation of my PV being "Complex", and Ian's - "Optimised". Ian's solution is discussed in section 20.4.D of this document. "On the Sun Deck", "Willy's Problematic Heaven" and "Altar to a Well-Known God" Part One CBF5 3E 02 LD A,#02 set Willy's colour CBF7 32 2D 96 LD (#962D),A to red CBFA 3E FC LD A,#FC set the value of the address #80EF in CBFC 32 EF 80 LD (#80EF),A the room buffer to #FC CBFF C9 RET and exit Part Two FCF5 3E 07 LD A,#07 set Willy's colour FCF7 32 2D 96 LD (#962D),A to white FCFA 3E CB LD A,#CB set the value of the address #80EF in FCFC 32 EF 80 LD (#80EF),A the room buffer to #CB FCFF C9 RET and exit The value of Offsets #EE and #EF in each room, which hold the address of the PV for this particular room, is #F5 and #CB, so they point to the address #CBF5. Part One of the PV, which resides at this address, changes Willy's colour to red and then changes the value of Offset #EF in the room buffer to #FC. PVs are called every tick. Therefore, the next time the PV is called, the address #FCF5 is used instead of #CBF5. Part Two of the PV, which resides at this address, changes Willy's colour to white and then changes the value of Offset #EF in the room buffer to #CB. Therefore, the next time the PV is called, the address #CBF5 is used instead of #FCF5. And so on, the alternation between the two addresses goes on indefinitely, as long as Willy is in the room where this PV has been applied. Shimmering Willy PV [Complex] is applied in "WNM SE" in three rooms, and it uses two colour values: #02 for red and #07 for white. However, Willy's shimmering happens in the following colours: in "Willy's Personal Hideout" – in white and yellow; in "On the Sun Deck" – in white and yellow; in "Altar to a Well-Known God" – in white and red. This variation happens thanks to a feature of the game engine which makes Willy's colour dependent on the colour of the Air cells' INK in the room he is currently in. Willy's colour is set at #962D. If Willy is white, he is always white, no matter what the Air cells' INK value is. However, if he is another colour, his actual colour as seen in the room depends on the Air's INK colour. Furthermore, if the room's Air's attributes are set to bright, Willy is always bright in this room; in a room with non-bright Air, Willy is always non-bright. Thus, in "Altar to a Well-Known God" the Air's INK is bright black and with Willy's colour set to red (#02) at #962D, he is shimmering in bright red and bright white. However, in "Willy's Problematic Heaven" the Air's INK is non-bright magenta, and so Willy is shimmering in white and magenta, even though the value of #962D is still #02 for red. Finally, in "On the Sun Deck" the Air's INK is non-bright yellow, and so Willy is shimmering in white and yellow, which in this case means he is invisible half of the time, because the Air's PAPER colour is also yellow, so he blends in with the background. This is controlled by the OR command at #962C. Take the example of "Willy's Problematic Heaven": Air's INK magenta = 011 Willy's colour red = 010 011 OR 010 = 011 = magenta. Furthermore, if Willy wanders out of a room in which the Shimmering Willy PV is active, at a point in time when his colour is non-white, then he will remain non-white until he re-enters the room (or another room which has the effect of reverting his colour back to white). To give another example: if Willy walks leftwards out of "Altar to a Well-Known God" whilst he is in the "red" phase of that room's PV, and wanders across to "Main Hallway East", where the Air's INK is green (as demonstrated by the dummy guardian therein), a "red behind-the-scenes" Willy will be displayed in yellow: Air's INK green = 100 Willy's colour red = 010 100 OR 010 = 110 = yellow. Willy's colour could be set to alternate between two (or more, if the PV had more than two parts) non-white colours, of course. However, in such case Willy could not collect any items in the room(s) where such a PV had been applied, as he can only collect items when he is white (either bright or non-bright). Furthermore, care must be taken when designing a game in which the colour of Willy's sprite is altered, not to give rise to any circumstances in which Willy's attributes might match those of the Fire cells in a room, as this could give rise to an IDS. E. Willy's Colour Changed on Entrance to the Room This PV is similar to Shimmering Willy. However, the modification of the value of Offset #EF happens not in the room buffer, but in the room data. Therefore, the second change of colour only takes place if Willy exits and re-enters the room, or if he loses a life within the room. Part One D5F5 3E 02 LD A,#02 set Willy's colour D5F7 32 2D 96 LD (#962D),A to red D5FA 3E DC LD A,#DC set the value of the address #F6EF in D5FC 32 EF F6 LD (#F6EF),A the room data to #DC D5FF C9 RET and exit Part Two DCF5 3E 07 LD A,#07 set Willy's colour DCF7 32 2D 96 LD (#962D),A to white DCFA 3E D5 LD A,#D5 set the value of the address #F6EF in DCFC 32 EF F6 LD (#F6EF),A the room data to #D5 DCFF C9 RET and exit This PV is applied in "The Forgotten Tower". When Willy enters it for the first time, his colour is changed to red (Willy is bright red, though, because the Air's INK is bright). Since he cannot exit the room immediately, he has to go around the Tower to reach the exit. In the process he cannot collect any items (he is non-white), but at the same time he is immune to arrows (also because he is non-white). When Willy emerges in "Above the West Wing Bedroom", his colour is still set to red (#02) at #962D. However, since this room's INK is bright magenta, Willy is bright magenta there. If Willy jumps right into "A Bit of Fresh Air", he will be red there, because that room's Air's INK is black. If he then goes on to "The Studio", he will be bright magenta there, because that's what the Air's INK colour is. However, if he drops down to "West Wing Bedroom", he will be bright yellow (because the Air's INK there is bright yellow) and if he goes down to "West Stairway", he will be bright white, because the Air's INK there is bright cyan (his "technical" colour at #962D will still be red, though). After leaving "The Forgotten Tower", having visited it just once, Willy could wander around his New Mansion with his colour set to red at #962D and experience various colour effects depending on the Air's INK colour in each room. Being non-white, he would be immune to arrows, which could actually make the exploration a little easier, but at the same time he could not collect any items in most rooms. When Willy enters "The Forgotten Tower" for the second time, his colour is changed to white (#07 at #962D) and he can collect items again. Should he enter the Tower for the third time, his colour will be changed to red, then back to white upon the fourth entrance, then back to red again, and so on, indefinitely. Effectively, this means that Willy has to go around "The Forgotten Tower" twice: upon the first entrance so as to exit the room, then do the detour through the right hand side of "Above the West Wing Bedroom", "West Wing Bedroom" and "Above the West Wing Bedroom" again, in order to re-enter "The Forgotten Tower", regain his "whiteness" and be able to collect the items again. This increases the strain on the time limit, which is already a challenge. The only alternative to it is to lose a life after the first entrance into the Tower (Willy is white when he "respawns" after getting killed while being red). F. Time Trap Unlike in the original "JSW" or the OE, time limit is a real factor in "WNM SE". Apart from the time limit imposed on the whole game, there is also one room - "The Temple of Passing Time" - where the player can see the "Time Up!!" Game Over screen no matter what the in-game time was before they entered it, and lose the whole game if they are not efficient enough. It happens thanks to the Time Trap PV. This PV consists of three parts: Part One Applied in "Into the Abyss". The current time is recorded for future reference. B0E0 2A 7F 85 LD HL,(#857F) pick up the current hour B0E3 22 0D 8A LD (#8A0D),HL and save it at #8A0D B0E6 2A 82 85 LD HL,(#8582) pick up the current minute B0E9 22 DB 98 LD (#98DB),HL and save it at #98DB B0EC C9 RET then exit Part Two Applied in "The Temple of Passing Time". The time is set to 11:53 if the "Expert" time limit level was chosen at the start of the game, to 11:52 if the "Hard" time limit was chosen, to 11:51 if the "Medium" time limit level was chosen and to 11:50 if the "Easy" time limit level was chosen (the BASIC loader modifies the value of #99D3 according to the player's choice after the game has loaded). After that, the value of Offsets #EE and #EF in the room buffer are modified to #1C and #8D, so that the PV is turned off or, to be precise, redirected to the PV which prevents Willy from getting stuck in the top-right corner of "The Front Door". If this did not happen, the time would be set to 11:53 (or 11:52 or 11:51 or 11:50) with every tick of the game; as a result, time would not progress in "The Temple of Passing Time" at all, which would render the whole "trap" pointless. 99CB 21 31 31 LD HL,#3131 set the current hour 99CE 22 7F 85 LD (#857F),HL to 11 99D1 21 35 33 LD HL,#3335 set the current minute 99D4 22 82 85 LD (#8582),HL to 53 99D7 CD 0F 8B CALL #8B0F call the Global Seamlessness routine 99DA 21 1C 8D LD HL,#8D1C set Offsets #EE and #EF in the room 99DD 22 EE 80 LD (#80EE),HL buffer to #1C and #8D (to divert the PV to the alternative PV which prevents Willy from getting stuck in the top-right corner of "The Front Door" – see section 20.4.B of this document) 99E0 C9 RET and exit Part Three Applied in "Gateway to the Unknown" and "Above the Front Door", the two rooms into which it is possible to exit from "The Temple of Passing Time". The current time is restored to the value recorded in "Into the Abyss". After that, the value of Offsets #EE and #EF in the room buffer are modified to #1C and #8D, so that the PV is turned off (and time progresses normally, instead of being reverted to the pre-recorded value every tick), or, to be precise, redirected to the PV which prevents Willy from getting stuck in the top-right corner of "The Front Door". 99C0 2A 0D 8A LD HL,(#8A0D) pick up the hour saved at #8A0D 99C3 22 7F 85 LD (#857F),HL and set it as current hour 99C6 2A DB 98 LD HL,(#98DB) pick up the minute saved at #98DB... 99C9 18 09 JR #99D4 jump to the continuation of the code 99D4 22 82 85 LD (#8582),HL ... and set it as current minute 99D7 CD 0F 8B CALL #8B0F call the Global Seamlessness routine 99DA 21 1C 8D LD HL,#8D1C set Offsets #EE and #EF in the room 99DD 22 EE 80 LD (#80EE),HL buffer to #1C and #8D (to divert the PV to the alternative PV which prevents Willy from getting stuck in the top-right corner of "The Front Door") 99E0 C9 RET and exit So when the player enters "The Temple of Passing Time", the current time is set to 11:53 [or 11:52 or 11:51 or 11:50] no matter what the current time in "Gateway to the Unknown" was. If the player does not solve the Temple efficiently and quickly enough, they will run out of time at noon and see the "Time Up!!" Game Over screen, losing the game. If they exit back to "Gateway to the Unknown" or pass the Temple successfully and emerge in "Above the Front Door", the current time will be restored to whatever it was the last time it was captured in "Into the Abyss". This is a reward, of sorts, as it means that the player has solved "The Temple of Passing Time" (passing through "Gateway to the Unknown" on the way) "in no time at all". However, they have to pass through "Gateway to the Unknown" once again, in order to climb back up and collect the rightmost item in "The Great Descent". G. Change of music in mid-room One of the special features of "WNM SE" is that it has several in-game tunes; the in-game tune is set individually in each room, as described above in section IX.2 "In-game tune set individually in each room". The PV applied in "The Front Door" takes this a step further: the in-game tune changes in mid-room. It is "In the Hall of the Mountain King" when Willy is outside the house, and it turns to "If I Were a Rich Man" as soon as he enters the mansion. The data of "In the Hall of the Mountain King" starts at #8184 and the data of "If I Were a Rich Man" starts at #8B84. Both tunes share the same low byte of the address (#84). The PV works by selecting the high byte of the address depending on Willy's y- and x-coordinates. After its first part, which prints a text message (the signboard "WNM"), the PV goes like this: 998A 21 E0 80 LD HL,#80E0 pick up Offset #E0 in the room buffer 998D 36 81 LD (HL),#81 set the high byte of the in-game tune's address to #81 9987 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate 9992 FE 48 CP #48 is he (the top of his head) 4.5 rows from the top of the screen? 9994 D8 RET C if it's less than that, exit 9995 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 9998 E6 1F AND #1F (just the 5 least significant bits) 999A FE 15 CP #15 is it column 21 from the left? 999C D8 RET C if it's less than that, exit 999D 36 8B LD (HL),#8B set the high byte of the in-game tune's address to #8B 999F C9 RET and exit The code takes into account the structure of the mansion's front, which has entrances at two levels. Willy's y-coordinate is considered ahead of his x-coordinate. As a result, the change of tune happens on both levels on which Willy can enter the mansion. H. Flickering "HELLO!" sign in "The Front Door" This PV has two paths. One is taken when the "HELLO!" sign is bright; the other, when it is non-bright. The "HELLO!" sign is made up of Fire cells. The default attributes set (in the room data) for the Fire cells in this room are bright blue INK on white PAPER. Whenever the PV goes through its "inactive" path, the default attributes of the Fire cells which make up the "HELLO!" sign are not modified, so the Fire cells (and the whole sign) are bright. Whenever the PV goes through its "active" path, the attributes of the Fire cells which make up the "HELLO!" sign are set to non-bright, so the Fire cells (and the whole sign) are non-bright. Changing the start of the PV for this room in the room buffer back and forth between the active and inactive paths causes the flickering of the "HELLO!" sign. The code only deals with the Fire cells which make up the "HELLO!" sign. Therefore, the other Fire cells in this room - in fact, composite Fire-conveyor cells which form the water in the lake - are unaffected. "Inactive" path D3CE 3E FC LD A,#FC set the start of the PV for this room D3D0 32 EF 80 LD (#80EF),A to #FCCE (thanks to setting the high byte of the address to #FC; the low byte is always #CE) D3D3 C3 80 99 JP #9980 jump to the continuation of the code - the start of the PV which prints a message and changes the in-game tune depending on whether Willy is inside or outside the house "Active" path FCCE 3E D3 LD A,#D3 set the start of the PV for this room FCD0 32 EF 80 LD (#80EF),A to #D3CE (thanks to setting the high byte of the address to #D3; the low byte is always #CE) FCD3 C3 74 98 JP #9874 jump to the continuation of the code, which will make "HELLO!" bright 9874 26 5C LD H,#5C the high byte of the attributes to change will always be #5C (the Occupied Room Attribute Buffer for the upper half of the playing area / upper third of the screen) 9876 2E 22 LD L,#22 the low byte of the first attribute to change this time will be #22 (i.e. this time around we will start with the attribute at #5C22, i.e. the second row from the top and the third column from the left) 9878 18 29 JR #98A3 jump to the continuation of the code (the code is divided because of space constraints) 98A3 CD 66 98 CALL #9866 call the subroutine which does the actual changing of the attributes; this time it will change the attributes of all of the Fire cells in the second row from the top 98A6 2E 42 LD L,#42 the low byte of the first attribute to change this time will be #42 (i.e. this time around we will start with the attribute at #5C42, i.e. the third row from the top and the third column from the left) 98A8 CD 66 98 CALL #9866 call the subroutine which does the actual changing of the attributes; this time it will change the attributes of all of the Fire cells in the third row from the top 98AB 2E 62 LD L,#62 the low byte of the first attribute to change this time will be #62 (i.e. this time around we will start with the attribute at #5C62, i.e. the fourth row from the top and the third column from the left) 98AD CD 66 98 CALL #9866 call the subroutine which does the actual changing of the attributes; this time it will change the attributes of all of the Fire cells in the fourth row from the top 98B0 2E 82 LD L,#82 the low byte of the first attribute to change this time will be #82 (i.e. this time around we will start with the attribute at #5C82, i.e. the fifth row from the top and the third column from the left) 98B2 CD 66 98 CALL #9866 call the subroutine which does the actual changing of the attributes; this time it will change the attributes of all of the Fire cells in the fifth row from the top 98B5 2E A2 LD L,#A2 the low byte of the first attribute to change this time will be #A2 (i.e. this time around we will start with the attribute at #5CA2, i.e. the sixth row from the top and the third column from the left) 98B7 CD 66 98 CALL #9866 call the subroutine which does the actual changing of the attributes; this time it will change the attributes of all of the Fire cells in the sixth row from the top 98BA C3 80 99 JP #9980 jump to the continuation of the code - the start of the PV which prints a message and changes the in-game tune depending on whether Willy is inside or outside the house Subroutine which does the actual changing of the attributes: 9866 06 12 LD B,#12 there are 18 columns to consider 9868 7E LD A,(HL) load the current attribute to register A 9869 FE 44 CP #44 is it #44? (i.e. bright green INK on black PAPER, which are the attributes of the Air cells in this room) 986B 28 03 JR Z,#9870 if it is, jump to the code which deals with next attribute (i.e. do not modify the attributes of the Air cells which are the background of the "HELLO!" sign) 986D C6 C0 ADD A,#C0 increase the attribute (of the Fire cell) by #C0 (i.e. from #79 - bright blue on white - to #39 - non-bright blue on white) 986F 77 LD (HL),A change it 9870 23 INC HL move on to the next attribute 9871 10 F5 DJNZ,#9868 loop back to #9868 to set the next attribute, until B has counted down to zero (i.e. we have done all of the 18 Fire cells which make up the sign "HELLO!" in the row in question) 9873 C9 RET then exit The command SUB A,#40 could be used instead of ADD A,#C0 to achieve the same thing. ------ 20.4 Ian Rushforth's PVs A. Screen Flash effect triggered by Willy jumping Ian Rushforth has kindly contributed his Screen Flash Effect PV to "WNM SE". It is applied in "Stairway (Starryway) to Heaven", where it sets off a Screen Flash effect dependent on Willy's y-coordinate. It produces the effect only when Willy is jumping. D6F9 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate D6FC C3 C4 D7 JP #D7C4 jump to the continuation of the code D7C4 E6 07 AND #07 ensure that the output to the Screen Flash Counter only has a value of #00, #02, #04 or #06 D7C6 32 CD 85 LD (#85CD),A set the Screen Flash Counter to the value of register A The rest of the PV applied in "Stairway (Starryway) to Heaven" is my code printing a ghost guardian and a ghost message. Printing the ghost guardian: D7C9 21 EF 70 LD HL,#70EF where to print it on the screen D7CA C3 C4 E9 JP #E9C4 jump to the continuation of the code E9C4 11 00 AF LD DE,#AF00 where to take the sprite from E9C7 CD 56 94 CALL #9456 print it E9CA C3 C4 8B JP #8BC4 jump to the continuation of the code Printing the ghost message: 8BC4 DD 21 F5 88 LD IX,#88F5 where to take the text from 8BC8 11 BA 78 LD DE,#78BA where to print it on the screen 8BCB 0E 06 LD C,#06 how long it will be 8BCD C3 90 9B JP #9B90 jump to the continuation of the code 9B90 CD 80 96 CALL #9680 print it 9B93 C9 RET and exit Ian has kindly provided the following explanations concerning his PV: When Willy is cell-aligned, or half-cell-aligned (i.e. when his y-coordinate is divisible by 8, or in terms of number of pixels is divisible by 4), the Screen Flash is disabled (that is why it does not happen when he is falling, as he drops 4 pixels in each time frame). When Willy is one pixel above being cell-aligned or half-cell-aligned, the screen PAPER is set to cyan (this does not occur during a jump; it would only occur when he is on a rope, which is not the case in "Stairway (Starryway) to Heaven" where there is no rope). When Willy is two pixels above being cell-aligned or half-cell-aligned, the screen PAPER is set to magenta. When Willy is three pixels above being cell-aligned or half-cell-aligned, the screen PAPER is set to blue. When Willy is on a ramp, his y-coordinate stored at #85CF is not adjusted to reflect his progress up the ramp (other than one cell-row at a time), but instead an offset is added to the value stored at #85CF prior to his sprite being drawn. So walking up a ramp does not trigger the Screen Flash effect. Only the colours mentioned above are selected, because Willy's y-coordinate is always an even number (and the smallest increment ever applied to his y-coordinate is 2). The AND #07 gate ensures that its output to the Screen Flash Counter only has a value of #00, #02, #04 or #06. If the value of the Screen Flash Counter is zero, then the Screen Flash code is bypassed (so the effect is "switched off" in most circumstances). If the Screen Flash Counter is not zero, it is decremented by 1 by the Screen Flash code before its value is used to select the screen's PAPER colour (that is why only the "odd" colours are in fact selected). B. Fix to prevent Willy from getting stuck after falling from "Above the Front Door" In the OE, a jump too far to the right from the lower-right edge of the tower structure in "Above the Front Door" can result in Willy getting stuck in the Earth cells in the upper-right corner of "The Front Door". The only way out from this predicament, apart from restarting the game, is to walk into an IDS in "The Anteroom". In the SE, after the first tick in "Above the Front Door", the PV for this room is redirected to point at the following bit of code, which prevents Willy from getting stuck in this way. It does this by checking Willy's coordinates in the attribute buffer, and killing him if he falls into the bottom-right corner of the room (after which he will "respawn" at the place where he last entered the room). 8D1C 3A D3 85 LD A,(#85D3) pick up the low byte of Willy's location in the attribute buffer 8D1F FE DE CP #DE is it the bottom-right corner of either the upper or lower half of the room (i.e. either the upper or middle third of the screen)? 8D21 C0 RET NZ exit, if it is not (i.e. if Willy is somewhere else) 8D22 3A D4 85 LD A,(#85D4) pick up the high byte of Willy's location in the attribute buffer 8D25 FE 5D CP #5D is it the lower half of the room? 8D27 CA B7 90 JP Z,#90B7 if so, kill Willy 8D2A C9 RET otherwise exit In theory, the conditional jump to the "Kill Willy" routine would also be triggered if Willy was in the bottom-right corner (in the bottom two rows and the two rightmost columns) of the rooms "Gateway to the Unknown" or "The Temple of Passing Time" (which share part of the same code belonging to the Time Trap PV). However, in practice, it is physically impossible for Willy to visit either of these locations, because those rooms have solid floors all along the bottom. C. Intermittent Fire Cell In "Willy's Private Fort Knox" there is a Water cell that is turned into a Fire cell (and back again) every 16 ticks, with an associated "buzzing" noise, via a PV which edits the cell's location in the Empty Room Attribute Buffer (i.e. in the range #5E00 - #5FFF). In order to achieve this, the Fire cell attribute byte in the room data was altered (compared with the OE) so that its value is exactly #80 greater (or less) than the Water cell attribute byte. Then, in order to restore the previous colour of the "true" Fire cells (the "security cameras"), a further part of the PV prints over their addresses in the Occupied Room Attribute Buffer. #9A32 0E A0 LD C,#A0 #9A34 3A 5C 99 LD A,(#995C) load up the tick counter into A #9A37 E6 0F AND #1F (just the 5 least significant bits) #9A39 20 0B JR NZ,#9A46 jump if the Zero Flag isn't set (so the next eleven bytes are only processed every 16 ticks) #9A3B 3A EE 5E LD A,(#5EEE) load up the attribute byte stored at #5EEE in the Empty Room Attribute Buffer to A #9A3E C6 80 ADD A,#80 add #80 - this has the effect of flipping the FLASH bit every 16 ticks (so the room cell in question switches between being a lethal Fire cell and a harmless Water cell) #9A40 32 EE 5E LD (#5EEE),A load the value of A back into the attribute buffer entry for the "Intermittent Fire cell" #9A43 D4 EE 99 CALL NC,#99EE call Geoff Eddy's "nice fuzzy border effect" routine (with a later entry point than usual), if the Carry Flag is not set (this makes a "warning buzz" when the Intermittent Fire cell is activated, every 32 ticks) Disguise the new "permanent" Fire cells, i.e. colour them bright magenta in the Occupied Room Attribute Buffer: #9A46 3E 43 LD A,#43 set register A to #43 (as an attribute corresponding to bright magenta on black) #9A48 32 37 5C LD (#5C37),A colour the first Fire cell #9A4B 32 8A 5C LD (#5C8A),A colour the second Fire cell #9A4E 32 DD 5C LD (#5CDD),A colour the third Fire cell #9A51 Start of the PV which opens a gap in the wall in this room (see section 20.2.C.f of this document) D. Shimmering Willy [Optimised] This PV, applied in "Willy's Personal Hideout" and "The Cinema", produces the same effect as the Shimmering Willy [Complex] PV (discussed in section 20.3.D above), but in a more optimal way (using fewer bytes). "Willy's Personal Hideout" CDCD 3A 2D 96 LD A,(#962D) pick up Willy's colour (load it into register A) CDD0 EE 01 XOR #01 toggle the colour's value between #07 (white) and #06 (yellow) CDD2 32 2D 96 LD (#962D),A set Willy's colour to either white or yellow CDD5 C3 C4 E2 JP #E2C4 jump to the start of the PV which prints a four-part-message in this room (discussed above in section 20.3.A) --- "The Cinema" C6C4 3A 2D 96 LD A,(#962D) pick up Willy's colour (load it into register A) C6C6 EE 02 XOR #02 toggle the colour's value between #07 (white) and #05 (cyan) C6C9 C3 C4 C7 JP #C7C4 jump to the continuation of the code C7C4 32 2D 96 LD (#962D),A set Willy's colour to either white or cyan C7C7 C3 AC 85 JP #85AC jump to the start of the PV which changes the colour of the guardians in this room (discussed above in section 20.2.C.g) ------ 20.5 Daniel Gromann and Ian Rushforth's PVs Some of the PVs applied in "WNM SE" were created jointly by Daniel Gromann and Ian Rushforth. Most of these PVs are related to arrows. Arrows have 256 possible x-coordinates. Coordinates 0-31 (#00 - #1F) are on-screen; the others are off-screen. A. Colour-changing arrows This PV draws on the solution applied in "WNM SE" at the game engine level, which allows the colour of arrows to be set individually in each room (discussed above in section IX.4), and expands it to make the arrows change colour in flight in various ways. "Into the Abyss" 93B9 3A 2C 81 LD A,(#812C) pick up the x-coordinate of the arrow (load it into register A) 93BC E6 02 AND #02 the value of A alternates between #00 and #02 93BE 3C INC A add 1 to the value of A, which can now be #01 or #03 93BF 07 RLCA double the value of A, which can now be #02 (as an attribute corresponding to non-bright red on black) or #06 (as an attribute corresponding to non-bright yellow on black) 93C0 32 ED 80 LD (#80ED),A set the colour of the arrow to the value of register A 93C3 C3 E0 B0 JP #B0E0 jump to the start of Time Trap PV Part One This PV produces arrows which alternate between red and yellow, every other tick. This PV is applied also in "A Forest Clearing on Fire!", as a "sub-PV" called from the "executive PV" which manages the "sub-PVs" for this room: E2FB CD B9 93 CALL #93B9 call the PV which changes the colour of the arrows in "Into the Abyss" (and Time Trap PV Part One, which is its continuation) E2FE 18 DA JR #E2DA jump to the continuation of the code E2DA C3 24 87 JP #8724 jump to the PV which provides a moving platform which can carry Willy over obstacles The application of Time Trap PV Part One in "A Forest Clearing on Fire!" means that the current time is recorded here, just as in "Into the Abyss". However, it does not matter, because in order to reach either of the two rooms where time is restored ("Gateway to the Unknown" or "Above the Front Door"), the player has to pass through "Into the Abyss", where time will be recorded anew, so anything that may have been previously recorded in "A Forest Clearing on Fire!" will be overwritten. --- "Rocky Road to Double Inn" 93C6 3A 2C 81 LD A,(#812C) pick up the x-coordinate of the arrow (load it into register A) 93C9 E6 03 AND #03 the value of A can be #00, #01, #02 or #03 93CB 3C INC A add 1 to the value of A, which can now be #01, #02, #03 or #04 93CC 3C INC A add 1 to the value of A, which can now be #02 (as an attribute corresponding to non-bright red on black) or #03 (as an attribute corresponding to non-bright magenta on black), or #04 (as an attribute corresponding to non-bright green on black), or #05 (as an attribute corresponding to non-bright cyan on black) 93CD 32 ED 80 LD (#80ED),A set the colour of the arrow to the value of register A 93D0 C3 F7 EE JP #EEF7 jump to the start of the PV which produces a special sound and border effect in this room This PV produces arrows which alternate between red, magenta, green and cyan, changing colour every tick. B. The colour of the arrows dependent on Willy's position This PV, applied in "The Studio", makes the arrows bright cyan when Willy is on the right side of the room, and bright magenta when Willy is on the left side of the room. 9886 21 ED 80 LD HL,#80ED pick up the colour of the arrow in the room buffer 9889 3A D3 85 LD A,(#85D3) pick up Willy's x-coordinate 988C E6 1F AND #1F (just the 5 least significant bits) 988E FE 10 CP #10 is he in the right half? 9890 30 03 JR NC,#9895 if he is, jump to the code which will make the arrows bright cyan 9892 36 43 LD (HL),#43 otherwise make them bright magenta 9894 C9 RET and exit 9895 36 45 LD (HL),#45 make the arrows bright cyan 9897 C3 48 9B JP #9B48 and jump to the start of the PV which prints a dummy guardian in this room The current setup of this PV has the additional side effect that the dummy guardian in this room is printed only when Willy is on the right side of the room (after which it is visible even if Willy moves to the left side of the room). If space was not a constraint, it could be changed by inserting another JP instruction to the code which prints the dummy guardian, instead of a RET instruction, at #9894. C. Swooshing Arrow & Flashing Border/Status Bar Effect This PV, applied in both parts of the Main Hallway, causes a swooshing sound, the flashing of the border and (thanks to the Global Seamlessness routine) of the lower third of the screen (the status bar) when the arrow to which the effect is tied appears on-screen (i.e. it has an x-coordinate between #00 and #1F) and also a moment beyond its disappearance off-screen (when it has an x-coordinate of #20). 9EEA 3A 34 81 LD A,(#8134) pick up the x-coordinate of the arrow (load it into register A) 9EED FE 21 CP #21 is it #21? 9EEF D0 RET NC if it is #21 or more, exit 9EF0 E6 1F AND #1F restrict A to values in the range #00 - #1F (to prevent the border from being left with a non-zero value after the effect has come to an end) 9EF2 32 DE 80 LD (#80DE),A set the colour of the border to the value of register A 9EF5 C6 02 ADD A,#02 increase A by #02 9EF7 07 RLCA double the value of A 9EF8 4F LD C,A load the value of register A to register C (for use by the "nice fuzzy border effect" routine) 9EF9 CD EE 99 CALL #99EE call Geoff Eddy's "nice fuzzy border effect" routine (with a later entry point than usual) 9EFC CD 0F 8B CALL #8B0F call the Global Seamlessness routine 9EFF C9 RET and exit The reason why the check at #9EED is for #21 (and not #1F, which is the last on-screen x-coordinate of the arrow) is that #20 (the last value that does not trigger the Return at #9EEF, because #20 minus #21 sets the Carry Flag) is a coordinate at which the colour of the border resulting from this PV happens to be black (again). Thanks to this, there is no need to rectify the colour of the border when the PV stops operating in "Main Hallway East", where the arrow travels to the right. If the check at #9EED was for #1F, the border would stay yellow after the PV stopped operating; if the check was for #20, the border would stay white (because #20 minus #20 would not set the Carry Flag, so the code at #9EF0 to #9EFF would not be enacted when the arrow occupied cell-column #20). The problem would not affect "Main Hallway West", where the arrow travels left and the border would always revert to black when the arrow goes off-screen (when the arrow is in cell-column #00, the CP calculation [#00 minus #21] sets the Carry Flag, so the code at #9EF0 to #9EEF is implemented, turning the border black; as soon as the arrow's x-coordinate is decremented to #FF, the conditional Return at #9EEF is triggered because #FF minus #21 does not set the Carry Flag, so the border remains black until the arrow "comes back round again"). The intensity of this sound and border effect increases with the increase in the arrow's x-coordinate (in "Main Hallway East", where the arrow travels from left to right) and decreases with the decrease in the arrow's x-coordinate (in "Main Hallway West", where the arrow travels from right to left). This PV was added to the game at a late stage of development, thanks to the use of "executive PVs" which manage the "sub-PVs" in each room. "Main Hallway East" C3D3 CD F7 F5 CALL #F5F7 call the PV which prints a dummy guardian in this room C3D6 01 00 00 LD BC,(#0000) a pointless but harmless instruction, purely to bypass the conveyor direction byte for "The River of No Return" at #C3D6 (which must have a value of #01) C3D9 00 NOP the conveyor length byte for "The River of No Return", which must have a value of #00 C3DA C3 EA 9E JP #9EEA jump to the Swooshing Arrow & Flashing Border/Status Bar Effect sub-PV, which is the common ending of the PVs for both Main Hallway rooms The next byte, #C3DD, must also hold a value of #00 as part of this solution, as it is the ramp length byte for "The River of No Return". Otherwise the operand of the preceding Jump instruction at #C3DA would be interpreted as the starting point for a ramp when Willy enters "The River of No Return", causing parts of the code to be overwritten. The above setup is only possible because the PV in "The River of No Return" overwrites the value at Offset #DA (ramp direction byte) in the room buffer (i.e. the address #80DA, see section 20.2.D.a), and because all the Water-ramp-conveyor cells in that room have been placed in the layout using Water cells. Print a dummy guardian (discussed also in section 20.3.A of this document): F5F7 3A CF 85 LD A,(#85CF) pick up Willy's y-coordinate F5FA FE 70 CP #70 is he (the top of his head) 7 rows from the top of the screen? F5FC DA F9 D2 JP C,#D2F9 if it's less than that, jump to the code which will print the dummy guardian F5FF C9 RET otherwise exit D2F9 21 24 78 LD HL,#7824 where to print it on the screen D2FC C3 99 9B JP #9B99 jump to the continuation of the code 9B99 11 80 AD LD DE,#AD80 where to take the sprite from 9B9C 18 B8 JR #9B56 jump to the continuation of the code 9B56 CD 56 94 CALL #9456 print it 9B59 C9 RET and exit --- "Main Hallway West" Create the decorative "pseudo-Fire cells" in the ceiling (needed because the space in the room data reserved for the Fire cells' definition is occupied by part of the code of the PV which produces a border effect in "The Gym (Hurdle Practice)", "The Dining Hall" and "Copin' with Ropin'"): 9122 3E 0A LD A,#0A the original colour attribute for the Fire cells in "Main Hallway West" 9124 32 02 5C LD (#5C02),A load the colour to the addresses 9127 32 0F 5C LD (#5C0F),A of the four "pseudo-Fire cells" 912A 32 10 5C LD (#5C10),A in the Occupied Room Attribute Buffer 912D 32 1C 5C LD (#5C1C),A 9130 C3 CE C3 JP #C3CE jump to the continuation of the PV for this room Call the routines printing a dummy guardian and changing the colour of one of the guardians: C3CE CD CD CA CALL #CACD call the PVs which print a dummy guardian and change the colour of one of the guardians, respectively C3D1 18 07 JR #C3DA jump to the continuation of the code Print a dummy guardian: CACD 21 81 70 LD HL,#7081 where to print it on the screen CAD0 11 A0 BF LD DE,#BFA0 where to take the sprite from CAD3 CD 56 94 CALL #9456 print it CAD6 C3 74 81 JP #8174 jump to the continuation of the code Change the colour of one of the guardians, making it look like a multicolour guardian (discussed also in section 20.2.A of this document): 8174 21 D3 85 LD HL,#85D3 pick up Willy's x-coordinate 8177 11 01 81 LD DE,#8101 pick up the colour of the first guardian 817A 3A 5C 99 LD A,(#995C) pick up the timer 817D AE XOR (HL) not quite a random number 817E E6 0F AND #0F mask off bottom 4 bits 8180 F6 E0 OR #E0 this is an 8-position sprite 8182 12 LD (DE),A change its colour 8183 C9 RET and exit Jump to the Swooshing Arrow & Flashing Border/Status Bar Effect sub-PV: C3DA C3 EA 9E JP #9EEA jump to the Swooshing Arrow & Flashing Border/Status Bar Effect sub-PV, which is the common ending of the PVs for both Main Hallway rooms D. Arrow-Induced Fuzzy Border Effect This PV, applied in "Entomological Research Station", is a reduced version of the PV applied in the Main Hallway rooms. It causes a subdued version of Geoff Eddy's "nice fuzzy border effect" when the arrow to which the effect is tied appears on-screen (i.e. it has an x-coordinate between #00 and #1F) and also a moment beyond its disappearance off-screen (when it has an x-coordinate of #20). There are no changes to the status bar in this case, and the effect is more subtle than in the Main Hallway rooms, because the value of the arrow's x-coordinate, used by Geoff Eddy's "nice fuzzy border effect" routine, is only increased by 1 (while in the Main Hallway rooms it is first increased by 2 and then doubled), and the colour of the border is not set separately - the changes to the border are solely a result of the "nice fuzzy border effect" routine in action. 86EF 3A 3C 81 LD A,(#813C) pick up the x-coordinate of the arrow (load it into register A) 86F2 FE 21 CP #21 is it #21? 86F4 30 05 JR NC,#86FB if it is #21 or more, jump to the start of the PV which prints a message in this room 86F6 3C INC A increase A by #01 86F7 4F LD C,A load the value of register A to register C (for use by the "nice fuzzy border effect" routine) 86F8 CD EE 99 CALL #99EE call Geoff Eddy's "nice fuzzy border effect" routine (with a later entry point than usual) 86FB C3 F9 FD JP #FDF9 jump to the start of the PV which prints a message in this room E. Colouring a single cell In the Intermittent Fire Cell PV and the "Main Hallway West" PV, Ian Rushforth used the technique of colouring certain cells by loading the desired colours to their addresses in the Occupied Room Attribute Buffer (#5C00 - #5DFF). I used this trick to insert one of the last (chronologically speaking) PVs into "WNM SE", created mainly so as not to leave any chunk of more than three spare contiguous bytes unused. It colours two Water cells in "The Olympic Swimming Pool", hopefully enhancing the visual aspect of the room and making the player unsure whether or not these non-standard cells are lethal (in fact, they are perfectly safe, preserving the functional characteristics of "regular" Water cells). 8379 3E 02 LD A,#02 set the attribute's value to non-bright red on black 837B 32 A2 5D LD (#5DA2),A load the colour to the cell's address in the Occupied Room Attribute Buffer 837E 18 7C JR #83FC jump to the continuation of the code 83FC 3E 04 LD A,#04 set the attribute's value to non-bright green on black 83FE 18 0E JR #840E jump to the continuation of the code 840E 32 B9 5D LD (#5DB9),A load the colour to the cell's address in the Occupied Room Attribute Buffer 8411 Start of the PV which reverses the direction of the conveyor every 32 ticks - see section 20.2.C.d of this document ------ 21. Memory layout The purpose of this section is to let people interested in modifying the JSW48 game engine know the layout of the major changes to the code applied in "WNM SE", so that they can analyse them and, should they wish to, apply similar tricks in their own games. All of the addresses and values given below are hexadecimal. The sign #, denoting hex, has been skipped in order to make the listing more easily readable. "Formerly" refers to the original "JSW" (not necessarily to the OE, although in a lot of cases the code in "JSW" and the OE is the same). 8141 - 81FF Formerly: Unused. Currently: 8141 - 8154 "WILLY'S NEW MANSION." 8155 - 8174 "Press ENTER to restart the game!" (the last byte is shared with the code that follows). 8174 - 8183 PV which changes the colour of one of the guardians in "Cavernous Crossroads", "Main Hallway West" and "The Cellar". 8184 – 81C3 Tune data - "In the Hall of the Mountain King" (from "Manic Miner" and "Jet Set Willy II"). 81C0 – 81FF Tune data - "Lord of the Dance" (coded by Andrew Broad) Four bytes are shared between both tunes; they are the ending of the former and the beginning of the latter. 8356 – 837F Formerly: Unused bytes within the rope animation table. Currently: 8356 – 8363 "JSWCENTRAL.ORG" 8364 - 8378 Teleporter data (used by the code at 86B4 – 86EE). 8379 - 837F Part 1 of 3 of the PV which colours two Water cells in "The Olympic Swimming Pool" (continued at 83FC – 83FF and 840E - 8410). 83D6 – 83FF Formerly: Unused bytes within the rope animation table. Currently: 83D6 – 83EC "You have failed to meet" (the last byte is shared with the data that follows). 83EC – 83FB "the challenge of" (the first byte is shared with the preceding data). 83FC – 83FF Part 2 of 3 of the PV which colours two Water cells in "The Olympic Swimming Pool" (continued from 8379 - 837F and then continued at 840E - 8410). 8405 & 8408 The values have been changed to "87" and "C7", respectively. Thus, the memory used by the start-up password protection was released (including the password text, password code, sprite and screen data and password data), which allowed the use of all this memory for other purposes. 840C – 841F Formerly: Code which sets HL=8500 in a roundabout way and then reads through addresses 8500-FFFF, without changing their contents, introducing a pause of about 0.47s before displaying the code entry screen. Currently: 840C RET instruction left from the original code. 840D Number of lives remaining (moved from 85CC). 840E - 8410 Part 3 of 3 of the PV which colours two Water cells in "The Olympic Swimming Pool" (continued from 8379 - 837F and 83FC - 83FF). 8411 – 841F PV which reverses the direction of the conveyor every 32 ticks in "The Single Item Cave", "The Olympic Swimming Pool" and "The Underground Pantry". 8451 – 8453 Formerly: "AIR" Currently: "WNM" 8574 – 857B Formerly: 8574 – 8577 "Game" 8578 – 857B "Over" Currently: Double use: Part 1 of 2 of the PV which sends two killer squares flying across the screen in "The Anteroom" (continued at 96DE – 9705). Part 2 of 3 of the PV which sends two killer squares flying across the screen in "Jump'n'Jive" (continued from E2FB – E2FF and then continued at 96DE – 9705). 858B - 85CC Formerly: 858B – 85CA Password messages. 85CB Minute counter. 85CC Number of lives remaining. Currently: 858B – 85A7 "You have lost all your lives!" 85A8 – 85AB Part 1 of 2 of the PV which changes the colour of the guardians in "Primum non nocere" (continued at 85AE – 85CC). 85AC – 85CC Double use: 85AC – 85CC PV which changes the colour of the guardians in "The Cinema". 85AE – 85CC Part 2 of 2 of the PV which changes the colour of the guardians in "Primum non nocere" (continued from 85A8 – 85AB). 85DE – 85FA Formerly: 85DE 256 minus the number of items remaining. 85DF Game mode indicator. 85E0 Inactivity timer. 85E1 In-game music note index. 85E2 Music flags. 85E3 WRITETYPER key counter. 85E4 Temporary variable. 85E5 - 85FA WRITETYPER cheat data. Currently: 85DE – 85E3 "12:00p" 85E4 Music flags (moved from 85E2). 85E5 – 85FA Routine which produces sound and border effects when the title-screen message is scrolling (moved from 96DE – 96F3) (called from 88D9 and also used by several PVs). 865F – 869E Formerly: Tune data – "If I Were a Rich Man" (from the original "JSW"). Currently: Tune data - "Radetzky March" (coded by Richard Hallas). 869F – 87C6 Formerly: Password code. Currently: 869F – 86B3 Double use: Part 3 of 3 of the PV which changes the colour of one of the guardians in "In the Forest" (continued from DBFB – DBFF and D8F9 – D8FE). Part 3 of 3 of the PV which changes the colour of one of the guardians in "JSW's 20th Anniversary Party" (continued from E8FB – E8FF and D8F9 – D8FE). 86B4 – 86EE John Elliott's teleport routine (called from 8B7E). 86EF – 86FD Arrow-Induced Fuzzy Border Effect (applied in "Entomological Research Station") (ending with a jump to FDF9, the PV which prints a message in this room). 86FE – 870F PV which moves bright white squares across the top and bottom rows of the screen in "Internet Cafe". 8710 – 8721 PV which makes the ramps go in both directions in "The River of No Return". 8722 – 8751 PV which creates a moving platform which can carry Willy over obstacles in "A Forest Clearing on Fire!". 8752 – 876A "* * Special Edition * *" (the last byte is shared with the code that follows). 876A – 876E Main PV (called from 89F1). 876F - 8787 "You have run out of time!" (the last byte is shared with the code that follows). 8787 – 87AE Code which sets up the variables for the creation of the "Game Over" Game Over screen (a conditional jump from 9E88, ending with a jump to 8C42). 87AF - 87C6 Part 1 of 4 of the routine which sets the attributes of the top two thirds of the title screen (called from 8828, continued at 993F - 9942, 9943 - 995B and 98C3 - 98DA). 87C7 – 87E4 Formerly: 87C7 – 87C9 End of the password code. 87CA Entry point into the game. 87CB – 87CD Initialise the Kempston joystick indicator. 87CE – 87D0 Initialise the in-game music note index. 87D1 – 87D3 Initialise the (unused) Screen Flash counter. 87D4 – 87D6 Initialise the airborne status indicator. 87D7 – 87D9 Initialise the minute counter. 87DA – 87DC Initialise the inactivity timer. 87DD – 87DF Initialise the game mode indicator. 87E0 – 87E4 Initialise the number of lives remaining. Currently: 87C7 Entry point into the game. 87C8 – 87CA Initialise the Kempston joystick indicator. 87CB – 87CD Initialise the airborne status indicator. 87CE – 87D0 Initialise the minute counter. 87D1 – 87D3 Initialise the in-game music note index. 87D4 – 87D6 Initialise the game mode indicator. 87D7 – 87D9 Initialise the Screen Flash counter. 87DA – 87DD Initialise the music flags and the keypress flag in bit 0 at 85E4. 87DE – 87E1 Initialise Willy's direction and movement flags. 87E2 – 87E4 Initialise Willy's animation frame. 87F5 – 8907 Formerly: 87F5 – 880D Initialise the item-collection variables. 880E – 8812 Initialise the keypress flag in bit 0 at 85E2. 8813 – 88FB Code which prepares the title screen and plays the tune. 88FC – 8907 Beginning of the "Start the game" routine, which continues into the "Room set-up routine". Currently: 87F5 – 880B Initialise the item-collection variables (optimised). 880C – 8810 Set the value of 81A3 to 56, to set the tune "In the Hall of the Mountain King" right after it was modified by either of the Final Screens. 8811 – 8816 Initialise the colour of the toilet. 8817 – 881C Initialise the proper values for the in-game tune playing at regular speed. 881D – 8821 Initialise the number of lives remaining. 8822 – 8824 Initialise Willy's colour. 8825 – 8827 Call the routine at 88FA – 8907, which clears the screen. 8828 – 882A Call the routine starting at 87AF, which sets the attributes of the top two thirds of the screen. 882B – 882D Call the routine at 99FF - 9A31, which sets fixed attributes of the bottom third of the screen. 882E – 888C Code which creates a part of the title screen. 888D – 888F Call the code at 9E00 – 9E52, which creates the rest of the title screen. 8890 – 88EE Code which checks whether there is a joystick connected, plays the theme tune and checks for keypresses. 88EF - 88F4 PV which produces sound and border effects in "Above the Front Door" (ending with a jump to 99C0, to the Time Trap PV Part Three). 88F5 – 88FA "GO UP!" (the last byte is shared with the code that follows). 88FA – 8907 Routine which clears the screen (called from 8825 and 971B). The "Start the game" routine (which continues into the "Room set-up routine" at 8913), has been optimised, so that now it starts at 8908 (instead of 88FC) and ends at 8986 (instead of 898A). The routines which follow have been moved up, so that e.g. the Main Loop starts at 89A9. 8916 The value of this address was changed to EE, which allowed the game engine to use 7-bit (or, in theory, even 8-bit) room numbers instead of 6-bit ones. 896D The value of this address was changed to 20, which allowed the room names to be displayed one row lower than in the OE and in the original "JSW". 89F1 – 8D32 Formerly: 89F1 – 8A0A Part of the Main Loop. 8A0B - 8A25 Screen Flash code, unused in the original "JSW". 8A26 - 8AAA Part of the Main Loop which deals with the in-game clock. 8AAB - 8AD0 Part of the Main Loop which checks whether any non- movement keys are being pressed. 8AD1 - 8AEA Part of the pause loop within the Main Loop which checks if any keys except A-S-D-F-G are pressed and 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. 8C01 – 8C49 "Lose a life" routine. 8C4A - 8D32 The Game Over sequence. Currently: 89F1 – 89F3 Main PV is called (located at 876A). 89F4 – 8A0F Part of the Main Loop (moved from 89F5 – 8A10). 8A10 – 8A21 Screen Flash code (unused in the original "JSW", in "WNM SE" modified by calling a subroutine at 8B2A - 8B30 and used by several PVs). 8A22 Unused byte. 8A23 – 8A39 Part of the Main Loop. 8A3A – 8A9A Modified part of the Main Loop which deals with the in- game clock. 8A9B - 8AB7 Part of the Main Loop which checks whether any non- movement keys are being pressed. 8AB8 - 8ACC Part of the pause loop within the Main Loop which checks if any keys except A-S-D-F-G are pressed. 8ACD - 8ADC Part 1 of 2 of the PV which creates a flashing effect in "Emergency Exit on the Roof" (continued at 8B06 – 8B0E). 8ADD - 8AF8 Routine which cycles the INK and PAPER colours. 8AF9 - 8B0E Double use: 8AF9 – 8B0E PV which creates a flashing effect in "The Observatory". 8B06 – 8B0E Part 2 of 2 of the PV which creates a flashing effect in "Emergency Exit on the Roof" (continued from 8ACD – 8ADC). 8B0F - 8B29 Global Seamlessness routine (called from 897E, 8B31, 99D7 9EFC and [to a later entry point of 8B12] from 8A8E). The preceding PV that cycles the colours in "Emergency Exit on the Roof" and "The Observatory" continues straight on into the Global Seamlessness routine. 8B2A - 8B30 Subroutine called by the Screen Flash code (from 8A1F) and by the optimised "Lose a life" routine (from 9E5E). 8B31 - 8B58 Part of the modified Main Loop (2), the last part of which toggles the in-game music. 8B59 - 8B83 Modified code which plays a note of the in-game music, choosing the start of the tune depending on the value of Offsets DF and E0 in each room. 8B84 – 8BC3 Tune data - "If I Were a Rich Man" (from the original "JSW"). 8BC4 – 8BCF Double use: 8BC4 – 8BCF Part 4 of 5 of the PV which produces a Screen Flash effect triggered by Willy jumping and prints a ghost guardian and a ghost message in "Stairway (Starryway) to Heaven" (continued from D6F9 – D6FE, D7C4 – D7CE and E9C4 - E9CC and then continued at 9B90 – 9B93). 8BCB – 8BCF [along with the continuation at 9B90-9B93] Code used by the modified routine which deals with the in-game clock (called from 8A98) and by the code which sets up the variables to create the "Time Up!!" Game Over screen (called from 8C1D). 8BD0 – 8C05 Double use: Part 2 of 2 of the PV which changes Willy's colour in "The Hypnotherapy Room" (continued from F4FB – F4FF). Part 2 of 2 of the PV which changes Willy's colour in "The Changing Room" (continued from C8FB – C8FF). 8C06 – 8C41 Code which sets up the variables to create the "Time Up!!" Game Over screen (jump from 8A76). 8C42 – 8D1B Game Over sequence, optimised and shortened (by calling the subroutine at E4F9 - E4FE eight times). 8D1C - 8D2A PV which prevents Willy from getting stuck after falling from "Above the Front Door". 8D2B Game mode indicator (moved from 85DF). The next few routines have been moved up and consolidated by removing redundant instructions, replacing absolute jumps with relative ones where possible, etc. Stuart Brady's Cell Graphics Bug Fix has been incorporated into the routine which draws the current room to the screen buffer at 7000, thanks to Ian Rushforth's advice. Furthermore, the beginning of the "Move Willy (3)" routine, in the original "JSW" starting at 8FBC, has been moved three bytes down thanks to the elimination of a redundant instruction below. As a result, space has been freed up and it has been used in the following way: 8FA4 – 8FBE Geoff Eddy's printing routine used by the PV which creates a moving platform which can carry Willy over obstacles in "A Forest Clearing on Fire!" and by the PVs which open a gap in the wall in "The Mammoth Cave" and "Willy's Private Fort Knox"(called from 872B, 874A, 9A68 and a jump from 9A6D). 90D9 – 9132 Formerly: Code which moves the ropes in the current room. Currently: 90D9 – 9121 Modified code which moves the ropes in the current room. 9122 – 9132 Code which creates four "pseudo-Fire cells" in "Main Hallway West" (restoring the aesthetic qualities of that room present in the OE; the "pseudo-Fire cells" are non- lethal, but they are out of Willy's possible reach in any case). 91EE – 91FC Formerly: Part of the routine which draws guardians in the current room. Currently: 91EE – 91F0 Jump to B0ED (where part of Ian Rushforth's Guardian Shadow Bug Fix is located). 91F1 In-game music note index (moved from 85E1). 91F2 – 91FC Modified part of the routine which draws guardians in the current room. 9252 – 9260 Formerly: Part of the routine which draws arrows in the current room. Currently: Modified part of the routine which draws arrows in the current room (a border effect has been added when the arrow "warning sound" occurs). 93B9 - 93D2 Formerly: 93B9 - 93BA End of the routine which draws ropes and guardians in the current room. 93BB - 93D0 Unused routine. 93D1 – 93D2 Start of the routine which draws the items in the current room and collects any that Willy is touching. Currently: The routine which draws ropes and guardians in the current room has been shortened by two bytes thanks to the elimination of a redundant jump and the consolidation of the code. Similarly, the routine which draws the items in the current room and collects any that Willy is touching has been shortened by two bytes, so that it now starts at 93D3. 93B9 - 93C5 PV which changes the colour of the arrows in "Into the Abyss" and "A Forest Clearing on Fire!" (ending with a jump to B0E0, the start of Time Trap PV Part One). 93C6 - 93D2 PV which changes the colour of the arrows in "Rocky Road to Double Inn" (ending with a jump to EEF7, the start of the PV which produces a special sound and border effect). 9427 - 9438 Formerly: Code which changes the game mode indicator to 1 when all items have been collected, and the start of the code which draws the items and cycles their INK colour. Currently: The routine which draws the items in the current room and causes the collection of any that Willy is touching has been modified so that a border effect is associated with the sound effect that occurs when an item is collected. As a result, the last part of this code is moved down in relation to its original location. Furthermore, the code has been modified as per description in section IX.6 above. 9541 – 9599 Formerly: 9541 – 9575 Code which deals with Maria in "Master Bedroom". 9576 - 9583 Code which checks whether Willy has reached the bed and changes the game mode indicator to 2 when Willy is running to the toilet. 9584 – 9599 Code which checks if Willy has reached the toilet. Currently: 9541 – 957E Modified code which deals with Maria in "The Cosy Upstairs Bedroom". 957F – 9597 Modified code which checks whether Willy has reached the bed and updates the game mode indicator to 2 when Willy is running to the toilet and changes Willy's colour to bright green. 9598 - 9599 First pair of bytes used by the Time Trap PV to record data (the second pair is at 98DB - 98DC). 96DE – 97FF Formerly: 96DE - 96F3 Routine which produces sound and border effects when the title-screen message is scrolling. 96F4 - 97FF Unused reset code. Currently: 96DE – 9705 Double use: Part 2 of 2 of the PV which sends two killer squares flying across the screen in "The Anteroom" (continued from 8574 – 857B). Part 3 of 3 of the PV which sends two killer squares flying across the screen in "Jump'n'Jive" (continued from E2FB – E2FF and 8576 – 857B). 9706 – 971A PV which changes the colour of one of the guardians in "The Great Descent", "The Volleyball Court", "A Bit of Fresh Air" and "West Stairway". 971B – 9728 Code which creates a part of both the "Game Over" Final Screen and the "Time Up!!" Final Screen (jump from 8D28). 9729 – 9737 Code which creates a part of the "Time Up!!" Final Screen. 9738 – 9744 Code which creates a part of the "Game Over" Final Screen. 9745 – 97FF Code which creates the rest of both the "Game Over" Final Screen and the "Time Up!!" Final Screen, then plays the music, animates the skull and waits for ENTER to be pressed. 9800 - 9BFF Formerly: 9800 - 99FF Attributes for the top two thirds of the title screen. 9A00 – 9AFF Attributes for the bottom third of the screen. 9B00 - 9BFF Sprites and attributes for password entry. Currently: 9800 - 9826 Part of the attributes for the top two thirds of the title screen. 9827 Temporary variable (moved from 85E4). 9828 - 9838 Triple use: 9828 - 9838 PV which turns the screen green in "In the Backwoods". 982A - 9838 Double use: Part 2 of 2 of the PV which turns the screen yellow in "The Reading Room" (continued from F9FB – F9FF). Part 2 of 2 of the PV which turns the screen blue in "Entrance to the Cellar" (continued from F8FB - F8FF). 9839 - 9865 Part of the attributes for the top two thirds of the title screen. 9866 - 9873 Part 5 of 5 of the PV which makes the "HELLO!" sign flicker in "The Front Door") (subroutine called five times from the code at 98A3 - 98BC) (continued from D3CE - D3D5, FCCE - FCD5, 9874 - 9879 and 98A3 - 98BC). 9874 - 9879 Part 3 of 5 of the PV which makes the "HELLO!" sign flicker in "The Front Door") (continued from D3CE - D3D5 and FCCE - FCD5 and then continued at 98A3 - 98BC and 9866 - 9873). 987A - 9885 Part of the attributes for the top two thirds of the title screen. 9886 - 9899 PV which changes the colour of the arrows in "The Studio" depending on which side of the room Willy is on (ending with a jump to 9B48, the start of the PV which prints a dummy guardian). 989A - 98A2 Part of the attributes for the top two thirds of the title screen. 98A3 - 98BC Part 4 of 5 of the PV which makes the "HELLO!" sign flicker in "The Front Door") (continued from D3CE - D3D5, FCCE - FCD5 and 9874 - 9879, calling the subroutine at 9866 - 9873 five times and ending with a jump to 9980, the start of the PV which prints a message and changes the in- game tune depending on whether Willy is inside or outside the house). 98BD - 98C2 Part of the attributes for the top two thirds of the title screen. 98C3 - 98DA Part 4 of 4 of the routine which sets the attributes of the top two thirds of the title screen (continued from 87AF - 87C6, 993F - 9942 and 9943 - 995B). 98DB - 98DC Second pair of bytes used by the Time Trap PV to record data (the first pair is at 8A0D – 8A0E). 98DD - 98FF Part of the attributes for the top two thirds of the title screen. 9900 - 993F Part 2 of 4 of the routine which sets the attributes of the top two thirds of the title screen (continued from 87AF - 87C6 and then continued at 9943 - 995B and 98C3 - 98DA) (the last byte is shared with the data that follows). 993F - 9942 Attributes for locations 593F, 5940, 5941 and 5942 on the title screen (all #00s). The attribute for 593F is also used by the routine which sets the attributes of the top two thirds of the title screen. Its code "glides over" the other three attributes (which are meaningless to it - seemingly NOPped out) and continues at 9943. 9943 - 995B Part 3 of 4 of the routine which sets the attributes of the top two thirds of the title screen (continued from 87AF - 87C6 and 9900 - 993F and then continued at 98C3 - 98DA). 995C Minute counter (moved from 85CB). 995D - 997F Part of the attributes for the top two thirds of the title screen. 9980 - 999F PV which prints a message in "The Front Door" and changes the in-game tune depending on whether Willy is inside or outside the house. 99A0 - 99BF Part of the attributes for the top two thirds of the title screen. 99C0 - 99CA Part 1 of 2 of the Time Trap PV Part Three (applied in "Gateway to the Unknown" and "Above the Front Door") (continued at 99D4 – 99E0). 99CB – 99E0 Double use: 99CB – 99E0 Time Trap PV Part Two (applied in "The Temple of Passing Time"). 99D4 – 99E0 Part 2 of 2 of the Time Trap PV Part Three (applied in "Gateway to the Unknown" and "Above the Front Door") (continued from 99C0 – 99CA). 99E1 - 99EB PV which produces a fuzzy border effect when Willy is airborne in "Maths Lab" (continuing into Geoff Eddy's "nice fuzzy border effect" routine). 99EC - 99FE Double use: 99EC - 99FE Geoff Eddy's "nice fuzzy border effect" routine (called from the teleporter routine at 86E3 and also used by several PVs). 99F9 - 99FE Code which sets the border colour during room set-up, or restores the border to its correct colour for the room Willy is in, when Willy collects an item or the arrow warning sound occurs whilst the in-game music is switched off (called from 8B12, 925E and 941D). 99FF - 9A31 Routine which sets fixed attributes of the bottom third of the screen (the status bar) (called from 882B, 8C0E and C1F9). 9A32 - 9A50 PV which produces the Intermittent Fire Cell in "Willy's Private Fort Knox" (continuing into the PV which opens a gap in the wall there). 9A51 - 9A6F Double use: 9A51 – 9A6F PV which opens a gap in the wall in "Willy's Private Fort Knox". 9A59 – 9A6F Part 2 of 2 of the PV which opens a gap in the wall in "The Mammoth Cave" (continued from C2F5 – C2FF). 9A70 - 9A79 "WRITETYPER" 9A7A 256 minus the number of items remaining (moved from 85DE). 9A7B – 9A8F Item-counting subroutine used by the PVs which open a gap in the wall in "The Mammoth Cave" and "Willy's Private Fort Knox" (called from 9A5C). 9A90 – 9AFD Part of attributes for the bottom third of the screen. 9AFE - 9B0C "GAME COMPLETED!" (the last byte is shared with the code that follows). 9B0C - 9B10 Part 1 of 2 of the PV which prints the clock in "The Cosy Upstairs Bedroom" (continued at 9B53 - 9B59). 9B11 - 9B1A "WELL DONE!" (the last byte is shared with the code that follows). 9B1A - 9B1E Part 1 of 3 of the PV which prints an unmoving guardian in "East Stairway" (continued at 9B33 - 9B37 and 9B56 – 9B59). 9B1F - 9B23 Part 3 of 5 of the PV which prints a dummy guardian in "Upper Balcony" (continued from EFF9 – F000 and C0F9 – C0FE and then continued at 9B4B – 9B4F and 9B56 - 9B59). 9B24 - 9B37 Double use: 9B24 – 9B37 Part 2 of 3 or 4 of 5 of the PV which prints three dummy guardians and a signboard in "Double Inn" (continued from E4BB – E4D7 and then continued at 9B56 - 9B59 or, alternately, continued from E4BB – E4C2, E1CD - E1D8 and F2CD - F2D8 and then continued at 9B56 - 9B59). 9B33 – 9B37 Part 2 of 3 of the PV which prints an unmoving guardian in "East Stairway" (continued from 9B1A - 9B1E and then continued at 9B56 – 9B59). 9B38 - 9B42 Triple use: 9B38 – 9B42 Part 1 of 2 of the PV which prints "WNM" in "On the Roof" (continued at 9B90 - 9B93). 9B3C – 9B42 Part 2 of 3 of the PV which prints a message in "Entomological Research Station" (continued from FDF9 – FDFF and then continued at 9B90 - 9B93). 9B3F - 9B42 Code used by the PV which prints a message in "The Front Door". 9B43 – 9B47 Part 1 of 3 of the PV which prints a guardian in "Entrance to the Caves" (continued at 9B4B - 9B4F and 9B56 - 9B59). 9B48 – 9B4F Triple use: 9B48 – 9B4F Part 1 of 2 of the PV which prints a dummy guardian in "The Studio" (continued at 9B56 - 9B59). 9B4B – 9B4F Part 2 of 3 of the PV which prints an unmoving guardian in "Entrance to the Caves" (continued from 9B43 – 9B47 and then continued at 9B56 - 9B59). 9B4B – 9B4F Part 4 of 5 of the PV which prints a dummy guardian in "Upper Balcony" (continued from EFF9 – F000, C0F9 – C0FE and 9B1F - 9B23 and then continued at 9B56 - 9B59). 9B50 - 9B59 Multiple use: 9B50 – 9B59 PV which prints the clock in "West Wing Bedroom". 9B53 – 9B59 Part 2 of 2 of the PV which prints the clock in "The Cosy Upstairs Bedroom" (continued from 9B0C - 9B10). 9B56 – 9B59 Multiple use: Part 2 of 2 of the PV which prints a dummy wall in "A Room with a View" (continued from 9B9E – 9BA5). Part 2 of 2 of the PV which prints a dummy guardian in "The Studio" (continued from 9B48 – 9B4F). Part 2 of 2 or 3 of 3 of the PV which prints a dummy guardian in "At the Edge of the Forest" (continued from 9BA9 - 9BB7 or, alternately, from 9BA9 - 9BB2 and 9B94 – 9B98). Part 2 of 2 or 3 of 3 of the PV which prints a message and a dummy guardian in "Abandoned Subterranean Passage" (continued from 9BB8 – 9BD4 or, alternately, continued from 9BB8 – 9BCF and 9B94 – 9B98). Part 3 of 3 of the PV which prints a signboard and a dummy wall in "The Back Door" (continued from D7CF - D7DC and D0F7 - D0FF). Part 3 of 3 of the PV which prints a dummy guardian in "Out on the Balcony" (continued from D2F9 – D2FE and 9B99 – 9B9D). Part 3 of 3 of the PV which prints a guardian in "Entrance to the Caves" (continued from 9B43 – 9B47 and 9B4B – 9B4F). Part 3 of 3 of the PV which prints an unmoving guardian in "East Stairway" (continued from 9B1A - 9B1E and 9B33 – 9B37). Part 3 of 5 or 5 of 5 of the PV which prints three dummy guardians and a signboard in "Double Inn" (continued from E4BB – E4D7 and 9B24 – 9B37 or, alternately, from E4BB – E4C2, E1CD - E1D8, F2CD - F2D8 and 9B24 – 9B37). Part 4 of 4 of the PV which prints a dummy guardian in "Main Hallway East" (continued from F5F7 – F5FF, F9 – D2FE and 9B99 – 9B9D). Part 5 of 5 of the PV which prints a dummy guardian in "Upper Balcony" (continued from EFF9 – F000, C0F9 – C0FE, 9B1F - 9B23 and 9B4B – 9B4F). 9B5A – 9B93 Multiple use: 9B5A - 9B93 Routine which checks if Willy has reached the toilet (relocated from 9584 - 9599) (called conditionally from 89E2) plus additional code which changes the colour of the toilet (and Willy inside it), doubles the speed of the in- game tune and prints "WELL DONE!" / "GAME COMPLETED!" on the screen when Willy has reached the toilet. 9B90 - 9B93 Multiple use: Part 2 of 2 of the PV which prints "WNM" in "On the Roof" (continued from 9B38 - 9B42). Part 3 of 3 of the PV which prints a message in "Entomological Research Station" (continued from C0F9 – C0FE and 9B3C – 9B42). Part 5 of 5 of the PV which produces a Screen Flash effect triggered by Willy jumping and prints a ghost guardian and a ghost message in "Stairway (Starryway) to Heaven" (continued from D6F9 – D6FE, D7C4 – D7CE, E9C4 - E9CC and 8BC4 – 8BCF). [continued from 8BCB – 8BCF] Code used by the modified routine which deals with the in-game clock (called from 8A98) and by the code which sets up the variables to create the "Time Up!!" Game Over screen (called from 8C1D). 9B94 – 9B98 Double use: Part 2 of 3 of the PV which prints a dummy guardian in "At the Edge of the Forest" (continued from 9BA9 - 9BB2 and then continued at 9B56 – 9B59; the alternative path for this PV is 9BA9 - 9BB7 and 9B56 – 9B59). Part 2 of 3 of the PV which prints a message and a dummy guardian in "Abandoned Subterranean Passage" (continued from 9BB8 – 9BCF and then continued at 9B56 – 9B59; the alternative path for this PV is 9BB8 – 9BD4 and 9B56 – 9B59). 9B99 – 9B9D Double use: Part 2 of 3 of the PV which prints a dummy guardian in "Out on the Balcony" (continued from D2F9 – D2FE and then continued at 9B56 – 9B59). Part 3 of 4 of the PV which prints a dummy guardian in "Main Hallway East" (continued from F5F7 – F5FF and D2F9 – D2FE and then continued at 9B56 – 9B59). 9B9E – 9BA5 Part 1 of 2 of the PV which prints a dummy wall in "A Room with a View" (continued at 9B56 – 9B59). 9BA6 – 9BA9 "Up!!" (the last byte is shared with the code that follows). 9BA9 - 9BB7 Part 1 of 2 or 1 of 3 of the PV which prints a dummy guardian in "At the Edge of the Forest" (continued at 9B56 – 9B59 or, alternately, after a jump from 9BB2, at 9B94 – 9B98 and 9B56 - 9B59). 9BB8 – 9BD4 Part 1 of 2 of the PV which prints a message and a dummy guardian in "Abandoned Subterranean Passage" (continued at 9B56 – 9B59 or, alternately, after a jump from 9BCF, at 9B94 – 9B98 and 9B56 - 9B59). 9BD5 – 9BDB Part 1 of 2 of the PV which animates the attributes on top of the screen in "Dynamite Dan would love this!" (continued at 9BF0 – 9BFF). 9BDC – 9BFF Double use: 9BDC – 9BFF PV which prints a part of the composite guardian and animates the attributes above the altar in "Altar to an Unknown God". 9BF0 – 9BFF Part 2 of 2 of the PV which animates the attributes on top of the screen in "Dynamite Dan would love this!" (continued from 9BD5 – 9BDB). 9C00 - 9C3F Formerly: Assembler source code. Currently: Sprites. 9C00 - 9C1F The downward-pointing arrow. 9C20 - 9C3F The clock. 9E00 - 9EFF Formerly: Password codes (data). Currently: 9E00 – 9E52 Routine which creates part of the title screen (called from 888D). 9E53 - 9E99 "Lose a life" routine (relocated from 8C01 - 8C49 and optimised by calling a subroutine at 8B2A - 8B30), ending with a jump to 8913 (the value of the address 9E57 was changed to 57 so as to extend Willy's "death throes"). 9E9A – 9EAF Code which changes the game mode indicator to 1 when all items have been collected, changes Willy's colour to yellow and makes the number of items collected flash (includes the original code previously at 9427 - 942B and new code) (called from 9429). 9EB0 – 9EB3 Code which sets up the data to change the colour of the time display to green and then jumps to 9EBA to execute it. 9EB4 – 9EB7 Code which sets up the data to change the colour of the time display to yellow and then jumps to 9EBA to execute it. 9EB8 – 9EB9 Code which sets up the data to change the colour of the time display to red and then continues to execute it. 9EBA – 9ECA Code which modifies the colour variable at 9EC7 and then changes the colour of the time display (to green, yellow or red, or to flashing bright red when used by the "Time Up!!" Game Over screen routine). 9ECB – 9EE9 Routine which sets the colour of the time display depending on the hour (called from 8A8B and C1FC). 9EEA - 9EFF PV which produces the Swooshing Arrow & Flashing Border/ Status Bar Effect in "Main Hallway East" and "Main Hallway West". 9F00 - 9FFF Formerly: Unused. Currently: Sprites. 9F00 - 9F7F Matthew Smith's composite priest (from the original "JSW"). 9F80 - 9FFF Daniel Gromann's horizontal insect. A3FB – A3FE Formerly: Part of (unused) guardian class 7F. Currently: "1884" A680 – A6FF Formerly: Unused. Currently: Sprites – Richard Hallas's sun. A700 – A7FF Formerly: Unused. Currently: Room data – "The Temple of Passing Time" (103). A7FF Variable used by the PVs which create flashing effects in "Emergency Exit on the Roof" and "The Observatory" (within the room data of "The Temple of Passing Time"). A800 - A8FF Formerly: Unused. Currently: Room data – "A Forest Clearing on Fire!" (104). A900 - A9FF Formerly: Unused. Currently: Sprites. A900 – A93F Esmerelda (from the original "JSW"). A940 – A97F Head of the Chinese dragon (from the original "JSW"). A980 – A9BF Daniel Gromann's smiling / unsmiling face. A9C0 – A9FF Chandelier (from the original "JSW"). AA00 – AAFF Formerly: Unused. Currently: Sprites – Richard Hallas's jumping fish (the order of some of the sprite frames has been changed following Ian Rushforth's advice). B0E0 - B13F Formerly: Sprites. B0E0 – B0FF Second half of the chandelier sprite data. B100 – B13F First part of the periscope / Macaroni Ted sprite data. Currently: B0E0 – B0EC Time Trap PV Part One (applied in "Into the Abyss"). B0ED – B0FF Part of Ian Rushforth's Guardian Shadow Bug Fix (jump from 91EE and jump back to 91FB). B100 – B13F Assembler source code, in the original "JSW" and in the OE located at 9C00 - 9C3F, which in the OE and in "WNM SE" serves as sprites for the trees in the forest. The space within the room data which is unused in the original "JSW" (Offsets DF, E0, ED, EE and EF) or which is reserved for various elements (the attributes and graphics of the cells used to build the room, items graphics or the specification of guardians used in the room), but unused in some of the rooms (e.g. because there is no ramp, no item or there are fewer than 8 guardians) has been used for other purposes in "WNM SE". Offsets DF and E0 define the start of the in-game tune used in the room. Offset ED defines the colour of the arrows in the room (it is set to 00 in rooms with no arrows). Offsets EE and EF define the address of the PV used in the room. All chunks of otherwise unused space within the room data longer than three bytes, and some of the ones which are three-bytes-long, have been used in "WNM SE" for various purposes with a practical application in the game. The remaining three-bytes-long chunks of spare bytes have been filled with messages unused in the game. Some unused bytes (one or two consecutive bytes) may precede or follow the used addresses listed below. C0F9 – C0FE Part 2 of 5 of the PV which prints a dummy guardian in "Upper Balcony" (continued from EFF9 – F000 and then continued at 9B1F - 9B23, 9B4B – 9B4F and 9B56 - 9B59). C1F9 – C1FF Code which calls the routine at 99FF – 9A31, which sets fixed attributes of the bottom third of the screen, and the routine at 9ECB – 9EE9, which sets the colour of the time display depending on the hour (called from 8B0F and 9E53). C2F5 – C2FF Part 1 of 2 of the PV which erases a wall in "The Mammoth Cave" (continued at 9A59 – 9A6F). C3C5 – C3CC Part 1 of 3 of the PV which prints a signboard in "West Stairway" (continued at C3FD – C3FF and D2C5 – D2CA). C3CE - C3D2 Part 1 of 2 of the "executive PV" in "Main Hallway West", which manages the "sub-PVs" used in this room (continued at C3DA - C3DC). C3D3 - C3DC Double use: C3D3 - C3DC "Executive PV" in "Main Hallway East", which manages the "sub-PVs" used in this room (part of the code is also room data for "The River of No Return"). C3DA - C3DC Part 2 of 2 of the "Executive PV" in "Main Hallway West", which manages the "sub-PVs" used in this room (continued from C3CE - C3D2). C3FD – C3FF Part 2 of 3 of the PV which prints a signboard in "West Stairway" (continued from C3C5 – C3CC and then continued at D2C5 – D2CA). C6C4 - C6CB Part 1 of 2 of the Shimmering Willy PV [Optimised] (applied in "The Cinema") (continued at C7C4 - C7C9). C6DA – C6DC "JSW" (unused in the game). C7C4 - C7C9 Part 2 of 2 of the Shimmering Willy PV [Optimised] (applied in "The Cinema") (continued from C6C4 - C6CB, ending with a jump to 85AC, to the PV which changes the colour of the guardians in this room). C7CA - C7CB "AF" (Andy Ford's initials – unused in the game). C7DA – C7DC "WNM" (unused in the game). C8CD - C8D8 Flashing Screen PV (applied in "Above the Abyss"). C8FB – C8FF Part 1 of 2 of the PV which changes Willy's colour in "The Changing Room" (continued at 8BD0 – 8C05). C9B2 - C9BA Part 1 of 2 of the PV which prints the signboard in "Dynamite Dan would love this!" (continued at C9C4 - C9D8). C9C4 - C9D8 Part 2 of 2 of the PV which prints the signboard in "Dynamite Dan would love this!" (continued from C9B2 – C9BA, ending with a jump to 9BD5, to the PV which animates the attributes on top of the screen). C9DA – C9DC "ERS" C9FD – C9FF "DRG" (my full initials – unused in the game). CACD - CAD8 PV which prints a dummy guardian in "Main Hallway West" (ending with a jump to 8174, to the PV which changes the colour of one of the guardians). CAFC – CAFF "Game" CBC4 - CBCB "↑ EXIT ↓" CBDA – CBDC "IRF" (Ian Rushforth's username at jswmm.co.uk – unused in the game). CBF5 – CBFF Part One of the Shimmering Willy PV (applied in "On the Sun Deck", "Willy's Problematic Heaven" and "Altar to a Well-Known God") (Part Two is at FCF5 – FCFF). CCA9 - CCB1 Part 1 of 2 of the PV which prints a dummy guardian in "The Underground Pantry" (continued at CCC4 – CCD4). CCC4 – CCD4 Double use: CCC4 – CCD4 Part 2 of 2 of the PV which prints a dummy guardian in "The Underground Pantry" (continued from CCA9 - CCB1, ending with a jump to 8411, to the PV which reverses the direction of the conveyor every 32 ticks). CCCF - CCD4 Part 4 of 4 or 4 of 5 of the PV which prints a dummy guardian in "The Single Item Cave" (continued from F0C4 - F0CB, D9C4 - D9C8 and CCE1 - CCE8 or, alternately, from F0C4 - F0CB, D9C4 - D9CB, CCD5 - CCDB and CCE4 - CCE8, ending with a jump to 8411, to the PV which reverses the direction of the conveyor every 32 ticks). CCD5 – CCDB Part 3 of 5 of the PV which prints a dummy guardian in "The Single Item Cave" (continued from F0C4 - F0CB and D9C4 - D9CB and then continued at CCE4 - CCE8 and CCCF - CCD4; the alternate path for this PV is F0C4 - F0CB, D9C4 - D9C8, CCE1 - CCE8 and CCCF - CCD4). CCE1 - CCE8 Double use (alternative paths of the same PV): CCE1 - CCE8 Part 3 of 4 of the PV which prints a dummy guardian in "The Single Item Cave" (continued from F0C4 - F0CB and D9C4 - D9C8 and then continued at CCCF - CCD4). CCE4 - CCE8 Part 4 of 5 of the PV which prints a dummy guardian in "The Single Item Cave" (continued from F0C4 - F0CB, D9C4 - D9CB and CCD5 - CCDB and then continued at CCCF - CCD4). CDCD - CDD8 Shimmering Willy PV [Optimised] (applied in "Willy's Personal Hideout") (ending with a jump to E2C4, to the PV which prints a four-part-message in this room). CEFD – CEFF "MAG" (my wife's full initials - unused in the game). D0F7 - D0FF Part 2 of 3 of the PV which prints a signboard and a dummy wall in "The Back Door" (continued from D7CF - D7DC and then continued at 9B56 – 9B59). D2C5 – D2CA Part 3 of 3 of the PV which prints a signboard in "West Stairway" (continued from C3C5 – C3CC and C3FD – C3FF, ending with a jump to 9706, to the PV which changes the colour of one of the guardians). D2CB – D2CC "AF" (Andy Ford's initials – unused in the game). D2F9 – D2FE Double use: Part 1 of 3 of the PV which prints a dummy guardian in "Out on the Balcony" (continued at 9B99 – 9B9D and 9B56 – 9B59). Part 2 of 4 of the PV which prints a dummy guardian in "Main Hallway East" (continued from F5F7 – F5FF and then continued at 9B99 – 9B9D and 9B56 – 9B59). D3CE – D3D5 Part 1 of 5 of the PV which makes the "HELLO!" sign flicker in "The Front Door" (continued at FCCE - FCD5, 9874 - 9879, 98A3 - 98BC and 9866- 9873). D3FB – D400 Double use (the last byte is shared with the room data that follows): Part 2 of 3 of the PV which produces a special effect in "Copin' with Ropin'" and "The Dining Hall" (continued from F2FB – F2FF and then continued at EABB – EAC3). Part 2 of 3 of the PV which produces a special effect in "The Gym (Hurdle Practice)" (continued from D4FB – D4FF and then continued at EABB – EAC3). D4FB – D4FF Part 1 of 3 of the PV which creates a special effect in "The Gym (Hurdle Practice)" (continued at D3FB – D400 and EABB – EAC3). D5F5 – D5FF Part One of the Willy's Colour Changed on Entrance to the Room PV (applied in "The Forgotten Tower") (Part Two is at DCF5 – DCFF). D6F9 – D6FE Part 1 of 5 of the PV which produces a Screen Flash effect triggered by Willy jumping and prints a ghost guardian and a ghost message in "Stairway (Starryway) to Heaven" (continued at D7C4 - D7CE, E9C4 – E9CC, 8BC4 – 8BCF and 9B90 – 9B93). D7C4 - D7CE Part 2 of 5 of the PV which produces a Screen Flash effect triggered by Willy jumping and prints a ghost guardian and a ghost message in "Stairway (Starryway) to Heaven" (continued from D6F9 – D6FE and then continued at E9C4 - E9CC, 8BC4 – 8BCF and 9B90 – 9B93). D7CF - D7DC Part 1 of 3 of the PV which prints a signboard and a dummy wall in "The Back Door" (continued at D0F7 – D0FF and 9B56 – 9B59). D8F9 – D8FE Double use: Part 2 of 3 of the PV which changes the colour of one of the guardians in "In the Forest" (continued from DBFB – DBFF and then continued at 869F – 86B3). Part 2 of 3 of the PV which changes the colour of one of the guardians in "JSW's 20th Anniversary Party" (continued from E8FB – E8FF and then continued at 869F – 86B3). D9C4 - D9CB Part 2 of 4 or 2 of 5 of the PV which prints a dummy guardian in "The Single Item Cave" (continued from F0C4 - F0CB and then continued, after a jump from D9C8, at CCE1 - CCE8 and CCCF - CCD4 or, alternately, at CCD5 - CCDB, CCE4 - CCE8 and CCCF - CCD4). D9DA – D9DC "IRF" (Ian Rushforth's username at jswmm.co.uk – unused in the game). DBFB – DBFF Part 1 of 3 of the PV which changes the colour of one of the guardians in "In the Forest" (continued at D8F9 – D8FE and 869F – 86B3). DCC4 - DCD7 Part 2 of 3 of the PV which prints a four-part-message in "Willy's Personal Hideout" (continued from E2C4 - E2CC and then continued at E7C4 – E7D8). DCD8 Variable used by the PV which prints a four-part-message in "Willy's Personal Hideout". DCDA – DCDC "DRG" (my full initials – unused in the game). DCF5 - DCFF Part Two of the Willy's Colour Changed on Entrance to the Room PV (applied in "The Forgotten Tower") (Part One is at D5F5 – D5FF). E0F7 – E0FF PV which produces a special effect in "Above the West Wing Bedroom". E1CD - E1D8 Part 2 of 5 of the PV which prints three dummy guardians and a signboard in "Double Inn" (continued from E4BB – E4C2 and then continued at F2CD - F2D8, 9B24 – 9B37 and 9B56 - 9B59; the alternative path for this PV is E4BB – E4D7, 9B24 – 9B37 and 9B56 - 9B59). E1FD – E1FE "MFG" (my son's full initials - unused in the game). E2C4 - E2CC Part 1 of 3 of the PV which prints a four-part-message in "Willy's Personal Hideout" (continued at DCC4 - DCD7 and E7C4 – E7D8). E2DA – E2DC Part 2 of 2 of the "Executive PV" in "A Forest Clearing on Fire!", which manages the "sub-PVs" in this room (continued from E2FB – E2FF). E2FB – E2FF Part 1 of 2 of the "Executive PV" in "A Forest Clearing on Fire!", which manages the "sub-PVs" in this room (continued at E2DA – E2DC). E3F3 – E3FF PV which prints a ghost message in "The Old Writetyping Office". E4BB - E4D7 Part 1 of 3 or 1 of 5 of the PV which prints three dummy guardians and a signboard in "Double Inn" (continued at 9B24 – 9B37 and 9B56 - 9B59 or, alternately, after a jump from E4C2, at E1CD - E1D8, F2CD - F2D8, 9B24 – 9B37 and 9B56 - 9B59). E4DA – E4DC "JSW" (unused in the game). E4F9 – E4FE Subroutine used by the optimised Game Over sequence (called from 8CE9, 8CEF, 8CF5, 8CFB, 8D01, 8D07 and 8D0D and, to a later entry point of E4FA, from 8CE3). E5FB – E5FF Part 1 of 3 of the PV which sends two killer squares flying across the screen in "Jump'n'Jive" (continued at 8576 – 857B and 96DE – 9705). E6FD – E6FF "AAG" (my daughter's full initials - unused in the game). E7C4 - E7D8 Part 3 of 3 of the PV which prints a four-part-message in "Willy's Personal Hideout" (continued from E2C4 - E2CC and DCC4 - DCD7). E7DA – E7DC "IRF" (Ian Rushforth's username at jswmm.co.uk – unused in the game). E7F7 – E7FF PV which creates a special effect in "The Multi-Toilet Bathroom" when Willy is on the toilet run. E8FB – E8FE Part 1 of 3 of the PV which changes the colour of one of the guardians in "JSW's 20th Anniversary Party" (continued at D8F9 – D8FE and 869F – 86B3). E9C4 - E9CC Part 3 of 5 of the PV which produces a Screen Flash effect triggered by Willy jumping and prints a ghost guardian and a ghost message in "Stairway (Starryway) to Heaven" (continued from D6F9 – D6FE and D7C4 - D7CE and then continued at 8BC4 – 8BCF and 9B90 – 9B93). E9DA – E9DC "JSW" (unused in the game). EABB – EAC3 Double use: Part 3 of 3 of the PV which produces a special effect in "Copin' with Ropin'" and "The Dining Hall" (continued from F2FB – F2FF and D3FB – D400). Part 3 of 3 of the PV which produces a special effect in "The Gym (Hurdle Practice)" (continued from D4FB – D4FF and D3FB – D400). EDFC – EDFF "Over" EEF7 – EEFF PV which produces a special sound and border effect in "The Meadow" and "Rocky Road to Double Inn". EFF9 – F000 Part 1 of 5 of the PV which prints a dummy guardian in "Upper Balcony" (continued at C0F9 – C0FE, 9B1F - 9B23, 9B4B – 9B4F and 9B56 - 9B59) (the last byte is shared with the room data that follows). F0C4 - F0CB Part 1 of 4 or 1 of 5 of the PV which prints a dummy guardian in "The Single Item Cave" (continued at D9C4 - D9C8, CCE1 - CCE8 and CCCF - CCD4 or, alternately, at D9C4 - D9CB, CCD5 - CCDB, CCE4 - CCE8 and CCCF - CCD4). F0DA – F0DC "DRG" (my full initials – unused in the game). F2C5 – F2CB Part 1 of 3 of the PV which prints the sign in "Emergency Exit on the Roof" (continued at F4CE – F4D5 and F8C5 – F8CA). F2CD - F2D8 Part 3 of 5 of the PV which prints three dummy guardians and a signboard in "Double Inn" (continued from E4BB – E4C2 and E1CD - E1D8 and then continued at 9B24 – 9B37 and 9B56 - 9B59; the alternative path for this PV is E4BB – E4D7, 9B24 – 9B37 and 9B56 - 9B59). F2FB – F2FF Part 1 of 3 of the PV which produces a special effect in "Copin' with Ropin'" and "The Dining Hall" (continued at D3FB – D400 and EABB – EAC3). F4CE – F4D5 Part 2 of 3 of the PV which prints the sign in "Emergency Exit on the Roof" (continued from F2C5 – F2CB and then continued at F8C5 – F8CA). F4FB – F4FF Part 1 of 2 of the PV which changes Willy's colour in "The Hypnotherapy Room" (continued at 8BD0 – 8C05). F5F7 – F5FF Part 1 of 4 of the PV which prints a dummy guardian in "Main Hallway East" (continued at D2F9 – D2FE, 9B99 – 9B9D and 9B56 – 9B59). F7CD – F7D6 " You CAN " F8C5 – F8CA Part 3 of 3 of the PV which prints the sign in "Emergency Exit on the Roof" (continued from F2C5 – F2CB and F4CE – F4D5, ending with a jump to 8AF3, to the Flashing Screen and Border PV). F8CB – F8CC "AF" (Andy Ford's initials – unused in the game). F8CD – F8D6 " collect " F8FB - F8FF Part 1 of 2 of the PV which turns the screen blue in "Entrance to the Cellar" (continued at 8B1E – 8B2C). F9CD – F9D6 "all items," F9FB – F9FF Part 1 of 2 of the PV which turns the screen yellow in "The Reading Room" (continued at 8B1E – 8B2C). FACD – FAD6 " Willy! " FAFD – FAFF "DRG" (my full initials – unused in the game). FCCE - FCD5 Part 2 of 5 of the PV which makes the "HELLO!" sign flicker in "The Front Door" (continued from D3CE – D3D5 and then continued at 9874 - 9879, 98A3 - 98BC and 9866- 9873). FCF5 – FCFF Part Two of the Shimmering Willy PV (applied in "On the Sun Deck", "Willy's Problematic Heaven" and "Altar to a Well-Known God") (Part One is at CBF5 – CBFF). FDF9 – FDFF Part 1 of 3 of the PV which prints a message in "Entomological Research Station" (continued at 9B3C – 9B42 and 9B90 - 9B93). ---------------------------------------------------------------------- X. Internet Links Please visit my website JSW Central (http://www.jswcentral.org) – "Resource centre for ZX Spectrum games using Manic Miner and Jet Set Willy game engines" – for a complete list of ZX Spectrum games created using the MM and JSW game engines, my favourite quotations explaining the phenomenon of these games, a chronology of their development, individual pages of all games including screenshots of all rooms and download links (currently in development), and other resources. The links page (http://www.jswcentral.org/links.html) will provide you with links to other places of interest on the web, including the JetSet Willy & Manic Miner Community, Manic Miner & Jet Set Willy Yahoo! Group and other sites. "WNM"'s first homepage was at http://www.jsw.0catch.com. Set up on a free server back in November 2004 and never updated since, it amazingly survives online to this very day. My JSW Corner website was launched in December 2004 at https://xa.bi/jsw and has been kindly hosted over there ever since by Xabier Vázquez. It had not been updated since January 2008 until the release of "WNM SE". ---------------------------------------------------------------------- XI. The Legal Bit "WNM SE" was created using the game engine (modified in various ways) and part of the guardian and room graphics of "Jet Set Willy" by Matthew Smith (Software Projects, 1984), as well as some graphics and technical solutions by other authors (listed in the acknowledgements and credits above). Obviously, it also contains a large amount of material (graphics, sprites, room designs and technical novelties) created by myself (Daniel Gromann). While I am in no position to make any pronouncements on the parts of the game which are not my copyright, as far my own graphics, sprites, room designs and technical solutions are concerned, I will be quite happy if you use them in your own ZX Spectrum games, while creating games for other platforms or in any other way you may find useful. I will appreciate it, however, if you give me credit for whatever might be my humble contribution, and if you let me know how you have used "WNM SE". ---------------------------------------------------------------------- XII. Final Remarks Please e-mail me any comments concerning "WNM SE" at: jetsetdanny@yahoo.com . Please remember that "WNM SE" can be completed without losing a single life. I have managed to complete it at the "Expert" time level (i.e. starting at 7:00 am in-game time) with a toilet time of 11:19 am (with no loss of life, thanks to the Rollback feature in ZX Spin). An RZX recording of that walkthrough will be made public a year or so after the release of the game - by being sent to the RZX Archive (if no-one else has sent a recording by then), or by being hosted on JSW Central (as a JSW Central special download, demonstrating a better completion time than in the recording available on RZX Archive, if there is one) - unless someone else's recording hosted on RZX Archive by that time has a better completion time. If you get stuck and become frustrated and begin to think that after all it is impossible to complete the game, or pass a certain room, or collect a certain item without losing a life, please send me a note at jetsetdanny@yahoo.com and you will soon receive a reply with the solution. The game has been playtested extensively and I believe it to be bug-free. However, if you find any problems, please report them to me. Taking into account my experiences up to date and the number of people who have actually written to me on MM/JSW-related issues, I can promise that I will respond to EVERYONE. It will be very rewarding for me to know that you have played "WNM SE", so please, do let me know about 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! :-) Play, enjoy and let me know what you think! Daniel Gromann, 10th November 2016