Jump to content
Jet Set Willy & Manic Miner Community

andrewbroad

Contributor
  • Posts

    108
  • Joined

  • Last visited

Reputation Activity

  1. Like
    andrewbroad reacted to IRF in [File] Manic Miner - DarkLight Modification   
    There is something which I meant to say yesterday in relation to the 'MM: creme de la creme' entry on JSWCentral - but I forgot - and which also applies here [EDIT: and indeed in relation to the original Manic Miner, and possibly other games using the MM engine]:
    I don't see the purpose of giving separate Highest Documented Score for:
    - Reaching the Swordfish;
    - Re-entry to the Central Cavern [or equivalent] after completing all the caverns once.
    The former just seems to truncate consideration of the final cavern before the additional points have been added to account for how quickly the player completed that final cavern.  To what purpose?
    I can see the argument for giving distinct times in JSW for reaching the onset of the various game modes (all items collected/reaching the bed/reaching the toilet], because the player has some agency in between those stages - and in some modified games, pausing Willy in mid-toilet-run is necessary to dodge guardians, etc. [EDIT: Although in the JSWCentral entry for original Jet Set Willy, you don't appear to give that level of detail for Best Documented Completion Time!]
    However, the player in Manic Miner has absolutely no agency to change things once they have entered the portal in The Final Barrier - the end sequence of the game simply plays out - the Swordfish appears*, and then the remaining air is counted down, and then Willy reappears in the Central Cavern.  So it seems, in my humble opinion, to be an arbitrary and unnecessary distinction to make!
    *EDIT: Actually, it isn't always even the case that the Swordfish appears - if the Cheat Boot has been enabled, then the Swordfish effect is skipped!  Suppose I were to load up the original Manic Miner, activate Cheat Mode (using '6031769'), but not actually use the teleportation feature subsequently, and then make a recording of my completing all 20 caverns with a better final score than what is currently listed on JSWCentral - how would you update the site to account for that higher final score?
  2. Like
    andrewbroad got a reaction from nw24576 in Developing a new JSW-like game in C   
    Fascinating project. I too have plans to develop a JSW-like Spectrum game from scratch, possibly in the 2040s, but I plan to write my H* game engine in Z80 machine code, even though I have some experience in C from of old.
  3. Haha
    andrewbroad got a reaction from Spider in "Jet Set Jason: In Roddënwald"   
    Landings.json:
    [ {id: 21, name: "Ballroom West", connections: [22]}, {id: 22, name: "To the Kitchens", name2: "Main Stairway", connections: [21, 28]}, {id: 27, name: "The Chapel", connections: [21, 28]}, {id: 28, name: "First Landing", connections: [22, 27, 34]}, {id: 33, name: "The Bathroom", connections: [34]}, {id: 34, name: "Top Landing", connections: [28, 33, 35]}, {id: 35, name: "Master Bedroom", connections: [34]} ]
  4. Like
    andrewbroad reacted to geoff in "Jet Set Jason: In Roddënwald"   
    I'm a software developer, and this started me thinking of "Jet Set JSON" for some reason.
  5. Wow
    andrewbroad reacted to nw24576 in Developing a new JSW-like game in C   
    Hi,
    Have been suggested to post to this forum by the guys at Spectrum Computing.
    Anyway... back in the day I had a Spectrum, and later on (1994) as part of my work I learned C, and in the mid-nineties I developed a few games (mostly versions of 'standards' such as Pacman, Space Invaders, Snake and Tetris) in C (and later C++) in the DOS environment.
    Have recently discovered that there is still an active Spectrum community, and having been fascinated by JSW, and JSW-like games in general, when it first came out I thought, it might be fun to develop a JSW-like game from scratch. It's something I've always wanted to do since about 1985, though I've never got round to it (and, to be honest, I'm still not completely sure I will have the time even now) but having recently found the z88dk compiler and played around with it a bit, I thought it might be interesting to try and develop it in C, though it's sure to be a challenge in the low memory environment of the Spectrum.
    Have had some encouraging responses on Spectrum Computing, it looks like it's possible in theory though assembly may be necessary for the more time-critical sections. Looks like the SP1 sprite library could be useful, though maybe this uses too much memory?
    The plot will not be Willy-related, though the gameplay will be very JSW-like. The plot needs to be fleshed out, but essentially you are in prison for speaking out against a corrupt and authoritarian government, your task is to first escape from the (rather poorly-guarded it has to be said) prison and then travel round the town and countryside collecting objects (which provide evidence for government corruption) and you win when all objects have been collected and you take them to a certain location. It will be JSW like in the sense that free movement from room to room will be allowed, though it may also have a Wally Week style element in the sense that specific objects may be needed to accomplish particular tasks. For instance, part of the gameplay is likely to involve collecting money and exchanging it for items (needed to win) in a shop. That bit isn't definite, though.
    Anyway, the things I'd most like to ask here are firstly
    a) does it sound doable in C, or mostly C with a bit of assembly;
    b) if so, does SP1 sound a good plan or does it use up too much memory? and finally
    c) obviously memory is in very short supply on a Spectrum, so how best to store the room layout? (I come to this below)
    d) is there anyone here who would be willing to draw certain graphics? Plan is to draw my own basic ones (I'm not an artist but am probably happy with creating JSW-style graphics) and maybe 'borrow' a few I like from JSW, with credit to Matthew Smith of course - the flying pig and skipping rabbit both spring to mind - but I'd also like to feature the faces of a few well-known real world figures as guardians (I was a fan of Spitting Image back in the day), so if anyone is willing to do that, please let me know.
    I have drawn up an initial plan for the room layout: I'd like to try and keep to 128 bytes per room to save space, and I think, if I make some compromises on what objects and guardians can be in a room, I can do that. The intention is to use 8192 bytes from 24576 to 32767 for the room data, and another 3K or so for the graphics (at the top of RAM, above the C stack).
    My proposed room memory layout is shown below; suggestions for improvements are welcome. It's based on reading the JSW room layout to get a general idea of how it's done in JSW, rather than copying it directly.
    Anyway, sorry if this is a long post, and as I said above, I am not sure whether I will actually have the time to do this... but would be good to get ideas!
    Thanks!
    nw24576

    Bytes 0-47: blocks/platforms: (16 max per room, 3 bytes per block)
    uses least significant bit = bit 0 convention
    For each block or platform:
    Byte 0:
    Bits 7-5 INK
    4 Is it a block or a platform? Will generate either a diagonal line or a block if left != right and top != bottom, depending on whether this bit is set
    3-0 Graphic ID to use for block (16 possible graphics can be used)
    Byte 1:
    7-4 left position (16x16 grid used for positioning, so only 4 bits needed)
    3-0 top position
    Byte 2:
    7-4 right position
    3-0 bottom position

    Bytes 48-71: guardians: (8 max per room, 3 bytes per guardian)
     
    For each:
    Byte 0:
    7-6 velocity (four velocity levels, exact values to be decided)
    5-0 graphic ID (64 possible guardian graphics)
    Byte 1:
    7-4 start x position of guardian (on 16x16 grid)
    3-0 start y position
    Byte 2:
    7-5 INK
    4 direction bit (horizontal or vertical?)
    3-0 displacement to end position

    Bytes 72-87: static objects: (8 max per room)
     
    7-5 INK
    4 is it nasty or collectable object?
    3-0 object ID (16 graphics for nasties, 16 for collectables, whether to use nasty or collectable graphic set will be determined by value of bit 4)
    7-4 x coord
    3-0 y coord
    Bytes 88-119: Room title
    Bytes 120-123: Adjoining rooms
    Room IDs of adjoining rooms. Special value 255 will mean "cannot move in this direction" and a wall will be drawn.
    Byte 124: PAPER byte
    7-4 PAPER colour for block/platform graphics (therefore, restricted to one PAPER colour per room for all platforms)
    3-0 Room PAPER and brightness (brightness will be applied to non-platform objects)
    Byte 125: Firecell and ladder
    7 are firecells activated?
    6-4 firecell ink colour, any block with this ink will be treated as firecell
    3 are ladders activated?
    2-0 ladder ink colour, any block with this ink will be treated as ladder
    Bytes 126-127: Flags for special rooms
    TBC
     
     
  6. Like
    andrewbroad reacted to Spider in Some Jet Set Willy technical questions   
    I was used to seeing the # prefix and sometimes a 'h' suffix. Starting on the Spectrum platform in 84, there was not really any built in hex facility.
    Those who perhaps started coding on the Acorn machines may be more used to & however. For instance typing PRINT &C9 will return you with an answer of 201 , which is correct as #C9 is 201 in decimal. This is also accepted for the Amstrad CPC range too.
    Can't recall which but one emulator in the "insert pokes" section seems to prefer a $ prefix for hex values too, just to add to the mix!
    Personal preference is simply #xx as its quite easy to distinguish between:
    LD A , #80
    JP #7530
    Decimal of the above:
    LD A , 128
    JP 30000
    I do realise I'm slightly contradicting myself as today I did provide some 'pokes' using a different prefix however the prefix suited the platform they were intended for! , but in general if I was writing a post or such I'd rather just use #value, its easy to type and does not or should not lead to any confusion.
     
  7. Like
    andrewbroad reacted to jetsetdanny in Some Jet Set Willy technical questions   
    I couldn't tell you. I got accustomed to using the # prefix, because I saw it used by some people on the JSW scene (probably by Dr. Andrew Broad who would have been back then and continues to be an authority for me on this kind of subjects) and just followed suit 🙂.
  8. Like
    andrewbroad reacted to Norman Sword in [File] pyramid.tap   
    Patch mode vector using jp (hl)

    Taken from the source code of JSW2. So it is JSW2 mode

  9. Like
    andrewbroad reacted to jetsetdanny in Truncated Posts   
    That's strange.
    I *think* if something like this happens, there must be a reason for it. It can't be that one post gets archived/restored properly, and another one - doesn't, without some underlying conditions.
    Could it be that you don't have enough information, e.g. because the underlying condition is not related to the posts themselves (like their structure, etc.) but to the way the backup was made?
    I am just thinking aloud, trying to understand something that's rather puzzling...
    And yes, I also dread to think how many more posts might have been affected across the whole website. I almost prefer not to look to avoid despair 😒
  10. Like
    andrewbroad reacted to IRF in Automated generation of Manic Miner speedrun/walkthrough   
    The attached screenshot - based on a modified file in which only those characters of the solar beam that are currently sapping Willy's air supply get highlighted in red PAPER - demonstrates that in some circumstances, there can be separate, discrete elements of the beam sapping Willy's air.
    The intermediate character does not affect the air supply because it falls under the shadow of the adjacent guardian, which changed the INK attribute in the cell holding part of Willy's sprite to non-white (before the Main Loop drew the beam in this frame), therefore that character of the beam is drawn with the regular yellow PAPER/white INK attribute.
    N.B. It's all a bit academic, as Willy pixel-collided with the guardian and died shortly after the screenshot was taken! 😮😆

  11. Like
    andrewbroad reacted to Norman Sword in Some Jet Set Willy technical questions   
    The LDIR instruction was written to enable interrupts to occur whilst the instruction takes place. Because the Z80 system uses interrupts for a host of external devices as well as synchronisation and housekeeping tasks.  Enabling interrupts while an LDIR is taking place was important and that is why the LDIR is so slow. After every move of one byte the program counter moves back and reloads the LDIR instruction and repeats the one byte move.

    JSW does not use the interrupts and therefore any external  block move sequence that can be used in place of LDIR will have absolutely no impact on what the game does.

    So if you externally move the block in place of the LDIR doing it. The game will take no notice and just carry on. I don't think it even cares about T-states - used mainly for the refresh register and again not used.
  12. Like
    andrewbroad got a reaction from jetsetdanny in [File] pyramid.tap   
    Maybe what we need is some kind of metric for how heavily each game modifies the game engine?
  13. Haha
    andrewbroad reacted to IRF in [File] pyramid.tap   
    It's a reference to the fact that one of the room names ('An Ecumenical Matter') is based on a quote from the Channel 4 show 'Father Ted'.  Probably the kind of cryptic comment that you needn't concern yourself with. 😉
  14. Haha
    andrewbroad reacted to Richard Hallas in Technician Ted   
    "My powerful influence"?! 😃 LOL!
    Well, that's certainly a different take on things, and unusually flattering – if somewhat misplaced! I don't have any influence in the Next community; indeed, I may be a negative influence in some ways. For example, one of the active members of the Next team told me explicitly that I was so tediously long-winded and boring that he always ignored any post with my name on it, because reading it was a waste of his time. Another core team member simply blocked me entirely, so that he could no longer see my posts and I couldn't see his. To be fair, there are other, more central members of the core team who have been a lot more pleasant and who do treat me like a human being… but I'm under no illusion about the level of influence I exert! (And, frankly, why should I have any influence? I've contributed a few minor things, but nothing of any real substance. Having said that, I did offer substantial help at an early stage – help that they could really usefully have taken advantage of – and was completely ignored. But that was up to them…)
    I do agree about Facebook; as a solution for hosting a discussion forum about something like the Next, it's crap… and I've said so several times. I'm also not really a fan of it in general terms either (and certainly don't trust the actions and motivations of the people behind it…). But unfortunately, regardless of its shortcomings, much of the population clearly loves it and even thinks of it as 'the Internet'. Rants from me aren't going to change that.
    Moreover, as you mention, there's a perfectly good dedicated forum for the Spectrum Next at the machine's official website, i.e. https://www.specnext.com/forum/, and although some people do use it, the vast majority of users simply ignored it and went to Facebook instead. This wasn't anyone's choice, and presumably if the team had wanted to use Facebook, they wouldn't have provided a dedicated forum in the first place.
    Anyway, I'm afraid it would need something more momentous than words from me to cause people to abandon Facebook in favour of the official forum. Maybe if all the developer team rebelled against Facebook and said they were only going to participate on the Next forum in future, that might do it. Or, it might have done it a couple of years ago, when a lot more visible, interesting stuff was happening in public (again, as you mention). Now, I think, it's all too late. As for me, probably the best thing I can do is to continue posting my tediously long and boring messages on Facebook in the hopes of scaring people away!
  15. Like
    andrewbroad got a reaction from MtM in Dream platform game   
    JSW II.
    My dream platform game would be one in which I saw all the screens in vivid dreams, and then coded them up when awake.
  16. Like
    andrewbroad got a reaction from IRF in Dream platform game   
    JSW II.
    My dream platform game would be one in which I saw all the screens in vivid dreams, and then coded them up when awake.
  17. Wow
    andrewbroad got a reaction from jetsetdanny in Dream platform game   
    JSW II.
    My dream platform game would be one in which I saw all the screens in vivid dreams, and then coded them up when awake.
  18. Like
    andrewbroad reacted to IRF in Pokes (Spectrum Version)   
    Or POKE 37495, 201 (in Bug-Byte) turns off the second Fire cells for each cavern, but not the first.
  19. Like
    andrewbroad reacted to jetsetdanny in Manic Mission - Manic Miner / Impossible Mission mashup game   
    I've just tried to go to  https://heracleum.org/en/ in Chrome. The result was the same as previously, i.e. "Your Internet access is blocked" message.
    I'll give it a couple of days and then try again 🙂 .
  20. Like
    andrewbroad reacted to jetsetdanny in Manic Mission - Manic Miner / Impossible Mission mashup game   
    Heracleum, 
    Heracleum, thank you for creating Manic Mission and posting about it here. It is greatly appreciated! 🙂
    My primary personal interest are new ZX Spectrum games using MM and JSW games engines. Due to the lack of time, if I have to make choices on what to spend my limited spare time, I will typically prioritise spending it on a Spectrum-based game than on a non-Spectrum one.
    Nevertheless, I tried to have a look at your game, as I like your description and screenshots and I very much appreciate the fact that you have provided an editor. Being able to create new rooms is the greatest thing about MM and JSW, IMPO.
    Regretfully, each time I try to open your website, I get the message "Your Internet access is blocked. Firewall or antivirus software may have blocked the connection." Please see the attached screenshot. This is happening while various other pages I go to are working just fine. The screenshot was taken a couple of minutes ago, while I'm here on this forum and I've also visited some other pages, so there is no problem with my connection as such.
    Any idea what might be wrong?
    EDIT: I'm using Chrome, but I've just tried it in Edge and got a similar message.

  21. Like
    andrewbroad reacted to Norman Sword in [File] pyramid.tap   
    Misuse of terminology.

    The data held for each room does not contain a vector (jump address) it contains an index number. The index number is used to index into a jump block and from there an address is extracted.

    The usage of jump blocks to store a list of address's for routines is used in several operating systems and is nothing new.

    However in the context of JSW the usage of using an index number to index into a jump block was used 36 years ago in JSW2.

    Here an index number was obtained from the room data (event data) and that number was used to index into two tables . The first table was a list of initialisation routines for the event. The second table was a list of Main Loop runtime routines for the event.

    So you are using a primitive version of JSW2 event processing
  22. Like
    andrewbroad reacted to IRF in Automated generation of Manic Miner speedrun/walkthrough   
    This was bothering me - why walking instead of jumping isn't one frame faster.  If Willy walks just ahead of a horizontal guardian, it can't catch him; but if he walks whilst jumping sideways, it can.  (The last frame of a sideways jump is spent falling vertically downwards, if the platform you land on is the same height as the platform you launched from.)
    However, having thought about it some more, it occurs to me that when Willy walks off the end of a platform, he spends one time-frame 'hovering' at the same height before he starts to drop.  And that frame offsets the frame spent falling straight down just before the end of the jump.  So it all makes sense to me now. 🙂
  23. Like
    andrewbroad reacted to IRF in Automated generation of Manic Miner speedrun/walkthrough   
    Crem's algorithm has taught me a new technique - the most efficient way of proceeding diagonally down through a field of crumbly blocks.
    Rather than dropping down to the required level first and then walking along the bottom; or walking across the top and then waiting to drop down; it is quicker (ultimately accruing most points) if you take a 'stepped' approach.
    i.e. walk along until just before you are about to cross a cell boundary into the next column, then wait until the rest of the platform underneath Willy has crumbled away and he drops down to the next row, then hit the sideways movement button (best to start pressing it while Willy is mid-fall) and proceed sideways by four animation-frames until just before Willy crosses the next cell boundary, then stop pressing the Left/Right button and wait again to drop down to the next row, etc.
    (That's assuming there aren't any Fire blocks or guardians in the way, of course.)
    So thank you, crem's algorithm!
    EDIT: Using the above technique, I have just managed to reach the floor of The Vat (at the bottom-right corner) before crem's algorithm did so in his recording of that cavern (in fact, I got there so soon that I nearly landed on the yellow kangaroo guardian!)  However, I didn't end up with a better score than the algorithm, because the time-critical factor in The Vat is that you have to wait for the yellow kangaroo to get out of the way of the portal before you can reach it.
  24. Like
    andrewbroad reacted to IRF in [File] pyramid.tap   
    Further explanation: In Geoff Modes I and II, a Main Loop Patch Vector for each room is stored (as a two-byte word, giving the location of the start of the room's patch) at Offsets #EE - #EF in the room definition.  A subroutine is CALLed from the Main Loop which loads up the Patch Vector to the HL register-pair and then flow of execution jumps to the patch, via a JP (HL) command.  (If a room doesn't have a patch, then the Patch Vector just points at a RETURN command.)
    In Geoff Mode III (a.k.a. 'Pyramode'), each room has a Room Setup Patch Vector and a Main Loop Patch Vector, but still only two offset bytes (#EE and #EF) are used in the room definition.  Offset #EE corresponds to the Room Setup Patch Vector and Offset #EF to the Main Loop Patch Vector.  The actual Patch Vectors are stored in a lookup table which starts at #8600.
    Subroutines are CALLed from the Room Setup routine and from the Main Loop, which pick up the value stored at Offset #EE and #EF respectively for the current room.  That value is then used as an index to point at the appropriate place in the lookup table at #8600.  Since each entry in the lookup table is a word (pair of bytes), the value taken from the Offset byte is doubled so that each incrementation of the value skips forward two places in the table.
    Once the correct Patch Vector (entry in the table) has been identified, the same approach as Geoff Modes I and II applies. i.e. the value is loaded up to HL, and then flow of execution proceeds to the appropriate patch via a JP (HL).
     
    I believe the above provides a sound body of nomenclature for the Patch Vector system (though perhaps Geoff may wish to comment?)  In other words, the Patch Vector for a room is simply a means of pointing the programme towards the Patch for the room - it tells you the location in memory where the actual patch is stored.
    Under the above arrangement, it would not be correct to say that only certain rooms have a Patch Vector, whilst other rooms don't: in Geoff Modes I and II, all rooms have a (singular) Patch Vector - even if, for some rooms, it merely RETURNs flow of execution straight back to the Main Loop without doing anything - whilst in 'Pyramode', all  rooms have precisely two Patch Vectors (Room Setup and Main Loop).
    Similarly, it would not really be meaningful to say "Room X has a nice Patch Vector".  For example, if Room X has a nice, non-standard visual effect, or a guardian with an unusual trajectory, or whatever - implemented via the Patch Vector system - then what you're really talking about there is a Patch.  So it would be more logical to just say "Room X has a nice patch"!
    At least, that's how I see it anyway. 🙂
  25. Like
    andrewbroad reacted to geoff in [File] pyramid.tap   
    I prefer "Pyramode" myself...
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.