Editing Objects - RetroKoH/S1Fixed GitHub Wiki
Objects in S1Fixed are fairly straight-forward to modify once you get the hang of ASM editing. Object RAM starts at $FFFFD000, and each object consists of $40 (64) bytes of RAM. This guide will introduce you to the basics of where to find object code within the disassembly, how it works.
For the purposes of this guide, I will assign one of two classifications to every object in the game: static objects, and dynamic objects. Static is the classification given to objects which are hard-coded into the object position layouts of each stage, loaded by ObjPosLoad. Dynamic is the classification given to objects that are dynamically spawned into the game at various points, either by pre-existing objects, Dynamic Level Events, Game Mode routines, or other means.
A file containing a list of pointers to every single static object in the game can be found in _inc/Object Pointers.asm. Every static object is tied to a single-byte index number ranging from 01-FF. This index number is used to get the address of the start of the object's code, which then gets loaded into object RAM. It's important to note that not every object ID value is used, and some point to objects that go unused in the game. These pointers can be used for new objects that you may either want to create on your own, or port over from other games.
NOTE: This object list is for S1Fixed. Sonic 1's object pointer list will vary, though differences will be kept fairly minimal.
Object Index List
| Index Number | Object Name | Notes |
|---|---|---|
| 01 | Unused | This ID slot is used for Sonic in Sonic 1 and Sonic 2. |
| 02 | Unused | This ID slot is used for Tails in Sonic 2. |
| 03 | Path Swapper | ID slot unused in stock S1. In later games, 03 is also the Path Swapper object. |
| 04 | Auto Roll Tag | ID slot unused in stock S1. This object was back-ported from Sonic 2. |
| 05 | Unused | ... |
| 06 | Unused | ... |
| 07 | Unused | ... |
| 08 | Unused | ... |
| 09 | Unused | ... |
| 0A | Unused | ... |
| 0B | LZ Breakable Pole | ... |
| 0C | LZ Flapping Door | ... |
| 0D | Signpost | This object has seen significant changes, including dynamic art loading. |
| 0E | Unused | ... |
| 0F | Unused | ... |
| 10 | Unused | ... |
| 11 | GHZ Bridge | This object now uses subsprites, like its Sonic 2 variant. |
| 12 | SYZ Light | This object now uses sync animations, and will be amalgamated with the Scenery object in the future. |
| 13 | Fireball Maker | The actual fireballs have been incorporated into this object. |
| 14 | Wrecking Ball | This was formerly a subtype of Obj15. |
| 15 | Swinging Platforms | RAM usage has been altered slightly to accomodate the changes made to Obj48. |
| 16 | LZ Harpoon | This object has been reworked by Hivebrain and RetroKoH for increased functionality. |
| 17 | Spiked Log Helix | This object has been reworked by RetroKoH to use subsprites. Increased functionality is planned. |
| 18 | Platforms | ... |
| 19 | GHZ Giant Ball | Absent in the final game; Restored from the prototype. Still incomplete. |
| 1A | Collapsing Ledge | Optimized by RetroKoH. Shares some functionality with Obj53. |
| 1B | Unused | ... |
| 1C | Scenery | This object displays the GHZ Bridge stump and the SLZ Cannon. The SYZ Light and LZ Wheel will be incorporated into this object. |
| 1D | "Magic Switch" | (Unused in the final game) |
| 1E | Ball Hog Badnik | The prototype version will be restored. |
| 1F | Crabmeat Badnik | ... |
| 20 | Unused | ... |
| 21 | Unused | This ID slot was originally for the HUD. It was later repurposed for the invincibility stars. |
| 22 | Buzz Bomber Badnik | ... |
| 23 | Unused | ... |
| 24 | Unused | ... |
| 25 | Unused | ... |
| 26 | Monitor | Solidity improvements by RetroKoH. Further improvements to be made. |
| 27 | Unused | ... |
| 28 | Animals | Additions and Improvements to this object are planned. |
| 29 | Unused Tunnel Door | Originally Obj2A in the prototype. |
| 2A | SBZ Small Door | ... |
| 2B | Chopper Badnik | ... |
| 2C | Jaws Badnik | ... |
| 2D | Burrobot Badnik | ... |
| 2E | MZ Sinking Grassy Platforms | Formerly a subtype of Obj2F. |
| 2F | MZ Large Grassy Platforms | The sinking object has been split off into its own object. |
| 30 | MZ Green Glass Blocks | This object currently has a minor priority bug. |
| 31 | Chained Stompers | This object currently has one minor visual bug with the longest variant. |
| 32 | Button | This object will see improved functionality (Credit: Malachi) |
| 33 | Pushable Blocks | ... |
| 34 | Unused | ... |
| 35 | Unused | ... |
| 36 | Spikes | This object will see enhancements in the future. |
| 37 | Unused | ... |
| 38 | Unused | ... |
| 39 | Unused | ... |
| 3A | Unused | ... |
| 3B | Purple Rock | This object will receive push and break functionality in the future. |
| 3C | Smashable Wall | This object has been slightly optimized, and breaks for Flame Shields and Super Sonic. |
| 3D | Vertical Door | Formerly part of Obj56. |
| 3E | Prison Capsule | ... |
| 3F | Large Horizontal Door | Formerly part of Obj56. |
| 40 | Moto Bug Badnik | This object might(?) receive a new subtype in the future. |
| 41 | Springs | Air Collision for side springs will be added as a mod. Diagonal Springs MIGHT be added. |
| 42 | Newtron badnik | Green badnik will be fixed so that it can reappear. |
| 43 | Roller badnik | ... |
| 44 | GHZ Edge Walls | ... |
| 45 | MZ Sideways Stompers | Absent in the final game; Restored from leftover code. Still incomplete. |
| 46 | MZ Bricks | Slight improvements will be made to their falling movement to remove popping. |
| 47 | SYZ Bumper | ... |
| 48 | Eggman's Swinging Ball | The ball now rotates as it swings (Credit: RetroKoH). |
| 49 | Waterfall Sound | ... |
| 4A | Special Stage Entry Effect | Unused in the final game. |
| 4B | Giant Ring | This object now includes the Flash as a routine, and loads art dynamically. |
| 4C | MZ Lava Geyser | ... |
| 4D | MZ Lava Fall | ... |
| 4E | MZ Wall of Lava | This will be improved upon. |
| 4F | Splats Badnik | Absent in the final game; Restored from the prototype. Still incomplete. |
| 50 | Yadrin badnik | ... |
| 51 | Smashable Green Block | Smashing has been optimized. |
| 52 | Moving Blocks (MZ, LZ, SBZ) | ... |
| 53 | Collapsing Floors (MZ, SLZ, SBZ) | Optimized by RetroKoH. Shares some functionality with Obj1A. |
| 54 | Lava Tag | I might make an alternate version of this object that triggers death. |
| 55 | Basaran badnik | ... |
| 56 | SYZ Floating Blocks | I will split this into different objects. |
| 57 | Spiked Ball and Chain (SYZ and LZ) | ... |
| 58 | SYZ Big Spiked Ball | ... |
| 59 | SLZ Elevator | ... |
| 5A | SLZ Circular Platforms | ... |
| 5B | SLZ Staircase Blocks | ... |
| 5C | SLZ Rotating Staircase | Formerly part of Obj56. |
| 5D | SLZ Fan | ... |
| 5E | SLZ Seesaw | Spikeball split into its own sub-object. |
| 5F | Bomb badnik | Shrapnel spawning optimized by RetroKoH. |
| 60 | Orbinaut badnik | The Orbinaut's orbiting spikeballs are split off into a dynamic object. |
| 61 | LZ Blocks | ... |
| 62 | LZ Gargoyle (and Fireball) | The Fireball will be split off into a dynamic object. |
| 63 | LZ Conveyor Platforms | Might make the wheel a Scenery subtype. |
| 64 | Bubbler and Air Bubbles | Bubbles will be split off from the Bubbler into a dynamic object. |
| 65 | LZ Waterfalls | ... |
| 66 | SBZ Rotating Junction | ... |
| 67 | SBZ Convex Wheel (Running Disc) | ... |
| 68 | SBZ Conveyor Belt | ... |
| 69 | SBZ Spinning Platforms | ... |
| 6A | SBZ Buzzsaws | ... |
| 6B | SBZ Stomper | ... |
| 6C | SBZ Vanishing Platforms | ... |
| 6D | SBZ Flamethrower | ... |
| 6E | SBZ Electric Orb | ... |
| 6F | SBZ Spinning Conveyor Platforms | ... |
| 70 | SBZ Girder | ... |
| 71 | Invisible Solid Barrier | ... |
| 72 | SBZ Teleporter | ... |
| 73 | Unused | ... |
| 74 | Unused | ... |
| 75 | Unused | ... |
| 76 | Unused | ... |
| 77 | Unused | ... |
| 78 | Caterkiller badnik | Collision bugs fixed |
| 79 | Lamppost | ... |
| 7A | SBZ Sliding Metal Bar | Formerly a subtype of Obj6B. |
| 7B | Unused | ... |
| 7C | Unused | This object slot was once for the Ring Flash object, which has been integrated into Obj4B, and no longer exists. |
| 7D | Hidden Bonus Flags | ... |
| 7E | Unused | ... |
| 7F | SBZ3 Sliding Platform | Formerly a subtype of Obj6B. Only seen in SBZ3, but can be placed in LZ. |
These objects do not have an index number, due to not being loaded in by the Object Manager, and therefore not needing one. This allows users to make greater use of the limited slots available for static objects, which is vital if users wish to create new levels with new objects. Dynamic Objects can be found in the _incObj folder, with a -- at the start of their filename. They are sorted here in alphabetical order.
List of Dynamic Objects
| Object Name | Notes |
|---|---|
| After-Images | Backported from S3K. Older versions of S1Fixed listed this as Object $8E. |
| Ball Hog's Cannonball | Formerly Object $20. A variant will be added for the prototype Ball Hog. |
| Boss Explosion | Formerly Object $3F. This could be a subtype of Obj27 if you need an object index. |
| Burning Grass | Formerly Object $35. Now spawned by Obj2E instead of Obj2F. |
| Buzz Bomber Missile | Formerly Object $23. |
| Buzz Bomber Missile Explosion | Formerly Object $24. Unused in the final game, will be re-implemented as a mod. |
| Continue Screen Elements | Formerly Object $80. |
| Continue Screen Sonic | Formerly Object $81. Add alternate Peelout version if the move is enabled. |
| Credits Text | Formerly Object $8A. This will be removed in favor of either Enigma mappings or ASCII text. |
| Drowning Countdown | Formerly Object $0A. This object currently has a (rare) bug in S1Fixed that leads to a crash. |
| Dust Effects | This object was back-ported from Sonic 2. Older versions of S1Fixed listed this as Object $07. |
| Ending Emeralds | Formerly Object $88. |
| Ending Logo | Formerly Object $89. |
| Ending Sonic | Formerly Object $87. |
| Fireball | Formerly Object $14. |
| GAME OVER | Formerly Object $39. This object has received minor improvements and a minor bugfix (Credit: RetroKoH) |
| Goggles | In-progress restoration. Older versions of S1Fixed listed this as Object $8F. |
| Got Through Card | Formerly Object $3A. This object has seen changes and add-ons to accomodate new Bonuses, and faster tallies. |
| Invincibility Stars | Split from the Shield object, and given dynamic art loading AND subsprite functionality. Older versions of S1Fixed listed this as Object $21. |
| Item Explosion | Formerly Object $27. |
| Lost Rings | Formerly Object $37. This object has seen a massive overhaul from numerous editors, and now includes magnetic and badnik functionality. |
| Monitor Contents | Formerly Object $2E. This object has seen improvements and additions by RetroKoH. |
| Orbinaut Spikeballs | Split off from Object $60. |
| Points | Formerly Object $29. If you want to free VRAM or even remove score, you can remove/replace this object. |
| Post-Credits Eggman | Formerly Object $8B. |
| Post-Credits Emeralds | Formerly Object $8C. |
| Rings (Debug) | Formerly Object $25. Due to the Rings Manager, this object is Debug-exclusive. Users planning to remove Debug Mode can remove this object. |
| SBZ2 Eggman | Formerly Object $82. Switch Button split into a separate sub object. |
| SBZ2 Eggman's Crumbling Floor | Formerly Object $83. |
| Shield(s) | Formerly Object $38. This object now loads its art dynamically, and can include all Sonic 3K shields. |
| SLZ Pylon | Formerly Object $5C. |
| Sonic | Formerly Object $01. |
| Special Stage Cursor | Older versions of S1Fixed listed this as Object $06. |
| Special Stage Results | Formerly Object $7E. |
| Special Stage Results Chaos Emeralds | Formerly Object $7F. Could this be subsprites of Obj7E? |
| Special Stage Sonic | Formerly Object $09. |
| Subsprite Test | Created by Devon to demonstrate the sub-sprites system. Older versions of S1Fixed listed this as Object $10. |
| Super Sonic Stars | Backported from Sonic 2. Older versions of S1Fixed listed this as Object $8D. |
| Title Cards | Formerly Object $34. This object interferes less with level art due to improved art loading. (Credit: Kilo, TheBlad768, RetroKoH) |
| Title Screen Sonic | Formerly Object $0E. This object now uses dynamic art loading. |
| Press Start/TM | Formerly Object $0F. The sprite blocker has been improved (Kilo), and a menu routine has been added for SaveProgressMod. |
| Water Splash | Formerly Object $08. |
| Water Surface | This object will see alternate sprites in a mod. |
List of Boss-Related Objects
| Object Name | Notes |
|---|---|
| Boss - Green Hill Zone | Formerly Object $3D. Code cleanup and dynamic art incoming. |
| Boss - Marble Zone | Formerly Object $73. Code cleanup and dynamic art incoming. |
| Boss - Spring Yard Zone | Formerly Object $75. Code cleanup and dynamic art incoming. |
| Boss - Labyrinth Zone | Formerly Object $77. Code cleanup and dynamic art incoming. |
| Boss - Star Light Zone | Formerly Object $7A. Code cleanup and dynamic art incoming. |
| Boss - Final | Formerly Object $85. Code cleanup and dynamic art incoming. |
| Boss (Sub) - Face | Split from the above boss objects into its own object. |
| Boss (Sub) - Flame | Split from the above boss objects into its own object. |
| Boss (Sub) - Weapon | Split from the above boss objects into its own object. |
| Boss Weapon - Green Hill Swinging Ball | Formerly Object $48. The ball now rotates as it swings (Credit: RetroKoH). |
| Boss Weapon - Marble Fire | Formerly Object $74. |
| Boss Weapon - Spring Yard Blocks | Formerly Object $76. |
| Boss Weapon - Star Light Spikeballs | Formerly Object $7B. |
| Boss Weapon - Final Zone Cylinders | Formerly Object $84. |
| Boss Weapon - Final Zone Plasma Launcher | Formerly Object $86. |
| Boss Weapon - Final Zone Plasma Balls | Split off from the Spawner as its own object. |
Every object in RAM in stock Sonic 1 (and S1Fixed) consists of $40 (64) bytes of data. Each byte serves a different purpose as it relates to how the object functions in the game. Some of the bytes' purposes are identical across all objects, while others are not. Many objects also have a slew of "scratch RAM" that you can make use of to add greater functionality to them.
These OST bytes serve the same purpose across every object in the game, and shouldn't be used outside of their intended purpose. Doing so can cause significant issues.
$00 - obRender
This is a bitfield which tells the game whether or not this object's sprite should be rendered on-screen or not, and how it should be rendered, if so. Each bit provides a different function, as outlined in the table below. Do note that this changes across games, and functionality in S1Fixed is slightly different than in stock Sonic 1.Byte format: OSRH BRYX
| Bit | Key | Bitmask | Purpose |
|---|---|---|---|
| 0 | X | $01 | X-Flip flag. If set, the object's sprite is flipped horizontally. |
| 1 | Y | $02 | Y-Flip flag. If set, the object's sprite is flipped vertically. |
| 2 | R | $04 | Relative screen flag. If set, the object's position is relative to the screen's position in the level. If clear, the object's position is absolute on the screen (e.g. the HUD in the original engine). |
| 3 | B | $08 | Background align flag. If set, the object's position is aligned to the background. |
| 4 | H | $10 | Explicit height flag. If set, the obHeight OST is used to decide if object is on-screen, otherwise the object's height is assumed to be $20 (this is used for larger objects). |
| 5 | R | $20 | Raw mapping flag. If set, the object's sprite(s) use raw mappings, consisting of a single sprite instead of multipart sprite mappings (e.g. broken block fragments). |
| 6 | S | $80 | Sub-sprites "multi-draw" flag. If set, this object uses a slightly different method of sprite rendering that accommodates sub-sprites. |
| 7 | O | $80 | On-screen flag. If set, the object is considered on-screen. Setting this bit renders the value as "negative" ($80-FF). |
$01-03 - obAddr
This is the starting address for the code of the object. In _sonic.asm_, there is a function called **ExecuteObjects** that goes through the entirety of Object RAM and runs the code of every object loaded in RAM. To do so, it checks for this address. If it reads `00 00 00 00`, it assumes there is no object, and moves on to the next space. Otherwise, the game jumps to this address to run the object's code. If an object's address is changed at any point, either through a coded instruction or in real-time via RAM modding, it will begin running different code. In most instances, this is desired, but in some cases, this can be troublesome, or even disastrous.NOTE: The hardware MUST read all 4 bytes, from 00-04. The top byte is never used when a ROM address is loaded, hence why we use that byte for render flags. Special measures are taken to preserve the obRender byte whenever we change the code address.
$04-05 - obGfx
These two bytes tell the game where the object's starting art tile offset is in VRAM, as well as which palette line it should utilize for rendering. A full breakdown of this, along with the accompanying macro, is coming soon.$06-09 - obMap
These four bytes contain a full address pointing to the location of this object's sprite mappings. Unless your object will NEVER be displayed on screen in some manner, it's not advised to change this value during runtime. Only set this in the object's code to a label pointing to sprite mappings.$0A-0B - obX
These two bytes are the integer portion of the object's current x-position within the "room" you are currently in. Said "room" almost always refers to the stage you're currently playing in, though there are exceptions.$0C-0D - obXSub
These two bytes are the fraction, or subpixel, portion of the object's current x-position. Now, numbers in this game do not use actual floating point numbers, so the way that fractions work is like so. Let's say obX is set to $0014 (20 in decimal), and obXSub is set to $4000. Because obXSub is 2 bytes, it ranges from $0000 to $FFFF, for $10000 possible values. Now, $4000/$10000 is equal to 1/4, or 0.25. Therefore, when we combine all 4 bytes into $00144000, that means the object's x-position is equal to 20.25. The subpixel value is not used when placing the object on screen, but as it is incremented and it overflows, the integer portion gets incremented as a result, allowing it to work like a fraction.$0E-0F - obY
These two bytes are the integer portion of the object's current y-position within the "room".$10-11 - obYSub
These two bytes are the fraction, or subpixel, portion of the object's current y-position. The prior explanation applies here too.$1A-1B - obPriority
_This OST is only one byte in stock Sonic 1, but has been extended to 2 bytes in S1Fixed._ This byte is used by **DisplaySprite** to determine the drawing priority level of the object's sprite. The priority value is a two-byte pointer that directs to the priority bracket in `v_spritequeue`.$1A - obFrame
The current sprite mapping frame being displayed.$23 - obDispWid
This OST was named obActWid in the original disassembly. This OST byte signifies the intended width of the object's sprite. It is used in BuildSprites to determine whether or not the object's sprite is within the left or right side ofthe screen, and should be drawn. The engine cannot actively track the actual width of every individual frame at all times, so this value is used as a flat value to represent its visual width.These OST bytes serve the same purpose with most objects, including Sonic. In some cases, they can be repurposed, but this usually shouldn't be done unless you know what you are doing.
$10-11 - obVelX
These two bytes are used by the subroutines **SpeedToPos** or **ObjectFall** (or other similar subroutines) to adjust the object's x-position smoothly, giving it a sense of horizontal "motion".$12-13 - obVelY
These two bytes are used by the subroutines **SpeedToPos** or **ObjectFall** (or other similar subroutines) to adjust the object's y-position smoothly, giving it a sense of vertical "motion". In **ObjectFall**, this value gets increased gradually as a means to emulate gravity.$16-17 - obRespawnAddr
_This OST has been extended to 2 bytes for use with the S3K Object Manager_ This OST variable serves the same purpose as it does in stock Sonic 1, but its execution is slightly different. I'll cover this more in-depth later.$18 - obHeight
This byte determines the object's vertical radius, used primarily for terrain collision. Despite its name, it only determines half of the object's collision height. To be more accurate, it determines the length of the object's vertical collision detection sensor line.$19 - obWidth
This byte determines the object's horizontal radius, used primarily for terrain collision. Despite its name, it only determines half of the object's collision width. To be more accurate, it determines the length of the object's horizontal collision detection sensor line.$22 - obStatus
This byte is a bitfield used by most objects to determine various aspects about its current in-game state. The manner in which the bits are utilized depends on the object in question.$24 - obRoutine
This byte is used by nearly all objects as a means of program control. When an object's code is run by **ExecuteObjects**, it's commonplace that this byte will be used in a lookup table to determine which segment of the object's code should be run at that moment. As a result of being utilized in lookup tables that use word-length pointers, obRoutine is always set to an even value.$26 - obAngle
This byte is used by many objects in subroutines involving angular movement. The most obvious example of this is Sonic, who runs and rolls along all manner of slopes throughout the game. Some objects use this byte in different manners.These OST bytes are used by the animation system.
$1D - obAnim
This byte is used by objects that utilize the **AnimateSprite** subroutine to determine which of the object's loaded animations should be executed.$1E - obAniFrame
This byte is used by objects that utilize the **AnimateSprite** subroutine to determine the object's current frame index in its animation script. It's important to note that this doesn't directly determine the object's sprite mapping frame to be displayed. It is instead used to find the sprite mapping frame to be displayed, in accordance with the object's animation script.$1E - obTimeFrame
Animation Frame Duration.Scrapped OSTs
obPrevAni: This byte is used by objects that utilize the AnimateSprite subroutine. It stores the previously run animation, allowing the subroutine to determine whether or not a new animation is being run or not. If so, it usually resets the object's animation variables accordingly.obDelayAni: This byte was used as a delay timer.
These OST bytes serve the same purpose with various objects, but NOT Sonic. Again, there are some cases where they can be repurposed, but this usually shouldn't be done unless you know what you are doing. Sonic uses equivalent OST bytes for different purposes.
$20 - obColType
This OST byte is used by **ReactToItem** to determine the type of collision hitbox an object has, as well as its bounding box size (via a lookup table). If this byte is set to 00, then Sonic is unable to collide with this item in a meaningful way.$21 - obColProp
This OST byte is an additional collision-based property. The most common use of this byte is by boss objects as hit points. Every boss takes 8 hits before being defeated, so this byte is set to 8 when the boss battle starts, and the battle ends when this ticks down to 0.$25 - ob2ndRout
This byte is used by some objects as a secondary routine counter. It works exactly like obRoutine, and is always set to an even value.$28 - obSubtype
This byte is like a secondary obID value, so much so that this value is stored next to the ID value in an object's data in the object layout data. It denotes which variation of an object that this instance is. For example, Green Hill Zone's Newtron badnik makes use of this byte to determine whether it is a blue Newtron (which glides along the ground) or a green Newtron (which fires a shot, then disappears).Scrapped OSTs
obSolid: This byte was used in stock Sonic 1 as a status flag for solid objects. S1Fixed does away with this variable completely, following suit with Sonic 2 and Sonic 3K.These OST bytes are shared between boss objects.
$2F - obBoss_AttackFlag
This byte serves as a flag to tell the face sub-object to initiate laughing animation.$30-31 - obBoss_BufferX
This pair of bytes stores the boss' X-axis position, pre-movement.$32-33 - obBoss_BufferY
This pair of bytes stores the boss' Y-axis position, pre-movement.$34-35 - obBoss_DelayTime
This pair of bytes serves as a delay timer for various purposes.$36 - obBoss_FlashFrames
This byte dictates how long the boss' ship should flash when hit. This also tells the face sub-object to display the "hurt" expression.$37 - obBoss_HoverAngle
This byte is fed, similar to an angle, to CalcSine, to determine Y-axis positioning for the hover effect seen in some boss fights, such as Spring Yard Zone's boss.Scrapped OSTs
obBoss_3rdRout: This byte shared the same RAM slot with `obSubtype` (a practice also seen in a select few other objects) and was used in stock Sonic 1 as a tertiary routine counter for some bosses in certain instances. Implementing obAddr allowed for this OST to be removed, with its function being passed over to Ob2ndRout, and the latter's function being passed to obRoutine.obBoss_Parent: In the original game, the sub-objects of the bosses (face, flame, and weapon) had 4 bytes of RAM dedicated to the address of the parent object, tbat being the ship. These sub-objects now only use two bytes for this purpose.
There are a few things to make note of when porting objects to/from S1Fixed, and other engines, especially those built off of Sonic 2 or Sonic 3:
- S1Fixed uses Sonic 2 format sprites (as of the time of writing). Adjustments to certain object mechanics such as crumbling ledges, as well as object sprite mappings, will need to be adjusted accordingly.
- Aspects like Solidity only account for one player character, as opposed to two, like in Sonic 2 or Sonic 3K.
- Objects in RAM are headed by a reference address instead of a single byte ID. Certain aspects like subtypes and routine handling will be different in this engine compared to stock Sonic 1, or even Sonic 2.