That is because the tails object needs to take the SS angle in consideration too when determining its orientation. I can write something more later, when I am back home; but you can likely compare how S3&K does the slot bonus stage. Edit: I think (but can't check atm) that the code in question is in Tails' animate function, in a branch reachable only by the tails.
That has to do with the Tails_Animate subroutine, correct? I did see that, and put it in. Here is what that looks like right now: (for those who also want to do this... in S3K, v_ssangle is labeled as Stat_Table) Code (Text): @tails_gettail: move.w x_vel(a2),d1 move.w y_vel(a2),d2 jsr (CalcAngle).l cmpi.b #id_Special,(v_gamemode).w bne.s @notSS add.b (v_ssangle).w,d0 @notSS: moveq #0,d1 move.b status(a0),d2 andi.b #1,d2 bne.s @1D002 not.b d0 bra.s @1D006 ; =========================================================================== @1D002: addi.b #$80,d0 @1D006: addi.b #$10,d0 bpl.s @TAnim_Next moveq #3,d1 @TAnim_Next: andi.b #$FC,render_flags(a0) eor.b d1,d2 or.b d2,render_flags(a0) lsr.b #3,d0 andi.b #$C,d0 move.b d0,d3 lea (TailstailsAni_Directional).l,a1 move.b #3,anim_frame_duration(a0) bsr.w @loadframe add.b d3,mapping_frame(a0) rts ; End of function Tails_Animate I get the feeling I'm missing something else, but I don't think it is in the SS Object. I could be wrong though.
That is correct, yes. Hm. Can you show your code for Tails' tails? And can you ensure that the SS player object always sets the rolling animation?
Code (Text): ; --------------------------------------------------------------------------- ; Object 03 - Tails' tails ; --------------------------------------------------------------------------- Tailstails: ; XREF: Obj_Index moveq #0,d0 move.b routine(a0),d0 move.w Tailstails_Index(pc,d0.w),d1 jmp Tailstails_Index(pc,d1.w) ; =========================================================================== Tailstails_Index: dc.w Tailstail_Main-Tailstails_Index ; 0 dc.w Tailstail_Display-Tailstails_Index ; 2 ; =========================================================================== ; loc_1D212 Tailstail_Main: addq.b #2,routine(a0) move.l #Map_Tails,mappings(a0) move.w #$790,art_tile(a0) move.w #$100,priority(a0) move.b #$18,width_pixels(a0) move.b #4,render_flags(a0) Tailstail_Display: movea.w parent(a0),a2 ; a2=character move.b angle(a2),angle(a0) move.b status(a2),status(a0) move.w x_pos(a2),x_pos(a0) move.w y_pos(a2),y_pos(a0) andi.w #$7FFF,art_tile(a0) tst.w art_tile(a2) bpl.s @display2 ori.w #$8000,art_tile(a0) @display2: moveq #0,d0 move.b anim(a2),d0 btst #5,status(a2) ; is Tails about to push something? beq.s @display3 ; if not, branch cmpi.b #$63,mapping_frame(a2) ; Is Tails in his pushing animation yet? blt.s @display3 ; If not yet, branch, and do not set tails' tail pushing animation moveq #4,d0 @display3: cmp.b $30(a0),d0 beq.s Tail_1D288 move.b d0,$30(a0) move.b TailsAniSelection(pc,d0.w),anim(a0) Tail_1D288: lea (Ani_Tailstails).l,a1 bsr.w Tails_Animate_2 bsr.w Tailstails_LoadGfx movea.w parent(a0),a1 ; Move Tails' register to a1 move.w invulnerable_time(a1),d0 ; Move Tails' invulnerable time to d0 beq.s @skip ; Is invulnerable_time 0? If so, always display his tails addq.w #1,d0 ; Make d0 the same as old invulnerable_time's d0 lsr.w #3,d0 ; Shift bits to the right 3 times bcs.s @skip ; If the Carry bit is set, branch and display his tails rts ; Otherwise, do not display Tails' tails @skip: jmp DisplaySprite ; Display Tails' tails TailsAniSelection: dc.b 0,0 ; TailsAni_Walk,Run -> dc.b 3 ; TailsAni_Roll -> Directional dc.b 3 ; TailsAni_Roll2 -> Directional dc.b 9 ; TailsAni_Push -> Pushing dc.b 1 ; TailsAni_Wait -> Swish dc.b $A ; TailsAni_Balance -> Blank dc.b 1 ; TailsAni_LookUp -> Swish dc.b 1 ; TailsAni_Duck -> Swish dc.b 0 ; TailsAni_Dash -> dc.b 0,0 ; TailsAni_Dummy1,2 -> dc.b 7 ; TailsAni_Spindash -> Spindash dc.b 8 ; TailsAni_Stop -> Skidding dc.b 0,0 ; TailsAni_Float,2 -> dc.b 0 ; TailsAni_Spring -> dc.b 0 ; TailsAni_Hang -> dc.b 0,0 ; TailsAni_Leap,2 -> dc.b 0 ; TailsAni_Surf -> Hanging dc.b 0 ; TailsAni_Bubble -> dc.b 0,0,0,0 ; TailsAni_Death,2,3,4 -> dc.b 0,0 ; TailsAni_Hurt,Slide -> dc.b 0 ; TailsAni_Blank -> dc.b 0,0 ; TailsAni_Float4,5 -> dc.b 0 ; TailsAni_GetBubStand -> dc.b 0,0,0 ; TailsAni_Fly,2,3 -> dc.b 0,0,0 ; TailsAni_Swim,2,3 -> even include "_anim\Tails tails.asm" There's the code for Tails' tails Code (Text): [size=2] [/size]move.b #id_Roll,anim(a0) cmpi.b #1,character_id(a0) ; is this Tails? bne.s @nottails ; if not, branch move.b #id_TailsTails,(v_objspace+$380).w ; load Obj03 (Tails' Tails) at $FFFFD000 move.w a0,(v_objspace+$380+parent).w ; set its parent object to this @nottails: bset #2,status(a0) bset #1,status(a0) Here's a snippet from the INIT code for the SS Object. the animation is set, (All characters share the same values for each animation, so the id_Roll constant is correct, and not an issue). Also the Tails do load with Tails only as seen below, as done in S3K's slot machine stage object.
How would I go about editing the text on the Special Stage results screen in the Sonic 2 HG disassembly? The "Chaos Emerald" part specifically. I can't really see a way to load the mappings in SonMapEd (unless I'm missing something, I'm pretty sure it's object 6F but loading those mappings didn't help any).
I have a little question about AS: Let's suppose I made a macro to replace the JMP command, like this: Code (ASM): jmp: macro addr dc.l "_JMP" dc.l addr endm It would work fine if in the main code I call it as "jmp labelX", but it won't if I call it as "jmp (LabelX).l" or "jmp (LabelX).w", because then it incorrectly tries to build it with a "dc.l (LabelX).l", which is invalid. Is there any way I could strip the parenthesis and data size off?
The issue here is down to "invulnerable_time". After searching up on what that value was, I found it to be $30, which is fine. Except the characters in the special stage don't get hurt, and instead, that space is used for storing the ID of the blocks being touched in the special stage. This is of course, a conflict between the two. The simple fix is to skip that hurt section of the code, on the condition that you're in the special stage. Everything else should function as normal.
Another quick question, which isn't really hacking related, but it's not worth making a new topic. Has anyone downloaded Sonic 1 for the PS3 (Backbone's version)? If so, you do get button delays? Every button I press, it takes a second to register, making the game very hard (or impossible) to play. So I press the jump button, he jumps a second later.
It's also the case on the 360 version as well. Except for I don't have Sonic 1 but Sonic 3 and it does the same thing. It's the only thing that's holding me back from getting all the achievements in the game... >_> I believe it's a emulation error.
I've read through the Secrets pages and the TCRF pages on the Sonic titles a bunch of times in the past, yet recently in my messing around, I happened across an unused third frame in S3K's Super Sonic's standing animation, and I haven't seen it documented anywhere. Did anyone know about this? It seems too obvious to be unknown... It no longer had its own DPLC entry and just used frame 1's, so I had to recreate it, but it can be easily done, and gives you a complete sprite. The one with the most descended quills is the one you're looking for.
Sonic 3 Complete and Sonic Classic Heroes use a third frame, with the former animating it 1-2-3-2-1 as your image does, and the latter doing 1-2-3-1-2-3. Most of the S3C Full Super frames come from SCH, so it probably turned up when they were implemented, but I wasn't directly aware of it, as That One Jig and Neo have handled pretty much all of the graphics since they've been involved. I haven't seen it documented either, but it might be one of those things that is lost to time in a forum post somewhere.
While I normally wouldn't quote/repeat a question (and I feel slightly incessant for doing so), I can't seem to wrap my head around this. Also, to Sonic 1 2005 Hivebrain disassembly for a second, is it safe to assume you'd edit Special Stage starting positions the same way you would for normal stages? Probably a silly question but I figured I'd throw it in with the Sonic 2 HG question.
Your problem with the special stage result mappings is likely due to the fact that the object has the base tile set to 0, meaning it can only be viewed and edited properly if you load a full VRAM dump from the results screen as the art file. The Genesis Savestate Viewer tool can extract the VRAM from a savestate if your emulator doesn't have a VRAM dumping option.
I have a few questions regarding Sonic 2; First, I would like to know how to modify the behavior of the Emerald Hill Zone boss. I managed to figure out how to alter its height, however I can't figure out how to edit its speed. Also, is there a way to get it to fire its drill before its one hit away from being destroyed? Another thing, if I wanted to extend the wait time at the title screen (before the game enters demo mode), how would I do that? (I'm using the 2007 Xenowhirl disassembly by the way.)
As far as modifying speed goes, anything in the object's code with x_vel next to it can be used to change the horizontal speed. For example: [68k]loc_2F2E0: subi.w #1,objoff_2A(a0) bpl.w JmpTo35_DisplaySprite move.w #-$200,x_vel(a0)[/68k] You can change the -$200 to another value to modify how fast the boss travels across the screen. And to change when it fires the drill: [68k]loc_2F8AA: cmpi.b #1,collision_property(a1)[/68k] Change the 1 to something else to have it fire at that amount of hits instead. I don't work with Sonic 2 too much so I don't know what controls the amount of time spent on the title screen.
YES, but with a small difference. Note that with editing Special stage positions... X-$2E0 and Y-$2B0 to get your actual position on the layout. Otherwise it's identical.
Can someone tell me please how exactly air drag works in classic Sonics? Does it occur only when Sonic jumps or every time he is in the air (including being launched off a spring or a curve)?
Is THIS what you were expecting? Also, in my hack, of Sonic 2, I'm having an issue with Object C9, the title screens palette changer. One of the palettes in my hack is 2 lines long instead of 1, and while I was able to get it to read the right entry length when the player skips Sonic & Tails' appearance with start, I can't get both lines to load when the player lets the intro finish. Here's what I have: Code (Text): PaletteChangerDataIndex: offsetTable offsetTableEntry.w ObjC9_TitlePalette1 ; 0 offsetTableEntry.w ObjC9_TitlePalette2 ; 2 offsetTableEntry.w ObjC9_EndingPalette1 ; 4 offsetTableEntry.w ObjC9_EndingPalette2 ; 6 offsetTableEntry.w off_133BC ; 8 offsetTableEntry.w off_133C8 ; $A offsetTableEntry.w off_133D4 ; $C offsetTableEntry.w off_133E0 ; $E C9PalInfo macro codeptr,dataptr,loadtoOffset,length,fadeinTime,fadeinAmount dc.l codeptr, dataptr dc.b loadtoOffset, length, fadeinTime, fadeinAmount endm ObjC9_TitlePalette1: C9PalInfo Pal_AddColor, Pal_1342C, $20, $F,2,$15 ;The emblem (Palette line 2) ObjC9_TitlePalette2: C9PalInfo loc_1344C, Pal_1340C, $40,$1F,8,$15 ;Background (2 lines), last 2 palette lines. Does anyone know what I have wrong?
I've read that, duh. It implies that air drag happens all the time Sonic is in the air but I want to make sure.