Basic Questions and Answers Thread

Discussion in 'Discussion & Q&A' started by Malevolence, Jul 7, 2009.

  1. BlackYoshi

    BlackYoshi Active Member Member

    Joined:
    Nov 10, 2013
    Messages:
    27
    Location:
    Argentina
    how can i include the homing attack in my hack ? (a slower version, like in s4ep1)
     
  2. DevEd

    DevEd A lol who occasionally doge nothing Member

    Joined:
    Oct 12, 2012
    Messages:
    268
    Location:
    Somewhere...?
    There is no publically available homing attack code (at least none that isn't stolen), so I'm afraid the only option is to program it yourself.

    Uh-oh, this isn't good.
     
  3. MarkeyJester

    MarkeyJester ♡ ! Member

    Joined:
    Jun 27, 2009
    Messages:
    2,867
    The homing attack involves moving Object A (in our case Sonic) to Object B (in our case an enemy) on specific coordinates (in our case X and Y (horizontal and vertical) for 2D).

    The statement above is the epitome of clarity, you obtain a fraction of the X and Y distances between both objects, and add that fraction to Object A's X and Y coordinates. It couldn't be simpler.

    The reality however is somewhat different, i.e.; ensuring you have decimal fractions accounted for, and the change in distance between Object A and B causing the speed to be different each time. The only sure fire way of obtaining a perfect speed between the two objects regardless of distance, involves getting the distance in its rawest form. The way Sonic games do this is by converting the distances to an angle and then using the angle to convert to the distances again in raw form.

    ---

    The first part involves the inverse trigonometry sinewave function, often referred to as "arcsin" (arctangent sinewave). Sonic games has a similar routine which functions the same (but with different parameters), known as "CalcAngle" in the old disassemblies.

    To use "CalcAngle"; you provide the X distance between Object A and Object B inside d1 as a word, provide the Y distance between Object A and Object B inside d2 as a word, call the function, and it'll return the angle Object B is from Object A inside d0 as a byte. The byte value represents the angle in the form of a hexadecimal degree, 00 to FF (0 degrees to 359 degrees).

    ---

    The next part involves the trigonometry sinewave function, often referred to as "sin" (sinewave). Sonic games also have a similar routine of this function known as "CalcSine" in the old disassemblies.

    To use "CalcSine"; you provide it an angle of degree as a byte inside d0 (in our case, it's already provided by the "CalcAngle" routine), you then call the function, and it'll return the X circular position inside d0 as a word, and the Y circular position inside d1 as a word.

    d0 = raw X distance

    d1 = raw Y distance

    ---

    The new distances are the same as the first distances you put into "CalcAngle", but they are at their smallest quotient form, no fractions yet no large values either. You can add these new distances to Object A's X and Y coordinates to move Objects A to B at the same speed regardless of distance.
     
  4. warr1or2

    warr1or2 I AM CLG Member

    Joined:
    Apr 7, 2008
    Messages:
    416
    Location:
    Town Creek, AL
    Does it not do it automatically when you "Import Sprite sheet"? When I done Naruto Uzumaki from Ninja Council 2, His yellowish scheme imported with it.

    Also

    Here is what came straight from "RichterAnimate.asm"


            lea    (Richteranidata).l,a1
            moveq    #0,d0
            move.b    $1C(a0),d0
            cmp.b    $1D(a0),d0    ; is animation set to restart?
            beq.s    Ranim_Do    ; if not, branch
            move.b    d0,$1D(a0)    ; set to "no restart"
            move.b    #0,$1B(a0)    ; reset    animation
            move.b    #0,$1E(a0)    ; reset    frame duration

            moveq    #0,d0
            move.b    $1C(a0),d0
            cmp.b    $1D(a0),d0    ; is animation set to restart?
            beq.s    Ranim_Do    ; if not, branch
            move.b    d0,$1D(a0)    ; set to "no restart"
            move.b    #0,$1B(a0)    ; reset    animation
            move.b    #0,$1E(a0)    ; reset    frame duration

    Ranim_Do:
            add.w    d0,d0
            adda.w    (a1,d0.w),a1    ; jump to appropriate animation    script
            move.b    (a1),d0
            bmi.s    Ranim_WalkRun    ; if animation is walk/run/roll/jump, branch
            move.b    $22(a0),d1
            andi.b    #1,d1
            andi.b    #$FC,1(a0)
            or.b    d1,1(a0)
            subq.b    #1,$1E(a0)    ; subtract 1 from frame    duration
            bpl.s    Ranim_Delay    ; if time remains, branch
            move.b    d0,$1E(a0)    ; load frame duration

    Ranim_Do2:
            moveq    #0,d1
            move.b    $1B(a0),d1    ; load current frame number
            move.b    1(a1,d1.w),d0    ; read sprite number from script
            bmi.s    Ranim_End_FF    ; if animation is complete, branch

    Ranim_Next:
            move.b    d0,$1A(a0)    ; load sprite number
            addq.b    #1,$1B(a0)    ; next frame number

    Ranim_Delay:
            rts    
    ; ===========================================================================

    Ranim_End_FF:
            addq.b    #1,d0        ; is the end flag = $FF    ?
            bne.s    Ranim_End_FE    ; if not, branch
            move.b    #0,$1B(a0)    ; restart the animation
            move.b    1(a1),d0    ; read sprite number
            bra.s    Ranim_Next
    ; ===========================================================================

    Ranim_End_FE:
            addq.b    #1,d0        ; is the end flag = $FE    ?
            bne.s    Ranim_End_FD    ; if not, branch
            move.b    2(a1,d1.w),d0    ; read the next    byte in    the script
            sub.b    d0,$1B(a0)    ; jump back d0 bytes in    the script
            sub.b    d0,d1
            move.b    1(a1,d1.w),d0    ; read sprite number
            bra.s    Ranim_Next
    ; ===========================================================================

    Ranim_End_FD:
            addq.b    #1,d0        ; is the end flag = $FD    ?
            bne.s    Ranim_End    ; if not, branch
            move.b    2(a1,d1.w),$1C(a0) ; read next byte, run that animation

    Ranim_End:
            rts    
    ; ===========================================================================

    Ranim_WalkRun:                ; XREF: Ranim_Do
            subq.b    #1,$1E(a0)    ; subtract 1 from frame    duration
            bpl.s    Ranim_Delay    ; if time remains, branch
            addq.b    #1,d0        ; is animation walking/running?
            bne.w    Ranim_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    locationation_13A70    ; if yes, branch
            not.b    d0        ; reverse angle

    locationation_13A70:
            addi.b    #$10,d0        ; add $10 to angle
            bpl.s    locationation_13A78    ; if angle is $0-$7F, branch
            moveq    #3,d1

    locationation_13A78:
            andi.b    #$FC,1(a0)
            eor.b    d1,d2
            or.b    d2,1(a0)
            btst    #5,$22(a0)
            bne.w    Ranim_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    locationation_13A9C
            neg.w    d2

    locationation_13A9C:
            
            lea    (charani_Run).l,a1  ; use Richter's Running
            cmpi.w    #$600,d2    ; is Sonic at running speed?
            bcc.s    locationation_13AB4    ; if yes, branch
            
            lea    (charani_Walk).l,a1
            move.b    d0,d1
            lsr.b    #1,d1
            add.b    d1,d0

    locationation_13AB4:
            add.b    d0,d0
            move.b    d0,d3
            neg.w    d2
            addi.w    #$800,d2
            bpl.s    locationation_13AC2
            moveq    #0,d2

    locationation_13AC2:
            lsr.w    #8,d2
            move.b    d2,$1E(a0)    ; modify frame duration
            bsr.w    Ranim_Do2
            add.b    d3,$1A(a0)    ; modify frame number
            rts    
    ; ===========================================================================

    Ranim_RollJump:                ; XREF: Ranim_WalkRun
            addq.b    #1,d0        ; is animation rolling/jumping?
            bne.s    Ranim_Push    ; if not, branch
            move.w    $14(a0),d2    ; get Sonic's speed
            bpl.s    locationation_13ADE
            neg.w    d2

    locationation_13ADE:
            
            lea    (charani_Roll2).l,a1
            cmpi.w    #$600,d2    ; is Sonic moving fast?
            bcc.s    locationation_13AF0    ; if yes, branch
            
            lea    (charani_Roll).l,a1

    locationation_13AF0:
            neg.w    d2
            addi.w    #$400,d2
            bpl.s    locationation_13AFA
            moveq    #0,d2

    locationation_13AFA:
            lsr.w    #8,d2
            move.b    d2,$1E(a0)    ; modify frame duration
            move.b    $22(a0),d1
            andi.b    #1,d1
            andi.b    #$FC,1(a0)
            or.b    d1,1(a0)
            bra.w    Ranim_Do2
    ; ===========================================================================

    Ranim_Push:                ; XREF: Ranim_RollJump
            move.w    $14(a0),d2    ; get Sonic's speed
            bmi.s    locationation_13B1E
            neg.w    d2

    locationation_13B1E:
            addi.w    #$800,d2
            bpl.s    locationation_13B26
            moveq    #0,d2

    locationation_13B26:
            lsr.w    #6,d2
            move.b    d2,$1E(a0)    ; modify frame duration
            lea    (charani_Push).l,a1
            move.b    $22(a0),d1
            andi.b    #1,d1
            andi.b    #$FC,1(a0)
            or.b    d1,1(a0)
            bra.w    Ranim_Do2

    All it  is is the extended art usage for Sonic

    like I said, I need someome to point me in the right direction. Instead of Advancing a few frames to tilt on a loop, to use a different animation using the frames. Indeed i've seen sonic 3k do this, seems easier this way too

    Correct me if i'm wrong, do I change something here?

    Code:
    Ranim_WalkRun:                ; XREF: Ranim_Do
            subq.b    #1,$1E(a0)    ; subtract 1 from frame    duration
            bpl.s    Ranim_Delay    ; if time remains, branch
            addq.b    #1,d0        ; is animation walking/running?
            bne.w    Ranim_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    locationation_13A70    ; if yes, branch
            not.b    d0        ; reverse angle
    
    locationation_13A70:
            addi.b    #$10,d0        ; add $10 to angle
            bpl.s    locationation_13A78    ; if angle is $0-$7F, branch
            moveq    #3,d1
    
    locationation_13A78:
            andi.b    #$FC,1(a0)
            eor.b    d1,d2
            or.b    d2,1(a0)
            btst    #5,$22(a0)
            bne.w    Ranim_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    locationation_13A9C
            neg.w    d2
    
    locationation_13A9C:
            
            lea    (charani_Run).l,a1  ; use Richter's Running
            cmpi.w    #$600,d2    ; is Sonic at running speed?
            bcc.s    locationation_13AB4    ; if yes, branch
            
            lea    (charani_Walk).l,a1
            move.b    d0,d1
            lsr.b    #1,d1
            add.b    d1,d0
    
    locationation_13AB4:
            add.b    d0,d0
            move.b    d0,d3
            neg.w    d2
            addi.w    #$800,d2
            bpl.s    locationation_13AC2
            moveq    #0,d2
    
    locationation_13AC2:
            lsr.w    #8,d2
            move.b    d2,$1E(a0)    ; modify frame duration
            bsr.w    Ranim_Do2
            add.b    d3,$1A(a0)    ; modify frame number
            rts   
    
     
    Last edited by a moderator: Dec 13, 2013
  5. FFuser

    FFuser a.k.a Darklight Member

    Joined:
    Nov 14, 2013
    Messages:
    88
    What does SST stand for when referring to dealing with Objects?
     
  6. nineko

    nineko I am the Holy Cat Member

    Joined:
    Mar 24, 2008
    Messages:
    1,902
    Location:
    italy
    Doing a 5-seconds Google search, this topic from 2004 is the first result I got, and this Wiki page is the second one. Imagine how much more you can find if you search before you ask :)
     
  7. FFuser

    FFuser a.k.a Darklight Member

    Joined:
    Nov 14, 2013
    Messages:
    88
    Thank you. I appreciate it. In my defense though I did search google first a few times before asking, (but I didn't think to search within SonicRetro... my mistake) and it put me on the wrong trail with a bunch of meanings that didn't seem to fit the context. SST alone doesn't yield that topic for me and I thought it had something to do with assembly so I have a habit of searching the term + 'in assembly' and it still threw me way off.

    Again it's appreciated, but I didn't want people to think I was asking for help without looking for the answer myself first.
     
    Last edited by a moderator: Dec 17, 2013
  8. nineko

    nineko I am the Holy Cat Member

    Joined:
    Mar 24, 2008
    Messages:
    1,902
    Location:
    italy
    It's ok; this topic, after all, is for "Basic Questions and Answers", so you can ask pretty much anything you want. Still, I think a line should be drawn somewhere, to prevent the "Basic Questions" from turning into "Please Google That For Me", that's why I usually remark that in such cases.


    By the way, here's a Google Keyword which many people don't know about: "site:". You can use it to search for something on a specific site. For example, the query I used was:

    Code:
    site:*.sonicretro.org SST
    Simple as that. Sometimes it's even better than the search systems which come within the forums themselves, because you can take advantage of all the handy syntaxes allowed by Google (quotes, minus signs, ...)
     
    Last edited by a moderator: Dec 18, 2013
  9. TheStoneBanana

    TheStoneBanana banana Member

    Joined:
    Nov 27, 2013
    Messages:
    602
    Location:
    The Milky Way Galaxy
    This isn't a problem, but it's a question. I'm porting Tails over to Sonic 1, and mostly, he's all there, except for, well, his tails. I realize that his tails are a seperate object, but I just don't know how to start with porting these things over. How do I start?

    (And no, I'm not asking you to do this for me, step by step like some others I've seen here. I just need a good understanding on how to start this. :p)
     
  10. SuperEgg

    SuperEgg I'm a guy that knows that you know that I know Member

    Joined:
    Oct 17, 2009
    Messages:
    Location:
    THE BEST GOD DAMN STATE OF TEXAS
    If you've actually got the Tails object ported and it works well in S1, I'm mildly surprised that you need help with porting his tails, new people rarely can surprise me in a good way, so congrats.


    Anywho, I'd take a good guess your first step is to insure all the RAM addresses work in the ported Obj05, otherwise, you may run into a few unintended issues down the road. The next step after would be to insure that in whatever routine loads the character into the level, ensure that Tails' tails load with him as well. Looking at the S2NA level load should put you in the right direction.
     
  11. Selbi

    Selbi The Euphonic Mess Member

    Joined:
    Jul 20, 2008
    Messages:
    2,429
    Location:
    Northern Germany
    The basic concept is having an object that's always copying Tails' location. Then it takes his current X and Y velocity and calculates the angle (there even is a routine for this), rotates it around to be the opposite of the result, do some fancy stuff to bring it to the correct animation number (you want 3 or 8, depending on whether you want to do the mirroring manually or not), and badabing, tails.

    Never did it, but this is my basic concept if I were to do it myself.
     
    Last edited by a moderator: Dec 23, 2013
  12. Samario

    Samario Newcomer Trialist

    Joined:
    Dec 19, 2013
    Messages:
    18
    Location:
    In s2.asm
    > > >s2.asm(11736): error: symbol undefined

    > > > metropolis_zone_act_4

    > > > dc.w metropolis_zone_act_4   ; new 19

    > > >s2.asm(11738): error: symbol undefined

    > > > sky_chase_zone_act_2

    > > > dc.w sky_chase_zone_act_2    ; new 21

    > > >s2.asm(11740): error: symbol undefined

    > > > wing_fortress_zone_act_2

    > > > dc.w wing_fortress_zone_act_2 ; new 23

    > > >s2.asm(11742): error: symbol undefined

    > > > death_egg_zone_act_2

    > > > dc.w death_egg_zone_act_2 ; new 25

    > > >s2.asm(12854): error: addressing mode not allowed on 68000

    > > > move.l word_A656(pc,d0.w),d1

    > > >s2.asm(12854): error: addressing mode not allowed here

    > > > move.l word_A656(pc,d0.w),d1

    > > >s2.asm(51154): error: addressing mode not allowed on 68000

    > > > lea byte_28726(pc,d1.w),a1

    > > >s2.asm(51154): error: addressing mode not allowed here

    > > > lea byte_28726(pc,d1.w),a1

     

     

    I know what the "symbol undefined"s are (that's me trying to add acts that should be there, but aren't), but how in the world did I get a load of addressing mode errors in an entirely different section to the one I edited to show up?
     
  13. redhotsonic

    redhotsonic Also known as RHS Member

    Joined:
    Aug 10, 2007
    Messages:
    2,969
    Location:
    England
    Sort the "symbol undefined" error(s) out first, then 9/10 times the "addressing" errors will go away.
     
  14. TheStoneBanana

    TheStoneBanana banana Member

    Joined:
    Nov 27, 2013
    Messages:
    602
    Location:
    The Milky Way Galaxy
    Ha ha. That's something I don't hear everyday. Actually, if it still counts, Tails is the main character for this hack, and I'm porting his single player code over Obj01 (Sonic) in Sonic 1. Hopefully that doesn't change your suggestion code wise. If your looking for proof of this very early progress, here you go:

    [​IMG]

    (His tails are here simply because of his special mappings, I believe.)

    I actually also have another question. When I start playing the ROM, Tails is touching the ground. If I jump though, he moves 2 pixels up and stays like that. Is this because of a different collision height? I can't seem to find what's causing this.
     
    Last edited by a moderator: Dec 23, 2013
  15. Samario

    Samario Newcomer Trialist

    Joined:
    Dec 19, 2013
    Messages:
    18
    Location:
    In s2.asm
    Maybe Tails' ball sprite is slightly smaller than Sonic's, so the code for adjusting his height so he doesn't fall through the ground when he lands is shifting Tails up too high? That's my take on it anyway, you can feel free to ignore it if you wish...

    EDIT for clarifying: Sonic's ball sprite, when it touches the ground, before executing the code to change Sonic's animation back to the standing / walking / running animation, it shifts his x coordinate so he does not get stuck in the ground, as Sonic's ball animation has a smaller hit-box than Sonic's standing sprite.


    Y_COORDINATE_GROUND_CHECK=Y_COORDINATE+9
    ' Sonic's stand height = 39 pixels
    ' Sonic's ball height = 30 pixels
    IF Y_COORDINATE_GROUND_CHECK == GROUND AND X_ACCELERATION == 0 THEN Y_COORDINATE=Y_COORDINATE-9:SONIC_ANIMATION=0
    ' animation 0 = standing
    IF Y_COORDINATE_GROUND_CHECK == GROUND AND X_ACCELERATION >= 0 AND X_ACCELERATION <= 5 THEN Y_COORDINATE=Y_COORDINATE-9:SONIC_ANIMATION=2
    ' animation 2 = walking
    IF Y_COORDINATE_GROUND_CHECK == GROUND AND X_ACCELERATION >= 5 THEN Y_COORDINATE=Y_COORDINATE-9:SONIC_ANIMATION=3
    ' animation 3 = running
    IF Y_COORDINATE_GROUND_CHECK != GROUND THEN SONIC_ANIMATION=1
    ' animation 1 = jumping

    (pseudo-BASIC to demonstrate what I mean)
     
    Last edited by a moderator: Dec 24, 2013
  16. FFuser

    FFuser a.k.a Darklight Member

    Joined:
    Nov 14, 2013
    Messages:
    88
    Lol, you've been reading those threads too huh? Despite the trouble they got in, I'm still kinda glad they asked because the info from them got me from not really knowing where to start from that to at least getting a playable version of Tails in there.

    I'm in the process of trying to port Tails into Sonic 1 as well (as Obj02 as a separate playable character... though it's close to the the structure of Obj01 at this point). I'm having trouble getting the Obj05 Tails' tails in there too. I think the RAM addresses are fine (I tested several between FFFFD000 and FFFFD7FF and settled on D580 and D580+$3E since that was suggested as free space in another thread and most of the other ones yielded the same result), but I'm thinkin' something else is making it display incorrectly graphic-wise.

    [​IMG]

    [​IMG]

    Half eaten red ring shit.... um okay.

    I'll keep analyzing the Sonic 2 disassembly and if I come across the solution (a Eureka moment), I'll send you pm if you don't mind.

    About the Tails being above ground bit though. In case you haven't fixed that already, if you check out Tails' object initialization code in Sonic 2 you'll notice this part:


    move.b #$F,y_radius(a0) ; this sets Tails' collision height (2*pixels) to less than Sonic's height
    move.b #9,x_radius(a0)

    which translates in Sonic 1's code to:


    move.b #$F,$16(a0) ; this sets Tails' collision height (2*pixels) to less than Sonic's height
    move.b #9,$17(a0)

    Sonic's Object has similar parts in his object code that has this instead because he's taller


    move.b #$13,$16(a0)
    move.b #9,$17(a0)

    So since you're just replacing the entire Obj01, within that object, just find those lines and change the parts that say "#$13" to "#$F" and that should do the trick. There are about 3 or 4 of them.

    There are other platform objects that jump to the subroutine "Sonic_ResetOnFloor" (which also resets his height in the process), but I don't think you need to worry about that unless you changed it in Obj01 since Tails is Obj01 in this case. (Sonic 2's code has a couple of lines and a comment in there that basically says you have to jump to Tails' version of the subroutine if you're not playing as Sonic)
     
    Last edited by a moderator: Dec 27, 2013
  17. SuperEgg

    SuperEgg I'm a guy that knows that you know that I know Member

    Joined:
    Oct 17, 2009
    Messages:
    Location:
    THE BEST GOD DAMN STATE OF TEXAS
    That's because you're having his tails art set to the VRAM location of the rings. You need to find a suitable and empty area of VRAM to plop the art into and have the object call the art at the correct VRAM location.
     
  18. TheStoneBanana

    TheStoneBanana banana Member

    Joined:
    Nov 27, 2013
    Messages:
    602
    Location:
    The Milky Way Galaxy
    Lol, you've been reading those threads too huh? Despite the trouble they got in, I'm still kinda glad they asked because the info from them got me from not really knowing where to start from that to at least getting a playable version of Tails in there.

    I'm in the process of trying to port Tails into Sonic 1 as well (as Obj02 as a separate playable character... though it's close to the the structure of Obj01 at this point). I'm having trouble getting the Obj05 Tails' tails in there too. I think the RAM addresses are fine (I tested several between FFFFD000 and FFFFD7FF and settled on D580 and D580+$3E since that was suggested as free space in another thread and most of the other ones yielded the same result), but I'm thinkin' something else is making it display incorrectly graphic-wise.

    [​IMG]

    [​IMG]

    Half eaten red ring shit.... um okay.

    I'll keep analyzing the Sonic 2 disassembly and if I come across the solution (a Eureka moment), I'll send you pm if you don't mind.

    About the Tails being above ground bit though. In case you haven't fixed that already, if you check out Tails' object initialization code in Sonic 2 you'll notice this part:


    move.b #$F,y_radius(a0) ; this sets Tails' collision height (2*pixels) to less than Sonic's height
    move.b #9,x_radius(a0)

    which translates in Sonic 1's code to:


    move.b #$F,$16(a0) ; this sets Tails' collision height (2*pixels) to less than Sonic's height
    move.b #9,$17(a0)

    Sonic's Object has similar parts in his object code that has this instead because he's taller


    move.b #$13,$16(a0)
    move.b #9,$17(a0)

    So since you're just replacing the entire Obj01, within that object, just find those lines and change the parts that say "#$13" to "#$F" and that should do the trick. There are about 3 or 4 of them.

    There are other platform objects that jump to the subroutine "Sonic_ResetOnFloor" (which also resets his height in the process), but I don't think you need to worry about that unless you changed it in Obj01 since Tails is Obj01 in this case. (Sonic 2's code has a couple of lines and a comment in there that basically says you have to jump to Tails' version of the subroutine if you're not playing as Sonic)



    Got the floating problem fixed thanks to your advice. Thank you! Now, off to port Tails' Tails! :D
     
  19. warr1or2

    warr1or2 I AM CLG Member

    Joined:
    Apr 7, 2008
    Messages:
    416
    Location:
    Town Creek, AL
    but I've seen one here http://asmtosegagenesis.forumeiros.com/f4-sonic-1

    ...or is this one, including explaination, stolen too?
     
  20. Devon

    Devon Down you're going... down you're going... Member

    Joined:
    Aug 26, 2013
    Messages:
    1,372
    Location:
    your mom
    warr1or2, I am afraid that there are things on ASMToSegaGenesis that is stolen content, thanks to OuricoDoido, a code thief. The homing attack there is stolen content from Sonic Megamix, I believe. MarkeyJester already posted a brief explanation on how to make a basic homing attack.
     
    Last edited by a moderator: Dec 29, 2013