Some help with slopes

Discussion in 'Discussion and Q&A Archive' started by Zana, Jan 5, 2011.

Thread Status:
Not open for further replies.
  1. Zana

    Zana In Bun We Trust Exiled

    Joined:
    Jan 2, 2011
    Messages:
    76
    Location:
    Madrid
    First, sorryfor this really, really dumb doubt i have


    Second... i have been working a few days on a Canabalt "port" for the Genesis using the S1 engine (it has all the elements for the basic gameplay), and i finally got the running animation working using the tutorial here...


    the problem is that yes, it works and all, but when i get into a slope, the game crashes with an ilegal instruction error of some sorts


    here's the build i made for testing: http://www.mediafire.com/?vqgw43duo9bup9n


    and yes, while the original game has no slopes, i want to know what's wrong with the code, so help would be really appreciated


    oh, and here's the animation script in case i screwed something up





    SonAni_Walk: dc.b $FF, $58, $59, $5A, $5B, $5C, $5D, $5E, $5F, $60, $61, $62, $63, $64, $65, $66, $FF


    SonAni_Run: dc.b $FF, $58, $59, $5A, $5B, $5C, $5D, $5E, $5F, $60, $61, $62, $63, $64, $65, $66, $FF


    SonAni_Roll: dc.b $FE, $2E, $2F, $30, $31, $32, $FF, $FF


    SonAni_Roll2: dc.b $FE, $2E, $2F, $32, $30, $31, $32, $FF


    SonAni_Push: dc.b $FD, $45, $46, $47, $48, $FF, $FF, $FF


    SonAni_Wait: dc.b $17, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 3, 4, $FE, 2, 0


    SonAni_Balance: dc.b $1F, $3A, $3B, $FF


    SonAni_LookUp: dc.b $3F, 5, $FF, 0


    SonAni_Duck: dc.b $3F, $39, $FF, 0


    SonAni_Warp1: dc.b $3F, $33, $FF, 0


    SonAni_Warp2: dc.b $3F, $34, $FF, 0


    SonAni_Warp3: dc.b $3F, $35, $FF, 0


    SonAni_Warp4: dc.b $3F, $36, $FF, 0


    SonAni_Stop: dc.b 7, $37, $38, $FF


    SonAni_Float1: dc.b 7, $3C, $3F, $FF


    SonAni_Float2: dc.b 7, $3C, $3D, $53, $3E, $54, $FF, 0


    SonAni_Spring: dc.b $2F, $40, $FD, 0


    SonAni_LZHang: dc.b 4, $41, $42, $FF


    SonAni_Leap1: dc.b $F, $43, $43, $43, $FE, 1


    SonAni_Leap2: dc.b $F, $43, $44, $FE, 1, 0


    SonAni_Surf: dc.b $3F, $49, $FF, 0


    SonAni_Bubble: dc.b $B, $56, $56, $A, $B, $FD, 0, 0


    SonAni_Death1: dc.b $20, $4B, $FF, 0


    SonAni_Drown: dc.b $2F, $4C, $FF, 0


    SonAni_Death2: dc.b 3, $4D, $FF, 0


    SonAni_Shrink: dc.b 3, $4E, $4F, $50, $51, $52, 0, $FE, 1, 0


    SonAni_Hurt: dc.b 3, $55, $FF, 0


    SonAni_LZSlide: dc.b 7, $55, $57, $FF


    SonAni_Blank: dc.b $77, 0, $FD, 0


    SonAni_Float3: dc.b 3, $3C, $3D, $53, $3E, $54, $FF, 0


    SonAni_Float4: dc.b 3, $3C, $FD, 0



    running and walking are the same, but i do not need different animations for it... so, did i messed something up with that file? is it due the animation, or other unknown reason
     
  2. SpirituInsanum

    SpirituInsanum Well-Known Member Member

    Joined:
    Feb 11, 2010
    Messages:
    642
    Hard to tell without knowing what's in the art/maps/dplc, but from what I see here, you have 15 frames in your walking animation.


    So in order to know, the question is: do you also have 15 frames for 45°, 15 frames for 90° and 15 frames for 135° as well?


    If so, are they placed right after the walking animation?


    And otherwise do you want/need to have different frames for slopes?
     
    Last edited by a moderator: Jan 5, 2011
  3. Zana

    Zana In Bun We Trust Exiled

    Joined:
    Jan 2, 2011
    Messages:
    76
    Location:
    Madrid
    No, i did not on that build, i already have them, but when i bulit it before and tried it out, it did not, so, the problem is because it tries to find missing diagonal frames then?


    OK then, thanks a lot, i will hopefully have all the sprite art working tomorrow
     
  4. EMK-20218

    EMK-20218 The Fuss Maker Exiled

    Joined:
    Aug 8, 2008
    Messages:
    1,067
    Location:
    Jardim Capelinha, São Paulo
    Well, the error is in the index of the ROM. So it could have no relationship with the animation stuff, this can have something to do with the object's positioning. Or some of your data is overwriting the object positioning stuff due to some bad sprite code, I think. Did you tried to restore the Sonic object's routine to his defaults?
     
  5. Zana

    Zana In Bun We Trust Exiled

    Joined:
    Jan 2, 2011
    Messages:
    76
    Location:
    Madrid

    You mean restoring the default animation script in case it crashes anyway when on a slope?


    I might try, yes, i could have replaced Sonic's sprites instead of creating new ones if i could move the sprite's order, but it looks like SonMapEd hates my keyboard, so yeah, i might have overwritten something while adding the 15 frames ... tho even with this, this is even better than what i thought i would get anyway


    EDIT: Replaced Sonic.ASM with the original of the disassembly and it works, slopes, loops, everything... so i might finally add the angle mappings?
     
    Last edited by a moderator: Jan 5, 2011
  6. EMK-20218

    EMK-20218 The Fuss Maker Exiled

    Joined:
    Aug 8, 2008
    Messages:
    1,067
    Location:
    Jardim Capelinha, São Paulo
    No, I mean if you tried to restore the object 01's routine to his defaults for check if this Illegal Instruction isn't happening because of some edits you could have made there.
     
  7. Zana

    Zana In Bun We Trust Exiled

    Joined:
    Jan 2, 2011
    Messages:
    76
    Location:
    Madrid
    I never touched nothing about "object o1" i just edited the mappings, plcs and Sonic.ASM on anim, restoring sonic.asm to its defaults makes the game work perfectly, tho the sega sound is scrambled at the end
     
  8. Zana

    Zana In Bun We Trust Exiled

    Joined:
    Jan 2, 2011
    Messages:
    76
    Location:
    Madrid
    Sorry, Double Post


    I got the animations fixed, and all the sprites are now included, but for some reason, they do not display propely, the 45 degree sprite is displayed as a 135 and vice versa, and i have not figured where the standing reference is so i can change it to $58, which is its new location until i delete all of sonic's original artwork


    any clues with that?


    EDIT: Here's the rom and the sonic animation script


    http://www.mediafire.com/?rr888cmlbqq12ob



    SonAni_Walk: dc.b $FF, $59, $5A, $5B, $5C, $5D, $5E, $5F, $60, $61, $62, $63, $64, $65, $66, $67, $68 $FF
    SonAni_Run: dc.b $FF, $59, $5A, $5B, $5C, $5D, $5E, $5F, $60, $61, $62, $63, $64, $65, $66, $67, $68 $FF


    SonAni_Roll: dc.b $FE, $2E, $2F, $30, $31, $32, $FF, $FF


    SonAni_Roll2: dc.b $FE, $2E, $2F, $32, $30, $31, $32, $FF


    SonAni_Push: dc.b $FD, $45, $46, $47, $48, $FF, $FF, $FF


    SonAni_Wait: dc.b $17, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 3, 4, $FE, 2, 0


    SonAni_Balance: dc.b $1F, $3A, $3B, $FF


    SonAni_LookUp: dc.b $3F, 5, $FF, 0


    SonAni_Duck: dc.b $3F, $39, $FF, 0


    SonAni_Warp1: dc.b $3F, $33, $FF, 0


    SonAni_Warp2: dc.b $3F, $34, $FF, 0


    SonAni_Warp3: dc.b $3F, $35, $FF, 0


    SonAni_Warp4: dc.b $3F, $36, $FF, 0


    SonAni_Stop: dc.b 7, $37, $38, $FF


    SonAni_Float1: dc.b 7, $3C, $3F, $FF


    SonAni_Float2: dc.b 7, $3C, $3D, $53, $3E, $54, $FF, 0


    SonAni_Spring: dc.b $2F, $40, $FD, 0


    SonAni_LZHang: dc.b 4, $41, $42, $FF


    SonAni_Leap1: dc.b $F, $43, $43, $43, $FE, 1


    SonAni_Leap2: dc.b $F, $43, $44, $FE, 1, 0


    SonAni_Surf: dc.b $3F, $49, $FF, 0


    SonAni_Bubble: dc.b $B, $56, $56, $A, $B, $FD, 0, 0


    SonAni_Death1: dc.b $20, $4B, $FF, 0


    SonAni_Drown: dc.b $2F, $4C, $FF, 0


    SonAni_Death2: dc.b 3, $4D, $FF, 0


    SonAni_Shrink: dc.b 3, $4E, $4F, $50, $51, $52, 0, $FE, 1, 0


    SonAni_Hurt: dc.b 3, $55, $FF, 0


    SonAni_LZSlide: dc.b 7, $55, $57, $FF


    SonAni_Blank: dc.b $77, 0, $FD, 0


    SonAni_Float3: dc.b 3, $3C, $3D, $53, $3E, $54, $FF, 0


    SonAni_Float4: dc.b 3, $3C, $FD, 0


    even



    I'm starting to think that something's wrong here...
     
    Last edited by a moderator: Jan 5, 2011
  9. SpirituInsanum

    SpirituInsanum Well-Known Member Member

    Joined:
    Feb 11, 2010
    Messages:
    642
    Logically, what should be happening now is that your animation should look fine on flat ground and broken on angles, which has to be fixed in the game's program.


    Now, you have to modify the routine that chooses the frame to display depending on angles. In Hivebrain's disassembly, it's in SAnim_WalkRun, and in the SVN disassembly, it's in "sonic animate.asm" under "@walkrunroll".


    At one point, you can read this:



    lsr.b #4,d0 ; divide angle by $10
    andi.b #6,d0 ; angle must be 0, 2, 4 or 6



    This is the part of the code telling there are 4 possible angles, your 4 sets of 15 frames (of course modifying this part you could have more or less angles, but it isn't the point). But the right frame is selected a little later: under "lea (SonAni_Walk).l,a1 ; use walking animation", you can read what's selecting the frame depending on the angle:



    move.b d0,d1 ; > this copies d0 to d1 ; here d0=0, 2, 4 or 6 (it's the angle as shown before)
    lsr.b #1,d1 ; > this divides d1 by 2


    add.b d1,d0 ; > this adds d1 to d0, so at this point d0 equals 3/2 of its original value, ie 0, 3, 6 or 9


    @running: ; > if you're running, the previous part is skipped, so if running, d0 still equals 0, 2, 4 or 6


    add.b d0,d0 ; > finally here, d0 is multiplied by 2, so it will be equal to 0, 6, 12 or 18 if you're walking, and 0, 4, 8 or 12 if you're running


    move.b d0,d3 ; > this saves d0 to d3 because d0 will be used in the meantime


    ; (....) a few lines unrelated, then:


    add.b d3,obFrame(a0) ; note: obFrame(a0) is $1A(a0) ; modify frame number > Finally, this is the part that adds the value calculated above to the frame number on flat ground.



    These are the lines you'll have to modify. The point here is to make it so d3 equals 0, 15, 30 or 45 so the game loads the right frame depending on the angle. So you only have to modify the code accordingly.


    One easy way to do this is to divide the original d0 by 2, and multiply it by 15.
     
  10. MarkeyJester

    MarkeyJester ♡ ! Member

    Joined:
    Jun 27, 2009
    Messages:
    2,867
    It's basically what "SpirituInsanum" said really, a common case of mathematical mnemonics used to alter code and align it correctly in a way that it works for any ID at any time. God I love seeing cleverly thought out code, I really do!


    Also, 10 frames for walking? Wow, I can see someone's getting some smoothly flowing animation in their game, can't wait to see it =P
     
  11. Zana

    Zana In Bun We Trust Exiled

    Joined:
    Jan 2, 2011
    Messages:
    76
    Location:
    Madrid
    There's no "SAnim_WalkRun" so i suppose it is on one of the asm files, but on what one?

    Well, i can pm you when i make major progress on this hack (ie, builds that i make while not posting example builds for this kind of threads)


    And about you love that well tought code, i would love too if i understand a third part of what you know of ASM, i guess i'll love it when i spend more time looking at the files and all of that, anyway, enjoy that build
     
    Last edited by a moderator: Jan 5, 2011
  12. SpirituInsanum

    SpirituInsanum Well-Known Member Member

    Joined:
    Feb 11, 2010
    Messages:
    642
    >> ...and "in the SVN disassembly, it's in "sonic animate.asm" under "@walkrunroll".


    Should be there.
     
  13. Zana

    Zana In Bun We Trust Exiled

    Joined:
    Jan 2, 2011
    Messages:
    76
    Location:
    Madrid

    I use the 2005 Dissasmbly, that's why i do not find it
     
  14. SpirituInsanum

    SpirituInsanum Well-Known Member Member

    Joined:
    Feb 11, 2010
    Messages:
    642
    Then there's a "SAnim_WalkRun" routine, this is a copy-paste of the routine in the 2005 disassembly:





    SAnim_WalkRun: ; XREF: SAnim_Do


    subq.b #1,$1E(a0) ; subtract 1 from frame duration


    bpl.s SAnim_Delay ; if time remains, branch


    addq.b #1,d0 ; is animation walking/running?


    bne.w SAnim_RollJump ; if not, branch


    moveq #0,d1


    move.b $26(a0),d0 ; get Sonic's angle


    move.b $22(a0),d2


    andi.b #1,d2 ; is Sonic mirrored horizontally?


    bne.s loc_13A70 ; if yes, branch


    not.b d0 ; reverse angle


    loc_13A70:


    addi.b #$10,d0 ; add $10 to angle


    bpl.s loc_13A78 ; if angle is $0-$7F, branch


    moveq #3,d1


    loc_13A78:


    andi.b #$FC,1(a0)


    eor.b d1,d2


    or.b d2,1(a0)


    btst #5,$22(a0)


    bne.w SAnim_Push


    lsr.b #4,d0 ; divide angle by $10


    andi.b #6,d0 ; angle must be 0, 2, 4 or 6


    move.w $14(a0),d2 ; get Sonic's speed


    bpl.s loc_13A9C


    neg.w d2


    loc_13A9C:


    lea (SonAni_Run).l,a1 ; use running animation


    cmpi.w #$600,d2 ; is Sonic at running speed?


    bcc.s loc_13AB4 ; if yes, branch


    lea (SonAni_Walk).l,a1 ; use walking animation


    move.b d0,d1


    lsr.b #1,d1


    add.b d1,d0


    loc_13AB4:


    add.b d0,d0


    move.b d0,d3


    neg.w d2


    addi.w #$800,d2


    bpl.s loc_13AC2


    moveq #0,d2


    loc_13AC2:


    lsr.w #8,d2


    move.b d2,$1E(a0) ; modify frame duration


    bsr.w SAnim_Do2


    add.b d3,$1A(a0) ; modify frame number


    rts


    ; ===========================================================================



    Anyway, if you can't find it, search "SonAni_Run", it's only twice in the whole disassembly, one of them being the animation pointer, and the other one this routine.
     
  15. Zana

    Zana In Bun We Trust Exiled

    Joined:
    Jan 2, 2011
    Messages:
    76
    Location:
    Madrid
    OOH, it is the Sonic.asm of the root? you could have started there


    BTW: i will try to replace as many tiles as i can in the sonic mapping, the other script shall be modified for those changes?
     
    Last edited by a moderator: Jan 5, 2011
Thread Status:
Not open for further replies.