https://info.sonicretro.org/api.php?action=feedcontributions&user=RetroUser&feedformat=atomSonic Retro - User contributions [en]2024-03-28T17:53:39ZUser contributionsMediaWiki 1.30.2https://info.sonicretro.org/index.php?title=SCHG_How-to:Guide&diff=210791SCHG How-to:Guide2014-07-10T21:33:06Z<p>RetroUser: </p>
<hr />
<div>The '''SCHG How-to''': series is a spinoff from the [[SCHG:Sonic Community Hacking Guide|Sonic Community Hacking Guide]] with a focus on how-to, tutorials, and supplementary education. Whereas the traditional SCHG serves more as a map for users to navigate a ROM for themselves, the How-to series is more a "how to get from point A to point B" set of directions. Tutorials range from the very basic to very complex, with an eye towards making sure no part of the process is assumed or left out. <br />
<br />
==General How-Tos==<br />
* [[SCHG How-to:Work with Motorola 68000 assembly|Work with Motorola 68000 Assembly]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Work with Objects|Work with Objects]] (by [[Malevolence]] and [[MarkeyJester]])<br />
* [[SCHG How-to:Use a Hex Editor|Use a Hex Editor]] (by [[Scarred Sun]])<br />
* [[SCHG How-to:Edit palettes using hex|Edit Palettes Using Hex]] (by [[Scarred Sun]])<br />
* [[SCHG How-to:Use SonMapEd/Part 1|Use SonMapEd/Part 1]] (by [[Chimpo]])<br />
* [[SCHG How-to:Use SonMapEd/Part 2|Use SonMapEd/Part 2]] (by [[Chimpo]])<br />
* [[SCHG How-to:Import Art to SonED2|Import Art to SonED2]] (by [[iojnekns]])<br />
* [[SCHG How-to:Set Up SonLVL|Set Up SonLVL]] (by [[MainMemory]])<br />
<br />
==Game-Specific==<br />
===''Sonic 1''===<br />
====Fixing Bugs====<br />
These guides describe the steps to take to fix bugs that are present in the original game or bugs that occur after altering something in the game.<br />
* [[SCHG How-to:Fix demo playback|Fix Demo Playback]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix a race condition with Pattern Load Cues|Fix a Race Condition with Pattern Load Cues]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix the SEGA Sound|Fix the SEGA Sound]] (by [[Puto]])<br />
* [[SCHG How-to:Display the Press Start Button text|Display the Press Start Button Text]] (by [[Quickman]])<br />
* [[SCHG How-to:Fix the Level Select menu in Sonic 1|Fix the Level Select Menu]] (by [[STHX]])<br />
* [[SCHG How-to:Fix the Hidden Points bug in Sonic 1|Fix the Hidden Points Bug]] (by [[1337Rooster]])<br />
* [[SCHG How-to:Fix Accidental Deletion of Scattered Rings#Sonic 1 Fix|Fix Accidental Deletion of Scattered Rings]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix Ring Timers|Fix Ring Timers]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the Walk-Jump Bug in Sonic 1|Fix the Walk-Jump Bug]] (by [[Cinossu]])<br />
* [[SCHG How-to:Correct Drowning Bugs in Sonic 1|Correct Drowning Bugs]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the death boundary bug|Fix the Death Boundary Bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the camera follow bug|Fix the Camera Follow Bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the DAC fade in bug|Fix the DAC Fade In Bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the HUD blinking|Fix the HUD Blinking]] (by [[Quickman]])<br />
* [[SCHG How-to:Fix the Level Select graphics bug|Fix the Level Select Graphics Bug]] (by [[MarkeyJester]])<br />
<br />
====Changing Design Choices====<br />
These guides describe how you can alter some behaviors in the game that might not be to your liking.<br />
* [[SCHG How-to:Change Spike behavior in Sonic 1|Change Spike Behavior]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix the Special Stage jumping physics|Fix the Special Stage Jumping Physics]] (by [[Mercury]])<br />
* [[SCHG How-to:Improve the fade in\fade out progression routines in Sonic 1|Improve the Fade In\Fade Out Progression Routines]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 1 fix|Fix Scattered Rings' Underwater Physics]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Remove the Speed Cap|Remove the Speed Cap]] (by [[Tweaker]] and [[Puto]])<br />
* [[SCHG How-to:Port the REV01 Background Effects|Port the REV01 Background Effects]] (by [[jman2050]])<br />
* [[SCHG How-to:Port Sonic 2's Level Art Loader to Sonic 1|Port Sonic 2's Level Art Loader]] (by [[User:Clownacy|Clownacy]])<br />
* [[SCHG How-to:Retain Rings Between Acts in Sonic 1|Retain Rings Between Acts]] (by [[Afti]])<br />
* [[SCHG How-to:Sonic 2 (Simon Wai Prototype) Level Select in Sonic 1|Add Sonic 2 (Simon Wai Prototype) Level Select]] (by [[User:Kram1024|Kram1024]])<br />
<br />
====Adding Features====<br />
These guides describe step-by-step how to add new features in the game. After following one of these guides, the feature should be fully functional in the game with no further work.<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 1|Add Spin Dash/Part 1]] (by [[Lightning]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 2|Add Spin Dash/Part 2]] (by [[Puto]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 3|Add Spin Dash/Part 3]] (by [[shobiz]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 4|Add Spin Dash/Part 4]] (by [[Mercury]])<br />
* [[SCHG How-to:Have a functional Eggman monitor in Sonic 1|Have a Functional Eggman Monitor]] (by [[nineko]])<br />
<br />
====Sound Features====<br />
These guides cover the application of music and sound effects in the game. After following these guides, porting and adding original music should be possible.<br />
* [[SCHG How-to:Expand the music index from $94 to $9F|Expand the Music Index from $94 to $9F]] (by [[lukeusher123]])<br />
* [[SCHG How-to:Extend Music Slots in Sonic 1|Extend Music Slots]] (by [[Mikel]])<br />
* [[SCHG How-to:Play different songs on different acts|Play Different Songs on Different Acts]] (by [[nineko]])<br />
* [[SCHG How-to:Expand the music index to start at $00 instead of $80|Expand the Music Index to Start at $00 Instead of $80]] (by [[HPZMan]])<br />
* [[SCHG How-to:Port Sonic 2 Final Sound Driver to Sonic 1|Port Sonic 2 Final Sound Driver]] (by [[User:Kram1024|Kram1024]])<br />
* [[SCHG How-to:Port Sonic 3's Sound Driver to Sonic 1|Port Sonic 3 Sound Driver]] (by [[User:Kram1024|Kram1024]])<br />
<br />
====Extending the Game====<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content.<br />
* [[SCHG How-to:Load chunks from ROM in Sonic 1|Load Chunks From ROM]] (by [[FraGag]])<br />
* [[SCHG How-to:Add Extra Characters|Add Extra Characters]] (by [[Sonic 65]])<br />
* [[SCHG How-to:Make an Alternative Title Screen|Make an Alternative Title Screen]] (by [[JcFerggy]])<br />
* [[SCHG How-to:Use Dynamic Tilesets in Sonic 1|Use Dynamic Tilesets]] (by [[HPZMan]])<br />
* [[SCHG How-to:Separate title art from GHZ/make GHZ load alternate art|Separate Title Art From GHZ/Make GHZ Load Alternate Art]] (by [[MKAmeX]])<br />
* [[SCHG How-to:Add a new zone in Sonic 1|Add a New Zone]] (by [[FraGag]])<br />
* [[SCHG How-to:Set up the Goggle Monitor to work with it|Set Up the Goggle Monitor to Work with it]] (by [[Selbi]])<br />
* [[SCHG How-to:Add new moves in Sonic 1|Add New Moves]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:Dynamic Collision system in Sonic 1|Add a Dynamic Collision System]] (by [[User:theocas|theocas]])<br />
* [[SCHG How-to:Dynamic Special Stage Walls system|Dynamic Special Stage Walls System]] (by [[Mercury]])<br />
* [[SCHG How-to:Extend the Sonic 1 sprite mappings and art limit|Extend the Sonic 1 Sprite Mappings and Art Limit]] (by [[User:MarkeyJester|MarkeyJester]])<br />
* [[SCHG How-to:Enigma Credits in Sonic 1|Add Enigma Credits]] (by [[User:Fukuller|Fukuller]])<br />
<br />
====Miscellaneous====<br />
* [[SCHG How-to:Convert the Hivebrain 2005 disassembly to ASM68K|Convert the Hivebrain 2005 Disassembly to ASM68K]] (by [[Puto]])<br />
<br />
====[[Qjimbo]]'s Split Disassembly Guides====<br />
These guides were formerly hosted on '''[[The Glowing Bridge]]'''.<br />
* [[SCHG How-to:Set up a Sonic 1 split disassembly|Set up a Sonic 1 Split Disassembly]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic Level Editing|S1 Split Guides/Basic Level Editing]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic Art Editing|S1 Split Guides/Basic Art Editing]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic ASM Editing (Spin Dash)|S1 Split Guides/Basic ASM Editing (Spin Dash)]] (by [[Qjimbo]])<br />
<br />
===''Sonic 2''===<br />
====Fixing Bugs====<br />
* [[SCHG How-to:Fix demo playback|Fix Demo Playback]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix a race condition with Pattern Load Cues|Fix a Race Condition with Pattern Load Cues]] (by [[FraGag]])<br />
* [[SCHG_How-to:Fix bugs relating to Super Sonic|Fix Bugs Relating to Super Sonic]] (by [[MoDule]])<br />
* [[SCHG_How-to:Use correct height when roll jumping|Use Correct Height When Roll Jumping]] (by [[MoDule]])<br />
* [[SCHG_How-to:Fix jump height bug when exiting water|Fix Jump Height Bug When Exiting Water]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix Sonic 2's buggy spindash code and add spindash speeds|Fix Sonic 2's Buggy Spin Dash Code and Add Spin Dash Speeds]] (by [[GARY 'M 9]])<br />
* [[SCHG_How-to:Fix screen boundary spindash bug|Fix Screen Boundary Spin Dash Bug]] (by [[Flamewing]])<br />
* [[SCHG How-to:Correct Drowning Bugs in Sonic 2|Correct Drowning Bugs]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix_camera_y_position_for_Tails|Fix Camera Y Position for Tails]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix Tails subanimation error|Fix Tails Subanimation Error]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Tails' respawn speeds|Fix Tails' Respawn Speeds]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Accidental Deletion of Scattered Rings#Sonic 2 Fix|Fix Accidental Deletion of Scattered Rings]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix Ring Timers|Fix Ring Timers]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Rexon crash|Fix Rexon Crash]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix monitor collision bug|Fix Monitor Collision Bug]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the EHZ Deformation bug|Fix the EHZ Deformation Bug]] (by [[qiuu]])<br />
* [[SCHG How-To:Correct CPZ boss attack behavior|Correct CPZ Boss Attack Behavior]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix bug in ARZ Boss arrow's platform behavior|Fix Bug in ARZ Boss Arrow's Platform Behavior]] (by [[MoDule]]) (addition by [[redhotsonic]])<br />
* [[SCHG How-to:Fix ARZ Boss Walking on Air Glitch|Fix ARZ Boss Walking on Air Glitch]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix ARZ boss sprite behavior|Fix ARZ Boss Sprite Behavior]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix multiple CNZ boss bugs|Fix Multiple CNZ Boss Bugs]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Hill Top's background scrolling mountains|Fix HTZ's Background Scrolling Mountains]] (by [[flamewing]])<br />
* [[SCHG How-to:Fix_the_OOZ_launcher_speed_up_glitch|Fix the OOZ Launcher Speed Up Glitch]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix DEZ Eggrobo boss collision glitch|Fix DEZ Eggrobo Boss Collision Glitch]] (by [[flamewing]])<br />
* [[SCHG How-to:Fix Boss Deconstruction Behavior|Fix Boss Deconstruction Behavior]] (by [[Esrael]] & [[redhotsonic]])<br />
* [[SCHG How-to:Fix Speed Bugs in Sonic 2|Fix Speed Bugs]] (by [[redhotsonic]])<br />
<br />
====Changing Design Choices====<br />
* [[SCHG How-to:Remove the Air Speed Cap|Remove the Air Speed Cap]] (by [[Selbi]] and [[Puto]])<br />
* [[SCHG How-to:Disable floor collision while dying|Disable Floor Collision While Dying]] (by [[Esrael]])<br />
* [[SCHG How-to:Modify Transformation Behavior in Sonic 2|Modify Super Sonic Transformation Methods & Behavior]] (by [[vladikcomper]] & [[redhotsonic]])<br />
* [[SCHG How-to:Enable/Disable Tails in certain levels|Enable/Disable Tails in Certain Levels]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG_How-to:Collide with water after being hurt|Collide with Water After Being Hurt]] (by [[MoDule]])<br />
* [[SCHG How-to:Retain Rings when returning at a Star Post|Retain Rings When Returning at a Star Post]] (by [[Mercury]])<br />
* [[SCHG How-to:Improve the fade in\fade out progression routines in Sonic 2|Improve the Fade In\Fade Out Progression Routines]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 2 fix|Fix Scattered Rings' Underwater Physics]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Insert Labyrinth Zone water ripple effect in Sonic 2|Insert LZ Water Ripple Effect]] (by [[MoDule]])<br />
* [[SCHG_How-to:Restore lost CPZ boss feature|Restore Lost CPZ Boss Feature]] (by [[Esrael]])<br />
* [[SCHG How-to:Prevent SCZ Tornado spin dash death|Prevent SCZ Tornado Spin Dash Death]] (by [[Esrael]])<br />
* [[SCHG How-to:Improve ObjectMove subroutines|Improve ObjectMove Subroutines]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Port Sonic 3k's rings manager to Sonic 2|Port S3K's Rings Manager]] (by [[shobiz]])<br />
* [[SCHG_How-to:Port S3K Object Manager into Sonic 2|Port S3K's Object Manager]] (by [[MoDule]])<br />
* [[SCHG How-to:Port S3K Priority Manager into Sonic 2|Port S3K's Priority Manager]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Edit the Level Order in Sonic 2 with ASM|Edit the Level Order in Sonic 2 with ASM]] (by [[Malevolence]] and [[Metal_Man88]])<br />
* [[SCHG How-to:Alter the Ring Requirements in the Special Stages|Alter the Ring Requirements in the Special Stages]] (by [[Mercury]])<br />
* [[SCHG How-to:Change the Special Stage characters to use normal DPLCs|Change the Special Stage Characters to Use Normal DPLCs]] (by [[Flamewing]])<br />
* [[SCHG_How-to:Speed Up Ring Loss Process (With Underwater)|Speed Up Ring Loss Process (w/ Underwater)]] (by [[redhotsonic]])<br />
<br />
====Adding Features====<br />
* [[SCHG How-to:Create Insta-kill and High Jump Monitors|Create Insta-kill and High Jump Monitors]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG How-to:Create Clone and Special Stage Monitors|Create Clone and Special Stage Monitors]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG How-to:Port Knuckles into Sonic 2|Port Knuckles]] (by [[MainMemory]])<br />
<br />
====Sound Features====<br />
* [[SCHG How-to:Port Sonic 1's Sound Driver to Sonic 2|Port Sonic 1 Sound Driver]] (by [[Tweaker]])<br />
* [[SCHG How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|Port Sonic 2 Clone Driver]] (by [[Caverns 4]])<br />
* [[SCHG How-to:Port Sonic 3's Sound Driver to Sonic 2|Port Sonic 3 Sound Driver]] (by [[User:Kram1024|Kram1024]])<br />
* [[SCHG How-to:Expand the music index to start at $00 instead of $80 (Sonic 2 Clone Driver version)|Expand the Music Index to Start at $00 Instead of $80 (Sonic 2 Clone Driver Version)]] (by [[Mikel]], based on a guide by [[HPZMan]])<br />
<br />
====Extending the Game====<br />
* [[SCHG How-to:Extend the level index past $10 in Sonic 2|Extend the Level Index Past $10]] (by [[User:Kram1024|kram]])<br />
* [[SCHG_How-to:Extend the Level Select in Sonic_2|Extend the Level Select]] (by [[User:Clownacy|Clownacy]])<br />
* [[SCHG How-to:Extend the water tables in Sonic 2|Extend the Water Tables]] (by [[Dani]])<br />
* [[SCHG How-to:Add Extra Characters To Sonic 2|Add Extra Characters]] (by [[User:ManicRemix|Manic Remix]])<br />
* [[SCHG_How-to:Free up 2 universal SSTs|Free Up 2 Universal SSTs]] (by [[redhotsonic]])<br />
<br />
===''Sonic 2 Master System''===<br />
* [[SCHG How-to:Add Dynamic Palettes to Sonic 2 SMS|Add Dynamic Palettes]] (by [[Mikel]])<br />
* [[SCHG How-to:Relocate Player Object Logic in Sonic 2 SMS|Relocate Player Object Logic]] (by [[Glitch]])<br />
* [[SCHG How-to:Add a Custom Badnik to Sonic 2 SMS|Add a Custom Badnik]] (by [[Glitch]])<br />
* [[SCHG How-to:Add a New Monitor in Sonic 2 SMS|Add a New Monitor]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:Add a Second Digit To the Lifecounter in Sonic 2 SMS|Add a Second Digit to the Lifecounter]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:How to Add new tiles in different acts in Sonic 2 SMS|How to Add New Tiles in Different Acts]] (by [[User:Ravenfreak|Ravenfreak]])<br />
<br />
===''Sonic 3 & Knuckles''===<br />
*[[SCHG How-to:Work with Water in S3K|Work with Water in S3K]] (by [[Katelynn]])<br />
*[[SCHG How-to:Restore Sonic 2 Menus to Sonic 3|Restore Sonic 2 Menus]] (by [[Mustapha]])<br />
*[[SCHG How-to:Fix Blue Knuckles|Fix Blue Knuckles]] (by [[User:Tamkis|Tamkis]])<br />
*[[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 3&K fix|Fix Scattered Rings' Underwater Physics]] (by [[redhotsonic]])<br />
*[[SCHG How-to:Fix Tails' respawn speeds#Sonic 3K fix|Fix Tails' Respawn Speeds]] (by [[redhotsonic]])<br />
<br />
===''Sonic Advance 3''===<br />
*[[SCHG How-to:Switch Characters for Nonaggression|Switch Characters For Nonaggression]] (by [[Erik JS]])<br />
<br />
===''Sonic Adventure 1/DX''===<br />
*[[SCHG How-to:Edit Sonic Adventure levels|Edit Sonic Adventure Levels]] (by [[Polygon Jim]])<br />
<br />
===''Sonic Generations''===<br />
*[[SCHG How-to:Import Levels Into Sonic Generations|Import Levels]] (by [[Sky The Destroyer]])<br />
*[[SCHG How-to:Create Breakable Objects In Sonic Generations|Create Breakable Objects]] (by [[Paraxade]])<br />
*[[SCHG How-to:Create Splines For Sonic Generations|Create Splines]] (by [[Faseeh]])<br />
<br />
To add your own how-to, simply add an article with SCHG How-to: before the name, which will register it with the correct namespace.<br />
<br />
[[Category:SCHG How-tos| ]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_-_The_Lost_Land_2&diff=210786Sonic - The Lost Land 22014-07-09T19:59:10Z<p>RetroUser: </p>
<hr />
<div>{{Hack<br />
|screen=Sonic - The Lost Land 2.png<br />
|version=Version 2<br />
|date=15/07/07<br />
|system=Sega Mega Drive<br />
|originalgame=Sonic the Hedgehog 2 (16-bit)<br />
|credits=[[Shadow Fire]], [[drx]], [[OrdosAlpha]],<br/> [[StephenUK]], [[Dr. Eggfan]], [[Tweaker]], [[KojiChao]], <br/>[[Esrael]], [[Stealth]], [[xenoSonic]]<br />
|visualmods=yes<br />
|audiomods=<br />
|layoutmods=yes<br />
|basicenginemods=<br />
|advenginemods=<br />
}}<br />
<br />
'''''Sonic: The Lost Land 2''''' is a hack of ''[[Sonic the Hedgehog 2 (16-bit)|Sonic the Hedgehog 2]]'' for the [[Sega Mega Drive/Genesis]] by [[Shadow Fire]]. The game is comprised of 11 levels, each filled with dangers you must overcome in order to stop the plans of the maniacal Dr. Eggman. Only palettes, some slight layout changes and various other small modifications have been made for the time being, since this hack is on hold for [[Sonic - The Lost Land]].<br />
<br />
==Story==<br />
The Lost Land. A beautiful island paradise, once inhabited by creatures known only as the ancients. After managing to overthrow the maniacal Eggman's previous plot, Sonic stumbles across a hidden part of the Lost Land. Unfortunately, Eggman found it first, and has already set up base to work on his next evil plot. With Shadow gone, having left the Lost Land after helping out beforehand, it's only up to the blue hedgehog to save the world from whatever Eggman is planning.<br />
<br />
==Characters==<br />
Sonic - The Lost Land 2 only allows for one playable character, with the evil Dr Eggman as the antagonist. Although by using savestates, you can add [[Tails]] to the game.<br />
<br />
===Sonic the Hedgehog===<br />
[[Image:Sonic06 2.png|right|60px]]<br />
Sonic is a blue, 15-year-old hedgehog who lives on the planet Earth. He has the ability to run at supersonic speeds, hence his name. He is always running all over the world, rarely stopping for anything. He is carefree and relaxed; however, he is also very intolerant of injustice, and he will do anything he can to help those in need. He has also got a quick wit, short temper, and a fairly large ego.<br />
<br />
===Dr Ivo Robotnik (EGGMAN)===<br />
[[Image:Shadowth eggman.png|right|50px]]<br />
With an IQ of 300, and self-proclaimed the greatest scientific genius in the world, Eggman stops at nothing in his attempts at world conquest. While his plans are constantly foiled by Sonic, this only makes him more determined to conquer the world. Will he succeed?<br />
<br />
==Controls==<br />
In order to execute all the abilities in Sonic - The Lost Land 2, you'll need to know the controls. Here's how you play...<br />
===Basic Moves===<br />
* A button: Jump<br />
* B button: Jump<br />
* C button: Jump<br />
**After collecting all 7 Chaos Emeralds, if you collect at least 50 rings, jumping will transform you into Super Sonic, making you almost invulnerable as well as increasing your speed and giving Sonic a shiny gold look.<br />
<br />
* Down+A/B/C: Spin Dash. Roll up into a ball and shoot off at supersonic speeds to destroy enemies!<br />
<br />
==Items==<br />
[[File:STLL2 items.png]]<br />
<br />
'''Left to right:'''<br><br />
[[Super Ring]], [[Shield]], [[Speed Shoes]], [[Invincibility]], Extra Life, [[Checkpoint]]<br />
<br />
==Levels==<br />
As soon as you press Start in the title screen, you will automatically be taken to the [[Level Select]]. Eleven zones are in the hidden area of the Lost Land, each of them filled with many traps and dangers, intent on putting a stop to Sonic's heroic efforts. These levels are:<br />
*Starlit Shore<br />
*Ancient Amazon<br />
*Sunken Subway<br />
*Magma Mountain<br />
*Pinball Plaza<br />
*Poison Plant<br />
*Daybreak Docks<br />
*Techno Tower<br />
*Air Assault<br />
*Flying Fort<br />
*Cosmic Colony<br />
<br />
==Downloads==<br />
{{download|version=Release 2|file=Sonic - The Lost Land 2 V2.zip|filesize=1,018KB}}<br />
<br />
==External Links==<br />
* [http://srealm.sonicresearch.org/stll2.php ''{{PAGENAME}}'' Official Site]<br />
<br />
<br />
[[Category:Hacks|Lost Land 2, Sonic - The]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Project_Shadow_2&diff=210785Project Shadow 22014-07-09T19:52:25Z<p>RetroUser: </p>
<hr />
<div>{{Hack<br />
|screen=Project Shadow.png<br />
|version=Demo 4 (v1.00)<br />
|system=[[Sega Mega Drive/Genesis]]<br />
|originalgame=Sonic the Hedgehog 2 (16-bit)<br />
|credits=[[JohnnyUK]], [[Ultima]], [[drx]],<br/> [[Dr. Eggfan]], [[Shadowsoft Games|Shadowsoft Testers]], [[User:Neo|Neo]]<br />
|visualmods=yes<br />
|audiomods=<br />
|layoutmods=yes<br />
|basicenginemods=<br />
|advenginemods=}}<br />
'''''Project Shadow 2''''' is a hack of ''[[Sonic the Hedgehog 2]]'' for the [[Sega Mega Drive/Genesis]] by [[JohnnyUK]]. The "2" in its title does not signify that this is a sequel of another hack, but instead simply signifies that it is a ''Sonic 2'' hack.<br />
<br />
In the hack, the player controls [[Shadow the Hedgehog]] and his chao sidekick (much like that of ''[[More Than a Memory: A Perfect Existence]]'') through levels with new palettes and layouts.<br />
<br />
==Trivia==<br />
The art for Shadow used in this hack was expanded upon and reused in ''[[Sonic Megamix]]''.<br />
<br />
You have to search for an ingame password to use to obtain the Bonus Rom. <br />
<br />
==Downloads==<br />
{{Download|file=Project Shadow 2 Demo 4 (v1.00).zip|version=Demo 4 [v1.00]|filesize=1.02MB}}<br />
===Prior Versions===<br />
* [http://info.sonicretro.org/psbonus/psbonus.php Project Shadow Bonus ROM] (password case-sensitive)<br />
* {{file|Project Shadow 2 Demo 3.zip|Project Shadow 2 Demo 3}} (1.03MB)<br />
<br />
[[Category:Hacks]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_-_Code_Gray&diff=210677Sonic - Code Gray2014-07-03T18:32:11Z<p>RetroUser: Cleanup.</p>
<hr />
<div>{{Hack<br />
|screen=Codegray v1 000.png<br />
|date=2010/06/30<br />
|system=Sega Mega Drive/Genesis<br />
|originalgame=Sonic the Hedgehog (16-bit)<br />
|credits=Jdogg<br />
|visualmods=yes<br />
|audiomods=yes<br />
|layoutmods=yes<br />
|basicenginemods=yes<br />
|advenginemods=no<br />
}}<br />
{{stub}}<br />
'''''Sonic - Code Gray''''' is a [[hack]] of ''[[Sonic the Hedgehog (16-bit)|Sonic the Hedgehog]]'' by Jdogg. This hack features new layouts, art, music, and ASM edits. Another feature is "Lights Out Zone", a custom built level which can be accessed by hitting the "?" monitor. Completion of the zone awards you with an extra life/1200 points and warps you to LZ1. <br />
<br />
== Downloads ==<br />
{{Download|version=1.55|file=Sonic - Code Gray v1.55.zip|filesize=419KB}}<br />
<br />
== External Links ==<br />
* {{LinkRetro|topic=14832|title=Sonic - Code Gray}} topic on [[Sonic Retro]] Message Board (v1.3)<br />
<br />
[[Category:Hacks|Code Gray, Sonic]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_-_Code_Gray&diff=210672Sonic - Code Gray2014-07-02T01:27:00Z<p>RetroUser: </p>
<hr />
<div>{{Hack<br />
|screen=Codegray_v1_000.png<br />
|date=30/06/10<br />
|system=Sega Mega Drive/Genesis<br />
|originalgame=Sonic the Hedgehog (16-bit)<br />
|credits=Jdogg<br />
|visualmods=yes<br />
|audiomods=yes<br />
|layoutmods=yes<br />
|basicenginemods=yes<br />
|advenginemods=no<br />
}}<br />
{{stub}}<br />
'''''Sonic - Code Gray''''' is a [[hack]] of ''[[Sonic the Hedgehog (16-bit)|Sonic the Hedgehog]]'' by Jdogg. This hack features new layouts, art, music, and ASM edits. Another feature is "Lights Out Zone", a custom built level which can be accessed by hitting the "?" monitor. Completion of the zone awards you with an extra life and 1200 points, and warps you to LZ1. <br />
<br />
== Downloads ==<br />
{{Download|version=1.55|file=Sonic_-_Code_Gray.zip|filesize=419KB}}<br />
<br />
== External Links ==<br />
* {{LinkRetro|topic=14832|title=Sonic - Code Gray}} topic on [[Sonic Retro]] Message Board (v1.3)<br />
<br />
[[Category:Hacks|Code Gray, Sonic]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=File:Sonic_-_Code_Gray_v1.55.zip&diff=210671File:Sonic - Code Gray v1.55.zip2014-06-30T20:33:36Z<p>RetroUser: </p>
<hr />
<div>Uploaded the newest version from the SSRG. TODO: Update the screenshot; I'm still working on that.</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_-_Code_Gray&diff=210670Sonic - Code Gray2014-06-30T20:31:59Z<p>RetroUser: Whoops, forgot that!</p>
<hr />
<div>{{Hack<br />
|screen=Codegray_v1_000.png<br />
|date=30/06/10<br />
|system=Sega Mega Drive/Genesis<br />
|originalgame=Sonic the Hedgehog (16-bit)<br />
|credits=Jdogg<br />
|visualmods=yes<br />
|audiomods=yes<br />
|layoutmods=yes<br />
|basicenginemods=yes<br />
|advenginemods=no<br />
}}<br />
{{stub}}<br />
'''''Sonic - Code Gray''''' is a [[hack]] of ''[[Sonic the Hedgehog (16-bit)|Sonic the Hedgehog]]'' by Jdogg. This hack features new layouts, art, music, and ASM edits. Another feature is "Lights Out Zone", which can be accessed by hitting the "?" monitor. Completion of the zone awards you with an extra life and 1200 points, and warps you to LZ1. <br />
<br />
== Downloads ==<br />
{{Download|version=1.55|file=Sonic_-_Code_Gray.zip|filesize=419KB}}<br />
<br />
== External Links ==<br />
* {{LinkRetro|topic=14832|title=Sonic - Code Gray}} topic on [[Sonic Retro]] Message Board<br />
<br />
[[Category:Hacks|Code Gray, Sonic]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_-_Code_Gray&diff=210669Sonic - Code Gray2014-06-30T20:31:11Z<p>RetroUser: Updated for the latest version.</p>
<hr />
<div>{{Hack<br />
|screen=Codegray_v1_000.png<br />
|date=30/06/10<br />
|system=Sega Mega Drive/Genesis<br />
|originalgame=Sonic the Hedgehog (16-bit)<br />
|credits=Jdogg<br />
|visualmods=yes<br />
|audiomods=yes<br />
|layoutmods=yes<br />
|basicenginemods=yes<br />
|advenginemods=no<br />
}}<br />
{{stub}}<br />
'''''Sonic - Code Gray''''' is a [[hack]] of ''[[Sonic the Hedgehog (16-bit)|Sonic the Hedgehog]]'' by Jdogg. This hack features new layouts, art, music, and ASM edits. Another feature is "Lights Out Zone", which can be accessed by hitting the "?" monitor. Completion of the zone awards you with an extra life and 1200 points, and warps you to LZ1. <br />
<br />
== Downloads ==<br />
{{Download|version=1.3|file=Sonic_-_Code_Gray.zip|filesize=419KB}}<br />
<br />
== External Links ==<br />
* {{LinkRetro|topic=14832|title=Sonic - Code Gray}} topic on [[Sonic Retro]] Message Board<br />
<br />
[[Category:Hacks|Code Gray, Sonic]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=File:Sonic_-_Code_Gray_v1.55.zip&diff=210668File:Sonic - Code Gray v1.55.zip2014-06-30T20:09:22Z<p>RetroUser: Uploaded the newest version from the SSRG. TODO: Update the screenshot and edit the wiki page.</p>
<hr />
<div>Uploaded the newest version from the SSRG. TODO: Update the screenshot and edit the wiki page.</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to:Fix_the_Hidden_Points_bug_in_Sonic_1&diff=210667SCHG How-to:Fix the Hidden Points bug in Sonic 12014-06-30T20:07:29Z<p>RetroUser: </p>
<hr />
<div>{{GuideBy|1337Rooster}}<br />
<br />
Alright, now this is a very simple fix. Before I go any further, know that I'm using [[Media:Sonic 1 (Split and Text by Hivebrain)_(ASM68K).zip|Sonic 1 (Split and Text by Hivebrain) (ASM68K)]].<br />
<br />
You may not have noticed this, but ''[[Sonic 1]]'' has a glitch related to the hidden points earned by jumping after the signpost.<br />
<br />
'''To illustrate this bug:'''<br />
<gallery widths="320px" heights="224px" style="margin-left: auto; margin-right: auto; text-align: center"><br />
Image:Points_before.PNG|It's the end of the stage, let's send Sonic in for more points.<br />
Image:Points_after.PNG|Something is wrong here. We have 13230 points, but 2200+100+100+100+1000+10000=13500.<br />
</gallery><br />
<br />
The reason this occurs is because the game only registers 10 points instead of 100 for the 100 point marker displayed on screen. So, you should feel ripped off because Sonic is 90 points short.<br />
<br />
So let's fix this.<br />
<br />
We want to look at Object 7D which is the object for the hidden points earned after the signpost. So hunt down the label '''Obj7D:''' ('''Hint for GitHub Disassembly users''': Look for file called ''_incObj/7D Hidden Bonuses.asm'')<br />
<br />
<asm>; ---------------------------------------------------------------------------<br />
; Object 7D - hidden points at the end of a level<br />
; ---------------------------------------------------------------------------<br />
<br />
Obj7D: ; XREF: Obj_Index<br />
moveq #0,d0<br />
move.b $24(a0),d0<br />
move.w Obj7D_Index(pc,d0.w),d1<br />
jmp Obj7D_Index(pc,d1.w)<br />
...</asm><br />
''This is the object you want''<br />
<br />
If we go through this object's code we will see an array, go to the label '''Obj7D_Points:''' ('''Hint for GitHub Disassembly users''': Look for label called ''@points'')<br />
<br />
<asm>Obj7D_Points: dc.w 0 ; Bonus points array<br />
dc.w 1000<br />
dc.w 100<br />
dc.w 1</asm><br />
''This array represents the points sonic earns for the various types of hidden point objects revealed on screen.''<br />
<br />
The last digit of your score isn't actually stored in memory. Instead, it's always assumed to be zero, forcing all scores to be multiples of 10. The game simply appends the zero to the end when it updates the display.<br />
<br />
So this array tells us:<br />
<br />
* You earn 1000*10 = 10000 points when Sonic reveals a 10000 point object<br />
* You earn 100*10 = 1000 points when Sonic reveals a 1000 point object<br />
* You earn 1*10 = 10 points when Sonic reveals a 100 point object<br />
<br />
So let's fix this so that we get 100 points instead of 10, simply change that 1 to a 10.<br />
<br />
'''Giving us something like this:'''<br />
<br />
<asm>Obj7D_Points: dc.w 0 ; Bonus points array<br />
dc.w 1000 ; earn 1000*10 points for revealing 10000 object<br />
dc.w 100 ; earn 100*10 points for revealing 1000 object<br />
dc.w 10 ; earn 10*10 points for revealing 100 object</asm><br />
<br />
Build your ROM and test it out.<br />
<br />
'''Hopefully it works and you get something like this:'''<br />
<gallery widths="320px" heights="224px" style="margin-left: auto; margin-right: auto; text-align: center"><br />
Image:Points_fixed_before.PNG|It's the end of the stage, let's get those points.<br />
Image:Points_fixed_after.PNG|Yes! We have 15200 points, verifying that 3900+100+100+100+1000+10000=15200.<br />
</gallery><br />
<br />
'''Entire Object 7D code for reference:'''<br />
<br />
<asm>; ===========================================================================<br />
; ---------------------------------------------------------------------------<br />
; Object 7D - hidden points at the end of a level<br />
; ---------------------------------------------------------------------------<br />
<br />
Obj7D: ; XREF: Obj_Index<br />
moveq #0,d0<br />
move.b $24(a0),d0<br />
move.w Obj7D_Index(pc,d0.w),d1<br />
jmp Obj7D_Index(pc,d1.w)<br />
; ===========================================================================<br />
Obj7D_Index: dc.w Obj7D_Main-Obj7D_Index<br />
dc.w Obj7D_DelayDel-Obj7D_Index<br />
; ===========================================================================<br />
<br />
Obj7D_Main: ; XREF: Obj7D_Index<br />
moveq #$10,d2<br />
move.w d2,d3<br />
add.w d3,d3<br />
lea ($FFFFD000).w,a1<br />
move.w 8(a1),d0<br />
sub.w 8(a0),d0<br />
add.w d2,d0<br />
cmp.w d3,d0<br />
bcc.s Obj7D_ChkDel<br />
move.w $C(a1),d1<br />
sub.w $C(a0),d1<br />
add.w d2,d1<br />
cmp.w d3,d1<br />
bcc.s Obj7D_ChkDel<br />
tst.w ($FFFFFE08).w<br />
bne.s Obj7D_ChkDel<br />
tst.b ($FFFFF7CD).w<br />
bne.s Obj7D_ChkDel<br />
addq.b #2,$24(a0)<br />
move.l #Map_obj7D,4(a0)<br />
move.w #$84B6,2(a0)<br />
ori.b #4,1(a0)<br />
move.b #0,$18(a0)<br />
move.b #$10,$19(a0)<br />
move.b $28(a0),$1A(a0)<br />
move.w #119,$30(a0) ; set display time to 2 seconds<br />
move.w #$C9,d0<br />
jsr (PlaySound_Special).l ; play bonus sound<br />
moveq #0,d0<br />
move.b $28(a0),d0<br />
add.w d0,d0<br />
move.w Obj7D_Points(pc,d0.w),d0 ; load bonus points array<br />
jsr AddPoints<br />
<br />
Obj7D_ChkDel:<br />
move.w 8(a0),d0<br />
andi.w #$FF80,d0<br />
move.w ($FFFFF700).w,d1<br />
subi.w #$80,d1<br />
andi.w #$FF80,d1<br />
sub.w d1,d0<br />
cmpi.w #$280,d0<br />
bhi.s Obj7D_Delete<br />
rts <br />
; ===========================================================================<br />
<br />
Obj7D_Delete:<br />
jmp DeleteObject<br />
; ===========================================================================<br />
Obj7D_Points: dc.w 0 ; Bonus points array<br />
dc.w 1000<br />
dc.w 100<br />
dc.w 10<br />
; ===========================================================================<br />
<br />
Obj7D_DelayDel: ; XREF: Obj7D_Index<br />
subq.w #1,$30(a0) ; subtract 1 from display time<br />
bmi.s Obj7D_Delete2 ; if time is zero, branch<br />
move.w 8(a0),d0<br />
andi.w #-$80,d0<br />
move.w ($FFFFF700).w,d1<br />
subi.w #$80,d1<br />
andi.w #-$80,d1<br />
sub.w d1,d0<br />
cmpi.w #$280,d0<br />
bhi.s Obj7D_Delete2<br />
jmp DisplaySprite<br />
; ===========================================================================<br />
<br />
Obj7D_Delete2:<br />
jmp DeleteObject<br />
; ===========================================================================<br />
; ---------------------------------------------------------------------------<br />
; Sprite mappings - hidden points at the end of a level<br />
; ---------------------------------------------------------------------------<br />
Map_obj7D:<br />
include "_maps\obj7D.asm"</asm><br />
<br />
{{S1Howtos}}<br />
[[Category:SCHG How-tos|Fix the Hidden Points bug in Sonic 1]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=User:Blueblur93&diff=210666User:Blueblur932014-06-30T19:30:32Z<p>RetroUser: </p>
<hr />
<div>'''Blueblur93''' is a C++/Objective C programmer, and is the creator of the hack [[Sonic-Into the void|Sonic - Into the Void]]. He is currently a [[Trial Member]] on the [[Sonic Retro]] forums.<br />
<br />
==Projects==<br />
<br />
[[Sonic-Into the void|Sonic - Into the Void]] ([[Sonic hacks|Hack]], in progress, v4.0b)<br />
<br />
[[Category:User pages]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonik_Sprite&diff=210446Sonik Sprite2014-06-23T14:06:56Z<p>RetroUser: Looking at the actual credits in the "Fast Facts", this really shouldn't be linked.</p>
<hr />
<div>{{stub}}<br />
{{Program<br />
| screen=Soniksprite.png<br />
| category=Graphics editor<br />
| version=1.5<br />
| system=Microsoft Windows<br />
| games=[[Sonic the Hedgehog (16-bit)|Sonic 1]], [[Sonic the Hedgehog CD|Sonic CD]], [[Sonic the Hedgehog 2 (Simon Wai prototype)|Sonic 2 Beta]],<br>[[Sonic the Hedgehog 2 (16-bit)|Sonic 2]], [[Sonic the Hedgehog 3|Sonic 3]], [[Sonic & Knuckles]], [[Sonic Classics]],<br>[[Sonic 3D: Flickies' Island|Sonic 3D]], [[sega:Rocket Knight Adventures|Rocket Knight Adventures]], [[sega:Quackshot Starring Donald Duck|Quackshot]]<br />
| credits=[[Beta (scener)|Beta]]<br />
| thanks=[[User:Hivebrain|Hivebrain]], [[KojiChao]], [[Rika Chou]], Dima225<br />
| obsolete=yes<br />
| obsoletetext=[[SonMapEd]] gives greater freedom with the ability to edit sprite mappings.<br />
}}<br />
'''Sonik Sprite''' is a utility written by [[Beta (scener)|Beta]] for editing uncompressed art in Genesis ROMs. It also needs MSCOMCTL.OCX to run properly. You can get it [http://www.ocxdump.com/download-ocx-files_new.php/ocxfiles/M/MSCOMCTL.OCX/6.01.9782/download.html here]<br />
<br />
Supported ROM list:<br />
{|class="prettytable"<br />
!Game Title||No. of sprites||% of sprites<br />
|-<br />
|''[[Sonic the Hedgehog (Genesis)|Sonic the Hedgehog]]'' (U/E)||170||100%<br />
|-<br />
|''[[Sonic the Hedgehog CD]]'' (U)||34||1%<br />
|-<br />
|''[[Sonic 2 Beta|Sonic the Hedgehog 2 Beta]]''||19||2%<br />
|-<br />
|''[[Sonic the Hedgehog 2]]''||447||98%<br />
|-<br />
|''[[Sonic the Hedgehog 3]]''||485||80%<br />
|-<br />
|''[[Sonic & Knuckles]]''||453||80%<br />
|-<br />
|''[[Sonic Compilation]]''||255||30%<br />
|-<br />
|''[[Sonic 3D: Flickies' Island]]''||88||5%<br />
|-<br />
|''Rocket Knight Adventures'' (U/E)||10||10%<br />
|-<br />
|''Quack Shot Starring Donald Duck''||60||100%<br />
|}<br />
<br />
Total 10 games; 2021 [[sprite]]s<br />
<br />
{{Download|version=1.5 Beta|file=Sonik Sprite v1.5.7z|filesize=139KB}}<br />
<br />
===Script Writers===<br />
*[[User:Hivebrain|Hivebrain]] (Sonic 1/2/3/K/2B, Rocket Knight Adventures)<br />
*[[KojiChao]] (Sonic 2)<br />
*[[rika_chou]] (Sonic 3/K/CD, Quack Shot)<br />
*Dima225 (Sonic 3D)<br />
<br />
[[Category:Programs]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonik_Sprite&diff=210445Sonik Sprite2014-06-23T14:04:29Z<p>RetroUser: Another red Hivebrain link.</p>
<hr />
<div>{{stub}}<br />
{{Program<br />
| screen=Soniksprite.png<br />
| category=Graphics editor<br />
| version=1.5<br />
| system=Microsoft Windows<br />
| games=[[Sonic the Hedgehog (16-bit)|Sonic 1]], [[Sonic the Hedgehog CD|Sonic CD]], [[Sonic the Hedgehog 2 (Simon Wai prototype)|Sonic 2 Beta]],<br>[[Sonic the Hedgehog 2 (16-bit)|Sonic 2]], [[Sonic the Hedgehog 3|Sonic 3]], [[Sonic & Knuckles]], [[Sonic Classics]],<br>[[Sonic 3D: Flickies' Island|Sonic 3D]], [[sega:Rocket Knight Adventures|Rocket Knight Adventures]], [[sega:Quackshot Starring Donald Duck|Quackshot]]<br />
| credits=[[Beta (scener)|Beta]]<br />
| thanks=[[User:Hivebrain|Hivebrain]], [[KojiChao]], [[Rika Chou]], Dima225<br />
| obsolete=yes<br />
| obsoletetext=[[SonMapEd]] gives greater freedom with the ability to edit sprite mappings.<br />
}}<br />
'''Sonik Sprite''' is a utility written by [[Beta (scener)|Beta]] for editing uncompressed art in Genesis ROMs. It also needs MSCOMCTL.OCX to run properly. You can get it [http://www.ocxdump.com/download-ocx-files_new.php/ocxfiles/M/MSCOMCTL.OCX/6.01.9782/download.html here]<br />
<br />
Supported ROM list:<br />
{|class="prettytable"<br />
!Game Title||No. of sprites||% of sprites<br />
|-<br />
|''[[Sonic the Hedgehog (Genesis)|Sonic the Hedgehog]]'' (U/E)||170||100%<br />
|-<br />
|''[[Sonic the Hedgehog CD]]'' (U)||34||1%<br />
|-<br />
|''[[Sonic 2 Beta|Sonic the Hedgehog 2 Beta]]''||19||2%<br />
|-<br />
|''[[Sonic the Hedgehog 2]]''||447||98%<br />
|-<br />
|''[[Sonic the Hedgehog 3]]''||485||80%<br />
|-<br />
|''[[Sonic & Knuckles]]''||453||80%<br />
|-<br />
|''[[Sonic Compilation]]''||255||30%<br />
|-<br />
|''[[Sonic 3D: Flickies' Island]]''||88||5%<br />
|-<br />
|''Rocket Knight Adventures'' (U/E)||10||10%<br />
|-<br />
|''Quack Shot Starring Donald Duck''||60||100%<br />
|}<br />
<br />
Total 10 games; 2021 [[sprite]]s<br />
<br />
{{Download|version=1.5 Beta|file=Sonik Sprite v1.5.7z|filesize=139KB}}<br />
<br />
===Script Writers===<br />
*[[User:Hivebrain|Hivebrain]] (Sonic 1/2/3/K/2B, Rocket Knight Adventures)<br />
*[[KojiChao]] (Sonic 2)<br />
*[[rika_chou]] (Sonic 3/K/CD, Quack Shot)<br />
*[[Dima225]] (Sonic 3D)<br />
<br />
[[Category:Programs]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic-Into_the_void&diff=210440Sonic-Into the void2014-06-22T19:09:00Z<p>RetroUser: </p>
<hr />
<div>{{Hack<br />
|title=Sonic: Into The Void<br />
|screen=SITV-TitleV4_0.png<br />
|version=4.0 beta<br />
|status=In progress<br />
|date=12/05/14<br />
|system=[[Sega Genesis]]/[[Sega Mega Drive]]<br />
|originalgame=Sonic the Hedgehog (16-bit)<br />
|credits=[[User:Blueblur93|Blueblur93]] <br />
|visualmods=yes<br />
|layoutmods=yes<br />
|basicenginemods=yes<br />
|advenginemods=no<br />
|audiomods=yes}}<br />
<br />
'''''Sonic: Into The Void''''' is a hack of ''[[Sonic the Hedgehog (16-bit)]]'' for the [[Sega Mega Drive]] / [[Sega Genesis]] by [[User:Blueblur93|Blueblur93]] which features a complete overhaul of the game, including new artwork, new [[HUD]], new abilities and many other things.<br />
<br />
*UPDATE: 12/05/2014<br />
<br />
The fourth version's demo has now been released which includes masses of level changes, new music and sounds, edited/new sprite art, new act exclusive palettes, new zones and new yet old bosses, but you will have to play the demo to find out what I mean, and lastly new level art! This page has been edited to the 4th version demo. When the full fourth version is released, that will be the final major release, however, there may be minor releases in the future.<br />
<br />
For this demo, it includes the full game (so it's playable to the end), but only Midnight Aurora's and Hydroruin's boss are altered for the ideal release. The Level art is more or less complete. So enjoy this new release!<br />
<br />
==Story==<br />
<br />
NOTE: This story takes place directly after [[Sonic Generations]].<br />
<br />
After Classic [[Sonic]] celebrates his 20th birthday with Modern Sonic and friends, Classic Sonic and Classic [[Tails]] jump into a portal which leads them into the Void. Both era's [[Eggman]]s are stuck in the White Space, however, they accidentally stumble upon an opening to the Void, seeing Classic Sonic and Tails soaring across. The Eggmans fire their laser pistols through the opening, hoping to hit Sonic and Tails, but their attempt failed and hits the Void. The Void then becomes highly aggravated and unstable, which splits Sonic and Tails up and sends them to their own time. However, expecting to return to his own time, Sonic ends up to what seems to be [[Green Hill Zone]], but he could see that something was wrong. Green Hill Zone has transformed into a place called Midnight Aurora Zone. Due to the disturbance in the Void, the Time Continuum for Sonic has been completely distorted. Sonic thinks that maybe collecting all 6 [[Chaos Emeralds]] will restore the Time Continuum, but he does also notice that all these events involving travelling through generations and the [[Time Eater]] seem oddly connected in a diabolical way...<br />
<br />
==Characters==<br />
<br />
[[Image:SITVv4-Char-Sonic.png|middle|60px]]<br />
Sonic<br />
<br />
[[Image:SITVv4-Char-Eggman.png|middle|100px]]<br />
Dr Eggman<br />
<br />
==Items==<br />
<br />
===[[Monitor|Monitors]]===<br />
[[Image:SITVv4b-Monitor-SuperRing.png|middle|50px]]<br />
Super Ring - This gives Sonic 10 extra [[ring]]s.<br />
<br />
[[Image:SITVv4b-Monitor-Shield.png|middle|50px]]<br />
Shield - This gives Sonic a [[shield]] so that when he gets hurt, he won't lose rings.<br />
<br />
[[Image:SITVv4b-Monitor-Speed.png|middle|50px]]<br />
Speed Boots - This gives Sonic a speed boost.<br />
<br />
[[Image:SITVv4b-Monitor-Invinc.png|middle|50px]]<br />
Invincibility - This gives Sonic temporary [[invincibility]], except for falling of the screen.<br />
<br />
[[Image:SITVv4b-Monitor-1UP.png|middle|50px]]<br />
1UP - This gives Sonic an [[extra life]].<br />
<br />
[[Image:SITVv4b-Monitor-Egg.png|middle|50px]]<br />
Eggmon(Egg Monitor) - This hurts sonic as if he was hit by [[spikes]] or a [[Badnik]].<br />
<br />
[[Image:SITVv4b-Monitor-Blank.png|middle|50px]]<br />
Blank - This monitor doesn't anything, but is good for [[homing attack]]ing.<br />
<br />
===Objects===<br />
<br />
[[Image:SITVv4b-Obj-Ring.png|middle|30px]]<br />
[[Ring]]s - Collect 100 of these to earn an extra life.<br />
<br />
[[Image:SITVv4b-Obj-StarPost.png|middle|30px]]<br />
[[Star Post]] - Run past these to activate a checkpoint.<br />
<br />
[[Image:SITVv4b-Obj-Emerald.png|middle|30px]]<br />
[[Chaos Emerald]] - There are 6 of these, be sure to collect them!<br />
<br />
==Zones==<br />
<br />
[[Image:SITVv4b-MidnightAurora.png|middle|300px]]<br />
Midnight Aurora Zone<br />
<br />
[[Image:SITVv4b-EmberGardens.png|middle|300px]]<br />
Ember Gardens Zone<br />
<br />
[[Image:SITVv4b-PinballPike.png|middle|300px]]<br />
Pinball Pike Zone<br />
<br />
[[Image:SITVv4b-Hydroruin.png|middle|300px]]<br />
Hydroruin Zone<br />
<br />
[[Image:SITVv4b-MoonlightRoad.png|middle|300px]]<br />
Moonlight Road Zone<br />
<br />
[[Image:SITVv4b-DeltaBase.png|middle|300px]]<br />
Delta Base Zone<br />
<br />
???<br />
Chaos Machine Zone<br />
<br />
==Downloads==<br />
{{Download|version=4.0b|title=''Sonic: Into The Void''|file=Sonic Into The Void (v4.0b).zip|filesize=507 KB}}<br />
<br />
===Mirror===<br />
http://www.mediafire.com/download/5d5bczzic1aido1/Sonic+Into+The+Void+v4.0b.zip<br />
<br />
==Earlier Releases==<br />
{{Multidownload<br />
| name=Sonic: Into The Void (Old Versions)<br />
| file1=Sonic Into The Void (v3.0).zip<br />
| filename1=Sonic: Into The Void v3.0<br />
| filesize1=385 KB<br />
| file2=Sonic Into The Void V2.5.zip<br />
| filename2=Sonic: Into The Void v2.5<br />
| filesize2=385 KB<br />
| file3=Sonic Into The Void V2.4.zip<br />
| filename3=Sonic: Into The Void v2.4<br />
| filesize3=385 KB<br />
| file4=Sonic Into The Void (v1.1).zip<br />
| filename4=Sonic: Into The Void v1.1<br />
| filesize4=382 KB<br />
| file5=Sonic Into The Void (v1.0).zip<br />
| filename5=Sonic: Into The Void v1.0<br />
| filesize5=382 KB<br />
}}<br />
<br />
===Mirrors===<br />
*http://www.mediafire.com/download/8msbmb54kl5f986/Sonic+Into+The+Void+%28v3.0%29.bin<br />
*http://www.mediafire.com/download/9phh6gaiyoiz5lv/Sonic+Into+The+Void+V2.5.bin<br />
*http://www.mediafire.com/download/i3b1ceaeioeah9f/Sonic+into+the+void+v2.4.bin<br />
*http://www.mediafire.com/download/c78zghdasbvcb82/Sonic+Into+the+Void+%28v1.1%29.bin<br />
*http://www.mediafire.com/download/1jfq19tj4330zzc/Sonic+Into+the+Void+%28v1.0%29.zip<br />
<br />
==External Links==<br />
*{{LinkRetro|topic=32775|title=Forum topic}} at [[Sonic Retro]]<br />
*[http://blueblur93.weebly.com Official Site]<br />
*[http://www.youtube.com/user/BlueBlur93 Trailer] on YouTube<br />
<br />
[[Category:Hacks|Into The Void, Sonic 1]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Special_Stage&diff=210414Special Stage2014-06-18T17:28:42Z<p>RetroUser: </p>
<hr />
<div>[[File:Specialstages1.png|thumb|right|320px|The original Special Stage from ''[[Sonic the Hedgehog (16-bit)|Sonic the Hedgehog]]''.]]<br />
<br />
'''Special Stages''' are a staple type of level in the [[Sonic the Hedgehog]] series, whose primary function is to offer the player an opportunity to earn one of either the [[Chaos Emeralds]] or their analogues (see below); and, even if unsuccessful at that, a bonus to their score. Special stages vary among games in design, means of access, and the prize. In ''[[Sonic 3 & Knuckles]]'', if all Chaos Emeralds have been collected, the aim is to obtain a [[Super Emerald]]; in ''[[Sonic the Hedgehog CD]]'', a [[Time Stone]]; or, in ''[[Knuckles' Chaotix]]'', a [[Chaos Ring]].<br />
<br />
==List of Special Stages==<br />
*''[[Special Stage (Sonic the Hedgehog 16-bit)|Sonic the Hedgehog]]''<br />
*''[[Special Stage (Sonic CD)|Sonic the Hedgehog CD]]''<br />
*''[[Special Stage (Sonic the Hedgehog 2 16-bit)|Sonic the Hedgehog 2]]''<br />
*''[[Special Stage (Sonic 3 & Knuckles)|Sonic 3 & Knuckles]]''<br />
*''[[Special Stage (Sonic Chaos)|Sonic Chaos]]''<br />
*''[[Special Stage (Sonic Triple Trouble)|Sonic Triple Trouble]]''<br />
*''[[Special Stage (Sonic 3D MD)|Sonic 3D]]'' ([[sega:Sega Mega Drive|Mega Drive / Genesis]])<br />
*''[[Special_Stage_(S3D_Sat/PC)|Sonic 3D]]'' ([[sega:Sega Saturn|Saturn]] & PC)<br />
*''[[Special Stage (Sonic Blast)|Sonic Blast]]''<br />
*''[[Special Stage (Knuckles' Chaotix)|Knuckles' Chaotix]]''<br />
*''[[Special Stage (Sonic the Hedgehog Pocket Adventure)|Sonic the Hedgehog Pocket Adventure]]''<br />
*''[[Special Stage (Sonic Advance)|Sonic Advance]]''<br />
*''[[Special Stage (Sonic Advance 2)|Sonic Advance 2]]''<br />
*''[[Special Stage (Sonic Advance 3)|Sonic Advance 3]]''<br />
*''[[Special Stage (Sonic Heroes)|Sonic Heroes]]''<br />
*''[[Special Stage (Sonic Rush)|Sonic Rush]]''<br />
*''[[Special Stage (Sonic Rush Adventure)|Sonic Rush Adventure]]''<br />
*''[[Special Stage (Sonic 4)|Sonic 4: Episode I]]''<br />
*''[[Special Stage (Sonic Colours)|Sonic Colours DS]]''<br />
*''[[Special Stage (Sonic Generations 3DS)|Sonic Generations 3DS]]''<br />
*''[[Special Stage (Sonic the Hedgehog 4: Episode II)|Sonic 4: Episode II]]''<br />
<br />
==In ''Sonic the Comic''==<br />
<br />
In [[Fleetway]]'s ''[[Sonic the Comic]]'', the '''Special Zone''' is a type of alternate reality similar to Special Stages. Some regions have strange physics compared to Mobius, while others contain fairly normal worlds. It is here that the [[Chaotix (characters)|Chaotix]] crew make their home, as well as [[Lord Sidewinder]] and various other villains.<br />
<br />
[[Super Sonic#Sonic the Comic|Super Sonic]], who is unlocked by completing all Special Stages and collecting all Chaos Emeralds in ''[[Sonic the Hedgehog 2 (16-bit)|Sonic the Hedgehog 2]]'' and several later games, was at one point separated from the normal [[Sonic the Hedgehog|Sonic]] and trapped in the Special Zone by a [[checkpoint|Star Post]], which are used to enter Special Stages in that game.<br />
<br />
[[Category:Levels]]<br />
[[Category:Locations]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Port_Sonic_3%27s_Sound_Driver_to_Sonic_1&diff=210383SCHG How-to Talk:Port Sonic 3's Sound Driver to Sonic 12014-06-14T20:22:44Z<p>RetroUser: Created page with "Would there be a way to add smps2asm support to this driver? That way, you would be able to have more music rather than simply using S3's songs only. -- ~~~~"</p>
<hr />
<div>Would there be a way to add smps2asm support to this driver? That way, you would be able to have more music rather than simply using S3's songs only. -- [[User:RetroUser|RetroUser]] 20:22, 14 June 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_1_Remastered_(hack)&diff=209784Sonic 1 Remastered (hack)2014-06-11T23:25:19Z<p>RetroUser: Whoa, missed that.</p>
<hr />
<div>{{Hack<br />
|screen=s1Remastered.png<br />
|version=2<br />
|date=After 07/14/07<br />
|system=Sega Mega Drive/Genesis<br />
|credits=[[Puto]]<br />
|originalgame=Sonic the Hedgehog (16-bit)<br />
|visualmods=yes<br />
|audiomods=yes<br />
|layoutmods=<br />
|basicenginemods=yes<br />
|advenginemods=}}<br />
<br />
'''''Sonic 1 Remastered''''' is a hack of ''[[Sonic the Hedgehog (16-bit)]]'' for the [[Sega Mega Drive/Genesis]] by [[Puto]]. Unlike most other hacks, the officially released version 1.1 isn't a level art/palette/layout hack as much as an "additional features" hack done in ASM. One of the major additions to the game is added with the choice of using [[Sonic]] or [[Tails]] throughout the game (selecting a character is done at the title screen). There also exists a version 2 hack which was leaked without Puto's permission, although he later gave permission to upload it onto the wiki.<br />
<br />
==Features (1.1)==<br />
*Multiple characters.<br />
*Speed limit removed (unconfirmed).<br />
*Zone title/results font uses art from the credits font.<br />
*Some art from ''[[Sonic 3]]'', such as the Sonic and Tails sprites, rocks, starposts, monitors etc.<br />
*[[Spike damage behavior]] changed to that of ''[[Sonic 2]]''.<br />
*Abilities gained as the [[Chaos Emeralds]] are collected (untested).<br />
*Timer ends after defeating a boss rather than opening an [[Egg prison]].<br />
*[[Super Sonic]]/[[Super Tails|Tails]] added (untested).<br />
*The ability to carry leftover rings into the next act.<br />
*Rebound after running into a wall at high speed.<br />
*New and remixed music.<br />
<br />
==Features (2)==<br />
*Multiple characters ([[Knuckles]] also playable).<br />
*Super Sonic/Tails/[[Super Knuckles|Knuckles]] added.<br />
*New zone title/results font based on the ''Sonic 3'' title/results font.<br />
*The ability to save your progress to SRAM (in Kega Fusion disable SRAM).<br />
*Transitions between different zones.<br />
*Elemental Shields from ''[[Sonic 3 & Knuckles]]'' and the Insta-Shield.<br />
*An options screen with character/shield/sprite style selection, soundtrack switching, enabling/disabling auto-rolling, the option to retain rings between acts, and a sound test.<br />
*Altered level layouts.<br />
*Altered palettes.<br />
*To play the game in Kega Fusion, SRAM must be disabled.<br />
<br />
==Downloads==<br />
{{Download|version=2|file=Sonic 1 Remastered v.2.zip|filesize=919KB}}<br />
<br />
===Prior Versions===<br />
* {{file|Sonic 1 Remastered v.1.1.zip|Sonic 1 Remastered v1.1}} (745KB, released 7/14/07)<br />
* {{file|Sonic 1 Remastered (v.1.0).zip|Sonic 1 Remastered v1.0}} (744KB, released 6/27/07)<br />
* {{file|Sonic_1_Remastered_v0.1.zip|Sonic 1 Remastered v0.1}} (415KB, released 001/12/07)<br />
* {{file|Sonic_1_Remastered_First_Public_Release.zip|First Public Release}} (380KB, released 12/11/06)<br />
<br />
==External Links==<br />
* {{LinkRetro|topic=8600|title=Sonic 1 Remastered release thread}} at [[Sonic Retro]]<br />
* [http://www.youtube.com/results?search_query=%22sonic+1+remastered&search=Search Preview footage] on YouTube<br />
* [http://www.youtube.com/watch?v=hkmFX8skqEQ Popoman100 Playthrough of the game] on YouTube<br />
<br />
[[Category:Hacks|Remastered, Sonic 1]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_1_Remastered_(hack)&diff=209783Sonic 1 Remastered (hack)2014-06-11T23:24:37Z<p>RetroUser: Cleanup and improvement.</p>
<hr />
<div>{{Hack<br />
|screen=s1Remastered.png<br />
|version=2<br />
|date=After 07/14/07<br />
|system=Sega Mega Drive/Genesis<br />
|credits=[[Puto]]<br />
|originalgame=Sonic the Hedgehog (16-bit)<br />
|visualmods=yes<br />
|audiomods=yes<br />
|layoutmods=<br />
|basicenginemods=yes<br />
|advenginemods=}}<br />
<br />
'''''Sonic 1 Remastered''''' is a hack of ''[[Sonic the Hedgehog (16-bit)]]'' for the [[Sega Mega Drive/Genesis]] by [[Puto]]. Unlike most other hacks, the officially released version 1.1 isn't a level art/palette/layout hack as much as an "additional features" hack done in ASM. One of the major additions to the game is added with the choice of using [[Sonic]] or [[Tails]] throughout the game (selecting a character is done at the title screen). There also exists a version 2 hack which was leaked without Puto's permission, although he later gave permission to upload it onto the wiki.<br />
<br />
==Features (1.1)==<br />
*Multiple characters.<br />
*Speed limit removed (unconfirmed).<br />
*Zone title/results font uses art from the credits font.<br />
*Some art from ''[[Sonic 3]]'', such as the Sonic and Tails sprites, rocks, starposts, monitors etc.<br />
*[[Spike damage behavior]] changed to that of ''[[Sonic 2]]''.<br />
*Abilities gained as the [[Chaos Emeralds]] are collected (untested).<br />
*Timer ends after defeating a boss rather than opening an [[Egg prison]].<br />
*[[Super Sonic]]/[[Super Tails|Tails]] added (untested).<br />
*The ability to carry leftover rings into the next act.<br />
*Rebound after running into a wall at high speed.<br />
*New and remixed music.<br />
<br />
==Features (2)==<br />
*Multiple characters ([[Knuckles]] also playable).<br />
*Super Sonic/Tails/[[Super Knuckles|Knuckles]] added.<br />
*New zone title/results font based on the ''Sonic 3'' title/results font.<br />
*The ability to save your progress to SRAM (in Kega Fusion disable SRAM).<br />
*Transitions between different zones.<br />
*Elemental Shields from [[Sonic 3 & Knuckles]] and the Insta-Shield.<br />
*An options screen with character/shield/sprite style selection, soundtrack switching, enabling/disabling auto-rolling, the option to retain rings between acts, and a sound test.<br />
*Altered level layouts.<br />
*Altered palettes.<br />
*To play the game in Kega Fusion, SRAM must be disabled.<br />
<br />
==Downloads==<br />
{{Download|version=2|file=Sonic 1 Remastered v.2.zip|filesize=919KB}}<br />
<br />
===Prior Versions===<br />
* {{file|Sonic 1 Remastered v.1.1.zip|Sonic 1 Remastered v1.1}} (745KB, released 7/14/07)<br />
* {{file|Sonic 1 Remastered (v.1.0).zip|Sonic 1 Remastered v1.0}} (744KB, released 6/27/07)<br />
* {{file|Sonic_1_Remastered_v0.1.zip|Sonic 1 Remastered v0.1}} (415KB, released 001/12/07)<br />
* {{file|Sonic_1_Remastered_First_Public_Release.zip|First Public Release}} (380KB, released 12/11/06)<br />
<br />
==External Links==<br />
* {{LinkRetro|topic=8600|title=Sonic 1 Remastered release thread}} at [[Sonic Retro]]<br />
* [http://www.youtube.com/results?search_query=%22sonic+1+remastered&search=Search Preview footage] on YouTube<br />
* [http://www.youtube.com/watch?v=hkmFX8skqEQ Popoman100 Playthrough of the game] on YouTube<br />
<br />
[[Category:Hacks|Remastered, Sonic 1]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_Battle&diff=209782Sonic Battle2014-06-11T20:16:48Z<p>RetroUser: </p>
<hr />
<div>{{Bob|bobscreen=Sonic Battle title.png<br />
|publisher=[[Sega]]<br />
|developer=[[Sonic Team]]<br />
|system=[[Game Boy Advance]]<br />
|releases=<br />
{{release|GBA|JP|2003-12-04|¥4,980}}<br />
{{release|GBA|US|2004-01-12}}<br />
{{release|GBA|EU|2004-02-27}}<br />
|genre=Strategy<br />
|esrb=e|pegi=7|usk=0|oflc=g8|cero=free|grb=a}}<br />
<br />
'''''Sonic Battle''''' (ソニック バトル) is a 4 player isometric fighting game based on the ''Sonic Adventure'' era characters, differing heavily from ''[[Sonic Championship|Sonic the Fighters]]'', the first Sonic fighting game. It had a single player story mode which received a great deal of praise from fans; not taking itself too seriously, while at the same time doing a lot to flesh out characters' personalities. <br />
<br />
The story centered around the ancient mechanoid [[Emerl]]. Emerl could be upgraded, but it was long and tedious to do this, which some gamers found to detract from the game. He gains XPs from each fight, but about 10 fights would need to be completed to gain a new move.<br />
<br />
It is also the first Sonic game to feature swearing - in Japan, [[Rouge]] calls [[Eggman]] a "bastard" for hacking into a computer before she did. The Japanese version actually has an English translation in it which contains the swearing. When the game was released in the US the dialogue was altered.<br />
<br />
''Sonic Battle''<nowiki>'s</nowiki> storyline was loosely adapted for TV in episodes 45 and 46 of ''[[Sonic X]]'', entitled '''[[Sonic Battle - Face Off!!]]''' and '''[[Sonic Battle - Finale!!]]''' respectively. Its plot was also heavily referenced in the 2008 ''Sonic'' game ''[[Sonic Chronicles: The Dark Brotherhood]]''.<br />
<br />
==Gameplay==<br />
Battles are fought in 3D arenas with up to 4 players. Each character has a set of attacks and abilities. The majority of attacks are performed with the {{B}} button, including the combos (1st, 2nd, and 3rd Attack), Air Attack, Upper Attack (used to knock opponents straight up), Heavy Attack (used to knock opponents away), and Aim Attack (used to home in on an opponent after the Heavy Attack). The {{A}} button is used to jump, and the {{L}} button lets the player block attacks, or replenish health if the button is held.<br />
<br />
The playable characters also have unique special moves, the three types being Shot, Power, and Set. Shot moves are projectiles which can damage an opponent from a distance. Power moves can deal damage quickly in a single move. Trap moves generally involve using a type of bomb to surprise-attack the enemy. However, only a limited number of special moves can be selected. Shot, Power, and Trap must be allocated to three slots: Ground, Air, and Defend. The special move you set to Ground will be used when you press {{R}} on the ground. The move you set to Air will be used when you press {{R}} in mid-air. The last slot, Defend, has a different function; When you set a certain type of special move to Defend, then every time an enemy uses the same type of special to attack you, you'll automatically block it.<br />
<br />
Each player has a health bar and an "Ichikoro Gauge". When health is completely depleted, the player is KO'd and loses one life (in a survival match) or the one who KO'd them gets a point (in a KO match). The Ground, Air, and Defend settings are chosen at the beginning of the match, and every time the player respawns. As a player takes damage, blocks attacks, or heals, the Ichikoro Gauge fills up. When it is full, the next special move the player does will instantly KO anyone it hits. However, if they chose to defend against that type of special, or successfully block, their Ichikoro Gauge will be filled instantly. Players healing damage will also slowly fill up their Ichikoro Gauge, but are still vulnerable to attacks.<br />
<br />
===Battling with Emerl===<br />
[[File:Emerl battle giant.png|thumb|right|200px|Emerl, the Gizoid, forms the basis for ''Sonic Battle's'' story.]]<br />
The main gimmick of the game is called the Skill Capture system. Emerl can imitate the actions and attacks of every other character. He starts out with slow, incomplete captures of [[Sonic]]'s abilities, which serve as the default moves. As the game is played, the abilities of other characters are recorded as Skill Cards. After each fight, certain skills are captured this way, one card per character per fight (so if Emerl fought [[Tails]], he would get a Tails data card, and if he fought Sonic, he would get a Sonic data card.) The capturable actions consist of not only the attacks and special moves each character performs, but their individual abilities in running, jumping, mid-air actions, and the like. These can be allocated to their corresponding slots in Emerl's ability list, and doing so gives Emerl the new moves to use in battle. (Note: What the charaters do ingame does not determine what the Skill Card will be.) Sometimes you will get a rare skill such as one of the skills on the third page of Emerl's skill-edit list (ex: fight pose, color 1, attack support). There are 309 skill cards to collect in all, though the rarest can't be acquired by fighting combatants in normal battles. Emerl's ultimate battle cards can only be earned through Tails' virtual training in the final chapter of Story Mode. Secret character-centric abilities can only be obtained via passwords.<br />
<br />
However, all these abilities cannot be used simultaneously. A limit is placed on the amount of non-default Skill Cards that can be used, in the form of skill points. Each card has a certain number of stars shown on the corner, and for each star, five skill points must be available to use on it. The total number of required skill points of all the allocated Skill Cards cannot exceed the current maximum of skill points Emerl has accumulated. Like the Skill Cards themselves, the skill point maximum is increased slightly with each battle, to a maximum of 500.<br />
<br />
Since Emerl is powered by the [[Chaos Emeralds]], there are cutscenes in the Story Mode episodes in which the Emeralds are used to enhance Emerl's abilities. Each Emerald raises the skill point maximum by 10, a rather large amount considering that most of the time, individual battles raise it by 1-5 (depending on performance). The player can choose to replay a Story Mode episode after it's been completed, but the Skill Card/Point data is still saved. Oddly enough, the skill point maximum is raised at the Chaos Emerald cutscene every time the player reaches them. This means the same Story Mode episode can be repeated to raise Emerl's skill points faster than normal.<br />
<br />
===Mini Games===<br />
<br />
In addition to the principal Story Mode with overworld exploration and battle arena fights, there are a number of other game modes available in ''Sonic Battle'' for single or multiplayer (by connecting the [[Game Boy Advance]] with up to 3 others via a link cable). These include "Battle", "Challenge", and "Training" modes, where one can specify the specific characters, opponents, and arenas to spar in, as well as a selection of 2D mini games largely unrelated to the fighting motif. These include:<br />
<br />
{|class="prettytable"<br />
!Screenshot||Description<br />
|-<br />
|[[Image:Sonic battle soniclash!.png|180px]]<br />
|'''Soniclash!''' - The only minigame to be available for play at the start of the game, Soniclash! sees players bounce around a pinball-like arena, rolled up in [[spin dash]]. Multiplayer only. Players: Sonic, Tails, Knuckles, Shadow<br />
|-<br />
|[[Image:Sonic battle flying get.png|180px]]<br />
|'''Fly & Get''' - Unlocked by beating [[Tails]]' episode in Story Mode. Fly & Get is an aerial ring-collection game which inspired a later [[Sonic Cafe]] mobile phone release, ''[[Tails' Flying Get]]''. Multiplayer only. Players: Tails, Cream, Gamma, Rouge<br />
|-<br />
|[[Image:Sonic battle mine hunt.png|180px]]<br />
|'''Mine Hunt''' - Unlocked by beating [[Knuckles]]' episode in Story Mode. Here Knuckles plays a game of minesweeper. Due to a design oversight, there is no way to exit the minigame once it is started. However, no data is lost by turning off the system while playing Mine Hunt. Unlike the other minigames, this is for one player only, although you can transfer it to another [[Game Boy Advance]] with no cartridge inserted.<br />
|-<br />
|[[Image:Sonic battle treasure island.png|180px]]<br />
|'''Treasure Island''' (called '''''Treasure Hunt''''' occasionally) - Unlocked by beating [[Amy]]'s episode in Story Mode. Multiplayer only. Players: Amy, Cream, Knuckles, Rouge<br />
|-<br />
|[[Image:Sonic battle speed demon.png|180px]]<br />
|'''Speed Demon''' - Unlocked by beating [[Shadow]]'s episode in Story Mode. Multiplayer only. Players: Shadow, Sonic, Tails, Knuckles<br />
|}<br />
<br />
<br />
===Timeline===<br />
Despite being created after [[Sonic Heroes]], Sonic Battle may not be in the timeline directly after Heroes.<br />
<br />
==Secret Combo Cards==<br />
Combo Cards representing each character can be obtained by entering a code in the [[Sonic Team]] building in the [[Central City (Sonic Battle)|Central City]] area during Emerl's story.<br />
*'''Sonic''': 75619<br />
*'''Tails''': OTrOI<br />
*'''Knuckles''': yU3Da<br />
*'''Amy''': alogK<br />
*'''Cream''': ZAhan<br />
*'''Shadow''': ArmIa <br />
*'''Rouge''': AhnVo<br />
*'''Gamma''': tSueT<br />
*'''Chaos''': EkiTa<br />
<br />
Note: ''Shadow's card code is an anagram of [[Maria Robotnik|Maria]]. Knuckles' code is a reference to [[Takashi Yuda]], his designer, and his first game [[Sonic the Hedgehog 3]] ''<br />
<br />
==Manuals==<br />
*[[Sonic Battle US Manual]]<br />
*[[Sonic Battle EU Manual]]<br />
*[http://www.segaretro.org/File:Sonic_Battle_Game_Boy_Advance_JP_Manual.pdf Sonic Battle JP Manual (pdf)]<br />
<br />
==Also Released On==<br />
* ''[[2 in 1: Sonic Advance & Sonic Battle]]'' for the [[Gameboy Advance]] (2005)<br />
* ''[[2 in 1: Sonic Battle & ChuChu Rocket!]]'' for the [[Gameboy Advance]] (2005)<br />
* ''[[2 in 1: Sonic Pinball Party & Sonic Battle]]'' for the [[Gameboy Advance]] (2005)<br />
<br />
==Sound Test==<br />
NOTE: This game's Sound Test does not feature corresponding titles.<br />
{| class="collapsible collapsed" border="0" style="width:55%"<br />
! style="width:20em; text-align:left" |<br />
! | <br />
|-<br />
| colspan="2" |<br />
{|class="wikitable" style="width:100%; margin-right:-1em;"<br />
|-<br />
! #<br />
! Title<br />
! Usage<br />
|-<br />
| 0<br />
| Title<br />
| Title Screen<br />
|-<br />
| 1<br />
| Main Menu<br />
| Main Menu/Mode Select Screen, Mini Games Select Screen<br />
|-<br />
| 2<br />
| Character Select<br />
| Episode Select (Story Mode), Link Setup, Character Select (Challenge Mode)<br />
|-<br />
| 3<br />
| Challenge<br />
| Challenge Mode Demo<br />
|-<br />
| 4<br />
| VS Result<br />
| Results (Battle & Challenge Mode)<br />
|-<br />
| 5<br />
| Record<br />
| Continue (Story Mode), Training Mode Setup Screen, Battle Record<br />
|-<br />
| 6<br />
| Congratulations<br />
| Challenge Mode Clear<br />
|-<br />
| 7<br />
| ???<br />
| ???<br />
|-<br />
| 8<br />
| ???<br />
| ???<br />
|-<br />
| 9<br />
| Sonic Stage<br />
| Emerald Beach<br />
|-<br />
| 10<br />
| Tails Stage<br />
| Tails' Lab<br />
|-<br />
| 11<br />
| Knuckles Stage<br />
| Chao Ruins<br />
|-<br />
| 12<br />
| Amy Stage<br />
| Amy's Room<br />
|-<br />
| 13<br />
| Shadow Stage<br />
| Battle Highway<br />
|-<br />
| 14<br />
| Rouge Stage<br />
| Club Rouge<br />
|-<br />
| 15<br />
| E-102γ (Gamma) Stage<br />
| Metal Depot<br />
|-<br />
| 16<br />
| Cream Stage<br />
| Library<br />
|-<br />
| 17<br />
| Chaos Stage A<br />
| Crater (Holy Summit (Arena))<br />
|-<br />
| 18<br />
| Chaos Stage B<br />
| Blackboard Eraser<br />
|-<br />
| 19<br />
| Eggman & Emerl Stage<br />
| Final Boss (Death Egg (Arena))<br />
|-<br />
| 20<br />
| E-121Φ (Phi) Stage<br />
| Colosseum<br />
|-<br />
| 21<br />
| Demo 1<br />
| Comedy Demo/Story Demo 1<br />
|-<br />
| 22<br />
| Demo 2<br />
| Shadow Demo/History Demo/Story Demo 2<br />
|-<br />
| 23<br />
| Demo 3<br />
| Confrontation Demo/Story Demo 3<br />
|-<br />
| 24<br />
| Demo 4<br />
| Eggman Demo/Story Demo 4<br />
|-<br />
| 25<br />
| Demo 5<br />
| Emerl Demo/Story Demo 5<br />
|-<br />
| 26<br />
| Battle Start<br />
| Character Introduction Demo<br />
|-<br />
| 27<br />
| Battle Result 1<br />
| Card Capture Demo<br />
|-<br />
| 28<br />
| Battle Result 2<br />
| Rare Card Capture Demo<br />
|-<br />
| 29<br />
| New Character<br />
| Character Unlock Demo<br />
|-<br />
| 30<br />
| Skill Edit<br />
| Emerl Customization Menu<br />
|-<br />
| 31<br />
| Ending A<br />
| Staff Roll (all stories except Emerl), Staff Roll 2 (Emerl Story)<br />
|-<br />
| 32<br />
| Ending B<br />
| Staff Roll 1 (Emerl Story)<br />
|-<br />
| 33<br />
| Emerald Town<br />
| Emerald Town (Overworld)<br />
|-<br />
| 34<br />
| Night Babylon<br />
| Night Babylon (Overworld)<br />
|-<br />
| 35<br />
| Holy Summit<br />
| Holy Summit (Overworld)<br />
|-<br />
| 36<br />
| Central City<br />
| Central City (Overworld)<br />
|-<br />
| 37<br />
| Gimme Shelter<br />
| Gimme Shelter (Overworld)<br />
|-<br />
| 38<br />
| Death Egg<br />
| Death Egg (Overworld)<br />
|-<br />
| 39 <br />
| Green Hill Stage<br />
| Green Hill<br />
|-<br />
|}<br />
|}<br />
<br />
==Production Credits==<br />
{{multicol|<br />
Producer: [[Yuji Naka]]<br/><br />
Director: [[Tomoyuki Hayashi]]<br/><br />
Battle Mode Planner: [[Tomoyuki Hayashi]]<br/><br />
Story Mode Planner: [[Asahiko Kikuchi]]<br/><br />
Planning Support: Mizuki Hosoyamada, [[Ai Mashima]]<br/><br />
System & Com Programmer: Yoshihiko Toyoshima<br/><br />
Story Mode Programmer: [[Takahiro Hamano]]<br/><br />
Battle Mode Programmer: [[Tomoyuki Hayashi]]<br/><br />
Minigame Programmers: Nobuo Nakagawa, Yoshihiko Toyoshima<br/><br />
Chief Animator: Yasuda Denneikoushi<br/><br />
Character Animators: Sachi Nakamura, Asao Furukawa, Hiroaki Ishige, Ryuta Kawasaki, Kentaro Sakamoto<br/><br />
Map Designer: Toru Kawaguchi<br/><br />
Advertise Designers: Takeshi Ichimura, Miho Hyakutake, Takao Kawase<br/><br />
Minigame Designer: Takao Kawase<br/><br />
Illustrator: Hisanobu Kometani<br/><br />
Design Coordinator: [[Yuji Uekawa]]<br/><br />
Character Design Support: Hiroshi Tanigawa, Tomoki Miyazaki, Arito Chujo, Noriko Shibuya, Norichika Neguro, Masaru Kuribayashi<br/><br />
Special Thanks: Yasuko Maruyama<br><br />
Sound Created By: [[Wave Master]]<br><br />
Sound Creators: [[Tatsuyuki Maeda]], [[Kenichi Tokoi]], [[Hideaki Kobayashi]]<br/><br />
Character Voices (Japanese): [[Jun'ichi Kanemaru]] ([[Sonic the Hedgehog]]), [[Ryo Hirohashi]] ([[Miles "Tails" Prower]]), [[Nobutoshi Kanna]] ([[Knuckles the Echidna]]), [[Taeko Kawata]] ([[Amy Rose]]), [[Taiten Kusunoki]] ([[Chaos Gamma]]), [[Kouji Yusa]] ([[Shadow the Hedgehog]]), [[Rumi Ochiai]] ([[Rouge the Bat]]), Sayaka Aoki ([[Cream the Rabbit]]), [[Chikao Otsuka]] ([[Dr. Eggman]])<br/><br />
Character Voices (English): [[Ryan Drummond]] (Sonic), [[William Corkery]] (Tails), [[Scott Dreier]] (Knuckles), [[Jennifer Douillard|Jenny Douillard]] (Amy), [[Jon St. John]] (Chaos Gamma), [[David Humphrey]] (Shadow), [[Lani Minella]] (Rouge), [[Sarah Wulfeck]] (Cream), [[Deem Bristow]] (Eggman)<br />
<br />
===Sega Corporation===<br />
Executive Management: [[Hideki Okamura]], [[Masanao Maeda]], [[Toshihiro Nagoshi]], Yukio Sugino<br><br />
Marketing Dept.: Miutsuru Takahashi, Naoko Ooka, Marino Takeda<br><br />
Public Relations: Yasushi Hagumo, Youko Nagasawa<br><br />
International Business & Product Development: Tatsuyuki Miyazaki, Yusuke Suai<br><br />
<br />
===Sega Logistics Service Co., Ltd===<br />
Product Management: Junichi Shimizu<br><br />
Product Support: Akira Nishkawa, Akira Terasawa, Kazuhiko Morii<br><br />
Product Test: Yutaka Kawasaki, Daisuke Izichi, Satoshi Yamane, Junko Ota, Sou Ishida<br><br />
Package & Software Manual Production: Yoshihiro Sakuta, Satoru Ishigami, Kazuaki Jikuhara, Hisakazu Nakagawa, Asako Niyajima<br><br />
Customer Support: Kazunori Yagi, Shoko Goto<br><br />
<br />
===Sega of America, Inc.===<br />
Director Of Product Development: Osamu Shibamiya<br><br />
Localization Producer: [[Jason Kuo]]<br><br />
Test Director: Deborah Kirkham<br><br />
Project Lead: Shawn Dobbins<br><br />
Executive Vice President: [[Shinobu Toyoda]]<br><br />
Product Manager: Heather Hall<br><br />
Senior Media Specialist: Teri Higgins<br><br />
Creative Services Manager: Arianne Mccarthy<br><br />
Public Relations Manager: Bret Blount<br><br />
Special Thanks: Yosuke Moriya, Lori Von Rueden, Klayton Vorlick<br><br />
<br />
===Sega Europe, Ltd.===<br />
President/COO: Naoya Tsurumi<br><br />
Executive Vice President Sales & Marketing: Mike Sherlock<br><br />
Executive Vice President Product Development: [[Jin Shimazaki]]<br><br />
Localization Producer: Akiko Uchida<br><br />
Senior Producer: Matt O'Driscoll<br><br />
Technical Producer: Elliott Martin<br><br />
European Marketing Director: Matthew Woodley<br><br />
European Marketing Manager: Gary Knight<br> <br />
European Product Manager: Mat Quaek<br><br />
QA: Darius Sadeghian, David Smith, Roy Boateng, Chris Geiles<br><br />
Executive Producer: [[Hisao Oguchi]]<br><br />
}}<br />
==Resources==<br />
<br />
[[Prof. Gerald's Journal (Sonic Battle)|Transcript of Gerald's Journal]] - The deceased Professor's notes, gradually unlocked while clearing the game a second time.<br />
<br />
===Physical Scans===<br />
{{Scanbox<br />
| console=Game Boy Advance<br />
| region=US<br />
| front=sbattle-box-us.jpg<br />
| back=<br />
| spine=<br />
| spinemissing=<br />
| square=yes<br />
| cart=Battle gba us cart.jpg<br />
| item1=Sonic_Battle_Poster.jpg<br />
| item1name=Poster<br />
| manual=<br />
}}{{Scanbox<br />
| console=Game Boy Advance<br />
| region=EU<br />
| front=sbat_eu_boxart.jpg<br />
| back=Sbat eu boxart back.jpg<br />
| spine=<br />
| spinemissing=yes<br />
| square=yes<br />
| cart=Battle-eu-cart.jpg<br />
| manual=<br />
}}{{Scanbox<br />
| console=Game Boy Advance<br />
| region=JP<br />
| front=Sbat_jp_boxart.jpg<br />
| back=<br />
| spine=<br />
| spinemissing=<br />
| square=yes<br />
| cart=Battle gba jp cart.jpg<br />
| item1=Battle gba jp cart2.jpg<br />
| item1name=Alt Cart<br />
| manual=<br />
}}<br />
<br />
===Artwork===<br />
<gallery ><br />
Image:Sonicbattlelogo.png<br />
Image:Sonic battle 1.png<br />
Image:Sonic battle 2.png<br />
Image:Sonic battle 3.png<br />
Image:Tails battle.png<br />
Image:Knuckles battle.png<br />
Image:Amy battle.png<br />
Image:Shadow battle.png<br />
Image:Shadow battle02.png<br />
Image:Shadow battle03.png<br />
File:Battle Rouge.png<br />
Image:Cream battle.png<br />
Image:Cream battle02.png<br />
Image:Chaos battle giant.png<br />
Image:E102-sb.png<br />
Image:Emerl battle giant.png<br />
</gallery><br />
<br />
===Wallpaper===<br />
Official wallpaper available from the Sonic Team website:<br />
<br />
<gallery><br />
Image:Sb sonic 1280x1024.jpg<br />
Image:Sb tails 1280x1024.jpg<br />
Image:Sb knuckles 1280x1024.jpg<br />
Image:Sb amy 1280x1024.jpg<br />
Image:Sb shadow 1280x1024.jpg<br />
Image:Sb rouge 1280x1024.jpg<br />
Image:Sb cream 1280x1024.jpg<br />
Image:Sb chaos 1280x1024.jpg<br />
Image:Sb e-102 1280x1024.jpg<br />
Image:Sb emerl 1280x1024.jpg<br />
</gallery><br />
<br />
{{SonicBattle}}<br />
{{SonicAdvGames}}<br />
<br />
[[Category:Game Boy Advance games]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=NineKolor&diff=209781NineKolor2014-06-11T14:47:13Z<p>RetroUser: </p>
<hr />
<div>{{sub-stub}}<br />
{{Program<br />
| screen=NineKolor.png<br />
| category=Graphics editor<br />
| version=0.1<br />
| system=Microsoft Windows<br />
| credits=[[Nineko]]<br />
| obsolete=y<br />
}}<br />
'''NineKolor''' is a very simple utility that allows one to see the RGB values of each pixel in a specific image. It gives both decimal and hexadecimal values.<br />
You can either load an existing picture or paste something from the clipboard. Then you get the RGB values by simply moving the mouse here and there.<br />
<br />
'''NOTE:''' You will need the file "MSVBVM50.dll" to run the file. You can download it from [http://www.dll-files.com/dllindex/dll-files.shtml?msvbvm50 here].<br />
<br />
==Downloads==<br />
{{Download|version=0.1|file=NineKolor.zip|filesize=8KB}}<br />
<br />
[[Category:Programs]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=NineKolor&diff=209774NineKolor2014-06-10T20:05:30Z<p>RetroUser: That's better.</p>
<hr />
<div>{{sub-stub}}<br />
[[Image:NineKolor.png|thumb|right|NineKolor showing the RGB values of a screenshot from ''[[Sonic 1 Remastered (hack)|Sonic 1 Remastered]]'']]<br />
'''NineKolor''' is a very simple utility that allows one to see the RGB values of each pixel in a specific image. It gives both decimal and hexadecimal values.<br />
You can either load an existing picture or paste something from the clipboard. Then you get the RGB values simply moving the mouse here and there.<br />
<br />
'''NOTE:''' You will need the file "MSVBVM50.dll" to run the file. You can download from here. [http://www.dll-files.com/dllindex/dll-files.shtml?msvbvm50]<br />
<br />
==Downloads==<br />
{{Download|version=0.1|file=NineKolor.zip|filesize=8KB}}<br />
<br />
[[Category:Programs]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG:Sonic_the_Hedgehog_2_(Master_System)&diff=208903SCHG:Sonic the Hedgehog 2 (Master System)2014-06-04T21:10:51Z<p>RetroUser: </p>
<hr />
<div>{{SCHG S2SMS}}<br />
__NOTOC__<br />
<br />
==Contributors==<br />
*[[Ambil]]<br />
*[[doc eggfan]]<br />
*[[Glitch]]<br />
*[[User:Hivebrain|Hivebrain]]<br />
*[[Rolken]]<br />
<br />
<br />
==ROM Contents==<br />
<br />
{| class=prettytable<br />
! Offset||Description<br />
|-<br />
| A4C-DEA<br />
| Level select text (plain ASCII format)<br />
|-<br />
| E1C-E4B<br />
| Level select level pointers<br />
|-<br />
| 28F0<br />
| Pointers for title card mappings (16-bit, little endian)<br />
|-<br />
| 2904-2FA7<br />
| Mappings for title cards & act results screens<br />
|-<br />
| 55E5<br />
| Pointers for level headers (16-bit, little endian)<br />
|-<br />
| 5635-585A<br />
| Level headers<br />
|-<br />
| 10000<br />
| Uncompressed art - Sonic<br />
|-<br />
| 13800<br />
| Compressed Art - bubble (ALZ)<br />
|-<br />
| 13930<br />
| Compressed Art - jumping pig enemy (GMZ)<br />
|-<br />
| 13BD0<br />
| Compressed Art - small yellow numbers (unused)<br />
|-<br />
| 13CF8<br />
| Compressed Art - spinning turtle enemy (SHZ/SEZ/CEZ)<br />
|-<br />
| 14000<br />
| Uncompressed art - Sonic gliding (SHZ)<br />
|-<br />
| 15E00<br />
| Uncompressed art - Sonic riding a minecart (UGZ/GMZ)<br />
|-<br />
| 18000<br />
| Uncompressed art - Sonic runnning round a loop (ALZ/GHZ)<br />
|-<br />
| 1BC00<br />
| Compressed Art - spinning wheel (CEZ)<br />
|-<br />
| 1BE60<br />
| Compressed Art - block (CEZ)<br />
|-<br />
| 1C000<br />
| Compressed Art - numbers, lives icon<br />
|-<br />
| 1C2CA<br />
| Compressed Art - collected ring sparkles<br />
|-<br />
| 1C306<br />
| Compressed Art - invincibility sparkles<br />
|-<br />
| 1C332<br />
| Compressed Art - explosion<br />
|-<br />
| 1C462<br />
| Compressed Art - monitor (generic)<br />
|-<br />
| 1C608<br />
| Uncompressed art - monitors (specific)<br />
|-<br />
| 1CCC8<br />
| Compressed Art - rings (dropped when Sonic gets hit)<br />
|-<br />
| 1CE98<br />
| Compressed Art - moving platform (GHZ)<br />
|-<br />
| 1CF92<br />
| Compressed Art - glider (SHZ)<br />
|-<br />
| 1D20E<br />
| Uncompressed art - prison capsule<br />
|-<br />
| 1DACE<br />
| Uncompressed art - animals<br />
|-<br />
| 1E0CE<br />
| Compressed Art - cloud & tree from scrolling text on title cards<br />
|-<br />
| 1E124<br />
| Uncompressed art - end of act signpost<br />
|-<br />
| 1EDA4<br />
| Compressed Art - minecart (UGZ/GMZ)<br />
|-<br />
| 1EE48<br />
| Uncompressed art - minecart wheel (UGZ/GMZ)<br />
|-<br />
| 1EEC8<br />
| Compressed Art - minecart wheel (UGZ/GMZ)<br />
|-<br />
| 1F040<br />
| Compressed Art - broken minecart (UGZ/GMZ)<br />
|-<br />
| 1F0EA<br />
| Uncompressed art - Silver Sonic (SEZ)<br />
|-<br />
| 1F96A<br />
| Compressed Art - log (SHZ)<br />
|-<br />
| 1F9B4<br />
| Compressed Art - moving platform (SHZ)<br />
|-<br />
| 1FAB4<br />
| Empty<br />
|-<br />
| 20000<br />
| Compressed Art - circle & floor from intro sequence<br />
|-<br />
| 206A0<br />
| Compressed Art - beta title screen (unused)<br />
|-<br />
| 213B0<br />
| 32x32 mappings - intro sequence<br />
|-<br />
| 216E0<br />
| 32x32 mappings - title screen<br />
|-<br />
| 21A32<br />
| Level layout - intro sequence (uncompressed)<br />
|-<br />
| 21AB2<br />
| Level layout - title screen (uncompressed)<br />
|-<br />
| 21B32<br />
| Uncompressed art - mini Sonic from intro sequence<br />
|-<br />
| 22832<br />
| Compressed Art - scenery from intro sequence<br />
|-<br />
| 229A2<br />
| Compressed Art - Sonic's hand from title screen<br />
|-<br />
| 22C32<br />
| Compressed Art - Tails' face from title screen<br />
|-<br />
| 22DA2<br />
| Mappings for title screen<br />
|-<br />
| 2307C<br />
| Unknown<br />
|-<br />
| 23C72<br />
| Empty<br />
|-<br />
| 24000<br />
| Code<br />
|-<br />
| 2411F<br />
| Palette - unknown (4 shades of grey)<br />
|-<br />
| 2412F<br />
| Palette - unknown<br />
|-<br />
| 2413F<br />
| Palette - unknown<br />
|-<br />
| 2414F<br />
| Palette - title cards<br />
|-<br />
| 2415F<br />
| Palette - Sonic (GHZ)<br />
|-<br />
| 2416F<br />
| Palette - Sonic (SHZ1/3)<br />
|-<br />
| 2417F<br />
| Palette - Sonic (SHZ2)<br />
|-<br />
| 2418F<br />
| Palette - Sonic (ALZ1/3)<br />
|-<br />
| 2419F<br />
| Palette - Sonic (ALZ2)<br />
|-<br />
| 241AF<br />
| Palette - Sonic (UGZ)<br />
|-<br />
| 241BF<br />
| Palette - Sonic (GMZ)<br />
|-<br />
| 241CF<br />
| Palette - Sonic (SEZ)<br />
|-<br />
| 241DF<br />
| Palette - Sonic (CEZ1/2)<br />
|-<br />
| 241EF<br />
| Palette - Sonic (CEZ3)<br />
|-<br />
| 241FF<br />
| Palette - UGZ<br />
|-<br />
| 2420F<br />
| Palette - SHZ1/3<br />
|-<br />
| 2421F<br />
| Palette - SHZ2<br />
|-<br />
| 2422F<br />
| Palette - ALZ1/3<br />
|-<br />
| 2423F<br />
| Palette - ALZ2<br />
|-<br />
| 2424F<br />
| Palette - GHZ<br />
|-<br />
| 2425F<br />
| Palette - GMZ<br />
|-<br />
| 2426F<br />
| Palette - SEZ<br />
|-<br />
| 2427F<br />
| Palette - CEZ1/2<br />
|-<br />
| 2428F<br />
| Palette - CEZ3<br />
|-<br />
| 2429F<br />
| Palette - intro sequence<br />
|-<br />
| 242AF<br />
| Palette - title screen<br />
|-<br />
| 242BF<br />
| Palette - intro sequence<br />
|-<br />
| 242CF<br />
| Palette - title screen<br />
|-<br />
| 242DF<br />
| Palette - unknown<br />
|-<br />
| 242EF<br />
| Palettes (7) - title cards (UGZ, SHZ, ALZ, GHZ, GMZ, SEZ, CEZ)<br />
|-<br />
| 2435F<br />
| Palette - unknown<br />
|-<br />
| 2436F<br />
| Palette - Sonic (ending)<br />
|-<br />
| 2437F<br />
| Palette - unknown<br />
|-<br />
| 2438F<br />
| Palettes (8) - ending (gradually changes from day to night)<br />
|-<br />
| 2440F<br />
| Palette - blank<br />
|-<br />
| 2441F<br />
| Loop XY motion data (ALZ/GHZ)<br />
|-<br />
| 24D1E<br />
| Compressed Art - level select text<br />
|-<br />
| 2511E<br />
| Compressed Art - text from title cards<br />
|-<br />
| 260A4<br />
| Compressed Art - UGZ level tiles<br />
|-<br />
| 270DC<br />
| Compressed Art - yellow bird (SHZ)<br />
|-<br />
| 2715C<br />
| Compressed Art - spears (ALZ)<br />
|-<br />
| 2724E<br />
| Compressed Art - moving platform (GMZ)<br />
|-<br />
| 2724E<br />
| Compressed Art - moving platform (SEZ)<br />
|-<br />
| 273E8<br />
| Compressed Art - newtron (UGZ/SHZ/GHZ)<br />
|-<br />
| 27654<br />
| Compressed Art - bomb enemy (GMZ/SEZ)<br />
|-<br />
| 27782<br />
| Compressed Art - moving platform (UGZ)<br />
|-<br />
| 27870<br />
| Compressed Art - crab (UGZ/ALZ/GHZ/SEZ/CEZ)<br />
|-<br />
| 27B90<br />
| Compressed Art - splash (ALZ)<br />
|-<br />
| 27BE0<br />
| Compressed Art - water (ALZ)<br />
|-<br />
| 27C10<br />
| Compressed Art - falling spike (UGZ)<br />
|-<br />
| 27CB0<br />
| Compressed Art - falling spike (GMZ)<br />
|-<br />
| 27D50<br />
| Compressed Art - bubble (ALZ)<br />
|-<br />
| 27E51<br />
| Empty<br />
|-<br />
| 28000<br />
| Compressed Art - SHZ1/3 level tiles<br />
|-<br />
| 291DC<br />
| Compressed Art - SHZ2 level tiles<br />
|-<br />
| 2A2AC<br />
| Compressed Art - GMZ level tiles<br />
|-<br />
| 2B2E2<br />
| Compressed Art - text from ending sequence<br />
|-<br />
| 2B812<br />
| Empty<br />
|-<br />
| 2C000<br />
| 32x32 mappings - SHZ1/3<br />
|-<br />
| 2D8C0<br />
| 32x32 mappings - SHZ2<br />
|-<br />
| 2F080<br />
| Level layout - CEZ1 (compressed)<br />
|-<br />
| 2FA48<br />
| Empty<br />
|-<br />
| 30000<br />
| 32x32 mappings - GHZ<br />
|-<br />
| 316C0<br />
| 32x32 mappings - ALZ<br />
|-<br />
| 32F80<br />
| Level layout - SHZ3 (compressed)<br />
|-<br />
| 33716<br />
| Level layout - GMZ3 (compressed)<br />
|-<br />
| 34000<br />
| Level layout - GHZ1 (compressed)<br />
|-<br />
| 34C6B<br />
| Level layout - GHZ2 (compressed)<br />
|-<br />
| 35884<br />
| Level layout - GHZ3 (compressed)<br />
|-<br />
| 36429<br />
| Level layout - SHZ1 (compressed)<br />
|-<br />
| 370D8<br />
| Level layout - SHZ2 (compressed)<br />
|-<br />
| 38000<br />
| Level layout - ALZ1 (compressed)<br />
|-<br />
| 38F68<br />
| Level layout - ALZ2 (compressed)<br />
|-<br />
| 39DFF<br />
| Level layout - ALZ3 (compressed)<br />
|-<br />
| 3ADBB<br />
| Level layout - UGZ1 (compressed)<br />
|-<br />
| 3C000<br />
| 32x32 mappings - ALZ2<br />
|-<br />
| 3DD80<br />
| 32x32 mappings - UGZ<br />
|-<br />
| 3F380<br />
| Compressed Art - "Game Over" text<br />
|-<br />
| 3F75A<br />
| Compressed Art - numbers 0 to 9 in scrolling GHZ style<br />
|-<br />
| 3FB7E<br />
| Mappings for Game Over screen<br />
|-<br />
| 3FC5E<br />
| Empty<br />
|-<br />
| 40000<br />
| Uncompressed art - Sonic (mirrored)<br />
|-<br />
| 43680<br />
| Compressed Art - little wavy lines (?)<br />
|-<br />
| 436C0<br />
| Compressed Art - fireball (UGZ)<br />
|-<br />
| 43722<br />
| Compressed Art - mini flame (UGZ)<br />
|-<br />
| 43740<br />
| Compressed Art - lobster enemy (ALZ)<br />
|-<br />
| 439A0<br />
| Compressed Art - burrobot (GMZ)<br />
|-<br />
| 43C82<br />
| Compressed Art - moto bug (UGZ/GHZ)<br />
|-<br />
| 43E28<br />
| Compressed Art - fish enemy (CEZ)<br />
|-<br />
| 43EDA<br />
| Empty<br />
|-<br />
| 44000<br />
| Uncompressed art - Sonic gliding (mirrored)<br />
|-<br />
| 45E00<br />
| Uncompressed art - Sonic riding a minecart (mirrored)<br />
|-<br />
| 48000<br />
| Uncompressed art - Sonic running round a loop (mirrored)<br />
|-<br />
| 4BC00<br />
| Compressed Art - block (SEZ)<br />
|-<br />
| 4BC80<br />
| Compressed Art - moving platform (CEZ)<br />
|-<br />
| 4BD46<br />
| Compressed Art - levitating spiked rock (CEZ)<br />
|-<br />
| 4C000<br />
| Level layout - GMZ1 (compressed)<br />
|-<br />
| 4CC68<br />
| Level layout - GMZ2 (compressed)<br />
|-<br />
| 4DA91<br />
| Level layout - SEZ1 (compressed)<br />
|-<br />
| 4E9C9<br />
| Level layout - SEZ2 (compressed)<br />
|-<br />
| 4F76E<br />
| Compressed Art - Tails & Eggman from intro sequence<br />
|-<br />
| 4FC2A<br />
| Empty<br />
|-<br />
| 50000<br />
| Compressed Art - SEZ1/3 level tiles<br />
|-<br />
| 5102A<br />
| Compressed Art - SEZ2 level tiles<br />
|-<br />
| 52102<br />
| Uncompressed art - UGZ boss<br />
|-<br />
| 52E42<br />
| Compressed Art - "END" from ending sequence<br />
|-<br />
| 53002<br />
| Compressed Art - Tails running in ending sequence<br />
|-<br />
| 53850<br />
| Compressed Art - Tails looking up in ending sequence<br />
|-<br />
| 53960<br />
| Uncompressed art - chaos emeralds<br />
|-<br />
| 54000<br />
| Compressed Art - ALZ1/3 level tiles<br />
|-<br />
| 550F0<br />
| Compressed Art - ALZ2 level tiles<br />
|-<br />
| 56116<br />
| Compressed Art - CEZ1/2 level tiles<br />
|-<br />
| 56E7E<br />
| Compressed Art - CEZ3 level tiles<br />
|-<br />
| 58000<br />
| 32x32 mappings - GMZ<br />
|-<br />
| 59960<br />
| 32x32 mappings - SEZ1/3<br />
|-<br />
| 5AF20<br />
| 32x32 mappings - ending sequence / original GHZ<br />
|-<br />
| 5B900<br />
| Empty<br />
|-<br />
| 5C000<br />
| 32x32 mappings - SEZ2<br />
|-<br />
| 5D760<br />
| 32x32 mappings - CEZ3<br />
|-<br />
| 5E000<br />
| Compressed Art - GHZ level tiles<br />
|-<br />
| 5F11B<br />
| Level layout - UGZ2 (compressed)<br />
|-<br />
| 60000<br />
| 32x32 mappings - CEZ1/2<br />
|-<br />
| 61600<br />
| Compressed Art - title screen<br />
|-<br />
| 6299A<br />
| Compressed Art - Eggman final boss (CEZ3)<br />
|-<br />
| 6339C<br />
| Compressed Art - cloud (CEZ3)<br />
|-<br />
| 633CC<br />
| Empty<br />
|-<br />
| 64000<br />
| Compressed Art - UGZ title card pic<br />
|-<br />
| 649A0<br />
| Compressed Art - SHZ title card pic<br />
|-<br />
| 65410<br />
| Compressed Art - ALZ title card pic<br />
|-<br />
| 65DC0<br />
| Compressed Art - GHZ title card pic<br />
|-<br />
| 66446<br />
| Compressed Art - GMZ title card pic<br />
|-<br />
| 66C26<br />
| Compressed Art - SEZ title card pic<br />
|-<br />
| 670A6<br />
| Compressed Art - CEZ title card pic<br />
|-<br />
| 67806<br />
| Mappings for title card pics<br />
|-<br />
| 67F06<br />
| Empty<br />
|-<br />
| 68000<br />
| Uncompressed art - GMZ boss<br />
|-<br />
| 68980<br />
| Uncompressed art - SHZ boss<br />
|-<br />
| 69740<br />
| Uncompressed art - ALZ boss<br />
|-<br />
| 6A0C0<br />
| Uncompressed art - GHZ boss<br />
|-<br />
| 6B340<br />
| Compressed Art - rock (SHZ)<br />
|-<br />
| 6B460<br />
| Compressed Art - fragment of a smashed block (all zones)<br />
|-<br />
| 6B4EA<br />
| Uncompressed art - Tails (CEZ3)<br />
|-<br />
| 6C000<br />
| Level layout - UGZ3 (compressed)<br />
|-<br />
| 6C6D3<br />
| Level layout - SEZ3 (compressed)<br />
|-<br />
| 6D1F5<br />
| Level layout - CEZ2 (compressed)<br />
|-<br />
| 6DE81<br />
| Level layout - CEZ3 (compressed)<br />
|-<br />
| 6DFD7<br />
| Level layout - good ending sequence (compressed)<br />
|-<br />
| 6E151<br />
| Level layout - bad ending sequence (compressed)<br />
|-<br />
| 6E2C2<br />
| Compressed Art - original GHZ level tiles from ending sequence<br />
|-<br />
| 6F719<br />
| Empty<br />
|-<br />
| 70000<br />
| Unknown<br />
|-<br />
| 75C00<br />
| Uncompressed art - rings (UGZ)<br />
|-<br />
| 75F00<br />
| Uncompressed art - rings (SHZ1/3)<br />
|-<br />
| 76200<br />
| Uncompressed art - rings (SHZ2)<br />
|-<br />
| 76500<br />
| Uncompressed art - rings (ALZ)<br />
|-<br />
| 76800<br />
| Uncompressed art - rings (GHZ)<br />
|-<br />
| 76B00<br />
| Uncompressed art - rings (GMZ)<br />
|-<br />
| 76E00<br />
| Uncompressed art - rings (SEZ)<br />
|-<br />
| 77100<br />
| Uncompressed art - rings (CEZ)<br />
|-<br />
| 77400<br />
| Unknown<br />
|-<br />
| 77552<br />
| Credits (plain ASCII format)<br />
|-<br />
| 77732<br />
| Empty<br />
|-<br />
| 78000<br />
| Unknown<br />
|-<br />
| 78135<br />
| Pointers for sprite layouts (16-bit, little endian)<br />
|-<br />
| 78173<br />
| Sprite layout - UGZ1<br />
|-<br />
| 782C1<br />
| Sprite layout - UGZ2<br />
|-<br />
| 7840F<br />
| Sprite layout - UGZ3<br />
|-<br />
| 7848E<br />
| Sprite layout - SHZ1<br />
|-<br />
| 784E9<br />
| Sprite layout - SHZ2<br />
|-<br />
| 78568<br />
| Sprite layout - SHZ3<br />
|-<br />
| 78584<br />
| Sprite layout - ALZ1<br />
|-<br />
| 78666<br />
| Sprite layout - ALZ2<br />
|-<br />
| 787BD<br />
| Sprite layout - ALZ3<br />
|-<br />
| 787F4<br />
| Sprite layout - GHZ1<br />
|-<br />
| 788C4<br />
| Sprite layout - GHZ2<br />
|-<br />
| 78970<br />
| Sprite layout - GHZ3<br />
|-<br />
| 78983<br />
| Sprite layout - GMZ1<br />
|-<br />
| 78A4A<br />
| Sprite layout - GMZ2<br />
|-<br />
| 78AFF<br />
| Sprite layout - GMZ3<br />
|-<br />
| 78B24<br />
| Sprite layout - SEZ1<br />
|-<br />
| 78BE2<br />
| Sprite layout - SEZ2<br />
|-<br />
| 78C7C<br />
| Sprite layout - SEZ3<br />
|-<br />
| 78C8F<br />
| Sprite layout - CEZ1<br />
|-<br />
| 78D20<br />
| Sprite layout - CEZ2<br />
|-<br />
| 78D8D<br />
| Sprite layout - CEZ3<br />
|-<br />
| 78D97<br />
| Unknown<br />
|-<br />
| 7AF41-7AF49<br />
| Cycling palette - UGZ lava<br />
|-<br />
| 7AF4A-7AF52<br />
| Cycling palette - SHZ2 rain<br />
|-<br />
| 7AF53-7AF5B<br />
| Cycling palette - ALZ water<br />
|-<br />
| 7AF5C-7AF64<br />
| Cycling palette - GMZ wheels and conveyor belts<br />
|-<br />
| 7AF9F-7AFCE<br />
| Cycling palette - CEZ3 lightning<br />
|}<br />
<br />
<br />
==Level select pointers==<br />
<br />
The pointers define which level the game goes to for each item on the level select. Each pointer consists of two bytes: one for the zone number, and one for the act number. The level numbers are as follows:<br />
<br />
{| class=prettytable<br />
! Value||Zone<br />
|-<br />
| 00??<br />
| Underground<br />
|-<br />
| 01??<br />
| Sky High<br />
|-<br />
| 02??<br />
| Aqua Lake<br />
|-<br />
| 03??<br />
| Green Hills<br />
|-<br />
| 04??<br />
| Gimmick Mt.<br />
|-<br />
| 05??<br />
| Scrambled Egg<br />
|-<br />
| 06??<br />
| Crystal Egg<br />
|-<br />
| 0700<br />
| Bad Ending Sequence<br />
|-<br />
| 0701<br />
| Good Ending Sequence<br />
|-<br />
| 0900<br />
| Intro Sequence<br />
|-<br />
| 0901<br />
| Title Screen<br />
|}<br />
<br />
The act numbers are just 00, 01 and 02. There are a total of 18 entries in the pointer array.<br />
<br />
==Title card mappings==<br />
<br />
The title cards are built up with rows of 8x8 tiles. Mappings define which tiles are pulled from the VRAM and displayed on the screen. Each 8x8 tile is given a 2-byte, little endian value based on where it appears in the VRAM:<br />
<br />
[[Image:titlecards.png]]<br />
<br />
So, the letter A would mapped like so:<br />
<br />
{| class=prettytable<br />
| 0111<br />
| 0211<br />
|-<br />
| 0C11<br />
| 0D11<br />
|}<br />
<br />
Spaces not containing any letters are 7011. Here are the ROM addresses for each title card:<br />
<br />
{| class=prettytable<br />
! Offset||Level<br />
|-<br />
| 2904<br />
| GREEN HILLS<br />
|-<br />
| 298C<br />
| ZONE<br />
|-<br />
| 29C4<br />
| AQUA LAKE<br />
|-<br />
| 2A34<br />
| UNDERGROUND<br />
|-<br />
| 2AA4<br />
| SKY HIGH<br />
|-<br />
| 2B14<br />
| GIMMICK MT.<br />
|-<br />
| 2B84<br />
| MOUNTAIN<br />
|-<br />
| 2BF4<br />
| SCRAMBLED EGG<br />
|-<br />
| 2C64<br />
| CRYSTAL EGG<br />
|-<br />
| 2CE4<br />
| SONIC HAS<br />
|-<br />
| 2D54<br />
| PASSED<br />
|-<br />
| 2D98<br />
| RING<br />
|-<br />
| 2DAC<br />
| TIME<br />
|-<br />
| 2DC0<br />
| SCORE<br />
|-<br />
| 2DD6<br />
| 100X<br />
|-<br />
| 2DE5<br />
| 00<br />
|-<br />
| 2DF6<br />
| 00<br />
|-<br />
| 2E04<br />
| ACT 1<br />
|-<br />
| 2E90<br />
| ACT 2<br />
|-<br />
| 2F1C<br />
| ACT 3<br />
|}<br />
<br />
<br />
==Loop XY motion data==<br />
<br />
When Sonic hits a loop in either Aqua Lake or Green Hills Zone, you're momentarily unable to control him. The loop motion data determines how Sonic moves vertically and horizontally when he reaches a loop. By default, he moves in a large circle. Modifying the loop data could allow Sonic to move around virtually any shape.<br />
<br />
==Little endian things==<br />
<br />
This means 1234 becomes 3412, and 5500 becomes 0055. It's a feature of Master System ROMs which makes hacking them slightly more confusing. Pointers have to be read backwards.<br />
<br />
{{SCHGuides}}<br />
[[Category:Sonic Community Hacking Guide]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Port_Sonic_3%27s_Sound_Driver_to_Sonic_2&diff=208839SCHG How-to Talk:Port Sonic 3's Sound Driver to Sonic 22014-05-30T20:41:47Z<p>RetroUser: Wait, I'm wiping this out, since obviously I had accidentally cut myself off in the middle of a sentence, and it doesn't really belong here. *rolleyes*</p>
<hr />
<div>Yikes! Most of the guide's page-space being Sonic 2 code that we're directed to replace, what? Pre-assembled Z80 code in an AS macro assembler disassembly, the hell? "Optimised" SoundDriverLoad that isn't even as optimised as to break from the S3 norm and use Kosinski-compressed driver data, why? Hardcoded equates, huh? Outright instructing one to delete art BINCLUDEs and replace them instead of just detailing how to relocate them, ...? SMPS is intellectual property, *shrug*?<br />
<br />
Call me spoiled, but [http://forums.sonicretro.org/index.php?showtopic=32061] seems so much less hackish. Even if it uses a modified S&K driver, the use of a disassembled driver looks to make things so much easier, and that guide better fits the 'Sonic Team way' philosophy of the S1 guide, I can certainly tell you that S3 doesn't handle tempo-changing that way, having an exception programmed into PlayMusic. [[User:Clownacy|Clownacy]] 14:54, 25 May 2014 (UTC)<br />
<br />
:Hm, I think I agree, as I've tried out that driver, I like it, and it's not so arbitrary in the area of what music you can have. Trust me, I've ported Sonic 3's driver to Sonic 1, and I think that working with the music when using that driver can be a real pain. I mean, most of the time, porting music from Sonic 3D works without much work (mostly because it uses pretty much the same driver), but I HATE Sonic 3's way of sorting music, because you port a song, and your other songs turn into nothing but garbled trash. I'm pretty sure this happens because of Sonic 3's system of address pointers. -- [[User:RetroUser|RetroUser]] 17:21, 25 May 2014 (UTC)<br />
<br />
::Yeah, relative pointing, relative to the start of the sound bank, moving music around inside a bank will misalign them. That should also be a problem with Sonic 2's driver. Things like SMPS2ASM have the assembler fix the addresses for you on every build. Such logic also applys to the driver code. The branches themselves are pre-assembled, so if you tried adding code, you'd break them. Multiple bugs and redundancies have been found in the S&K driver code, and trying to apply the fixes to this would either be a huge pain, as you'd have to change multiple branches, or downright not possible for the user to do. Anyhow, I see a lot of changes on the Recent Changes page so I'll see what's new. [[User:Clownacy|Clownacy]] 14:38, 26 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Port_Sonic_3%27s_Sound_Driver_to_Sonic_2&diff=208838SCHG How-to Talk:Port Sonic 3's Sound Driver to Sonic 22014-05-30T20:38:31Z<p>RetroUser: </p>
<hr />
<div>Yikes! Most of the guide's page-space being Sonic 2 code that we're directed to replace, what? Pre-assembled Z80 code in an AS macro assembler disassembly, the hell? "Optimised" SoundDriverLoad that isn't even as optimised as to break from the S3 norm and use Kosinski-compressed driver data, why? Hardcoded equates, huh? Outright instructing one to delete art BINCLUDEs and replace them instead of just detailing how to relocate them, ...? SMPS is intellectual property, *shrug*?<br />
<br />
Call me spoiled, but [http://forums.sonicretro.org/index.php?showtopic=32061] seems so much less hackish. Even if it uses a modified S&K driver, the use of a disassembled driver looks to make things so much easier, and that guide better fits the 'Sonic Team way' philosophy of the S1 guide, I can certainly tell you that S3 doesn't handle tempo-changing that way, having an exception programmed into PlayMusic. [[User:Clownacy|Clownacy]] 14:54, 25 May 2014 (UTC)<br />
<br />
:Hm, I think I agree, as I've tried out that driver, I like it, and it's not so arbitrary in the area of what music you can have. Trust me, I've ported Sonic 3's driver to Sonic 1, and I think that working with the music when using that driver can be a real pain. I mean, most of the time, porting music from Sonic 3D works without much work (mostly because it uses pretty much the same driver), but I HATE Sonic 3's way of sorting music, because you port a song, and your other songs turn into nothing but garbled trash. I'm pretty sure this happens because of Sonic 3's system of address pointers. -- [[User:RetroUser|RetroUser]] 17:21, 25 May 2014 (UTC)<br />
<br />
::Yeah, relative pointing, relative to the start of the sound bank, moving music around inside a bank will misalign them. That should also be a problem with Sonic 2's driver. Things like SMPS2ASM have the assembler fix the addresses for you on every build. Such logic also applys to the driver code. The branches themselves are pre-assembled, so if you tried adding code, you'd break them. Multiple bugs and redundancies have been found in the S&K driver code, and trying to apply the fixes to this would either be a huge pain, as you'd have to change multiple branches, or downright not possible for the user to do. Anyhow, I see a lot of changes on the Recent Changes page so I'll see what's new. [[User:Clownacy|Clownacy]] 14:38, 26 May 2014 (UTC)<br />
<br />
:::Okay, this may seem out of place, but how do you get music ASM'd with SMPS2ASM to work with Sonic 1? Do you have to do more than simply including the _smps2asm_inc.asm file? Because when I do that, I get nothing but errors. The reason I brought this up here is because using SMPS2ASM stuff with these driver imports should certainly make life easier, but I tried Yeah, and I think that SMPS2ASM does go easy with those pointers because...I put Flamewing's S&K driver that's included with the tool into the GitHub Sonic 3K Disasm, I've been using all sorts of ASM'd music that came with the awesome ASM music archive, and I haven't gotten any garbled music...I agree with you about the whole problem with note-holding that the driver has, though, as I've heard it too. EDIT: Okay, about the smps2asm issue with Sonic 1, including the _smps2asm_inc.asm file seems to work with my S3 driver port disasm for S1, but I still get errors when including an asm music file. I wonder why... -- [[User:RetroUser|RetroUser]] 15:02, 26 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to:Add_Spin_Dash_to_Sonic_1/Part_1&diff=208834SCHG How-to:Add Spin Dash to Sonic 1/Part 12014-05-29T19:21:15Z<p>RetroUser: As I remember, this file seems to be...missing stuff in it, which is probably why building never seemed to work. Replaced it with the real one found on the disassemblies page.</p>
<hr />
<div>{{GuideBy|Lightning}}<br><br />
''updated by [[User:kram1024|kram1024]] to remove dependency on super sonic flag''<br />
<br />
This tutorial was made possible thanks to the references, guides, and information found at [[Hacking CulT]], [[The Sonic 2 Beta Page]], [[Sonic Retro]], and [[Sonicology]]. It was inspired by the [[SCHG How-to:S1 Split Guides/Basic ASM Editing (Spin Dash)|guide]] at [[The Glowing Bridge]] that details porting the simpler Spin Dash from the [[Sonic the Hedgehog 2 (Nick Arcade prototype)|''Sonic 2'' early beta]].<br />
<br />
This document is property of [[Lightning]]. Sonic and all related characters and graphics that appear on this page are property of Sega and are used without permission for no profit.<br />
<br />
==What you need==<br />
<br />
* Sonic 1 split disassembly<br />
* Sonic 2 split disassembly<br />
* A plain text editor of your choice<br />
* A tile editor capable of editing Genesis format tiles<br />
* A Sega Genesis emulator (or hardware with a copier)<br />
<br />
In making this tutorial, I used:<br />
<br />
* [[Media:Sonic 1 (Split and Text by Hivebrain) (ASM68K).zip|Hivebrain's 2005 Sonic 1 split disassembly]] (updated to ASM68K - andlabs)<br />
* [[Media:S2dasm.zip|Aurochs' 2006 Sonic 2 split disassembly]]<br />
* Leafpad 0.8.10le - GTK+ based simple text editor<br />
* Tile Molester 0.16 - Java tile editor (author's site no longer exists)<br />
* Generator/gtk 0.35 - Cross-platform Genesis emulator<br />
<br />
Other disassemblies of Sonic 1 and 2 can be used, but you'll have to work out the differences on your own (it shouldn't be too hard =P).<br />
<br />
==Directly copying the object code==<br />
<br />
Open ''sonic1.asm'' from the Sonic 1 disassembly in your text editor, and search for the phrase '''Obj01:''' (line 23466 in Hivebrain's disassembly). This should bring you to the Sonic object's code, which is what you're interested in editing right now. Now, open ''s2.asm'' from the Sonic 2 disassembly in your text editor, and search for '''Object_Sonic:''' (line 35720 in Aurochs' disassembly). This will bring you again to Sonic's object code. Having been based on the same code from Sonic 1, it shows many similarities that you should be able to spot. Thanks to the similar code, our job in porting the Spin Dash should be pretty easy!<br />
<br />
Find or scroll to the location '''Obj01_MdNormal:''' in Sonic 1's source, and '''loc_1A2B8:''' in Sonic 2's source. Below this label in each is a series of branches and jumps to subroutines that handle Sonic's actions in different situations. If you look carefully, you'll notice that there are nine of these branches in Sonic 2, but only eight in Sonic 1. That's because Sonic 2 has another branch to the code that handles the Spin Dash. You're going to add Spin Dash to Sonic 1, so the first thing to do is add a call to the Spin Dash function that you're going to copy. Don't worry about the label names from Sonic 2, since you're going to name the subroutine '''Sonic_SpinDash''' when we copy it over.<br />
<br />
In Sonic 1's code, make a copy of the line '''bsr.w Sonic_Jump''' and change it to branch to '''Sonic_SpinDash''', as shown:<br />
<br />
<asm><br />
; ---------------------------------------------------------------------------<br />
; Modes for controlling Sonic<br />
; ---------------------------------------------------------------------------<br />
<br />
Obj01_MdNormal: ; XREF: Obj01_Modes<br />
bsr.w Sonic_SpinDash ; add this line!<br />
bsr.w Sonic_Jump<br />
bsr.w Sonic_SlopeResist<br />
bsr.w Sonic_Move<br />
bsr.w Sonic_Roll<br />
bsr.w Sonic_LevelBound<br />
jsr SpeedToPos<br />
bsr.w Sonic_AnglePos<br />
bsr.w Sonic_SlopeRepel<br />
rts <br />
; ===========================================================================<br />
</asm><br />
<br />
Now, to actually copy the Spin Dash subroutine. In Sonic 2, find the label '''loc_1AC3E:'''. This is the subroutine that we are going to copy, so select from that line all the way down to where you see '''; End of subroutine loc_1AC3E''', and copy the code. In Sonic 1, find '''; End of function Sonic_JumpHeight''' and paste the block of code from Sonic 2 beneath it.<br />
<br />
There are a few changes that we need to make so this code will cooperate with the rest of the Sonic 1 code, since some of the labels in each disassembly differ from each other (the same functions have different names). The following replacements should be made (use your text editor's find and replace function, if applicable):<br />
<br />
* '''loc_1AC3E''' with '''Sonic_SpinDash'''<br />
* '''loc_1A974''' with '''Sonic_LevelBound'''<br />
* '''loc_1E234''' with '''Sonic_AnglePos'''<br />
* '''play_SFX''' with '''PlaySound_Special'''<br />
* '''word_1AD0C''' with ''''Dash_Speeds'''<br />
* remove all this code since it is a leftover artifact of super sonic:<br />
<asm><br />
tst.b ($FFFFFE19).w<br />
beq.s loc_1ACD0<br />
move.w word_1AD1E(pc,d0.w),$14(a0)<br />
<br />
loc_1ACD0:<br />
</asm><br />
* remove this too since it is super sonic's dash speeds:<br />
<asm><br />
<br />
word_1AD1E: dc.w $B00 ; 0<br />
dc.w $B80 ; 1<br />
dc.w $C00 ; 2<br />
dc.w $C80 ; 3<br />
dc.w $D00 ; 4<br />
dc.w $D80 ; 5<br />
dc.w $E00 ; 6<br />
dc.w $E80 ; 7<br />
dc.w $F00 ; 8<br />
</asm><br />
<br />
Done! You should now have a block of code that looks like the following in between where it says '''; End of function Sonic_JumpHeight''' and '''; Subroutine to slow Sonic walking up a slope''' in Sonic 1.<br />
<br />
<asm><br />
; ---------------------------------------------------------------------------<br />
; Subroutine to make Sonic perform a spindash<br />
; ---------------------------------------------------------------------------<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Sonic_SpinDash:<br />
tst.b $39(a0)<br />
bne.s loc_1AC8E<br />
cmpi.b #8,$1C(a0)<br />
bne.s locret_1AC8C<br />
move.b ($FFFFF603).w,d0<br />
andi.b #$70,d0<br />
beq.w locret_1AC8C<br />
move.b #9,$1C(a0)<br />
move.w #$E0,d0<br />
jsr (PlaySound_Special).l<br />
addq.l #4,sp<br />
move.b #1,$39(a0)<br />
move.w #0,$3A(a0)<br />
cmpi.b #$C,$28(a0)<br />
bcs.s loc_1AC84<br />
move.b #2,($FFFFD11C).w<br />
<br />
loc_1AC84:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
<br />
locret_1AC8C:<br />
rts <br />
; ---------------------------------------------------------------------------<br />
<br />
loc_1AC8E:<br />
move.b ($FFFFF602).w,d0<br />
btst #1,d0<br />
bne.w loc_1AD30<br />
move.b #$E,$16(a0)<br />
move.b #7,$17(a0)<br />
move.b #2,$1C(a0)<br />
addq.w #5,$C(a0)<br />
move.b #0,$39(a0)<br />
moveq #0,d0<br />
move.b $3A(a0),d0<br />
add.w d0,d0<br />
move.w Dash_Speeds(pc,d0.w),$14(a0)<br />
move.w $14(a0),d0<br />
subi.w #$800,d0<br />
add.w d0,d0<br />
andi.w #$1F00,d0<br />
neg.w d0<br />
addi.w #$2000,d0<br />
move.w d0,($FFFFEED0).w<br />
btst #0,$22(a0)<br />
beq.s loc_1ACF4<br />
neg.w $14(a0)<br />
<br />
loc_1ACF4:<br />
bset #2,$22(a0)<br />
move.b #0,($FFFFD11C).w<br />
move.w #$BC,d0<br />
jsr (PlaySound_Special).l<br />
bra.s loc_1AD78<br />
; ===========================================================================<br />
Dash_Speeds: dc.w $800 ; 0<br />
dc.w $880 ; 1<br />
dc.w $900 ; 2<br />
dc.w $980 ; 3<br />
dc.w $A00 ; 4<br />
dc.w $A80 ; 5<br />
dc.w $B00 ; 6<br />
dc.w $B80 ; 7<br />
dc.w $C00 ; 8<br />
; ===========================================================================<br />
<br />
loc_1AD30: ; If still charging the dash...<br />
tst.w $3A(a0)<br />
beq.s loc_1AD48<br />
move.w $3A(a0),d0<br />
lsr.w #5,d0<br />
sub.w d0,$3A(a0)<br />
bcc.s loc_1AD48<br />
move.w #0,$3A(a0)<br />
<br />
loc_1AD48:<br />
move.b ($FFFFF603).w,d0<br />
andi.b #$70,d0 ; 'p'<br />
beq.w loc_1AD78<br />
move.w #$900,$1C(a0)<br />
move.w #$E0,d0 ; 'à'<br />
jsr (PlaySound_Special).l<br />
addi.w #$200,$3A(a0)<br />
cmpi.w #$800,$3A(a0)<br />
bcs.s loc_1AD78<br />
move.w #$800,$3A(a0)<br />
<br />
loc_1AD78:<br />
addq.l #4,sp<br />
cmpi.w #$60,($FFFFEED8).w<br />
beq.s loc_1AD8C<br />
bcc.s loc_1AD88<br />
addq.w #4,($FFFFEED8).w<br />
<br />
loc_1AD88:<br />
subq.w #2,($FFFFEED8).w<br />
<br />
loc_1AD8C:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
rts<br />
; End of subroutine Sonic_SpinDash<br />
</asm><br />
<br />
Now, let's test it! Build your ROM and open it in your emulator.<br />
<br />
[[Image:testing-1.png|Spin Dashing with a strange animation]]<br />
<br />
Uh-oh, it seems like it's a bit rough around the edges right now. First of all, Sonic's Spin Dashing animation isn't present in Sonic 1, of course, and right now it's using the animation from the spot that the Spin Dash's animation data replaced. Also, the music and sounds seem to stop when you start charging a Spin Dash. That's because the sound ID that is the Spin Dash sound in Sonic 2 has a different purpose in Sonic 1. The physics of the Spin Dash are clearly in place, however. This is a good start!<br />
<br />
==Changing the animations and sounds==<br />
<br />
Now, you're going to make a few simple changes to the Spin Dash subroutine so it uses suitable animations and sounds that are already present in Sonic 1. First, find any instances of the line '''move.w #$E0,d0''' followed by '''jsr (PlaySound_Special).l'''. This code loads the sound ID #$E0 into the data register d0 and jumps to the subroutine that is responsible for playing that sound. #$E0 is not a suitable sound for a Spin Dash in Sonic 1, as mentioned earlier--it silences the music. Replace the #$E0 with #$BE in each occurance. #$BE is the sound ID of a normal spin in Sonic 1. You can check it in the sound test for yourself!<br />
<br />
Now, go up to the line containing the code '''move.b #9,$1C(a0)''', and replace the #9 with #2. This code copies the animation number to be used when Sonic starts charging his Spin Dash. #9 is the ID of the animation used for Spin Dash in Sonic 2; however, in Sonic 1, it's the ID of an unused animation presumably for warping. Animation #2 is the animation used for jumping and rolling in Sonic 1. You should have something like this:<br />
<br />
<asm><br />
move.b ($FFFFF603).w,d0<br />
andi.b #$70,d0<br />
beq.w locret_1AC8C<br />
move.b #2,$1C(a0) ; changed from #9<br />
move.w #$BE,d0 ; changed from #$E0<br />
jsr (PlaySound_Special).l<br />
</asm><br />
<br />
Now, find '''move.w #$900,$1C(a0)''' lower in the code. This puts the animation #9 and a flag to reset it to the first frame into Sonic's memory. For now, let's just comment out this line by placing a ; in front of the code, like so:<br />
<br />
<asm><br />
loc_1AD48:<br />
move.b ($FFFFF603).w,d0<br />
andi.b #$70,d0 ; 'p'<br />
beq.w loc_1AD78<br />
; move.w #$900,$1C(a0)<br />
move.w #$BE,d0 ; changed from #$E0<br />
jsr (PlaySound_Special).l<br />
</asm><br />
<br />
Save and build your ROM! Let's see how it does...<br />
<br />
[[Image:testing-2.png|Spin Dashing with rolling animation]]<br />
<br />
Success! The charging sound works fine, and the animation looks similar to the Spin Dash found in Sonic CD. Not bad! However, there are a few bugs present.<br />
<br />
First of all, collect a few rings, then start charging a Spin Dash somewhere that an enemy can shoot you or injure you somehow. If you get hit while charging, you'll still be in a Spin Dash-charging state when you land. If you let go of the down button while bouncing backwards, Sonic will release his Spin Dash right away when he hits the ground. Now, this might be awesome in itself and certainly should kill whatever badnik hurt you in the first place, but it isn't what should happen.<br />
<br />
Second, move somewhere where the camera has room to move downward. If you hold the down button to duck, then start charging the Spin Dash, the camera stays low until you are no longer rolling.<br />
<br />
[[Image:testing-2a.png|Spin Dashing with low camera]]<br />
<br />
Another problem that results from this is that if you Spin Dash before an area where your vertical position radically changes (for instance, the double-S-tube in GHZ1), the camera takes too long to catch up to you.<br />
<br />
[[Image:testing-2b.png|camera lagging behind]]<br />
<br />
==Fixing bugs==<br />
<br />
First of all, let's fix the camera issue. Go to the end of the Spin Dash subroutine, and put '''move.w #$60,($FFFFF73E).w''' just above the '''rts'''. This will reset the vertical change in the camera's position. You should have something like this:<br />
<br />
<asm><br />
loc_1AD8C:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
move.w #$60,($FFFFF73E).w ; reset looking up/down<br />
rts<br />
; End of subroutine Sonic_SpinDash<br />
</asm><br />
<br />
Save, build the ROM, and test it. You should find that the camera does reset itself when you start to Spin Dash, but if you take the double-S-tube in GHZ1, you still barely outrun the screen vertically and get killed. To fix this, find the code at the label '''Boundary_Bottom:'''. First, add a label just before the '''rts''' at the end of the block of code, named '''Boundary_Bottom_locret:'''. Then, at the beginning of '''Boundary_Bottom:''', you're going to compare two values in memory. If ($FFFFF726).w < ($FFFFF72E).w, then the screen is still scrolling down and you don't want to die. In this case, it should skip the part below that jumps to the routine KillSonic. You should add the following lines of code below '''Boundary_Bottom:'''.<br />
<br />
<asm><br />
move.w ($FFFFF726).w,d0<br />
move.w ($FFFFF72E).w,d1<br />
cmp.w d0,d1<br />
blt.s Boundary_Bottom_locret<br />
</asm><br />
<br />
You should end up with something like this:<br />
<br />
<asm><br />
Boundary_Bottom:<br />
move.w ($FFFFF726).w,d0<br />
move.w ($FFFFF72E).w,d1<br />
cmp.w d0,d1 ; screen still scrolling down?<br />
blt.s Boundary_Bottom_locret ; if so, don't kill Sonic<br />
cmpi.w #$501,($FFFFFE10).w ; is level SBZ2 ?<br />
bne.w KillSonic ; if not, kill Sonic<br />
cmpi.w #$2000,($FFFFD008).w<br />
bcs.w KillSonic<br />
clr.b ($FFFFFE30).w ; clear lamppost counter<br />
move.w #1,($FFFFFE02).w ; restart the level<br />
move.w #$103,($FFFFFE10).w ; set level to SBZ3 (LZ4)<br />
<br />
Boundary_Bottom_locret:<br />
rts <br />
; ===========================================================================<br />
</asm><br />
<br />
These fixes can also be found {{LinkRetro|topic=8593|title=here}}.<br />
<br />
Now, you'll fix the problem where Sonic is still in his Spin Dashing state after he gets injured. Find the subroutine '''HurtSonic:'''. This is the code that handles hurting Sonic, if you couldn't guess. You're going to have it clear the flag in memory that stores whether or not Sonic is Spin Dashing. Scroll to the label '''Hurt_ChkSpikes:''' and add the line '''move.b #0,$39(a0)''' directly below it. You should end up with:<br />
<br />
<asm><br />
Hurt_ChkSpikes:<br />
move.b #0,$39(a0) ; clear Spin Dash flag<br />
move.w #0,$14(a0)<br />
move.b #$1A,$1C(a0)<br />
move.w #$78,$30(a0)<br />
</asm><br />
<br />
Save, build, and test. If all is well, those bugs should be gone! Now you have a functioning Spin Dash in Sonic 1. However, it doesn't look like the Spin Dash from Sonic 2. In the next sections, we will rectify this.<br />
<br />
==Adding new tiles==<br />
<br />
Now, you'll need to add the Spin Dash tiles from [[Sonic 2]]'s tiles to [[Sonic 1]]'s; However, you'll need to pad the file ''artunc/sonic.bin'' to get room for the new tiles first. To do this, you have to create a batch file (''.bat'') with following code in the folder ''artunc'':<br />
<br />
<pre>fsutil file createnew padding.bin 16384<br />
:: Create a file called "padding.bin" with 16KB<br />
<br />
ren sonic.bin sonic_old.bin<br />
:: Rename the original "sonic.bin" to "sonic_old.bin"<br />
<br />
copy /b sonic_old.bin+padding.bin sonic.bin<br />
:: Copy the 2 files into a new "sonic.bin"</pre><br />
<!-- Backup><br />
'''''fsutil file createnew padding.bin 16384'''''<br><br />
''''' :: Create a file called "padding.bin" with 16KB'''''<br />
<br />
'''''ren sonic.bin sonic_old.bin'''''<br><br />
''''' :: Rename the original "sonic.bin" to "sonic_old.bin"'''''<br />
<br />
'''''copy /b sonic_old.bin+padding.bin sonic.bin'''''<br><br />
''''' :: Copy the 2 files into a new "sonic.bin"'''''<br />
</--><br />
<br />
Run it and you will find your ''sonic.bin'' 16KB bigger. If anything went wrong, use the backup file named as ''sonic_old.bin''<br />
<br />
<br />
Now, in your tile editor, open the padded ''artunc/sonic.bin'' and Sonic 2's ''art/uncompressed/Sonic's art.bin''. These are the tiles you're after:<br />
<br />
[[Image:copy-tiles.png|copying sonic's Spin Dash tiles]]<br />
<br />
Copy them from the Sonic 2 tiles to the end of the Sonic 1 tiles. Do note that it shouldn't matter if you use the default palette of your tile editor, as long as the one you're using for Sonic 2's tiles matches the one you're using for Sonic 1's tiles.<br />
<br />
Save the Sonic 1 file ''artunc/sonic.bin'' and close your tile editor. You may rebuild the ROM, but there shouldn't be any noticeable changes, since the game isn't coded to actually do anything with the tiles we put there yet.<br />
<br />
==Making PLCs for the tiles==<br />
<br />
Now, you'll add the pattern load cues to tell the game to load the tiles you just added. Open ''_inc/Sonic dynamic pattern load cues.asm'' in your text editor. At the bottom of the big table of offsets, and just before the label '''SonPLC_Blank:''', add the following lines:<br />
<br />
<asm><br />
dc.w SonPLC_SpinDash1-SonicDynPLC ;58<br />
dc.w SonPLC_SpinDash2-SonicDynPLC ;59<br />
dc.w SonPLC_SpinDash3-SonicDynPLC ;5A<br />
dc.w SonPLC_SpinDash4-SonicDynPLC ;5B<br />
dc.w SonPLC_SpinDash5-SonicDynPLC ;5C<br />
dc.w SonPLC_SpinDash6-SonicDynPLC ;5D<br />
</asm><br />
<br />
Note that the hex numbers commented to the side are indeces. If you were to number each line in the list you just added to in hex, starting at zero, those would be the numbers for those lines. These will be important later because they are the frame numbers that will be used in your animation.<br />
<br />
Now, at the very bottom of the file, but just before the even, insert the following lines:<br />
<br />
<asm><br />
SonPLC_SpinDash1: dc.b 1, $F5, $10 ; 01 F 510<br />
SonPLC_SpinDash2: dc.b 1, $F5, $20 ; 01 F 520<br />
SonPLC_SpinDash3: dc.b 1, $F5, $30 ; 01 F 530<br />
SonPLC_SpinDash4: dc.b 1, $F5, $40 ; 01 F 540<br />
SonPLC_SpinDash5: dc.b 1, $F5, $50 ; 01 F 550<br />
SonPLC_SpinDash6: dc.b 1, $F5, $60 ; 01 F 560<br />
</asm><br />
<br />
These lines will be built in the ROM as the hex strings found commented beside each one. The format for mappings in Sonic 1 is NN(STTT), where NN is how many times (STTT) is repeated after it. S is one less than the number of tiles to be loaded in order, and TTT is the tile index from which the game should start loading. In each of your PLCs, NN is 01, meaning there is only one instance of (STTT) after it. Also, in each of your PLCs, S is $F, which means that $10 tiles will be loaded for each. The remaining TTT is the number of the first tile in the pattern (the first row of Spin Dash tiles you copied starts at tile number $510, the second at $520, etc.).<br />
<br />
For more information about pattern load cues in Sonic 1, visit [[Sonicology]].<br />
<br />
==Mappings==<br />
<br />
Now you will make the mappings for the Spin Dash, which define the shape and size of the area to be used in placing the tiles. Open the file ''_maps/Sonic.asm'' in your text editor. Again, you're going to add some entries in the big table at the beginning of the file, much like you did in editing the PLCs. Just above the line '''byte_21292: dc.b 0''', add the following lines:<br />
<br />
<asm><br />
dc.w byte_spdh1-Map_Sonic, byte_spdh2-Map_Sonic<br />
dc.w byte_spdh3-Map_Sonic, byte_spdh4-Map_Sonic<br />
dc.w byte_spdh5-Map_Sonic, byte_spdh6-Map_Sonic<br />
</asm><br />
<br />
Then, at the bottom of the file, just before the even, add:<br />
<br />
<asm><br />
byte_spdh1: dc.b 1 ; Spin Dash 1<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh2: dc.b 1 ; Spin Dash 2<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh3: dc.b 1 ; Spin Dash 3<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh4: dc.b 1 ; Spin Dash 4<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh5: dc.b 1 ; Spin Dash 5<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh6: dc.b 1 ; Spin Dash 6<br />
dc.b $F8, $F, 0, 0, $F0<br />
</asm><br />
<br />
You might notice that these are all identical to each other, and are also very similar to the mappings for the jumping/rolling frames. The format of these mappings is structurally similar to the format of the PLCs: the first byte defines how many mapping pieces there are following it. The format is NN(YYSSFFTTXX), where NN is the number of (YYSSFFTTXX) following, YY is the Y position of the piece, SS is the size and shape (in this case, $F is a 4x4 tile square), FF is the control for certain flip and palette changes (0 in this case means not to touch it), TT is the first tile in VRAM to start reading (in this case 0 is the first tile), and XX is the X position of the piece. The Y position of these mappings, $F8, is slightly greater than that of the jumping/rolling animation, $F0. This is so Sonic doesn't appear to be hovering slightly above the ground while charging the Spin Dash.<br />
<br />
These mappings use 4x4 pieces to hold 16 tiles. You might have noticed while you were copying the Spin Dash tiles before that each frame of the animation had a row of 16 tiles, one after the other. With these mappings, those tiles will be loaded in order in four columns of four, starting with the top left and working toward the bottom right. Try arranging the tiles yourself in your tile editor in a scratch file if you want to understand how they are arranged. Just don't save over any files we're using!<br />
<br />
For more information on mappings in Sonic 1, visit [[Sonicology]].<br />
<br />
==Animation sequence==<br />
<br />
You're almost done adding in the Spin Dash graphics! Now you will add the animation sequence containing the list of frames to be used. Open the file ''_anim/Sonic.asm'' in your text editor. Yet again, we will be adding a line to the bottom of the table in the beginning, just before the line '''SonAni_Walk: dc.b $FF, 8, 9, $A, $B, 6, 7, $FF''.<br />
<br />
<asm><br />
dc.w SonAni_SpinDash-SonicAniData ;1F<br />
</asm><br />
<br />
The ''';1F''' comment after it is again an index in the table. If you were to enumerate all of the lines in this table, starting at zero, this new line would be the $1Fth line. Notice that at index 2 is the rolling animation that we are currently using, and at index 9 is the warping one that it used before we fixed it!<br />
<br />
Now, you will again add data just before the even at the end of the file:<br />
<br />
<asm><br />
SonAni_SpinDash: dc.b 0, $58, $59, $58, $5A, $58, $5B, $58, $5C, $58, $5D, $FF<br />
</asm><br />
<br />
The first byte in this animation script tells the game to use the fastest speed in this animation. Each subsequent byte until the $FF tells the game which animation frame to use. Notice that these numbers ($58, $59, etc...) are the indeces of your Spin Dash PLCs. The $FF at the end tells the game to loop the entire animation. Basically, this script will have the game cycle through the 1st, 2nd, 1st, 3rd, ..., 1st, 6th, 1st, 2nd, ... frames.<br />
<br />
==Changing the animation again==<br />
<br />
Now that you have added all the necessary information for using the new Spin Dash tiles in an animation, it's time for the last step in adding this animation: actually having the game use it! Open ''sonic1.asm'' in your text editor (if you haven't already) and find the '''Sonic_SpinDash:''' code you ported before. Change the line you changed before,<br />
<br />
<asm><br />
move.b #2,$1C(a0) ; changed from #9<br />
</asm><br />
<br />
to use your new animation found at $1F:<br />
<br />
<asm><br />
move.b #$1F,$1C(a0) ; changed from #9<br />
</asm><br />
<br />
Then, find the line you commented out before,<br />
<br />
<asm><br />
; move.w #$900,$1C(a0)<br />
</asm><br />
<br />
uncomment it, and change the value to $1F00.<br />
<br />
<asm><br />
move.w #$1F00,$1C(a0) ; changed from #$900<br />
</asm><br />
<br />
Finally, save your code, build your ROM, and try it out.<br />
<br />
[[Image:testing-3.png|Spin Dashing with Spin Dash animation]]<br />
<br />
Success! However, there's a new bug that occurs now that the game is using this new animation: while charging a Spin Dash, let an enemy touch you. Sonic gets injured, when instead the enemy should be destroyed.<br />
<br />
==Another fix==<br />
<br />
This is a relatively easy bug to fix. Find the routine '''Touch_Enemy:'''. Just above the line '''cmpi.b #2,$1C(a0) ; is Sonic rolling?''', add the following two lines:<br />
<br />
<asm><br />
cmpi.b #$1F,$1C(a0) ; is Sonic Spin Dashing?<br />
beq.w loc_1AF40 ; if yes, branch<br />
</asm><br />
<br />
You should end up with something like this:<br />
<br />
<asm><br />
Touch_Enemy: ; XREF: Touch_ChkValue<br />
tst.b ($FFFFFE2D).w ; is Sonic invincible?<br />
bne.s loc_1AF40 ; if yes, branch<br />
cmpi.b #$1F,$1C(a0) ; is Sonic Spin Dashing?<br />
beq.w loc_1AF40 ; if yes, branch<br />
cmpi.b #2,$1C(a0) ; is Sonic rolling?<br />
bne.w Touch_ChkHurt ; if not, branch<br />
</asm><br />
<br />
This code adds a check to see if the animation is #$1F, our new animation. If it is, it branches over the code that jumps to the routine to hurt Sonic. Notice that there is another comparison for if the animation is #2 present, which concealed this bug before, since we were using that animation.<br />
<br />
Save, build, and test.<br />
<br />
[[Image:testing-4.png|killing an enemy while Spin Dashing]]<br />
<br />
Pop! Congratulations, you've successfully ported the Spin Dash from Sonic 2 into Sonic 1, complete with animations. The only thing remaining to add is the Spin Dash smoke object, and fix a few more bugs.<br />
<br />
==Pu7o's continuation==<br />
<br />
Pu7o has written a [[SCHG How-to:Add Spin Dash to Sonic 1/Part 2|wonderful guide that picks up from this point.]]<br />
<br />
==Appendix==<br />
<br />
The '''Sonic_SpinDash''' routine in its entirety, with comments:<br />
<br />
<asm><br />
; ---------------------------------------------------------------------------<br />
; Subroutine to make Sonic perform a spindash<br />
; ---------------------------------------------------------------------------<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Sonic_SpinDash:<br />
tst.b $39(a0) ; already Spin Dashing?<br />
bne.s loc2_1AC8E ; if set, branch<br />
cmpi.b #8,$1C(a0) ; is anim duck<br />
bne.s locret2_1AC8C ; if not, return<br />
move.b ($FFFFF603).w,d0 ; read controller<br />
andi.b #$70,d0 ; pressing A/B/C ?<br />
beq.w locret2_1AC8C ; if not, return<br />
move.b #$1F,$1C(a0) ; set Spin Dash anim (9 in s2)<br />
move.w #$BE,d0 ; spin sound ($E0 in s2)<br />
jsr (PlaySound_Special).l ; play spin sound<br />
addq.l #4,sp ; increment stack ptr<br />
move.b #1,$39(a0) ; set Spin Dash flag<br />
move.w #0,$3A(a0) ; set charge count to 0<br />
cmpi.b #$C,$28(a0) ; ??? oxygen remaining?<br />
bcs.s loc2_1AC84 ; ??? branch if carry<br />
move.b #2,($FFFFD11C).w ; ??? $D11C is used for<br />
; the smoke/dust object<br />
loc2_1AC84:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
<br />
locret2_1AC8C:<br />
rts <br />
; ---------------------------------------------------------------------------<br />
<br />
loc2_1AC8E:<br />
move.b ($FFFFF602).w,d0 ; read controller<br />
btst #1,d0 ; check down button<br />
bne.w loc2_1AD30 ; if set, branch<br />
move.b #$E,$16(a0) ; $16(a0) is height/2<br />
move.b #7,$17(a0) ; $17(a0) is width/2<br />
move.b #2,$1C(a0) ; set animation to roll<br />
addq.w #5,$C(a0) ; $C(a0) is Y coordinate<br />
move.b #0,$39(a0) ; clear Spin Dash flag<br />
moveq #0,d0<br />
move.b $3A(a0),d0 ; copy charge count<br />
add.w d0,d0 ; double it<br />
move.w Dash_Speeds(pc,d0.w),$14(a0) ; get normal speed<br />
move.w $14(a0),d0 ; get inertia<br />
subi.w #$800,d0 ; subtract $800<br />
add.w d0,d0 ; double it<br />
andi.w #$1F00,d0 ; mask it against $1F00<br />
neg.w d0 ; negate it<br />
addi.w #$2000,d0 ; add $2000<br />
move.w d0,($FFFFEED0).w ; move to $EED0<br />
btst #0,$22(a0) ; is sonic facing right?<br />
beq.s loc2_1ACF4 ; if not, branch<br />
neg.w $14(a0) ; negate inertia<br />
<br />
loc2_1ACF4:<br />
bset #2,$22(a0) ; set unused (in s1) flag<br />
move.b #0,($FFFFD11C).w ; clear $D11C (smoke)<br />
move.w #$BC,d0 ; spin release sound<br />
jsr (PlaySound_Special).l ; play it!<br />
bra.s loc2_1AD78<br />
; ===========================================================================<br />
Dash_Speeds:<br />
dc.w $800 ; 0<br />
dc.w $880 ; 1<br />
dc.w $900 ; 2<br />
dc.w $980 ; 3<br />
dc.w $A00 ; 4<br />
dc.w $A80 ; 5<br />
dc.w $B00 ; 6<br />
dc.w $B80 ; 7<br />
dc.w $C00 ; 8<br />
; ===========================================================================<br />
<br />
loc2_1AD30: ; If still charging the dash...<br />
tst.w $3A(a0) ; check charge count<br />
beq.s loc2_1AD48 ; if zero, branch<br />
move.w $3A(a0),d0 ; otherwise put it in d0<br />
lsr.w #5,d0 ; shift right 5 (divide it by 32)<br />
sub.w d0,$3A(a0) ; subtract from charge count<br />
bcc.s loc2_1AD48 ; ??? branch if carry clear<br />
move.w #0,$3A(a0) ; set charge count to 0<br />
<br />
loc2_1AD48:<br />
move.b ($FFFFF603).w,d0 ; read controller<br />
andi.b #$70,d0 ; pressing A/B/C?<br />
beq.w loc2_1AD78 ; if not, branch<br />
move.w #$1F00,$1C(a0) ; reset spdsh animation<br />
move.w #$BE,d0 ; was $E0 in sonic 2<br />
jsr (PlaySound_Special).l ; play charge sound<br />
addi.w #$200,$3A(a0) ; increase charge count<br />
cmpi.w #$800,$3A(a0) ; check if it's maxed<br />
bcs.s loc2_1AD78 ; if not, then branch<br />
move.w #$800,$3A(a0) ; reset it to max<br />
<br />
loc2_1AD78:<br />
addq.l #4,sp ; increase stack ptr<br />
cmpi.w #$60,($FFFFEED8).w ; $EED8 only ever seems<br />
beq.s loc2_1AD8C ; to be used in Spin Dash<br />
bcc.s loc2_1AD88<br />
addq.w #4,($FFFFEED8).w<br />
<br />
loc2_1AD88:<br />
subq.w #2,($FFFFEED8).w<br />
<br />
loc2_1AD8C:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
move.w #$60,($FFFFF73E).w ; reset looking up/down<br />
rts<br />
; End of subroutine Sonic_SpinDash<br />
</asm><br />
<br />
Note: while not necessary, the '''loc_''', '''locret_''', etc. labels from the Sonic 2 disassembly were replaced with '''loc2_''', '''locret2_''', etc. to avoid potential conflict.<br />
<br />
{{S1Howtos}}<br />
[[Category:SCHG How-tos|Add Spin Dash to Sonic 1/Part 1]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to:Add_Spin_Dash_to_Sonic_1/Part_1&diff=208832SCHG How-to:Add Spin Dash to Sonic 1/Part 12014-05-29T18:42:25Z<p>RetroUser: </p>
<hr />
<div>{{GuideBy|Lightning}}<br><br />
''updated by [[User:kram1024|kram1024]] to remove dependency on super sonic flag''<br />
<br />
This tutorial was made possible thanks to the references, guides, and information found at [[Hacking CulT]], [[The Sonic 2 Beta Page]], [[Sonic Retro]], and [[Sonicology]]. It was inspired by the [[SCHG How-to:S1 Split Guides/Basic ASM Editing (Spin Dash)|guide]] at [[The Glowing Bridge]] that details porting the simpler Spin Dash from the [[Sonic the Hedgehog 2 (Nick Arcade prototype)|''Sonic 2'' early beta]].<br />
<br />
This document is property of [[Lightning]]. Sonic and all related characters and graphics that appear on this page are property of Sega and are used without permission for no profit.<br />
<br />
==What you need==<br />
<br />
* Sonic 1 split disassembly<br />
* Sonic 2 split disassembly<br />
* A plain text editor of your choice<br />
* A tile editor capable of editing Genesis format tiles<br />
* A Sega Genesis emulator (or hardware with a copier)<br />
<br />
In making this tutorial, I used:<br />
<br />
* [[Media:Sonic 1 (Split and Text by Hivebrain) (ASM68K).zip|Hivebrain's 2005 Sonic 1 split disassembly]] (updated to ASM68K - andlabs)<br />
* [[Media:S2dasm2006.zip|Aurochs' 2006 Sonic 2 split disassembly]]<br />
* Leafpad 0.8.10le - GTK+ based simple text editor<br />
* Tile Molester 0.16 - Java tile editor (author's site no longer exists)<br />
* Generator/gtk 0.35 - Cross-platform Genesis emulator<br />
<br />
Other disassemblies of Sonic 1 and 2 can be used, but you'll have to work out the differences on your own (it shouldn't be too hard =P).<br />
<br />
==Directly copying the object code==<br />
<br />
Open ''sonic1.asm'' from the Sonic 1 disassembly in your text editor, and search for the phrase '''Obj01:''' (line 23466 in Hivebrain's disassembly). This should bring you to the Sonic object's code, which is what you're interested in editing right now. Now, open ''s2.asm'' from the Sonic 2 disassembly in your text editor, and search for '''Object_Sonic:''' (line 35720 in Aurochs' disassembly). This will bring you again to Sonic's object code. Having been based on the same code from Sonic 1, it shows many similarities that you should be able to spot. Thanks to the similar code, our job in porting the Spin Dash should be pretty easy!<br />
<br />
Find or scroll to the location '''Obj01_MdNormal:''' in Sonic 1's source, and '''loc_1A2B8:''' in Sonic 2's source. Below this label in each is a series of branches and jumps to subroutines that handle Sonic's actions in different situations. If you look carefully, you'll notice that there are nine of these branches in Sonic 2, but only eight in Sonic 1. That's because Sonic 2 has another branch to the code that handles the Spin Dash. You're going to add Spin Dash to Sonic 1, so the first thing to do is add a call to the Spin Dash function that you're going to copy. Don't worry about the label names from Sonic 2, since you're going to name the subroutine '''Sonic_SpinDash''' when we copy it over.<br />
<br />
In Sonic 1's code, make a copy of the line '''bsr.w Sonic_Jump''' and change it to branch to '''Sonic_SpinDash''', as shown:<br />
<br />
<asm><br />
; ---------------------------------------------------------------------------<br />
; Modes for controlling Sonic<br />
; ---------------------------------------------------------------------------<br />
<br />
Obj01_MdNormal: ; XREF: Obj01_Modes<br />
bsr.w Sonic_SpinDash ; add this line!<br />
bsr.w Sonic_Jump<br />
bsr.w Sonic_SlopeResist<br />
bsr.w Sonic_Move<br />
bsr.w Sonic_Roll<br />
bsr.w Sonic_LevelBound<br />
jsr SpeedToPos<br />
bsr.w Sonic_AnglePos<br />
bsr.w Sonic_SlopeRepel<br />
rts <br />
; ===========================================================================<br />
</asm><br />
<br />
Now, to actually copy the Spin Dash subroutine. In Sonic 2, find the label '''loc_1AC3E:'''. This is the subroutine that we are going to copy, so select from that line all the way down to where you see '''; End of subroutine loc_1AC3E''', and copy the code. In Sonic 1, find '''; End of function Sonic_JumpHeight''' and paste the block of code from Sonic 2 beneath it.<br />
<br />
There are a few changes that we need to make so this code will cooperate with the rest of the Sonic 1 code, since some of the labels in each disassembly differ from each other (the same functions have different names). The following replacements should be made (use your text editor's find and replace function, if applicable):<br />
<br />
* '''loc_1AC3E''' with '''Sonic_SpinDash'''<br />
* '''loc_1A974''' with '''Sonic_LevelBound'''<br />
* '''loc_1E234''' with '''Sonic_AnglePos'''<br />
* '''play_SFX''' with '''PlaySound_Special'''<br />
* '''word_1AD0C''' with ''''Dash_Speeds'''<br />
* remove all this code since it is a leftover artifact of super sonic:<br />
<asm><br />
tst.b ($FFFFFE19).w<br />
beq.s loc_1ACD0<br />
move.w word_1AD1E(pc,d0.w),$14(a0)<br />
<br />
loc_1ACD0:<br />
</asm><br />
* remove this too since it is super sonic's dash speeds:<br />
<asm><br />
<br />
word_1AD1E: dc.w $B00 ; 0<br />
dc.w $B80 ; 1<br />
dc.w $C00 ; 2<br />
dc.w $C80 ; 3<br />
dc.w $D00 ; 4<br />
dc.w $D80 ; 5<br />
dc.w $E00 ; 6<br />
dc.w $E80 ; 7<br />
dc.w $F00 ; 8<br />
</asm><br />
<br />
Done! You should now have a block of code that looks like the following in between where it says '''; End of function Sonic_JumpHeight''' and '''; Subroutine to slow Sonic walking up a slope''' in Sonic 1.<br />
<br />
<asm><br />
; ---------------------------------------------------------------------------<br />
; Subroutine to make Sonic perform a spindash<br />
; ---------------------------------------------------------------------------<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Sonic_SpinDash:<br />
tst.b $39(a0)<br />
bne.s loc_1AC8E<br />
cmpi.b #8,$1C(a0)<br />
bne.s locret_1AC8C<br />
move.b ($FFFFF603).w,d0<br />
andi.b #$70,d0<br />
beq.w locret_1AC8C<br />
move.b #9,$1C(a0)<br />
move.w #$E0,d0<br />
jsr (PlaySound_Special).l<br />
addq.l #4,sp<br />
move.b #1,$39(a0)<br />
move.w #0,$3A(a0)<br />
cmpi.b #$C,$28(a0)<br />
bcs.s loc_1AC84<br />
move.b #2,($FFFFD11C).w<br />
<br />
loc_1AC84:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
<br />
locret_1AC8C:<br />
rts <br />
; ---------------------------------------------------------------------------<br />
<br />
loc_1AC8E:<br />
move.b ($FFFFF602).w,d0<br />
btst #1,d0<br />
bne.w loc_1AD30<br />
move.b #$E,$16(a0)<br />
move.b #7,$17(a0)<br />
move.b #2,$1C(a0)<br />
addq.w #5,$C(a0)<br />
move.b #0,$39(a0)<br />
moveq #0,d0<br />
move.b $3A(a0),d0<br />
add.w d0,d0<br />
move.w Dash_Speeds(pc,d0.w),$14(a0)<br />
move.w $14(a0),d0<br />
subi.w #$800,d0<br />
add.w d0,d0<br />
andi.w #$1F00,d0<br />
neg.w d0<br />
addi.w #$2000,d0<br />
move.w d0,($FFFFEED0).w<br />
btst #0,$22(a0)<br />
beq.s loc_1ACF4<br />
neg.w $14(a0)<br />
<br />
loc_1ACF4:<br />
bset #2,$22(a0)<br />
move.b #0,($FFFFD11C).w<br />
move.w #$BC,d0<br />
jsr (PlaySound_Special).l<br />
bra.s loc_1AD78<br />
; ===========================================================================<br />
Dash_Speeds: dc.w $800 ; 0<br />
dc.w $880 ; 1<br />
dc.w $900 ; 2<br />
dc.w $980 ; 3<br />
dc.w $A00 ; 4<br />
dc.w $A80 ; 5<br />
dc.w $B00 ; 6<br />
dc.w $B80 ; 7<br />
dc.w $C00 ; 8<br />
; ===========================================================================<br />
<br />
loc_1AD30: ; If still charging the dash...<br />
tst.w $3A(a0)<br />
beq.s loc_1AD48<br />
move.w $3A(a0),d0<br />
lsr.w #5,d0<br />
sub.w d0,$3A(a0)<br />
bcc.s loc_1AD48<br />
move.w #0,$3A(a0)<br />
<br />
loc_1AD48:<br />
move.b ($FFFFF603).w,d0<br />
andi.b #$70,d0 ; 'p'<br />
beq.w loc_1AD78<br />
move.w #$900,$1C(a0)<br />
move.w #$E0,d0 ; 'à'<br />
jsr (PlaySound_Special).l<br />
addi.w #$200,$3A(a0)<br />
cmpi.w #$800,$3A(a0)<br />
bcs.s loc_1AD78<br />
move.w #$800,$3A(a0)<br />
<br />
loc_1AD78:<br />
addq.l #4,sp<br />
cmpi.w #$60,($FFFFEED8).w<br />
beq.s loc_1AD8C<br />
bcc.s loc_1AD88<br />
addq.w #4,($FFFFEED8).w<br />
<br />
loc_1AD88:<br />
subq.w #2,($FFFFEED8).w<br />
<br />
loc_1AD8C:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
rts<br />
; End of subroutine Sonic_SpinDash<br />
</asm><br />
<br />
Now, let's test it! Build your ROM and open it in your emulator.<br />
<br />
[[Image:testing-1.png|Spin Dashing with a strange animation]]<br />
<br />
Uh-oh, it seems like it's a bit rough around the edges right now. First of all, Sonic's Spin Dashing animation isn't present in Sonic 1, of course, and right now it's using the animation from the spot that the Spin Dash's animation data replaced. Also, the music and sounds seem to stop when you start charging a Spin Dash. That's because the sound ID that is the Spin Dash sound in Sonic 2 has a different purpose in Sonic 1. The physics of the Spin Dash are clearly in place, however. This is a good start!<br />
<br />
==Changing the animations and sounds==<br />
<br />
Now, you're going to make a few simple changes to the Spin Dash subroutine so it uses suitable animations and sounds that are already present in Sonic 1. First, find any instances of the line '''move.w #$E0,d0''' followed by '''jsr (PlaySound_Special).l'''. This code loads the sound ID #$E0 into the data register d0 and jumps to the subroutine that is responsible for playing that sound. #$E0 is not a suitable sound for a Spin Dash in Sonic 1, as mentioned earlier--it silences the music. Replace the #$E0 with #$BE in each occurance. #$BE is the sound ID of a normal spin in Sonic 1. You can check it in the sound test for yourself!<br />
<br />
Now, go up to the line containing the code '''move.b #9,$1C(a0)''', and replace the #9 with #2. This code copies the animation number to be used when Sonic starts charging his Spin Dash. #9 is the ID of the animation used for Spin Dash in Sonic 2; however, in Sonic 1, it's the ID of an unused animation presumably for warping. Animation #2 is the animation used for jumping and rolling in Sonic 1. You should have something like this:<br />
<br />
<asm><br />
move.b ($FFFFF603).w,d0<br />
andi.b #$70,d0<br />
beq.w locret_1AC8C<br />
move.b #2,$1C(a0) ; changed from #9<br />
move.w #$BE,d0 ; changed from #$E0<br />
jsr (PlaySound_Special).l<br />
</asm><br />
<br />
Now, find '''move.w #$900,$1C(a0)''' lower in the code. This puts the animation #9 and a flag to reset it to the first frame into Sonic's memory. For now, let's just comment out this line by placing a ; in front of the code, like so:<br />
<br />
<asm><br />
loc_1AD48:<br />
move.b ($FFFFF603).w,d0<br />
andi.b #$70,d0 ; 'p'<br />
beq.w loc_1AD78<br />
; move.w #$900,$1C(a0)<br />
move.w #$BE,d0 ; changed from #$E0<br />
jsr (PlaySound_Special).l<br />
</asm><br />
<br />
Save and build your ROM! Let's see how it does...<br />
<br />
[[Image:testing-2.png|Spin Dashing with rolling animation]]<br />
<br />
Success! The charging sound works fine, and the animation looks similar to the Spin Dash found in Sonic CD. Not bad! However, there are a few bugs present.<br />
<br />
First of all, collect a few rings, then start charging a Spin Dash somewhere that an enemy can shoot you or injure you somehow. If you get hit while charging, you'll still be in a Spin Dash-charging state when you land. If you let go of the down button while bouncing backwards, Sonic will release his Spin Dash right away when he hits the ground. Now, this might be awesome in itself and certainly should kill whatever badnik hurt you in the first place, but it isn't what should happen.<br />
<br />
Second, move somewhere where the camera has room to move downward. If you hold the down button to duck, then start charging the Spin Dash, the camera stays low until you are no longer rolling.<br />
<br />
[[Image:testing-2a.png|Spin Dashing with low camera]]<br />
<br />
Another problem that results from this is that if you Spin Dash before an area where your vertical position radically changes (for instance, the double-S-tube in GHZ1), the camera takes too long to catch up to you.<br />
<br />
[[Image:testing-2b.png|camera lagging behind]]<br />
<br />
==Fixing bugs==<br />
<br />
First of all, let's fix the camera issue. Go to the end of the Spin Dash subroutine, and put '''move.w #$60,($FFFFF73E).w''' just above the '''rts'''. This will reset the vertical change in the camera's position. You should have something like this:<br />
<br />
<asm><br />
loc_1AD8C:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
move.w #$60,($FFFFF73E).w ; reset looking up/down<br />
rts<br />
; End of subroutine Sonic_SpinDash<br />
</asm><br />
<br />
Save, build the ROM, and test it. You should find that the camera does reset itself when you start to Spin Dash, but if you take the double-S-tube in GHZ1, you still barely outrun the screen vertically and get killed. To fix this, find the code at the label '''Boundary_Bottom:'''. First, add a label just before the '''rts''' at the end of the block of code, named '''Boundary_Bottom_locret:'''. Then, at the beginning of '''Boundary_Bottom:''', you're going to compare two values in memory. If ($FFFFF726).w < ($FFFFF72E).w, then the screen is still scrolling down and you don't want to die. In this case, it should skip the part below that jumps to the routine KillSonic. You should add the following lines of code below '''Boundary_Bottom:'''.<br />
<br />
<asm><br />
move.w ($FFFFF726).w,d0<br />
move.w ($FFFFF72E).w,d1<br />
cmp.w d0,d1<br />
blt.s Boundary_Bottom_locret<br />
</asm><br />
<br />
You should end up with something like this:<br />
<br />
<asm><br />
Boundary_Bottom:<br />
move.w ($FFFFF726).w,d0<br />
move.w ($FFFFF72E).w,d1<br />
cmp.w d0,d1 ; screen still scrolling down?<br />
blt.s Boundary_Bottom_locret ; if so, don't kill Sonic<br />
cmpi.w #$501,($FFFFFE10).w ; is level SBZ2 ?<br />
bne.w KillSonic ; if not, kill Sonic<br />
cmpi.w #$2000,($FFFFD008).w<br />
bcs.w KillSonic<br />
clr.b ($FFFFFE30).w ; clear lamppost counter<br />
move.w #1,($FFFFFE02).w ; restart the level<br />
move.w #$103,($FFFFFE10).w ; set level to SBZ3 (LZ4)<br />
<br />
Boundary_Bottom_locret:<br />
rts <br />
; ===========================================================================<br />
</asm><br />
<br />
These fixes can also be found {{LinkRetro|topic=8593|title=here}}.<br />
<br />
Now, you'll fix the problem where Sonic is still in his Spin Dashing state after he gets injured. Find the subroutine '''HurtSonic:'''. This is the code that handles hurting Sonic, if you couldn't guess. You're going to have it clear the flag in memory that stores whether or not Sonic is Spin Dashing. Scroll to the label '''Hurt_ChkSpikes:''' and add the line '''move.b #0,$39(a0)''' directly below it. You should end up with:<br />
<br />
<asm><br />
Hurt_ChkSpikes:<br />
move.b #0,$39(a0) ; clear Spin Dash flag<br />
move.w #0,$14(a0)<br />
move.b #$1A,$1C(a0)<br />
move.w #$78,$30(a0)<br />
</asm><br />
<br />
Save, build, and test. If all is well, those bugs should be gone! Now you have a functioning Spin Dash in Sonic 1. However, it doesn't look like the Spin Dash from Sonic 2. In the next sections, we will rectify this.<br />
<br />
==Adding new tiles==<br />
<br />
Now, you'll need to add the Spin Dash tiles from [[Sonic 2]]'s tiles to [[Sonic 1]]'s; However, you'll need to pad the file ''artunc/sonic.bin'' to get room for the new tiles first. To do this, you have to create a batch file (''.bat'') with following code in the folder ''artunc'':<br />
<br />
<pre>fsutil file createnew padding.bin 16384<br />
:: Create a file called "padding.bin" with 16KB<br />
<br />
ren sonic.bin sonic_old.bin<br />
:: Rename the original "sonic.bin" to "sonic_old.bin"<br />
<br />
copy /b sonic_old.bin+padding.bin sonic.bin<br />
:: Copy the 2 files into a new "sonic.bin"</pre><br />
<!-- Backup><br />
'''''fsutil file createnew padding.bin 16384'''''<br><br />
''''' :: Create a file called "padding.bin" with 16KB'''''<br />
<br />
'''''ren sonic.bin sonic_old.bin'''''<br><br />
''''' :: Rename the original "sonic.bin" to "sonic_old.bin"'''''<br />
<br />
'''''copy /b sonic_old.bin+padding.bin sonic.bin'''''<br><br />
''''' :: Copy the 2 files into a new "sonic.bin"'''''<br />
</--><br />
<br />
Run it and you will find your ''sonic.bin'' 16KB bigger. If anything went wrong, use the backup file named as ''sonic_old.bin''<br />
<br />
<br />
Now, in your tile editor, open the padded ''artunc/sonic.bin'' and Sonic 2's ''art/uncompressed/Sonic's art.bin''. These are the tiles you're after:<br />
<br />
[[Image:copy-tiles.png|copying sonic's Spin Dash tiles]]<br />
<br />
Copy them from the Sonic 2 tiles to the end of the Sonic 1 tiles. Do note that it shouldn't matter if you use the default palette of your tile editor, as long as the one you're using for Sonic 2's tiles matches the one you're using for Sonic 1's tiles.<br />
<br />
Save the Sonic 1 file ''artunc/sonic.bin'' and close your tile editor. You may rebuild the ROM, but there shouldn't be any noticeable changes, since the game isn't coded to actually do anything with the tiles we put there yet.<br />
<br />
==Making PLCs for the tiles==<br />
<br />
Now, you'll add the pattern load cues to tell the game to load the tiles you just added. Open ''_inc/Sonic dynamic pattern load cues.asm'' in your text editor. At the bottom of the big table of offsets, and just before the label '''SonPLC_Blank:''', add the following lines:<br />
<br />
<asm><br />
dc.w SonPLC_SpinDash1-SonicDynPLC ;58<br />
dc.w SonPLC_SpinDash2-SonicDynPLC ;59<br />
dc.w SonPLC_SpinDash3-SonicDynPLC ;5A<br />
dc.w SonPLC_SpinDash4-SonicDynPLC ;5B<br />
dc.w SonPLC_SpinDash5-SonicDynPLC ;5C<br />
dc.w SonPLC_SpinDash6-SonicDynPLC ;5D<br />
</asm><br />
<br />
Note that the hex numbers commented to the side are indeces. If you were to number each line in the list you just added to in hex, starting at zero, those would be the numbers for those lines. These will be important later because they are the frame numbers that will be used in your animation.<br />
<br />
Now, at the very bottom of the file, but just before the even, insert the following lines:<br />
<br />
<asm><br />
SonPLC_SpinDash1: dc.b 1, $F5, $10 ; 01 F 510<br />
SonPLC_SpinDash2: dc.b 1, $F5, $20 ; 01 F 520<br />
SonPLC_SpinDash3: dc.b 1, $F5, $30 ; 01 F 530<br />
SonPLC_SpinDash4: dc.b 1, $F5, $40 ; 01 F 540<br />
SonPLC_SpinDash5: dc.b 1, $F5, $50 ; 01 F 550<br />
SonPLC_SpinDash6: dc.b 1, $F5, $60 ; 01 F 560<br />
</asm><br />
<br />
These lines will be built in the ROM as the hex strings found commented beside each one. The format for mappings in Sonic 1 is NN(STTT), where NN is how many times (STTT) is repeated after it. S is one less than the number of tiles to be loaded in order, and TTT is the tile index from which the game should start loading. In each of your PLCs, NN is 01, meaning there is only one instance of (STTT) after it. Also, in each of your PLCs, S is $F, which means that $10 tiles will be loaded for each. The remaining TTT is the number of the first tile in the pattern (the first row of Spin Dash tiles you copied starts at tile number $510, the second at $520, etc.).<br />
<br />
For more information about pattern load cues in Sonic 1, visit [[Sonicology]].<br />
<br />
==Mappings==<br />
<br />
Now you will make the mappings for the Spin Dash, which define the shape and size of the area to be used in placing the tiles. Open the file ''_maps/Sonic.asm'' in your text editor. Again, you're going to add some entries in the big table at the beginning of the file, much like you did in editing the PLCs. Just above the line '''byte_21292: dc.b 0''', add the following lines:<br />
<br />
<asm><br />
dc.w byte_spdh1-Map_Sonic, byte_spdh2-Map_Sonic<br />
dc.w byte_spdh3-Map_Sonic, byte_spdh4-Map_Sonic<br />
dc.w byte_spdh5-Map_Sonic, byte_spdh6-Map_Sonic<br />
</asm><br />
<br />
Then, at the bottom of the file, just before the even, add:<br />
<br />
<asm><br />
byte_spdh1: dc.b 1 ; Spin Dash 1<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh2: dc.b 1 ; Spin Dash 2<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh3: dc.b 1 ; Spin Dash 3<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh4: dc.b 1 ; Spin Dash 4<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh5: dc.b 1 ; Spin Dash 5<br />
dc.b $F8, $F, 0, 0, $F0<br />
byte_spdh6: dc.b 1 ; Spin Dash 6<br />
dc.b $F8, $F, 0, 0, $F0<br />
</asm><br />
<br />
You might notice that these are all identical to each other, and are also very similar to the mappings for the jumping/rolling frames. The format of these mappings is structurally similar to the format of the PLCs: the first byte defines how many mapping pieces there are following it. The format is NN(YYSSFFTTXX), where NN is the number of (YYSSFFTTXX) following, YY is the Y position of the piece, SS is the size and shape (in this case, $F is a 4x4 tile square), FF is the control for certain flip and palette changes (0 in this case means not to touch it), TT is the first tile in VRAM to start reading (in this case 0 is the first tile), and XX is the X position of the piece. The Y position of these mappings, $F8, is slightly greater than that of the jumping/rolling animation, $F0. This is so Sonic doesn't appear to be hovering slightly above the ground while charging the Spin Dash.<br />
<br />
These mappings use 4x4 pieces to hold 16 tiles. You might have noticed while you were copying the Spin Dash tiles before that each frame of the animation had a row of 16 tiles, one after the other. With these mappings, those tiles will be loaded in order in four columns of four, starting with the top left and working toward the bottom right. Try arranging the tiles yourself in your tile editor in a scratch file if you want to understand how they are arranged. Just don't save over any files we're using!<br />
<br />
For more information on mappings in Sonic 1, visit [[Sonicology]].<br />
<br />
==Animation sequence==<br />
<br />
You're almost done adding in the Spin Dash graphics! Now you will add the animation sequence containing the list of frames to be used. Open the file ''_anim/Sonic.asm'' in your text editor. Yet again, we will be adding a line to the bottom of the table in the beginning, just before the line '''SonAni_Walk: dc.b $FF, 8, 9, $A, $B, 6, 7, $FF''.<br />
<br />
<asm><br />
dc.w SonAni_SpinDash-SonicAniData ;1F<br />
</asm><br />
<br />
The ''';1F''' comment after it is again an index in the table. If you were to enumerate all of the lines in this table, starting at zero, this new line would be the $1Fth line. Notice that at index 2 is the rolling animation that we are currently using, and at index 9 is the warping one that it used before we fixed it!<br />
<br />
Now, you will again add data just before the even at the end of the file:<br />
<br />
<asm><br />
SonAni_SpinDash: dc.b 0, $58, $59, $58, $5A, $58, $5B, $58, $5C, $58, $5D, $FF<br />
</asm><br />
<br />
The first byte in this animation script tells the game to use the fastest speed in this animation. Each subsequent byte until the $FF tells the game which animation frame to use. Notice that these numbers ($58, $59, etc...) are the indeces of your Spin Dash PLCs. The $FF at the end tells the game to loop the entire animation. Basically, this script will have the game cycle through the 1st, 2nd, 1st, 3rd, ..., 1st, 6th, 1st, 2nd, ... frames.<br />
<br />
==Changing the animation again==<br />
<br />
Now that you have added all the necessary information for using the new Spin Dash tiles in an animation, it's time for the last step in adding this animation: actually having the game use it! Open ''sonic1.asm'' in your text editor (if you haven't already) and find the '''Sonic_SpinDash:''' code you ported before. Change the line you changed before,<br />
<br />
<asm><br />
move.b #2,$1C(a0) ; changed from #9<br />
</asm><br />
<br />
to use your new animation found at $1F:<br />
<br />
<asm><br />
move.b #$1F,$1C(a0) ; changed from #9<br />
</asm><br />
<br />
Then, find the line you commented out before,<br />
<br />
<asm><br />
; move.w #$900,$1C(a0)<br />
</asm><br />
<br />
uncomment it, and change the value to $1F00.<br />
<br />
<asm><br />
move.w #$1F00,$1C(a0) ; changed from #$900<br />
</asm><br />
<br />
Finally, save your code, build your ROM, and try it out.<br />
<br />
[[Image:testing-3.png|Spin Dashing with Spin Dash animation]]<br />
<br />
Success! However, there's a new bug that occurs now that the game is using this new animation: while charging a Spin Dash, let an enemy touch you. Sonic gets injured, when instead the enemy should be destroyed.<br />
<br />
==Another fix==<br />
<br />
This is a relatively easy bug to fix. Find the routine '''Touch_Enemy:'''. Just above the line '''cmpi.b #2,$1C(a0) ; is Sonic rolling?''', add the following two lines:<br />
<br />
<asm><br />
cmpi.b #$1F,$1C(a0) ; is Sonic Spin Dashing?<br />
beq.w loc_1AF40 ; if yes, branch<br />
</asm><br />
<br />
You should end up with something like this:<br />
<br />
<asm><br />
Touch_Enemy: ; XREF: Touch_ChkValue<br />
tst.b ($FFFFFE2D).w ; is Sonic invincible?<br />
bne.s loc_1AF40 ; if yes, branch<br />
cmpi.b #$1F,$1C(a0) ; is Sonic Spin Dashing?<br />
beq.w loc_1AF40 ; if yes, branch<br />
cmpi.b #2,$1C(a0) ; is Sonic rolling?<br />
bne.w Touch_ChkHurt ; if not, branch<br />
</asm><br />
<br />
This code adds a check to see if the animation is #$1F, our new animation. If it is, it branches over the code that jumps to the routine to hurt Sonic. Notice that there is another comparison for if the animation is #2 present, which concealed this bug before, since we were using that animation.<br />
<br />
Save, build, and test.<br />
<br />
[[Image:testing-4.png|killing an enemy while Spin Dashing]]<br />
<br />
Pop! Congratulations, you've successfully ported the Spin Dash from Sonic 2 into Sonic 1, complete with animations. The only thing remaining to add is the Spin Dash smoke object, and fix a few more bugs.<br />
<br />
==Pu7o's continuation==<br />
<br />
Pu7o has written a [[SCHG How-to:Add Spin Dash to Sonic 1/Part 2|wonderful guide that picks up from this point.]]<br />
<br />
==Appendix==<br />
<br />
The '''Sonic_SpinDash''' routine in its entirety, with comments:<br />
<br />
<asm><br />
; ---------------------------------------------------------------------------<br />
; Subroutine to make Sonic perform a spindash<br />
; ---------------------------------------------------------------------------<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Sonic_SpinDash:<br />
tst.b $39(a0) ; already Spin Dashing?<br />
bne.s loc2_1AC8E ; if set, branch<br />
cmpi.b #8,$1C(a0) ; is anim duck<br />
bne.s locret2_1AC8C ; if not, return<br />
move.b ($FFFFF603).w,d0 ; read controller<br />
andi.b #$70,d0 ; pressing A/B/C ?<br />
beq.w locret2_1AC8C ; if not, return<br />
move.b #$1F,$1C(a0) ; set Spin Dash anim (9 in s2)<br />
move.w #$BE,d0 ; spin sound ($E0 in s2)<br />
jsr (PlaySound_Special).l ; play spin sound<br />
addq.l #4,sp ; increment stack ptr<br />
move.b #1,$39(a0) ; set Spin Dash flag<br />
move.w #0,$3A(a0) ; set charge count to 0<br />
cmpi.b #$C,$28(a0) ; ??? oxygen remaining?<br />
bcs.s loc2_1AC84 ; ??? branch if carry<br />
move.b #2,($FFFFD11C).w ; ??? $D11C is used for<br />
; the smoke/dust object<br />
loc2_1AC84:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
<br />
locret2_1AC8C:<br />
rts <br />
; ---------------------------------------------------------------------------<br />
<br />
loc2_1AC8E:<br />
move.b ($FFFFF602).w,d0 ; read controller<br />
btst #1,d0 ; check down button<br />
bne.w loc2_1AD30 ; if set, branch<br />
move.b #$E,$16(a0) ; $16(a0) is height/2<br />
move.b #7,$17(a0) ; $17(a0) is width/2<br />
move.b #2,$1C(a0) ; set animation to roll<br />
addq.w #5,$C(a0) ; $C(a0) is Y coordinate<br />
move.b #0,$39(a0) ; clear Spin Dash flag<br />
moveq #0,d0<br />
move.b $3A(a0),d0 ; copy charge count<br />
add.w d0,d0 ; double it<br />
move.w Dash_Speeds(pc,d0.w),$14(a0) ; get normal speed<br />
move.w $14(a0),d0 ; get inertia<br />
subi.w #$800,d0 ; subtract $800<br />
add.w d0,d0 ; double it<br />
andi.w #$1F00,d0 ; mask it against $1F00<br />
neg.w d0 ; negate it<br />
addi.w #$2000,d0 ; add $2000<br />
move.w d0,($FFFFEED0).w ; move to $EED0<br />
btst #0,$22(a0) ; is sonic facing right?<br />
beq.s loc2_1ACF4 ; if not, branch<br />
neg.w $14(a0) ; negate inertia<br />
<br />
loc2_1ACF4:<br />
bset #2,$22(a0) ; set unused (in s1) flag<br />
move.b #0,($FFFFD11C).w ; clear $D11C (smoke)<br />
move.w #$BC,d0 ; spin release sound<br />
jsr (PlaySound_Special).l ; play it!<br />
bra.s loc2_1AD78<br />
; ===========================================================================<br />
Dash_Speeds:<br />
dc.w $800 ; 0<br />
dc.w $880 ; 1<br />
dc.w $900 ; 2<br />
dc.w $980 ; 3<br />
dc.w $A00 ; 4<br />
dc.w $A80 ; 5<br />
dc.w $B00 ; 6<br />
dc.w $B80 ; 7<br />
dc.w $C00 ; 8<br />
; ===========================================================================<br />
<br />
loc2_1AD30: ; If still charging the dash...<br />
tst.w $3A(a0) ; check charge count<br />
beq.s loc2_1AD48 ; if zero, branch<br />
move.w $3A(a0),d0 ; otherwise put it in d0<br />
lsr.w #5,d0 ; shift right 5 (divide it by 32)<br />
sub.w d0,$3A(a0) ; subtract from charge count<br />
bcc.s loc2_1AD48 ; ??? branch if carry clear<br />
move.w #0,$3A(a0) ; set charge count to 0<br />
<br />
loc2_1AD48:<br />
move.b ($FFFFF603).w,d0 ; read controller<br />
andi.b #$70,d0 ; pressing A/B/C?<br />
beq.w loc2_1AD78 ; if not, branch<br />
move.w #$1F00,$1C(a0) ; reset spdsh animation<br />
move.w #$BE,d0 ; was $E0 in sonic 2<br />
jsr (PlaySound_Special).l ; play charge sound<br />
addi.w #$200,$3A(a0) ; increase charge count<br />
cmpi.w #$800,$3A(a0) ; check if it's maxed<br />
bcs.s loc2_1AD78 ; if not, then branch<br />
move.w #$800,$3A(a0) ; reset it to max<br />
<br />
loc2_1AD78:<br />
addq.l #4,sp ; increase stack ptr<br />
cmpi.w #$60,($FFFFEED8).w ; $EED8 only ever seems<br />
beq.s loc2_1AD8C ; to be used in Spin Dash<br />
bcc.s loc2_1AD88<br />
addq.w #4,($FFFFEED8).w<br />
<br />
loc2_1AD88:<br />
subq.w #2,($FFFFEED8).w<br />
<br />
loc2_1AD8C:<br />
bsr.w Sonic_LevelBound<br />
bsr.w Sonic_AnglePos<br />
move.w #$60,($FFFFF73E).w ; reset looking up/down<br />
rts<br />
; End of subroutine Sonic_SpinDash<br />
</asm><br />
<br />
Note: while not necessary, the '''loc_''', '''locret_''', etc. labels from the Sonic 2 disassembly were replaced with '''loc2_''', '''locret2_''', etc. to avoid potential conflict.<br />
<br />
{{S1Howtos}}<br />
[[Category:SCHG How-tos|Add Spin Dash to Sonic 1/Part 1]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Template:S2Howtos&diff=208795Template:S2Howtos2014-05-26T21:45:32Z<p>RetroUser: You didn't think that I wouldn't edit the template, did you? Trust me, I learned my lesson the first time...</p>
<hr />
<div>{| class="bottomtemplate" align="center"<br />
|-<br />
! class="bottomtemphead" | [[SCHG How-To:Guide|SCHG How-To Guide]]: ''Sonic the Hedgehog 2'' (16-bit)<br />
|-<br />
! class="bottomtemphead" | Fixing Bugs<br />
|-<br />
|class="bottomtemptext" align="center" | [[SCHG How-to:Fix demo playback|Fix Demo Playback]] | [[SCHG How-to:Fix a race condition with Pattern Load Cues|Fix a Race Condition with Pattern Load Cues]] | [[SCHG How-to:Fix bugs relating to Super Sonic|Fix Super Sonic Bugs]] | [[SCHG How-to:Use correct height when roll jumping|Use Correct Height When Roll Jumping]] | [[SCHG How-to:Fix jump height bug when exiting water|Fix Jump Height Bug When Exiting Water]] | [[SCHG How-to:Fix Sonic 2's buggy spindash code and add spindash speeds|Fix Spin Dash Code and Add Spin Dash Speeds]] | [[SCHG How-to:Fix screen boundary spindash bug|Fix Screen Boundary Spin Dash Bug]] | [[SCHG How-to:Correct Drowning Bugs in Sonic 2|Correct Drowning Bugs]] | [[SCHG How-to:Fix camera y position for Tails|Fix Camera Y Position for Tails]] | [[SCHG How-to:Fix Tails subanimation error|Fix Tails Subanimation Error]] | [[SCHG How-to:Fix Tails' respawn speeds|Fix Tails' Respawn Speeds]] | [[SCHG How-to:Fix Accidental Deletion of Scattered Rings|Fix Accidental Deletion of Scattered Rings]] | [[SCHG How-to:Fix Ring Timers|Fix Ring Timers]] | [[SCHG How-to:Fix Rexon crash|Fix Rexon Crash]] | [[SCHG How-to:Fix monitor collision bug|Fix Monitor Collision Bug]] | [[SCHG How-to:Fix the EHZ Deformation bug|Fix EHZ Deformation Bug]] | [[SCHG How-to:Correct CPZ boss attack behavior|Correct CPZ Boss Attack Behavior]] | [[SCHG How-to:Fix bug in ARZ Boss arrow's platform behavior|Fix Bug in ARZ Boss Arrow's Platform Behavior]] | [[SCHG How-to:Fix ARZ Boss Walking on Air Glitch|Fix ARZ Boss Walking on Air Glitch]] | [[SCHG How-to:Fix ARZ boss sprite behavior|Fix ARZ Boss Sprite Behavior]] | [[SCHG How-to:Fix multiple CNZ boss bugs|Fix Multiple CNZ Boss Bugs]] | [[SCHG How-to:Fix Hill Top's background scrolling mountains|Fix HTZ Background Scrolling Mountains]] | [[SCHG How-to:Fix the OOZ launcher speed up glitch|Fix OOZ Launcher Speed Up Glitch]] | [[SCHG How-to:Fix DEZ Eggrobo boss collision glitch|Fix DEZ Giant Mech Collision Glitch]] | [[SCHG How-to:Fix Boss Deconstruction Behavior|Fix Boss Deconstruction Behavior]] | [[SCHG How-to:Fix Speed Bugs in Sonic 2|Fix Speed Bugs]]<br />
|-<br />
! class="bottomtemphead" | Design Choices and Features<br />
|-<br />
|class="bottomtemptext" align="center" | [[SCHG How-to:Remove the Air Speed Cap|Remove the Air Speed Cap]] | [[SCHG How-to:Disable floor collision while dying|Disable Floor Collision While Dying]] | [[SCHG How-to:Modify Transformation Behavior in Sonic 2|Modify Super Sonic Transformation Methods & Behavior]] | [[SCHG How-to:Enable/Disable Tails in certain levels|Enable/Disable Tails in Certain Levels]] | [[SCHG How-to:Collide with water after being hurt|Collide with Water After Being Hurt]] | [[SCHG How-to:Retain Rings when returning at a Star Post|Retain Rings When Returning at a Star Post]] | [[SCHG How-to:Improve the fade in\fade out progression routines in Sonic 2|Improve the Fade In\Fade Out Progression Routines]] | [[SCHG How-to:Fix Scattered Rings Underwater Physics|Fix Scattered Rings' Underwater Physics]] | [[SCHG_How-to:Insert Labyrinth Zone water ripple effect in Sonic 2|Insert LZ Water Ripple Effect]] | [[SCHG How-to:Restore lost CPZ boss feature|Restore Lost CPZ Boss Feature]] | [[SCHG How-to:Prevent SCZ Tornado spin dash death|Prevent SCZ Tornado Spin Dash Death]] | [[SCHG How-to:Improve ObjectMove subroutines|Improve ObjectMove Subroutines]] | [[SCHG How-to:Port Sonic 3k's rings manager to Sonic 2|Port S3K Rings Manager]] | [[SCHG_How-to:Port S3K Object Manager into Sonic 2|Port S3K Object Manager]] | [[SCHG How-to:Port S3K Priority Manager into Sonic 2|Port S3K Priority Manager]] | [[SCHG How-to:Edit the Level Order in Sonic 2 with ASM|Edit Level Order with ASM]] | [[SCHG How-to:Alter the Ring Requirements in the Special Stages|Alter Ring Requirements in Special Stages]] | [[SCHG How-to:Change the Special Stage characters to use normal DPLCs|Make Special Stage Characters Use Normal DPLCs]] | [[SCHG How-to:Speed Up Ring Loss Process (With Underwater)|Speed Up Ring Loss Process]]<br />
|-<br />
! class="bottomtemphead" | Adding Features<br />
|-<br />
|class="bottomtemptext align="center" | [[SCHG How-to:Create Insta-kill and High Jump Monitors|Create Insta-kill and High Jump Monitors]] | [[SCHG How-to:Create Clone and Special Stage Monitors|Create Clone and Special Stage Monitors]] | [[SCHG How-to:Port Knuckles into Sonic 2|Port Knuckles]] <br />
|-<br />
! class="bottomtemphead" | Sound Features<br />
|-<br />
|class="bottomtemptext" align="center" | [[SCHG How-to:Port Sonic 1's Sound Driver to Sonic 2|Port Sonic 1 Sound Driver]] | [[SCHG_How-to:Port_the_Sonic_2_Clone_Sound_Driver_to_the_HG_version_of_Sonic_2|Port Sonic 2 Clone Driver]] | [[SCHG How-to:Port Sonic 3's Sound Driver to Sonic 2|Port Sonic 3 Sound Driver]] | [[SCHG How-to:Expand the music index to start at $00 instead of $80 (Sonic 2 Clone Driver version)|Expand the Music Index to Start at $00 (Sonic 2 Clone Driver Version)]]<br />
|-<br />
! class="bottomtemphead" | Extending the Game<br />
|-<br />
|class="bottomtemptext" align="center" | [[SCHG How-to:Extend the level index past $10 in Sonic 2|Extend the Level Index Past $10]] | [[SCHG_How-to:Extend_the_Level_Select_in_Sonic_2|Extend the Level Select]] | [[SCHG How-to:Extend the water tables in Sonic 2|Extend Water Tables]] | [[SCHG How-to:Add Extra Characters To Sonic 2|Add Extra Characters]] | [[SCHG_How-to:Free up 2 universal SSTs|Free Up 2 Universal SSTs]]<br />
|}<br />
<noinclude>[[Category:Navigational Templates (Miscellaneous)|{{PAGENAME}}]]</noinclude></div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to:Guide&diff=208793SCHG How-to:Guide2014-05-26T21:37:57Z<p>RetroUser: Okay, I hope nobody's mad at me for this, but there are several "Adding Features-ish" guides under "Design Choices". If you have complaints, please work it out with me via the talk page.</p>
<hr />
<div>The '''SCHG How-to''': series is a spinoff from the [[SCHG:Sonic Community Hacking Guide|Sonic Community Hacking Guide]] with a focus on how-to, tutorials, and supplementary education. Whereas the traditional SCHG serves more as a map for users to navigate a ROM for themselves, the How-to series is more a "how to get from point A to point B" set of directions. Tutorials range from the very basic to very complex, with an eye towards making sure no part of the process is assumed or left out. <br />
<br />
==General How-Tos==<br />
* [[SCHG How-to:Work with Motorola 68000 assembly|Work with Motorola 68000 assembly]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Work with Objects|Work with Objects]] (by [[Malevolence]] and [[MarkeyJester]])<br />
* [[SCHG How-to:Use a Hex Editor|Use a Hex Editor]] (by [[Scarred Sun]])<br />
* [[SCHG How-to:Edit Palettes Using Hex|Edit Palettes Using Hex]] (by [[Scarred Sun]])<br />
* [[SCHG How-to:Use SonMapEd/Part 1|Use SonMapEd/Part 1]] (by [[Chimpo]])<br />
* [[SCHG How-to:Use SonMapEd/Part 2|Use SonMapEd/Part 2]] (by [[Chimpo]])<br />
* [[SCHG How-to:Import Art to SonED2|Import Art to SonED2]] (by [[iojnekns]])<br />
* [[SCHG How-to:Set Up SonLVL|Set Up SonLVL]] (by [[MainMemory]])<br />
<br />
==Game-Specific==<br />
===''Sonic 1''===<br />
====Fixing bugs====<br />
These guides describe the steps to take to fix bugs that are present in the original game or bugs that occur after altering something in the game.<br />
* [[SCHG How-to:Fix demo playback|Fix demo playback]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix a race condition with Pattern Load Cues|Fix a race condition with Pattern Load Cues]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix the SEGA Sound|Fix the SEGA Sound]] (by [[Puto]])<br />
* [[SCHG How-to:Display the Press Start Button text|Display the Press Start Button text]] (by [[Quickman]])<br />
* [[SCHG How-to:Fix the Level Select menu in Sonic 1|Fix the Level Select menu]] (by [[STHX]])<br />
* [[SCHG How-to:Fix the Hidden Points bug in Sonic 1|Fix the Hidden Points bug]] (by [[1337Rooster]])<br />
* [[SCHG How-to:Fix Accidental Deletion of Scattered Rings#Sonic 1 Fix|Fix accidental deletion of scattered rings]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix Ring Timers|Fix ring timers]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the Walk-Jump Bug in Sonic 1|Fix the walk-jump bug]] (by [[Cinossu]])<br />
* [[SCHG How-to:Correct Drowning Bugs in Sonic 1|Correct drowning bugs]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the death boundary bug|Fix the death boundary bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the camera follow bug|Fix the camera follow bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the DAC fade in bug|Fix the DAC fade in bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the HUD blinking|Fix the HUD blinking]] (by [[Quickman]])<br />
* [[SCHG How-to:Fix the Level Select graphics bug|Fix the Level Select graphics bug]] (by [[MarkeyJester]])<br />
<br />
====Changing design choices====<br />
These guides describe how you can alter some behaviors in the game that might not be to your liking.<br />
* [[SCHG How-to:Change Spike behavior in Sonic 1|Change Spike behavior]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix the Special Stage jumping physics|Fix the Special Stage jumping physics]] (by [[Mercury]])<br />
* [[SCHG How-to:Improve the fade in\fade out progression routines in Sonic 1|Improve the fade in\fade out progression routines]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 1 fix|Fix scattered rings' underwater physics]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Remove the Speed Cap|Remove the Speed Cap]] (by [[Tweaker]] and [[Puto]])<br />
* [[SCHG How-to:Port the REV01 Background Effects|Port the REV01 background effects]] (by [[jman2050]])<br />
* [[SCHG How-to:Port Sonic 2's Level Art Loader to Sonic 1|Port Sonic 2's level art loader]] (by [[User:Clownacy|Clownacy]])<br />
* [[SCHG How-to:Retain Rings Between Acts in Sonic 1|Retain rings between acts]] (by [[Afti]])<br />
* [[SCHG How-to:Sonic 2 (Simon Wai Prototype) Level Select in Sonic 1|Sonic 2 (Simon Wai Prototype) Level Select]] (by [[User:Kram1024|Kram1024]])<br />
<br />
====Adding features====<br />
These guides describe step-by-step how to add new features in the game. After following one of these guides, the feature should be fully functional in the game with no further work.<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 1|Add Spin Dash/Part 1]] (by [[Lightning]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 2|Add Spin Dash/Part 2]] (by [[Puto]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 3|Add Spin Dash/Part 3]] (by [[shobiz]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 4|Add Spin Dash/Part 4]] (by [[Mercury]])<br />
* [[SCHG How-to:Have a functional Eggman monitor in Sonic 1|Have a functional Eggman Monitor]] (by [[nineko]])<br />
<br />
====Sound features====<br />
These guides cover the application of music and sound effects in the game. After following these guides, porting and adding original music should be possible.<br />
* [[SCHG How-to:Expand the music index from $94 to $9F|Expand the music index from $94 to $9F]] (by [[lukeusher123]])<br />
* [[SCHG How-to:Extend Music Slots in Sonic 1|Extend music slots in Sonic 1]] (by [[Mikel]])<br />
* [[SCHG How-to:Play different songs on different acts|Play different songs on different acts]] (by [[nineko]])<br />
* [[SCHG How-to:Expand the music index to start at $00 instead of $80|Expand the music index to start at $00 instead of $80]] (by [[HPZMan]])<br />
* [[SCHG How-to:Port Sonic 2 Final Sound Driver to Sonic 1|Port Sonic 2 Final's sound driver]] (by [[User:Kram1024|Kram1024]])<br />
* [[SCHG How-to:Port Sonic 3's Sound Driver to Sonic 1|Port Sonic 3's sound driver]] (by [[User:Kram1024|Kram1024]])<br />
<br />
====Extending the game====<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content.<br />
* [[SCHG How-to:Load chunks from ROM in Sonic 1|Load chunks from ROM]] (by [[FraGag]])<br />
* [[SCHG How-to:Add Extra Characters|Add extra characters]] (by [[Sonic 65]])<br />
* [[SCHG How-to:Make an Alternative Title Screen|Make an alternative title screen]] (by [[JcFerggy]])<br />
* [[SCHG How-to:Use Dynamic Tilesets in Sonic 1|Use dynamic tilesets]] (by [[HPZMan]])<br />
* [[SCHG How-to:Separate title art from GHZ/make GHZ load alternate art|Separate title art from GHZ/make GHZ load alternate art]] (by [[MKAmeX]])<br />
* [[SCHG How-to:Add a new zone in Sonic 1|Add a new zone]] (by [[FraGag]])<br />
* [[SCHG How-to:Set up the Goggle Monitor to work with it|Set up the Goggle Monitor to work with it]] (by [[Selbi]])<br />
* [[SCHG How-to:Add new moves in Sonic 1|Add new moves]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:Dynamic Collision system in Sonic 1|Add a dynamic collision system]] (by [[User:theocas|theocas]])<br />
* [[SCHG How-to:Dynamic Special Stage Walls system|Dynamic Special Stage walls system]] (by [[Mercury]])<br />
* [[SCHG How-to:Extend the Sonic 1 sprite mappings and art limit|Extend the Sonic 1 sprite mappings and art limit]] (by [[User:MarkeyJester|MarkeyJester]])<br />
* [[SCHG How-to:Enigma Credits in Sonic 1|Enigma Credits]] (by [[User:Fukuller|Fukuller]])<br />
<br />
====Miscellaneous====<br />
* [[SCHG How-to:Convert the Hivebrain 2005 disassembly to ASM68K|Convert the Hivebrain 2005 disassembly to ASM68K]] (by [[Puto]])<br />
<br />
====[[Qjimbo]]'s Split Disassembly Guides====<br />
These guides were formerly hosted on '''[[The Glowing Bridge]]'''.<br />
* [[SCHG How-to:Set up a Sonic 1 split disassembly|Set up a Sonic 1 split disassembly]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic Level Editing|S1 Split Guides/Basic Level Editing]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic Art Editing|S1 Split Guides/Basic Art Editing]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic ASM Editing (Spin Dash)|S1 Split Guides/Basic ASM Editing (Spin Dash)]] (by [[Qjimbo]])<br />
<br />
===''Sonic 2''===<br />
====Fixing bugs====<br />
* [[SCHG How-to:Fix demo playback|Fix demo playback]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix a race condition with Pattern Load Cues|Fix a race condition with Pattern Load Cues]] (by [[FraGag]])<br />
* [[SCHG_How-to:Fix bugs relating to Super Sonic|Fix bugs relating to Super Sonic]] (by [[MoDule]])<br />
* [[SCHG_How-to:Use correct height when roll jumping|Use correct height when roll jumping]] (by [[MoDule]])<br />
* [[SCHG_How-to:Fix jump height bug when exiting water|Fix jump height bug when exiting water]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix Sonic 2's buggy spindash code and add spindash speeds|Fix Sonic 2's buggy spindash code and add spindash speeds]] (by [[GARY 'M 9]])<br />
* [[SCHG_How-to:Fix screen boundary spindash bug|Fix screen boundary spindash bug]] (by [[Flamewing]])<br />
* [[SCHG How-to:Correct Drowning Bugs in Sonic 2|Correct drowning bugs]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix_camera_y_position_for_Tails|Fix camera y position for Tails]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix Tails subanimation error|Fix Tails subanimation error]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Tails' respawn speeds|Fix Tails' respawn speeds]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Accidental Deletion of Scattered Rings#Sonic 2 Fix|Fix accidental deletion of scattered rings]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix Ring Timers|Fix ring timers]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Rexon crash|Fix Rexon crash]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix monitor collision bug|Fix monitor collision bug]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the EHZ Deformation bug|Fix the EHZ deformation bug]] (by [[qiuu]])<br />
* [[SCHG How-To:Correct CPZ boss attack behavior|Correct CPZ boss attack behavior]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix bug in ARZ Boss arrow's platform behavior|Fix bug in ARZ boss arrow's platform behavior]] (by [[MoDule]]) (addition by [[redhotsonic]])<br />
* [[SCHG How-to:Fix ARZ Boss Walking on Air Glitch|Fix ARZ boss walking on air glitch]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix ARZ boss sprite behavior|Fix ARZ boss sprite behavior]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix multiple CNZ boss bugs|Fix multiple CNZ boss bugs]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Hill Top's background scrolling mountains|Fix HTZ's background scrolling mountains]] (by [[flamewing]])<br />
* [[SCHG How-to:Fix_the_OOZ_launcher_speed_up_glitch|Fix the OOZ launcher speed up glitch]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix DEZ Eggrobo boss collision glitch|Fix DEZ Eggrobo boss collision glitch]] (by [[flamewing]])<br />
* [[SCHG How-to:Fix Boss Deconstruction Behavior|Fix boss deconstruction behavior]] (by [[Esrael]] & [[redhotsonic]])<br />
* [[SCHG How-to:Fix Speed Bugs in Sonic 2|Fix speed bugs]] (by [[redhotsonic]])<br />
<br />
====Design choices & features====<br />
* [[SCHG How-to:Remove the Air Speed Cap|Remove the air speed cap]] (by [[Selbi]] and [[Puto]])<br />
* [[SCHG How-to:Disable floor collision while dying|Disable floor collision while dying]] (by [[Esrael]])<br />
* [[SCHG How-to:Modify Transformation Behavior in Sonic 2|Modify Super Sonic transformation methods & behavior]] (by [[vladikcomper]] & [[redhotsonic]])<br />
* [[SCHG How-to:Enable/Disable Tails in certain levels|Enable/Disable Tails in certain levels]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG_How-to:Collide with water after being hurt|Collide with water after being hurt]] (by [[MoDule]])<br />
* [[SCHG How-to:Retain Rings when returning at a Star Post|Retain rings when returning at a Star Post]] (by [[Mercury]])<br />
* [[SCHG How-to:Improve the fade in\fade out progression routines in Sonic 2|Improve the fade in\fade out progression routines]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 2 fix|Fix scattered rings' underwater physics]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Insert Labyrinth Zone water ripple effect in Sonic 2|Insert LZ water ripple effect]] (by [[MoDule]])<br />
* [[SCHG_How-to:Restore lost CPZ boss feature|Restore lost CPZ boss feature]] (by [[Esrael]])<br />
* [[SCHG How-to:Prevent SCZ Tornado spin dash death|Prevent SCZ Tornado spin dash death]] (by [[Esrael]])<br />
* [[SCHG How-to:Improve ObjectMove subroutines|Improve ObjectMove subroutines]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Port Sonic 3k's rings manager to Sonic 2|Port S3K's rings manager]] (by [[shobiz]])<br />
* [[SCHG_How-to:Port S3K Object Manager into Sonic 2|Port S3K's object manager]] (by [[MoDule]])<br />
* [[SCHG How-to:Port S3K Priority Manager into Sonic 2|Port S3K's priority manager]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Edit the Level Order in Sonic 2 with ASM|Edit the level order in Sonic 2 with ASM]] (by [[Malevolence]] and [[Metal_Man88]])<br />
* [[SCHG How-to:Alter the Ring Requirements in the Special Stages|Alter the ring requirements in the Special Stages]] (by [[Mercury]])<br />
* [[SCHG How-to:Change the Special Stage characters to use normal DPLCs|Change the Special Stage characters to use normal DPLCs]] (by [[Flamewing]])<br />
* [[SCHG_How-to:Speed Up Ring Loss Process (With Underwater)|Speed up ring loss process (w/ underwater)]] (by [[redhotsonic]])<br />
<br />
====Adding Features====<br />
* [[SCHG How-to:Create Insta-kill and High Jump Monitors|Create Insta-kill and High Jump Monitors]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG How-to:Create Clone and Special Stage Monitors|Create Clone and Special Stage Monitors]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG How-to:Port Knuckles into Sonic 2|Port Knuckles]] (by [[MainMemory]])<br />
<br />
====Sound features====<br />
* [[SCHG How-to:Port Sonic 1's Sound Driver to Sonic 2|Port Sonic 1's sound driver]] (by [[Tweaker]])<br />
* [[SCHG How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|Port Sonic 2 Clone Driver]] (by [[Caverns 4]])<br />
* [[SCHG How-to:Port Sonic 3's Sound Driver to Sonic 2|Port Sonic 3's sound driver]] (by [[User:Kram1024|Kram1024]])<br />
* [[SCHG How-to:Expand the music index to start at $00 instead of $80 (Sonic 2 Clone Driver version)|Expand the music index to start at $00 instead of $80 (Sonic 2 Clone Driver version)]] (by [[Mikel]], based on a guide by [[HPZMan]])<br />
<br />
====Extending the game====<br />
* [[SCHG How-to:Extend the level index past $10 in Sonic 2|Extend the level index past $10]] (by [[User:Kram1024|kram]])<br />
* [[SCHG_How-to:Extend the Level Select in Sonic_2|Extend the Level Select]] (by [[User:Clownacy|Clownacy]])<br />
* [[SCHG How-to:Extend the water tables in Sonic 2|Extend the water tables]] (by [[Dani]])<br />
* [[SCHG How-to:Add Extra Characters To Sonic 2|Add extra characters]] (by [[User:ManicRemix|Manic Remix]])<br />
* [[SCHG_How-to:Free up 2 universal SSTs|Free up 2 universal SSTs]] (by [[redhotsonic]])<br />
<br />
===''Sonic 2 Master System''===<br />
* [[SCHG How-to:Add Dynamic Palettes to Sonic 2 SMS|Add dynamic palettes]] (by [[Mikel]])<br />
* [[SCHG How-to:Relocate Player Object Logic in Sonic 2 SMS|Relocate player object logic]] (by [[Glitch]])<br />
* [[SCHG How-to:Add a Custom Badnik to Sonic 2 SMS|Add a custom badnik]] (by [[Glitch]])<br />
* [[SCHG How-to:Add a New Monitor in Sonic 2 SMS|Add a new monitor]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:Add a Second Digit To the Lifecounter in Sonic 2 SMS|Add a second digit to the Lifecounter]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:How to Add new tiles in different acts in Sonic 2 SMS|How to add new tiles in different acts]] (by [[User:Ravenfreak|Ravenfreak]])<br />
<br />
===''Sonic 3 & Knuckles''===<br />
*[[SCHG How-to:Work with Water in S3K|Work with water in S3K]] (by [[Katelynn]])<br />
*[[SCHG How-to:Restore Sonic 2 Menus to Sonic 3|Restore Sonic 2 menus]] (by [[Mustapha]])<br />
*[[SCHG How-to:Fix Blue Knuckles|Fix Blue Knuckles]] (by [[User:Tamkis|Tamkis]])<br />
*[[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 3&K fix|Fix scattered rings' underwater physics]] (by [[redhotsonic]])<br />
*[[SCHG How-to:Fix Tails' respawn speeds#Sonic 3K fix|Fix Tails' respawn speeds]] (by [[redhotsonic]])<br />
<br />
===''Sonic Advance 3''===<br />
*[[SCHG How-to:Switch Characters for Nonaggression|Switch characters for Nonaggression]] (by [[Erik JS]])<br />
<br />
===''Sonic Adventure 1/DX''===<br />
*[[SCHG How-to:Edit Sonic Adventure levels|Edit Sonic Adventure levels]] (by [[Polygon Jim]])<br />
<br />
===''Sonic Generations''===<br />
*[[SCHG How-to:Import Levels Into Sonic Generations|Import levels]] (by [[Sky The Destroyer]])<br />
*[[SCHG How-to:Create Breakable Objects In Sonic Generations|Create breakable objects]] (by [[Paraxade]])<br />
*[[SCHG How-to:Create Splines For Sonic Generations|Create splines]] (by [[Faseeh]])<br />
<br />
To add your own how-to, simply add an article with SCHG How-to: before the name, which will register it with the correct namespace.<br />
<br />
[[Category:SCHG How-tos| ]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Guide&diff=208789SCHG How-to Talk:Guide2014-05-26T17:22:53Z<p>RetroUser: </p>
<hr />
<div>==Categorization==<br />
After familiarising myself with the 'guide categories', I question why the entries under Sonic 2's Miscellaneous are there, as, to me, they appear to fall under Design Choices.<br />
<br />
To be more specific, what makes them 'miscellaneous'? What makes them 'not Design Choice changes'? Why else would you change, say, the Special Stage ring requirements? It's not to fix a bug, and it isn't to allow for custom content, nor would it not have an immediate effect, as the description under S1's Extend category header. It even seems similar to <i>Enable/Disable Tails in Certain Levels</i> in that regard: why change that? They're for the same reasons, customisation of the original game, or for custom Zones/Special Stages.<br />
<br />
Actually, it seems that many guides are in the wrong place. <i>Port Knuckles</i>, for example:<br />
<br />
<i>"<b>Extending the game</b><br />
<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content."</i><br />
<br />
UMM...<br />
<br />
Also, what of outdated guides? I have a plan for a superior version of <i>Expand the music index from $94 to $9F</i> and <i>Expand the music index to start at $00 instead of $80</i> that takes no cues from these guides. I don't want to just orphan the guides, and I can't credit their authors in mine since they had no hand whatsoever in it.<br />
<br />
So the only logical solution I can think of is creating a separate 'Obsolete' category. I wouldn't say 'Outdated' since at least half of the guides around here <i>are</i> outdated (old disasms). Though I wouldn't argue against such a category for those, it'd give us a reason to update the old things to a level of presentability.<br />
<br />
Anyhow, I just wanted to bring this by anyone reading before I go off making any relatively large changes. Anyone have any objections, suggestions? Anything? [[User:Clownacy|Clownacy]] 17:19, 14 April 2014 (UTC)<br />
<br />
:I did not read the descriptions on the Sonic 1 categories when placing the Knuckles guide, I merely saw that it wasn't a design choice, so I figured it ought to go under extending the game. Perhaps if the "Design Choices & Features" category was split into two like Sonic 1, it would make more sense. [[User:MainMemory|MainMemory]] 17:24, 14 April 2014 (UTC)<br />
<br />
==Homing Attack Guide==<br />
Hey, could somebody please write a homing attack/jump-dash guide for Sonic 1? That would be awesome! [[User:RetroUser|RetroUser]] 20:40, 24 April 2014 (UTC)<br />
:Certain people would rather such a guide not exist, as they feel that it would be "too easy". I personally don't feel that way, but I only do Sonic 2. [[User:MainMemory|MainMemory]] 20:45, 24 April 2014 (UTC)<br />
<br />
::Ok then, Sonic 2 would be fine. [[User:RetroUser|RetroUser]] 21:06, 24 April 2014 (UTC)<br />
<br />
:Oh, and if a homing attack guide gets written for Sonic 2, it can go under the new "Adding features" category I added. [[User:RetroUser|RetroUser]] 23:12, 25 April 2014 (UTC)<br />
<br />
:Since when did we make guides on command? I may just be full of pride, but that feels rude. Besides, haven't you looked around? This 'homing attack code' business has been a touchy subject for ages, and many like you have asked this same question many times before, though they've mostly gotten the same answer. It says something, that you haven't noticed, something ''bad''. Also, you missed the Music Index expansion guide under ''Extending the game'', you haven't removed the mention of features from the ''Design Choices & Features'' header, there are numerous ''Adding features''-type guides that you haven't moved from ''Design Choices & Features'', and you haven't changed the S2Howtos Template. If this is how you edit a wiki page, I'd hate to see how you edit code. No wonder you need a guide! But these guides aren't here to tell you how to do everything. Many, myself included, used and see these as an introduction. It's where you begin, with adding a basic move, enhancing a certain feature. Not where you reach the peak of Sonic hacking, where you program an alien ability that requires greater knowledge of the Sonic Engine's object system, physics, object status, collision handling, and even 68K Assembly itself! You can't condense that into a guide; instead, it must come from experience, lots of it. The only guide that the homing attack can possibly find itself in is a copy-and-paste guide, and that is unacceptable. [[User:Clownacy|Clownacy]] 03:47, 27 April 2014 (UTC)<br />
<br />
::Okay, I wasn't demanding that a guide be written, I was simply asking about it and stating that it was a new feature and could go there if it ever did get written, which now isn't going to happen, I can see. I understand now what you mean about the music expansion guide, but the fact that you have to provide your own music was on my mind. [[User:RetroUser|RetroUser]] 15:55, 27 April 2014 (UTC)<br />
<br />
:::If I can say anything, I meant nothing malicious by removing your category, it's nice to see someone making changes around here, but as I was following up on my changes mentioned in the above 'Categorization' section, I had a very difficult time distinguishing feature from alternate design choice. For example, the Air Speed Cap Removal guide, was it a feature that you could exceed a certain speed whilst airborne, or was it changing the design choice of having it limited? One of the few reasons I thought for the ''Expansion''-worthy guide going under ''Sound Features'' was that this was the case with the Sonic 1 guide, though looking at it now, there's a sound driver bugfix in the Bugfix category, and not in the ''Sound Features'' one. Since the drivers are the same thing, only in different games, I'm thinking of adding a separate group, solely for the 68K sound driver. It'd get very messy having a Sonic 2 variant of every guide for the S1 sound driver thanks to the Clone Driver, and only worsened when I begin adding more guides for the thing. [[User:Clownacy|Clownacy]] 15:41, 28 April 2014 (UTC)<br />
<br />
::::Alright, I guess I wouldn't have many objections (if any) for a section solely on the driver, as things wouldn't have to be spread out as much, and there would be less debate about where a guide for it would go. Also, I'd like to thank you for stating that you meant no harm when removing my category, and I'd like to say that I was only trying to make things easier by adding new sections. I didn't mean to have things so messed up, and I'll try to be more careful in the future. [[User:RetroUser|RetroUser]] 00:29, 29 April 2014 (UTC)<br />
<br />
==Clone Driver 2.1.2 Setup Guide==<br />
<br />
Clownancy,<br />
<br />
Ok, so I've downloaded and checked out the Sonic 2 Clone Driver 2.1.2, and I find it to be awesome, but is there a setup tutorial out there, or are you working on that? [[User:RetroUser|RetroUser]] 23:46, 9 May 2014 (UTC)<br />
<br />
:That's being asked here? There's one right on the thread's first post, right underneath the download. At some point, I plan to edit [[SCHG_How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|this guide]] to support it. Right now, I don't really want to. I'll probably have to have the page's name changed and completely rewrite it... Actually, I think I'll just move it to the proposed 'Obsolete' category and make a brand new page. Speaking of obsolete, I'm surprised no one's noticed that the Enigma Credits guide is broken: The download links are external, and the host has long since deleted the files. Flamewing's S2 Special Stage DPLC guide appears to be broken also, but in a different way, in that I can't get it to work, though that could just be me. It's been a while since I last tried, and that was before I got familiar with DPLCs and mappings, so I'll give it another shot. Don't know what to do with the Enigma Credits, I can't find a mirror to the files, which leaves it a dead guide. Wait a minute... Clown-nancy?! [[User:Clownacy|Clownacy]] 18:05, 11 May 2014 (UTC)<br />
<br />
::Whoops! Guess I saw the name incorrectly...sorry =/ [[User:RetroUser|RetroUser]] 23:45, 11 May 2014 (UTC)<br />
<br />
:::It's Clown + Lunacy, pronounced "Cloonacy". Think "Clown" pronounced with a strong accent (Scottish?). A recent message from a Clone Driver V2 (I need to find a way to abbreviate this thing) user gave me an idea to make the Driver update-friendly, the guide will also contain a 'how to update' section. Going back for a minute, by "setup" you meant "installation", right? How are you signing your posts, anyway? The wiki doesn't seem to like it, I have to keep fixing it. [[User:Clownacy|Clownacy]] 08:15, 12 May 2014 (UTC)<br />
<br />
::::Okay, my signature should be fixed, but before now, I would click on the "Treat signature as wikitext (without an automatic link)" box and use html code or whatever to color it and give it a font (think FrozenNitrogen). What do you mean by the wiki not liking it, though? Would it just show weird code? Also, as for the guide, yes, I mean installation, however, when I went to the topic to download the driver, I didn't remember seeing the guide, so I just had to ask that question without checking it again. [[User:RetroUser|RetroUser]] 19:32, 12 May 2014 (UTC)<br />
<br />
:::::Look at the history, "Retro" is highlighted blue, and probably links to something. So, yeah, weird code. Whatever you did this time, it worked, safe for the out-of-place hyphen. [[User:Clownacy|Clownacy]] 20:26, 12 May 2014 (UTC)<br />
<br />
::::::Umm, the "Retro" wasn't highlighted blue, I used html code to give it that color; the whole name links to my *missing* user page because I set it to do that. Now, the "User" I colored gray to give my signature something of a <strike>cheese factor</strike> unique style by having two colors. For example, Frozen Nitrogen's unique signature is like this: [[Frozen Nitrogen|<span style="color:steelblue">'''Frozen'''</span> <span style="color:springgreen">'''Nitrogen'''</span>]]. [[User:RetroUser|RetroUser]] 17:01, 13 May 2014 (UTC)<br />
<br />
== Dynamic Music in Sonic 2 ==<br />
<br />
Umm, does anybody here know about having dynamic music in Sonic 2? I've been trying to do it myself, but I can't seem to get the code to work. This is especially painful now that I've installed the Clone Driver 2.1.2 and have support for MUCH more music. So, Clownacy, if/when you put up a wiki guide on how to install this driver, could you add a section on this? I'm not saying that you have to, and it's fine if you feel that this code shouldn't be in a guide; I'm just putting up a request. And who knows? Maybe I'll end up getting the code to work by myself. Still, it would be nice to see how things are done the real way. =P -- [[User:RetroUser|RetroUser]] 18:03, 24 May 2014 (UTC)<br />
<br />
:Dynamic music? What's that? Different music on every act? That would certainly be a good guide to make, since the Sonic 1 guide on it is a cheap hack. Good for teaching a noob when to use <i>cmp</i>, but not good at teaching anyone the real way to achieve act-specific music. Such a thing would be a standalone guide, as you can apply it to hacks using either of the S1/S2/S3K drivers. [[User:Clownacy|Clownacy]] 13:06, 25 May 2014 (UTC)<br />
<br />
::Yeah, that's what I mean, and what I meant by "the real way" was "not my way" (which doesn't even work yet, and is probably sort of hackish.). Also, I think that it may be a tad bit more complicated with Sonic 2, because it also has a check for multiplayer mode, and I don't understand how Metropolis 3 simply loads the entry after the one for the first act. So, I'd like to post this area of code (where I'm trying to get the code to work) from a fresh Sonic 2 disasm and from my disasm. (The Clone Driver is installed in mine, btw. Also, these references are for the GitHub disasm.)<br />
<br />
::This code from my disasm:<br />
<br />
<asm>;----------------------------------------------------------------------------<br />
; 1P Music Playlist<br />
;----------------------------------------------------------------------------<br />
; byte_3EA0:<br />
MusicList: zoneOrderedTable 1,1<br />
zoneTableEntry.b MusID_EHZ ; 0 ; EHZ<br />
zoneTableEntry.b MusID_EHZ ; 1<br />
zoneTableEntry.b MusID_MTZ ; 2<br />
zoneTableEntry.b MusID_OOZ ; 3<br />
zoneTableEntry.b MusID_MTZ ; 4 ; MTZ1,2<br />
zoneTableEntry.b MusID_MTZ ; 5 ; MTZ3<br />
zoneTableEntry.b MusID_WFZ ; 6 ; WFZ<br />
zoneTableEntry.b MusID_HTZ ; 7 ; HTZ<br />
zoneTableEntry.b MusID_HPZ ; 8<br />
zoneTableEntry.b MusID_SCZ ; 9<br />
zoneTableEntry.b MusID_OOZ ; 10 ; OOZ<br />
zoneTableEntry.b MusID_MCZ ; 11 ; MCZ<br />
zoneTableEntry.b MusID_CNZ ; 12 ; CNZ<br />
zoneTableEntry.b MusID_CPZ ; 13 ; CPZ<br />
zoneTableEntry.b MusID_DEZ ; 14 ; DEZ<br />
zoneTableEntry.b MusID_ARZ ; 15 ; ARZ<br />
zoneTableEntry.b MusID_SCZ ; 16 ; SCZ<br />
zoneTableEnd<br />
even<br />
;----------------------------------------------------------------------------<br />
; 1P Music Playlist (Act 2s)<br />
;----------------------------------------------------------------------------<br />
MusicListAlt:zoneOrderedTable 1,1<br />
zoneTableEntry.b MusID_EHZ_2P ; 0 ; EHZ<br />
zoneTableEntry.b MusID_EHZ ; 1<br />
zoneTableEntry.b MusID_MTZ ; 2<br />
zoneTableEntry.b MusID_OOZ ; 3<br />
zoneTableEntry.b MusID_MTZ ; 4 ; MTZ1,2<br />
zoneTableEntry.b MusID_MTZ ; 5 ; MTZ3<br />
zoneTableEntry.b MusID_WFZ ; 6 ; WFZ<br />
zoneTableEntry.b MusID_HTZ ; 7 ; HTZ<br />
zoneTableEntry.b MusID_HPZ ; 8<br />
zoneTableEntry.b MusID_SCZ ; 9<br />
zoneTableEntry.b MusID_OOZ ; 10 ; OOZ<br />
zoneTableEntry.b MusID_MCZ ; 11 ; MCZ<br />
zoneTableEntry.b MusID_CNZ ; 12 ; CNZ<br />
zoneTableEntry.b MusID_CPZ ; 13 ; CPZ<br />
zoneTableEntry.b MusID_DEZ ; 14 ; DEZ<br />
zoneTableEntry.b MusID_ARZ ; 15 ; ARZ<br />
zoneTableEntry.b MusID_SCZ ; 16 ; SCZ<br />
zoneTableEnd<br />
even<br />
<br />
;----------------------------------------------------------------------------<br />
; 2P Music Playlist<br />
;----------------------------------------------------------------------------<br />
; byte_3EB2:<br />
MusicList2: zoneOrderedTable 1,1<br />
zoneTableEntry.b MusID_EHZ_2P ; 0 ; EHZ 2P<br />
zoneTableEntry.b MusID_EHZ ; 1<br />
zoneTableEntry.b MusID_MTZ ; 2<br />
zoneTableEntry.b MusID_OOZ ; 3<br />
zoneTableEntry.b MusID_MTZ ; 4<br />
zoneTableEntry.b MusID_MTZ ; 5<br />
zoneTableEntry.b MusID_WFZ ; 6<br />
zoneTableEntry.b MusID_HTZ ; 7<br />
zoneTableEntry.b MusID_HPZ ; 8<br />
zoneTableEntry.b MusID_SCZ ; 9<br />
zoneTableEntry.b MusID_OOZ ; 10<br />
zoneTableEntry.b MusID_MCZ_2P ; 11 ; MCZ 2P<br />
zoneTableEntry.b MusID_CNZ_2P ; 12 ; CNZ 2P<br />
zoneTableEntry.b MusID_CPZ ; 13<br />
zoneTableEntry.b MusID_DEZ ; 14<br />
zoneTableEntry.b MusID_ARZ ; 15<br />
zoneTableEntry.b MusID_SCZ ; 16<br />
zoneTableEnd<br />
even<br />
; ===========================================================================<br />
<br />
...<br />
<br />
Level_GetBgm:<br />
tst.w (Demo_mode_flag).w<br />
bmi.s +<br />
moveq #0,d0<br />
move.b (Current_Zone).w,d0<br />
<br />
cmpi.b #$0,(Current_Act).w ; Is this act 1?<br />
beq.s Level_GetBgm2 ; If NOT, load act 1 music<br />
lea MusicList(pc),a1<br />
bra.s Level_PlayBgm ; Process<br />
; ---------------------------------------------------------------------------<br />
; tst.w (Two_player_mode).w<br />
; beq.s Level_PlayBgm<br />
; lea MusicList2(pc),a1<br />
; ---------------------------------------------------------------------------<br />
Level_GetBgm2:<br />
cmpi.b #$1,(Current_Act).w ; Is this act 2?<br />
beq.s Level_GetBgm2P ; If NOT, load act 2 music<br />
lea MusicListAlt(pc),a1<br />
Level_GetBgm2P:<br />
tst.w (Two_player_mode).w ; Are we in 2 player mode?<br />
beq.s Level_PlayBgm ; If so, load 2P music<br />
lea MusicList2(pc),a1<br />
; loc_40C8:<br />
Level_PlayBgm:<br />
move.b (a1,d0.w),d0 ; load from music playlist<br />
move.w d0,(Level_Music).w ; store level music<br />
bsr.w PlayMusic ; play level music<br />
move.b #ObjID_TitleCard,(TitleCard+id).w ; load Obj34 (level title card) at $FFFFB080</asm><br />
<br />
::Notice that in my code, I changed EHZ's song to the 2P song in my alternative playlist, however, it loads that song for EHZ whatsoever. This may sound n00bish, but could you tell me what I'm doing wrong? (Sorry for all that excess code; only the parts about music are relevant.) -- [[User:RetroUser|RetroUser]] 17:16, 25 May 2014 (UTC)<br />
<br />
:::This isn't a general help thread...<br />
<br />
:::The code's the exact same between 1 & 2, you just do what the guide did, only leaving that one check for 2 player. What you're doing is the hackish way. The real way is editing the code under Level_PlayBgm: to account for both zone AND act. It makes good use of some relatively cryptic instructions and logic, so there's quite the bit to learn from it. The cmpi.b #$0 is redundant, just use tst.b. Also, you got some conditional branches backwards. I've edited your code to make the flaws more obvious. [[User:Clownacy|Clownacy]] 17:02, 26 May 2014 (UTC)<br />
<br />
::::Right...okay, thanks for the help, and sorry for all that. -- [[User:RetroUser|RetroUser]] 17:22, 26 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Port_Sonic_3%27s_Sound_Driver_to_Sonic_2&diff=208787SCHG How-to Talk:Port Sonic 3's Sound Driver to Sonic 22014-05-26T15:02:12Z<p>RetroUser: </p>
<hr />
<div>Yikes! Most of the guide's page-space being Sonic 2 code that we're directed to replace, what? Pre-assembled Z80 code in an AS macro assembler disassembly, the hell? "Optimised" SoundDriverLoad that isn't even as optimised as to break from the S3 norm and use Kosinski-compressed driver data, why? Hardcoded equates, huh? Outright instructing one to delete art BINCLUDEs and replace them instead of just detailing how to relocate them, ...? SMPS is intellectual property, *shrug*?<br />
<br />
Call me spoiled, but [http://forums.sonicretro.org/index.php?showtopic=32061] seems so much less hackish. Even if it uses a modified S&K driver, the use of a disassembled driver looks to make things so much easier, and that guide better fits the 'Sonic Team way' philosophy of the S1 guide, I can certainly tell you that S3 doesn't handle tempo-changing that way, having an exception programmed into PlayMusic. [[User:Clownacy|Clownacy]] 14:54, 25 May 2014 (UTC)<br />
<br />
:Hm, I think I agree, as I've tried out that driver, I like it, and it's not so arbitrary in the area of what music you can have. Trust me, I've ported Sonic 3's driver to Sonic 1, and I think that working with the music when using that driver can be a real pain. I mean, most of the time, porting music from Sonic 3D works without much work (mostly because it uses pretty much the same driver), but I HATE Sonic 3's way of sorting music, because you port a song, and your other songs turn into nothing but garbled trash. I'm pretty sure this happens because of Sonic 3's system of address pointers. -- [[User:RetroUser|RetroUser]] 17:21, 25 May 2014 (UTC)<br />
<br />
::Yeah, relative pointing, relative to the start of the sound bank, moving music around inside a bank will misalign them. That should also be a problem with Sonic 2's driver. Things like SMPS2ASM have the assembler fix the addresses for you on every build. Such logic also applys to the driver code. The branches themselves are pre-assembled, so if you tried adding code, you'd break them. Multiple bugs and redundancies have been found in the S&K driver code, and trying to apply the fixes to this would either be a huge pain, as you'd have to change multiple branches, or downright not possible for the user to do. Anyhow, I see a lot of changes on the Recent Changes page so I'll see what's new. [[User:Clownacy|Clownacy]] 14:38, 26 May 2014 (UTC)<br />
<br />
:::Okay, this may seem out of place, but how do you get music ASM'd with SMPS2ASM to work with Sonic 1? Do you have to do more than simply including the _smps2asm_inc.asm file? Because when I do that, I get nothing but errors. The reason I brought this up here is because using SMPS2ASM stuff with these driver imports should certainly make life easier, but I tried Yeah, and I think that SMPS2ASM does go easy with those pointers because...I put Flamewing's S&K driver that's included with the tool into the GitHub Sonic 3K Disasm, I've been using all sorts of ASM'd music that came with the awesome ASM music archive, and I haven't gotten any garbled music...I agree with you about the whole problem with note-holding that the driver has, though, as I've heard it too. -- [[User:RetroUser|RetroUser]] 15:02, 26 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to:Port_the_Sonic_2_Clone_Sound_Driver_to_the_HG_version_of_Sonic_2&diff=208784SCHG How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 22014-05-26T14:19:16Z<p>RetroUser: Same as last time.</p>
<hr />
<div>{{GuideBy|Caverns 4}}<br />
==Summary==<br />
<b>The guide is fixed and updated as of September 11th, 2013. It should now work on real hardware!</b> ~ Caverns 4<br />
<br />
The Sonic 2 Clone Driver is simply a modified version of the Sonic 1 Sound driver, designed to work with Sonic 2. The advantages to using this over the Sound Driver in Sonic 2 normally are numerous; It will be easier to modify existing songs as you won't have to worry about compressing and decompressing the music, and your music will be supported by more up to date [[Music editor programs]].<br />
<br />
There are a few bugs I have noticed. One is that the spin dash sound will not raise pitch. The music is not a perfect adaptation of Sonic 2's music, particularly sometimes the PSG channels sound slightly different. (Unless you do the optional step that adds Sonic 2 PSGs, at least.) This is most noticeable in Emerald Hill's music. Besides this, there are no problems.<br />
<br />
If the above bugs will not bother you too badly, then you'll like using the Sonic 2 Clone Driver after working with Sonic 2's own sound driver. The Clone Driver is much easier to port music to, and in fact, Sonic 1 music can even just be bincluded into the ROM. This is because it's based on the Sonic 1 sound driver, and uses similar (if not the same) formatting. With this out of the way, now it's time to edit the Sonic 2 HG Dissasembly!<br />
<br />
Before begining, you will need the following file:<br />
<br />
{{Download|file=Sonic 2 Clone Driver.7z|filesize=79kb|title=Sonic 2 Clone Driver Files|plural=1}}<br />
<br />
==Step 1 - getting started==<br />
Back up your dissasembly if you haven't already.<br />
<br />
To start, go into your sound folder, where you'll have a DAC folder, a music folder, and a PCM folder.<br />
<br />
<b>DELETE THEM ALL!</b><br />
<br />
Also delete s2.sounddriver.asm. That's the Sonic 2 Sound Driver, so it's not necessary.<br />
<br />
and then extract "Sonic 2 Clone Driver.7z" into the main folder of your dissasembly.<br />
<br />
==Step 2 - Deleting leftovers==<br />
Now open up s2.asm, and find the label 'SoundDriverLoad:'. Delete everything from that, up to and including:<br />
<br />
<asm>Mus_Continue: BINCLUDE "sound/music/Continue.bin"</asm><br />
<br />
What we have done here is deleted the routines to load and decompress the Sound Driver. We don't need this anymore.<br />
<br />
Next up, find this line:<br />
<br />
<asm> cnop -Size_of_SEGA_sound, $8000</asm><br />
<br />
and delete everything from there up to (but not including) the line:<br />
<br />
<asm>; end of 'ROM'</asm><br />
<br />
Also, on the line above the 'EndOfRom:' label, you should see this:<br />
<br />
<asm> shared word_728C_user,Obj5F_MapUnc_7240,off_3A294,MapRUnc_Sonic,movewZ80CompSize</asm><br />
<br />
Change it to this:<br />
<br />
<asm> shared word_728C_user,Obj5F_MapUnc_7240,off_3A294,MapRUnc_Sonic</asm><br />
<br />
Finally, find the label '<b>sndDriverInput:</b>'<br />
<br />
Delete the entire function, which starts there, and ends at this line:<br />
<br />
<asm>; End of function sndDriverInput</asm><br />
<br />
Now search in your assembly for "<b>sndDriverInput</b>", and delete any lines that point to it. There will be quite a few, but it won't hurt anything.<br />
<br />
We've effectively deleted the old sound driver entirely from our game... Now it's time we implemented a new one.. But first, we need to prepare S2.Constants.asm<br />
<br />
==Step 3 - Overhauling Constants, fixing RAM==<br />
Open s2.constants.asm, and find the following line:<br />
<br />
Find the line "<b>; Music IDs</b>". You'll see this:<br />
<br />
<asm>; Music IDs<br />
offset := zMasterPlaylist<br />
ptrsize := 1<br />
idstart := $81<br />
; $80 is reserved for silence, so if you make idstart $80 or less,<br />
; you may need to insert a dummy zMusIDPtr in the $80 slot</asm><br />
<br />
delete everything from there down to "<b>MusID__End = id(zMusIDPtr__End) ; A0</b>", and paste the following where it used to be:<br />
<br />
<asm>; Music IDs<br />
; $80 is reserved for silence, so if you make idstart $80 or less,<br />
; you may need to insert a dummy zMusIDPtr in the $80 slot<br />
MusID__First = $81<br />
MusID_2PResult = $81<br />
MusID_EHZ = $82<br />
MusID_MCZ_2P = $83<br />
MusID_OOZ = $84<br />
MusID_MTZ = $85<br />
MusID_HTZ = $86<br />
MusID_ARZ = $87<br />
MusID_CNZ_2P = $88<br />
MusID_CNZ = $89<br />
MusID_DEZ = $8A<br />
MusID_MCZ = $8B<br />
MusID_EHZ_2P = $8C<br />
MusID_SCZ = $8D<br />
MusID_CPZ = $8E<br />
MusID_WFZ = $8F<br />
MusID_HPZ = $90<br />
MusID_Options = $91<br />
MusID_SpecStage = $92<br />
MusID_Boss = $93<br />
MusID_EndBoss = $94<br />
MusID_Ending = $95<br />
MusID_SuperSonic = $96<br />
MusID_Invincible = $97<br />
MusID_ExtraLife = $98<br />
MusID_Title = $99<br />
MusID_EndLevel = $9A<br />
MusID_GameOver = $9B<br />
MusID_Continue = $9C<br />
MusID_Emerald = $9D<br />
MusID_Credits = $9E<br />
MusID_Countdown = $9F<br />
MusID__End = $A0</asm><br />
<br />
The music is all fixed, now all that's left is the sound effects:<br />
<br />
Find the line "<b>; Sound IDs</b>", and delete everything down to the line "<b>; Special sound IDs</b>". Leave the special IDs alone.<br />
<br />
In place of the text you deleted, just paste this:<br />
<br />
<asm>; Sound IDs<br />
SndID__First = $A0<br />
SndID_Jump = $A0<br />
SndID_Checkpoint = $A1<br />
SndID_SpikeSwitch = $A2<br />
SndID_Hurt = $A3<br />
SndID_Skidding = $A4<br />
SndID_BlockPush = $A5<br />
SndID_HurtBySpikes = $A6<br />
SndID_Sparkle = $A7<br />
SndID_Beep = $A8<br />
SndID_Bwoop = $A9<br />
SndID_Splash = $AA<br />
SndID_Swish = $AB<br />
SndID_BossHit = $AC<br />
SndID_InhalingBubble = $AD<br />
SndID_ArrowFiring = $AE<br />
SndID_LavaBall = $AE<br />
SndID_Shield = $AF<br />
SndID_LaserBeam = $B0<br />
SndID_Zap = $B1<br />
SndID_Drown = $B2<br />
SndID_FireBurn = $B3<br />
SndID_Bumper = $B4<br />
SndID_Ring = $B5<br />
SndID_RingRight = $B5<br />
SndID_SpikesMove = $B6<br />
SndID_Rumbling = $B7<br />
SndID_Smash = $B9<br />
SndID_DoorSlam = $BB<br />
SndID_SpindashRelease = $BC<br />
SndID_Hammer = $BD<br />
SndID_Roll = $BE<br />
SndID_ContinueJingle = $BF<br />
SndID_CasinoBonus = $C0<br />
SndID_Explosion = $C1<br />
SndID_WaterWarning = $C2<br />
SndID_EnterGiantRing = $C3<br />
SndID_BossExplosion = $C4<br />
SndID_TallyEnd = $C5<br />
SndID_RingSpill = $C6<br />
SndID_Flamethrower = $C8<br />
SndID_Bonus = $C9<br />
SndID_SpecStageEntry = $CA<br />
SndID_SlowSmash = $CB<br />
SndID_Spring = $CC<br />
SndID_Blip = $CD<br />
SndID_RingLeft = $B5<br />
SndID_Signpost = $CF<br />
SndID_CNZBossZap = $D0<br />
SndID_Signpost2P = $D3<br />
SndID_OOZLidPop = $D4<br />
SndID_SlidingSpike = $D5<br />
SndID_CNZElevator = $D6<br />
SndID_PlatformKnock = $D7<br />
SndID_BonusBumper = $D8<br />
SndID_LargeBumper = $D9<br />
SndID_Gloop = $DA<br />
SndID_PreArrowFiring = $DB<br />
SndID_Fire = $DC<br />
SndID_ArrowStick = $DD<br />
SndID_Helicopter = $DE<br />
SndID_SuperTransform = $DF<br />
SndID_SpindashRev = $E0<br />
SndID_Rumbling2 = $E1<br />
SndID_CNZLaunch = $E2<br />
SndID_Flipper = $E3<br />
SndID_HTZLiftClick = $E4<br />
SndID_Leaves = $E5<br />
SndID_MegaMackDrop = $E6<br />
SndID_DrawbridgeMove = $E7<br />
SndID_QuickDoorSlam = $E8<br />
SndID_DrawbridgeDown = $E9<br />
SndID_LaserBurst = $EA<br />
SndID_Scatter = $EB<br />
SndID_LaserFloor = $EB<br />
SndID_Teleport = $EC<br />
SndID_Error = $ED<br />
SndID_MechaSonicBuzz = $EE<br />
SndID_LargeLaser = $EF<br />
SndID_OilSlide = $F0<br />
SndID__End = $F7</asm><br />
<br />
The following are the lines you should NOT have deleted, just for reference:<br />
<br />
<asm>MusID_StopSFX = $78+$80 ; F8<br />
MusID_FadeOut = $79+$80 ; F9<br />
SndID_SegaSound = $7A+$80 ; FA<br />
MusID_SpeedUp = $7B+$80 ; FB<br />
MusID_SlowDown = $7C+$80 ; FC<br />
MusID_Stop = $7D+$80 ; FD<br />
MusID_Pause = $7E+$80 ; FE<br />
MusID_Unpause = $7F+$80 ; FF</asm><br />
<br />
Now, find these lines:<br />
<br />
<asm>Underwater_palette_2: ds.w palette_line_size ; not sure what it's used for but it's only used when there's water<br />
Underwater_palette_2_line2: ds.w palette_line_size<br />
Underwater_palette_2_line3: ds.w palette_line_size<br />
Underwater_palette_2_line4: ds.w palette_line_size<br />
<br />
Underwater_palette: ds.w palette_line_size ; main palette for underwater parts of the screen<br />
Underwater_palette_line2: ds.w palette_line_size<br />
Underwater_palette_line3: ds.w palette_line_size<br />
Underwater_palette_line4: ds.w palette_line_size</asm><br />
<br />
Copy these lines to the clipboard (Or better yet, to a separate text document), we are going to be moving them in a moment.<br />
<br />
Immediately below where those lines used to be is a line like this:<br />
<br />
<asm> ds.b $500 ; $FFFFF100-$FFFFF5FF ; unused, leftover from the Sonic 1 sound driver (and used by it when you port it to Sonic 2)</asm><br />
<br />
Change it to this:<br />
<br />
<asm>Sound_Driver_RAM: ds.b $600 ; $FFFFF000-$FFFFF5FF ; Used by the Sonic 2 Clone Driver.</asm><br />
<br />
The underwater palettes were overwriting some RAM that the Sonic 1/Sonic2 Clone Driver use, so we need to move them somewhere safer. Fortunately, such a place in RAM exists.<br />
<br />
What we need, are $100 free bytes. So, first off, find the line:<br />
<br />
<asm>Normal_palette: ds.w palette_line_size</asm><br />
<br />
Paste the underwater_palette lines right above it.<br />
<br />
Right above the lines you just pasted, you should see the following:<br />
<br />
<asm>Sprite_Table: ds.b $280 ; Sprite attribute table buffer<br />
ds.b $80 ; unused, but SAT buffer can spill over into this area when there are too many sprites on-screen</asm><br />
<br />
Replace them both with just this:<br />
<br />
<asm>Sprite_Table: ds.b $200 ; Sprite attribute table buffer</asm><br />
<br />
==Step 4 - Introducing the new Sound Driver!==<br />
Go back to s2.asm, and right above this line:<br />
<br />
<asm>; end of 'ROM'</asm><br />
<br />
Paste this:<br />
<br />
<asm> include "Sonic 2 Clone Driver.asm"</asm><br />
<br />
Now, before anything else, open up Sonic 2 Clone Driver.asm, and find and replace (CRTL+H usually) all instances of "<b>INCBIN</b>" with "<b>BINCLUDE</b>" (without the quotes).<br />
<br />
Repeat the process, replacing all intances of "<b>@loc</b>" with "<b>Lloc</b>". The HG dissasembly does not like local routines, so this converts them into normal routines to avoid errors. <br />
<br />
At this point, you can build your ROM if you want. You wont get any sound, but the game will run.<br />
<br />
==Step 5 - Let the music play!==<br />
Go back to S2.asm, and find the label "<b>VintRet:</b>"<br />
<br />
In that function, right after the label, paste this line:<br />
<br />
<asm> jsr Init_Sonic1_Sound_Driver</asm><br />
<br />
If you were to build your ROM again now, you still wouldn't have sound. We're going to fix that now. Go back to s2.constants.asm, and find these lines:<br />
<br />
<asm>Music_to_play: ds.b 1<br />
SFX_to_play: ds.b 1 ; normal<br />
SFX_to_play_2: ds.b 1 ; alternating stereo<br />
unk_FFE3: ds.b 1<br />
Music_to_play_2: ds.b 1 ; alternate (higher priority?) slot</asm><br />
<br />
Replce theme with this:<br />
<br />
<asm> ds.b 1<br />
ds.b 1<br />
ds.b 1<br />
unk_FFE3: ds.b 1<br />
ds.b 1</asm><br />
<br />
If you want to, you can also move the line with 'unk_FFE3' down one line and replace the four resulting "ds.b 1"s with a single "ds.l".<br />
<br />
Now, we need to remake the music_to_play and SFX_to_play constants, but a bit differently. Anywhere in <b>s2.constants.asm</b> you deem appropriate (For the sake of organization, lets put them after Sound_Driver_RAM:) paste this code:<br />
<br />
<asm>Music_Pause = $FFFFF003<br />
Music_to_play = $FFFFF00A<br />
SFX_to_play = $FFFFF00B</asm><br />
<br />
Go back to S2.asm; we've got more changes to make.<br />
<br />
First off, search for and replace all instances of "<b>SFX_to_play_2</b>" with just "<b>SFX_to_play</b>", and "<b>Music_to_play_2</b>" with "<b>Music_to_play</b>".<br />
<br />
This fixes most things, but if were to play the game, both the Sega Sound and pausing the game are... REALLY messed up. Lets fix this, too.<br />
<br />
Find this line, again, in s2.asm<br />
<br />
<asm> move.b #MusID_Pause,(Music_to_play).w ; pause music</asm><br />
<br />
Replace it with this:<br />
<br />
<asm> move.b #1,(Music_Pause).w ; pause music</asm><br />
<br />
And replace all instances of this line:<br />
<br />
<asm> move.b #MusID_Unpause,(Music_to_play).w</asm><br />
<br />
With this:<br />
<br />
<asm> move.b #$80,(Music_Pause).w ; resume music</asm><br />
<br />
==Step 6 - Saaay-Gaaah!==<br />
Now, lets fix the last problem: The SEGA Sound. You can close s2.constants and s2.asm now, we're done with those.<br />
<br />
Our target this time is Sonic 2 Clone Driver.asm.<br />
<br />
Search for the label '<b>SegaPCM:</b>'.<br />
<br />
Now, replace<br />
<br />
<asm> cnop $0, (((((*+$6978)>>$10)+$01)*$10000)-$6978)<br />
SegaPCM: binclude sound\segapcm.bin<br />
even</asm><br />
<br />
with<br />
<br />
<asm> align $8000<br />
SegaPCM: binclude sound\segapcm.bin<br />
SegaPCM_End:</asm><br />
<br />
Next, find the label '<b>PCM_Table:</b>', and immediately before:<br />
<br />
<asm>;--------------------------------------------------------<br />
Kos_Z80: BINCLUDE sound\z80_new.bin</asm><br />
<br />
Paste this:<br />
<br />
<asm> dc.l $A00200, SegaPCM<br />
dc.w (SegaPCM_End-SegaPCM)/2<br />
dc.b $09, 0</asm><br />
<br />
Finally, go to "Sound_E1:" and replace<br />
<br />
<asm> move.b #$88,($A01FFF).l</asm><br />
<br />
with:<br />
<br />
<asm> move.b #$88, d0<br />
jsr Calculate_PCM<br />
move.b #$81, ($A01FFF).l ; can't use #$88, because that one uses hardcoded offsets</asm><br />
<br />
And we're done! Build it, test out your fixed Sega Sound and pause screen, and have fun!<br />
<br />
==Optional step - Import Sonic 2 PSG Envelopes==<br />
At this point, you shouldn't have any sound-driver related problems.<br />
<br />
However, there is one more thing you can do, and it may help certain songs (Such as EHZ's music) to sound better.<br />
In Sonic 2 Clone Driver.asm, find the label PSG_Index:. It should be early in the file, and will look like this:<br />
<br />
<asm>PSG_Index: dc.l PSG1, PSG2, PSG3<br />
dc.l PSG4, PSG5, PSG6<br />
dc.l PSG7, PSG8, PSG9<br />
PSG1: BINCLUDE sound\psg1.bin<br />
PSG2: BINCLUDE sound\psg2.bin<br />
PSG3: BINCLUDE sound\psg3.bin<br />
PSG4: BINCLUDE sound\psg4.bin<br />
PSG6: BINCLUDE sound\psg6.bin<br />
PSG5: BINCLUDE sound\psg5.bin<br />
PSG7: BINCLUDE sound\psg7.bin<br />
PSG8: BINCLUDE sound\psg8.bin<br />
PSG9: BINCLUDE sound\psg9.bin</asm><br />
<br />
Replace it with this:<br />
<br />
<asm>PSG_Index: dc.l PSG1, PSG2, PSG3<br />
dc.l PSG4, PSG5, PSG6<br />
dc.l PSG7, PSG8, PSG9<br />
dc.l PSG0A, PSG0B, PSG0C, PSG0D<br />
PSG1: BINCLUDE sound\psg1.bin<br />
PSG2: BINCLUDE sound\psg2.bin<br />
PSG3: BINCLUDE sound\psg3.bin<br />
PSG4: BINCLUDE sound\psg4.bin<br />
PSG6: BINCLUDE sound\psg6.bin<br />
PSG5: BINCLUDE sound\psg5.bin<br />
PSG7: BINCLUDE sound\psg7.bin<br />
PSG8: BINCLUDE sound\psg8.bin<br />
PSG9: BINCLUDE sound\psg9.bin<br />
PSG0A:<br />
dc.b 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1<br />
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1<br />
dc.b 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2<br />
dc.b 2,2,3,3,3,3,3,3,3,3,3,3,4,$80<br />
PSG0B:<br />
dc.b 4,4,4,3,3,3,2,2,2,1,1,1,1,1,1,1<br />
dc.b 2,2,2,2,2,3,3,3,3,3,4,$80<br />
PSG0C:<br />
dc.b 4,4,3,3,2,2,1,1,1,1,1,1,1,1,1,1<br />
dc.b 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2<br />
dc.b 2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3<br />
dc.b 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3<br />
dc.b 3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4<br />
dc.b 4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5<br />
dc.b 5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6<br />
dc.b 6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,$80<br />
PSG0D:<br />
dc.b $0E,$0D,$0C,$0B,$0A,9,8,7,6,5,4,3,2,1,0,$80</asm><br />
<br />
What you have done now is ported the new PSG envelopes that were added to Sonic 2. Emerald Hill Zone, and most Sonic 2 Beta songs will now sound better when ported. Thanks to ValleyBell for this addition.<br />
<br />
==Reccomended Extra Step: Equating the RAM==<br />
<br />
If you're like me, then you've shifted at least some RAM values in your hack around. Because of this, you might notice you've have some problems with the sound driver... Nothing there is equated, so it uses fixed RAM addresses!<br />
This won't do at all, so lets make a constant so you can shift the data around all you like.<br />
<br />
To start, open <b>s2.constants.asm</b>, and find Music_Pause, Music_to_play, and SFX_to_play.<br />
Change them to this:<br />
<br />
<asm>Music_Pause = Sound_Driver_RAM+$003<br />
Music_to_play = Sound_Driver_RAM+$00A<br />
SFX_to_play = Sound_Driver_RAM+$00B</asm><br />
<br />
<b>Note:</b> If you followed this guide before January 5th, 2014, you may need to change the $600 bytes you reserved for the Sound Driver in your <b>s2.constants.asm</b> to this:<br />
<br />
<asm>Sound_Driver_RAM: ds.b $600</asm><br />
This label is important, and it's a new addition. If you are following this guide after January 5th, I had you put the label in by default.<br />
<br />
Now you're done here, that's all we're going to use s2.Constants.asm for. Open <b>Sonic 2 Clone Driver.asm</b> for the rest of the process.<br />
<br />
In <b>Sonic 2 Clone Driver.asm</b>, go to the label <b>loc_71B82:</b>, and change this line:<br />
<asm> lea ($FFF000).l,a6</asm><br />
To this:<br />
<asm> lea (Sound_Driver_RAM).l,a6</asm><br />
a6 is the base address of the sound driver. This will fix 90% of your potential issues.<br />
<br />
Fixing the rest is where dword_722CC and dword_722EC come into play. <br />
<br />
Replace both tables with these:<br />
<br />
<asm>dword_722CC:<br />
dc.l Sound_Driver_RAM+$0D0 ; FM3<br />
dc.l 0 ; dummy<br />
dc.l Sound_Driver_RAM+$100 ; FM4<br />
dc.l Sound_Driver_RAM+$130 ; FM5<br />
dc.l Sound_Driver_RAM+$190 ; PSG1<br />
dc.l Sound_Driver_RAM+$1C0 ; PSG2<br />
dc.l Sound_Driver_RAM+$1F0 ; Plain PSG3<br />
dc.l Sound_Driver_RAM+$1F0 ; Noise<br />
dword_722EC:<br />
dc.l Sound_Driver_RAM+$220 ; SFX FM3<br />
dc.l 0 ; dummy<br />
dc.l Sound_Driver_RAM+$250 ; SFX FM4<br />
dc.l Sound_Driver_RAM+$280 ; SFX FM5<br />
dc.l Sound_Driver_RAM+$2B0 ; SFX PSG1<br />
dc.l Sound_Driver_RAM+$2E0 ; SFX PSG2<br />
dc.l Sound_Driver_RAM+$310 ; Plain PSG3<br />
dc.l Sound_Driver_RAM+$310 ; Noise</asm><br />
<br />
Also, their proper names would be BGMChannelRAM and SFXChannelRAM, respectively. You can rename theme if you want, but it's not necessary.<br />
<br />
Finally, go to <b>loc_71C88:</b>. There are two lines to make note of:<br />
<asm> cmp.b #0,($FFFFFF3A).w<br />
bgt.s locret_71CAA</asm><br />
These lines can be commented out, as they don't do much besides muting the DAC chnnel when set, and aren't ever used normally.<br />
If desired, you can also set them to any old unused RAM value.<br />
<br />
Once you've done that, you should be able to shift RAM around all you want without the sound driver screwing up!<br />
<br />
==Credits==<br />
Varion Icaria - Puto's sound driver port.<br />
Esrael - Tweakers driver port, plus fixes for things broken in Puto's port, such as hanging on the title card. Extra thanks for fixing the Sega sound.<br />
Puto - Fixes for underwater palette stuff, as well as special stage ring stuff, and various other fixes to the original guide.<br />
Tweaker - Wrote the orignal guide to port Sonic 1's sound driver into Sonic 2.<br />
ShadowsofYesterday - Telling me the fix for the SEGA sound. (old version of the guide)<br />
ValleyBell - In addition to his original work on the Clone Driver, he showed me numerous things I could do to fix the guide. He also helped me with the equating process. Thanks, ValleyBell!<br />
Caverns 4 - I wrote and updated the guide.<br />
<br />
{{S2Howtos}}<br />
<br />
[[Category:SCHG How-tos|{{PAGENAME}}]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to:Guide&diff=208783SCHG How-to:Guide2014-05-26T14:17:22Z<p>RetroUser: Text replace: "Caverns4" to "Caverns 4"</p>
<hr />
<div>The '''SCHG How-to''': series is a spinoff from the [[SCHG:Sonic Community Hacking Guide|Sonic Community Hacking Guide]] with a focus on how-to, tutorials, and supplementary education. Whereas the traditional SCHG serves more as a map for users to navigate a ROM for themselves, the How-to series is more a "how to get from point A to point B" set of directions. Tutorials range from the very basic to very complex, with an eye towards making sure no part of the process is assumed or left out. <br />
<br />
==General How-Tos==<br />
* [[SCHG How-to:Work with Motorola 68000 assembly|Work with Motorola 68000 assembly]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Work with Objects|Work with Objects]] (by [[Malevolence]] and [[MarkeyJester]])<br />
* [[SCHG How-to:Use a Hex Editor|Use a Hex Editor]] (by [[Scarred Sun]])<br />
* [[SCHG How-to:Edit Palettes Using Hex|Edit Palettes Using Hex]] (by [[Scarred Sun]])<br />
* [[SCHG How-to:Use SonMapEd/Part 1|Use SonMapEd/Part 1]] (by [[Chimpo]])<br />
* [[SCHG How-to:Use SonMapEd/Part 2|Use SonMapEd/Part 2]] (by [[Chimpo]])<br />
* [[SCHG How-to:Import Art to SonED2|Import Art to SonED2]] (by [[iojnekns]])<br />
* [[SCHG How-to:Set Up SonLVL|Set Up SonLVL]] (by [[MainMemory]])<br />
<br />
==Game-Specific==<br />
===''Sonic 1''===<br />
====Fixing bugs====<br />
These guides describe the steps to take to fix bugs that are present in the original game or bugs that occur after altering something in the game.<br />
* [[SCHG How-to:Fix demo playback|Fix demo playback]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix a race condition with Pattern Load Cues|Fix a race condition with Pattern Load Cues]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix the SEGA Sound|Fix the SEGA Sound]] (by [[Puto]])<br />
* [[SCHG How-to:Display the Press Start Button text|Display the Press Start Button text]] (by [[Quickman]])<br />
* [[SCHG How-to:Fix the Level Select menu in Sonic 1|Fix the Level Select menu]] (by [[STHX]])<br />
* [[SCHG How-to:Fix the Hidden Points bug in Sonic 1|Fix the Hidden Points bug]] (by [[1337Rooster]])<br />
* [[SCHG How-to:Fix Accidental Deletion of Scattered Rings#Sonic 1 Fix|Fix accidental deletion of scattered rings]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix Ring Timers|Fix ring timers]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the Walk-Jump Bug in Sonic 1|Fix the walk-jump bug]] (by [[Cinossu]])<br />
* [[SCHG How-to:Correct Drowning Bugs in Sonic 1|Correct drowning bugs]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the death boundary bug|Fix the death boundary bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the camera follow bug|Fix the camera follow bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the DAC fade in bug|Fix the DAC fade in bug]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix the HUD blinking|Fix the HUD blinking]] (by [[Quickman]])<br />
* [[SCHG How-to:Fix the Level Select graphics bug|Fix the Level Select graphics bug]] (by [[MarkeyJester]])<br />
<br />
====Changing design choices====<br />
These guides describe how you can alter some behaviors in the game that might not be to your liking.<br />
* [[SCHG How-to:Change Spike behavior in Sonic 1|Change Spike behavior]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix the Special Stage jumping physics|Fix the Special Stage jumping physics]] (by [[Mercury]])<br />
* [[SCHG How-to:Improve the fade in\fade out progression routines in Sonic 1|Improve the fade in\fade out progression routines]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 1 fix|Fix scattered rings' underwater physics]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Remove the Speed Cap|Remove the Speed Cap]] (by [[Tweaker]] and [[Puto]])<br />
* [[SCHG How-to:Port the REV01 Background Effects|Port the REV01 background effects]] (by [[jman2050]])<br />
* [[SCHG How-to:Port Sonic 2's Level Art Loader to Sonic 1|Port Sonic 2's level art loader]] (by [[User:Clownacy|Clownacy]])<br />
* [[SCHG How-to:Retain Rings Between Acts in Sonic 1|Retain rings between acts]] (by [[Afti]])<br />
* [[SCHG How-to:Sonic 2 (Simon Wai Prototype) Level Select in Sonic 1|Sonic 2 (Simon Wai Prototype) Level Select]] (by [[User:Kram1024|Kram1024]])<br />
<br />
====Adding features====<br />
These guides describe step-by-step how to add new features in the game. After following one of these guides, the feature should be fully functional in the game with no further work.<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 1|Add Spin Dash/Part 1]] (by [[Lightning]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 2|Add Spin Dash/Part 2]] (by [[Puto]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 3|Add Spin Dash/Part 3]] (by [[shobiz]])<br />
* [[SCHG How-to:Add Spin Dash to Sonic 1/Part 4|Add Spin Dash/Part 4]] (by [[Mercury]])<br />
* [[SCHG How-to:Have a functional Eggman monitor in Sonic 1|Have a functional Eggman Monitor]] (by [[nineko]])<br />
<br />
====Sound features====<br />
These guides cover the application of music and sound effects in the game. After following these guides, porting and adding original music should be possible.<br />
* [[SCHG How-to:Expand the music index from $94 to $9F|Expand the music index from $94 to $9F]] (by [[lukeusher123]])<br />
* [[SCHG How-to:Extend Music Slots in Sonic 1|Extend music slots in Sonic 1]] (by [[Mikel]])<br />
* [[SCHG How-to:Play different songs on different acts|Play different songs on different acts]] (by [[nineko]])<br />
* [[SCHG How-to:Expand the music index to start at $00 instead of $80|Expand the music index to start at $00 instead of $80]] (by [[HPZMan]])<br />
* [[SCHG How-to:Port Sonic 2 Final Sound Driver to Sonic 1|Port Sonic 2 Final's sound driver]] (by [[User:Kram1024|Kram1024]])<br />
* [[SCHG How-to:Port Sonic 3's Sound Driver to Sonic 1|Port Sonic 3's sound driver]] (by [[User:Kram1024|Kram1024]])<br />
<br />
====Extending the game====<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content.<br />
* [[SCHG How-to:Load chunks from ROM in Sonic 1|Load chunks from ROM]] (by [[FraGag]])<br />
* [[SCHG How-to:Add Extra Characters|Add extra characters]] (by [[Sonic 65]])<br />
* [[SCHG How-to:Make an Alternative Title Screen|Make an alternative title screen]] (by [[JcFerggy]])<br />
* [[SCHG How-to:Use Dynamic Tilesets in Sonic 1|Use dynamic tilesets]] (by [[HPZMan]])<br />
* [[SCHG How-to:Separate title art from GHZ/make GHZ load alternate art|Separate title art from GHZ/make GHZ load alternate art]] (by [[MKAmeX]])<br />
* [[SCHG How-to:Add a new zone in Sonic 1|Add a new zone]] (by [[FraGag]])<br />
* [[SCHG How-to:Set up the Goggle Monitor to work with it|Set up the Goggle Monitor to work with it]] (by [[Selbi]])<br />
* [[SCHG How-to:Add new moves in Sonic 1|Add new moves]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:Dynamic Collision system in Sonic 1|Add a dynamic collision system]] (by [[User:theocas|theocas]])<br />
* [[SCHG How-to:Dynamic Special Stage Walls system|Dynamic Special Stage walls system]] (by [[Mercury]])<br />
* [[SCHG How-to:Extend the Sonic 1 sprite mappings and art limit|Extend the Sonic 1 sprite mappings and art limit]] (by [[User:MarkeyJester|MarkeyJester]])<br />
* [[SCHG How-to:Enigma Credits in Sonic 1|Enigma Credits]] (by [[User:Fukuller|Fukuller]])<br />
<br />
====Miscellaneous====<br />
* [[SCHG How-to:Convert the Hivebrain 2005 disassembly to ASM68K|Convert the Hivebrain 2005 disassembly to ASM68K]] (by [[Puto]])<br />
<br />
====[[Qjimbo]]'s Split Disassembly Guides====<br />
These guides were formerly hosted on '''[[The Glowing Bridge]]'''.<br />
* [[SCHG How-to:Set up a Sonic 1 split disassembly|Set up a Sonic 1 split disassembly]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic Level Editing|S1 Split Guides/Basic Level Editing]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic Art Editing|S1 Split Guides/Basic Art Editing]] (by [[Qjimbo]])<br />
* [[SCHG How-to:S1 Split Guides/Basic ASM Editing (Spin Dash)|S1 Split Guides/Basic ASM Editing (Spin Dash)]] (by [[Qjimbo]])<br />
<br />
===''Sonic 2''===<br />
====Fixing bugs====<br />
* [[SCHG How-to:Fix demo playback|Fix demo playback]] (by [[FraGag]])<br />
* [[SCHG How-to:Fix a race condition with Pattern Load Cues|Fix a race condition with Pattern Load Cues]] (by [[FraGag]])<br />
* [[SCHG_How-to:Fix bugs relating to Super Sonic|Fix bugs relating to Super Sonic]] (by [[MoDule]])<br />
* [[SCHG_How-to:Use correct height when roll jumping|Use correct height when roll jumping]] (by [[MoDule]])<br />
* [[SCHG_How-to:Fix jump height bug when exiting water|Fix jump height bug when exiting water]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix Sonic 2's buggy spindash code and add spindash speeds|Fix Sonic 2's buggy spindash code and add spindash speeds]] (by [[GARY 'M 9]])<br />
* [[SCHG_How-to:Fix screen boundary spindash bug|Fix screen boundary spindash bug]] (by [[Flamewing]])<br />
* [[SCHG How-to:Correct Drowning Bugs in Sonic 2|Correct drowning bugs]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix_camera_y_position_for_Tails|Fix camera y position for Tails]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix Tails subanimation error|Fix Tails subanimation error]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Tails' respawn speeds|Fix Tails' respawn speeds]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Accidental Deletion of Scattered Rings#Sonic 2 Fix|Fix accidental deletion of scattered rings]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Fix Ring Timers|Fix ring timers]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Rexon crash|Fix Rexon crash]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix monitor collision bug|Fix monitor collision bug]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix the EHZ Deformation bug|Fix the EHZ deformation bug]] (by [[qiuu]])<br />
* [[SCHG How-To:Correct CPZ boss attack behavior|Correct CPZ boss attack behavior]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix bug in ARZ Boss arrow's platform behavior|Fix bug in ARZ boss arrow's platform behavior]] (by [[MoDule]]) (addition by [[redhotsonic]])<br />
* [[SCHG How-to:Fix ARZ Boss Walking on Air Glitch|Fix ARZ boss walking on air glitch]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix ARZ boss sprite behavior|Fix ARZ boss sprite behavior]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix multiple CNZ boss bugs|Fix multiple CNZ boss bugs]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Fix Hill Top's background scrolling mountains|Fix HTZ's background scrolling mountains]] (by [[flamewing]])<br />
* [[SCHG How-to:Fix_the_OOZ_launcher_speed_up_glitch|Fix the OOZ launcher speed up glitch]] (by [[MoDule]])<br />
* [[SCHG How-to:Fix DEZ Eggrobo boss collision glitch|Fix DEZ Eggrobo boss collision glitch]] (by [[flamewing]])<br />
* [[SCHG How-to:Fix Boss Deconstruction Behavior|Fix boss deconstruction behavior]] (by [[Esrael]] & [[redhotsonic]])<br />
* [[SCHG How-to:Fix Speed Bugs in Sonic 2|Fix speed bugs]] (by [[redhotsonic]])<br />
<br />
====Design choices & features====<br />
* [[SCHG How-to:Remove the Air Speed Cap|Remove the air speed cap]] (by [[Selbi]] and [[Puto]])<br />
* [[SCHG How-to:Disable floor collision while dying|Disable floor collision while dying]] (by [[Esrael]])<br />
* [[SCHG How-to:Modify Transformation Behavior in Sonic 2|Modify Super Sonic transformation methods & behavior]] (by [[vladikcomper]] & [[redhotsonic]])<br />
* [[SCHG How-to:Enable/Disable Tails in certain levels|Enable/Disable Tails in certain levels]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG_How-to:Collide with water after being hurt|Collide with water after being hurt]] (by [[MoDule]])<br />
* [[SCHG How-to:Retain Rings when returning at a Star Post|Retain rings when returning at a Star Post]] (by [[Mercury]])<br />
* [[SCHG How-to:Create Insta-kill and High Jump Monitors|Create Insta-kill and High Jump Monitors]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG How-to:Create Clone and Special Stage Monitors|Create Clone and Special Stage Monitors]] (by [[User:Tamkis|Tamkis]])<br />
* [[SCHG How-to:Improve the fade in\fade out progression routines in Sonic 2|Improve the fade in\fade out progression routines]] (by [[MarkeyJester]])<br />
* [[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 2 fix|Fix scattered rings' underwater physics]] (by [[redhotsonic]])<br />
* [[SCHG_How-to:Insert Labyrinth Zone water ripple effect in Sonic 2|Insert LZ water ripple effect]] (by [[MoDule]])<br />
* [[SCHG_How-to:Restore lost CPZ boss feature|Restore lost CPZ boss feature]] (by [[Esrael]])<br />
* [[SCHG How-to:Prevent SCZ Tornado spin dash death|Prevent SCZ Tornado spin dash death]] (by [[Esrael]])<br />
* [[SCHG How-to:Improve ObjectMove subroutines|Improve ObjectMove subroutines]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Port Knuckles into Sonic 2|Port Knuckles]] (by [[MainMemory]])<br />
* [[SCHG How-to:Port Sonic 3k's rings manager to Sonic 2|Port S3K's rings manager]] (by [[shobiz]])<br />
* [[SCHG_How-to:Port S3K Object Manager into Sonic 2|Port S3K's object manager]] (by [[MoDule]])<br />
* [[SCHG How-to:Port S3K Priority Manager into Sonic 2|Port S3K's priority manager]] (by [[redhotsonic]])<br />
* [[SCHG How-to:Edit the Level Order in Sonic 2 with ASM|Edit the level order in Sonic 2 with ASM]] (by [[Malevolence]] and [[Metal_Man88]])<br />
* [[SCHG How-to:Alter the Ring Requirements in the Special Stages|Alter the ring requirements in the Special Stages]] (by [[Mercury]])<br />
* [[SCHG How-to:Change the Special Stage characters to use normal DPLCs|Change the Special Stage characters to use normal DPLCs]] (by [[Flamewing]])<br />
* [[SCHG_How-to:Speed Up Ring Loss Process (With Underwater)|Speed up ring loss process (w/ underwater)]] (by [[redhotsonic]])<br />
<br />
====Sound features====<br />
* [[SCHG How-to:Port Sonic 1's Sound Driver to Sonic 2|Port Sonic 1's sound driver]] (by [[Tweaker]])<br />
* [[SCHG How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|Port Sonic 2 Clone Driver]] (by [[Caverns 4]])<br />
* [[SCHG How-to:Port Sonic 3's Sound Driver to Sonic 2|Port Sonic 3's sound driver]] (by [[User:Kram1024|Kram1024]])<br />
* [[SCHG How-to:Expand the music index to start at $00 instead of $80 (Sonic 2 Clone Driver version)|Expand the music index to start at $00 instead of $80 (Sonic 2 Clone Driver version)]] (by [[Mikel]], based on a guide by [[HPZMan]])<br />
<br />
====Extending the game====<br />
* [[SCHG How-to:Extend the level index past $10 in Sonic 2|Extend the level index past $10]] (by [[User:Kram1024|kram]])<br />
* [[SCHG_How-to:Extend the Level Select in Sonic_2|Extend the Level Select]] (by [[User:Clownacy|Clownacy]])<br />
* [[SCHG How-to:Extend the water tables in Sonic 2|Extend the water tables]] (by [[Dani]])<br />
* [[SCHG How-to:Add Extra Characters To Sonic 2|Add extra characters]] (by [[User:ManicRemix|Manic Remix]])<br />
* [[SCHG_How-to:Free up 2 universal SSTs|Free up 2 universal SSTs]] (by [[redhotsonic]])<br />
<br />
===''Sonic 2 Master System''===<br />
* [[SCHG How-to:Add Dynamic Palettes to Sonic 2 SMS|Add dynamic palettes]] (by [[Mikel]])<br />
* [[SCHG How-to:Relocate Player Object Logic in Sonic 2 SMS|Relocate player object logic]] (by [[Glitch]])<br />
* [[SCHG How-to:Add a Custom Badnik to Sonic 2 SMS|Add a custom badnik]] (by [[Glitch]])<br />
* [[SCHG How-to:Add a New Monitor in Sonic 2 SMS|Add a new monitor]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:Add a Second Digit To the Lifecounter in Sonic 2 SMS|Add a second digit to the Lifecounter]] (by [[User:Ravenfreak|Ravenfreak]])<br />
* [[SCHG How-to:How to Add new tiles in different acts in Sonic 2 SMS|How to add new tiles in different acts]] (by [[User:Ravenfreak|Ravenfreak]])<br />
<br />
===''Sonic 3 & Knuckles''===<br />
*[[SCHG How-to:Work with Water in S3K|Work with water in S3K]] (by [[Katelynn]])<br />
*[[SCHG How-to:Restore Sonic 2 Menus to Sonic 3|Restore Sonic 2 menus]] (by [[Mustapha]])<br />
*[[SCHG How-to:Fix Blue Knuckles|Fix Blue Knuckles]] (by [[User:Tamkis|Tamkis]])<br />
*[[SCHG How-to:Fix Scattered Rings Underwater Physics#Sonic 3&K fix|Fix scattered rings' underwater physics]] (by [[redhotsonic]])<br />
*[[SCHG How-to:Fix Tails' respawn speeds#Sonic 3K fix|Fix Tails' respawn speeds]] (by [[redhotsonic]])<br />
<br />
===''Sonic Advance 3''===<br />
*[[SCHG How-to:Switch Characters for Nonaggression|Switch characters for Nonaggression]] (by [[Erik JS]])<br />
<br />
===''Sonic Adventure 1/DX''===<br />
*[[SCHG How-to:Edit Sonic Adventure levels|Edit Sonic Adventure levels]] (by [[Polygon Jim]])<br />
<br />
===''Sonic Generations''===<br />
*[[SCHG How-to:Import Levels Into Sonic Generations|Import levels]] (by [[Sky The Destroyer]])<br />
*[[SCHG How-to:Create Breakable Objects In Sonic Generations|Create breakable objects]] (by [[Paraxade]])<br />
*[[SCHG How-to:Create Splines For Sonic Generations|Create splines]] (by [[Faseeh]])<br />
<br />
To add your own how-to, simply add an article with SCHG How-to: before the name, which will register it with the correct namespace.<br />
<br />
[[Category:SCHG How-tos| ]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Port_Sonic_3%27s_Sound_Driver_to_Sonic_2&diff=208761SCHG How-to Talk:Port Sonic 3's Sound Driver to Sonic 22014-05-25T17:21:21Z<p>RetroUser: </p>
<hr />
<div>Yikes! Most of the guide's page-space being Sonic 2 code that we're directed to replace, what? Pre-assembled Z80 code in an AS macro assembler disassembly, the hell? "Optimised" SoundDriverLoad that isn't even as optimised as to break from the S3 norm and use Kosinski-compressed driver data, why? Hardcoded equates, huh? Outright instructing one to delete art BINCLUDEs and replace them instead of just detailing how to relocate them, ...? SMPS is intellectual property, *shrug*?<br />
<br />
Call me spoiled, but [http://forums.sonicretro.org/index.php?showtopic=32061] seems so much less hackish. Even if it uses a modified S&K driver, the use of a disassembled driver looks to make things so much easier, and that guide better fits the 'Sonic Team way' philosophy of the S1 guide, I can certainly tell you that S3 doesn't handle tempo-changing that way, having an exception programmed into PlayMusic. [[User:Clownacy|Clownacy]] 14:54, 25 May 2014 (UTC)<br />
<br />
:Hm, I think I agree, as I've tried out that driver, I like it, and it's not so arbitrary in the area of what music you can have. Trust me, I've ported Sonic 3's driver to Sonic 1, and I think that working with the music when using that driver can be a real pain. I mean, most of the time, porting music from Sonic 3D works without much work (mostly because it uses pretty much the same driver), but I HATE Sonic 3's way of sorting music, because you port a song, and your other songs turn into nothing but garbled trash. I'm pretty sure this happens because of Sonic 3's system of address pointers. -- [[User:RetroUser|RetroUser]] 17:21, 25 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Guide&diff=208760SCHG How-to Talk:Guide2014-05-25T17:16:46Z<p>RetroUser: </p>
<hr />
<div>==Categorization==<br />
After familiarising myself with the 'guide categories', I question why the entries under Sonic 2's Miscellaneous are there, as, to me, they appear to fall under Design Choices.<br />
<br />
To be more specific, what makes them 'miscellaneous'? What makes them 'not Design Choice changes'? Why else would you change, say, the Special Stage ring requirements? It's not to fix a bug, and it isn't to allow for custom content, nor would it not have an immediate effect, as the description under S1's Extend category header. It even seems similar to <i>Enable/Disable Tails in Certain Levels</i> in that regard: why change that? They're for the same reasons, customisation of the original game, or for custom Zones/Special Stages.<br />
<br />
Actually, it seems that many guides are in the wrong place. <i>Port Knuckles</i>, for example:<br />
<br />
<i>"<b>Extending the game</b><br />
<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content."</i><br />
<br />
UMM...<br />
<br />
Also, what of outdated guides? I have a plan for a superior version of <i>Expand the music index from $94 to $9F</i> and <i>Expand the music index to start at $00 instead of $80</i> that takes no cues from these guides. I don't want to just orphan the guides, and I can't credit their authors in mine since they had no hand whatsoever in it.<br />
<br />
So the only logical solution I can think of is creating a separate 'Obsolete' category. I wouldn't say 'Outdated' since at least half of the guides around here <i>are</i> outdated (old disasms). Though I wouldn't argue against such a category for those, it'd give us a reason to update the old things to a level of presentability.<br />
<br />
Anyhow, I just wanted to bring this by anyone reading before I go off making any relatively large changes. Anyone have any objections, suggestions? Anything? [[User:Clownacy|Clownacy]] 17:19, 14 April 2014 (UTC)<br />
<br />
:I did not read the descriptions on the Sonic 1 categories when placing the Knuckles guide, I merely saw that it wasn't a design choice, so I figured it ought to go under extending the game. Perhaps if the "Design Choices & Features" category was split into two like Sonic 1, it would make more sense. [[User:MainMemory|MainMemory]] 17:24, 14 April 2014 (UTC)<br />
<br />
==Homing Attack Guide==<br />
Hey, could somebody please write a homing attack/jump-dash guide for Sonic 1? That would be awesome! [[User:RetroUser|RetroUser]] 20:40, 24 April 2014 (UTC)<br />
:Certain people would rather such a guide not exist, as they feel that it would be "too easy". I personally don't feel that way, but I only do Sonic 2. [[User:MainMemory|MainMemory]] 20:45, 24 April 2014 (UTC)<br />
<br />
::Ok then, Sonic 2 would be fine. [[User:RetroUser|RetroUser]] 21:06, 24 April 2014 (UTC)<br />
<br />
:Oh, and if a homing attack guide gets written for Sonic 2, it can go under the new "Adding features" category I added. [[User:RetroUser|RetroUser]] 23:12, 25 April 2014 (UTC)<br />
<br />
:Since when did we make guides on command? I may just be full of pride, but that feels rude. Besides, haven't you looked around? This 'homing attack code' business has been a touchy subject for ages, and many like you have asked this same question many times before, though they've mostly gotten the same answer. It says something, that you haven't noticed, something ''bad''. Also, you missed the Music Index expansion guide under ''Extending the game'', you haven't removed the mention of features from the ''Design Choices & Features'' header, there are numerous ''Adding features''-type guides that you haven't moved from ''Design Choices & Features'', and you haven't changed the S2Howtos Template. If this is how you edit a wiki page, I'd hate to see how you edit code. No wonder you need a guide! But these guides aren't here to tell you how to do everything. Many, myself included, used and see these as an introduction. It's where you begin, with adding a basic move, enhancing a certain feature. Not where you reach the peak of Sonic hacking, where you program an alien ability that requires greater knowledge of the Sonic Engine's object system, physics, object status, collision handling, and even 68K Assembly itself! You can't condense that into a guide; instead, it must come from experience, lots of it. The only guide that the homing attack can possibly find itself in is a copy-and-paste guide, and that is unacceptable. [[User:Clownacy|Clownacy]] 03:47, 27 April 2014 (UTC)<br />
<br />
::Okay, I wasn't demanding that a guide be written, I was simply asking about it and stating that it was a new feature and could go there if it ever did get written, which now isn't going to happen, I can see. I understand now what you mean about the music expansion guide, but the fact that you have to provide your own music was on my mind. [[User:RetroUser|RetroUser]] 15:55, 27 April 2014 (UTC)<br />
<br />
:::If I can say anything, I meant nothing malicious by removing your category, it's nice to see someone making changes around here, but as I was following up on my changes mentioned in the above 'Categorization' section, I had a very difficult time distinguishing feature from alternate design choice. For example, the Air Speed Cap Removal guide, was it a feature that you could exceed a certain speed whilst airborne, or was it changing the design choice of having it limited? One of the few reasons I thought for the ''Expansion''-worthy guide going under ''Sound Features'' was that this was the case with the Sonic 1 guide, though looking at it now, there's a sound driver bugfix in the Bugfix category, and not in the ''Sound Features'' one. Since the drivers are the same thing, only in different games, I'm thinking of adding a separate group, solely for the 68K sound driver. It'd get very messy having a Sonic 2 variant of every guide for the S1 sound driver thanks to the Clone Driver, and only worsened when I begin adding more guides for the thing. [[User:Clownacy|Clownacy]] 15:41, 28 April 2014 (UTC)<br />
<br />
::::Alright, I guess I wouldn't have many objections (if any) for a section solely on the driver, as things wouldn't have to be spread out as much, and there would be less debate about where a guide for it would go. Also, I'd like to thank you for stating that you meant no harm when removing my category, and I'd like to say that I was only trying to make things easier by adding new sections. I didn't mean to have things so messed up, and I'll try to be more careful in the future. [[User:RetroUser|RetroUser]] 00:29, 29 April 2014 (UTC)<br />
<br />
==Clone Driver 2.1.2 Setup Guide==<br />
<br />
Clownancy,<br />
<br />
Ok, so I've downloaded and checked out the Sonic 2 Clone Driver 2.1.2, and I find it to be awesome, but is there a setup tutorial out there, or are you working on that? [[User:RetroUser|RetroUser]] 23:46, 9 May 2014 (UTC)<br />
<br />
:That's being asked here? There's one right on the thread's first post, right underneath the download. At some point, I plan to edit [[SCHG_How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|this guide]] to support it. Right now, I don't really want to. I'll probably have to have the page's name changed and completely rewrite it... Actually, I think I'll just move it to the proposed 'Obsolete' category and make a brand new page. Speaking of obsolete, I'm surprised no one's noticed that the Enigma Credits guide is broken: The download links are external, and the host has long since deleted the files. Flamewing's S2 Special Stage DPLC guide appears to be broken also, but in a different way, in that I can't get it to work, though that could just be me. It's been a while since I last tried, and that was before I got familiar with DPLCs and mappings, so I'll give it another shot. Don't know what to do with the Enigma Credits, I can't find a mirror to the files, which leaves it a dead guide. Wait a minute... Clown-nancy?! [[User:Clownacy|Clownacy]] 18:05, 11 May 2014 (UTC)<br />
<br />
::Whoops! Guess I saw the name incorrectly...sorry =/ [[User:RetroUser|RetroUser]] 23:45, 11 May 2014 (UTC)<br />
<br />
:::It's Clown + Lunacy, pronounced "Cloonacy". Think "Clown" pronounced with a strong accent (Scottish?). A recent message from a Clone Driver V2 (I need to find a way to abbreviate this thing) user gave me an idea to make the Driver update-friendly, the guide will also contain a 'how to update' section. Going back for a minute, by "setup" you meant "installation", right? How are you signing your posts, anyway? The wiki doesn't seem to like it, I have to keep fixing it. [[User:Clownacy|Clownacy]] 08:15, 12 May 2014 (UTC)<br />
<br />
::::Okay, my signature should be fixed, but before now, I would click on the "Treat signature as wikitext (without an automatic link)" box and use html code or whatever to color it and give it a font (think FrozenNitrogen). What do you mean by the wiki not liking it, though? Would it just show weird code? Also, as for the guide, yes, I mean installation, however, when I went to the topic to download the driver, I didn't remember seeing the guide, so I just had to ask that question without checking it again. [[User:RetroUser|RetroUser]] 19:32, 12 May 2014 (UTC)<br />
<br />
:::::Look at the history, "Retro" is highlighted blue, and probably links to something. So, yeah, weird code. Whatever you did this time, it worked, safe for the out-of-place hyphen. [[User:Clownacy|Clownacy]] 20:26, 12 May 2014 (UTC)<br />
<br />
::::::Umm, the "Retro" wasn't highlighted blue, I used html code to give it that color; the whole name links to my *missing* user page because I set it to do that. Now, the "User" I colored gray to give my signature something of a <strike>cheese factor</strike> unique style by having two colors. For example, Frozen Nitrogen's unique signature is like this: [[Frozen Nitrogen|<span style="color:steelblue">'''Frozen'''</span> <span style="color:springgreen">'''Nitrogen'''</span>]]. [[User:RetroUser|RetroUser]] 17:01, 13 May 2014 (UTC)<br />
<br />
== Dynamic Music in Sonic 2 ==<br />
<br />
Umm, does anybody here know about having dynamic music in Sonic 2? I've been trying to do it myself, but I can't seem to get the code to work. This is especially painful now that I've installed the Clone Driver 2.1.2 and have support for MUCH more music. So, Clownacy, if/when you put up a wiki guide on how to install this driver, could you add a section on this? I'm not saying that you have to, and it's fine if you feel that this code shouldn't be in a guide; I'm just putting up a request. And who knows? Maybe I'll end up getting the code to work by myself. Still, it would be nice to see how things are done the real way. =P -- [[User:RetroUser|RetroUser]] 18:03, 24 May 2014 (UTC)<br />
<br />
:Dynamic music? What's that? Different music on every act? That would certainly be a good guide to make, since the Sonic 1 guide on it is a cheap hack. Good for teaching a noob when to use <i>cmp</i>, but not good at teaching anyone the real way to achieve act-specific music. Such a thing would be a standalone guide, as you can apply it to hacks using either of the S1/S2/S3K drivers. [[User:Clownacy|Clownacy]] 13:06, 25 May 2014 (UTC)<br />
<br />
::Yeah, that's what I mean, and what I meant by "the real way" was "not my way" (which doesn't even work yet, and is probably sort of hackish.). Also, I think that it may be a tad bit more complicated with Sonic 2, because it also has a check for multiplayer mode, and I don't understand how Metropolis 3 simply loads the entry after the one for the first act. So, I'd like to post this area of code (where I'm trying to get the code to work) from a fresh Sonic 2 disasm and from my disasm. (The Clone Driver is installed in mine, btw. Also, these references are for the GitHub disasm.)<br />
<br />
::The vanilla code from MusicList to the end of Level_PlayBgm:<br />
<br />
<asm>;----------------------------------------------------------------------------<br />
; 1P Music Playlist<br />
;----------------------------------------------------------------------------<br />
; byte_3EA0:<br />
MusicList: zoneOrderedTable 1,1<br />
zoneTableEntry.b MusID_EHZ ; 0 ; EHZ<br />
zoneTableEntry.b MusID_EHZ ; 1<br />
zoneTableEntry.b MusID_MTZ ; 2<br />
zoneTableEntry.b MusID_OOZ ; 3<br />
zoneTableEntry.b MusID_MTZ ; 4 ; MTZ1,2<br />
zoneTableEntry.b MusID_MTZ ; 5 ; MTZ3<br />
zoneTableEntry.b MusID_WFZ ; 6 ; WFZ<br />
zoneTableEntry.b MusID_HTZ ; 7 ; HTZ<br />
zoneTableEntry.b MusID_HPZ ; 8<br />
zoneTableEntry.b MusID_SCZ ; 9<br />
zoneTableEntry.b MusID_OOZ ; 10 ; OOZ<br />
zoneTableEntry.b MusID_MCZ ; 11 ; MCZ<br />
zoneTableEntry.b MusID_CNZ ; 12 ; CNZ<br />
zoneTableEntry.b MusID_CPZ ; 13 ; CPZ<br />
zoneTableEntry.b MusID_DEZ ; 14 ; DEZ<br />
zoneTableEntry.b MusID_ARZ ; 15 ; ARZ<br />
zoneTableEntry.b MusID_SCZ ; 16 ; SCZ<br />
zoneTableEnd<br />
even<br />
;----------------------------------------------------------------------------<br />
; 2P Music Playlist<br />
;----------------------------------------------------------------------------<br />
; byte_3EB2:<br />
MusicList2: zoneOrderedTable 1,1<br />
zoneTableEntry.b MusID_EHZ_2P ; 0 ; EHZ 2P<br />
zoneTableEntry.b MusID_EHZ ; 1<br />
zoneTableEntry.b MusID_MTZ ; 2<br />
zoneTableEntry.b MusID_OOZ ; 3<br />
zoneTableEntry.b MusID_MTZ ; 4<br />
zoneTableEntry.b MusID_MTZ ; 5<br />
zoneTableEntry.b MusID_WFZ ; 6<br />
zoneTableEntry.b MusID_HTZ ; 7<br />
zoneTableEntry.b MusID_HPZ ; 8<br />
zoneTableEntry.b MusID_SCZ ; 9<br />
zoneTableEntry.b MusID_OOZ ; 10<br />
zoneTableEntry.b MusID_MCZ_2P ; 11 ; MCZ 2P<br />
zoneTableEntry.b MusID_CNZ_2P ; 12 ; CNZ 2P<br />
zoneTableEntry.b MusID_CPZ ; 13<br />
zoneTableEntry.b MusID_DEZ ; 14<br />
zoneTableEntry.b MusID_ARZ ; 15<br />
zoneTableEntry.b MusID_SCZ ; 16<br />
zoneTableEnd<br />
even<br />
; ===========================================================================<br />
<br />
; ---------------------------------------------------------------------------<br />
; Level<br />
; DEMO AND ZONE LOOP (MLS values $08, $0C; bit 7 set indicates that load routine is running)<br />
; ---------------------------------------------------------------------------<br />
; loc_3EC4:<br />
Level:<br />
bset #GameModeFlag_TitleCard,(Game_Mode).w ; add $80 to screen mode (for pre level sequence)<br />
tst.w (Demo_mode_flag).w ; test the old flag for the credits demos (now unused)<br />
bmi.s +<br />
move.b #MusID_FadeOut,d0<br />
bsr.w PlaySound ; fade out music<br />
+<br />
bsr.w ClearPLC<br />
bsr.w Pal_FadeFrom<br />
tst.w (Demo_mode_flag).w<br />
bmi.s Level_ClrRam<br />
move #$2700,sr<br />
bsr.w ClearScreen<br />
jsr (LoadTitleCard).l ; load title card patterns<br />
move #$2300,sr<br />
moveq #0,d0<br />
move.w d0,(Timer_frames).w<br />
move.b (Current_Zone).w,d0<br />
<br />
; multiply d0 by 12, the size of a level art load block<br />
add.w d0,d0<br />
add.w d0,d0<br />
move.w d0,d1<br />
add.w d0,d0<br />
add.w d1,d0<br />
<br />
lea (LevelArtPointers).l,a2<br />
lea (a2,d0.w),a2<br />
moveq #0,d0<br />
move.b (a2),d0 ; PLC1 ID<br />
beq.s +<br />
bsr.w LoadPLC<br />
+<br />
moveq #PLCID_Std2,d0<br />
bsr.w LoadPLC<br />
bsr.w Level_SetPlayerMode<br />
moveq #PLCID_Miles1up,d0<br />
tst.w (Two_player_mode).w<br />
bne.s +<br />
cmpi.w #2,(Player_mode).w<br />
bne.s Level_ClrRam<br />
addq.w #PLCID_MilesLife-PLCID_Miles1up,d0<br />
+<br />
tst.b (Graphics_Flags).w<br />
bpl.s +<br />
addq.w #PLCID_Tails1up-PLCID_Miles1up,d0<br />
+<br />
bsr.w LoadPLC<br />
; loc_3F48:<br />
Level_ClrRam:<br />
clearRAM Sprite_Table_Input,$400<br />
clearRAM Object_RAM,(LevelOnly_Object_RAM_End-Object_RAM) ; clear object RAM<br />
clearRAM MiscLevelVariables,(MiscLevelVariables_End-MiscLevelVariables)<br />
clearRAM Misc_Variables,(Misc_Variables_End-Misc_Variables)<br />
clearRAM Oscillating_Data,(Oscillating_variables_End-Oscillating_variables)<br />
clearRAM CNZ_saucer_data,$100<br />
<br />
cmpi.w #chemical_plant_zone_act_2,(Current_ZoneAndAct).w ; CPZ 2<br />
beq.s Level_InitWater<br />
cmpi.b #aquatic_ruin_zone,(Current_Zone).w ; ARZ<br />
beq.s Level_InitWater<br />
cmpi.b #hidden_palace_zone,(Current_Zone).w ; HPZ<br />
bne.s +<br />
<br />
Level_InitWater:<br />
move.b #1,(Water_flag).w<br />
move.w #0,(Two_player_mode).w<br />
+<br />
lea (VDP_control_port).l,a6<br />
move.w #$8B03,(a6) ; EXT-INT disabled, V scroll by screen, H scroll by line<br />
move.w #$8230,(a6) ; PNT A base: $C000<br />
move.w #$8407,(a6) ; PNT B base: $E000<br />
move.w #$857C,(a6) ; Sprite attribute table base: $F800<br />
move.w #$9001,(a6) ; Scroll table size: 64x32<br />
move.w #$8004,(a6) ; H-INT disabled<br />
move.w #$8720,(a6) ; Background palette/color: 2/0<br />
move.w #$8C81,(a6) ; H res 40 cells, no interlace<br />
tst.b (Night_mode_flag).w<br />
beq.s ++<br />
btst #button_C,(Ctrl_1_Held).w<br />
beq.s +<br />
move.w #$8C89,(a6) ; H res 40 cells, no interlace, S/H enabled<br />
+<br />
btst #button_A,(Ctrl_1_Held).w<br />
beq.s +<br />
move.b #1,(Debug_mode_flag).w<br />
+<br />
move.w #$8ADF,(Hint_counter_reserve).w ; H-INT every 223rd scanline<br />
tst.w (Two_player_mode).w<br />
beq.s +<br />
move.w #$8A6B,(Hint_counter_reserve).w ; H-INT every 108th scanline<br />
move.w #$8014,(a6) ; H-INT enabled<br />
move.w #$8C87,(a6) ; H res 40 cells, double res interlace<br />
+<br />
move.w (Hint_counter_reserve).w,(a6)<br />
clr.w (VDP_Command_Buffer).w<br />
move.l #VDP_Command_Buffer,(VDP_Command_Buffer_Slot).w<br />
tst.b (Water_flag).w ; does level have water?<br />
beq.s Level_LoadPal ; if not, branch<br />
move.w #$8014,(a6) ; H-INT enabled<br />
moveq #0,d0<br />
move.w (Current_ZoneAndAct).w,d0<br />
if ~~useFullWaterTables<br />
subi.w #hidden_palace_zone_act_1,d0<br />
endif<br />
ror.b #1,d0<br />
lsr.w #6,d0<br />
andi.w #$FFFE,d0<br />
lea (WaterHeight).l,a1 ; load water height array<br />
move.w (a1,d0.w),d0<br />
move.w d0,(Water_Level_1).w ; set water heights<br />
move.w d0,(Water_Level_2).w<br />
move.w d0,(Water_Level_3).w<br />
clr.b (Water_routine).w ; clear water routine counter<br />
clr.b (Water_fullscreen_flag).w ; clear water movement<br />
move.b #1,(Water_on).w ; enable water<br />
; loc_407C:<br />
Level_LoadPal:<br />
moveq #PalID_BGND,d0<br />
bsr.w PalLoad2 ; load Sonic's palette line<br />
tst.b (Water_flag).w ; does level have water?<br />
beq.s Level_GetBgm ; if not, branch<br />
moveq #PalID_HPZ_U,d0 ; palette number $15<br />
cmpi.b #hidden_palace_zone,(Current_Zone).w<br />
beq.s Level_WaterPal ; branch if level is HPZ<br />
moveq #PalID_CPZ_U,d0 ; palette number $16<br />
cmpi.b #chemical_plant_zone,(Current_Zone).w<br />
beq.s Level_WaterPal ; branch if level is CPZ<br />
moveq #PalID_ARZ_U,d0 ; palette number $17<br />
; loc_409E:<br />
Level_WaterPal:<br />
bsr.w PalLoad3_Water ; load underwater palette (with d0)<br />
tst.b (Last_star_pole_hit).w ; is it the start of the level?<br />
beq.s Level_GetBgm ; if yes, branch<br />
move.b (Saved_Water_move).w,(Water_fullscreen_flag).w<br />
; loc_40AE:<br />
Level_GetBgm:<br />
tst.w (Demo_mode_flag).w<br />
bmi.s +<br />
moveq #0,d0<br />
move.b (Current_Zone).w,d0<br />
lea MusicList(pc),a1<br />
tst.w (Two_player_mode).w<br />
beq.s Level_PlayBgm<br />
lea MusicList2(pc),a1<br />
; loc_40C8:<br />
Level_PlayBgm:<br />
move.b (a1,d0.w),d0 ; load from music playlist<br />
move.w d0,(Level_Music).w ; store level music<br />
bsr.w PlayMusic ; play level music<br />
move.b #ObjID_TitleCard,(TitleCard+id).w ; load Obj34 (level title card) at $FFFFB080</asm><br />
<br />
::This code from my disasm:<br />
<br />
<asm>;----------------------------------------------------------------------------<br />
; 1P Music Playlist<br />
;----------------------------------------------------------------------------<br />
; byte_3EA0:<br />
MusicList: zoneOrderedTable 1,1<br />
zoneTableEntry.b MusID_EHZ ; 0 ; EHZ<br />
zoneTableEntry.b MusID_EHZ ; 1<br />
zoneTableEntry.b MusID_MTZ ; 2<br />
zoneTableEntry.b MusID_OOZ ; 3<br />
zoneTableEntry.b MusID_MTZ ; 4 ; MTZ1,2<br />
zoneTableEntry.b MusID_MTZ ; 5 ; MTZ3<br />
zoneTableEntry.b MusID_WFZ ; 6 ; WFZ<br />
zoneTableEntry.b MusID_HTZ ; 7 ; HTZ<br />
zoneTableEntry.b MusID_HPZ ; 8<br />
zoneTableEntry.b MusID_SCZ ; 9<br />
zoneTableEntry.b MusID_OOZ ; 10 ; OOZ<br />
zoneTableEntry.b MusID_MCZ ; 11 ; MCZ<br />
zoneTableEntry.b MusID_CNZ ; 12 ; CNZ<br />
zoneTableEntry.b MusID_CPZ ; 13 ; CPZ<br />
zoneTableEntry.b MusID_DEZ ; 14 ; DEZ<br />
zoneTableEntry.b MusID_ARZ ; 15 ; ARZ<br />
zoneTableEntry.b MusID_SCZ ; 16 ; SCZ<br />
zoneTableEnd<br />
even<br />
;----------------------------------------------------------------------------<br />
; 1P Music Playlist (Act 2s)<br />
;----------------------------------------------------------------------------<br />
MusicListAlt:zoneOrderedTable 1,1<br />
zoneTableEntry.b MusID_EHZ_2P ; 0 ; EHZ<br />
zoneTableEntry.b MusID_EHZ ; 1<br />
zoneTableEntry.b MusID_MTZ ; 2<br />
zoneTableEntry.b MusID_OOZ ; 3<br />
zoneTableEntry.b MusID_MTZ ; 4 ; MTZ1,2<br />
zoneTableEntry.b MusID_MTZ ; 5 ; MTZ3<br />
zoneTableEntry.b MusID_WFZ ; 6 ; WFZ<br />
zoneTableEntry.b MusID_HTZ ; 7 ; HTZ<br />
zoneTableEntry.b MusID_HPZ ; 8<br />
zoneTableEntry.b MusID_SCZ ; 9<br />
zoneTableEntry.b MusID_OOZ ; 10 ; OOZ<br />
zoneTableEntry.b MusID_MCZ ; 11 ; MCZ<br />
zoneTableEntry.b MusID_CNZ ; 12 ; CNZ<br />
zoneTableEntry.b MusID_CPZ ; 13 ; CPZ<br />
zoneTableEntry.b MusID_DEZ ; 14 ; DEZ<br />
zoneTableEntry.b MusID_ARZ ; 15 ; ARZ<br />
zoneTableEntry.b MusID_SCZ ; 16 ; SCZ<br />
zoneTableEnd<br />
even<br />
<br />
;----------------------------------------------------------------------------<br />
; 2P Music Playlist<br />
;----------------------------------------------------------------------------<br />
; byte_3EB2:<br />
MusicList2: zoneOrderedTable 1,1<br />
zoneTableEntry.b MusID_EHZ_2P ; 0 ; EHZ 2P<br />
zoneTableEntry.b MusID_EHZ ; 1<br />
zoneTableEntry.b MusID_MTZ ; 2<br />
zoneTableEntry.b MusID_OOZ ; 3<br />
zoneTableEntry.b MusID_MTZ ; 4<br />
zoneTableEntry.b MusID_MTZ ; 5<br />
zoneTableEntry.b MusID_WFZ ; 6<br />
zoneTableEntry.b MusID_HTZ ; 7<br />
zoneTableEntry.b MusID_HPZ ; 8<br />
zoneTableEntry.b MusID_SCZ ; 9<br />
zoneTableEntry.b MusID_OOZ ; 10<br />
zoneTableEntry.b MusID_MCZ_2P ; 11 ; MCZ 2P<br />
zoneTableEntry.b MusID_CNZ_2P ; 12 ; CNZ 2P<br />
zoneTableEntry.b MusID_CPZ ; 13<br />
zoneTableEntry.b MusID_DEZ ; 14<br />
zoneTableEntry.b MusID_ARZ ; 15<br />
zoneTableEntry.b MusID_SCZ ; 16<br />
zoneTableEnd<br />
even<br />
; ===========================================================================<br />
<br />
; ---------------------------------------------------------------------------<br />
; Level<br />
; DEMO AND ZONE LOOP (MLS values $08, $0C; bit 7 set indicates that load routine is running)<br />
; ---------------------------------------------------------------------------<br />
; loc_3EC4:<br />
Level:<br />
bset #GameModeFlag_TitleCard,(Game_Mode).w ; add $80 to screen mode (for pre level sequence)<br />
tst.w (Demo_mode_flag).w ; test the old flag for the credits demos (now unused)<br />
bmi.s +<br />
move.b #MusID_FadeOut,d0<br />
bsr.w PlaySound ; fade out music<br />
+<br />
bsr.w ClearPLC<br />
bsr.w Pal_FadeFrom<br />
tst.w (Demo_mode_flag).w<br />
bmi.s Level_ClrRam<br />
move #$2700,sr<br />
bsr.w ClearScreen<br />
jsr (LoadTitleCard).l ; load title card patterns<br />
move #$2300,sr<br />
moveq #0,d0<br />
move.w d0,(Timer_frames).w<br />
move.b (Current_Zone).w,d0<br />
<br />
; multiply d0 by 12, the size of a level art load block<br />
add.w d0,d0<br />
add.w d0,d0<br />
move.w d0,d1<br />
add.w d0,d0<br />
add.w d1,d0<br />
<br />
lea (LevelArtPointers).l,a2<br />
lea (a2,d0.w),a2<br />
moveq #0,d0<br />
move.b (a2),d0 ; PLC1 ID<br />
beq.s +<br />
bsr.w LoadPLC<br />
+<br />
moveq #PLCID_Std2,d0<br />
bsr.w LoadPLC<br />
bsr.w Level_SetPlayerMode<br />
moveq #PLCID_Miles1up,d0<br />
tst.w (Two_player_mode).w<br />
bne.s +<br />
cmpi.w #2,(Player_mode).w<br />
bne.s Level_ClrRam<br />
addq.w #PLCID_MilesLife-PLCID_Miles1up,d0<br />
+<br />
tst.b (Graphics_Flags).w<br />
bpl.s +<br />
addq.w #PLCID_Tails1up-PLCID_Miles1up,d0<br />
+<br />
bsr.w LoadPLC<br />
; loc_3F48:<br />
Level_ClrRam:<br />
clearRAM Sprite_Table_Input,$400<br />
clearRAM Object_RAM,(LevelOnly_Object_RAM_End-Object_RAM) ; clear object RAM<br />
clearRAM MiscLevelVariables,(MiscLevelVariables_End-MiscLevelVariables)<br />
clearRAM Misc_Variables,(Misc_Variables_End-Misc_Variables)<br />
clearRAM Oscillating_Data,(Oscillating_variables_End-Oscillating_variables)<br />
clearRAM CNZ_saucer_data,$100<br />
<br />
cmpi.w #chemical_plant_zone_act_2,(Current_ZoneAndAct).w ; CPZ 2<br />
beq.s Level_InitWater<br />
cmpi.b #aquatic_ruin_zone,(Current_Zone).w ; ARZ<br />
beq.s Level_InitWater<br />
cmpi.b #hidden_palace_zone,(Current_Zone).w ; HPZ<br />
bne.s +<br />
<br />
Level_InitWater:<br />
move.b #1,(Water_flag).w<br />
move.w #0,(Two_player_mode).w<br />
+<br />
lea (VDP_control_port).l,a6<br />
move.w #$8B03,(a6) ; EXT-INT disabled, V scroll by screen, H scroll by line<br />
move.w #$8230,(a6) ; PNT A base: $C000<br />
move.w #$8407,(a6) ; PNT B base: $E000<br />
move.w #$857C,(a6) ; Sprite attribute table base: $F800<br />
move.w #$9001,(a6) ; Scroll table size: 64x32<br />
move.w #$8004,(a6) ; H-INT disabled<br />
move.w #$8720,(a6) ; Background palette/color: 2/0<br />
move.w #$8C81,(a6) ; H res 40 cells, no interlace<br />
tst.b (Night_mode_flag).w<br />
beq.s ++<br />
btst #button_C,(Ctrl_1_Held).w<br />
beq.s +<br />
move.w #$8C89,(a6) ; H res 40 cells, no interlace, S/H enabled<br />
+<br />
btst #button_A,(Ctrl_1_Held).w<br />
beq.s +<br />
move.b #1,(Debug_mode_flag).w<br />
+<br />
move.w #$8ADF,(Hint_counter_reserve).w ; H-INT every 223rd scanline<br />
tst.w (Two_player_mode).w<br />
beq.s +<br />
move.w #$8A6B,(Hint_counter_reserve).w ; H-INT every 108th scanline<br />
move.w #$8014,(a6) ; H-INT enabled<br />
move.w #$8C87,(a6) ; H res 40 cells, double res interlace<br />
+<br />
move.w (Hint_counter_reserve).w,(a6)<br />
clr.w (VDP_Command_Buffer).w<br />
move.l #VDP_Command_Buffer,(VDP_Command_Buffer_Slot).w<br />
tst.b (Water_flag).w ; does level have water?<br />
beq.s Level_LoadPal ; if not, branch<br />
move.w #$8014,(a6) ; H-INT enabled<br />
moveq #0,d0<br />
move.w (Current_ZoneAndAct).w,d0<br />
if ~~useFullWaterTables<br />
subi.w #hidden_palace_zone_act_1,d0<br />
endif<br />
ror.b #1,d0<br />
lsr.w #6,d0<br />
andi.w #$FFFE,d0<br />
lea (WaterHeight).l,a1 ; load water height array<br />
move.w (a1,d0.w),d0<br />
move.w d0,(Water_Level_1).w ; set water heights<br />
move.w d0,(Water_Level_2).w<br />
move.w d0,(Water_Level_3).w<br />
clr.b (Water_routine).w ; clear water routine counter<br />
clr.b (Water_fullscreen_flag).w ; clear water movement<br />
move.b #1,(Water_on).w ; enable water<br />
; loc_407C:<br />
Level_LoadPal:<br />
moveq #PalID_BGND,d0<br />
bsr.w PalLoad2 ; load Sonic's palette line<br />
tst.b (Water_flag).w ; does level have water?<br />
beq.s Level_GetBgm ; if not, branch<br />
moveq #PalID_HPZ_U,d0 ; palette number $15<br />
cmpi.b #hidden_palace_zone,(Current_Zone).w<br />
beq.s Level_WaterPal ; branch if level is HPZ<br />
moveq #PalID_CPZ_U,d0 ; palette number $16<br />
cmpi.b #chemical_plant_zone,(Current_Zone).w<br />
beq.s Level_WaterPal ; branch if level is CPZ<br />
moveq #PalID_ARZ_U,d0 ; palette number $17<br />
; loc_409E:<br />
Level_WaterPal:<br />
bsr.w PalLoad3_Water ; load underwater palette (with d0)<br />
tst.b (Last_star_pole_hit).w ; is it the start of the level?<br />
beq.s Level_GetBgm ; if yes, branch<br />
move.b (Saved_Water_move).w,(Water_fullscreen_flag).w<br />
; loc_40AE:<br />
Level_GetBgm:<br />
tst.w (Demo_mode_flag).w<br />
bmi.s +<br />
moveq #0,d0<br />
move.b (Current_Zone).w,d0<br />
<br />
cmpi.b #$0,(Current_Act).w<br />
beq.s Level_GetBgm2<br />
lea MusicList(pc),a1<br />
bra.s Level_PlayBgm<br />
; ---------------------------------------------------------------------------<br />
; tst.w (Two_player_mode).w<br />
; beq.s Level_PlayBgm<br />
; lea MusicList2(pc),a1<br />
; ---------------------------------------------------------------------------<br />
Level_GetBgm2:<br />
cmpi.b #$1,(Current_Act).w<br />
beq.s Level_GetBgm2P<br />
lea MusicListAlt(pc),a1<br />
Level_GetBgm2P:<br />
tst.w (Two_player_mode).w<br />
beq.s Level_PlayBgm<br />
lea MusicList2(pc),a1<br />
; loc_40C8:<br />
Level_PlayBgm:<br />
move.b (a1,d0.w),d0 ; load from music playlist<br />
move.w d0,(Level_Music).w ; store level music<br />
bsr.w PlayMusic ; play level music<br />
move.b #ObjID_TitleCard,(TitleCard+id).w ; load Obj34 (level title card) at $FFFFB080</asm><br />
<br />
::Notice that in my code, I changed EHZ's song to the 2P song in my alternative playlist, however, it loads that song for EHZ whatsoever. This may sound n00bish, but could you tell me what I'm doing wrong? (Sorry for all that excess code; only the parts about music are relevant.) -- [[User:RetroUser|RetroUser]] 17:16, 25 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=User:ManicRemix&diff=208731User:ManicRemix2014-05-24T22:25:33Z<p>RetroUser: FINALLY, I got that link working.</p>
<hr />
<div>ManicRemix is a User of "[http://www.mariokartwii.com Mario Kart Wii]", and of [[Sonic Retro]].<br />
<br />
=Mario Kart Wii Custom Tracks= <br />
<br />
My two current custom tracks are:<br />
DS Rainbow Road, and, Super Mario Sunshine Delfino Plaza. I love to hack Mario kart, very much.<br />
Here are two custom race tracks I am making:<br />
Mario Kart DS Rainbow Road, and<br />
Super Mario Sunshine Delfino Plaza<br />
<br />
=My Story= <br />
I will keep it short:<br />
<br />
I first joined this site, lurking. I was looking up if it was possible to play as Amy Rose In Sonic The Hedgehog, and I found it.<br />
I then observed how the site worked since 2009, and then I joined.<br />
<br />
=A Little About Me=<br />
Let's see, I'm:<br />
Very good at hacking old 3D games, like Super Mario 64.<br />
I'm very good at hacking Mario Kart Wii.<br />
And I'm just a trainee in sonic hacking, and I will love to learn how it all works.<br />
<br />
[[Category:User pages|{{PAGENAME}}]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Guide&diff=208714SCHG How-to Talk:Guide2014-05-24T18:03:39Z<p>RetroUser: /* Dynamic Music in Sonic 2 */ new section</p>
<hr />
<div>==Categorization==<br />
After familiarising myself with the 'guide categories', I question why the entries under Sonic 2's Miscellaneous are there, as, to me, they appear to fall under Design Choices.<br />
<br />
To be more specific, what makes them 'miscellaneous'? What makes them 'not Design Choice changes'? Why else would you change, say, the Special Stage ring requirements? It's not to fix a bug, and it isn't to allow for custom content, nor would it not have an immediate effect, as the description under S1's Extend category header. It even seems similar to <i>Enable/Disable Tails in Certain Levels</i> in that regard: why change that? They're for the same reasons, customisation of the original game, or for custom Zones/Special Stages.<br />
<br />
Actually, it seems that many guides are in the wrong place. <i>Port Knuckles</i>, for example:<br />
<br />
<i>"<b>Extending the game</b><br />
<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content."</i><br />
<br />
UMM...<br />
<br />
Also, what of outdated guides? I have a plan for a superior version of <i>Expand the music index from $94 to $9F</i> and <i>Expand the music index to start at $00 instead of $80</i> that takes no cues from these guides. I don't want to just orphan the guides, and I can't credit their authors in mine since they had no hand whatsoever in it.<br />
<br />
So the only logical solution I can think of is creating a separate 'Obsolete' category. I wouldn't say 'Outdated' since at least half of the guides around here <i>are</i> outdated (old disasms). Though I wouldn't argue against such a category for those, it'd give us a reason to update the old things to a level of presentability.<br />
<br />
Anyhow, I just wanted to bring this by anyone reading before I go off making any relatively large changes. Anyone have any objections, suggestions? Anything? [[User:Clownacy|Clownacy]] 17:19, 14 April 2014 (UTC)<br />
<br />
:I did not read the descriptions on the Sonic 1 categories when placing the Knuckles guide, I merely saw that it wasn't a design choice, so I figured it ought to go under extending the game. Perhaps if the "Design Choices & Features" category was split into two like Sonic 1, it would make more sense. [[User:MainMemory|MainMemory]] 17:24, 14 April 2014 (UTC)<br />
<br />
==Homing Attack Guide==<br />
Hey, could somebody please write a homing attack/jump-dash guide for Sonic 1? That would be awesome! [[User:RetroUser|RetroUser]] 20:40, 24 April 2014 (UTC)<br />
:Certain people would rather such a guide not exist, as they feel that it would be "too easy". I personally don't feel that way, but I only do Sonic 2. [[User:MainMemory|MainMemory]] 20:45, 24 April 2014 (UTC)<br />
<br />
::Ok then, Sonic 2 would be fine. [[User:RetroUser|RetroUser]] 21:06, 24 April 2014 (UTC)<br />
<br />
:Oh, and if a homing attack guide gets written for Sonic 2, it can go under the new "Adding features" category I added. [[User:RetroUser|RetroUser]] 23:12, 25 April 2014 (UTC)<br />
<br />
:Since when did we make guides on command? I may just be full of pride, but that feels rude. Besides, haven't you looked around? This 'homing attack code' business has been a touchy subject for ages, and many like you have asked this same question many times before, though they've mostly gotten the same answer. It says something, that you haven't noticed, something ''bad''. Also, you missed the Music Index expansion guide under ''Extending the game'', you haven't removed the mention of features from the ''Design Choices & Features'' header, there are numerous ''Adding features''-type guides that you haven't moved from ''Design Choices & Features'', and you haven't changed the S2Howtos Template. If this is how you edit a wiki page, I'd hate to see how you edit code. No wonder you need a guide! But these guides aren't here to tell you how to do everything. Many, myself included, used and see these as an introduction. It's where you begin, with adding a basic move, enhancing a certain feature. Not where you reach the peak of Sonic hacking, where you program an alien ability that requires greater knowledge of the Sonic Engine's object system, physics, object status, collision handling, and even 68K Assembly itself! You can't condense that into a guide; instead, it must come from experience, lots of it. The only guide that the homing attack can possibly find itself in is a copy-and-paste guide, and that is unacceptable. [[User:Clownacy|Clownacy]] 03:47, 27 April 2014 (UTC)<br />
<br />
::Okay, I wasn't demanding that a guide be written, I was simply asking about it and stating that it was a new feature and could go there if it ever did get written, which now isn't going to happen, I can see. I understand now what you mean about the music expansion guide, but the fact that you have to provide your own music was on my mind. [[User:RetroUser|RetroUser]] 15:55, 27 April 2014 (UTC)<br />
<br />
:::If I can say anything, I meant nothing malicious by removing your category, it's nice to see someone making changes around here, but as I was following up on my changes mentioned in the above 'Categorization' section, I had a very difficult time distinguishing feature from alternate design choice. For example, the Air Speed Cap Removal guide, was it a feature that you could exceed a certain speed whilst airborne, or was it changing the design choice of having it limited? One of the few reasons I thought for the ''Expansion''-worthy guide going under ''Sound Features'' was that this was the case with the Sonic 1 guide, though looking at it now, there's a sound driver bugfix in the Bugfix category, and not in the ''Sound Features'' one. Since the drivers are the same thing, only in different games, I'm thinking of adding a separate group, solely for the 68K sound driver. It'd get very messy having a Sonic 2 variant of every guide for the S1 sound driver thanks to the Clone Driver, and only worsened when I begin adding more guides for the thing. [[User:Clownacy|Clownacy]] 15:41, 28 April 2014 (UTC)<br />
<br />
::::Alright, I guess I wouldn't have many objections (if any) for a section solely on the driver, as things wouldn't have to be spread out as much, and there would be less debate about where a guide for it would go. Also, I'd like to thank you for stating that you meant no harm when removing my category, and I'd like to say that I was only trying to make things easier by adding new sections. I didn't mean to have things so messed up, and I'll try to be more careful in the future. [[User:RetroUser|RetroUser]] 00:29, 29 April 2014 (UTC)<br />
<br />
==Clone Driver 2.1.2 Setup Guide==<br />
<br />
Clownancy,<br />
<br />
Ok, so I've downloaded and checked out the Sonic 2 Clone Driver 2.1.2, and I find it to be awesome, but is there a setup tutorial out there, or are you working on that? [[User:RetroUser|RetroUser]] 23:46, 9 May 2014 (UTC)<br />
<br />
:That's being asked here? There's one right on the thread's first post, right underneath the download. At some point, I plan to edit [[SCHG_How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|this guide]] to support it. Right now, I don't really want to. I'll probably have to have the page's name changed and completely rewrite it... Actually, I think I'll just move it to the proposed 'Obsolete' category and make a brand new page. Speaking of obsolete, I'm surprised no one's noticed that the Enigma Credits guide is broken: The download links are external, and the host has long since deleted the files. Flamewing's S2 Special Stage DPLC guide appears to be broken also, but in a different way, in that I can't get it to work, though that could just be me. It's been a while since I last tried, and that was before I got familiar with DPLCs and mappings, so I'll give it another shot. Don't know what to do with the Enigma Credits, I can't find a mirror to the files, which leaves it a dead guide. Wait a minute... Clown-nancy?! [[User:Clownacy|Clownacy]] 18:05, 11 May 2014 (UTC)<br />
<br />
::Whoops! Guess I saw the name incorrectly...sorry =/ [[User:RetroUser|RetroUser]] 23:45, 11 May 2014 (UTC)<br />
<br />
:::It's Clown + Lunacy, pronounced "Cloonacy". Think "Clown" pronounced with a strong accent (Scottish?). A recent message from a Clone Driver V2 (I need to find a way to abbreviate this thing) user gave me an idea to make the Driver update-friendly, the guide will also contain a 'how to update' section. Going back for a minute, by "setup" you meant "installation", right? How are you signing your posts, anyway? The wiki doesn't seem to like it, I have to keep fixing it. [[User:Clownacy|Clownacy]] 08:15, 12 May 2014 (UTC)<br />
<br />
::::Okay, my signature should be fixed, but before now, I would click on the "Treat signature as wikitext (without an automatic link)" box and use html code or whatever to color it and give it a font (think FrozenNitrogen). What do you mean by the wiki not liking it, though? Would it just show weird code? Also, as for the guide, yes, I mean installation, however, when I went to the topic to download the driver, I didn't remember seeing the guide, so I just had to ask that question without checking it again. [[User:RetroUser|RetroUser]] 19:32, 12 May 2014 (UTC)<br />
<br />
:::::Look at the history, "Retro" is highlighted blue, and probably links to something. So, yeah, weird code. Whatever you did this time, it worked, safe for the out-of-place hyphen. [[User:Clownacy|Clownacy]] 20:26, 12 May 2014 (UTC)<br />
<br />
::::::Umm, the "Retro" wasn't highlighted blue, I used html code to give it that color; the whole name links to my *missing* user page because I set it to do that. Now, the "User" I colored gray to give my signature something of a <strike>cheese factor</strike> unique style by having two colors. For example, Frozen Nitrogen's unique signature is like this: [[Frozen Nitrogen|<span style="color:steelblue">'''Frozen'''</span> <span style="color:springgreen">'''Nitrogen'''</span>]]. [[User:RetroUser|RetroUser]] 17:01, 13 May 2014 (UTC)<br />
<br />
== Dynamic Music in Sonic 2 ==<br />
<br />
Umm, does anybody here know about having dynamic music in Sonic 2? I've been trying to do it myself, but I can't seem to get the code to work. This is especially painful now that I've installed the Clone Driver 2.1.2 and have support for MUCH more music. So, Clownacy, if/when you put up a wiki guide on how to install this driver, could you add a section on this? I'm not saying that you have to, and it's fine if you feel that this code shouldn't be in a guide; I'm just putting up a request. And who knows? Maybe I'll end up getting the code to work by myself. Still, it would be nice to see how things are done the real way. =P -- [[User:RetroUser|RetroUser]] 18:03, 24 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=User:ManicRemix&diff=208713User:ManicRemix2014-05-23T22:36:38Z<p>RetroUser: "http://info.esonicretro.com/Main"? What? Okay, I changed that link to "http://info.sonicretro.org". If anybody has a better link, then feel free to change it.</p>
<hr />
<div>ManicRemix is a User of "[http://www.mariokartwii.com Mario Kart Wii]", and of [http://info.sonicretro.org Sonic Retro].<br />
<br />
=Mario Kart Wii Custom Tracks= <br />
<br />
My two current custom tracks are:<br />
DS Rainbow Road, and, Super Mario Sunshine Delfino Plaza. I love to hack Mario kart, very much.<br />
Here are two custom race tracks I am making:<br />
Mario Kart DS Rainbow Road, and<br />
Super Mario Sunshine Delfino Plaza<br />
<br />
=My Story= <br />
I will keep it short:<br />
<br />
I first joined this site, lurking. I was looking up if it was possible to play as Amy Rose In Sonic The Hedgehog, and I found it.<br />
I then observed how the site worked since 2009, and then I joined.<br />
<br />
=A Little About Me=<br />
Let's see, I'm:<br />
Very good at hacking old 3D games, like Super Mario 64.<br />
I'm very good at hacking Mario Kart Wii.<br />
And I'm just a trainee in sonic hacking, and I will love to learn how it all works.<br />
<br />
[[Category:User pages|{{PAGENAME}}]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_Crackers/Technical_information&diff=208616Sonic Crackers/Technical information2014-05-21T20:59:35Z<p>RetroUser: </p>
<hr />
<div>This is the '''[[Sonic Community Hacking Guide]] for ''[[Sonic Crackers]]'''''. This guide was originally written by [[User:Hivebrain|Hivebrain]], and is used here with permission. The original guide can be found [http://sonicology.fateback.com/hacks/crackers/index.html here].<br />
<br />
== ROM Contents ==<br />
{| class=prettytable<br />
! Offset||Purpose<br />
|-<br />
| $0<br />
| Header<br />
|-<br />
| $200<br />
| Code<br />
|-<br />
| $1E14<br />
| Collision array<br />
|-<br />
| $3E14<br />
| Curve and resistance mapping<br />
|-<br />
| $3F14<br />
| Code<br />
|-<br />
| $3F2A<br />
| Something affecting Sonic's movement<br />
|-<br />
| $44C4<br />
| Palette (1) - unknown<br />
|-<br />
| $44E4<br />
| Code<br />
|-<br />
| $4684<br />
| Palettes (4) - unknown<br />
|-<br />
| $4704<br />
| Code<br />
|-<br />
| $6F62<br />
| Palettes (2) - Sega logo<br />
|-<br />
| $6FA2<br />
| {{olive|Crackers Compressed Art}} - Sega logo<br />
|-<br />
| $7348<br />
| Code<br />
|-<br />
| $749C<br />
| Palettes (2) - main menu<br />
|-<br />
| $74DC<br />
| Code - title and menu screens<br />
|-<br />
| $75DA<br />
| {{blue|Nemesis Compressed Art}} - alphabet from main menu screens<br />
|-<br />
| $78E8<br />
| Mappings - title screen<br />
|-<br />
| $7E08<br />
| Code - field levels<br />
|-<br />
| $7E98<br />
| Palettes (2) - Sonic & Tails; arms & rings<br />
|-<br />
| $7ED8<br />
| Code - field levels<br />
|-<br />
| $835C<br />
| Palette - Rainbow Field cycling<br />
|-<br />
| $837C<br />
| Code<br />
|-<br />
| $83EA<br />
| Palette - Electric Field cycling<br />
|-<br />
| $856A<br />
| Code<br />
|-<br />
| $8572<br />
| Palette - Electric Field cycling<br />
|-<br />
| $85D4<br />
| Code<br />
|-<br />
| $8988<br />
| Palettes (2) - Sonic & Tails on field levels<br />
|-<br />
| $89C8<br />
| Code<br />
|-<br />
| $8D08<br />
| Palettes (8) - Techno Tower Zone<br />
|-<br />
| $8E08<br />
| Code<br />
|-<br />
| $90B6<br />
| {{blue|Nemesis Compressed Art}} - borders from menu screens<br />
|-<br />
| $90EA<br />
| Mappings - "SELECT" menu screens<br />
|-<br />
| $93CA<br />
| Code<br />
|-<br />
| $9C68<br />
| Palettes (2) - Speed Slider Zone<br />
|-<br />
| $9CA8<br />
| Code<br />
|-<br />
| $9CF0<br />
| Palettes (2) - Techno Tower Zone (unused)<br />
|-<br />
| $9D30<br />
| Code<br />
|-<br />
| $EDE4<br />
| Palette - TTZ cycling<br />
|-<br />
| $EE0C<br />
| Code<br />
|-<br />
| $EE4C<br />
| Palette - TTZ cycling<br />
|-<br />
| $EE5C<br />
| Code<br />
|-<br />
| $EEBA<br />
| Palette - TTZ cycling<br />
|-<br />
| $EEDA<br />
| Code<br />
|-<br />
| $EF38<br />
| Palette - TTZ cycling<br />
|-<br />
| $EF58<br />
| Code<br />
|-<br />
| $EFA4<br />
| Palette - TTZ cycling<br />
|-<br />
| $EFD4<br />
| Code<br />
|-<br />
| $FDB0<br />
| Music data<br />
|-<br />
| $15630<br />
| Unknown<br />
|-<br />
| $30000<br />
| {{red|Uncompressed Art}} - Numbers and letters from the HUD<br />
|-<br />
| $30E80<br />
| {{blue|Nemesis Compressed Art}} - Orbs / fireballs or something (no pointer points to this item)<br />
|-<br />
| $30EE2<br />
| {{blue|Nemesis Compressed Art}} - SSZ 8x8 tiles<br />
|-<br />
| $3452C<br />
| {{green|Enigma Compressed Data}} - SSZ 16x16 tiles<br />
|-<br />
| $35762<br />
| {{green|Enigma Compressed Data}} - SSZ 128x128 tiles<br />
|-<br />
| $39086<br />
| {{green|Enigma Compressed Data}} - SSZ level layout<br />
|-<br />
| $3931E<br />
| SSZ primary collision index<br />
|-<br />
| $3971E<br />
| SSZ secondary collision index<br />
|-<br />
| $39B1E<br />
| {{blue|Nemesis Compressed Art}} - SSZ 8x8 bg tiles<br />
|-<br />
| $3A5FE<br />
| {{green|Enigma Compressed Data}} - SSZ 16x16 bg tiles<br />
|-<br />
| $3A6E8<br />
| {{green|Enigma Compressed Data}} - SSZ 128x128 bg tiles<br />
|-<br />
| $3A7B8<br />
| {{green|Enigma Compressed Data}} - SSZ bg layout<br />
|-<br />
| $3A7CE<br />
| {{blue|Nemesis Compressed Art}} - TTZ 8x8 tiles<br />
|-<br />
| $3BB24<br />
| {{green|Enigma Compressed Data}} - TTZ 16x16 tiles<br />
|-<br />
| $3C60A<br />
| {{green|Enigma Compressed Data}} - TTZ 128x128 tiles<br />
|-<br />
| $3ED12<br />
| {{green|Enigma Compressed Data}} - TTZ level layout<br />
|-<br />
| $3EEC4<br />
| TTZ primary collision index<br />
|-<br />
| $3F2C4<br />
| TTZ secondary collision index<br />
|-<br />
| $3F6C4<br />
| {{blue|Nemesis Compressed Art}} - TTZ 8x8 bg tiles<br />
|-<br />
| $409E2<br />
| {{green|Enigma Compressed Data}} - TTZ 16x16 bg tiles<br />
|-<br />
| $4108C<br />
| {{green|Enigma Compressed Data}} - TTZ 128x128 bg tiles<br />
|-<br />
| $4183E<br />
| {{green|Enigma Compressed Data}} - TTZ bg layout<br />
|-<br />
| $41954<br />
| {{red|Uncompressed Art}} - splash screen<br />
|-<br />
| $41B9C<br />
| {{blue|Nemesis Compressed Art}} - springs<br />
|-<br />
| $41F76<br />
| {{blue|Nemesis Compressed Art}} - horizontal spikes<br />
|-<br />
| $4221E<br />
| {{blue|Nemesis Compressed Art}} - vertical spikes<br />
|-<br />
| $42486<br />
| {{red|Uncompressed Art}} - animated patterns in TTZ<br />
|-<br />
| $44946<br />
| {{red|Uncompressed Art}} - "COMBI" (unused)<br />
|-<br />
| $44A66<br />
| {{red|Uncompressed Art}} - end-of-level splash screen? (unused)<br />
|-<br />
| $44F66<br />
| {{red|Uncompressed Art}} - numbers<br />
|-<br />
| $451E6<br />
| {{red|Uncompressed Art}} - exclaimation mark and minute symbol<br />
|-<br />
| $45246<br />
| {{red|Uncompressed Art}} - stars and rings (some unused)<br />
|-<br />
| $45906<br />
| {{red|Uncompressed Art}} - seconds symbol<br />
|-<br />
| $45926<br />
| Palettes (2) - Rainbow Field<br />
|-<br />
| $4596C<br />
| {{olive|Crackers Compressed Art}} - 8x8 tiles for Rainbow Field (Entry 00)<br />
|-<br />
| $4732E<br />
| {{olive|Crackers Compressed Art}} - 8x8 tiles for Rainbow Field (Entry 01)<br />
|-<br />
| $48FEA<br />
| Mappings - Rainbow Field foreground (Entry 00)<br />
|-<br />
| $497F2<br />
| Mappings - Rainbow Field foreground (Entry 01)<br />
|-<br />
| $49FFA<br />
| Mappings - Rainbow Field foreground (Entry 02)<br />
|-<br />
| $4A802<br />
| Mappings - Rainbow Field foreground (Entry 03)<br />
|-<br />
| $4B00C<br />
| Mappings - Rainbow Field background (Entry 00)<br />
|-<br />
| $4B814<br />
| Mappings - Rainbow Field background (Entry 01)<br />
|-<br />
| $4C014<br />
| Palettes (2) - Electric Field<br />
|-<br />
| $4C05A<br />
| {{olive|Crackers Compressed Art}} - 8x8 tiles for Electric Field (Entry 00)<br />
|-<br />
| $4F3D8<br />
| {{olive|Crackers Compressed Art}} - 8x8 tiles for Electric Field (Entry 01)<br />
|-<br />
| $51094<br />
| Mappings - Electric Field foreground (Entry 00)<br />
|-<br />
| $5189C<br />
| Mappings - Electric Field foreground (Entry 01)<br />
|-<br />
| $520A4<br />
| Mappings - Electric Field foreground (Entry 02)<br />
|-<br />
| $528AC<br />
| Mappings - Electric Field foreground (Entry 03)<br />
|-<br />
| $530B6<br />
| Mappings - Electric Field background (Entry 00)<br />
|-<br />
| $5373E<br />
| Mappings - Electric Field background (Entry 01)<br />
|-<br />
| $53DC6<br />
| Mappings - Electric Field background (Entry 02)<br />
|-<br />
| $54460<br />
| Empty<br />
|-<br />
| $60000<br />
| {{red|Uncompressed Art}} - Sonic's arms<br />
|-<br />
| $64000<br />
| {{red|Uncompressed Art}} - Tails' arms<br />
|-<br />
| $66680<br />
| Index system for frames used for Sonic's arm<br />
|-<br />
| $667D8<br />
| Pattern load cues - Sonic's arm<br />
|-<br />
| $66B34<br />
| Mappings - Sonic's arm<br />
|-<br />
| $66D5C<br />
| Something to do with how Sonic's arm is connected to Sonic<br />
|-<br />
| $66E26<br />
| Index system for frames used for Sonic<br />
|-<br />
| $66F92<br />
| Pattern load cues - Sonic<br />
|-<br />
| $67302<br />
| Mappings - Sonic<br />
|-<br />
| $6777C<br />
| Index system for frames used for Tails' arm<br />
|-<br />
| $6788C<br />
| Pattern load cues - Tails' arm<br />
|-<br />
| $67B34<br />
| Mappings - Tails' arm<br />
|-<br />
| $67CD2<br />
| Something to do with how Tails' arm is connected to Tails<br />
|-<br />
| $67DD2<br />
| Index system for frames used for Tails<br />
|-<br />
| $67FBE<br />
| Pattern load cues - Tails<br />
|-<br />
| $6852C<br />
| Mappings - Tails<br />
|-<br />
| $68A06<br />
| Code<br />
|-<br />
| $68A42<br />
| Index system for frames used for Sonic on field levels<br />
|-<br />
| $68ABA<br />
| Pattern load cues - Sonic on field levels<br />
|-<br />
| $68BE6<br />
| Mappings - Sonic on field levels<br />
|-<br />
| $68CFA<br />
| Code<br />
|-<br />
| $68D36<br />
| Index system for frames used for Tails on field levels<br />
|-<br />
| $68DC6<br />
| Pattern load cues - Tails on field levels<br />
|-<br />
| $68EF2<br />
| Mappings - Tails on field levels<br />
|-<br />
| $68FD6<br />
| Empty<br />
|-<br />
| $80000<br />
| {{red|Uncompressed Art}} - Sonic<br />
|-<br />
| $90000<br />
| {{red|Uncompressed Art}} - Sonic on field levels<br />
|-<br />
| $98000<br />
| {{red|Uncompressed Art}} - Text<br />
|-<br />
| $A0000<br />
| {{red|Uncompressed Art}} - Tails<br />
|-<br />
| $B0000<br />
| {{red|Uncompressed Art}} - Tails on field levels<br />
|-<br />
| $B3820<br />
| Empty or unused data until end of ROM<br />
|}<br />
<br />
== Savestate Contents (Speed Slider Zone) ==<br />
{| class=prettytable<br />
! Offset||Purpose<br />
|-<br />
| $2478<br />
| Unknown<br />
|-<br />
| $2678<br />
| Collision Data<br />
|-<br />
| $2E78<br />
| Unknown<br />
|-<br />
| $3180<br />
| 16x16 Tile Mappings<br />
|-<br />
| $4938<br />
| 128x128 Tile Mappings<br />
|-<br />
| $BC38<br />
| Level Layout<br />
|-<br />
| $C238<br />
| 16x16 Background Tile Mappings<br />
|-<br />
| $C4F8<br />
| 128x128 Background Tile Mappings<br />
|-<br />
| $C878<br />
| Background Layout<br />
|-<br />
| $F85C<br />
| Palettes<br />
|}<br />
<br />
== Savestate Contents (Techno Tower Zone) ==<br />
{| class=prettytable<br />
! Offset||Purpose<br />
|-<br />
| $2478<br />
| Unknown<br />
|-<br />
| $2678<br />
| Collision Data<br />
|-<br />
| $2E78<br />
| Unknown<br />
|-<br />
| $3180<br />
| 16x16 Tile Mappings<br />
|-<br />
| $3FD0<br />
| 128x128 Tile Mappings<br />
|-<br />
| $9B50<br />
| Level Layout<br />
|-<br />
| $9D50<br />
| 16x16 Background Tile Mappings<br />
|-<br />
| $A748<br />
| 128x128 Background Tile Mappings<br />
|-<br />
| $B748<br />
| Background Layout<br />
|-<br />
| $F85C<br />
| Palettes<br />
|}<br />
<br />
== Mappings for Title Screen, Menu and Field Levels ==<br />
Each image on the game select screen is made up of 8x8 pixel tiles. The way these tiles are arranged is called [[Plane mappings|mappings]]. Each 8x8 tile is given a two-byte value based on where it appears in the VRAM:<br />
<br />
[[Image:Sonic_Crackers_vram.png]]<br />
<br />
Starting at 0000, so that on the title screen 0003 is a hash symbol (#). To change which palette the tile uses, add 2000 to its value.<br />
<br />
== Pattern Load Cues for Sonic and Tails ==<br />
Pattern load cues tell the game which graphics are to be loaded into the VRAM from the ROM for each frame of Sonic's and Tails' sprite. Each load cue consists of ten bytes<br />
<br />
{| class="prettytable"<br />
| width="50" align="center" | {{green|'''S2S1'''}}<br />
| width="50" align="center" | {{blue|'''97L3'''}}<br />
| width="50" align="center" | {{red|'''L2L1'''}}<br />
| width="50" align="center" | {{purple|'''DDDD'''}}<br />
| width="50" align="center" | '''FFFF'''<br />
|}<br />
<br />
{{green|'''S2S1'''}} = DMA Size<br />
<br />
*This is the number of bytes of the art to transfer to V-Ram, the size (number of bytes) is divided by 2 and then the bytes are swapped.<br />
*For example '''0280''' (Size), divided by 2 is '''0140''', and then swapped to '''4001'''. (This will be unpacked to 93'''40'''94'''10''' ready for DMA).<br />
<br />
{{blue|'''97L3'''}} and {{red|'''L2L1'''}} = DMA Location (Source)<br />
<br />
*This is the source address (where the art is being transfered from), it is divided by 2 and then broken into 4 bytes '''L4L3L2L1''', L4 is ignored completely as you cannot have an address that extends that far on the MC68 (it'll mask it), '''L3''' is put with '''97''' (DMA register), while '''L2''' is put with '''L1'''.<br />
*For example '''00018040''' (Source Location), divided by 2 is '''0000C020''', the far 00 is ignored '''00C020''', and '''97''' is put on the end '''9700C020'''. (This will all be unpacked to 97'''00'''96'''C0'''95'''20''' ready for DMA).<br />
<br />
{{purple|'''DDDD'''}} = DMA Destination<br />
<br />
*This is the destination address (where the art is being transfered to in V-Ram), although this is simply aligned (or arranged) to the VDP port format, there is hard coded data at the rom offset address '''0000CA2C''', the data there is "added" to the destination address before it's aligned correctly, those hard coded locations can allow you to send ALL art data to another address in V-Ram without having to change all of the PLC entries.<br />
*This data will be unpacked like so; '''D380''', add hard coded address '''0420''' = '''D7A0''', the data is now a long-word in size with the destination on the left word '''D7A00000''', the two most significant bits are sent to the far right '''17A00003''', add (or) the VDP address mode bits '''57A00003''', add (or) the DMA mode bit '''57A00083''', it is then sent to VDP for processing.<br />
<br />
'''FFFF''' = End of list flag<br />
<br />
*If it is a non-zero value (i.e. not 0000), then it is the end of the list, if not, it'll continue to the next entry.<br />
<br />
'''V-Ram "add" address at 0000CA2C'''<br />
<br />
*The format for the V-Ram "add" data held at offset '''0000CA2C''' consists of 10 bytes, each word (two bytes) is a V-Ram add address for each "character" in game, there can be a total of 8 characters, the first word being the first character, the last word being the eighth character (The reason the word "character" has been used here, is because Sonic and Tails can switch character slots in game in real time, so they are not hard coded to a particular slot).<br />
<br />
== Mappings for Sonic and Tails ==<br />
Mappings define how the 8x8 tiles are arranged to make up the characters' sprites. Each mappings block consists of six bytes:<br />
<br />
{| class="prettytable"<br />
| width="60" align="center" | {{green|'''SS'''}} YY<br />
| width="60" align="center" | {{red|'''TT TT'''}}<br />
| width="60" align="center" | XX {{blue|'''ZZ'''}}<br />
|}<br />
<br />
{{green|'''SS'''}} = Size and shape of the piece of sprite, where: <br />
*00 = 1 tile high, 1 tile wide <br />
*01 = 2 tiles high, 1 tile wide <br />
*02 = 3 tiles high, 1 tile wide <br />
*03 = 4 tiles high, 1 tile wide <br />
*04 = 1 tile high, 2 tiles wide <br />
*0E = 3 tiles high, 4 tiles wide <br />
*0F = 4 tiles high, 4 tiles wide (this is the largest possible sprite piece) <br />
<br />
YY and XX = Position of the sprite piece. <br />
<br />
{{red|'''TTTT'''}} = Which tiles from the VRAM are to be displayed on the screen. 0000 is the first tile in the VRAM, 0001 is the second etc. <br />
<br />
{{blue|'''ZZ'''}} = Defines whether there are additional pieces of sprite in the current frame of animation or not. 00 tells the game to assume the next mappings block is part of the same sprite frame. FF tells the game to end the current sprite frame and start a new one.<br />
<br />
<br />
{{SCHGuides}}<br />
[[Category:Sonic Community Hacking Guide]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Guide&diff=208393SCHG How-to Talk:Guide2014-05-19T14:31:57Z<p>RetroUser: Hmm, this seems better.</p>
<hr />
<div>==Categorization==<br />
After familiarising myself with the 'guide categories', I question why the entries under Sonic 2's Miscellaneous are there, as, to me, they appear to fall under Design Choices.<br />
<br />
To be more specific, what makes them 'miscellaneous'? What makes them 'not Design Choice changes'? Why else would you change, say, the Special Stage ring requirements? It's not to fix a bug, and it isn't to allow for custom content, nor would it not have an immediate effect, as the description under S1's Extend category header. It even seems similar to <i>Enable/Disable Tails in Certain Levels</i> in that regard: why change that? They're for the same reasons, customisation of the original game, or for custom Zones/Special Stages.<br />
<br />
Actually, it seems that many guides are in the wrong place. <i>Port Knuckles</i>, for example:<br />
<br />
<i>"<b>Extending the game</b><br />
<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content."</i><br />
<br />
UMM...<br />
<br />
Also, what of outdated guides? I have a plan for a superior version of <i>Expand the music index from $94 to $9F</i> and <i>Expand the music index to start at $00 instead of $80</i> that takes no cues from these guides. I don't want to just orphan the guides, and I can't credit their authors in mine since they had no hand whatsoever in it.<br />
<br />
So the only logical solution I can think of is creating a separate 'Obsolete' category. I wouldn't say 'Outdated' since at least half of the guides around here <i>are</i> outdated (old disasms). Though I wouldn't argue against such a category for those, it'd give us a reason to update the old things to a level of presentability.<br />
<br />
Anyhow, I just wanted to bring this by anyone reading before I go off making any relatively large changes. Anyone have any objections, suggestions? Anything? [[User:Clownacy|Clownacy]] 17:19, 14 April 2014 (UTC)<br />
<br />
:I did not read the descriptions on the Sonic 1 categories when placing the Knuckles guide, I merely saw that it wasn't a design choice, so I figured it ought to go under extending the game. Perhaps if the "Design Choices & Features" category was split into two like Sonic 1, it would make more sense. [[User:MainMemory|MainMemory]] 17:24, 14 April 2014 (UTC)<br />
<br />
==Homing Attack Guide==<br />
Hey, could somebody please write a homing attack/jump-dash guide for Sonic 1? That would be awesome! [[User:RetroUser|RetroUser]] 20:40, 24 April 2014 (UTC)<br />
:Certain people would rather such a guide not exist, as they feel that it would be "too easy". I personally don't feel that way, but I only do Sonic 2. [[User:MainMemory|MainMemory]] 20:45, 24 April 2014 (UTC)<br />
<br />
::Ok then, Sonic 2 would be fine. [[User:RetroUser|RetroUser]] 21:06, 24 April 2014 (UTC)<br />
<br />
:Oh, and if a homing attack guide gets written for Sonic 2, it can go under the new "Adding features" category I added. [[User:RetroUser|RetroUser]] 23:12, 25 April 2014 (UTC)<br />
<br />
:Since when did we make guides on command? I may just be full of pride, but that feels rude. Besides, haven't you looked around? This 'homing attack code' business has been a touchy subject for ages, and many like you have asked this same question many times before, though they've mostly gotten the same answer. It says something, that you haven't noticed, something ''bad''. Also, you missed the Music Index expansion guide under ''Extending the game'', you haven't removed the mention of features from the ''Design Choices & Features'' header, there are numerous ''Adding features''-type guides that you haven't moved from ''Design Choices & Features'', and you haven't changed the S2Howtos Template. If this is how you edit a wiki page, I'd hate to see how you edit code. No wonder you need a guide! But these guides aren't here to tell you how to do everything. Many, myself included, used and see these as an introduction. It's where you begin, with adding a basic move, enhancing a certain feature. Not where you reach the peak of Sonic hacking, where you program an alien ability that requires greater knowledge of the Sonic Engine's object system, physics, object status, collision handling, and even 68K Assembly itself! You can't condense that into a guide; instead, it must come from experience, lots of it. The only guide that the homing attack can possibly find itself in is a copy-and-paste guide, and that is unacceptable. [[User:Clownacy|Clownacy]] 03:47, 27 April 2014 (UTC)<br />
<br />
::Okay, I wasn't demanding that a guide be written, I was simply asking about it and stating that it was a new feature and could go there if it ever did get written, which now isn't going to happen, I can see. I understand now what you mean about the music expansion guide, but the fact that you have to provide your own music was on my mind. [[User:RetroUser|RetroUser]] 15:55, 27 April 2014 (UTC)<br />
<br />
:::If I can say anything, I meant nothing malicious by removing your category, it's nice to see someone making changes around here, but as I was following up on my changes mentioned in the above 'Categorization' section, I had a very difficult time distinguishing feature from alternate design choice. For example, the Air Speed Cap Removal guide, was it a feature that you could exceed a certain speed whilst airborne, or was it changing the design choice of having it limited? One of the few reasons I thought for the ''Expansion''-worthy guide going under ''Sound Features'' was that this was the case with the Sonic 1 guide, though looking at it now, there's a sound driver bugfix in the Bugfix category, and not in the ''Sound Features'' one. Since the drivers are the same thing, only in different games, I'm thinking of adding a separate group, solely for the 68K sound driver. It'd get very messy having a Sonic 2 variant of every guide for the S1 sound driver thanks to the Clone Driver, and only worsened when I begin adding more guides for the thing. [[User:Clownacy|Clownacy]] 15:41, 28 April 2014 (UTC)<br />
<br />
::::Alright, I guess I wouldn't have many objections (if any) for a section solely on the driver, as things wouldn't have to be spread out as much, and there would be less debate about where a guide for it would go. Also, I'd like to thank you for stating that you meant no harm when removing my category, and I'd like to say that I was only trying to make things easier by adding new sections. I didn't mean to have things so messed up, and I'll try to be more careful in the future. [[User:RetroUser|RetroUser]] 00:29, 29 April 2014 (UTC)<br />
<br />
==Clone Driver 2.1.2 Setup Guide==<br />
<br />
Clownancy,<br />
<br />
Ok, so I've downloaded and checked out the Sonic 2 Clone Driver 2.1.2, and I find it to be awesome, but is there a setup tutorial out there, or are you working on that? [[User:RetroUser|RetroUser]] 23:46, 9 May 2014 (UTC)<br />
<br />
:That's being asked here? There's one right on the thread's first post, right underneath the download. At some point, I plan to edit [[SCHG_How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|this guide]] to support it. Right now, I don't really want to. I'll probably have to have the page's name changed and completely rewrite it... Actually, I think I'll just move it to the proposed 'Obsolete' category and make a brand new page. Speaking of obsolete, I'm surprised no one's noticed that the Enigma Credits guide is broken: The download links are external, and the host has long since deleted the files. Flamewing's S2 Special Stage DPLC guide appears to be broken also, but in a different way, in that I can't get it to work, though that could just be me. It's been a while since I last tried, and that was before I got familiar with DPLCs and mappings, so I'll give it another shot. Don't know what to do with the Enigma Credits, I can't find a mirror to the files, which leaves it a dead guide. Wait a minute... Clown-nancy?! [[User:Clownacy|Clownacy]] 18:05, 11 May 2014 (UTC)<br />
<br />
::Whoops! Guess I saw the name incorrectly...sorry =/ [[User:RetroUser|RetroUser]] 23:45, 11 May 2014 (UTC)<br />
<br />
:::It's Clown + Lunacy, pronounced "Cloonacy". Think "Clown" pronounced with a strong accent (Scottish?). A recent message from a Clone Driver V2 (I need to find a way to abbreviate this thing) user gave me an idea to make the Driver update-friendly, the guide will also contain a 'how to update' section. Going back for a minute, by "setup" you meant "installation", right? How are you signing your posts, anyway? The wiki doesn't seem to like it, I have to keep fixing it. [[User:Clownacy|Clownacy]] 08:15, 12 May 2014 (UTC)<br />
<br />
::::Okay, my signature should be fixed, but before now, I would click on the "Treat signature as wikitext (without an automatic link)" box and use html code or whatever to color it and give it a font (think FrozenNitrogen). What do you mean by the wiki not liking it, though? Would it just show weird code? Also, as for the guide, yes, I mean installation, however, when I went to the topic to download the driver, I didn't remember seeing the guide, so I just had to ask that question without checking it again. [[User:RetroUser|RetroUser]] 19:32, 12 May 2014 (UTC)<br />
<br />
:::::Look at the history, "Retro" is highlighted blue, and probably links to something. So, yeah, weird code. Whatever you did this time, it worked, safe for the out-of-place hyphen. [[User:Clownacy|Clownacy]] 20:26, 12 May 2014 (UTC)<br />
<br />
::::::Umm, the "Retro" wasn't highlighted blue, I used html code to give it that color; the whole name links to my *missing* user page because I set it to do that. Now, the "User" I colored gray to give my signature something of a <strike>cheese factor</strike> unique style by having two colors. For example, Frozen Nitrogen's unique signature is like this: [[Frozen Nitrogen|<span style="color:steelblue">'''Frozen'''</span> <span style="color:springgreen">'''Nitrogen'''</span>]]. [[User:RetroUser|RetroUser]] 17:01, 13 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to:Port_the_REV01_Background_Effects&diff=208389SCHG How-to:Port the REV01 Background Effects2014-05-17T18:58:45Z<p>RetroUser: </p>
<hr />
<div>{{GuideBy|jman2050}}<br />
<br />
Looking at the REV01 version of ''[[Sonic 1]]'', I can see why it's Rev01. They pretty much completely overhauled the entire BG deformation part of the engine. The drawing system has been changed (and from what I've seen, more similar to the way ''[[Sonic 2]]'' does things) and the deformation data for every level has been changed to fit this new code. Also, in every level besides SBZ2, it was used to enhance the deformation effects. To see the difference in your own ''Sonic 1'' ROM hack, you'll have to do the following...<br />
<br />
==Steps==<br />
===Step 1===<br />
First, we'll do the easiest change. Go to label Obj0A_WobbleData in [[User:Hivebrain|Hivebrain]]'s 2005 disassembly and replace the entire block with this:<br />
<asm>Obj0A_WobbleData:<br />
dc.b 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2<br />
dc.b 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3<br />
dc.b 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2<br />
dc.b 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, -1<br />
dc.b -1, -1, -1, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3<br />
dc.b -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4<br />
dc.b -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4<br />
dc.b -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2<br />
dc.b -2, -2, -2, -2, -1, -1, -1, -1, -1<br />
dc.b 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2<br />
dc.b 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3<br />
dc.b 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2<br />
dc.b 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, -1<br />
dc.b -1, -1, -1, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3<br />
dc.b -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4<br />
dc.b -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4<br />
dc.b -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2<br />
dc.b -2, -2, -2, -2, -1, -1, -1, -1, -1</asm><br />
<br />
The programmers extended this array so it would also be usable by the deformation data even though it was designed to be used by the water bubbles.<br />
<br />
===Step 2===<br />
Next, we'll do the BGScroll data. Go to BGScroll_GHZ in the disassembly. Replace everything from there until the end of BGScroll_End with the following:<br />
<asm>BgScroll_GHZ: ; XREF: BgScroll_Index<br />
clr.l ($FFFFF708).w<br />
clr.l ($FFFFF70C).w<br />
clr.l ($FFFFF714).w<br />
clr.l ($FFFFF71C).w<br />
lea ($FFFFA800).w,a2<br />
clr.l (a2)+<br />
clr.l (a2)+<br />
clr.l (a2)+<br />
rts <br />
; ===========================================================================<br />
<br />
BgScroll_LZ: ; XREF: BgScroll_Index<br />
asr.l #1,d0<br />
move.w d0,($FFFFF70C).w<br />
rts <br />
; ===========================================================================<br />
<br />
BgScroll_MZ: ; XREF: BgScroll_Index<br />
rts <br />
; ===========================================================================<br />
<br />
BgScroll_SLZ: ; XREF: BgScroll_Index<br />
asr.l #1,d0<br />
addi.w #$C0,d0<br />
move.w d0,($FFFFF70C).w<br />
clr.l ($FFFFF708).w<br />
rts <br />
; ===========================================================================<br />
<br />
BgScroll_SYZ: ; XREF: BgScroll_Index<br />
asl.l #4,d0<br />
move.l d0,d2<br />
asl.l #1,d0<br />
add.l d2,d0<br />
asr.l #8,d0<br />
addq.w #1,d0<br />
move.w d0,($FFFFF70C).w<br />
clr.l ($FFFFF708).w<br />
rts <br />
; ===========================================================================<br />
<br />
BgScroll_SBZ: ; XREF: BgScroll_Index<br />
andi.w #$7F8,d0<br />
asr.w #3,d0<br />
addq.w #1,d0<br />
move.w d0,($FFFFF70C).w<br />
rts <br />
; ===========================================================================<br />
<br />
BgScroll_End: ; XREF: BgScroll_Index<br />
move.w ($FFFFF700).w,d0<br />
asr.w #1,d0<br />
move.w d0,($FFFFF708).w<br />
move.w d0,($FFFFF710).w<br />
asr.w #2,d0<br />
move.w d0,d1<br />
add.w d0,d0<br />
add.w d1,d0<br />
move.w d0,($FFFFF718).w<br />
clr.l ($FFFFF70C).w<br />
clr.l ($FFFFF714).w<br />
clr.l ($FFFFF71C).w<br />
lea ($FFFFA800).w,a2<br />
clr.l (a2)+<br />
clr.l (a2)+<br />
clr.l (a2)+<br />
rts </asm><br />
<br />
The starting deformation data for every stage needed to be changed. To be precise, it prevents bugs that occur in the scrolling in SBZ and SYZ, and prevents a bug that causes GHZ's bg not to appear at all.<br />
<br />
===Step 3===<br />
Next, we'll do the deformation data itself. Go to Deform_GHZ, and replace everything from there until the end of Deform_SBZ, straight down (right before ScrollHoriz) with the following:<br />
<asm>Deform_GHZ:<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #5,d4<br />
move.l d4,d1<br />
asl.l #1,d4<br />
add.l d1,d4<br />
moveq #0,d6<br />
bsr.w ScrollBlock6<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #7,d4<br />
moveq #0,d6<br />
bsr.w ScrollBlock5<br />
lea ($FFFFCC00).w,a1<br />
move.w ($FFFFF704).w,d0<br />
andi.w #$7FF,d0<br />
lsr.w #5,d0<br />
neg.w d0<br />
addi.w #$20,d0 ; ' '<br />
bpl.s Deform_GHZ_1<br />
moveq #0,d0<br />
<br />
Deform_GHZ_1: ; XREF: Deform_GHZ<br />
move.w d0,d4<br />
move.w d0,($FFFFF618).w<br />
move.w ($FFFFF700).w,d0<br />
cmpi.b #4,($FFFFF600).w<br />
bne.s Deform_GHZ_2<br />
moveq #0,d0<br />
<br />
Deform_GHZ_2: ; XREF: Deform_GHZ<br />
neg.w d0<br />
swap d0<br />
lea ($FFFFA800).w,a2<br />
addi.l #$10000,(a2)+<br />
addi.l #$C000,(a2)+<br />
addi.l #$8000,(a2)+<br />
move.w ($FFFFA800).w,d0<br />
add.w ($FFFFF718).w,d0<br />
neg.w d0<br />
move.w #$1F,d1<br />
sub.w d4,d1<br />
bcs.s Deform_GHZ_4<br />
<br />
Deform_GHZ_3: ; XREF: Deform_GHZ<br />
move.l d0,(a1)+<br />
dbf d1,Deform_GHZ_3<br />
<br />
Deform_GHZ_4: ; XREF: Deform_GHZ<br />
move.w ($FFFFA804).w,d0<br />
add.w ($FFFFF718).w,d0<br />
neg.w d0<br />
move.w #$F,d1<br />
<br />
Deform_GHZ_5: ; XREF: Deform_GHZ<br />
move.l d0,(a1)+<br />
dbf d1,Deform_GHZ_5<br />
move.w ($FFFFA808).w,d0<br />
add.w ($FFFFF718).w,d0<br />
neg.w d0<br />
move.w #$F,d1<br />
<br />
Deform_GHZ_6: ; XREF: Deform_GHZ<br />
move.l d0,(a1)+<br />
dbf d1,Deform_GHZ_6<br />
move.w #$2F,d1 ; '/'<br />
move.w ($FFFFF718).w,d0<br />
neg.w d0<br />
<br />
Deform_GHZ_7: ; XREF: Deform_GHZ<br />
move.l d0,(a1)+<br />
dbf d1,Deform_GHZ_7<br />
move.w #$27,d1 ; '''<br />
move.w ($FFFFF710).w,d0<br />
neg.w d0<br />
<br />
Deform_GHZ_8: ; XREF: Deform_GHZ<br />
move.l d0,(a1)+<br />
dbf d1,Deform_GHZ_8<br />
move.w ($FFFFF710).w,d0<br />
move.w ($FFFFF700).w,d2<br />
sub.w d0,d2<br />
ext.l d2<br />
asl.l #8,d2<br />
divs.w #$68,d2 ; 'h'<br />
ext.l d2<br />
asl.l #8,d2<br />
moveq #0,d3<br />
move.w d0,d3<br />
move.w #$47,d1 ; 'G'<br />
add.w d4,d1<br />
<br />
Deform_GHZ_9: ; XREF: Deform_GHZ<br />
move.w d3,d0<br />
neg.w d0<br />
move.l d0,(a1)+<br />
swap d3<br />
add.l d2,d3<br />
swap d3<br />
dbf d1,Deform_GHZ_9<br />
rts <br />
; End of function Deform_GHZ<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Deform_LZ:<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #7,d4<br />
move.w ($FFFFF73C).w,d5<br />
ext.l d5<br />
asl.l #7,d5<br />
bsr.w ScrollBlock1<br />
move.w ($FFFFF70C).w,($FFFFF618).w<br />
lea (LZ_Wave_Data).l,a3<br />
lea (Obj0A_WobbleData).l,a2<br />
move.b ($FFFFF7D8).w,d2<br />
move.b d2,d3<br />
addi.w #$80,($FFFFF7D8).w ; '€'<br />
add.w ($FFFFF70C).w,d2<br />
andi.w #$FF,d2<br />
add.w ($FFFFF704).w,d3<br />
andi.w #$FF,d3<br />
lea ($FFFFCC00).w,a1<br />
move.w #$DF,d1 ; 'ß'<br />
move.w ($FFFFF700).w,d0<br />
neg.w d0<br />
move.w d0,d6<br />
swap d0<br />
move.w ($FFFFF708).w,d0<br />
neg.w d0<br />
move.w ($FFFFF646).w,d4<br />
move.w ($FFFFF704).w,d5<br />
<br />
Deform_LZ_1: ; XREF: Deform_LZ<br />
cmp.w d4,d5<br />
bge.s Deform_LZ_2<br />
move.l d0,(a1)+<br />
addq.w #1,d5<br />
addq.b #1,d2<br />
addq.b #1,d3<br />
dbf d1,Deform_LZ_1<br />
rts <br />
; ===========================================================================<br />
<br />
Deform_LZ_2: ; XREF: Deform_LZ<br />
move.b (a3,d3.w),d4<br />
ext.w d4<br />
add.w d6,d4<br />
move.w d4,(a1)+<br />
move.b (a2,d2.w),d4<br />
ext.w d4<br />
add.w d0,d4<br />
move.w d4,(a1)+<br />
addq.b #1,d2<br />
addq.b #1,d3<br />
dbf d1,Deform_LZ_2<br />
rts <br />
; End of function Deform_LZ<br />
<br />
; ===========================================================================<br />
LZ_Wave_Data: dc.b 1, 1, 2, 2, 3, 3, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b $FF,$FF,$FE,$FE,$FD,$FD,$FD,$FD,$FE,$FE,$FF,$FF, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 1, 1, 2, 2, 3, 3, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Deform_MZ:<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #6,d4<br />
move.l d4,d1<br />
asl.l #1,d4<br />
add.l d1,d4<br />
moveq #2,d6<br />
bsr.w ScrollBlock4<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #6,d4<br />
moveq #6,d6<br />
bsr.w ScrollBlock6<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #7,d4<br />
moveq #4,d6<br />
bsr.w ScrollBlock5<br />
move.w #$200,d0<br />
move.w ($FFFFF704).w,d1<br />
subi.w #$1C8,d1<br />
bcs.s Deform_MZ_1<br />
move.w d1,d2<br />
add.w d1,d1<br />
add.w d2,d1<br />
asr.w #2,d1<br />
add.w d1,d0<br />
<br />
Deform_MZ_1: ; XREF: Deform_MZ<br />
move.w d0,($FFFFF714).w<br />
move.w d0,($FFFFF71C).w<br />
bsr.w ScrollBlock3<br />
move.w ($FFFFF70C).w,($FFFFF618).w<br />
move.b ($FFFFF756).w,d0<br />
or.b ($FFFFF758).w,d0<br />
or.b d0,($FFFFF75A).w<br />
clr.b ($FFFFF756).w<br />
clr.b ($FFFFF758).w<br />
lea ($FFFFA800).w,a1<br />
move.w ($FFFFF700).w,d2<br />
neg.w d2<br />
move.w d2,d0<br />
asr.w #2,d0<br />
sub.w d2,d0<br />
ext.l d0<br />
asl.l #3,d0<br />
divs.w #5,d0<br />
ext.l d0<br />
asl.l #4,d0<br />
asl.l #8,d0<br />
moveq #0,d3<br />
move.w d2,d3<br />
asr.w #1,d3<br />
move.w #4,d1<br />
<br />
Deform_MZ_2: ; XREF: Deform_MZ<br />
move.w d3,(a1)+<br />
swap d3<br />
add.l d0,d3<br />
swap d3<br />
dbf d1,Deform_MZ_2<br />
move.w ($FFFFF718).w,d0<br />
neg.w d0<br />
move.w #1,d1<br />
<br />
Deform_MZ_3: ; XREF: Deform_MZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_MZ_3<br />
move.w ($FFFFF710).w,d0<br />
neg.w d0<br />
move.w #8,d1<br />
<br />
Deform_MZ_4: ; XREF: Deform_MZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_MZ_4<br />
move.w ($FFFFF708).w,d0<br />
neg.w d0<br />
move.w #$F,d1<br />
<br />
Deform_MZ_5: ; XREF: Deform_MZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_MZ_5<br />
lea ($FFFFA800).w,a2<br />
move.w ($FFFFF70C).w,d0<br />
subi.w #$200,d0<br />
move.w d0,d2<br />
cmpi.w #$100,d0<br />
bcs.s Deform_MZ_6<br />
move.w #$100,d0<br />
<br />
Deform_MZ_6: ; XREF: Deform_MZ<br />
andi.w #$1F0,d0<br />
lsr.w #3,d0<br />
lea (a2,d0.w),a2<br />
bra.w Deform_All<br />
; ===========================================================================<br />
<br />
Deform_SLZ:<br />
move.w ($FFFFF73C).w,d5<br />
ext.l d5<br />
asl.l #7,d5<br />
bsr.w ScrollBlock2<br />
move.w ($FFFFF70C).w,($FFFFF618).w<br />
lea ($FFFFA800).w,a1<br />
move.w ($FFFFF700).w,d2<br />
neg.w d2<br />
move.w d2,d0<br />
asr.w #3,d0<br />
sub.w d2,d0<br />
ext.l d0<br />
asl.l #4,d0<br />
divs.w #$1C,d0<br />
ext.l d0<br />
asl.l #4,d0<br />
asl.l #8,d0<br />
moveq #0,d3<br />
move.w d2,d3<br />
move.w #$1B,d1<br />
<br />
Deform_SLZ_1: ; XREF: Deform_MZ<br />
move.w d3,(a1)+<br />
swap d3<br />
add.l d0,d3<br />
swap d3<br />
dbf d1,Deform_SLZ_1<br />
move.w d2,d0<br />
asr.w #3,d0<br />
move.w d0,d1<br />
asr.w #1,d1<br />
add.w d1,d0<br />
move.w #4,d1<br />
<br />
Deform_SLZ_2: ; XREF: Deform_MZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_SLZ_2<br />
move.w d2,d0<br />
asr.w #2,d0<br />
move.w #4,d1<br />
<br />
Deform_SLZ_3: ; XREF: Deform_MZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_SLZ_3<br />
move.w d2,d0<br />
asr.w #1,d0<br />
move.w #$1D,d1<br />
<br />
Deform_SLZ_4: ; XREF: Deform_MZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_SLZ_4<br />
lea ($FFFFA800).w,a2<br />
move.w ($FFFFF70C).w,d0<br />
move.w d0,d2<br />
subi.w #$C0,d0 ; 'À'<br />
andi.w #$3F0,d0<br />
lsr.w #3,d0<br />
lea (a2,d0.w),a2<br />
<br />
Deform_All: ; XREF: Deform_MZ, Deform_SYZ, ...<br />
lea ($FFFFCC00).w,a1<br />
move.w #$E,d1<br />
move.w ($FFFFF700).w,d0<br />
neg.w d0<br />
swap d0<br />
andi.w #$F,d2<br />
add.w d2,d2<br />
move.w (a2)+,d0<br />
jmp Deform_All_2(pc,d2.w)<br />
; End of function Deform_MZ<br />
<br />
; ===========================================================================<br />
<br />
Deform_All_1: ; XREF: Deform_All<br />
move.w (a2)+,d0<br />
<br />
Deform_All_2:<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
move.l d0,(a1)+<br />
dbf d1,Deform_All_1<br />
rts <br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Deform_SYZ:<br />
move.w ($FFFFF73C).w,d5<br />
ext.l d5<br />
asl.l #4,d5<br />
move.l d5,d1<br />
asl.l #1,d5<br />
add.l d1,d5<br />
bsr.w ScrollBlock2<br />
move.w ($FFFFF70C).w,($FFFFF618).w<br />
lea ($FFFFA800).w,a1<br />
move.w ($FFFFF700).w,d2<br />
neg.w d2<br />
move.w d2,d0<br />
asr.w #3,d0<br />
sub.w d2,d0<br />
ext.l d0<br />
asl.l #3,d0<br />
divs.w #8,d0<br />
ext.l d0<br />
asl.l #4,d0<br />
asl.l #8,d0<br />
moveq #0,d3<br />
move.w d2,d3<br />
asr.w #1,d3<br />
move.w #7,d1<br />
<br />
Deform_SYZ_1: ; XREF: Deform_SYZ<br />
move.w d3,(a1)+<br />
swap d3<br />
add.l d0,d3<br />
swap d3<br />
dbf d1,Deform_SYZ_1<br />
move.w d2,d0<br />
asr.w #3,d0<br />
move.w #4,d1<br />
<br />
Deform_SYZ_2: ; XREF: Deform_SYZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_SYZ_2<br />
move.w d2,d0<br />
asr.w #2,d0<br />
move.w #5,d1<br />
<br />
Deform_SYZ_3: ; XREF: Deform_SYZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_SYZ_3<br />
move.w d2,d0<br />
move.w d2,d1<br />
asr.w #1,d1<br />
sub.w d1,d0<br />
ext.l d0<br />
asl.l #4,d0<br />
divs.w #$E,d0<br />
ext.l d0<br />
asl.l #4,d0<br />
asl.l #8,d0<br />
moveq #0,d3<br />
move.w d2,d3<br />
asr.w #1,d3<br />
move.w #$D,d1<br />
<br />
Deform_SYZ_4: ; XREF: Deform_SYZ<br />
move.w d3,(a1)+<br />
swap d3<br />
add.l d0,d3<br />
swap d3<br />
dbf d1,Deform_SYZ_4<br />
lea ($FFFFA800).w,a2<br />
move.w ($FFFFF70C).w,d0<br />
move.w d0,d2<br />
andi.w #$1F0,d0<br />
lsr.w #3,d0<br />
lea (a2,d0.w),a2<br />
bra.w Deform_All<br />
; End of function Deform_SYZ<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Deform_SBZ:<br />
tst.b ($FFFFFE11).w<br />
bne.w Deform_SBZ_Act2<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #7,d4<br />
moveq #2,d6<br />
bsr.w ScrollBlock4<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #6,d4<br />
moveq #6,d6<br />
bsr.w ScrollBlock6<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #5,d4<br />
move.l d4,d1<br />
asl.l #1,d4<br />
add.l d1,d4<br />
moveq #4,d6<br />
bsr.w ScrollBlock5<br />
moveq #0,d4<br />
move.w ($FFFFF73C).w,d5<br />
ext.l d5<br />
asl.l #5,d5<br />
bsr.w ScrollBlock1_2<br />
move.w ($FFFFF70C).w,d0<br />
move.w d0,($FFFFF714).w<br />
move.w d0,($FFFFF71C).w<br />
move.w d0,($FFFFF618).w<br />
move.b ($FFFFF756).w,d0<br />
or.b ($FFFFF75A).w,d0<br />
or.b d0,($FFFFF758).w<br />
clr.b ($FFFFF756).w<br />
clr.b ($FFFFF75A).w<br />
lea ($FFFFA800).w,a1<br />
move.w ($FFFFF700).w,d2<br />
neg.w d2<br />
asr.w #2,d2<br />
move.w d2,d0<br />
asr.w #1,d0<br />
sub.w d2,d0<br />
ext.l d0<br />
asl.l #3,d0<br />
divs.w #4,d0<br />
ext.l d0<br />
asl.l #4,d0<br />
asl.l #8,d0<br />
moveq #0,d3<br />
move.w d2,d3<br />
move.w #3,d1<br />
<br />
Deform_SBZ_1: ; XREF: Deform_SBZ<br />
move.w d3,(a1)+<br />
swap d3<br />
add.l d0,d3<br />
swap d3<br />
dbf d1,Deform_SBZ_1<br />
move.w ($FFFFF718).w,d0<br />
neg.w d0<br />
move.w #9,d1<br />
<br />
Deform_SBZ_2: ; XREF: Deform_SBZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_SBZ_2<br />
move.w ($FFFFF710).w,d0<br />
neg.w d0<br />
move.w #6,d1<br />
<br />
Deform_SBZ_3: ; XREF: Deform_SBZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_SBZ_3<br />
move.w ($FFFFF708).w,d0<br />
neg.w d0<br />
move.w #$A,d1<br />
<br />
Deform_SBZ_4: ; XREF: Deform_SBZ<br />
move.w d0,(a1)+<br />
dbf d1,Deform_SBZ_4<br />
lea ($FFFFA800).w,a2<br />
move.w ($FFFFF70C).w,d0<br />
move.w d0,d2<br />
andi.w #$1F0,d0<br />
lsr.w #3,d0<br />
lea (a2,d0.w),a2<br />
bra.w Deform_All<br />
; ===========================================================================<br />
<br />
Deform_SBZ_Act2: ; XREF: Deform_SBZ<br />
move.w ($FFFFF73A).w,d4<br />
ext.l d4<br />
asl.l #6,d4<br />
move.w ($FFFFF73C).w,d5<br />
ext.l d5<br />
asl.l #5,d5<br />
bsr.w ScrollBlock1<br />
move.w ($FFFFF70C).w,($FFFFF618).w<br />
lea ($FFFFCC00).w,a1<br />
move.w #$DF,d1 ; 'ß'<br />
move.w ($FFFFF700).w,d0<br />
neg.w d0<br />
swap d0<br />
move.w ($FFFFF708).w,d0<br />
neg.w d0<br />
<br />
Deform_SBZ_Act2_1: ; XREF: Deform_SBZ<br />
move.l d0,(a1)+<br />
dbf d1,Deform_SBZ_Act2_1<br />
rts <br />
; End of function Deform_SBZ</asm><br />
<br />
===Step 4===<br />
The new Bg drawing system required a different method of scrolling the BGs themselves. Go to ScrollBlock1 and replace everything from there until the end of ScrollBlock4 with the following:<br />
<asm>ScrollBlock1: ; XREF: Deform_LZ, Deform_SBZ<br />
move.l ($FFFFF708).w,d2<br />
move.l d2,d0<br />
add.l d4,d0<br />
move.l d0,($FFFFF708).w<br />
move.l d0,d1<br />
swap d1<br />
andi.w #$10,d1<br />
move.b ($FFFFF74C).w,d3<br />
eor.b d3,d1<br />
bne.s ScrollBlock1_2<br />
eori.b #$10,($FFFFF74C).w<br />
sub.l d2,d0<br />
bpl.s ScrollBlock1_1<br />
bset #2,($FFFFF756).w<br />
bra.s ScrollBlock1_2<br />
; ===========================================================================<br />
<br />
ScrollBlock1_1: ; XREF: ScrollBlock1<br />
bset #3,($FFFFF756).w<br />
<br />
ScrollBlock1_2: ; XREF: ScrollBlock1, Deform_SBZ, ...<br />
move.l ($FFFFF70C).w,d3<br />
move.l d3,d0<br />
add.l d5,d0<br />
move.l d0,($FFFFF70C).w<br />
move.l d0,d1<br />
swap d1<br />
andi.w #$10,d1<br />
move.b ($FFFFF74D).w,d2<br />
eor.b d2,d1<br />
bne.s ScrollBlock1_End<br />
eori.b #$10,($FFFFF74D).w<br />
sub.l d3,d0<br />
bpl.s ScrollBlock1_3<br />
bset #0,($FFFFF756).w<br />
rts <br />
; ===========================================================================<br />
<br />
ScrollBlock1_3: ; XREF: ScrollBlock1<br />
bset #1,($FFFFF756).w<br />
<br />
ScrollBlock1_End: ; XREF: ScrollBlock1<br />
rts <br />
; End of function ScrollBlock1<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
ScrollBlock2: ; XREF: Deform_MZ, Deform_SYZ<br />
move.l ($FFFFF70C).w,d3<br />
move.l d3,d0<br />
add.l d5,d0<br />
move.l d0,($FFFFF70C).w<br />
move.l d0,d1<br />
swap d1<br />
andi.w #$10,d1<br />
move.b ($FFFFF74D).w,d2<br />
eor.b d2,d1<br />
bne.s ScrollBlock2_End<br />
eori.b #$10,($FFFFF74D).w<br />
sub.l d3,d0<br />
bpl.s ScrollBlock2_1<br />
bset #4,($FFFFF756).w<br />
rts <br />
; ===========================================================================<br />
<br />
ScrollBlock2_1: ; XREF: ScrollBlock2<br />
bset #5,($FFFFF756).w<br />
<br />
ScrollBlock2_End: ; XREF: ScrollBlock2<br />
rts <br />
; End of function ScrollBlock2<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
ScrollBlock3: ; XREF: Deform_MZ<br />
move.w ($FFFFF70C).w,d3<br />
move.w d0,($FFFFF70C).w<br />
move.w d0,d1<br />
andi.w #$10,d1<br />
move.b ($FFFFF74D).w,d2<br />
eor.b d2,d1<br />
bne.s ScrollBlock3_End<br />
eori.b #$10,($FFFFF74D).w<br />
sub.w d3,d0<br />
bpl.s ScrollBlock3_1<br />
bset #0,($FFFFF756).w<br />
rts <br />
; ===========================================================================<br />
<br />
ScrollBlock3_1: ; XREF: ScrollBlock3<br />
bset #1,($FFFFF756).w<br />
<br />
ScrollBlock3_End: ; XREF: ScrollBlock3<br />
rts <br />
; End of function ScrollBlock3<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
ScrollBlock4: ; XREF: Deform_MZ, Deform_SBZ<br />
move.l ($FFFFF708).w,d2<br />
move.l d2,d0<br />
add.l d4,d0<br />
move.l d0,($FFFFF708).w<br />
move.l d0,d1<br />
swap d1<br />
andi.w #$10,d1<br />
move.b ($FFFFF74C).w,d3<br />
eor.b d3,d1<br />
bne.s ScrollBlock4_End<br />
eori.b #$10,($FFFFF74C).w<br />
sub.l d2,d0<br />
bpl.s ScrollBlock4_1<br />
bset d6,($FFFFF756).w<br />
bra.s ScrollBlock4_End<br />
; ===========================================================================<br />
<br />
ScrollBlock4_1: ; XREF: ScrollBlock4<br />
addq.b #1,d6<br />
bset d6,($FFFFF756).w<br />
<br />
ScrollBlock4_End: ; XREF: ScrollBlock4<br />
rts <br />
; End of function ScrollBlock4<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
ScrollBlock5: ; XREF: Deform_GHZ, Deform_MZ, ...<br />
move.l ($FFFFF710).w,d2<br />
move.l d2,d0<br />
add.l d4,d0<br />
move.l d0,($FFFFF710).w<br />
move.l d0,d1<br />
swap d1<br />
andi.w #$10,d1<br />
move.b ($FFFFF74E).w,d3<br />
eor.b d3,d1<br />
bne.s ScrollBlock5_End<br />
eori.b #$10,($FFFFF74E).w<br />
sub.l d2,d0<br />
bpl.s ScrollBlock5_1<br />
bset d6,($FFFFF758).w<br />
bra.s ScrollBlock5_End<br />
; ===========================================================================<br />
<br />
ScrollBlock5_1: ; XREF: ScrollBlock5<br />
addq.b #1,d6<br />
bset d6,($FFFFF758).w<br />
<br />
ScrollBlock5_End: ; XREF: ScrollBlock5<br />
rts <br />
; End of function ScrollBlock5<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
ScrollBlock6: ; XREF: Deform_GHZ, Deform_MZ, ...<br />
move.l ($FFFFF718).w,d2<br />
move.l d2,d0<br />
add.l d4,d0<br />
move.l d0,($FFFFF718).w<br />
move.l d0,d1<br />
swap d1<br />
andi.w #$10,d1<br />
move.b ($FFFFF750).w,d3<br />
eor.b d3,d1<br />
bne.s ScrollBlock6_End<br />
eori.b #$10,($FFFFF750).w<br />
sub.l d2,d0<br />
bpl.s ScrollBlock6_1<br />
bset d6,($FFFFF75A).w<br />
bra.s ScrollBlock6_End<br />
; ===========================================================================<br />
<br />
ScrollBlock6_1: ; XREF: ScrollBlock6<br />
addq.b #1,d6<br />
bset d6,($FFFFF75A).w<br />
<br />
ScrollBlock6_End: ; XREF: ScrollBlock6<br />
rts <br />
; End of function ScrollBlock6</asm><br />
<br />
Don't worry that there are six BGScroll functions now, that's taken cared of.<br />
<br />
===Step 5===<br />
Finally, the biggest part: the BG drawing code. Go to sub_6886 and replace everything from there until the end of LoadTilesFromStart2 (that's a VERY long way, up until MainLoadBlockLoad) with the following:<br />
<asm>sub_6886: <br />
lea ($C00004).l,a5<br />
lea ($C00000).l,a6<br />
lea ($FFFFF756).w,a2<br />
lea ($FFFFF708).w,a3<br />
lea ($FFFFA440).w,a4<br />
move.w #$6000,d2<br />
bsr.w sub_6D0A<br />
lea ($FFFFF758).w,a2<br />
lea ($FFFFF710).w,a3<br />
bra.w sub_6DA6<br />
; End of function sub_6886<br />
<br />
; ---------------------------------------------------------------------------<br />
; Subroutine to display correct tiles as you move<br />
; ---------------------------------------------------------------------------<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
LoadTilesAsYouMove: ; XREF: Demo_Time<br />
lea ($C00004).l,a5<br />
lea ($C00000).l,a6<br />
lea ($FFFFFF32).w,a2<br />
lea ($FFFFFF18).w,a3<br />
lea ($FFFFA440).w,a4<br />
move.w #$6000,d2<br />
bsr.w sub_6D0A<br />
lea ($FFFFFF34).w,a2<br />
lea ($FFFFFF20).w,a3<br />
bsr.w sub_6DA6<br />
lea ($FFFFFF36).w,a2<br />
lea ($FFFFFF28).w,a3<br />
bsr.w sub_6EA4<br />
lea ($FFFFFF30).w,a2<br />
lea ($FFFFFF10).w,a3<br />
lea ($FFFFA400).w,a4<br />
move.w #$4000,d2<br />
tst.b ($FFFFF745).w<br />
beq.s Draw_FG<br />
move.b #0,($FFFFF745).w ;Reset the redraw flag<br />
moveq #-$10,d4 ;Go to top line oflevel data relative camera position<br />
moveq #$F,d6 ;<br />
<br />
Draw_All:<br />
movem.l d4-d6,-(sp) ; This whole routine basically redraws the whole<br />
moveq #-$10,d5 ; area instead of merely a line of tiles<br />
move.w d4,d1<br />
bsr.w Calc_VRAM_Pos<br />
move.w d1,d4<br />
moveq #-$10,d5<br />
bsr.w DrawTiles_LR<br />
movem.l (sp)+,d4-d6<br />
addi.w #$10,d4<br />
dbf d6,Draw_All<br />
rts <br />
<br />
Draw_FG:<br />
tst.b (a2)<br />
beq.s locret_6D08<br />
bclr #0,(a2)<br />
beq.s loc_6CBE<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
bsr.w Calc_VRAM_Pos<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
bsr.w DrawTiles_LR<br />
<br />
loc_6CBE:<br />
bclr #1,(a2)<br />
beq.s loc_6CD8<br />
move.w #$E0,d4 ; 'à'<br />
moveq #-$10,d5<br />
bsr.w Calc_VRAM_Pos<br />
move.w #$E0,d4 ; 'à'<br />
moveq #-$10,d5<br />
bsr.w DrawTiles_LR<br />
<br />
loc_6CD8:<br />
bclr #2,(a2)<br />
beq.s loc_6CEE<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
bsr.w Calc_VRAM_Pos<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
bsr.w DrawTiles_TB<br />
<br />
loc_6CEE:<br />
bclr #3,(a2)<br />
beq.s locret_6D08<br />
moveq #-$10,d4<br />
move.w #$140,d5<br />
bsr.w Calc_VRAM_Pos<br />
moveq #-$10,d4<br />
move.w #$140,d5<br />
bsr.w DrawTiles_TB<br />
<br />
locret_6D08:<br />
rts <br />
<br />
; End of function LoadTilesAsYouMove<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
sub_6D0A:<br />
tst.b (a2)<br />
beq.w locret_6DA4<br />
bclr #0,(a2)<br />
beq.s loc_6D26<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
bsr.w Calc_VRAM_Pos<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
bsr.w DrawTiles_LR<br />
<br />
loc_6D26:<br />
bclr #1,(a2)<br />
beq.s loc_6D40<br />
move.w #$E0,d4 ; 'à'<br />
moveq #-$10,d5<br />
bsr.w Calc_VRAM_Pos<br />
move.w #$E0,d4 ; 'à'<br />
moveq #-$10,d5<br />
bsr.w DrawTiles_LR<br />
<br />
loc_6D40:<br />
bclr #2,(a2)<br />
beq.s loc_6D56<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
bsr.w Calc_VRAM_Pos<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
bsr.w DrawTiles_TB<br />
<br />
loc_6D56:<br />
bclr #3,(a2)<br />
beq.s loc_6D70<br />
moveq #-$10,d4<br />
move.w #$140,d5<br />
bsr.w Calc_VRAM_Pos<br />
moveq #-$10,d4<br />
move.w #$140,d5<br />
bsr.w DrawTiles_TB<br />
<br />
loc_6D70:<br />
bclr #4,(a2)<br />
beq.s loc_6D88<br />
moveq #-$10,d4<br />
moveq #0,d5<br />
bsr.w loc_7176<br />
moveq #-$10,d4<br />
moveq #0,d5<br />
moveq #$1F,d6<br />
bsr.w DrawTiles_LR3<br />
<br />
loc_6D88:<br />
bclr #5,(a2)<br />
beq.s locret_6DA4<br />
move.w #$E0,d4 ; 'à'<br />
moveq #0,d5<br />
bsr.w loc_7176<br />
move.w #$E0,d4 ; 'à'<br />
moveq #0,d5<br />
moveq #$1F,d6<br />
bsr.w DrawTiles_LR3<br />
<br />
locret_6DA4:<br />
rts <br />
; End of function sub_6D0A<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
sub_6DA6:<br />
tst.b (a2)<br />
beq.w locret_6DF2<br />
cmpi.b #5,($FFFFFE10).w<br />
beq.w loc_6E16<br />
bclr #0,(a2)<br />
beq.s loc_6DD2<br />
move.w #$70,d4 ; 'p'<br />
moveq #-$10,d5<br />
bsr.w Calc_VRAM_Pos<br />
move.w #$70,d4 ; 'p'<br />
moveq #-$10,d5<br />
moveq #2,d6<br />
bsr.w DrawTiles_TB2<br />
<br />
loc_6DD2:<br />
bclr #1,(a2)<br />
beq.s locret_6DF2<br />
move.w #$70,d4 ; 'p'<br />
move.w #$140,d5<br />
bsr.w Calc_VRAM_Pos<br />
move.w #$70,d4 ; 'p'<br />
move.w #$140,d5<br />
moveq #2,d6<br />
bsr.w DrawTiles_TB2<br />
<br />
locret_6DF2:<br />
rts <br />
; ===========================================================================<br />
unk_6DF4: dc.b 0 ; <br />
unk_6DF5: dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 0 ; <br />
; ===========================================================================<br />
<br />
loc_6E16:<br />
moveq #-$10,d4<br />
bclr #0,(a2)<br />
bne.s loc_6E28<br />
bclr #1,(a2)<br />
beq.s loc_6E72<br />
move.w #$E0,d4 ; 'à'<br />
<br />
loc_6E28:<br />
lea (unk_6DF5).l,a0<br />
move.w ($FFFFF70C).w,d0<br />
add.w d4,d0<br />
andi.w #$1F0,d0<br />
lsr.w #4,d0<br />
move.b (a0,d0.w),d0<br />
lea (unk_6FE4).l,a3<br />
movea.w (a3,d0.w),a3<br />
beq.s loc_6E5E<br />
moveq #-$10,d5<br />
movem.l d4-d5,-(sp)<br />
bsr.w Calc_VRAM_Pos<br />
movem.l (sp)+,d4-d5<br />
bsr.w DrawTiles_LR<br />
bra.s loc_6E72<br />
; ===========================================================================<br />
<br />
loc_6E5E:<br />
moveq #0,d5<br />
movem.l d4-d5,-(sp)<br />
bsr.w loc_7176<br />
movem.l (sp)+,d4-d5<br />
moveq #$1F,d6<br />
bsr.w DrawTiles_LR3<br />
<br />
loc_6E72:<br />
tst.b (a2)<br />
bne.s loc_6E78<br />
rts <br />
; ===========================================================================<br />
<br />
loc_6E78:<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
move.b (a2),d0<br />
andi.b #-$58,d0<br />
beq.s loc_6E8C<br />
lsr.b #1,d0<br />
move.b d0,(a2)<br />
move.w #$140,d5<br />
<br />
loc_6E8C:<br />
lea (unk_6DF4).l,a0<br />
move.w ($FFFFF70C).w,d0<br />
andi.w #$1F0,d0<br />
lsr.w #4,d0<br />
lea (a0,d0.w),a0<br />
bra.w loc_6FEC<br />
; End of function sub_6DA6<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
sub_6EA4:<br />
tst.b (a2)<br />
beq.w locret_6EF0<br />
cmpi.b #2,($FFFFFE10).w<br />
beq.w loc_6F54<br />
bclr #0,(a2)<br />
beq.s loc_6ED0_2<br />
move.w #$40,d4 ; '@'<br />
moveq #-$10,d5<br />
bsr.w Calc_VRAM_Pos<br />
move.w #$40,d4 ; '@'<br />
moveq #-$10,d5<br />
moveq #2,d6<br />
bsr.w DrawTiles_TB2<br />
<br />
loc_6ED0_2:<br />
bclr #1,(a2)<br />
beq.s locret_6EF0<br />
move.w #$40,d4 ; '@'<br />
move.w #$140,d5<br />
bsr.w Calc_VRAM_Pos<br />
move.w #$40,d4 ; '@'<br />
move.w #$140,d5<br />
moveq #2,d6<br />
bsr.w DrawTiles_TB2<br />
<br />
locret_6EF0:<br />
rts <br />
; ===========================================================================<br />
unk_6EF2: dc.b 0 ; <br />
unk_6EF3: dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 2 ; <br />
dc.b 0 ; <br />
; ===========================================================================<br />
<br />
loc_6F54:<br />
moveq #-$10,d4<br />
bclr #0,(a2)<br />
bne.s loc_6F66<br />
bclr #1,(a2)<br />
beq.s loc_6FAE<br />
move.w #$E0,d4 ; 'à'<br />
<br />
loc_6F66:<br />
lea (unk_6EF3).l,a0<br />
move.w ($FFFFF70C).w,d0<br />
subi.w #$200,d0<br />
add.w d4,d0<br />
andi.w #$7F0,d0<br />
lsr.w #4,d0<br />
move.b (a0,d0.w),d0<br />
movea.w unk_6FE4(pc,d0.w),a3<br />
beq.s loc_6F9A<br />
moveq #-$10,d5<br />
movem.l d4-d5,-(sp)<br />
bsr.w Calc_VRAM_Pos<br />
movem.l (sp)+,d4-d5<br />
bsr.w DrawTiles_LR<br />
bra.s loc_6FAE<br />
; ===========================================================================<br />
<br />
loc_6F9A:<br />
moveq #0,d5<br />
movem.l d4-d5,-(sp)<br />
bsr.w loc_7176<br />
movem.l (sp)+,d4-d5<br />
moveq #$1F,d6<br />
bsr.w DrawTiles_LR3<br />
<br />
loc_6FAE:<br />
tst.b (a2)<br />
bne.s loc_6FB4<br />
rts <br />
; ===========================================================================<br />
<br />
loc_6FB4:<br />
moveq #-$10,d4<br />
moveq #-$10,d5<br />
move.b (a2),d0<br />
andi.b #-$58,d0<br />
beq.s loc_6FC8<br />
lsr.b #1,d0<br />
move.b d0,(a2)<br />
move.w #$140,d5<br />
<br />
loc_6FC8:<br />
lea (unk_6EF2).l,a0<br />
move.w ($FFFFF70C).w,d0<br />
subi.w #$200,d0<br />
andi.w #$7F0,d0<br />
lsr.w #4,d0<br />
lea (a0,d0.w),a0<br />
bra.w loc_6FEC<br />
; ===========================================================================<br />
unk_6FE4: dc.b $FF ; <br />
dc.b $18 ; <br />
dc.b $FF ; <br />
dc.b $18 ; <br />
dc.b $FF ; <br />
dc.b $20 ; <br />
dc.b $FF ; <br />
dc.b $28 ; (<br />
; ===========================================================================<br />
<br />
loc_6FEC:<br />
moveq #$F,d6<br />
move.l #$800000,d7<br />
<br />
loc_6FF4:<br />
moveq #0,d0<br />
move.b (a0)+,d0<br />
btst d0,(a2)<br />
beq.s loc_701C<br />
movea.w unk_6FE4(pc,d0.w),a3<br />
movem.l d4-d5/a0,-(sp)<br />
movem.l d4-d5,-(sp)<br />
bsr.w sub_712A<br />
movem.l (sp)+,d4-d5<br />
bsr.w Calc_VRAM_Pos<br />
bsr.w sub_70AC<br />
movem.l (sp)+,d4-d5/a0<br />
<br />
loc_701C:<br />
addi.w #$10,d4<br />
dbf d6,loc_6FF4<br />
clr.b (a2)<br />
rts <br />
; End of function sub_6EA4<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
DrawTiles_LR:<br />
moveq #$15,d6<br />
; End of function DrawTiles_LR<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
DrawTiles_LR2:<br />
move.l #$800000,d7<br />
move.l d0,d1<br />
<br />
loc_7032:<br />
movem.l d4-d5,-(sp)<br />
bsr.w sub_712A<br />
move.l d1,d0<br />
bsr.w sub_70AC<br />
addq.b #4,d1<br />
andi.b #$7F,d1 ; ''<br />
movem.l (sp)+,d4-d5<br />
addi.w #$10,d5<br />
dbf d6,loc_7032<br />
rts <br />
; End of function DrawTiles_LR2<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
DrawTiles_LR3:<br />
move.l #$800000,d7<br />
move.l d0,d1<br />
<br />
loc_705C:<br />
movem.l d4-d5,-(sp)<br />
bsr.w loc_712C<br />
move.l d1,d0<br />
bsr.w sub_70AC<br />
addq.b #4,d1<br />
andi.b #$7F,d1 ; ''<br />
movem.l (sp)+,d4-d5<br />
addi.w #$10,d5<br />
dbf d6,loc_705C<br />
rts <br />
; End of function DrawTiles_LR3<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
DrawTiles_TB:<br />
moveq #$F,d6<br />
; End of function DrawTiles_TB<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
DrawTiles_TB2:<br />
move.l #$800000,d7<br />
move.l d0,d1<br />
<br />
loc_7088:<br />
movem.l d4-d5,-(sp)<br />
bsr.w sub_712A<br />
move.l d1,d0<br />
bsr.w sub_70AC<br />
addi.w #$100,d1<br />
andi.w #$FFF,d1<br />
movem.l (sp)+,d4-d5<br />
addi.w #$10,d4<br />
dbf d6,loc_7088<br />
rts <br />
; End of function DrawTiles_TB2<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
sub_70AC:<br />
or.w d2,d0<br />
swap d0<br />
btst #4,(a0)<br />
bne.s loc_70E8<br />
btst #3,(a0)<br />
bne.s loc_70C8<br />
move.l d0,(a5)<br />
move.l (a1)+,(a6)<br />
add.l d7,d0<br />
move.l d0,(a5)<br />
move.l (a1)+,(a6)<br />
rts <br />
; ===========================================================================<br />
<br />
loc_70C8:<br />
move.l d0,(a5)<br />
move.l (a1)+,d4<br />
eori.l #$8000800,d4<br />
swap d4<br />
move.l d4,(a6)<br />
add.l d7,d0<br />
move.l d0,(a5)<br />
move.l (a1)+,d4<br />
eori.l #$8000800,d4<br />
swap d4<br />
move.l d4,(a6)<br />
rts <br />
; ===========================================================================<br />
<br />
loc_70E8:<br />
btst #3,(a0)<br />
bne.s loc_710A<br />
move.l d0,(a5)<br />
move.l (a1)+,d5<br />
move.l (a1)+,d4<br />
eori.l #$10001000,d4<br />
move.l d4,(a6)<br />
add.l d7,d0<br />
move.l d0,(a5)<br />
eori.l #$10001000,d5<br />
move.l d5,(a6)<br />
rts <br />
; ===========================================================================<br />
<br />
loc_710A:<br />
move.l d0,(a5)<br />
move.l (a1)+,d5<br />
move.l (a1)+,d4<br />
eori.l #$18001800,d4<br />
swap d4<br />
move.l d4,(a6)<br />
add.l d7,d0<br />
move.l d0,(a5)<br />
eori.l #$18001800,d5<br />
swap d5<br />
move.l d5,(a6)<br />
rts <br />
; End of function sub_70AC<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
sub_712A:<br />
add.w (a3),d5<br />
<br />
loc_712C:<br />
add.w 4(a3),d4<br />
lea ($FFFFB000).w,a1<br />
move.w d4,d3<br />
lsr.w #1,d3<br />
andi.w #$380,d3<br />
lsr.w #3,d5<br />
move.w d5,d0<br />
lsr.w #5,d0<br />
andi.w #$7F,d0 ; ''<br />
add.w d3,d0<br />
moveq #-1,d3<br />
move.b (a4,d0.w),d3<br />
beq.s locret_7172<br />
subq.b #1,d3<br />
andi.w #$7F,d3 ; ''<br />
ror.w #7,d3<br />
add.w d4,d4<br />
andi.w #$1E0,d4<br />
andi.w #$1E,d5<br />
add.w d4,d3<br />
add.w d5,d3<br />
movea.l d3,a0<br />
move.w (a0),d3<br />
andi.w #$3FF,d3<br />
lsl.w #3,d3<br />
adda.w d3,a1<br />
<br />
locret_7172:<br />
rts <br />
; End of function sub_712A<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
Calc_VRAM_Pos:<br />
add.w (a3),d5<br />
<br />
loc_7176:<br />
add.w 4(a3),d4<br />
andi.w #$F0,d4 ; 'ð'<br />
andi.w #$1F0,d5<br />
lsl.w #4,d4<br />
lsr.w #2,d5<br />
add.w d5,d4<br />
moveq #3,d0<br />
swap d0<br />
move.w d4,d0<br />
rts <br />
; End of function Calc_VRAM_Pos<br />
<br />
; ===========================================================================<br />
add.w 4(a3),d4<br />
add.w (a3),d5<br />
andi.w #$F0,d4 ; 'ð'<br />
andi.w #$1F0,d5<br />
lsl.w #4,d4<br />
lsr.w #2,d5<br />
add.w d5,d4<br />
moveq #2,d0<br />
swap d0<br />
move.w d4,d0<br />
rts <br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
LoadTilesFromStart:<br />
lea ($C00004).l,a5<br />
lea ($C00000).l,a6<br />
lea ($FFFFF700).w,a3<br />
lea ($FFFFA400).w,a4<br />
move.w #$4000,d2<br />
bsr.s LoadTilesFromStart2<br />
lea ($FFFFF708).w,a3<br />
lea ($FFFFA440).w,a4<br />
move.w #$6000,d2<br />
tst.b ($FFFFFE10).w<br />
beq.w loc_7220<br />
cmpi.b #2,($FFFFFE10).w<br />
beq.w loc_725A<br />
cmpi.w #$500,($FFFFFE10).w<br />
beq.w loc_7288<br />
cmpi.b #6,($FFFFFE10).w<br />
beq.w loc_7220<br />
; End of function LoadTilesFromStart<br />
<br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
LoadTilesFromStart2:<br />
moveq #-$10,d4<br />
moveq #$F,d6<br />
<br />
loc_71FC:<br />
movem.l d4-d6,-(sp)<br />
moveq #0,d5<br />
move.w d4,d1<br />
bsr.w Calc_VRAM_Pos<br />
move.w d1,d4<br />
moveq #0,d5<br />
moveq #$1F,d6<br />
bsr.w DrawTiles_LR2<br />
movem.l (sp)+,d4-d6<br />
addi.w #$10,d4<br />
dbf d6,loc_71FC<br />
rts <br />
; End of function LoadTilesFromStart2<br />
<br />
; ===========================================================================<br />
<br />
loc_7220:<br />
moveq #0,d4<br />
moveq #$F,d6<br />
<br />
loc_7224:<br />
movem.l d4-d6,-(sp)<br />
lea (unk_724A).l,a0<br />
move.w ($FFFFF70C).w,d0<br />
add.w d4,d0<br />
andi.w #$F0,d0 ; 'ð'<br />
bsr.w sub_72BA<br />
movem.l (sp)+,d4-d6<br />
addi.w #$10,d4<br />
dbf d6,loc_7224<br />
rts <br />
; ===========================================================================<br />
unk_724A: dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 6 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 4 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
dc.b 0 ; <br />
; ===========================================================================<br />
<br />
loc_725A:<br />
moveq #-$10,d4<br />
moveq #$F,d6<br />
<br />
loc_725E:<br />
movem.l d4-d6,-(sp)<br />
lea (unk_6EF3).l,a0<br />
move.w ($FFFFF70C).w,d0<br />
subi.w #$200,d0<br />
add.w d4,d0<br />
andi.w #$7F0,d0<br />
bsr.w sub_72BA<br />
movem.l (sp)+,d4-d6<br />
addi.w #$10,d4<br />
dbf d6,loc_725E<br />
rts <br />
; ===========================================================================<br />
<br />
loc_7288:<br />
moveq #-$10,d4<br />
moveq #$F,d6<br />
<br />
loc_728C:<br />
movem.l d4-d6,-(sp)<br />
lea (unk_6DF5).l,a0<br />
move.w ($FFFFF70C).w,d0<br />
add.w d4,d0<br />
andi.w #$1F0,d0<br />
bsr.w sub_72BA<br />
movem.l (sp)+,d4-d6<br />
addi.w #$10,d4<br />
dbf d6,loc_728C<br />
rts <br />
; ===========================================================================<br />
unk_72B2: dc.b $F7 ; ÷<br />
dc.b 8 ; <br />
dc.b $F7 ; ÷<br />
dc.b 8 ; <br />
dc.b $F7 ; ÷<br />
dc.b $10 ; <br />
dc.b $F7 ; ÷<br />
dc.b $18 ; <br />
<br />
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||<br />
<br />
<br />
sub_72BA:<br />
lsr.w #4,d0<br />
move.b (a0,d0.w),d0<br />
movea.w unk_72B2(pc,d0.w),a3<br />
beq.s loc_72DA<br />
moveq #-$10,d5<br />
movem.l d4-d5,-(sp)<br />
bsr.w Calc_VRAM_Pos<br />
movem.l (sp)+,d4-d5<br />
bsr.w DrawTiles_LR<br />
bra.s locret_72EE<br />
; ===========================================================================<br />
<br />
loc_72DA:<br />
moveq #0,d5<br />
movem.l d4-d5,-(sp)<br />
bsr.w loc_7176<br />
movem.l (sp)+,d4-d5<br />
moveq #$1F,d6<br />
bsr.w DrawTiles_LR3<br />
<br />
locret_72EE:<br />
rts <br />
; End of function sub_72BA</asm><br />
<br />
===Step 6===<br />
Assuming you haven't changed the backgrounds of your levels, compile it and give it a go!<br />
<br />
==Credits==<br />
*[[User:Hivebrain|Hivebrain]] - for attempting this first<br />
*[[Tweaker]] - for his assistance when I had some issues to resolve.<br />
<br />
==Extra step==<br />
<br />
If you get errors upon compiling, you'll need to follow this extra step.<br />
===Fixing the errors===<br />
Alright, so after you've followed the main guide, you'll need to go here in your disasm:<br />
<asm>Obj89: ; XREF: Obj_Index<br />
moveq #0,d0<br />
move.b $24(a0),d0<br />
move.w Obj89_Index(pc,d0.w),d1<br />
jmp Obj89_Index(pc,d1.w)<br />
; ===========================================================================<br />
Obj89_Index: dc.w Obj89_Main-Obj89_Index<br />
dc.w Obj89_Move-Obj89_Index<br />
dc.w Obj89_GotoCredits-Obj89_Index<br />
; ===========================================================================<br />
<br />
Obj89_Main: ; XREF: Obj89_Index<br />
addq.b #2,$24(a0)<br />
move.w #-$20,8(a0) ; object starts outside the level boundary<br />
move.w #$D8,$A(a0)<br />
move.l #Map_obj89,4(a0)<br />
move.w #$5C5,2(a0)<br />
move.b #0,1(a0)<br />
move.b #0,$18(a0)<br />
<br />
Obj89_Move: ; XREF: Obj89_Index<br />
cmpi.w #$C0,8(a0) ; has object reached $C0?<br />
beq.s Obj89_Delay ; if yes, branch<br />
addi.w #$10,8(a0) ; move object to the right<br />
bra.w DisplaySprite<br />
; ===========================================================================<br />
<br />
Obj89_Delay: ; XREF: Obj89_Move<br />
addq.b #2,$24(a0)<br />
move.w #120,$30(a0) ; set duration for delay (2 seconds)<br />
<br />
Obj89_GotoCredits: ; XREF: Obj89_Index<br />
subq.w #1,$30(a0) ; subtract 1 from duration<br />
bpl.s Obj89_Display<br />
move.b #$1C,($FFFFF600).w ; exit to credits<br />
<br />
Obj89_Display:<br />
bra.w DisplaySprite</asm><br />
You should see this line occurring twice:<br />
<asm> bra.w DisplaySprite</asm><br />
This is the problem. The code you just installed for the better background effects is bigger than the original code, and those lines that I mentioned have a specific branch range. Since some code has shifted, it is now out of range, causing the error. So let's change this code to something a bit more, shall I say, pliable. So, replace those two lines with this:<br />
<asm> jmp DisplaySprite</asm><br />
That simple "jmp" command should do the trick.<br />
<br />
And that's it! The errors should be gone! (If you still get errors, leave a message on this guide's talk page explaining how it all happens and I'll try to create a fix for it.) Have fun, and enjoy the Rev01 background effects! <br />
<br />
(Oh, and you can still use this fix without following the actual guide, as it still works, and should make your life easier in case something else happens like the error I just explained above.)<br />
<br />
{{S1Howtos}}<br />
[[Category:SCHG How-tos|Port the REV01 Background Effects]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Robotnik%27s_Revenge&diff=208388Robotnik's Revenge2014-05-17T17:18:41Z<p>RetroUser: </p>
<hr />
<div>{{Hack<br />
|screen=RRTitle.png<br />
|system=[[Sega Mega Drive]]<br />
|version=1.0<br />
|originalgame=Sonic the Hedgehog 2 (16-bit)<br />
|date=September 7th, 2008<br />
|credits=[[ColinC10]]<br />
|visualmods=<br />
|audiomods=<br />
|layoutmods=yes<br />
|basicenginemods=<br />
|advenginemods=}}<br />
'''''Robotnik's Revenge''''' is a hack of ''[[Sonic the Hedgehog 2]]'' by [[ColinC10]]. It is a "boss rush" hack, in which all seventeen bosses from ''[[Sonic the Hedgehog (16-bit)|Sonic the Hedgehog]]'' and ''[[Sonic the Hedgehog 2 (16-bit)|Sonic the Hedgehog 2]]'' are fought in a somewhat arbitrary order over the course of a single level. The game takes place in [[Death Egg Zone]] from ''Sonic 2'', and is meant to imply that there is more to the ship than there is in the original game. <br />
<br />
Time spent completing the boss run is kept and the total time is given at the end of the course, along with a ranking. In Time Attack mode there are infinite lives and rings that can be found in-between battles. In survival mode, there are only 3 lives and no rings.<br />
<br />
==Downloads==<br />
{{download|file=RobotniksRevenge.rar|filesize=732KB|version=1.0}}<br />
<br />
==Screenshots==<br />
<gallery><br />
Image:RRLevel.png|[[Emerald Hill Zone]] Boss<br />
Image:RRLevel2.png|[[Green Hill Zone]] Boss<br />
Image:RRRank.png|The "Time Attack" ranking screen<br />
</gallery><br />
<br />
==External Links==<br />
{{LinkRetro|topic=11962|title=Release Thread}} on [[Sonic Retro]] forums.<br />
<br />
[[Category:Hacks]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_the_Hedgehog_(2013_game)&diff=208246Sonic the Hedgehog (2013 game)2014-05-15T20:19:11Z<p>RetroUser: </p>
<hr />
<div>{{Bob<br />
| bobscreen=Sonic1AndroidTitleScreen.png<br />
| screenwidth=320px<br />
| title=Sonic the Hedgehog<br />
| icon=Sonic 1 2013 Icon.png<br />
| publisher=[[Sega]]<br />
| developer=[[The Taxman|Christian Whitehead]], [[Headcannon]]<br />
| system=iOS, Android<br />
|releases=<br />
{{release|IOS|World|2013-05-15}}<br />
{{release|Android|World|2013-05-16}}<br />
}}<br />
The 2013 release of '''''Sonic the Hedgehog''''' is an enhanced downloadable remake of the 1991 [[Sega Mega Drive]] game ''[[Sonic the Hedgehog (16-bit)|Sonic the Hedgehog]]''. It was published by [[Sega]] for [[sega:iOS|iOS]] and [[sega:Android|Android]] devices in May 2013.<br />
<br />
This particular version of ''Sonic the Hedgehog'' was developed by Sonic Retro Tech Members [[The Taxman]] and [[Stealth]], using a proprietary game engine named the "Retro Engine" (an updated version of that seen in ''[[Sonic the Hedgehog CD (2011)|the 2011 version of ''Sonic the Hedgehog CD]]'' and fangames such as ''[[Retro Sonic Nexus]]''). It replaced the [[Sonic the Hedgehog (iPhone)|2009 iPhone release]] of the game (handled by [[sega:Backbone Entertainment|Backbone Entertainment]]), and rather than rely on emulation, is specifically tailored for the hardware, offering enhanced features and new modes of play.<br />
<br />
2013 ''Sonic 1'' features a number of enhancements such as widescreen support, online leaderboards, filters to change the way the game is displayed, and extra gameplay-related bonuses such as a [[Spin Dash]] option, and a widely enhanced [[debug mode]]. When the game is beaten once, [[Tails]] and [[Knuckles]] can be unlocked as can the Sonic and Tails combo seen in ''[[Sonic the Hedgehog 2 (16-bit)|Sonic 2]]'' and ''[[Sonic 3]]''. Using the aforementioned debug mode, along with other hidden features, you can also uncover the ability to use super characters, as well as interact with objects never seen in, or scrapped from, the original game.<br />
<br />
With the exceptions above, it is otherwise faithful to the original game. It also addresses multiple bugs, and boasts a constant framerate of sixty frames per second.<br />
<br />
==Differences==<br />
===Music===<br />
The music has been remastered for the new release, but otherwise remains completely faithful to the original game.<br />
<br />
===Zone Related===<br />
====[[Green Hill Zone]]====<br />
* Spikes on the wall and Rings in the air that can only be reached by Tails or Knuckles have been added above the Lamppost between the two S-tunnels near the end of Act 1.<br />
* The GHZ boss now sports a more realistic looking ball weapon. Until releasing said weapon, he can no longer be attacked prematurely. Also, due to the widescreen format, he moves across a slightly wider field and isn't quite as easy to defeat quickly.<br />
* The aforementioned ball can be spawned in the middle of a level. When spawned, it rolls along slopes on its own, and can be pushed by the player as well. Pushing the ball can destroy badniks, monitors, and the breakable walls. Funny enough, it can also travel through the S-tunnels. The ball is also capable of crushing you. Finally, you can stand on top of the ball and move it by walking along it. Doing so must be done carefully, as the character can easily fall off.<br />
* The scrapped Splats badnik can also be spawned, sporting 2 different variations. One will simply hop forward, not stopping to turn around for pits or anything of the sort. The other will take a couple hops one way, and switch direction.<br />
* Crumbling cliffs now sport the same mirrored sprite for both directions, instead of their own sprite. Due to shading appearances, the latter would make more sense. This can be classified as a bug.<br />
<br />
====[[Marble Zone]]====<br />
* Climbing/Flying to the top of the wall in Act 1 now reveals a hidden invincibility box. Attempting the same in Act 3 reveals a brand new path to explore, exclusive to this release.<br />
* The previously scrapped sideways spiked stompers can now be placed in the level via Debug Mode.<br />
* Finally, a UFO object can also be placed, which will create rotating UFO sprites in the background, not seen anywhere before except in beta screenshots and mockups.<br />
<br />
====[[Spring Yard Zone]]====<br />
* In Act 2, if one flies upwards just before the slope area leading to the 2 exits, another exclusive new path can be found, leading to a THIRD exit!<br />
* In Act 3, flying up above the block path leading to the boss, Tails can find a Ring Monitor. It is just below where the extra life can normally be found with Sonic in the original game.<br />
* This boss fight has been slightly modified, with two block barriers surrounding the battle arena.<br />
<br />
====[[Labyrinth Zone]]====<br />
* Using Debug Mode, the Goggles monitor can be placed in the level. It serves as a Shield, but while it will constantly protect the player, it only appears underwater.<br />
<br />
====[[Star Light Zone]]====<br />
* At the end of Act 1, the lower path to the exit now has a signpost.<br />
<br />
====[[Scrap Brain Zone]]====<br />
* In Act 3, the sprite that appears when the character falls is affected by what sprite the character has when he falls at the end of Act 2. Knuckles can appear falling from a glide, and Sonic and Tails can appear with their carrying sprites, albeit not flying together, resulting in a small bug. <br />
<br />
====[[Final Zone]]====<br />
* Instead of just appearing and standing, the character springs up out of the floor at the start.<br />
* Due to the widescreen nature of the game, you can now see a trapdoor lock as you enter the battle arena. On the opposite side where Eggman appears, the metal pod slides open, revealing the doctor, post-fight.<br />
<br />
====Special Stage====<br />
* A seventh Special Stage containing a cyan [[Chaos Emerald]] has been added, in the case of the player uncovering the hidden Level Select and selecting 7 Max Emeralds. If 7 Max Emeralds is selected, the player can turn Super after completing all Special Stages.<br />
** When 7 Max Emeralds is selected, the pink emerald changes to purple to match the modern Chaos Emerald colors.<br />
<br />
====Miscellaneous====<br />
* Sonic kicks up dust clouds when he skids, as he does in ''Sonic the Hedgehog 2'' and future games.<br />
* While Debug Mode is enabled, monitors can be used more than once.<br />
* The Level Select menu style is taken directly from Sonic 2, including newly made zone icons for the Sonic 1 zones.<br />
* Player options now include Sonic/Tails, Tails Alone, and Knuckles. Tails and Knuckles have their movesets from Sonic the Hedgehog 3, allowing them to get to areas that Sonic cannot normally access. Sonic & Tails Mode now lets Tails fly Sonic around without the need for a 2nd Player. By hitting Up and Jump when Tails is airborne, he will take off and if you jump to him he can carry you as in Sonic 3.<br />
* The Sonic 1 title screen changes depending on which character is selected.<br />
* Also found in the Level Select menu is an items option. You can choose S1, S2, S1+S3, or S2+S3. Options with S1 will result in S1 style monitors, a S1 style shield, and S1 style invincibility. Options with S2 will result in S2 style monitors, a S2 style shield, and S2 style invincibility. Options with S3 will result in blue shields being replaced entirely with Elemental Shields and Sonic gaining the Insta-Shield move.<br />
* Extra monitors can be found in Debug Mode, including the old S monitor, which grants 50 rings and an instant Super form. Also found is a switch monitor, which switches the S1 Blue Shield with the S2 Blue Shield. Another one is what looks to be a Spike Monitor of some kind. Hitting it switches the "Spike bug" from the original version of Sonic 1 on or off. Finally there is what looks to be an Emerald Monitor. It has no visible effect.<br />
<br />
==Cheat Codes==<br />
===Level Select===<br />
*Start a "No Save" game and choose a character. Once the Sega logo appears, tap the letters S-E-G-A in that order. If done correctly, a chime will sound. Then on the main screen tap and hold with two fingers. You will then be taken to the level select screen.<br />
<br />
===Debug Mode===<br />
*Play sounds 01, 09, 09, 01, 00, 06, 02, 03 in the sound test then select a level.<br />
**To enter debug mode tap in the upper left hand corner of the screen. A minus sign (-) and a plus sign (+) will appear. These can be used for navigating back and forth through the debug items. To exit the level and return to the level select screen, tap the upper right hand corner of the screen. To enter normal play again tap the upper left hand corner of the screen.<br />
<br />
===Hidden Credits===<br />
*Start a "No Save" game and choose a character. Once the Sega logo appears, tap the letters A-G-E-S in that order. If done correctly, a chime will sound and the credits will appear.<br />
<br />
<br />
==Artwork==<br />
<gallery><br />
File:Sonic1 2013 facebook.png<br />
File:Sonic1 2013 icon.png<br />
</gallery><br />
<br />
{{S1MDOmni}}<br />
{{SoniciDeviceGames}}<br />
{{SonicAndroidGames}}<br />
<br />
[[Category:iDevice games]]<br />
[[Category:Android games]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_the_Hedgehog_(2013_game)&diff=208245Sonic the Hedgehog (2013 game)2014-05-15T20:16:41Z<p>RetroUser: Linked "Christian Whitehead" to "The Taxman".</p>
<hr />
<div>{{Bob<br />
| bobscreen=Sonic1AndroidTitleScreen.png<br />
| screenwidth=320px<br />
| title=Sonic the Hedgehog<br />
| icon=Sonic 1 2013 Icon.png<br />
| publisher=[[Sega]]<br />
| developer=[[The Taxman|Christian Whitehead]], [[Headcannon]]<br />
| system=iOS, Android<br />
|releases=<br />
{{release|IOS|World|2013-05-15}}<br />
{{release|Android|World|2013-05-16}}<br />
}}<br />
The 2013 release of '''''Sonic the Hedgehog''''' is an enhanced downloadable remake of the 1991 [[Sega Mega Drive]] game ''[[Sonic the Hedgehog (16-bit)|Sonic the Hedgehog]]''. It was published by [[Sega]] for [[sega:iOS|iOS]] and [[sega:Android|Android]] devices in May 2013.<br />
<br />
This particular version of ''Sonic the Hedgehog'' was developed by Sonic Retro Tech Members [[The Taxman]] and [[Stealth]], using a proprietary game engine named the "Retro Engine" (an updated version of that seen in ''[[Sonic the Hedgehog CD (2011)|the 2011 version of ''Sonic the Hedgehog CD]]'' and fangames such as ''[[Retro Sonic Nexus]]''). It replaced the [[Sonic the Hedgehog (iPhone)|2009 iPhone release]] of the game (handled by [[sega:Backbone Entertainment|Backbone Entertainment]]), and rather than rely on emulation, is specifically tailored for the hardware, offering enhanced features and new modes of play.<br />
<br />
2013 ''Sonic 1'' features a number of enhancements such as widescreen support, online leaderboards, filters to change the way the game is displayed, and extra gameplay-related bonuses such as a [[spindash]] option, and a widely enhanced [[debug mode]]. When the game is beaten once, [[Tails]] and [[Knuckles]] can be unlocked as can the Sonic and Tails combo seen in ''[[Sonic the Hedgehog 2 (16-bit)|Sonic 2]]'' and ''[[Sonic 3]]''. Using the aforementioned debug mode, along with other hidden features, you can also uncover the ability to use super characters, as well as interact with objects never seen in, or scrapped from, the original game.<br />
<br />
With the exceptions above, it is otherwise faithful to the original game. It also addresses multiple bugs, and boasts a constant framerate of sixty frames per second.<br />
<br />
==Differences==<br />
===Music===<br />
The music has been remastered for the new release, but otherwise remains completely faithful to the original game.<br />
<br />
===Zone Related===<br />
====[[Green Hill Zone]]====<br />
* Spikes on the wall and Rings in the air that can only be reached by Tails or Knuckles have been added above the Lamppost between the two S-tunnels near the end of Act 1.<br />
* The GHZ boss now sports a more realistic looking ball weapon. Until releasing said weapon, he can no longer be attacked prematurely. Also, due to the widescreen format, he moves across a slightly wider field and isn't quite as easy to defeat quickly.<br />
* The aforementioned ball can be spawned in the middle of a level. When spawned, it rolls along slopes on its own, and can be pushed by the player as well. Pushing the ball can destroy badniks, monitors, and the breakable walls. Funny enough, it can also travel through the S-tunnels. The ball is also capable of crushing you. Finally, you can stand on top of the ball and move it by walking along it. Doing so must be done carefully, as the character can easily fall off.<br />
* The scrapped Splats badnik can also be spawned, sporting 2 different variations. One will simply hop forward, not stopping to turn around for pits or anything of the sort. The other will take a couple hops one way, and switch direction.<br />
* Crumbling cliffs now sport the same mirrored sprite for both directions, instead of their own sprite. Due to shading appearances, the latter would make more sense. This can be classified as a bug.<br />
<br />
====[[Marble Zone]]====<br />
* Climbing/Flying to the top of the wall in Act 1 now reveals a hidden invincibility box. Attempting the same in Act 3 reveals a brand new path to explore, exclusive to this release.<br />
* The previously scrapped sideways spiked stompers can now be placed in the level via Debug Mode.<br />
* Finally, a UFO object can also be placed, which will create rotating UFO sprites in the background, not seen anywhere before except in beta screenshots and mockups.<br />
<br />
====[[Spring Yard Zone]]====<br />
* In Act 2, if one flies upwards just before the slope area leading to the 2 exits, another exclusive new path can be found, leading to a THIRD exit!<br />
* In Act 3, flying up above the block path leading to the boss, Tails can find a Ring Monitor. It is just below where the extra life can normally be found with Sonic in the original game.<br />
* This boss fight has been slightly modified, with two block barriers surrounding the battle arena.<br />
<br />
====[[Labyrinth Zone]]====<br />
* Using Debug Mode, the Goggles monitor can be placed in the level. It serves as a Shield, but while it will constantly protect the player, it only appears underwater.<br />
<br />
====[[Star Light Zone]]====<br />
* At the end of Act 1, the lower path to the exit now has a signpost.<br />
<br />
====[[Scrap Brain Zone]]====<br />
* In Act 3, the sprite that appears when the character falls is affected by what sprite the character has when he falls at the end of Act 2. Knuckles can appear falling from a glide, and Sonic and Tails can appear with their carrying sprites, albeit not flying together, resulting in a small bug. <br />
<br />
====[[Final Zone]]====<br />
* Instead of just appearing and standing, the character springs up out of the floor at the start.<br />
* Due to the widescreen nature of the game, you can now see a trapdoor lock as you enter the battle arena. On the opposite side where Eggman appears, the metal pod slides open, revealing the doctor, post-fight.<br />
<br />
====Special Stage====<br />
* A seventh Special Stage containing a cyan [[Chaos Emerald]] has been added, in the case of the player uncovering the hidden Level Select and selecting 7 Max Emeralds. If 7 Max Emeralds is selected, the player can turn Super after completing all Special Stages.<br />
** When 7 Max Emeralds is selected, the pink emerald changes to purple to match the modern Chaos Emerald colors.<br />
<br />
====Miscellaneous====<br />
* Sonic kicks up dust clouds when he skids, as he does in ''Sonic the Hedgehog 2'' and future games.<br />
* While Debug Mode is enabled, monitors can be used more than once.<br />
* The Level Select menu style is taken directly from Sonic 2, including newly made zone icons for the Sonic 1 zones.<br />
* Player options now include Sonic/Tails, Tails Alone, and Knuckles. Tails and Knuckles have their movesets from Sonic the Hedgehog 3, allowing them to get to areas that Sonic cannot normally access. Sonic & Tails Mode now lets Tails fly Sonic around without the need for a 2nd Player. By hitting Up and Jump when Tails is airborne, he will take off and if you jump to him he can carry you as in Sonic 3.<br />
* The Sonic 1 title screen changes depending on which character is selected.<br />
* Also found in the Level Select menu is an items option. You can choose S1, S2, S1+S3, or S2+S3. Options with S1 will result in S1 style monitors, a S1 style shield, and S1 style invincibility. Options with S2 will result in S2 style monitors, a S2 style shield, and S2 style invincibility. Options with S3 will result in blue shields being replaced entirely with Elemental Shields and Sonic gaining the Insta-Shield move.<br />
* Extra monitors can be found in Debug Mode, including the old S monitor, which grants 50 rings and an instant Super form. Also found is a switch monitor, which switches the S1 Blue Shield with the S2 Blue Shield. Another one is what looks to be a Spike Monitor of some kind. Hitting it switches the "Spike bug" from the original version of Sonic 1 on or off. Finally there is what looks to be an Emerald Monitor. It has no visible effect.<br />
<br />
==Cheat Codes==<br />
===Level Select===<br />
*Start a "No Save" game and choose a character. Once the Sega logo appears, tap the letters S-E-G-A in that order. If done correctly, a chime will sound. Then on the main screen tap and hold with two fingers. You will then be taken to the level select screen.<br />
<br />
===Debug Mode===<br />
*Play sounds 01, 09, 09, 01, 00, 06, 02, 03 in the sound test then select a level.<br />
**To enter debug mode tap in the upper left hand corner of the screen. A minus sign (-) and a plus sign (+) will appear. These can be used for navigating back and forth through the debug items. To exit the level and return to the level select screen, tap the upper right hand corner of the screen. To enter normal play again tap the upper left hand corner of the screen.<br />
<br />
===Hidden Credits===<br />
*Start a "No Save" game and choose a character. Once the Sega logo appears, tap the letters A-G-E-S in that order. If done correctly, a chime will sound and the credits will appear.<br />
<br />
<br />
==Artwork==<br />
<gallery><br />
File:Sonic1 2013 facebook.png<br />
File:Sonic1 2013 icon.png<br />
</gallery><br />
<br />
{{S1MDOmni}}<br />
{{SoniciDeviceGames}}<br />
{{SonicAndroidGames}}<br />
<br />
[[Category:iDevice games]]<br />
[[Category:Android games]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Talk:The_S_Factor:_Sonia_and_Silver&diff=207919Talk:The S Factor: Sonia and Silver2014-05-13T21:46:42Z<p>RetroUser: /* Extra Characters */ new section</p>
<hr />
<div>- Is this hack still being continued? - True_Dude<br />
:Yes, of course! It has a thread at S2beta and was entered into the hacking contest. -[[SMTP]]<br />
<br />
<br />
-Question. Scourge the Hedgehog is also a playable character in this hack, even if Sonia and Silver are the only two main characters. Why isn't he or his gameplay style even mentioned in the article? --[[User:Klom99|Klom99]] 23:55, 4 May 2011 (UTC)<br />
<br />
== Extra Characters ==<br />
<br />
I have a question: are the extra characters (Scourge, Blaze, Sonic, Tails, Knuckles, Shadow, and Mighty) available in the current build of this hack, or are they not yet implemented? -- [[User:RetroUser|RetroUser]] 21:46, 13 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_Retro:Sonic_Retro_on_GitHub&diff=207897Sonic Retro:Sonic Retro on GitHub2014-05-13T18:19:34Z<p>RetroUser: Uh oh...another red Hivebrain link!</p>
<hr />
<div>The [[Sonic Retro]] '''GitHub''' (an idea originally proposed by [[Tweaker]]) allows members to collaborate on projects such as [[disassemblies]] and [[Sonic Hacking Utilities|programs]]. As the name suggests, it uses [http://github.org GitHub] to enable multiple members to easily work together on projects of common interest. The repositories are located at http://github.com/sonicretro, and can be accessed with a Git client or a web browser.<br />
<br />
Until January 2012 it used [[wikipedia:Subversion|Subversion]] as a version control system, but this was changed to [[wikipedia:Mercurial|Mercurial]] due to technical issues involving software used to support the repostiory (for instance, the web client would not clean up its cache).<br />
<br />
In December 2013 the projects were moved to GitHub as Mercurial was also causing problems.<br />
<br />
Note: Currently only approved users can gain push access. If you wish to contribute you must ask one of the organization owners (currently [[FraGag]], [[MainMemory]], [[andlabs]], and [[User:SeanieB|SeanieB]]). Others are free to fork the projects and may send pull requests for consideration for inclusion in the main projects.<br />
<br />
== Hosted Projects ==<br />
The repository currently hosts the following projects. Before uploading a new project, post about it in the {{LinkRetro|forum=13|title=forum}} so it can be decided whether the project merits inclusion.<br />
<br />
=== ''Knuckles in Sonic 2'' disassembly ===<br />
[[Puto]] has uploaded his disassembly of ''[[Knuckles in Sonic 2]]''. It is incomplete in the sense that shifting code and data around produces a non-working ROM, and its main use thus far has been porting the [[Knuckles]] object contained in it to ''[[Sonic 1]]'' and ''[[Sonic 2]]''.<br />
<br />
=== ''Sonic 3D Blast'' disassembly ===<br />
The ''[[Sonic 3D Blast]]'' disassembly in the repository was uploaded by [[Sik]]. It is not a complete disassembly, although some major routines, including ones which handle level loading, have been identified and labelled.<br />
<br />
=== ''Sonic Adventure'' disassembly ===<br />
[[MainMemory]] uploaded IDBs for a few files, labeled much of the model and level data for the [[SCHG:Sonic Adventure/Model Locations|SCHG]] and his SA1LVL program. These files are here if somebody wants to do a further disassembly, although MainMemory himself has no plans to learn [[sega:Dreamcast|Dreamcast]]'s SH-4 assembly language.<br />
<br />
=== ''Sonic Adventure DX (PC)'' disassembly ===<br />
[[MainMemory]] has uploaded his disassembly of ''[[Sonic Adventure DX: Director's Cut]]'' (PC version) in the repository in June 2010.<br />
<br />
=== ''Sonic Adventure DX (PC)'' decompilation ===<br />
[[FraGag]] uploaded this project in January 2011. This project aims to recreate the main executable (sonic.exe) and the several DLLs that make up the Windows port of ''[[Sonic Adventure DX: Director's Cut]]'' in C and C++.<br />
<br />
=== ''Sonic Adventure'' Tools ===<br />
[[FraGag]] uploaded this project in January 2011. This is a set of Visual C# projects providing libraries and utilities that assist in working with ''[[Sonic Adventure]]'' and its derived games.<br />
<br />
=== ''Sonic & Knuckles Collection'' disassembly ===<br />
[[MainMemory]] has uploaded his disassembly of ''[[Sonic & Knuckles Collection]]'' in the repository in June 2010.<br />
<br />
=== ''Sonic the Hedgehog'' disassembly ===<br />
The ''Sonic the Hedgehog'' disassembly on the repository is an updated version of [[User:Hivebrain|Hivebrain]]'s [[Media:Sonic 1 (Split and Text by Hivebrain).zip|2005 disassembly]]. It is now based on ASM68K, adds symbols for the RAM variables and other constants, as well as macros. Some labels have been replaced with local labels. Also, the code has been split to separate files (only data was split in the previous version) and the ability to switch revisions from the original version to the Japanese ''Rev01'' version has been added using a variable.<br />
<br />
=== ''Sonic the Hedgehog 2 SMS'' disassembly ===<br />
[[Glitch]] uploaded his disassembly of the [[Master System]] version of [[Sonic the Hedgehog 2 (8-bit)|Sonic the Hedgehog 2]] in February 2009. It can be changed to build the 2.2 version of the game using a variable. One major thing to note that this disassembly uses [[Z80|Z80 ASM]] instead of the [[Motorola 68000|68K]] language used in the [[Sega Mega Drive]] disassemblies.<br />
<br />
=== ''Sonic the Hedgehog 2'' disassembly ===<br />
The ''Sonic the Hedgehog 2'' disassembly on the repository is based off [[Xenowhirl]]'s [[Media:Sonic 2 (Split and Text by Xenowhirl).zip|2007 disassembly]]. It was uploaded by [[Scarred Sun]], then [[FraGag]] quickly committed some important changes. The disassembly has since been worked on by numerous other contributors. Major additions include a dynamic IDs system which allows entries to be removed from tables such as the game modes array without having to change hardcoded constants throughout the game, a more dynamic way to declare the RAM variables, and the labelling and commenting of numerous routines.<br />
<br />
=== SonicState ===<br />
SonicState is a savestate editor written in [[wikipedia:C Sharp (programming language)|C#]] by [[Delta (scener)|Delta]]. It is currently incomplete, although Delta plans to update it.<br />
<br />
=== [[SonLVL]] ===<br />
SonLVL is a level editor for ''[[Sonic the Hedgehog 2 (16-bit)|Sonic 2]]'' and ''[[Sonic the Hedgehog (16-bit)|Sonic 1]]'' written in C# by [[MainMemory]].<br />
<br />
=== SAModel ===<br />
SAModel is a C# library for working with models from [[Sonic Adventure]], [[Sonic Adventure 2]], and their respective ports, and a series of tools using that library.<br />
<br />
=== [[SADXPCTools]] ===<br />
SADXPCTools is a collection of programs for editing SADXPC.<br />
<br />
== External Links ==<br />
* [http://github.com/sonicretro Repository]<br />
<br />
[[Category:Sonic Retro Projects]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=Talk:The_S_Factor:_Sonia_and_Silver&diff=207896Talk:The S Factor: Sonia and Silver2014-05-13T17:49:40Z<p>RetroUser: Meh...I bet that the characters are secret for a reason. I wish somebody would tell me if they were available in the current build, though.</p>
<hr />
<div>- Is this hack still being continued? - True_Dude<br />
:Yes, of course! It has a thread at S2beta and was entered into the hacking contest. -[[SMTP]]<br />
<br />
<br />
-Question. Scourge the Hedgehog is also a playable character in this hack, even if Sonia and Silver are the only two main characters. Why isn't he or his gameplay style even mentioned in the article? --[[User:Klom99|Klom99]] 23:55, 4 May 2011 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=Sonic_Time_Twisted&diff=207895Sonic Time Twisted2014-05-13T17:36:31Z<p>RetroUser: </p>
<hr />
<div>{{Fangame<br />
| screen=Stt_title2.PNG|Sonic Time Twisted Title logo originally by [[Slingerland]]<br />
| screenwidth=<br />
| date=August 2010<br />
| engine=Game Maker<br />
| credits=[[Overbound]], [[Mercury]], [[Hinchy]], [[AeroGP]], [[Sparks]], [[Apricity]], [[Ristar]], [[Der Zocker]], [[DimensionWarped]]<br />
}}<br />
<br />
<br />
'''Sonic Time Twisted''' is a fan-made attempt, headed by [[Overbound]], to make a new game that borrows some key elements from ''[[Sonic CD]]'', including time travel, to make it one of the more unique Sonic fan games out there, while still being very true to the classic [[Mega Drive|Genesis/Mega Drive]] games. The game has been in development since 2006, though since then, Sonic Time Twisted went through a total revamp twice, so as such all demos are based on various older builds of Sonic Time Twisted.<br />
<br />
==Storyline==<br />
The storyline will take space through a number of cut scenes through out the game similar in style to [[Sonic 3 & Knuckles|Sonic 3&K]] or the few scattered around in ''Sonic CD''. Not too much detail has been given yet but it can be said that it involves [[Sonic]], [[Metal Sonic]], [[Dr. Robotnik]], the [[Time Stones]], [[Chaos Emeralds]], and mysterious UFOs.<br />
<br />
==Gameplay==<br />
Sonic Time Twisted is a [[wikipedia:Game Maker|Game Maker]] based game, currently being programmed by [[Mercury]] using his very accurate AeStHete engine. Older builds used [[Damizean]] and RougeYoshi's Xmas Gift 360º engine. The gameplay parallels the [[Genesis]] games using similar level design which includes a large number of gimmicks for each zone. The game also grabs elements from ''Sonic CD'', including time travel in two time zones and the time stones.<br />
<br />
==Zones==<br />
Only two zones of Sonic Time Twisted have made it into a playable form thus far. Note that they used to use the "Round" notation from Sonic CD, with Zones as the individual levels, but it has since reverted to the Sonic 1 style Zone/Act notation.<br />
<br />
*Viridian Valley Zone: a [[Green Hill Zone]] style area with a twist, with the city in the back and lots of grab bars and fan launchers. The past is overgrown and tropical, with far less civilization in sight. Formerly known as "Disport Drive".<br />
*Perplex Puzzle Zone: an intricate, labyrinthine, partially sunken temple with influences from [[Tidal Tempest]] - the first part of this round is playable in the SAGE 2010 demo, but the level is being reworked for a later place in the game.<br />
<br />
Other currently planned zones in Sonic Time Twisted include:<br />
<br />
*Attraction Attack Zone: an amusement park partially under the control of Dr. Robotnik in the future, but still under construction in the past; equal parts [[Collision Chaos]], [[Spring Yard Zone]], and [[Casino Night Zone]].<br />
*Frigid Fortress Zone: an abandoned castle repurposed by the nefarious doctor into a robot factory. Take out his machines in the future, or explore the castle in the past.<br />
*Quaking Quarry Zone: The heart of Robotnik's operation is here, where he intends to unearth the secret of the Time Stones. In the past, labyrinthine natural cave systems and tall mountains have not yet been touched.<br />
<br />
==Soundtrack==<br />
Originally the game's soundtrack was composed by LarkSS, but due to various reasons, he became unable to continue making the music shortly prior to SAGE 2010. The new version of the soundtrack is being mainly composed by [[User:Hinchy|Zach Hinchy]], though there are a few tracks from the original incarnation being carried over (such as the theme of Perplex Puzzle Past). The SAGE 2010 demo features the new title theme and the Perplex Puzzle Future theme from the new soundtrack; additional finished and work-in-progress music from the soundtrack can be listened to at the [http://twoages.hinchy.us/ soundtrack repository]. Upon completion, the soundtrack, with the title ''Two Ages'', is intended to be formally (but still freely) released as a downloadable OST.<br />
<br />
<br />
==Production Credits==<br />
Offical Team<br />
*[[User:Overbound|Overbound]]: Lead Graphic Designer, Lead Level Designer<br /><br />
*[[User:Mercury|Mercury]]: Lead Programmer<br /><br />
*[[User:Hinchy|Zach Hinchy]]: Lead Music Composer, Additional Graphics and Concept<br/><br />
<br />
Contributing Members<br />
*LarkSS: Additional Music<br />
*[[Gardow]] : Character Design<br />
*MFZB: Character Design<br />
*MystHedgehog: Character Design<br />
*AeroGP: Programming Support<br />
*[[Damizean]]: Programming Support & Art Design<br />
*RogueYoshi: Programming Support<br />
<br />
==Screenshot Gallery==<br />
Note that almost all of these screenshots are outdated as of the 2010 switch to Mercury's engine.<br />
===pre-SAGE 2010===<br />
<gallery><br />
Image:Stt dd1.PNG|Disport Drive Future with RinoBeatle<br />
Image:Stt dd2.PNG|Disport Drive Future with Grab Bar<br />
Image:Stt dd metal.PNG|Dispot Drive Future with Metal Sonic<br />
Image:Stt dd3.PNG|Disport Drive Past with Zoom Tube<br />
Image:Stt dd4.PNG|Disport Drive Past with Past Path<br />
Image:Stt dd5.PNG|Disport Drive Past with Spring<br />
Image:Stt savescreen.PNG |Save Screen<br />
</gallery><br />
===before that===<br />
<gallery><br />
Image:Stt_title.PNG|Old Title Screen<br />
Image:Stt_ce_future.png|City Edge Future<br />
Image:Stt_ce_past.png|City Edge Past<br />
Image:Stt_pp_future.PNG|Perplex Puzzle Future<br />
Image:Stt_pp_pastl.PNG|Perplex Puzzle Past<br />
Image:Stt_mm_future.PNG|Majestic Mine Future<br />
Image:Stt_mm_past.PNG|Majestic Mine Past<br />
</gallery><br />
<br />
==Awards==<br />
*SAGE 2006: Best in Show runner-up<br />
<br />
==Downloads==<br />
<!-- {{download|version=SAGE2010|file=Sonic_Time_Twisted_SAGE2010.zip|filesize=12.7MB}} --><br />
[http://timetwisted.sonicstrike.net/Sonic%20Time%20Twisted%20SAGE%202010.zip Sonic Time Twisted SAGE 2010 Demo] (12.7MB)<br />
<br />
<!-- {{download|version=SAGE2009|file=Sonic Time Twisted 2009 Demo.rar|filesize=9.08MB}} --><br />
[http://timetwisted.sonicstrike.net/Sonic%20Time%20Twisted%202009%20Demo.rar Sonic Time Twisted SAGE 2009 Demo] (9.08MB)<br />
<br />
===Old Versions===<br />
* {{file|Sonic_Time_Twisted_0.4.7z|version=0.4}} (9.73MB)<br />
<br />
==External Links==<br />
* [http://www.timetwisted.sonicstrike.net/ Sonic Time Twisted] official website<br />
* [http://twoages.hinchy.us/ soundtrack repository]<br />
<br />
[[Category:Game Maker fan games]]</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Guide&diff=207894SCHG How-to Talk:Guide2014-05-13T17:01:40Z<p>RetroUser: </p>
<hr />
<div>==Categorization==<br />
After familiarising myself with the 'guide categories', I question why the entries under Sonic 2's Miscellaneous are there, as, to me, they appear to fall under Design Choices.<br />
<br />
To be more specific, what makes them 'miscellaneous'? What makes them 'not Design Choice changes'? Why else would you change, say, the Special Stage ring requirements? It's not to fix a bug, and it isn't to allow for custom content, nor would it not have an immediate effect, as the description under S1's Extend category header. It even seems similar to <i>Enable/Disable Tails in Certain Levels</i> in that regard: why change that? They're for the same reasons, customisation of the original game, or for custom Zones/Special Stages.<br />
<br />
Actually, it seems that many guides are in the wrong place. <i>Port Knuckles</i>, for example:<br />
<br />
<i>"<b>Extending the game</b><br />
<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content."</i><br />
<br />
UMM...<br />
<br />
Also, what of outdated guides? I have a plan for a superior version of <i>Expand the music index from $94 to $9F</i> and <i>Expand the music index to start at $00 instead of $80</i> that takes no cues from these guides. I don't want to just orphan the guides, and I can't credit their authors in mine since they had no hand whatsoever in it.<br />
<br />
So the only logical solution I can think of is creating a separate 'Obsolete' category. I wouldn't say 'Outdated' since at least half of the guides around here <i>are</i> outdated (old disasms). Though I wouldn't argue against such a category for those, it'd give us a reason to update the old things to a level of presentability.<br />
<br />
Anyhow, I just wanted to bring this by anyone reading before I go off making any relatively large changes. Anyone have any objections, suggestions? Anything? [[User:Clownacy|Clownacy]] 17:19, 14 April 2014 (UTC)<br />
<br />
:I did not read the descriptions on the Sonic 1 categories when placing the Knuckles guide, I merely saw that it wasn't a design choice, so I figured it ought to go under extending the game. Perhaps if the "Design Choices & Features" category was split into two like Sonic 1, it would make more sense. [[User:MainMemory|MainMemory]] 17:24, 14 April 2014 (UTC)<br />
<br />
==Homing Attack Guide==<br />
Hey, could somebody please write a homing attack/jump-dash guide for Sonic 1? That would be awesome! [[User:RetroUser|RetroUser]] 20:40, 24 April 2014 (UTC)<br />
:Certain people would rather such a guide not exist, as they feel that it would be "too easy". I personally don't feel that way, but I only do Sonic 2. [[User:MainMemory|MainMemory]] 20:45, 24 April 2014 (UTC)<br />
<br />
::Ok then, Sonic 2 would be fine. [[User:RetroUser|RetroUser]] 21:06, 24 April 2014 (UTC)<br />
<br />
:Oh, and if a homing attack guide gets written for Sonic 2, it can go under the new "Adding features" category I added. [[User:RetroUser|RetroUser]] 23:12, 25 April 2014 (UTC)<br />
<br />
:Since when did we make guides on command? I may just be full of pride, but that feels rude. Besides, haven't you looked around? This 'homing attack code' business has been a touchy subject for ages, and many like you have asked this same question many times before, though they've mostly gotten the same answer. It says something, that you haven't noticed, something ''bad''. Also, you missed the Music Index expansion guide under ''Extending the game'', you haven't removed the mention of features from the ''Design Choices & Features'' header, there are numerous ''Adding features''-type guides that you haven't moved from ''Design Choices & Features'', and you haven't changed the S2Howtos Template. If this is how you edit a wiki page, I'd hate to see how you edit code. No wonder you need a guide! But these guides aren't here to tell you how to do everything. Many, myself included, used and see these as an introduction. It's where you begin, with adding a basic move, enhancing a certain feature. Not where you reach the peak of Sonic hacking, where you program an alien ability that requires greater knowledge of the Sonic Engine's object system, physics, object status, collision handling, and even 68K Assembly itself! You can't condense that into a guide; instead, it must come from experience, lots of it. The only guide that the homing attack can possibly find itself in is a copy-and-paste guide, and that is unacceptable. [[User:Clownacy|Clownacy]] 03:47, 27 April 2014 (UTC)<br />
<br />
::Okay, I wasn't demanding that a guide be written, I was simply asking about it and stating that it was a new feature and could go there if it ever did get written, which now isn't going to happen, I can see. I understand now what you mean about the music expansion guide, but the fact that you have to provide your own music was on my mind. [[User:RetroUser|RetroUser]] 15:55, 27 April 2014 (UTC)<br />
<br />
:::If I can say anything, I meant nothing malicious by removing your category, it's nice to see someone making changes around here, but as I was following up on my changes mentioned in the above 'Categorization' section, I had a very difficult time distinguishing feature from alternate design choice. For example, the Air Speed Cap Removal guide, was it a feature that you could exceed a certain speed whilst airborne, or was it changing the design choice of having it limited? One of the few reasons I thought for the ''Expansion''-worthy guide going under ''Sound Features'' was that this was the case with the Sonic 1 guide, though looking at it now, there's a sound driver bugfix in the Bugfix category, and not in the ''Sound Features'' one. Since the drivers are the same thing, only in different games, I'm thinking of adding a separate group, solely for the 68K sound driver. It'd get very messy having a Sonic 2 variant of every guide for the S1 sound driver thanks to the Clone Driver, and only worsened when I begin adding more guides for the thing. [[User:Clownacy|Clownacy]] 15:41, 28 April 2014 (UTC)<br />
<br />
::::Alright, I guess I wouldn't have many objections (if any) for a section solely on the driver, as things wouldn't have to be spread out as much, and there would be less debate about where a guide for it would go. Also, I'd like to thank you for stating that you meant no harm when removing my category, and I'd like to say that I was only trying to make things easier by adding new sections. I didn't mean to have things so messed up, and I'll try to be more careful in the future. [[User:RetroUser|RetroUser]] 00:29, 29 April 2014 (UTC)<br />
<br />
==Clone Driver 2.1.2 Setup Guide==<br />
<br />
Clownancy,<br />
<br />
Ok, so I've downloaded and checked out the Sonic 2 Clone Driver 2.1.2, and I find it to be awesome, but is there a setup tutorial out there, or are you working on that? [[User:RetroUser|RetroUser]] 23:46, 9 May 2014 (UTC)<br />
<br />
:That's being asked here? There's one right on the thread's first post, right underneath the download. At some point, I plan to edit [[SCHG_How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|this guide]] to support it. Right now, I don't really want to. I'll probably have to have the page's name changed and completely rewrite it... Actually, I think I'll just move it to the proposed 'Obsolete' category and make a brand new page. Speaking of obsolete, I'm surprised no one's noticed that the Enigma Credits guide is broken: The download links are external, and the host has long since deleted the files. Flamewing's S2 Special Stage DPLC guide appears to be broken also, but in a different way, in that I can't get it to work, though that could just be me. It's been a while since I last tried, and that was before I got familiar with DPLCs and mappings, so I'll give it another shot. Don't know what to do with the Enigma Credits, I can't find a mirror to the files, which leaves it a dead guide. Wait a minute... Clown-nancy?! [[User:Clownacy|Clownacy]] 18:05, 11 May 2014 (UTC)<br />
<br />
::Whoops! Guess I saw the name incorrectly...sorry =/ [[User:RetroUser|RetroUser]] 23:45, 11 May 2014 (UTC)<br />
<br />
:::It's Clown + Lunacy, pronounced "Cloonacy". Think "Clown" pronounced with a strong accent (Scottish?). A recent message from a Clone Driver V2 (I need to find a way to abbreviate this thing) user gave me an idea to make the Driver update-friendly, the guide will also contain a 'how to update' section. Going back for a minute, by "setup" you meant "installation", right? How are you signing your posts, anyway? The wiki doesn't seem to like it, I have to keep fixing it. [[User:Clownacy|Clownacy]] 08:15, 12 May 2014 (UTC)<br />
<br />
::::Okay, my signature should be fixed, but before now, I would click on the "Treat signature as wikitext (without an automatic link)" box and use html code or whatever to color it and give it a font (think FrozenNitrogen). What do you mean by the wiki not liking it, though? Would it just show weird code? Also, as for the guide, yes, I mean installation, however, when I went to the topic to download the driver, I didn't remember seeing the guide, so I just had to ask that question without checking it again. [[User:RetroUser|RetroUser]] 19:32, 12 May 2014 (UTC)<br />
<br />
:::::Look at the history, "Retro" is highlighted blue, and probably links to something. So, yeah, weird code. Whatever you did this time, it worked, safe for the out-of-place hyphen. [[User:Clownacy|Clownacy]] 20:26, 12 May 2014 (UTC)<br />
<br />
::::::Umm, the "Retro" wasn't highlighted blue, I used html code to give it that color; the whole name links to my <strike>missing</strike> user page because I set it to do that. Now, the "User" I colored gray to give my signature something of a <strike>cheese factor</strike> unique style by having two colors. For example, Frozen Nitrogen's unique signature is like this: [[Frozen Nitrogen|<span style="color:steelblue">'''Frozen'''</span> <span style="color:springgreen">'''Nitrogen'''</span>]]. [[User:RetroUser|RetroUser]] 17:01, 13 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Guide&diff=207866SCHG How-to Talk:Guide2014-05-12T19:32:03Z<p>RetroUser: </p>
<hr />
<div>==Categorization==<br />
After familiarising myself with the 'guide categories', I question why the entries under Sonic 2's Miscellaneous are there, as, to me, they appear to fall under Design Choices.<br />
<br />
To be more specific, what makes them 'miscellaneous'? What makes them 'not Design Choice changes'? Why else would you change, say, the Special Stage ring requirements? It's not to fix a bug, and it isn't to allow for custom content, nor would it not have an immediate effect, as the description under S1's Extend category header. It even seems similar to <i>Enable/Disable Tails in Certain Levels</i> in that regard: why change that? They're for the same reasons, customisation of the original game, or for custom Zones/Special Stages.<br />
<br />
Actually, it seems that many guides are in the wrong place. <i>Port Knuckles</i>, for example:<br />
<br />
<i>"<b>Extending the game</b><br />
<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content."</i><br />
<br />
UMM...<br />
<br />
Also, what of outdated guides? I have a plan for a superior version of <i>Expand the music index from $94 to $9F</i> and <i>Expand the music index to start at $00 instead of $80</i> that takes no cues from these guides. I don't want to just orphan the guides, and I can't credit their authors in mine since they had no hand whatsoever in it.<br />
<br />
So the only logical solution I can think of is creating a separate 'Obsolete' category. I wouldn't say 'Outdated' since at least half of the guides around here <i>are</i> outdated (old disasms). Though I wouldn't argue against such a category for those, it'd give us a reason to update the old things to a level of presentability.<br />
<br />
Anyhow, I just wanted to bring this by anyone reading before I go off making any relatively large changes. Anyone have any objections, suggestions? Anything? [[User:Clownacy|Clownacy]] 17:19, 14 April 2014 (UTC)<br />
<br />
:I did not read the descriptions on the Sonic 1 categories when placing the Knuckles guide, I merely saw that it wasn't a design choice, so I figured it ought to go under extending the game. Perhaps if the "Design Choices & Features" category was split into two like Sonic 1, it would make more sense. [[User:MainMemory|MainMemory]] 17:24, 14 April 2014 (UTC)<br />
<br />
==Homing Attack Guide==<br />
Hey, could somebody please write a homing attack/jump-dash guide for Sonic 1? That would be awesome! [[User:RetroUser|RetroUser]] 20:40, 24 April 2014 (UTC)<br />
:Certain people would rather such a guide not exist, as they feel that it would be "too easy". I personally don't feel that way, but I only do Sonic 2. [[User:MainMemory|MainMemory]] 20:45, 24 April 2014 (UTC)<br />
<br />
::Ok then, Sonic 2 would be fine. [[User:RetroUser|RetroUser]] 21:06, 24 April 2014 (UTC)<br />
<br />
:Oh, and if a homing attack guide gets written for Sonic 2, it can go under the new "Adding features" category I added. [[User:RetroUser|RetroUser]] 23:12, 25 April 2014 (UTC)<br />
<br />
:Since when did we make guides on command? I may just be full of pride, but that feels rude. Besides, haven't you looked around? This 'homing attack code' business has been a touchy subject for ages, and many like you have asked this same question many times before, though they've mostly gotten the same answer. It says something, that you haven't noticed, something ''bad''. Also, you missed the Music Index expansion guide under ''Extending the game'', you haven't removed the mention of features from the ''Design Choices & Features'' header, there are numerous ''Adding features''-type guides that you haven't moved from ''Design Choices & Features'', and you haven't changed the S2Howtos Template. If this is how you edit a wiki page, I'd hate to see how you edit code. No wonder you need a guide! But these guides aren't here to tell you how to do everything. Many, myself included, used and see these as an introduction. It's where you begin, with adding a basic move, enhancing a certain feature. Not where you reach the peak of Sonic hacking, where you program an alien ability that requires greater knowledge of the Sonic Engine's object system, physics, object status, collision handling, and even 68K Assembly itself! You can't condense that into a guide; instead, it must come from experience, lots of it. The only guide that the homing attack can possibly find itself in is a copy-and-paste guide, and that is unacceptable. [[User:Clownacy|Clownacy]] 03:47, 27 April 2014 (UTC)<br />
<br />
::Okay, I wasn't demanding that a guide be written, I was simply asking about it and stating that it was a new feature and could go there if it ever did get written, which now isn't going to happen, I can see. I understand now what you mean about the music expansion guide, but the fact that you have to provide your own music was on my mind. [[User:RetroUser|RetroUser]] 15:55, 27 April 2014 (UTC)<br />
<br />
:::If I can say anything, I meant nothing malicious by removing your category, it's nice to see someone making changes around here, but as I was following up on my changes mentioned in the above 'Categorization' section, I had a very difficult time distinguishing feature from alternate design choice. For example, the Air Speed Cap Removal guide, was it a feature that you could exceed a certain speed whilst airborne, or was it changing the design choice of having it limited? One of the few reasons I thought for the ''Expansion''-worthy guide going under ''Sound Features'' was that this was the case with the Sonic 1 guide, though looking at it now, there's a sound driver bugfix in the Bugfix category, and not in the ''Sound Features'' one. Since the drivers are the same thing, only in different games, I'm thinking of adding a separate group, solely for the 68K sound driver. It'd get very messy having a Sonic 2 variant of every guide for the S1 sound driver thanks to the Clone Driver, and only worsened when I begin adding more guides for the thing. [[User:Clownacy|Clownacy]] 15:41, 28 April 2014 (UTC)<br />
<br />
::::Alright, I guess I wouldn't have many objections (if any) for a section solely on the driver, as things wouldn't have to be spread out as much, and there would be less debate about where a guide for it would go. Also, I'd like to thank you for stating that you meant no harm when removing my category, and I'd like to say that I was only trying to make things easier by adding new sections. I didn't mean to have things so messed up, and I'll try to be more careful in the future. [[User:RetroUser|RetroUser]] 00:29, 29 April 2014 (UTC)<br />
<br />
==Clone Driver 2.1.2 Setup Guide==<br />
<br />
Clownancy,<br />
<br />
Ok, so I've downloaded and checked out the Sonic 2 Clone Driver 2.1.2, and I find it to be awesome, but is there a setup tutorial out there, or are you working on that? [[User:RetroUser|RetroUser]] 23:46, 9 May 2014 (UTC)<br />
<br />
:That's being asked here? There's one right on the thread's first post, right underneath the download. At some point, I plan to edit [[SCHG_How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|this guide]] to support it. Right now, I don't really want to. I'll probably have to have the page's name changed and completely rewrite it... Actually, I think I'll just move it to the proposed 'Obsolete' category and make a brand new page. Speaking of obsolete, I'm surprised no one's noticed that the Enigma Credits guide is broken: The download links are external, and the host has long since deleted the files. Flamewing's S2 Special Stage DPLC guide appears to be broken also, but in a different way, in that I can't get it to work, though that could just be me. It's been a while since I last tried, and that was before I got familiar with DPLCs and mappings, so I'll give it another shot. Don't know what to do with the Enigma Credits, I can't find a mirror to the files, which leaves it a dead guide. Wait a minute... Clown-nancy?! [[User:Clownacy|Clownacy]] 18:05, 11 May 2014 (UTC)<br />
<br />
::Whoops! Guess I saw the name incorrectly...sorry =/ [[User:RetroUser|RetroUser]] 23:45, 11 May 2014 (UTC)<br />
<br />
:::It's Clown + Lunacy, pronounced "Cloonacy". Think "Clown" pronounced with a strong accent (Scottish?). A recent message from a Clone Driver V2 (I need to find a way to abbreviate this thing) user gave me an idea to make the Driver update-friendly, the guide will also contain a 'how to update' section. Going back for a minute, by "setup" you meant "installation", right? How are you signing your posts, anyway? The wiki doesn't seem to like it, I have to keep fixing it. [[User:Clownacy|Clownacy]] 08:15, 12 May 2014 (UTC)<br />
<br />
::::Okay, my signature should be fixed, but before now, I would click on the "Treat signature as wikitext (without an automatic link)" box and use html code or whatever to color it and give it a font (think FrozenNitrogen). What do you mean by the wiki not liking it, though? Would it just show weird code? Also, as for the guide, yes, I mean installation, however, when I went to the topic to download the driver, I didn't remember seeing the guide, so I just had to ask that question without checking it again. -[[User:RetroUser|RetroUser]] 19:32, 12 May 2014 (UTC)</div>RetroUserhttps://info.sonicretro.org/index.php?title=SCHG_How-to_Talk:Guide&diff=207845SCHG How-to Talk:Guide2014-05-11T23:45:34Z<p>RetroUser: </p>
<hr />
<div>==Categorization==<br />
After familiarising myself with the 'guide categories', I question why the entries under Sonic 2's Miscellaneous are there, as, to me, they appear to fall under Design Choices.<br />
<br />
To be more specific, what makes them 'miscellaneous'? What makes them 'not Design Choice changes'? Why else would you change, say, the Special Stage ring requirements? It's not to fix a bug, and it isn't to allow for custom content, nor would it not have an immediate effect, as the description under S1's Extend category header. It even seems similar to <i>Enable/Disable Tails in Certain Levels</i> in that regard: why change that? They're for the same reasons, customisation of the original game, or for custom Zones/Special Stages.<br />
<br />
Actually, it seems that many guides are in the wrong place. <i>Port Knuckles</i>, for example:<br />
<br />
<i>"<b>Extending the game</b><br />
<br />
These guides will prepare you to introduce new content in the game. Merely following these guides will usually have no immediate effect in the game; you will need to provide custom content."</i><br />
<br />
UMM...<br />
<br />
Also, what of outdated guides? I have a plan for a superior version of <i>Expand the music index from $94 to $9F</i> and <i>Expand the music index to start at $00 instead of $80</i> that takes no cues from these guides. I don't want to just orphan the guides, and I can't credit their authors in mine since they had no hand whatsoever in it.<br />
<br />
So the only logical solution I can think of is creating a separate 'Obsolete' category. I wouldn't say 'Outdated' since at least half of the guides around here <i>are</i> outdated (old disasms). Though I wouldn't argue against such a category for those, it'd give us a reason to update the old things to a level of presentability.<br />
<br />
Anyhow, I just wanted to bring this by anyone reading before I go off making any relatively large changes. Anyone have any objections, suggestions? Anything? [[User:Clownacy|Clownacy]] 17:19, 14 April 2014 (UTC)<br />
<br />
:I did not read the descriptions on the Sonic 1 categories when placing the Knuckles guide, I merely saw that it wasn't a design choice, so I figured it ought to go under extending the game. Perhaps if the "Design Choices & Features" category was split into two like Sonic 1, it would make more sense. [[User:MainMemory|MainMemory]] 17:24, 14 April 2014 (UTC)<br />
<br />
==Homing Attack Guide==<br />
Hey, could somebody please write a homing attack/jump-dash guide for Sonic 1? That would be awesome! [[User:RetroUser|RetroUser]] 20:40, 24 April 2014 (UTC)<br />
:Certain people would rather such a guide not exist, as they feel that it would be "too easy". I personally don't feel that way, but I only do Sonic 2. [[User:MainMemory|MainMemory]] 20:45, 24 April 2014 (UTC)<br />
<br />
::Ok then, Sonic 2 would be fine. [[User:RetroUser|RetroUser]] 21:06, 24 April 2014 (UTC)<br />
<br />
:Oh, and if a homing attack guide gets written for Sonic 2, it can go under the new "Adding features" category I added. [[User:RetroUser|RetroUser]] 23:12, 25 April 2014 (UTC)<br />
<br />
:Since when did we make guides on command? I may just be full of pride, but that feels rude. Besides, haven't you looked around? This 'homing attack code' business has been a touchy subject for ages, and many like you have asked this same question many times before, though they've mostly gotten the same answer. It says something, that you haven't noticed, something ''bad''. Also, you missed the Music Index expansion guide under ''Extending the game'', you haven't removed the mention of features from the ''Design Choices & Features'' header, there are numerous ''Adding features''-type guides that you haven't moved from ''Design Choices & Features'', and you haven't changed the S2Howtos Template. If this is how you edit a wiki page, I'd hate to see how you edit code. No wonder you need a guide! But these guides aren't here to tell you how to do everything. Many, myself included, used and see these as an introduction. It's where you begin, with adding a basic move, enhancing a certain feature. Not where you reach the peak of Sonic hacking, where you program an alien ability that requires greater knowledge of the Sonic Engine's object system, physics, object status, collision handling, and even 68K Assembly itself! You can't condense that into a guide; instead, it must come from experience, lots of it. The only guide that the homing attack can possibly find itself in is a copy-and-paste guide, and that is unacceptable. [[User:Clownacy|Clownacy]] 03:47, 27 April 2014 (UTC)<br />
<br />
::Okay, I wasn't demanding that a guide be written, I was simply asking about it and stating that it was a new feature and could go there if it ever did get written, which now isn't going to happen, I can see. I understand now what you mean about the music expansion guide, but the fact that you have to provide your own music was on my mind. [[User:RetroUser|RetroUser]] 15:55, 27 April 2014 (UTC)<br />
<br />
:::If I can say anything, I meant nothing malicious by removing your category, it's nice to see someone making changes around here, but as I was following up on my changes mentioned in the above 'Categorization' section, I had a very difficult time distinguishing feature from alternate design choice. For example, the Air Speed Cap Removal guide, was it a feature that you could exceed a certain speed whilst airborne, or was it changing the design choice of having it limited? One of the few reasons I thought for the ''Expansion''-worthy guide going under ''Sound Features'' was that this was the case with the Sonic 1 guide, though looking at it now, there's a sound driver bugfix in the Bugfix category, and not in the ''Sound Features'' one. Since the drivers are the same thing, only in different games, I'm thinking of adding a separate group, solely for the 68K sound driver. It'd get very messy having a Sonic 2 variant of every guide for the S1 sound driver thanks to the Clone Driver, and only worsened when I begin adding more guides for the thing. [[User:Clownacy|Clownacy]] 15:41, 28 April 2014 (UTC)<br />
<br />
::::Alright, I guess I wouldn't have many objections (if any) for a section solely on the driver, as things wouldn't have to be spread out as much, and there would be less debate about where a guide for it would go. Also, I'd like to thank you for stating that you meant no harm when removing my category, and I'd like to say that I was only trying to make things easier by adding new sections. I didn't mean to have things so messed up, and I'll try to be more careful in the future. [[User:RetroUser|RetroUser]] 00:29, 29 April 2014 (UTC)<br />
<br />
==Clone Driver 2.1.2 Setup Guide==<br />
<br />
Clownancy,<br />
<br />
Ok, so I've downloaded and checked out the Sonic 2 Clone Driver 2.1.2, and I find it to be awesome, but is there a setup tutorial out there, or are you working on that? [[User:RetroUser|RetroUser]] 23:46, 9 May 2014 (UTC)<br />
<br />
:That's being asked here? There's one right on the thread's first post, right underneath the download. At some point, I plan to edit [[SCHG_How-to:Port the Sonic 2 Clone Sound Driver to the HG version of Sonic 2|this guide]] to support it. Right now, I don't really want to. I'll probably have to have the page's name changed and completely rewrite it... Actually, I think I'll just move it to the proposed 'Obsolete' category and make a brand new page. Speaking of obsolete, I'm surprised no one's noticed that the Enigma Credits guide is broken: The download links are external, and the host has long since deleted the files. Flamewing's S2 Special Stage DPLC guide appears to be broken also, but in a different way, in that I can't get it to work, though that could just be me. It's been a while since I last tried, and that was before I got familiar with DPLCs and mappings, so I'll give it another shot. Don't know what to do with the Enigma Credits, I can't find a mirror to the files, which leaves it a dead guide. Wait a minute... Clown-nancy?! [[User:Clownacy|Clownacy]] 18:05, 11 May 2014 (UTC)<br />
<br />
::Whoops! Guess I saw the name incorrectly...sorry =/ -[[User:RetroUser|<span style="color:steelblue;font-weight:bold">'''Retro'''</span><span style="color:#bbaaaa;font-weight:bold">'''User'''</span>]] 23:45, 11 May 2014 (UTC)</div>RetroUser