the cutting room mirror

ru

This article has a talk page!
view on tcrf.net

Это подстраница статьи Proto:Sonic the Hedgehog 2 (Genesis)/Nick Arcade Prototype.

General Differences#

  • At this point in development, Tails is quasi-independent: Player 2 is able to control Tails, except he will also follow Sonic. Further, Tails cannot complete a level on his own, since the game only loads the signpost when Sonic approaches it. If Tails gets hurt, he can lose rings for Sonic. The AI is also much simpler: Tails copies Sonic's moves and makes no attempt to keep up with him.
  • 2-Player mode is even less complete, due to all sorts of odd glitches and not being enabled for every Zone.
  • Invincibility doesn't show the star effect, though the music is still played. The music and invulnerability last until the end of the Act.
  • There is a mechanic where Sonic rebounds off walls if he runs into them at high speeds, using sprites that became unused by the Simon Wai prototype. The sprite of him getting up would later be polished and reused for when Sonic leaves his "lying on ground" idle animation.
  • The spin dash is a work-in-progress, as Sonic and Tails can only charge it once. Further, the sound for when Sonic spins in Sonic 1 is heard as there is not yet a specific sound effect for the spin dash.
  • The spike damage behavior works the same way it does in Sonic 1.
  • The ground speed cap from Sonic 1 is still present.
  • The explosion sprites are the ones in Sonic 1.
  • Debug mode follows the logic of Sonic 1.
    • Sonic's speed and velocity don't reset when exiting debug.
    • When Sonic is hit without rings, he'll only be knocked back; The only way for him to lose a life is by drowning/falling into a bottomless pit.
      • Sonic cannot enter debug while he is being knocked back.
    • Sonic cannot enter debug when he is in his death animation.
    • Entering and exiting debug while submerged will not reset Sonic's underwater timer.
    • Sonic retains his land speed if entering debug from water, and exiting to land.
    • If Sonic has passed a signpost, entering and exiting debug will not allow the player to regain the ability to control him.
    • Spawned monitors can only be broken once per life/Act.
  • Locking on this prototype with Sonic & Knuckles will unlock the full Blue Sphere game.
  • The timer resets to 9:00 before hitting 9:59, allowing the player to test stages for extended periods.
  • If Sonic and Tails are both hit at the same time while carrying at least one ring, an overabundance of rings will pop out regardless of how many they actually possess.
  • The screen doesn't scroll up or down when you look up or down for a certain period of time.
  • The down-pointing spring has some weird behavior that appears to have been disabled starting with the September 14th build: If Sonic hits such a spring and uses his death sprite for it, he will roll into a ball once he reaches the ground, and can shoot far from a quarter-pipe, stick to flat ground surfaces, and even clip below the floor into his death.

This needs some investigation.
Discuss ideas and findings on the talk page.

Чит-коды#

  • Выбор уровня - Вверх, Вниз, Вниз, Вниз, Вниз, Вверх, A + Start.
  • Режим 2 игроков - В выборе уровня, нажмите B + Start.
  • Режим отладки - C, C, Вверх, Вниз, Вниз, Вниз, Вниз, Вверх, A + Start. Отладка также может быть включена с помощью кода Pro Action Replay FFFFFA:0001. Как и с Sonic 1, только C должен быть нажатым два раза перед последней комбинацией кнопки Вверх.
  • Режим отладки и выбор уровня - Вверх, Вниз, Вниз, Вниз, Вниз, Вверх, ВвВнЛП, Вверх, Вниз, Вниз, Вниз, Вниз, C, C, Вверх, A + Start. "ВвВнЛП" просто означает нажатие любой кнопки в D-Pad'е для сброса кода для обнаружения чита. В отличие от финальной версии, где Режим отладки и All Emeralds могут быть включены проигрывая звуки 19921124126 в Выборе уровня, последняя комбинация Вверх в коде Выбора уровня не должна "накладываться" с первой из кода Режима отладки.

Режим демонстрации#

Nick Arcade - 21 августа 1992

14 сентября 1992 - Бета 4

Бета 5 и позднее

Заглавный экран выглядит по-другому, с частично известным дизайном: оно не только появляется в билде Саймон Вейя, но ещё и в инструкции финальной версии игры, и даже в заглавном экране на версиях для Master System и Game Gear. Вариант, показанный в мануале, идентичен второй картинке сверху.

Демо 1

Демо 2

Watch on YouTube

Watch on YouTube

Демо 3

Демо 4

Watch on YouTube

Watch on YouTube

Игра прокручивает четыре демо: Chemical Plant, Emerald Hill (2P), Hidden Palace и Hill Top. Это станет последним разом того, как новые демо были записаны для этой игры до финального билда; все остальные прототипы используют демо-ввод из этого билда.

Графические изменения#

Соник и Тейлз#

Sonic 1

Nick Arcade/Саймон Вей

21 августа и позднее

Спрайт Соника в билдах Nick Arcade и Саймон Вейя почти идентичен его дизайну в Sonic 1. Его стоящая поза одинаковая, за исключением немного коротких ботинок и добавления блеска на боку его головы. Билд от 21 августа изменяет форму глаз Соника и добавляет немного тени в верхней части глаза.

Nick Arcade/Саймон Вей

21 августа и позднее

Кадр моргания Соника в ранних прототипах не завершён. Это менее похоже на его закрытие глаз и кажется, что его зрачки расположены в самом низу его глаз. В прототипе от 21 августа 1992 года веки приобрели телесный цвет.

Nick Arcade/Simon Wai

August 21 onward

Sonic2SonicLookUpEarly.png Sonic2SonicCrouchEarly.png

Sonic2SonicLookUpFinal.png Sonic2SonicCrouchFinal.png

Дизайн глаз Соника недоделан: в анимации взгляда вверх и приседания было просто добавлено затенение к верхней части глаза, фактически не изменив его форму.

Nick Arcade/Simon Wai

August 21 onward

Анимация ходьбы Соника содержит 12 последовательных кадров анимации в этом прототипе (Simon Wai тоже самое) по сравнению с 8 кадрами, которые можно увидеть в финальном спрайте. Минимальная скорость анимации также вдвое выше, чем в финальной версии игры, и в ней гораздо больше отражается дизайн американского «mohawk».

Nick Arcade/Simon Wai

August 21 onward

Одно из самых простых изменений: в сборках «Ник Аркадий» и Саймон Вай, когда Соник бежит, его туфли и ноги превращаются в мультяшное размытие. В финальной версии это было изменено так, как было в «Sonic 1». Как ни странно, эти ранние спрайты использовались в тизере Sonic 4 — Episode I. Этот тип спрайта позже был повторно использован в «Sonic Mania» всякий раз, когда он или Наклз двигались на полной скорости.

Nick Arcade/Simon Wai

August 21 onward

Анимация заноса Соника здесь совсем другая. Он начинается с нового, уникального начала, а затем повторно использует несколько кадров из «Sonic 1», затем разворачивается и начинает двигаться в другом направлении. Последние два кадра будут повторяться до тех пор, пока Соник либо полностью не остановится, либо не выполнит другое действие. Начало анимации позже было повторно использовано в «Sonic Mania».

Sonic 1

Nick Arcade/Simon Wai

August 21 onward

В оригинальной игре тело Соника двигалось, а руки — нет. В ранних прототипах его руки двигались, но тело оставалось неподвижным. Финальный спрайт перемещает тело и руки в разных кадрах. Как ни странно, на его ботинках оранжевый цвет, потому что спрайты были основаны на спрайтах «Sonic 1» , плюс небольшая ошибка в окраске. Этот оранжевый оттенок был бы самым темным оттенком красного, если бы он был использован в основной палитре первой игры.

Sonic 1

Nick Arcade/Simon Wai

August 21 onward

The balancing animation is just a faster version of the Sonic 1 animation with added head shine and an orange mouth, due to sprites being based off of Sonic 1's sprites plus, just like the pushing animation, an oversight in the sprite's coloring. The final game adds four new balancing animations based on how far Sonic is from the edge and whether or not he's facing the edge.

Nick Arcade/Саймон Вей

21 августа и позднее

Единственным отличием в графиках Тейлза является добавление блеска в спрайте вращения.

Badniks#

Nick Arcade/Simon Wai

August 21st onward

Buzzer's sprite was touched up a bit between the Simon Wai and August 21st builds: Its head was redesigned to be less ant-like, more detail was added to the abdomen, and the jets were straightened out.

Nick Arcade to August 21st

September 14th Prototype

CENSOR onward

Crawl's early sprite (0xA9580 in the ROM) is very different from its final design, lacking any kind of walking animation and only able to put its shield up in one direction.

Other Sprites#

Nick Arcade

Simon Wai onward

Isn't Tails adorable?

All three signposts were originally symmetrical. Only Robotnik's remained that way.

Nick Arcade

Simon Wai onward

At 0xA3C16 is a sprite of what looks like the breakable blocks from Sonic 1. It's so generic that it could have been for any stage, but it's most similar to the Hill Top bricks. These were unused from Sonic 1.

Nick Arcade

Simon Wai onward

At 0xA4368 is a graphic for a fireball. The Hill Top boss in the final game can shoot out fireballs, but those fireballs grow and shrink in size and have three frames of animation. The older sprite would probably be animated like the fireballs in Sonic 1's Marble Zone: Sonic2NickFireball.gif

(Source: Sonic Retro, TCRF original research)

Unused Graphics#

Sonic#

Graphic

Frame ID

Description

Sonic2proto_LookingAtYou.png Sonic2TurnAnim.gif

0A-0B

Unused sprites of Sonic turning. The developers might have intended to have Sonic turn when changing direction instead of instantly facing the other way, or possibly a winning pose similar to Sonic's goal sign in this build.

40-43
4C-4F
58-5B
64-67

Sprites for Sonic moving even faster than normal.

44-47
50-53
5C-5F
68-6B

More sprites for Sonic presumably hitting max speed. Look at him just sticking his head out there. Tails does have a full-speed animation, though the only change is his two tails using only two sprites.

7B-7D

An unused animation of Sonic pulling, or possibly carrying, something. Puzzle elements involving pulling or carrying things may have been planned for.

8B-8C

An unused animation of Sonic balancing on a ledge. This was probably meant to be used when the player was just a few pixels from falling. It looks similar to the on-the-edge balancing animation seen in Sonic the Hedgehog 3.

Other#

Graphic

Offset

Compression

Description

0x27098

None

A background element depicting a cavern obscured by stalagmites (and stalactites), not a weird purple blob. Used in an early version of the Hidden Palace background seen in a mockup screenshot, but not in any real (known) prototype.

Sonic2NickChemAnim.gif Sonic2NickChemBelt.gif

0x27798

None

Animated tiles that aren't loaded in any zone, but seem to match the Chemical Plant level palette pretty well. Source code leftover from an earlier build of Sonic 2 suggests that these were meant to be loaded in VRAM in Chemical Plant Act 3 for the boss. The Chemical Plant boss was referred to as "vacume" in the leftover source code and was removed for some reason, with all its unique code being deleted from this build.

Sonic2NickPropeller.gif Sonic2NickLiquid.gif

0x27DD8

None

More animated tiles using the Chemical Plant palette. There aren't any foreground tile-based propellers or water in the final game.

0xA44A0

Nemesis

What looks like a burning piece of something or other. Early concept art shows a Buzzer-like Bee enemy that could destroy bridges by burning them with fireballs - this could be a remnant of that idea.

0xA4BCE

Nemesis

This is the Hill Top one-way gate. It's identical to the one in the final game, it just hasn't been coded yet.

0xA5826

Nemesis

Graphics for a Hidden Palace object, possibly a floating platform. It's not clear how they would be assembled. A similar object is seen in the 2013 rerelease as an aquatic platform.

0xA59C0

Nemesis

A dissipating cloud, likely meant for the steam springs in Metropolis Zone.

0xA5D9E

Nemesis

The standard Sonic 2 switch has already been drawn and digitized by this point, it just hasn't been coded yet.

0xA8CA0

Nemesis

A spinning metal ball. This was seen in some early concept art - it would act as an obstacle by continuously bouncing around the floor in a high arc. Interestingly code is implemented for this object in the Alpha build. It would bounce in a random direction harming the player if touched, it would change its direction after touching a wall. This can be found in the 2013 rerelease via Debug Mode, though it uses a different palette and explodes once floating above the player's head.

Sonic2BubblerMother.gif Sonic2BubblerMotherProj.gif

0xA8F36

Nemesis

An unfinished badnik named Bubbler's Mother. It would fly around the stage dropping particles on the floor that would turn into Bubblers. These also appear in the 2013 version via Debug Mode. In the August 21st build, code exists for Bubbler's Mother, however the projectiles are unfinished and do not create Bubbler's. According to concept art it was intended for "Chemical Factory Zone", which eventually became Chemical Plant Zone.

0xA9162

Nemesis

The Bubbler dropped by Bubbler's Mother. It would stick to the floor for a bit before exploding into three bubbles. In the August 21st build, unfinished code exists for Bubbler. According to concept art it was intended for "Chemical Factory Zone", which eventually became Chemical Plant Zone.

0xA9580

Nemesis

In Crawl's sprites is what appears to be rocks or clumps of sand. Crawl was originally intended to pop out of the ground with the sand/rocks appearing under it. The idea was likely scrapped after Crawl was repurposed for Casino Night Zone. Interestingly the sprite is used in the August 21st build if Crawl's art is restored. The sand/rocks was also seen in the design sketch for Crawl.

Used

Intended

The BBat badnik uses palette 01, but it looks a bit odd. If it's set to use palette 00 (Sonic and Tails' palette), the ear and flame colors look a lot better. This wasn't fixed in any build of the game before its art and coding were removed from the ROM entirely.

(Source: Sonic Retro, Yawackhary, TCRF original research)

Unused Objects#

Octus#

Sonic2Octus.png Sonic2NAOctusFloating.gif Sonic2NAOctusFiring.png
Object ID: 4A

This badnik appears in Oil Ocean Zone in the final game, though its behavior is slightly different here:

  • In this and the Simon Wai build, it lifts 32 pixels off the ground, fires a single shot at Sonic, then quickly flies to the left or right until it despawns.
  • In all other versions, it will not fly away after firing the bullet, but simply land on the ground and repeat the process.

Stego#

Sonic2StegoWalk.gif Sonic2StegoRun.gif
Object ID: 4D

A triceratops-type badnik that appeared in a mockup screenshot of Hidden Palace Zone. It slowly moves back and forth, and when Sonic approaches it, it activates its thrusters and charges at Sonic like the snail badnik. It is placeable in Hidden Palace through Debug Mode, but its graphics are garbled without using a PAR code.(01C1D8:0007)

Gator#

Sonic2Gator.gif
Object ID: 4E

A crocodile-type badnik, first seen in a mockup screenshot of a scrapped desert Zone, though it's unclear whether this enemy was intended to appear there. It slowly moves back and forth, opening its jaws if it's facing Sonic and is within 64 pixels of him. It is placeable with debug in Hidden Palace Zone, but its graphics are garbled without using a PAR code.

Aquis#

To do:
Get footage of their behaviors.

Sonic2Aquis.png
Object ID: 50, 51

The seahorse badnik from Oil Ocean Zone has two distinct variants, neither of which match how it behaves in the final game.

Object 50 (Seahorse):

  • Moves in a simple path, left to right and back again. The movement range is 16×(lower four bytes of subtype) pixels wide.
  • After 256×(upper four bytes of subtype) frames worth of time has passed, "shooting mode" is toggled. If Sonic approaches the badnik when it's in shooting mode and Sonic is in line of sight, it will fire a single shot, then jump down to Y coordinate 0398. This value seems to be hardcoded.

:* If its initial Y coordinate is greater than 0398, it will slowly move up to 0398. Then, when it fires a shot, it will quickly descend back to its initial Y coordinate.

:* If the upper four bytes of the subtype are 00, the timer is set to FFFF, effectively preventing it from shooting.

:* Note the word "toggled". It's possible for the badnik to go out of shooting mode if enough time has passed.

Object 51 (Skyhorse):

  • Moves like the first Aquis in a set path, but will also track Sonic's Y position up to its original spawn height.
  • A timer counts down for every frame Sonic is in this badnik's line of sight. This is initially set at 180 frames. Once the timer reaches zero, it fires a single shot at Sonic. There's an additional 36 frame delay before the shot timer starts again.
  • Unlike the final game, there's no limit to the amount of bullets this enemy can fire.
  • Sonic2AquisAltBody.gif This uses an alternate body graphic with a rocket instead of a fin. The graphics for this body were removed from its tileset starting in the August 21 prototype, though the mappings would not be updated until the September 14 prototype.

BFish#

Sonic2NickBFish.gif Sonic2NickBFishJump.gif
Object ID: 52

A piranha-type badnik. It will move 32×(lower four bytes of subtype) pixels to the right before leaping, then jump in a high arc. Exactly how it works depends on its initial and current Y positions:

  • If its initial Y position is less than or equal to 0380 (like Aquis, this seems to be hardcoded), it will jump up, then continue falling until it reaches Y coordinate 0380. It will then make jumps from that Y position until it despawns.
  • If its initial Y position is greater than 0380, it will animate more slowly and jump up in a lower arc than usual. Once it reaches its initial Y coordinate, it jumps again.

It is placeable with debug in Hidden Palace Zone, but its graphics are garbled without using a PAR code.

Фонарный столб#

Sonic2LamppostEarly.png Spr_lamppost.gif
ID объекта: 79

Это фонарный столб из первого Соника, который сильно отличается от того, что было показано в релизной версии Соник 2. Его можно поместить при помощи режима отладки в Emerald Hill Zone и Hill Top Zone. Он также появляется в Green Hill'е, но с испорченной графикой.

Неиспользованные субтипы#

= Мониторы
Sonic2MonitorStatic.gif
00:Статический монитор. При разрушении ничего не делает. В финальной версии (где также неиспользован), наносит урон игроку.

Sonic2MonitorEggman.png
03:Монитор с Роботником (ака Эггман). Также ничего не делает в прототипе, и наносит урон в финале, но он используется в режиме на двух игроков

Sonic2MonitorQuestion.png
08:Таинственный монитор. Ничего не делает...в этом билде. В прототипе Саймон Вейя, он активирует палитру Супер Соника, остальные функции активируются позже в прототипе за 21-е августа и Пре-Бета прототипах, до того, как его заменили на монитор с телепортацией в последующих билдах.

Sonic2MonitorSpring.png
09: Spring monitor. Only present in this prototype and the Simon Wai build, but it does nothing when broken. Two guesses on how this would have worked:

  • Like the Pogo Spring monitor in the much later Sonic the Hedgehog Triple Trouble, where it places Sonic/Tails on a pogo spring that bounces up and down until they take damage.
  • Boosted the player's jump height. This would help explain Super Sonic's powers: He's invincible (matching the powerup from the Invincibility monitor) and has increased speed (like the Speed Shoes monitor), but there's no monitor equivalent to his increased jump height.

Chemical Plant Zone Platforms
The code in this version seems to be reused from object 52 in Sonic 1, which was used for the moving blocks in Marble, Labyrinth, and Scrap Brain Zones. Subtypes 02-03 (Marble Zone block that moves right when stepped on, then drops when it hits a solid tile), 04-07 (hidden block in Labyrinth Zone Act 1 activated by switch that leads to the quicker route), and 09-0A (sliding platforms in Scrap Brain Zone) are all unused in this build.

Boss

Watch on YouTube

00: Chemical Plant Zone boss. The code was completely removed and the pointers to it are set to 0. Leftover symbol data call the subobjects "bossvac" and "vacumeguy". Its graphics do remain in the ROM, alongside leftover entries for loading them. However, the code was rediscovered in the August prototype, and can be ported over to the Nick Arcade prototype. With just some small object ID and pointer fixes and restoration of those graphics load entries, it'll work just about right out of the box, as shown in the above video.

The behavior is different to the final, generally having slower movement.

Code Oddities#

  • Somehow, a compression from Kid Chameleon made it into the code, and is even used for Green Hill's chunks!
  • The way the game decides the above is strange. When loading a level, the game checks if the zone ID is specifically 2,3,4 or 5, and if not, it uses the Kid Chameleon decompression. Since Labyrinth Zone(ID 1) uses Chemical Plant's data, this does not match up, resulting in loading improper chunks.
  • The routine to load animated stage tiles lists stages past all the way up to $0F, even though there are only $06 stages (including Sonic 1's ending); this seems the suggest the developers were already shifting the stage IDs around, which is further supported by the fact that Hidden Palace is listed as $08, which is its slot starting with the Simon Wai build onwards.

Список объектов/Исходный код#

Громадный список объектов можно найти внутри ROM'а вместе с исходным кодом.

    addsym
    nolist
    include "equ.lib"
    include "macro.lib"
    list

    xref    colichgpat
    xref    ringpat,itempat,butapat,kanipat,hachipat,togepat
    xref    fishpat,fish2pat,mogurapat,shimapat2,jyamapat
    xref    musipat,sjumppat,kamerepat,arumapat,kagebpat,ballpat
    xref    firepat,fblockpat,signalpat,bobinpat,yoganpat,yogan2pat
    xref    usapat,yadopat,boxpat,bryukapat,daipat,break2pat,yogancpat
    xref    batpat,z5daipat,dai2pat,switch2pat,z4daipat
    xref    elevpat,pedalpat,steppat,funpat,sisoopat,hassyapat
    xref    brobopat,unipat,yaripat,udaipat,dai3pat,kazaripat,kassyapat
    xref    awapat,mizupat,boupat,benpat,fetamapat,mawarupat,hagurumapat
    xref    patapat,yukafpat,nokopat,dai4pat,doorpat,yukaepat,fire6pat
    xref    elepat,yukaipat,scolipat,imopat,savepat,bigringpat,btenpat
    xref    actionsub,actwkchk,frameout,playpat,dualmodesub
    xref    flicpat,usagipat,pengpat,azarpat,fbutapat,niwapat,risupat

    xref    kaitenpat,prodaipat,buranko0dpat
    xref    frntlitpat,gempat,wfallpat,pltfrmpat
    xref    takipat,banepat,dai00pat

    xref    redzpat,bfishpat,seahorsepat,horsepat
    xref    stegopat,wasppat,gatorpat,bbatpat,octpat,wfish2pat,snailpat

    xdef    edit

;------------------------------------------------------------------------------
edit:
    moveq   #0,d0
    move.b  editmode,d0
    move.w  edit_move_tbl(pc,d0.w),d1
    jmp edit_move_tbl(pc,d1.w)
edit_move_tbl:
    dc.w    editinit-edit_move_tbl
    dc.w    editmove-edit_move_tbl
editinit:
    addq.b  #word,editmode
    move.w  scralim_up,editstack
    move.w  scralim_n_down,editstack2
    move.w  #$0000,scralim_up
    move.w  #$0720,scralim_n_down
    andi.w  #$07ff,playerwk+yposi
    andi.w  #$07ff,scra_v_posit
    andi.w  #$03ff,scrb_v_posit
    move.b  #0,patno(a0)
    move.b  #0,mstno(a0)
    cmpi.b  #spgamemd,gmmode
    bne.b   .jump0
*   move.b  #7-1,stageno
*   move.w  #$000,rotspd
*   move.w  #$000,rotdir
    moveq   #7-1,d0
    bra.b   .jump1
.jump0:
    moveq   #0,d0
    move.b  stageno,d0
.jump1:
    lea edittbl,a2
    add.w   d0,d0
    adda.w  (a2,d0.w),a2
    move.w  (a2)+,d6
    cmp.b   editno,d6
    bhi.b   .jump
    move.b  #0,editno
.jump:
    bsr.w   editpatchg
    move.b  #12,edittimer
    move.b  #1,edittimer+1
editmove:
    moveq   #7-1,d0
    cmpi.b  #spgamemd,gmmode
    beq.b   .jump
    moveq   #0,d0
    move.b  stageno,d0
.jump:
    lea edittbl,a2
    add.w   d0,d0
    adda.w  (a2,d0.w),a2
    move.w  (a2)+,d6
    bsr.w   editwalk
*   bsr.w   dirsprset
    jmp actionsub
editwalk:
    moveq   #0,d4
    move.w  #1,d1
    move.b  swdata1+1,d4
    andi.w  #$0f,d4
    bne.b   .jump0
    move.b  swdata1,d0
    andi.w  #$0f,d0
    bne.b   .jump
    move.b  #12,edittimer
    move.b  #$0f,edittimer+1
    bra.w   .lend
.jump:
    subq.b  #1,edittimer
    bne.b   .jump1
    move.b  #1,edittimer
    addq.b  #1,edittimer+1
*   cmpi.b  #255,edittimer+1
    bne.b   .jump0
    move.b  #255,edittimer+1
.jump0:
    move.b  swdata1,d4
.jump1:
    moveq   #0,d1
    move.b  edittimer+1,d1
    addq.w  #1,d1
    swap    d1
    asr.l   #4,d1
    move.l  yposi(a0),d2
    move.l  xposi(a0),d3
    btst.l  #0,d4           *swdata+0
    beq.b   .jump2
    sub.l   d1,d2           *yposi
    bcc.b   .jump2
    moveq   #0,d2
.jump2:
    btst.l  #1,d4           *swdata+0
    beq.b   .jump3
    add.l   d1,d2           *yposi
    cmpi.l  #$7ff0000,d2
    bcs.b   .jump3
    move.l  #$7ff0000,d2
.jump3:
    btst.l  #2,d4           *swdata+0
    beq.b   .jump4
    sub.l   d1,d3           *xposi
    bcc.b   .jump4
    moveq   #0,d3
.jump4:
    btst.l  #3,d4           *swdata+0
    beq.b   .jump5
    add.l   d1,d3           *xposi
.jump5:
    move.l  d2,yposi(a0)
    move.l  d3,xposi(a0)
.lend:
    btst.b  #6,swdata1+0
    beq.b   .jump7
    btst.b  #5,swdata1+1        * c button check
    beq.b   .jump77
    subq.b  #1,editno
    bcc.b   .jump6
    add.b   d6,editno
    bra.b   .jump6
.jump77:
    btst.b  #6,swdata1+1
    beq.b   .jump7
    addq.b  #1,editno
    cmp.b   editno,d6
    bhi.b   .jump6
    move.b  #0,editno
.jump6:
    bra.w   editpatchg
.jump7:
    btst.b  #5,swdata1+1        * c button check
    beq.b   .jump8
    jsr actwkchk
    bne.b   .worknai        ;z=0:ok z=1:no
    move.w  xposi(a0),xposi(a1)
    move.w  yposi(a0),yposi(a1)
    move.b  patbase(a0),actno(a1)
    move.b  actflg(a0),actflg(a1)
    move.b  actflg(a0),cddat(a1)
    andi.b  #$7f,cddat(a1)
    moveq   #0,d0
    move.b  editno,d0
    lsl.w   #3,d0
    move.b  4(a2,d0.w),userflag(a1)
    rts
.worknai:
.jump8:
    btst.b  #4,swdata1+1        * b button check
    beq.b   .jump9
    moveq   #0,d0
    move.w  d0,editmode
    move.l  #playpat,playerwk+patbase
    move.w  #$0780,playerwk+sproffset
    tst.w   dualmode        ; dual mode check
    beq.b   .end
    move.w  #$0780/2,playerwk+sproffset
.end:
    move.b  d0,playerwk+mstno
    move.w  d0,xposi+2(a0)
    move.w  d0,yposi+2(a0)
    move.w  editstack,scralim_up
    move.w  editstack2,scralim_n_down
    cmpi.b  #spgamemd,gmmode
    bne.b   .jump9
*   clr.w   rotdir
*   move.w  #$040,rotspd
*   move.l  #playpat,playerwk+patbase
*   move.w  #$0780,playerwk+sproffset
    move.b  #02,playerwk+mstno
    bset.b  #cd_ball,playerwk+cddat
    bset.b  #cd_jump,playerwk+cddat
.jump9:
    rts
editpatchg:
    moveq   #0,d0
    move.b  editno,d0
    lsl.w   #3,d0
    move.l  0(a2,d0.w),patbase(a0)
    move.w  6(a2,d0.w),sproffset(a0)
    move.b  5(a2,d0.w),patno(a0)
*   move.b  4(a2,d0.w),userflag(a0)
    bsr.w   dualmodesub
    rts

dcblw   macro   \1,\2,\3,\4,\5
    dc.l    (\1)*$1000000+(\2)
    dc.w    (\4)+(\5)*$100
    dc.w    (\3)
    endm

edittbl:
    dc.w    edit1tbl-edittbl
    dc.w    edit2tbl-edittbl
    dc.w    edit3tbl-edittbl
    dc.w    edit4tbl-edittbl
    dc.w    edit5tbl-edittbl
    dc.w    edit6tbl-edittbl
    dc.w    edit7tbl-edittbl
edit1tbl:
    dc.w    14
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   item_act,itempat,$0680,0,$00        ;2:
    dcblw   kani_act,kanipat,$0400,0,$00        ;3:
    dcblw   hachi_act,hachipat,$0444,0,$00      ;4:
    dcblw   fish_act,fishpat,$0470,0,$00        ;5:
    dcblw   toge_act,togepat,$04a0,0,$00        ;6:
    dcblw   shima_act,shimapat2,$4000,0,$00     ;7:
    dcblw   jyama_act,jyamapat,$66c0,0,$00      ;8:
    dcblw   musi_act,musipat,$04e0,0,$00        ;9:
    dcblw   sjump_act,sjumppat,$04a8,0,$00      ;10:
    dcblw   kamere_act,kamerepat,$249b,0,$00    ;11:
    dcblw   kageb_act,kagebpat,$434c,0,$00      ;12:
    dcblw   save_act,savepat,$26bc,0,$01        ;13:
    dcblw   colichg_act,colichgpat,$26bc,0,$00  ;14:

edit2tbl:
edit3tbl:
;zone0d
    dc.w    07
    dcblw   ring_act,ringpat,$26bc,0,$00        ;01:
    dcblw   item_act,itempat,$0680,0,$00        ;02:
    dcblw   sjump_act,sjumppat,$04a8,0,$00      ;03:
    dcblw   colichg_act,colichgpat,$07bc,0,$00  ;04:
    dcblw   kaiten_act,kaitenpat,$e000,0,$00    ;05:
    dcblw   prodai_act,prodaipat,$e418,0,$00    ;06:
    dcblw   buranko_act,buranko0dpat,$2418,0,$08    ;07:

edit4tbl:
;zone00
    dc.w    18
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   item_act,itempat,$0680,0,$00        ;2:
    dcblw   save_act,savepat,$047c,0,$01        ;3:

    dcblw   colichg_act,colichgpat,$26bc,0,$00  ;6:
    dcblw   taki_act,takipat,$23ae,0,$00        ;7:
    dcblw   taki_act,takipat,$23ae,3,$02        ;7:
    dcblw   shima_act,dai00pat,$4000,0,$01      ;8:
    dcblw   shima_act,dai00pat,$4000,1,$0a      ;8:
    dcblw   toge_act,togepat,$2434,0,$00        ;10:
    dcblw   sisoo_act,sisoopat,$03ce,0,$00      ;9:

    dcblw   sjump_act,banepat,$045c,0,$80       ;3: banev
    dcblw   sjump_act,banepat,$0470,3,$90       ;3: baneh
    dcblw   sjump_act,banepat,$045c,6,$a0       ;3: banevr
    dcblw   sjump_act,banepat,$043c,7,$30       ;3: bane45
    dcblw   sjump_act,banepat,$043c,10,$40      ;3: bane45r

    dcblw   wasp_act,wasppat,$03e6,0,$00        ;25   ""    ""
    dcblw   snail_act,snailpat,$0402,0,$00      ;25   ""    ""
    dcblw   wfish2_act,wfish2pat,$041c,0,$00    ;21   ""    ""



    dcblw   redz_act,redzpat,$0500,0,$00        ;20: will change
    dcblw   bfish_act,bfishpat,$2530,0,$00      ;21   ""    ""
    dcblw   seahorse_act,horsepat,$2570,0,$00   ;22   ""    ""
    dcblw   skyhorse_act,horsepat,$2570,0,$00   ;23   ""    ""
    dcblw   stego_act,stegopat,$23c4,0,$00      ;24   ""    ""
    dcblw   wasp_act,wasppat,$032c,0,$00        ;25   ""    ""
    dcblw   gator_act,gatorpat,$2300,0,$00      ;26   ""    ""
    dcblw   bbat_act,bbatpat,$2350,0,$00        ;27   ""    ""
    dcblw   oct_act,octpat,$238a,0,$00      ;28   ""    ""

edit5tbl:
edit6tbl:
edit7tbl:
;zone08
    dc.w    15
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   item_act,itempat,$0680,0,$00        ;2:

    dcblw   bgspr_act,frntlitpat,$e485,3,$21    ;3:
    dcblw   wfall_act,wfallpat,$e415,4,$04      ;4:
    dcblw   break_act,pltfrmpat,$4475,0,$00     ;5:
    dcblw   colichg_act,colichgpat,$26bc,0,$00  ;6:

    dcblw   redz_act,redzpat,$0500,0,$00        ;20: will change
    dcblw   bfish_act,bfishpat,$2530,0,$00      ;21   ""    ""
    dcblw   seahorse_act,horsepat,$2570,0,$00   ;22   ""    ""
    dcblw   skyhorse_act,horsepat,$2570,0,$00   ;23   ""    ""
    dcblw   stego_act,stegopat,$23c4,0,$00      ;24   ""    ""
    dcblw   wasp_act,wasppat,$032c,0,$00        ;25   ""    ""
    dcblw   gator_act,gatorpat,$2300,0,$00      ;26   ""    ""
    dcblw   bbat_act,bbatpat,$2350,0,$00        ;27   ""    ""
    dcblw   oct_act,octpat,$238a,0,$00      ;28   ""    ""

;------------------------------------------------------------------------------
    align
;------------------------------------------------------------------------------
    end


edit2tbl:
    dc.w    25
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   item_act,itempat,$0680,0,$00        ;2:
    dcblw   sjump_act,sjumppat,$0523,0,$00      ;3:
    dcblw   fish2_act,fish2pat,$2486,0,$08      ;4:
    dcblw   mogura_act,mogurapat,$84a6,2,$00    ;5:
    dcblw   yari_act,yaripat,$03cc,0,$00        ;6:
    dcblw   yari_act,yaripat,$03cc,3,$02        ;7:
    dcblw   box_act,boxpat,$43de,0,$00      ;8:
    dcblw   switch2_act,switch2pat,$0513,0,$00  ;9:
    dcblw   toge_act,togepat,$051b,0,$00        ;10:
    dcblw   dai_act,udaipat,$43bc,0,$04     ;11:
    dcblw   dai3_act,dai3pat,$43e6,0,$01        ;12:
    dcblw   dai3_act,dai3pat,$43e6,1,$13        ;13:
    dcblw   dai3_act,dai3pat,$43e6,0,$05        ;14:
    dcblw   kazari_act,kazaripat,$443e,0,$00    ;15:
    dcblw   dai3_act,dai3pat,$43e6,2,$27        ;16:
    dcblw   dai3_act,dai3pat,$43e6,3,$30        ;17:
    dcblw   kassya_act,kassyapat,$03f6,0,$7f    ;18:
    dcblw   uni_act,unipat,$0467,0,$00      ;19:
    dcblw   awa_act,awapat,$8348,19,$84     ;20:
    dcblw   mizu_act,mizupat,$c259,2,$02        ;21:
    dcblw   mizu_act,mizupat,$c259,9,$09        ;22:
    dcblw   bou_act,boupat,$43de,0,$00      ;23:
    dcblw   ben_act,benpat,$4328,0,$02      ;24:
    dcblw   save_act,savepat,$26bc,0,$01        ;25:

*   dcblw   dai4_act,dai4pat,$41f0,4,$80        ;25:
edit3tbl:
    dc.w    18
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   item_act,itempat,$0680,0,$00        ;2:
    dcblw   hachi_act,hachipat,$0444,0,$00      ;3:
    dcblw   toge_act,togepat,$051b,0,$00        ;4:
    dcblw   sjump_act,sjumppat,$0523,0,$00      ;5:
    dcblw   mfire_act,firepat,$0345,0,$00       ;6:
    dcblw   fblock_act,fblockpat,$4000,0,$00    ;7:
    dcblw   myogan_act,yoganpat,$63a8,0,$00     ;8:
    dcblw   yogan2_act,yogan2pat,$63a8,0,$00    ;9:
    dcblw   box_act,boxpat,$42b8,0,$00      ;10:
    dcblw   yado_act,yadopat,$247b,0,$00        ;11:
    dcblw   bryuka_act,bryukapat,$42b8,0,$00    ;12:
    dcblw   dai_act,daipat,$02b8,0,$00      ;13:
    dcblw   break2_act,break2pat,$62b8,0,$00    ;14:
    dcblw   yoganc_act,yogancpat,$8680,0,$00    ;15:
    dcblw   bat_act,batpat,$04b8,0,$00      ;16:
    dcblw   imo_act,imopat,$24ff,0,$00      ;17:
    dcblw   save_act,savepat,$26bc,0,$01        ;18:
edit4tbl:
    dc.w    15
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   item_act,itempat,$0680,0,$00        ;2:
    dcblw   elev_act,elevpat,$4000,0,$00        ;3:
    dcblw   break2_act,break2pat,$44e0,2,$00    ;4:
    dcblw   shima_act,z4daipat,$4000,0,$00      ;5:
    dcblw   pedal_act,pedalpat,$4000,0,$00      ;6:
    dcblw   step_act,steppat,$4000,0,$00        ;7:
    dcblw   fun_act,funpat,$43a0,0,$00      ;8:
    dcblw   sisoo_act,sisoopat,$0374,0,$00      ;9:
    dcblw   sjump_act,sjumppat,$0523,0,$00      ;10:
    dcblw   mfire_act,firepat,$0480,0,$00       ;11:
    dcblw   bgspr_act,hassyapat,$44d8,0,$00     ;12:
    dcblw   brobo_act,brobopat,$0400,0,$00      ;13:
    dcblw   uni_act,unipat,$2429,0,$00      ;14:
    dcblw   save_act,savepat,$26bc,0,$01        ;15:
edit5tbl:
    dc.w    15
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   item_act,itempat,$0680,0,$00        ;2:
    dcblw   toge_act,togepat,$051b,0,$00        ;3:
    dcblw   sjump_act,sjumppat,$0523,0,$00      ;4:
    dcblw   aruma_act,arumapat,$04b8,0,$00      ;5:
    dcblw   signal_act,signalpat,$0000,0,$00    ;6:
    dcblw   bobin_act,bobinpat,$0380,0,$00      ;7:
    dcblw   kani_act,kanipat,$0400,0,$00        ;8:
    dcblw   hachi_act,hachipat,$0444,0,$00      ;9:
    dcblw   yado_act,yadopat,$247b,0,$00        ;10:
    dcblw   shima_act,z5daipat,$4000,0,$00      ;11:
    dcblw   dai2_act,dai2pat,$4000,0,$00        ;12:
    dcblw   switch2_act,switch2pat,$0513,0,$00  ;13:
    dcblw   imo_act,imopat,$24ff,0,$00      ;14:
    dcblw   save_act,savepat,$26bc,0,$01        ;15:
edit6tbl:
    dc.w    29
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   item_act,itempat,$0680,0,$00        ;2:
    dcblw   brobo_act,brobopat,$0400,0,$00      ;3:
    dcblw   uni_act,unipat,$0429,0,$00      ;4:
    dcblw   imo_act,imopat,$22b0,0,$00      ;5:
    dcblw   buranko_act,fetamapat,$4391,2,$07   ;6:
    dcblw   haguruma_act,hagurumapat,$c344,00,$e0   ;7:
    dcblw   dai_act,daipat,$22c0,2,$28      ;8:
    dcblw   switch2_act,switch2pat,$0513,0,$00  ;9:
    dcblw   pata_act,patapat,$4492,0,$03        ;10:
    dcblw   pata_act,yukafpat,$04df,0,$83       ;11:
    dcblw   noko_act,nokopat,$43b5,0,$02        ;12:
    dcblw   break2_act,break2pat,$43f5,0,$00    ;13:
    dcblw   dai_act,daipat,$4460,3,$39      ;14:
    dcblw   dai4_act,dai4pat,$22c0,0,$00        ;15:
    dcblw   door_act,doorpat,$42e8,0,$00        ;16:
    dcblw   dai4_act,dai4pat,$22c0,1,$13        ;17:
    dcblw   noko_act,nokopat,$43b5,0,$01        ;18:
    dcblw   dai4_act,dai4pat,$22c0,1,$24        ;19:
    dcblw   noko_act,nokopat,$43b5,2,$04        ;20:
    dcblw   dai4_act,dai4pat,$22c0,1,$34        ;21:
    dcblw   yukae_act,yukaepat,$44c3,0,$00      ;22:
    dcblw   fire6_act,fire6pat,$83d9,0,$64      ;23:
    dcblw   fire6_act,fire6pat,$83d9,11,$64     ;24:
    dcblw   ele_act,elepat,$047e,0,$04      ;25:
    dcblw   yukai_act,yukaipat,$42f0,0,$00      ;26:
    dcblw   scoli_act,scolipat,$8680,0,$11      ;27:
    dcblw   buta_act,butapat,$2302,0,$04        ;28:
    dcblw   save_act,savepat,$26bc,0,$01        ;29:

*   dcblw   ring_act,playpat,$0780,50,$00       ;28:
*   dcblw   usa_act,usapat,$0448,0,$00      ;5:
*   dcblw   mawaru_act,mawarupat,$4348,16,$00   ;7:

edit7tbl:
    dc.w    02  *13
    dcblw   ring_act,ringpat,$26bc,0,$00        ;1:
    dcblw   ring_act,ringpat,$26bc,8,$00        ;2:
*   dcblw   bobin_act,bobinpat,$0380,0,$00      ;2:
*   dcblw   usagi_act,flicpat,$05a0,0,$0a       ;3
*   dcblw   usagi_act,flicpat,$05a0,0,$0b       ;4
*   dcblw   usagi_act,flicpat,$05a0,0,$0c       ;5
*   dcblw   usagi_act,usagipat,$0553,0,$0d      ;6
*   dcblw   usagi_act,usagipat,$0553,0,$0e      ;7
*   dcblw   usagi_act,pengpat,$0573,0,$0f       ;8
*   dcblw   usagi_act,pengpat,$0573,0,$10       ;9
*   dcblw   usagi_act,azarpat,$0585,0,$11       ;10
*   dcblw   usagi_act,fbutapat,$0593,0,$12      ;11
*   dcblw   usagi_act,niwapat,$0565,0,$13       ;12
*   dcblw   usagi_act,risupat,$05b3,0,$14       ;13

Небольшой интерес вызывает эти строки кода:

   dcblw   redz_act,redzpat,$0500,0,$00        ;20: will change
    dcblw   bfish_act,bfishpat,$2530,0,$00      ;21   ""    ""
    dcblw   seahorse_act,horsepat,$2570,0,$00   ;22   ""    ""
    dcblw   skyhorse_act,horsepat,$2570,0,$00   ;23   ""    ""
    dcblw   stego_act,stegopat,$23c4,0,$00      ;24   ""    ""
    dcblw   wasp_act,wasppat,$032c,0,$00        ;25   ""    ""
    dcblw   gator_act,gatorpat,$2300,0,$00      ;26   ""    ""
    dcblw   bbat_act,bbatpat,$2350,0,$00        ;27   ""    ""
    dcblw   oct_act,octpat,$238a,0,$00      ;28   ""    ""

These lines of code are in the block that makes up Hidden Palace Zone's debug list from an earlier build. The content in the list appears to be identical to the actual compiled version in the ROM; however, it does give us information on the objects in the Zone that may have been previously unknown:

  • Redz is the red T-rex badnik that appears in Hidden Palace.
  • Bfish is the jumping fish badnik that was unused by the Simon Wai prototype.
  • Seahorse is Aquis, the seahorse badnik that was in the final game in Oil Ocean Zone.
  • Skyhorse is most likely the second Aquis object in Hidden Palace's debug list (the version that shoots a harmless projectile).
  • Stego is the triceratops badnik that was unused by the Simon Wai prototype.
  • Wasp is Buzzer, the bee badnik that's in Emerald Hill Zone in all known versions of Sonic 2. In this prototype, it also has a home in Hidden Palace's debug list.
  • Gator is the alligator/crocodile badnik that is unused by the Simon Wai prototype.
  • Bbat is the dive-bombing bat that appears in Hidden Palace Zone.
  • Oct is Octus, the octopus badnik that was in the final game in Oil Ocean Zone.

These same lines are duplicated in the debug list for Emerald Hill, but unused because the game is told that Emerald Hill's debug list will have 18 entries, and the Hidden Palace enemies are all after entry number 18.

This chunk of uncompiled code also indicates that the Zone order present in this build was going to be changed even at this early stage. Emerald Hill's debug list is labeled as Zone 00, which is Green Hill in this build but Emerald Hill in later builds. Similarly, Hidden Palace is labeled as Zone 08, which is where it resides in later builds and the final.

The second set of editXtbl labels seems to correspond with the debug lists of Sonic 1, but doesn't exactly match any extant build. Notably, the edit2tbl and edit6tbl lists have entries prefixed by asterisks, which don't seem to appear in the final game. The asterisked entries in edit7tbl exist in Sonic 1 REV00 only.

Misc. Leftovers/Earlier Versions of Objects#

Inside the ROM, mixed in with the symbol tables and debug mode source code is what appears to be leftover RAM contents from the assembler that includes additional symbols, and also assembled code. What should be noted is that the data is from a previous build, and some objects do indeed have different code.

Emerald Hill Zone Boss#

Watch on YouTubeDifferences include different positioning, a lack of hitbox for the drill, and a weird bobbing movement for the ship's body. The wheels also do not detect floor collision until they fall off the body.

References#


  1. The Supreme Topic of 'Other' Knowledge. - Sonic Retro (пост #11063)↩︎