Actions

SCHG How-to

Difference between revisions of "Fix Blue Knuckles"

From Sonic Retro

(Added fixes for End of Level Signpost graphics, Slot Bonus Stage, and Super/Hyper palette. These fixes make Blue Knuckles a 99% bug-free character, the last thing to add is a better explanation on how to fix him on the save screen too.)
Line 1: Line 1:
 
{{GuideBy|Tamkis}}
 
{{GuideBy|Tamkis}}
  
''(Additional and optional steps by [[AlexShx]])''
+
''(Additional and optional steps by [[AlexShx]])''
  
 
==Who is Blue Knuckles: the bug explained==
 
==Who is Blue Knuckles: the bug explained==
Line 21: Line 21:
 
bne.s [label]
 
bne.s [label]
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
The label jumped to in statements like that would do something specific for when the player_mode is NOT 3 (Red Knuckles). Blue Knuckles is player_mode ID #4, so, with that statement, the game would goto the label meant for Sonic &/or Tails player modes, which is not what we want. We want Blue Knuckles to do the code after the bne.s, which is meant for Red Knuckles. This guide will fix statements of this format
 
The label jumped to in statements like that would do something specific for when the player_mode is NOT 3 (Red Knuckles). Blue Knuckles is player_mode ID #4, so, with that statement, the game would goto the label meant for Sonic &/or Tails player modes, which is not what we want. We want Blue Knuckles to do the code after the bne.s, which is meant for Red Knuckles. This guide will fix statements of this format
Line 30: Line 31:
 
beq.s [label]
 
beq.s [label]
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
If player_mode is #3 (Red Knuckles), the game will jump to a label for special processing for Knuckles events &c. If player_mode is NOT #3 (Red Knuckles), then the game will execute code for Sonic &/or Tails. Since Blue Knuckles (ID #4) is NOT ID #3, the game will execute Sonic &/or Tails code for Blue Knuckles, which is not what we want. We want Blue Knuckles to execute code for Red Knuckles. This guide will also fix statements of this format.
 
If player_mode is #3 (Red Knuckles), the game will jump to a label for special processing for Knuckles events &c. If player_mode is NOT #3 (Red Knuckles), then the game will execute code for Sonic &/or Tails. Since Blue Knuckles (ID #4) is NOT ID #3, the game will execute Sonic &/or Tails code for Blue Knuckles, which is not what we want. We want Blue Knuckles to execute code for Red Knuckles. This guide will also fix statements of this format.
 +
  
 
==Making Blue Knuckles selectable==
 
==Making Blue Knuckles selectable==
Line 61: Line 64:
 
moveq #0,d1
 
moveq #0,d1
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Change this:
 
Change this:
Line 67: Line 71:
 
cmpi.w #3,d1
 
cmpi.w #3,d1
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
To this:
 
To this:
Line 73: Line 78:
 
cmpi.w #4,d1
 
cmpi.w #4,d1
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Then, goto label Obj_SaveScreen_NoSave_Slot / Obj_SaveScreen_D30C
 
Then, goto label Obj_SaveScreen_NoSave_Slot / Obj_SaveScreen_D30C
Line 86: Line 92:
 
bne.s loc_D396
 
bne.s loc_D396
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Change this:
 
Change this:
Line 91: Line 98:
 
addq.w #3,d0
 
addq.w #3,d0
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
To this:
 
To this:
Line 97: Line 105:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Afterwards, goto subprgm sub_D6D0; it should look like this:
+
 
 +
Afterwards, go to subprgm sub_D6D0; it should look like this:
  
 
<syntaxhighlight lang="asm">
 
<syntaxhighlight lang="asm">
Line 116: Line 125:
 
; ---------------------------------------------------------------------------
 
; ---------------------------------------------------------------------------
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Change this:
 
Change this:
Line 121: Line 131:
 
cmpi.w #3,d0
 
cmpi.w #3,d0
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
To this:
 
To this:
Line 126: Line 137:
 
cmpi.w #4,d0
 
cmpi.w #4,d0
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Furthermore, goto label loc_D6EE.
 
Furthermore, goto label loc_D6EE.
Line 139: Line 151:
 
moveq #3,d0
 
moveq #3,d0
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Change this:
 
Change this:
Line 144: Line 157:
 
moveq #3,d0
 
moveq #3,d0
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
To this:
 
To this:
Line 149: Line 163:
 
moveq #4,d0
 
moveq #4,d0
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Those modifications changed the max player_mode for the Save Screen, from #3 (Red Knuckles) to #4 (Blue Knuckles). Note that Blue Knuckles’ picture in the Save screen shows part of the “Del” sign seen when deleting a save, instead of a picture of a blue Knuckles. You will have to repoint manually the art to a suitable picture for blue knuckles. Use SonMapED and modify General\Save Menu\Map - Save Screen General.asm
 
Those modifications changed the max player_mode for the Save Screen, from #3 (Red Knuckles) to #4 (Blue Knuckles). Note that Blue Knuckles’ picture in the Save screen shows part of the “Del” sign seen when deleting a save, instead of a picture of a blue Knuckles. You will have to repoint manually the art to a suitable picture for blue knuckles. Use SonMapED and modify General\Save Menu\Map - Save Screen General.asm
Line 168: Line 183:
 
move.w #0,(Player_option).w
 
move.w #0,(Player_option).w
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Change this:
 
Change this:
Line 173: Line 189:
 
cmpi.w #4,(Player_option).w
 
cmpi.w #4,(Player_option).w
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
To this:
 
To this:
Line 178: Line 195:
 
cmpi.w #5,(Player_option).w
 
cmpi.w #5,(Player_option).w
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
==Fixing bugs==
 
==Fixing bugs==
Line 203: Line 221:
 
If you did that step and all of the other steps right, you should now be able to select Blue Knuckles from the Save and Level Select Screens. Most of the bugs involving Blue Knuckles should be fixed now too.
 
If you did that step and all of the other steps right, you should now be able to select Blue Knuckles from the Save and Level Select Screens. Most of the bugs involving Blue Knuckles should be fixed now too.
  
===Additional step===
 
  
Ok, now we need to fix Super / Hyper Blue Knuckles reverting back in Red to his "normal form".
+
===Additional step 1: Fix End of Level Signpost===
This happens because he uses the "Red" Knuckles' palette transition when reverting back to "normal form", fixing it is easy:
+
 
 +
Now, as soon as we can, we have to fix the end of level signpost graphic for Blue Knuckles. This is as easy as weird.
 +
 
 +
Go to ''FrameArray_EndSign'',  change this:
 +
<syntaxhighlight lang="asm">
 +
FrameArray_EndSign: dc.b 0,  0,   1,  2
 +
</syntaxhighlight>
 +
 
 +
 
 +
To this:
 +
<syntaxhighlight lang="asm">
 +
FrameArray_EndSign: dc.b 0,  0,   1,  2,  2,  2,  2,  2 ; Equivalent characters: 00 ST, 01 S, 02 T, 03 K, 04 BK, 05 BK, 06 BK, 07 BK
 +
</syntaxhighlight>
 +
 
 +
 
 +
Done. This loads and displays the variant #2 of the End Signpost instead of a null one, and since Knuckles' palette is blue, the displayed character will be Blue Knuckles.
 +
 
 +
 
 +
===Additional step 2: Revert to blue palette after Super/Hyper Transformation===
 +
 
 +
Ok, now we need to fix Super/Hyper Blue Knuckles reverting back in Red to his "normal form".
 +
This happens because he uses the "Red" Knuckles' palette transition when reverting back to "normal form".
  
 
Go to SuperHyper_PalCycle_Revert / loc_37EE:
 
Go to SuperHyper_PalCycle_Revert / loc_37EE:
Line 233: Line 271:
 
move.b #0,(Super_Hyper_palette_status).w ; 0 = off ; ($FFFFF65F in older disassemblies)
 
move.b #0,(Super_Hyper_palette_status).w ; 0 = off ; ($FFFFF65F in older disassemblies)
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
Ok, now change this:
 
Ok, now change this:
Line 247: Line 286:
 
move.b #3,(Palette_timer).w
 
move.b #3,(Palette_timer).w
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
To this:
 
To this:
Line 264: Line 304:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Now Super / Hyper Blue Knuckles uses Super / Hyper Sonic's "reverting" transition wich makes him blue (and pretty) again after Super / Hyper form.
+
 
 +
Now Super/Hyper Blue Knuckles uses Super/Hyper Sonic's "reverting" transition wich makes him blue (and pretty) again after Super/Hyper form.
 +
 
  
 
==Unfixed bugs==
 
==Unfixed bugs==
Line 270: Line 312:
 
There are some bugs that I am still trying to fix with Blue Knuckles
 
There are some bugs that I am still trying to fix with Blue Knuckles
 
<ul>
 
<ul>
<li>He is messed up in the Slot Bonus Stage.
+
<li>He is messed up in the Slot Bonus Stage. (See optional steps for fast fix)
<li>Blue Super/Hyper Knuckles turns Red (but reverts Blue - Additional step)
+
<li>Blue Super/Hyper Knuckles turns Red, but at least reverts Blue. (See optional steps for fast or complete fix)
<li>There is no end-of-level sign for Blue Knuckles (the top half disappears when the results appear).
 
 
</ul>
 
</ul>
  
 
----
 
----
  
==Optional step==
+
==Optional steps==
 +
 
 +
===How to prevent Blue Knuckles from accessing the Slot Bonus Stage (fast fix)===
 +
 
 +
This isn't the best way to do it, but in this case bugged is worse than nothing.
 +
 
 +
Just go to ''loc_2D47E'' and change this:
 +
<syntaxhighlight lang="asm">
 +
...
 +
beq.s loc_2D506
 +
move.b #2,(Special_bonus_entry_flag).w
 +
move.w #$1500,d1
 +
...
 +
</syntaxhighlight>
 +
 
 +
 
 +
To this:
 +
<syntaxhighlight lang="asm">
 +
...
 +
beq.w loc_2D506 ; (word used instead of short: jump distance too big)
 +
move.b #2,(Special_bonus_entry_flag).w
 +
move.w #$1500,d1 ; load the Slot Bonus Stage
 +
cmpi.w #4,(Player_mode).w ; DWBK
 +
bne.s Slots_STK_DoNotFix ; Skip if not Blue Knuckles
 +
move.w #$1400,d1 ; Load Pachinko instead of Slot for Blue Knuckles (or you can set it to $1300 to load the Gumball Machine)
 +
Slots_STK_DoNotFix:
 +
...
 +
</syntaxhighlight>
 +
 
  
===How to "Fix" Super / Hyper Blue Knuckles using Super / Hyper Sonic's palette cycle===
+
===How to "Fix" Super/Hyper Blue Knuckles using Super/Hyper Sonic's palette cycles (fast fix)===
  
Since I don't want to make Super / Hyper Blue Knuckles appear like a "bad copy" of his famous red brother I figured out how to make his palette flash like Sonic's, "fixing" the "Blue Super/Hyper Knuckles turns Red" bug listed above.
+
In my case, since I don't want to make Super/Hyper Blue Knuckles appear like a "bad copy" of his famous red brother nor create a custom palette cycle I figured out how to make his palette flash like Sonic's, "fixing" the "Blue Super/Hyper Knuckles turns Red" bug listed above.
  
Fixing is very very simple. Go to SuperHyper_PalCycle_Normal / loc_3854:
+
Fixing is very very simple. Go to ''SuperHyper_PalCycle_Normal (loc_3854)'':
  
 
<syntaxhighlight lang="asm">
 
<syntaxhighlight lang="asm">
Line 296: Line 365:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Ok, now revert "bcc.w" in "beq.w": change this:
+
 
 +
Ok, now revert "bcc.w" in "beq.w". Change this:
 
<syntaxhighlight lang="asm">
 
<syntaxhighlight lang="asm">
 
bcc.w SuperHyper_PalCycle_NormalKnuckles ; "Blue Knuckles Fix": "beq.w" to "bcc.w" (fixed before)
 
bcc.w SuperHyper_PalCycle_NormalKnuckles ; "Blue Knuckles Fix": "beq.w" to "bcc.w" (fixed before)
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
To this:
 
To this:
 
<syntaxhighlight lang="asm">
 
<syntaxhighlight lang="asm">
beq.w SuperHyper_PalCycle_NormalKnuckles ; Super / Hyper Blue Knuckles now uses Super / Hyper Sonic's PalCycle
+
beq.w SuperHyper_PalCycle_NormalKnuckles ; Super/Hyper Blue Knuckles now uses Super/Hyper Sonic's PalCycle
 +
</syntaxhighlight>
 +
''Note that this code changes only the color of Super/Hyper Blue Knuckles, this means that it doesn't add Hyper Sonic "Flashing Stars".''
 +
 
 +
 
 +
===How to Fix Super/Hyper Blue Knuckles using a custom palette cycle (complete fix)===
 +
 
 +
If you want Super/Hyper Blue Knuckles to be more "original" you could create a different palette cycle for Super and Hyper Blue Knuckles by just messing around with the ''SuperHyper_PalCycle (SuperSonic_PalFlash)'' subroutine, at label ''SuperHyper_PalCycle_NormalKnuckles (loc_393C)''.
 +
 
 +
The cycle that overrides the palette every frame is in that section and the palettes that the code overwrites are at the bottom of the subroutine: you could just add a palette array by creating a copy of ''PalCycle_SuperHyperKnuckles (AnPal_SuperSonic_6)'', renaming it ''PalCycle_SuperHyperBlueKnuckles'' and editing every line to make Super/Hyper Blue Knuckles similar to "Super/Hyper Knuckles but blue".
 +
 
 +
Than just change this:
 +
<syntaxhighlight lang="asm">
 +
; loc_393C:
 +
SuperHyper_PalCycle_NormalKnuckles:
 +
...
 +
; increment palette frame and update Knuckles' palette
 +
lea (PalCycle_SuperHyperKnuckles).l,a0
 +
...
 
</syntaxhighlight>
 
</syntaxhighlight>
''Note that this code changes only the color of Super / Hyper Blue Knuckles, this means that it doesn't add Hyper Sonic "Flashing Stars".''
+
 
 +
 
 +
Into ''something like this'':
 +
<syntaxhighlight lang="asm">
 +
SuperHyper_PalCycle_NormalKnuckles:
 +
...
 +
; increment palette frame and update Knuckles' palette
 +
cmpi.w #4,(Player_mode).w ; check character 4
 +
beq.s SuperHyper_PalCycle_BlueKnuckles ; if Blue Knuckles branch (use bhs for 4, 5, 6, 7, ...)
 +
lea (PalCycle_SuperHyperKnuckles).l,a0 ; load Knuckles' palette cycle
 +
bra.s SuperHyper_PalCycle_ReadyK ; ready to apply palette
 +
 
 +
SuperHyper_PalCycle_BlueKnuckles:
 +
lea (PalCycle_SuperHyperBlueKnuckles).l,a0 ; load Blue Knuckles' palette cycle
 +
 
 +
SuperHyper_PalCycle_ReadyK:
 +
...
 +
</syntaxhighlight>
 +
''Note: I know this isn't perfect but I feel like it's the fastest way to do it.''
 +
 
 +
And there you have it! A true Super/Hyper form for our beloved Blue Knucles.
  
 
----
 
----
  
''(Anyways)'' Enjoy your new “Character”!
+
''(Anyways)'' Now you can really enjoy your new “Character”!
  
 
{{S3KHowtos}}
 
{{S3KHowtos}}

Revision as of 11:38, 9 January 2019

(Original guide by Tamkis)

(Additional and optional steps by AlexShx)

Who is Blue Knuckles: the bug explained

Most people do not know, but in S3&K, there is a “hidden character” that is “unlockable” via Game Genie/Action Replay codes. This hidden character is Blue Knuckles. He is more than a palette change of the normal Red Knuckles; actually, he is identified internally as the character used for values greater than 3 for the variable player_mode. This variable, as the name states, determines what character(s) are in the game. The values are as follows:

  • #0. Sonic & Tails
  • #1. Sonic alone
  • #2. Tails alone
  • #3. Red Knuckles
  • #4+.Blue Knuckles

The problem with making Blue Knuckles a playable character, however, is that he is not blue in the Special Stages, and most of his level events fail to work. In the Special Stages, he transforms into Sonic (lol). These errors happen, because Sega, in the asm code of S3&K (sonic3k.asm), mostly used comparison statements such as this:

	cmpi.w		#3,(Player_mode).w
	bne.s		[label]


The label jumped to in statements like that would do something specific for when the player_mode is NOT 3 (Red Knuckles). Blue Knuckles is player_mode ID #4, so, with that statement, the game would goto the label meant for Sonic &/or Tails player modes, which is not what we want. We want Blue Knuckles to do the code after the bne.s, which is meant for Red Knuckles. This guide will fix statements of this format

The other comparison statement that is causing problems is in this format:

	cmpi.w		#3,(Player_mode).w	
	beq.s		[label]


If player_mode is #3 (Red Knuckles), the game will jump to a label for special processing for Knuckles events &c. If player_mode is NOT #3 (Red Knuckles), then the game will execute code for Sonic &/or Tails. Since Blue Knuckles (ID #4) is NOT ID #3, the game will execute Sonic &/or Tails code for Blue Knuckles, which is not what we want. We want Blue Knuckles to execute code for Red Knuckles. This guide will also fix statements of this format.


Making Blue Knuckles selectable

Save Screen

However, before we fix level events and other similar things for Blue Knuckles, let us make him a character that can be selected through ordinary means, without GG/AR codes. First, let us make him a selectable character in the Save Screen.

In the sonic3k.asm file in your S3&K .svn disasm, goto label SaveScreen_MainLoop / loc_C802 It should look something like this:

; loc_C802
SaveScreen_MainLoop:
		move.b	#$1E,(V_int_routine).w
		jsr	(Wait_VSync).l
		addq.w	#1,(Level_frame_counter).w
		jsr	(Process_Sprites).l
		move.w	(Camera_X_pos_copy).w,d0
		neg.w	d0
		move.w	d0,(H_scroll_buffer+2).w
		jsr	(Render_Sprites).l
		lea	(Normal_palette_line_3+$2).w,a0
		moveq	#$E,d0
		move.w	($FFFFE666).w,d1
		addq.w	#1,d1
		cmpi.w	#3,d1
		bcs.s	+
		moveq	#0,d1


Change this:

		addq.w	#1,d1
		cmpi.w	#3,d1


To this:

		addq.w	#1,d1
		cmpi.w	#4,d1


Then, goto label Obj_SaveScreen_NoSave_Slot / Obj_SaveScreen_D30C It should look something like this:

Obj_SaveScreen_NoSave_Slot:
		move.b	#$F,$1D(a0)
		move.w	($FFFFEF4C).w,d0
		addq.w	#3,d0
		move.b	d0,$22(a0)
		tst.b	($FFFFEF4B).w
		bne.s	loc_D396


Change this:

	addq.w	#3,d0


To this:

	addq.w	#4,d0


Afterwards, go to subprgm sub_D6D0; it should look like this:

sub_D6D0:

		moveq	#0,d2
		tst.w	($FFFFB07A).w
		bne.s	loc_D6FA
		move.b	(Ctrl_1_pressed).w,d1
		lsr.w	#1,d1
		bcc.s	loc_D6EE
		moveq	#$5B,d2
		addq.w	#1,d0
		cmpi.w	#3,d0
		bls.s	loc_D6FA
		moveq	#0,d0
		bra.s	loc_D6FA
; ---------------------------------------------------------------------------


Change this:

	cmpi.w	#3,d0


To this:

	cmpi.w	#4,d0


Furthermore, goto label loc_D6EE. It should look like this:

loc_D6EE:
		lsr.w	#1,d1
		bcc.s	loc_D6FA
		moveq	#$5B,d2
		subq.w	#1,d0
		bpl.s	loc_D6FA
		moveq	#3,d0


Change this:

	moveq	#3,d0


To this:

	moveq	#4,d0


Those modifications changed the max player_mode for the Save Screen, from #3 (Red Knuckles) to #4 (Blue Knuckles). Note that Blue Knuckles’ picture in the Save screen shows part of the “Del” sign seen when deleting a save, instead of a picture of a blue Knuckles. You will have to repoint manually the art to a suitable picture for blue knuckles. Use SonMapED and modify General\Save Menu\Map - Save Screen General.asm

Level Select Screen

Next, we will fix the character select for the Level Select screen. This character selection is done by pressing C on the level select screen. Pressing C will increment the player_mode. As before, we will change the max character from #3 (Red Knuckles) to #4 (Blue Knuckles).

There is only on step to fix it here. Goto loc_7F46 . It should look like this:

loc_7F46:
		btst	#5,(Ctrl_1_pressed).w
		beq.s	locret_7F60
		addq.w	#1,(Player_option).w
		cmpi.w	#4,(Player_option).w
		bcs.s	locret_7F60
		move.w	#0,(Player_option).w


Change this:

	cmpi.w	#4,(Player_option).w


To this:

	cmpi.w	#5,(Player_option).w


Fixing bugs

Now that Blue Knuckles is now available for selection by normal means, we still have to fix all of his level events and other bugs. To do so, we will have to fix the player_mode comparison statements that were shown before. Search for every instance of “cmpi.w #3, (player_mode).w"

If the statement afterwards is “beq.s [label]”, change it to “bcc.s [label]”. If the statement afterwards is “bne.s [label]”, change it to “bcs.s [label]”.

If you did all of the replacements correctly, all of the level events and most other things for Blue Knuckles will work. But wait! In replacing ALL of those conditional statements, you inadvertently made player #4 (Blue Knuckles) red and fixed the bugs that made him blue! The following steps will restore the bugs that made player #4 blue.

Goto the following labels and revert what you changed back to the original code; i.e. change “bcc.s [label]” to “beq.s [label]”. i.e. change “bcs.s [label]” to “bne.s [label]”.


The labels, and what reverting the code back does:

  • loc_61BE - Makes player #4 blue above water.
  • loc_7A18 - Makes player #4 blue underwater.
  • loc_8284 - Makes player #4 blue in Special Stages.
  • loc_55C84 - Makes player #4 blue when entering the pyramid after SOZ miniboss.

If you did that step and all of the other steps right, you should now be able to select Blue Knuckles from the Save and Level Select Screens. Most of the bugs involving Blue Knuckles should be fixed now too.


Additional step 1: Fix End of Level Signpost

Now, as soon as we can, we have to fix the end of level signpost graphic for Blue Knuckles. This is as easy as weird.

Go to FrameArray_EndSign, change this:

FrameArray_EndSign:	dc.b	0,   0,	  1,   2


To this:

FrameArray_EndSign:	dc.b	0,   0,	  1,   2,   2,   2,   2,   2		; Equivalent characters: 00 ST, 01 S, 02 T, 03 K, 04 BK, 05 BK, 06 BK, 07 BK


Done. This loads and displays the variant #2 of the End Signpost instead of a null one, and since Knuckles' palette is blue, the displayed character will be Blue Knuckles.


Additional step 2: Revert to blue palette after Super/Hyper Transformation

Ok, now we need to fix Super/Hyper Blue Knuckles reverting back in Red to his "normal form". This happens because he uses the "Red" Knuckles' palette transition when reverting back to "normal form".

Go to SuperHyper_PalCycle_Revert / loc_37EE:

It should look like this:

; loc_37EE:
SuperHyper_PalCycle_Revert:	; runs the fade in transition backwards
		cmpi.w	#2,(Player_mode).w	; If Tails or Knuckles, branch, making this code Sonic-specific
		bhs.s	SuperHyper_PalCycle_RevertNotSonic		; (loc_3820 in older disassemblies)

; SuperHyper_PalCycle_RevertSonic:
		; run frame timer
		subq.b	#1,(Palette_timer).w		; ($FFFFF65E in older disassemblies)
		bpl.s	locret_37EC
		move.b	#3,(Palette_timer).w		; ($FFFFF65E in older disassemblies)

		; decrement palette frame and update Sonic's palette
		lea	(PalCycle_SuperSonic).l,a0
		move.w	(Palette_frame).w,d0		; ($FFFFF65C in older disassemblies)
		subq.w	#6,(Palette_frame).w	; previous frame		; ($FFFFF65C in older disassemblies)
		bhs.s	loc_381E		; branch, if it isn't the first frame
		; The following line should be a move.w
		; This causes the fade-in to be bugged
		move.b	#0,(Palette_frame).w		; ($FFFFF65C in older disassemblies)
		move.b	#0,(Super_Hyper_palette_status).w	; 0 = off		; ($FFFFF65F in older disassemblies)


Ok, now change this:

; loc_37EE:
SuperHyper_PalCycle_Revert:	; runs the fade in transition backwards
		cmpi.w	#2,(Player_mode).w	; If Tails or Knuckles, branch, making this code Sonic-specific
		bhs.s	SuperHyper_PalCycle_RevertNotSonic

; SuperHyper_PalCycle_RevertSonic:
		; run frame timer
		subq.b	#1,(Palette_timer).w
		bpl.s	locret_37EC
		move.b	#3,(Palette_timer).w


To this:

; loc_37EE:
SuperHyper_PalCycle_Revert:	; runs the fade-in transition backwards
		cmpi.w	#4,(Player_mode).w	; Check if character is Blue Knuckles
		beq.s	SuperHyper_PalCycle_RevertSonic	; If charachter is Blue Knuckles branch to Sonic's reverting palette transition
		cmpi.w	#2,(Player_mode).w	; If Tails or Knuckles, branch, making this code Sonic-specific
		bhs.s	SuperHyper_PalCycle_RevertNotSonic	; loc_3820 (doesn't need to be changed as "Blue Knuckles' code" branched before)

SuperHyper_PalCycle_RevertSonic:		; Removing the semicolon makes "SuperHyper_PalCycle_RevertSonic" a label
		; run frame timer
		subq.b	#1,(Palette_timer).w
		bpl.s	locret_37EC
		move.b	#3,(Palette_timer).w


Now Super/Hyper Blue Knuckles uses Super/Hyper Sonic's "reverting" transition wich makes him blue (and pretty) again after Super/Hyper form.


Unfixed bugs

There are some bugs that I am still trying to fix with Blue Knuckles

  • He is messed up in the Slot Bonus Stage. (See optional steps for fast fix)
  • Blue Super/Hyper Knuckles turns Red, but at least reverts Blue. (See optional steps for fast or complete fix)

Optional steps

How to prevent Blue Knuckles from accessing the Slot Bonus Stage (fast fix)

This isn't the best way to do it, but in this case bugged is worse than nothing.

Just go to loc_2D47E and change this:

	...
		beq.s	loc_2D506
		move.b	#2,(Special_bonus_entry_flag).w
		move.w	#$1500,d1
	...


To this:

	...
		beq.w	loc_2D506			; (word used instead of short: jump distance too big)
		move.b	#2,(Special_bonus_entry_flag).w
		move.w	#$1500,d1		; load the Slot Bonus Stage
		cmpi.w	#4,(Player_mode).w		; DWBK 
		bne.s	Slots_STK_DoNotFix		; Skip if not Blue Knuckles
		move.w	#$1400,d1		; Load Pachinko instead of Slot for Blue Knuckles (or you can set it to $1300 to load the Gumball Machine)
Slots_STK_DoNotFix:
	...


How to "Fix" Super/Hyper Blue Knuckles using Super/Hyper Sonic's palette cycles (fast fix)

In my case, since I don't want to make Super/Hyper Blue Knuckles appear like a "bad copy" of his famous red brother nor create a custom palette cycle I figured out how to make his palette flash like Sonic's, "fixing" the "Blue Super/Hyper Knuckles turns Red" bug listed above.

Fixing is very very simple. Go to SuperHyper_PalCycle_Normal (loc_3854):

; loc_3854:
SuperHyper_PalCycle_Normal:
		cmpi.w	#2,(Player_mode).w		; If Tails...
		beq.w	SuperHyper_PalCycle_NormalTails
		cmpi.w	#3,(Player_mode).w		; ...or Knuckles, branch, making this code Sonic-specific
		bcc.w	SuperHyper_PalCycle_NormalKnuckles			; "Blue Knuckles Fix": "beq.w" to "bcc.w" (fixed before)
		tst.b	(Super_Sonic_Knux_flag).w	; If Hyper Sonic, branch
		bmi.s	SuperHyper_PalCycle_HyperSonic


Ok, now revert "bcc.w" in "beq.w". Change this:

		bcc.w	SuperHyper_PalCycle_NormalKnuckles			; "Blue Knuckles Fix": "beq.w" to "bcc.w" (fixed before)


To this:

		beq.w	SuperHyper_PalCycle_NormalKnuckles			; Super/Hyper Blue Knuckles now uses Super/Hyper Sonic's PalCycle

Note that this code changes only the color of Super/Hyper Blue Knuckles, this means that it doesn't add Hyper Sonic "Flashing Stars".


How to Fix Super/Hyper Blue Knuckles using a custom palette cycle (complete fix)

If you want Super/Hyper Blue Knuckles to be more "original" you could create a different palette cycle for Super and Hyper Blue Knuckles by just messing around with the SuperHyper_PalCycle (SuperSonic_PalFlash) subroutine, at label SuperHyper_PalCycle_NormalKnuckles (loc_393C).

The cycle that overrides the palette every frame is in that section and the palettes that the code overwrites are at the bottom of the subroutine: you could just add a palette array by creating a copy of PalCycle_SuperHyperKnuckles (AnPal_SuperSonic_6), renaming it PalCycle_SuperHyperBlueKnuckles and editing every line to make Super/Hyper Blue Knuckles similar to "Super/Hyper Knuckles but blue".

Than just change this:

; loc_393C:
SuperHyper_PalCycle_NormalKnuckles:
	...
		; increment palette frame and update Knuckles' palette
		lea	(PalCycle_SuperHyperKnuckles).l,a0
	...


Into something like this:

SuperHyper_PalCycle_NormalKnuckles:
	...
		; increment palette frame and update Knuckles' palette
		cmpi.w	#4,(Player_mode).w		; check character 4
		beq.s	SuperHyper_PalCycle_BlueKnuckles		; if Blue Knuckles branch (use bhs for 4, 5, 6, 7, ...)
		lea	(PalCycle_SuperHyperKnuckles).l,a0		; load Knuckles' palette cycle
		bra.s SuperHyper_PalCycle_ReadyK		; ready to apply palette

SuperHyper_PalCycle_BlueKnuckles:
		lea	(PalCycle_SuperHyperBlueKnuckles).l,a0		; load Blue Knuckles' palette cycle

SuperHyper_PalCycle_ReadyK:
	...

Note: I know this isn't perfect but I feel like it's the fastest way to do it.

And there you have it! A true Super/Hyper form for our beloved Blue Knucles.


(Anyways) Now you can really enjoy your new “Character”!

SCHG How-To Guide: Sonic the Hedgehog 3 and Knuckles
Fixing Bugs
Fix Blue Knuckles | Fix Tails' Respawn Speeds | Fix Super Sonic Bugs
Design Choices
Fix Scattered Rings' Underwater Physics | Edit Level Select Text & Pointers | Work with Water | Make the Slots Bonus Game Rotate Smoothly
Adding Features
Restore (Sonic 2) Options Menu