don't click here

Sonic - Into The Void

Discussion in 'Engineering & Reverse Engineering' started by Blueblur93, Mar 21, 2014.

  1. Well, It's been a while since I made post on here, so I'd thought I make a post and show you all what I've been doing, this screenshot is for a future release, but I'm proud to say It's starting to look much better, if it's palette changes, level changes, sprite changes, etc.


    So yeah, as you can see the HUD has been updated (which is in the coming soon release). The sonic sprite has been completely changed, which is the part what I'm ecstatic about, because it was bloody hard work. XD And also you can see the sonic side of the signpost is changed (which isn't in the coming soon release, but will be in a future release when I feel like it's READY.) So there we go!
  2. AkumaYin


    All right, so if the sprites look a bit odd, don't panic! I'm currently importing them myself, and if he likes the end result, he'll roll with them.

    I'll probably post a few screenshots once I get some more work done.
  3. Okay, so I have a favour to ask of you all reading this. Basically you, me and everyone one else who has played my hack knows that my level layout is pretty bad (especially on AHZ), however, I've been working on it, for now I think I've managed to more or less make Azure Hills Zone act 1, 2 (AND now there's a full act 3!) a better layout. So, would you be able to test that zone please, and tell me what you think as well.

    Act 1 doesn't have much change, but there are a few changes, (spoiler!!) especially when you take the lower level all the way.

    Now, act 2 has almost completely been changed and hopefully for the best! [​IMG] You may not even recognise it.

    And lastly, act 3 is completely new, except for the end part. For the boss, I've finally removed the invisible hurt blocks, but for now if you miss the boss, you're stuck there until time over, but I have made the boss move up slower, so hopefully it won't come to that. :P

    Oh yeah may also notice a certain bug has been fixed in act 3 (the background disappearing bug when coming to the boss), AND also AHZ level art has been altered too.
    By the way I have edited the sonic sprite, so it doesn't look as weird as before and I've swapped the rings back to the original sprite. :P

    Edit: This link as been removed seen as an updated link is shown.
  4. RetroKoH


    Project Sonic 8x16
    Eh... I beat the boss before he ever got to the blocks... via invincibility stars... as you'll see in my recording of your hack. :D

    I'll try the new demo and tack it onto the video.
  5. Clownacy


    Tech Member
    First up, act 1's dual 1-up monitors high up on that homing attack chain is exploitable, especially since it's right next to a checkpoint. Speaking of 1-ups, that bug where you get an extra life after destroying the first badnik is still there. And why is the spin dash on its own button? The others don't do anything; they aren't allocated additional moves, and just make you jump.

    The boss. It took me a few seconds to make out where the orange platforms were against that orange background, especially with a noise-filter of a waterfall obscuring everything. There's gotta be a way to make this boss more forgiving. It's just like the LZ boss: if you get hit, and fall in just the right place, it's back to the bottom with you, and you'll never recover. Also, leading up the boss, there are some monitors. They were fine on my first attempt, but after using level select to get to act 3 again, I did some more exploring, and some of the same monitors I'd broken on my first playthrough were already broken.

    When I reached Ember Mines act 1, I noticed Sonic's art was overwriting the score art (just smash the destroyable blocks at the beginning).

    Back on topic, I have to say, your level design here has some real flow to it. With some use of the jump dash and a lot of rolling (see later), I can get through act 1 & 2 in a comfortable 28 seconds each. There are times that are a little confusing, like the crabmeat during the speedy bit right before the signpost in act 1. People are going to run into that, lose their rings, and miss out on a special stage. Actually, there are a lot of areas where you're going to just run straight into enemies (again, see later). The chain of bridge objects in act 3 cause horrible amounts of flickering. You gotta interleave them with chunks or something. The ring placement is pretty good, it's the one thing Megamix seeming never got right: way too many rings. The monitor placement is almost excessive, feeling very much like S3K. I like it, I don't think I've ever seen anything but S1/2-style monitor placement in hacks.

    If I can go back to the badnik placement, a while ago, someone posted their interpretation of badnik placement philosophy, and after playing through GHZ, I feel that it holds true: Don't just put badniks in areas where they pose an immediate and possibly unavoidable threat. You see, the philosophy was that you indicate and warn of combat with badniks by making the player jump before it begins: GHZ has those rocks that you have to jump over dotted around right before a stream of platforming and badniks. Sometimes, speed sections end with Sonic being catapulted into the air by a ramp, shortly followed by a surge of badniks or a platforming section. You see where I'm coming from? Maybe even springs can be used to indicate that the following higher up area isn't a speed section? Jump over spikes coming out of the ground, jump up a small raised area in the ground that isn't a slope (see GHZ3's lowest path). Now, I don't know if this suggestion matches with the formula, but... since you need to be rolling to go through a destroyable wall, it might be appropriate to have some ground-based badniks behind the wall, which the player will immediately crash into and destroy, this will leave the player aware that there are upcoming enemies, and you can safely place enemies up ahead without it being unexpected.

    That's as far as my knowledge goes. To my understanding, Marble Zone is entirely a combat zone, so there's no need to indicate enemies there. I wouldn't know a thing about the other zones, except perhaps, being that it's the only other speedy zone in the game, the formula might apply well to Star Light Zone.
  6. Thank you! [​IMG] Well actually I put that about the boss, because when I was watching the streams from the judges of SHC 2014 playing my hack I noticed that all the judges (except for MegaGWolf, it was his first time playing it and he nailed it without losing the boss or lives) had the same problem of not being able to destroy the boss before Eggman went off screen. So yeah... :P

    Note: There may have been other judges who have managed to defeat the boss first time as well, but seen as the later streams were shown from midnight - 3am (or 5am on friday) for UK, I was fast asleep then. :P

    By the way, will your video be on YouTube presumably? If so what's your YouTube channel name and I'll subscribe and I'll keep an eye for the video. :D
  7. RetroKoH


    Project Sonic 8x16
    Yea, Sonic Retro's KingofHarts is my channel on there... you can tell you have the right channel when you see my new avatar.
  8. Okay, so I've made alterations to AHZ, as suggested by Clownacy, and so I would like you to be my guinea pigs again. [​IMG] If it's okay with you all, I'll be doing this with every zone, so I can rework my level layouts.

    I'll credit those who test my zone(s) and give quite detailed feedback (if possible), if it's by video/stream or posting on here. (Note: I'll credit you by your Sonic Retro username, unless you say otherwise. :P ).

    So far thanks to:


    So here's the refined AHZ demo.

    Edit: By the way, about the 1up bug, I keep meaning to ask about it. I really don't know why it does it, I've looked at the code and here's what it shows:

    Code (Text):
    1.  ; ---------------------------------------------------------------------------
    2. ; Add points subroutine
    3. ; ---------------------------------------------------------------------------
    5. ; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||
    8. AddPoints:
    9.         move.b  #1,($FFFFFE1F).w ; set score counter to update
    10.         lea ($FFFFFFC0).w,a2
    11.         lea ($FFFFFE26).w,a3
    12.         add.l   d0,(a3)     ; add d0*10 to the score
    13.         move.l  #999999,d1
    14.         cmp.l   (a3),d1     ; is #999999 higher than the score?
    15.         bhi.w   loc_1C6AC   ; if yes, branch
    16.         move.l  d1,(a3)     ; reset score to #999999
    17.         move.l  d1,(a2)
    19. loc_1C6AC:
    20.         move.l  (a3),d0
    21.         cmp.l   (a2),d0
    22.         bcs.w   locret_1C6B6
    23.         addi.l  #5000,($FFFFFFC0).w ; check every 50000 points
    24.         addq.b  #1,($FFFFFE12).w ; add 1 to the number of lives you have
    25.         addq.b  #1,($FFFFFE1C).w ; add 1 to the lives counter
    26.         move.w  #$2A,d0
    27.         jmp (PlaySound).l   ; play extra life music
    28.         move.l  d0,(a2)
    30. locret_1C6B6:
    31.         rts
    32. ; End of function AddPoints
    I can see that it checks every 50000, by looking at the #5000, as the points are multiplied by 10, so that's why I don't understand why gives a 1up at the 1st amount of points gained from starting a new game or using level select.
  9. FraGag


    Tech Member
    $FFFFFFC0 is the target to reach to get a 1-up. You need to initialize this to 5000 when the game starts, otherwise the initial target is 0, which means that the first time AddPoints is called, the player is awarded a 1-up because he reached the target of 0 points. In Sonic 1 REV01, it's initialized in LevSel_Level_SS, PlayLevel and Demo_Level (GitHub disassembly labels).

    By the way, 2 notes regarding your AddPoints routine:

    1. On this line, you can use (a2) instead of the address:

    Code (ASM):
    1.         addi.l  #5000,($FFFFFFC0).w ; check every 50000 points
    2. The move instruction after the jmp is unreachable and is thus never executed.
  10. Okay, so I've put the line where it checks to see if sonic has 50000 points, from looking at GitHub version into my asm file, and it still hasn't made any difference. One thing I have noticed though is:

    Code (Text):
    2. if Revision=0
    3. else
    4.     move.l  #5000,(v_scorelife).w ; extra life is awarded at 50000 points
    5. endc
    The "if" statement, "else" & "endc", isn't compatible with the Hivebrain version I'm using, so what would I put instead of that. I did try to change the 1st part of the line to cmpi.l thinking that's the Hivebrain version of the "if" statement after looking at other code and comments.
  11. AkumaYin


    Makes sense, since you're using the new AS Hivebrain disasm I gave you. The GitHub disasm is asm68k, although there exists an AS branch made by MainMemory.

    Now, code, code. I'm pretty sure it's only the "endc" that isn't compatible, so you'd have to change it to "endif".

    So, Azure Hills looks better with the new polish, though there are still a few things that need refining.

    And, I hope you haven't started implementing MegaPCM or anything sound-related in the new disasm, because there's a small surprise coming soon to a Personal Messenger near you...

    Like, extremely close to you. Maybe even at the top of your computer screen...

    It is Nothingness
  12. FraGag


    Tech Member
    You can just remove the IF, ELSE and ENDC lines. After all, you always want that MOVE line to be included in your ROM, don't you?
  13. RetroKoH


    Project Sonic 8x16
    Agreed, with FraGag... I simply take out the Revision stuff from my disasm entirely... and from there, anything I wanna keep I keep, other things get commented out. NOT DELETED, just in case I wanna re-change it again.
  14. Well thing is, I did also try to comment out the IF, ELSE and ENDC lines, and good news there's no errors! [​IMG]

    However, that bug is still there. One thing I can think of, is make a check to see if points is below 50000 points, and if so then give no life. Then that would be placed above where it does the processing.
    Only thing is, I don't know how I would implement that in the hivebrain disassembly.
  15. Clownacy


    Tech Member
    The IF and ELSE and ENDC things should be compatible with Hivebrain, there's just the assembler differences: Change the ENDC to ENDIF. You should also put a tab before them, otherwise the assembler may think that they're instructions, and crash.

    Since I don't know what your code looks like in its current state... At LevSel_Level_SS, there should be a 'move.l #5000,($FFFFFFC0).w' before the rts. There should also be one in PlayLevel, above the move.b before the branch to PlaySound_Special. There should be one under Demo_Level before the rts. Those all set the initial extra-life-points value, without them, you'd get an extra the first time you get any amount of points.

    AddPoints you might as well replace with the REV01 version. I can't imagine there being any unforeseen consequences there. Your code, as of your post containing it, had code for increasing, but not code for checking.

    Code (ASM):
    1. AddPoints:
    2.         move.b  #1,($FFFFFE1F).w    ; set score counter to update
    3.         lea ($FFFFFE26).w,a3    ; load current score into a3
    4.         add.l   d0,(a3)         ; add gained score to current score
    5.         move.l  #999999,d1      ; move 999999 (score cap) to d1
    6.         cmp.l   (a3),d1         ; is score below 999999?
    7.         bhi.s   loc_1C6AC       ; if yes, branch
    8.         move.l  d1,(a3)         ; reset score to 999999
    9. loc_1C6AC:
    10.         move.l  (a3),d0         ; load a copy of the current score into d0
    11.         cmp.l   ($FFFFFFC0).w,d0    ; has Sonic got 50000+ points?
    12.         blo.s   locret_1C6B6        ; if not, branch
    14.         addi.l  #5000,($FFFFFFC0).w ; increase requirement by 50000
    15.         tst.b   ($FFFFFFF8).w                               ; COMMENT OUT TO REMOVE DISCRIMINATION =P
    16.         bmi.s   locret_1C6B6        ; branch if Mega Drive is Japanese      ; DITTO
    17.         addq.b  #1,($FFFFFE12).w    ; give extra life
    18.         addq.b  #1,($FFFFFE1C).w
    19.         move.w  #$88,d0         ; PUT YOUR EXTRA LIFE SOUND ID HERE
    20.         jmp PlaySound
    21. locret_1C6B6:
    22.         rts
    For some reason, when implementing this in a clean Hivebrain disasm, you only get the extra life if on Japanese hardware. I guess that comment's wrong. Also, try not to have anything overwrite $FFFFFFC0. That would be bad. You can bugtest this by changing the $5000 to $50, and popping five badniks.
  16. Hitaxas


    Retro 80's themed Twitch streamer ( on hiatus) Member
    Basically what I think FraGag was saying :
    He meant that at

    Code (ASM):
    1. PlayLevel:
    you need to set (initialize) that location in RAM and set it to 5000. you can do this with something along the lines of:

    Code (ASM):
    1. move.l  #5000,($FFFFFFC0).w
    You can put this line above the call for the fade out music under the PlayLevel routine.

    Sonic 2 does this, but in more places as well, like the continue screen.

    Take a look at how Sonic 2 does all of this. Also compare Sonic 2's AddPoints routine. Hopefully this helps you fix your issue.

    Edit: Seems I was ninja'd a little.
  17. Aww yeah! :D You're all brilliant guys! Finally its doing it properly, Sonic gets a 1up every 50k points and NOT a point lower! Thank you. Now it's time to fully concentrate on level design now, which by the way my "Ember Ruin Zone" is almost ready to be tested! I'm just doing some finishing touches to it.
  18. Clownacy


    Tech Member
    Speaking of Ember Ruin, did you ever get the background chunks fixed? You use the REV01 scrolling, but not the REV01 chunks to match it, so you've got some clouds that are seemingly stuck to the mountains. If your chunks are unmodified, you can just swap yours out with the Git disasm's map256/MZ (JP1).bin. Just remember to do your usual backup beforehand.

    Also, something I didn't notice earlier: In REV00, $FFFFFFC0 is something different to what it is in REV01. In REV00, it functions as a copy of your score, while in REV01, it's your extra life value. In your old modified AddPoints, $FFFFFFC0 is treated as both.
  19. Well to be truthful, I never actually noticed the background before, but now that I've compared between the Git Jp file for Ember Ruin, I can see the difference so, I think now it's sorted :P But again thanks for your help Clownacy. ^^
  20. The Void is here!
    It has opened!

    Enter it if you dare!

    The Sonic Into the Void Official Site is now open!

    (I've been wanting to create a site for my hack for a while now, I've just not had the time to create it. This way I'll be able to properly credit those who have contributed to the hack and to keep you all up to date of what's happening.)
    So enjoy! ^^