obo Posted August 5 Report Share Posted August 5 (edited) I've been working on updating my TileMap application, which lets you see the whole game map as you play. I already supported the original JSW and JSW2+ games, but they use hard-coded map layouts. I've long wanted to add more general support for custom JSW games, which requires working out a 2D map layout from the game data. That turned out to be a much harder problem than expected so it never got finished. I've come to the conclusion that it may not be possible to automatically generate a perfect layout for all games. The only information you have is the room exit data, which must have all 4 exits defined, even if only some are used. The remaining entries usually point back to themselves, or are set to some dummy value, which will usually be an existing room number. In some cases they point to unused rooms from the original JSW, which then become part of the map layout. Examining the room data for navigable exits might help fix some of these, but there are cases where blocks disappear in late game to allow access. That's not even thinking about exotic loops and overlaps that some games have. I've settled on an approach that seems to give "good enough" results for non-overlapping maps. The rules also keep the original JSW map rooms aligned to the east wall, leaving a gap in the middle. In more complex cases it attempts to place problem rooms near (and aligned to) where they should be, but it will always place them somewhere. It's far from perfect (as you'll see below) but it seems a reasonable compromise solution for now. In some cases I'm not even sure what the correct layout should look like! Are the Pavero maps considered to be correct? TileMap also requires game code hooks to react to some game events. JSW mods that change only the data should just work. I've found that most game engine changes use the same code in a different location, or minor variations. I was able to get all the JSW48 games working over a couple of evenings, and extra incompatible games should only take about 10 mins each now. JSW Central has been a great source of information to get this done 🙂 To show the current progress I've built a test web version of my development code, with just the JSW48 games available. It should work on modern desktop browsers, though the final release will be regular desktop apps. Double-click to start, Esc to return to the selection screen. Home centres on current room, End shows full map. Drag/zoom with the mouse. F1-F4 give 1-4x scaling, avoiding scaling artefacts. If there's community interest/help I could allow custom overrides of the map layouts to fix issues. It would likely allow exporting the generated layout for manual editing, rather than having it created from scratch. Any other thoughts are most welcome. Edited August 31 by obo jetsetdanny, UncleWan and JianYang 2 1 Quote Link to comment Share on other sites More sharing options...
jetsetdanny Posted August 11 Report Share Posted August 11 Thank you for this update and for all the work you have put into this project! 🙏 On 8/5/2026 at 8:02 AM, obo said: Are the Pavero maps considered to be correct? I would say they mostly (or perhaps even entirely) are. I don't recall seeing any problems with his maps of JSW games (apart from those games that are practically impossible to map, with various illogical exits, overlapping rooms, etc. - but then probably Pavero's maps show them as accurately as possible under the circumstances). I seem to recall from years ago that I noticed a couple of minor errors in the map of "Stay Kool". I did mean to let Pavero know about it, but never did that back then, and now I can't remember the details of the problem and probably couldn't force myself to spend time investigating it. But it's not a JSW game anyway. On 8/5/2026 at 8:02 AM, obo said: JSW Central has been a great source of information to get this done 🙂 I'm very glad to hear this 😁 Regarding your website: I've had a look at my game "Willy's New Mansion" Special Edition. It was truly a "Wow!" moment: seeing the whole map in all its splendour (if I can say so myself) was a truly emotional experience 😊 . I was very impressed both with the fact that everything is in place - including two rooms that were added in the SE (in relation to the original edition) and are placed in the code not in the "normal" #C000 - #FFFF range, but 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). I was also impressed and, quite truly, moved with the map's showing special flashing-screen effects in some rooms (engineered with the so-called Patch Vectors; working on the SE of "Willy's New Mansion" was my first major venture into the PV territory and I spent a lot of time on it, that's why seeing the effects I applied back then faithfully reproduced in your map is so moving to me 😊). I've also had a look at "Plants vs. Zombies", the latest released JSW48 game, and it was also great to see it all at once, mostly Wan YuXiang's beautiful rooms and also the ones that I contributed to the game 😊. So, congratulations on delivering this fantastic resource with such precision and quality - and, once again, THANK YOU SO MUCH for it! 👍😊 obo and UncleWan 2 Quote Link to comment Share on other sites More sharing options...
UncleWan Posted August 14 Report Share Posted August 14 Due to personal reasons, I haven't been able to return to the JSWMM community for a long time. Today I just took a moment to see if there was anything new. But I’m very happy today—in fact, I’m really excited—to see your valuable work. Through the link you gave, it’s the first time I’ve seen how my game looks on a global scale. What’s equally surprising is that it’s a big map that can actually be played! 😄 Please keep up your work🙏; I believe the community is really looking forward to the final result!😊👍 jetsetdanny and obo 2 Quote Link to comment Share on other sites More sharing options...
obo Posted August 15 Author Report Share Posted August 15 Thanks for the feedback! I've made some extra improvements and have updated the web version with the changes. I added a layout override mechanism and have corrected the layouts for many games to match the Pavero maps. In some cases it was just tweaking a room or two, but in complex maps a lot of the map was different. Madam Blavskja's Carnival Macabre still needs a bit of work to place some extra rooms. Willy does the Great Pyramid now looks fantastic, with a special half tile offset applied to align the pyramid edges. The code hooks used to create the map illusion are fairly light, so all special code (including Patch Vectors) will run as normal. There were only a couple of cases I needed extra handling, such as the Doppelganger room in ZX Willy the Bug Slayer, where the extra sprite was initially inside a fire block. In most cases I just need to find a few code locations of interest, like when the game starts and ends, when the room is being drawn, and the start and current room number locations. I just check a few addresses for each and find what I need, but if new games move code around I can add an extra location to check. I also check the OR/XOR/ADD opcode used to convert the room number to a room data high byte, used by a few games. The original JSW support has some special tweaks to make the gameplay more seamless. They include preserving the position of creatures in neighbouring rooms, and positioning Willy a bit closer to the screen edges on entry. I've not applied these to the JSW48 games as it relies on knowing the position and size of room state information, which may well have changed. It wasn't applied to JSW2 either due to the lifts, but it could work for the rest of the state. TileMap only supports 48K games at the moment so I'm limited to the JSW48 games set. Once I've added 128K support I should be able to look at adding JSW64 and JSW128 games too, which should require a similar approach. That won't happen until after the next desktop release though, which shouldn't be too far away now. If you spot any map/gameplay issues then please shout and I'll take a look. UncleWan and jetsetdanny 2 Quote Link to comment Share on other sites More sharing options...
jetsetdanny Posted August 18 Report Share Posted August 18 Thank you for this update, and I'm looking forward to your adding JSW128 and JSW64 games 🙂 . Quote Link to comment Share on other sites More sharing options...
obo Posted August 31 Author Report Share Posted August 31 The good news is that JSW128 and JSW64 support was easier than expected, so I've managed to squeeze it into the next release. The room data being held in the extra 128K banks was much easier to scan, and operand values from the code let me know the size of each room. The rest was much the same as for JSW48 support, with generally only a single hook point due to the standardised game engine code. Across the 3 engines that makes 119 runnable JSW snapshots. Windows, macOS, and Linux desktop versions are now available from: https://simonowen.com/spectrum/tilemap/ JianYang 1 Quote Link to comment Share on other sites More sharing options...
JianYang Posted August 31 Report Share Posted August 31 I have only looked at the videos so far, but that's some amazing work. jetsetdanny and obo 2 Quote Link to comment Share on other sites More sharing options...
obo Posted September 1 Author Report Share Posted September 1 @jetsetdanny Jet Set Lemmy runs fine in TileMap, but the map layout definitely needs some fixing. The music in bank 4 means some junk rooms are added by the room scanner, but they can be removed using a layout override. If you want to try the whole process (which should be the same for any new JSW game): Load the tape image into your favourite Spectrum emulator. Save a SNA snapshot of the game to C:\Users\YourUser\Documents\TileMap\games\JSW128\Jet Set Lemmy.sna Ensure the snapshot name is how you want it to appear in the game browser. Save a 256x192 screenshot of the game to C:\Users\YourUser\Documents\TileMap\thumbnails\JSW128\Jet Set Lemmy.png Start TileMap and browse to the JSW128 section to find it, since it's using the JSW128 engine. Hold Shift as you double-click the game to start, which saves a map layout. Open C:\Users\YourUser\Documents\TileMap\layouts\JSW128\Jet Set Lemmy.txt to see the room layout Make fixes -- in this case you definitely want to remove the two bottom-most blocks of rooms with numbers >= 0x80 Make any fixes to the layout too, moving rooms around as necessary. In TileMap, return to the game selection and re-open the game (no need to restart the whole app) Verify the map layout is correct, repeat until happy. Take care with the layout files as the format is very strict. If it contains any format errors or duplicate room numbers the override layout will be silently ignored, and the default/detected map layout will be used instead. If the layout feature is used by others I'll improve error reporting, rather than relying on it just stopping in my debugger. The infinite lives and infinite time patches are detected at runtime, and if found they're available on the pause menu. For this game both were successfully detected from the standard JSW128 code. If any of the other code patches aren't compatible it'll show the missing patch details, and refuse to run the game. In that case I can extend the patch support to fix it. I'd be happy to accept new games and layout files, if I haven't already added them. If Pasmo hasn't mapped the games it'll take more time, unless someone involved in the development knows what the game should look like. 🙂 jetsetdanny 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.