Sonic 1 on a mobile phone before the iPhone ports. Originally released through the Japan-only Sonic Cafe service (for i-Mode devices) and later given an inferior port to J2ME, split into two parts (except for an obscure North American re-release from EA Mobile; BREW gamers got the one singular game in all regions though).
It seems this version served as the basis for the Game Boy Advance port, Sonic the Hedgehog Genesis, which is generally considered to be the worst port of Sonic 1.
Unused Graphics#
It's worth mentioning that all of the below but Sonic_team_logo.png got rescaled versions for lower resolutions despite their unused status.
This unused Marble Zone UFO frame is in the Genesis original's prototype build, but was removed in the final. It is, however, present in the February 2006 builds of the J2ME game, as part of the zone3.png tileset.
(Source: Sonic Retro)
Jumping into a Giant Ring in the J2ME versions awards you the Chaos Emerald immediately, leaving the "Special Stage" graphic (stored alongside other title card text in Systxt.png) unused.
Sonic_team_logo.png appears in some versions of Part 1 and 2, and likely is an unused logo for the startup sequence.
This logo or its variations are displayed in the corner of the screen in all the known DoJa versions and some of the BREW versions, as well as the Panasonic J2ME (MIDP) release. However, it's also present in various versions of iFone's J2ME port under logo.png, despite all of these versions (and all the derivatives like the American and Asian versions) instead using the "PAUSE" text for the Right Softkey in its place. The high-resolution (240x320) version is shown above.
Uncompiled Source Code#
The Chinese version of Part 2 for the Samsung SGH-D608 has the directory PlatformStandard that only contains the text file Standard.java.bak. Note that the text is slightly cut off at the start.
ckage PlatformStandard;
import java.io.IOException;
//D608
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import javax.microedition.midlet.MIDlet;
import com.samsung.util.AudioClip;
public class Standard {
/** 对应游戏的星级 */
public static final int GAME_STAR_NUM = 0;
/** 是否在菜单中增加更多游戏的标志 */
public static final boolean MENU_MORE_GAME = true;
/** 更多精彩游戏的URL */
public static final String SRT_MORE_GAME_URL = "http://gamepie.g188.net/gamecms/go/jpgd";
private static Image softKeyImg;
private static Image imgBg;
private static int[] softValue = new int[2];
private static boolean openMoreGame = false;
private static boolean pause = false;
private static boolean keyConfirm;
private static boolean keyCancel;
public static void pressConfirm() {
keyConfirm = true;
}
public static void pressCancel() {
keyCancel = true;
}
public static void pause() {
pause = true;
if (splashState == SPLASH_ROLL && sound != null) {
sound.stop();
sound = null;
}
}
public static void resume() {
pause = false;
nowTime = System.currentTimeMillis();
lastTime = nowTime;
timePeriod = 0;
}
public static void menuMoreGameSelected() {
openMoreGame = true;
}
private static void setSoftValue(int lValue, int rValue) {
softValue[0] = lValue;
softValue[1] = rValue;
}
private static void drawSoft(Graphics g, final int SCREEN_W,
final int SCREEN_H) {
if (softKeyImg != null) {
g.setClip(0, SCREEN_H - SOFT_KEY_HEIGHT, SCREEN_W, SOFT_KEY_HEIGHT);
g.drawImage(softKeyImg, 0, SCREEN_H - softValue[0]
* SOFT_KEY_HEIGHT, Graphics.LEFT | Graphics.TOP);
g.drawImage(softKeyImg, SCREEN_W, SCREEN_H - softValue[1]
* SOFT_KEY_HEIGHT, Graphics.RIGHT | Graphics.TOP);
g.setClip(0, 0, SCREEN_W, SCREEN_H);
}
}
private static final int SPLASH_LOAD = 0;
private static final int SPLASH_EVALUATE = 1;
private static final int SPLASH_SOUND = 2;
private static final int SPLASH_ROLL = 3;
private static final int STAR_WIDTH = 25;
private static final int SHOW_STAR_TIME = 2000;
private static final int SHOW_LOGO_TIME = 3000;
private static final int ROLL_TIME_CMCC = 1000;
private static final int ROLL_TIME_SP = 2000;
private static final int ROLL_TIME_CP = 1500;
private static final int ROLL_FAST_DIFF = 800;
private static final int ROLL_SLOW_DIFF = 200;
private static final int ROLL_TIME_CMCC_DES = 100;
private static final int ROLL_RANGE = 2;
private static final int ROLL_RANGE_DES = 5;
private static final int ROLL_GRID_WIDTH = 52;
private static Image gameLogo_img;
private static Image star_img;
private static Image sound_img;
private static final int IMG_CMCC = 0;
private static final int IMG_SP = 1;
private static final int IMG_CP = 2;
private static final int IMG_BG = 3;
private static final int IMG_CMCC_DESCREPTION_WORD_0 = 4;
private static final int IMG_CMCC_DESCREPTION_WORD_1 = 5;
private static final int IMG_ROLLING_EFFECT_0 = 6;
private static final int IMG_ROLLING_EFFECT_1 = 7;
private static final int IMG_ROLLING_EFFECT_2 = 8;
private static Image[] splashImages;
private static final String[] SplashImageName = { "/standard/cmcc.png",
"/standard/sp.png", "/standard/cp.png", "/standard/bg.png",
"/standard/des0.png", "/standard/des1.png", "/standard/roll0.png",
"/standard/roll1.png", "/standard/roll2.png", };
private static int timeCount;
private static int loadCount;
public static final int ROLL_CMCC_DESCREPTION = 0;
public static final int ROLL_LOGO = 1;
public static final int ROLL_END = 2;
private static AudioClip sound;
private static boolean playSound;
private static int rollState;
private static int rollCmccDesPos;
private static boolean rollEffectFlag = false;
private static int[] rollEffectCount = new int[3];
private static int[] rollLogoImgIndex = { IMG_CP, IMG_CMCC, IMG_SP, };
private static int splashState = SPLASH_LOAD;
private static long lastTime;
private static long nowTime;
private static long timePeriod;
public static int execSplash() {
nowTime = System.currentTimeMillis();
timePeriod = nowTime - lastTime;
if (timePeriod > 100)
timePeriod = 100;
int ret = R_SPLASH_WAIT;
if (!pause)
switch (splashState) {
case SPLASH_LOAD:
splashImages = new Image[SplashImageName.length];
setSoftValue(SOFT_NULL, SOFT_NULL);
try {
softKeyImg = Image.createImage("/standard/soft.png");
gameLogo_img = Image.createImage("/standard/gamelogo.png");
sound_img = Image.createImage("/standard/sound.png");
star_img = Image.createImage("/standard/star.png");
splashImages[IMG_CMCC] = Image
.createImage(SplashImageName[IMG_CMCC]);
} catch (Exception e) {
e.printStackTrace();
}
rollCmccDesPos = 0;
rollState = ROLL_CMCC_DESCREPTION;
rollEffectCount[0] = ROLL_TIME_CP;
rollEffectCount[1] = ROLL_TIME_CMCC;
rollEffectCount[2] = ROLL_TIME_SP;
loadCount = 1;
splashState = SPLASH_EVALUATE;
break;
case SPLASH_EVALUATE:
timeCount += timePeriod;
if (loadCount < SplashImageName.length) {
try {
splashImages[loadCount] = Image
.createImage(SplashImageName[loadCount]);
} catch (Exception e) {
e.printStackTrace();
}
loadCount++;
} else if (sound == null) {
try {
// sound = Manager.createPlayer(Runtime.getRuntime()
// .getClass().getResourceAsStream(
// "/standard/sound.mid"), "audio/midi");
sound = new AudioClip(AudioClip.TYPE_MIDI,"/standard/sound.mid");
// sound.realize();
// sound.prefetch();
} catch (Exception e) {
e.printStackTrace();
}
} else if (timeCount >= SHOW_STAR_TIME) {
loadCount = 0;
timeCount = 0;
splashState = SPLASH_SOUND;
setSoftValue(SOFT_YES, SOFT_NO);
}
break;
case SPLASH_SOUND:
if (keyConfirm) {
playSound = true;
splashState = SPLASH_ROLL;
setSoftValue(SOFT_NULL, SOFT_NULL);
ret = R_SPLASH_SOUND_ENABLE;
} else if (keyCancel) {
playSound = false;
splashState = SPLASH_ROLL;
setSoftValue(SOFT_NULL, SOFT_NULL);
ret = R_SPLASH_SOUND_DISABLE;
}
break;
case SPLASH_ROLL:
switch (rollState) {
case ROLL_CMCC_DESCREPTION:
rollCmccDesPos += timePeriod;
timeCount++;
if (rollCmccDesPos > ROLL_TIME_CMCC_DES) {
if (playSound) {
try {
// sound.start();
sound.play(0, 2);
} catch (Exception e) {
e.printStackTrace();
}
playSound = false;
}
rollState = ROLL_LOGO;
}
break;
case ROLL_LOGO:
for (int i = 0; i < 3; i++) {
if (rollEffectCount[i] > 0)
rollEffectCount[i] -= timePeriod;
else
rollEffectCount[i] = 0;
}
if (rollEffectCount[2] == 0) {
rollState = ROLL_END;
}
break;
case ROLL_END:
timeCount += timePeriod;
if (timeCount > SHOW_LOGO_TIME) {
softKeyImg = null;
gameLogo_img = null;
sound_img = null;
star_img = null;
for (int i = 0; i < splashImages.length; i++)
splashImages[i] = null;
splashImages = null;
if (sound != null){
// sound.close();
sound.stop();
}
sound = null;
splashState = SPLASH_LOAD;
System.gc();
ret = R_SPLASH_END;
}
break;
}
break;
}
lastTime = nowTime;
keyConfirm = false;
keyCancel = false;
return ret;
}
public static void drawSplash(Graphics g, final int SCREEN_W,
final int SCREEN_H) {
int half_w = SCREEN_W >> 1;
int half_h = SCREEN_H >> 1;
g.setColor(0x000000);
g.fillRect(0, 0, SCREEN_W, SCREEN_H);
switch (splashState) {
case SPLASH_SOUND:
g.drawImage(sound_img, half_w, SCREEN_H - SOFT_KEY_HEIGHT,
Graphics.HCENTER | Graphics.BOTTOM);
case SPLASH_EVALUATE:
g.drawImage(gameLogo_img, half_w, half_h - 10, Graphics.HCENTER
| Graphics.BOTTOM);
g.drawImage(splashImages[IMG_CMCC], half_w,
half_h, Graphics.HCENTER | Graphics.TOP);
//if(GAME_STAR_NUM != 0)
// for (int i = 0; i < 5; i++) {
// g.setClip(half_w + (i - 1) * STAR_WIDTH - STAR_WIDTH / 2,
// half_h + 10, STAR_WIDTH, 20);
// if (i < GAME_STAR_NUM) {
// g.drawImage(star_img, half_w + (i - 1) * STAR_WIDTH
// - STAR_WIDTH / 2, half_h + 10, Graphics.LEFT
// | Graphics.TOP);
// } else {
// g.drawImage(star_img, half_w + (i - 2) * STAR_WIDTH
// - STAR_WIDTH / 2, half_h + 10, Graphics.LEFT
// | Graphics.TOP);
// }
// }
break;
case SPLASH_ROLL:
g.drawImage(splashImages[IMG_BG], half_w, half_h, Graphics.HCENTER
| Graphics.VCENTER);
switch (rollState) {
case ROLL_CMCC_DESCREPTION:
g.drawImage(splashImages[IMG_CMCC], half_w - ROLL_GRID_WIDTH,
half_h + timeCount * ROLL_RANGE_DES, Graphics.HCENTER
| Graphics.VCENTER);
g.drawImage(splashImages[IMG_CMCC_DESCREPTION_WORD_0], half_w,
half_h + timeCount * ROLL_RANGE_DES, Graphics.HCENTER
| Graphics.VCENTER);
g.drawImage(splashImages[IMG_CMCC_DESCREPTION_WORD_1], SCREEN_W
/ 2 + ROLL_GRID_WIDTH, half_h + timeCount
* ROLL_RANGE_DES, Graphics.HCENTER | Graphics.VCENTER);
break;
case ROLL_END:
case ROLL_LOGO:
rollEffectFlag = !rollEffectFlag;
for (int i = 0; i < 3; i++) {
if (rollEffectCount[i] > ROLL_FAST_DIFF) {
if (rollEffectFlag)
g.drawImage(splashImages[IMG_ROLLING_EFFECT_0],
half_w + ROLL_GRID_WIDTH * (i - 1),
half_h - 9, Graphics.HCENTER
| Graphics.VCENTER);
else
g.drawImage(splashImages[IMG_ROLLING_EFFECT_1],
half_w + ROLL_GRID_WIDTH * (i - 1),
half_h - 9, Graphics.HCENTER
| Graphics.VCENTER);
} else if (rollEffectCount[i] > ROLL_SLOW_DIFF) {
if (rollEffectFlag)
g.drawImage(splashImages[IMG_ROLLING_EFFECT_2],
half_w + ROLL_GRID_WIDTH * (i - 1),
half_h - 9, Graphics.HCENTER
| Graphics.VCENTER);
} else {
int offset = 0;
if (rollEffectCount[i] / 50 == 2)
offset = -ROLL_RANGE;
else
offset = rollEffectCount[i] / 50 * ROLL_RANGE;
g.drawImage(splashImages[rollLogoImgIndex[i]], half_w
+ ROLL_GRID_WIDTH * (i - 1), half_h - 7
+ offset, Graphics.HCENTER | Graphics.VCENTER);
}
}
break;
}
break;
}
drawSoft(g, SCREEN_W, SCREEN_H);
}
public static final int MORE_GAME_LOAD = 0;
public static final int MORE_GAME_SHOW = 1;
public static int moreGameState = MORE_GAME_LOAD;
public static int execMoreGame(boolean openWapAvailable) {
switch (moreGameState) {
case MORE_GAME_LOAD:
try {
softKeyImg = Image.createImage("/standard/soft.png");
imgBg = Image.createImage("/standard/last.png");
} catch (IOException e) {
e.printStackTrace();
}
moreGameState = MORE_GAME_SHOW;
if (openWapAvailable)
setSoftValue(SOFT_OK, SOFT_EXIT);
else
setSoftValue(SOFT_NULL, SOFT_EXIT);
break;
case MORE_GAME_SHOW:
if (openWapAvailable && (keyConfirm)) {
openMoreGame = true;
softKeyImg = null;
imgBg = null;
return R_MOREGAME_EXIT;
} else if (keyCancel) {
softKeyImg = null;
imgBg = null;
return R_MOREGAME_EXIT;
}
break;
}
return R_MOREGAME_WAIT;
}
public static void drawMoreGame(Graphics g, final int SCREEN_W,
final int SCREEN_H) {
g.setColor(0x000000);
g.fillRect(0, 0, SCREEN_W, SCREEN_H);
switch (moreGameState) {
case MORE_GAME_SHOW:
g.drawImage(imgBg, SCREEN_W >> 1, 0, Graphics.HCENTER
| Graphics.TOP);
drawSoft(g, SCREEN_W, SCREEN_H);
break;
}
}
public static void openMoreGameUrl(MIDlet midlet) {
if (openMoreGame)
try {
midlet.platformRequest(SRT_MORE_GAME_URL);
} catch (Exception e) {
e.printStackTrace();
}
}
public static final int R_SPLASH_WAIT = 0;
public static final int R_SPLASH_SOUND_ENABLE = 1;
public static final int R_SPLASH_SOUND_DISABLE = 2;
public static final int R_SPLASH_END = 3;
public static final int R_MOREGAME_EXIT = 0;
public static final int R_MOREGAME_WAIT = 1;
private static final int SOFT_NULL = 0;
private static final int SOFT_YES = 1;
private static final int SOFT_NO = 2;
private static final int SOFT_OK = 3;
private static final int SOFT_EXIT = 4;
private static final int SOFT_KEY_HEIGHT = 17;
}
Unobfuscated Versions#
The following device versions are known to include leftover data from the Java source code in the class files as a result of little-to-no bytecode obfuscation being done before their release. All three versions are phone preinstalls extracted from firmware images.
- Panasonic EB-VS3 (China)
- Sony Ericsson W200i (Europe, Vodafone branded)
- Samsung SGH-U900L (Brazil)
Cheat Menu#
Part 1 and 2#
At the title screen, press 2, 3, 0, 6, 9, 1 (23/06/91, the US/European release date of the original game) to unlock the cheat menu. The cheat code doesn't seem to function in the Chinese releases, the American release or the demo versions.
- INVINCIBILITY - Makes you invincible. Use * to toggle it mid-level.
- UNLOCK LEVELS (February and March 2006 releases of Part 1 only) - Doesn't affect anything in the final version, perhaps the original plan was to only have Green Hill 1 unlocked at the start.
- AMPHIBIOUS (Later releases) - Makes it impossible to drown. Use 0 to toggle it mid-level.
- EMERALDS - Allows you to set the amount of Chaos Emeralds you have.
- FPS - Shows the current number of frames-per-second in the upper-left corner of the screen.
- COORDS - Shows Sonic's coordinates in the upper-right corner of the screen.
- CAMERA - Lets Sonic move in all directions without falling. Use # to toggle it mid-level.
- PLAY ENDING - Plays the good or bad ending depending on the numbers of Chaos Emeralds set. The February 2006 versions of the game do not have this option.
Starting with the May 2006 versions, an in-game debug display is active in the bottom-left if the cheat menu is unlocked, that shows which debugging features are currently active.
(Source: Claxon (developer; cheat information), Umbreon (reversing), TwoSpacesSG (version research))
Panasonic preinstalled release (J2ME)#
A free camera mode can only be activated by changing the variable debugFlag (in MainCanvas) to true. This can be done using KEmulator - while the game is on the title screen, open the "Watches" window, in "Classes" select "MainCanvas", enable "Filter" and search for "debugFlag", then double-click it and change it to "true", and start the game.
(Source: Umbreon)
MIDI Oddities#
Three different MIDI mixes are present across versions of this game that use standard MIDI files. These are the "Sega Mobile mix", the "iFone mix" and the "EA Mobile/Sega Asia mix", roughly named after versions they appear in. In addition, DoJa versions use .MLD tracks (Faith i-Melody), certain J2ME MIDP versions (Panasonic preinstall and Part 1 for Samsung SGH-D500) use .MMF tracks (Yamaha SMAF) and low-end J2ME MIDP versions for Nokia Series 40 use .OTA monophonic ringtones.
Sega Mobile MIDI oddities#
These MIDI files are present in versions released on the BREW by Sega Mobile. Various tracks in these versions have an error in which the first note is played using the Piano 1 instrument because the first notes are placed before the Program Change commands.
iFone MIDI oddities#
These MIDI files are present in versions released on the J2ME MIDP by iFone/Glu Mobile, and in J2ME MIDP versions developed by Brizo Interactive for Sega Mobile and EA Mobile. Some of the tracks have PsmPlayer text messages at the start of the MIDI data, implying that this freeware program was used to convert the MLD tracks from the DoJa version to MIDI.
Oddly, the tracks in Sonic the Hedgehog 2 (DoJa, J2ME, BREW) that are based on Sonic 1 tracks appear to be reused from the "iFone mix", but the new tracks such as the Zone themes in that game have more in common with the "Sega Mobile mix", with the same first note error making a reappearance.
EA Mobile and Sega Asia MIDI oddities#
It's unclear why is there a third MIDI mix in the BREW versions from EA Mobile and from the Asian releases of Part 1. The MIDI files are not exactly the same with the volume being lower in the latter, but it's clear that those were made from the same base.
Revisional Differences#
Overview#
- This port was originally released in Japan on DoCoMo phones that supported the DoJa platform, at least some of these versions have sound effects and special stages. Several versions of the DoJa (i-Mode) release are dumped, however, they require Labyrinth Zone's level data onward to be downloaded from a now-dead server.
- In 2006, iFone finished the MIDP (Western J2ME) port for the European release, in which the special stages and the sound effects had to go likely due to phones' hardware/software limitations as well as the slightly rushed nature of the port. Of course, the J2ME release was also split into two parts. Because of Glu Mobile's acquisition of iFone around that time, Part 2 and later versions of Part 1 were released under the Glu Mobile brand as opposed to iFone.
- Certain Panasonic phone models in Europe and China had a special MIDP version of the game from 2005 preinstalled in a singular part. This version appears to be a different port of the DoJa version, and it uses unique Yamaha SMAF (.MMF) renditions of the soundtrack.
- For the most low-end phones, iFone wrote a simpler Sonic gameplay engine that has a closer resemblance to the 8-bit titles. Interestingly, the .PAK format for data storage in these is shared with various other games published by Glu Mobile.
- Part 2 received several low-end versions seemingly developed and only released in China, seemingly using the same game framework as The House of the Dead: Nightmare.
- It appears that Sega Mobile commissioned the company Brizo Interactive to develop altered versions of iFone's port for North America. A singular version (for 176x220 Motorola from 2006) of this release has been found, and differences can be seen in menu navigation and text.
- A demo of the US version of Sonic the Hedgehog in one part for J2ME from the EA Mobile re-release is dumped, but not any of the full versions.
- Tectoy Mobile released Brizo Interactive's version in Latin America. A demo of Part Two for preinstallation on Samsung phones is dumped.
- Several versions are dumped of the Asian J2ME release from 2007, which only credits Sega Corporation, and none of the porting companies.
- Various North American BREW versions are dumped, both from Sega Mobile's original release and EA Mobile's re-release. The latter features various changes such as a different MIDI mix of the soundtrack.
- The low-resolution versions for BREW (128x128 and 128x160) feature rather interesting simplified tilesets, as well as lowered FPS and the lack of water slowdown in Labyrinth Zone.
- Last but not least, the DoJa version was released in Europe by Zenops under the title Sonic the Hedgehog: Contest Version. This version is not dumped and therefore will not be covered by this article.
(Source: TwoSpacesSG, Umbreon (most research in this section))
J2ME (MIDP) versions#
August 2005 (Panasonic preinstalled release)#
This version is a different port of the DoJa version compared to versions that were later released digitally by iFone. Nevertheless, there are major similarities. Some of the notable differences include:
- All music is in the Yamaha SMAF format (.MMF). The only other dumped version with this distinction is Part 1 for Samsung 176x220 phones, which has different MMF mixes.
- The optional quest to get the Chaos Emeralds has been entirely excluded, with the Giant Rings never making their appearance. However, the graphics and music for the special stages are there, unused.
- Despite still using prototype assets (such as the flowers in Green Hill and lights in Spring Yard), the tall mountain in Green Hill no longer has blue pixels underneath. This fix was strangely undone in iFone's releases.
February 2006 (iFone's first builds)#
From the looks of things, iFone finished their first J2ME (MIDP) versions for a couple of models throughout February 2006 (and slightly towards the beginning of March). It seems as though versions for other models were finished later on, and some updated versions for models already covered may have also been released.
3 versions from the February 2006 batch are preserved: v1.0.12 Build 3805 (Sony Ericsson, 176x220), v1.0.22 Build 4283 (Motorola Triplets, 176x204) and v1.0.22 Build 4308 (Motorola V3x, 240x299). While the Motorola Triplets version is for a device with the 176x220 screen resolution, it uses the smaller graphical set from the 128x128 and 128x160 versions as well as a reduced game screen size, likely due to hardware limitations.
March 2006#
iFone releases an update that makes the game more polished.
- Changed audio: Boss theme (Feb 2006 versions are strangely the only ones to feature the intro part), Marble Zone theme (better looping).
|
bossstage.mid (Feb 2006) |
bossstage.mid (Later Versions) |
|---|---|
|
marble_loop.mid (Feb 2006) |
marble_loop.mid (Later Versions) |
|---|---|
- Added audio: all Zone intro sections (Feb 2006 versions had none), the score.mid sound effect ("cash register"), the sega.amr speech (forum post by a former iFone developer suggests that copyright reasons were why it was originally excluded).
- Changed graphics: hachi.png (shifted around the Buzz Bomber), ring.png (one more animation frame added to the ring), zone3.png (the UFO mysteriously removed from the Marble Zone tileset).
- Added graphics: landscape.png (the ending scene foreground).
- The title screen mistakenly uses the second-to-last frame of animation for Sonic in the February versions, in which Sonic is smiling as opposed to frowning. In addition, the title graphic is misaligned by a few pixels compared to the "mask" graphic, making it look like it has a red drop-shadow. This was all fixed in the March versions.
|
Feb 2006 (Sony Ericsson, 176x220) |
Mar 2006 (Nokia s60v2, 176x208) |
|---|---|
|
|
|
- The Zone title cards are misaligned on the stage select screen in the February versions. The "act" graphic is also not displayed correctly. Fixed in the March versions.
|
Feb 2006 (Sony Ericsson, 176x220) |
Mar 2006 (Nokia s60v2, 176x208) |
|---|---|
|
|
|
- Sonic appears to be much faster in the air in the February versions than in any later releases.
- The time taken for the time bonus to pass depends on how large the time bonus is in the February versions, much like in the original game. This seems to have been changed so that the time taken is always the same in the March versions, possibly because in some long stages, holding 5 upon finishing the stage would cut off the act clear jingle.
- Defeating a boss in the February versions doesn't resume the stage music, unlike the original game or the March versions.
- March versions added the object graphics to the help screen.
May 2006#
iFone finishes a larger batch of versions in May of 2006. These versions have a revamped language system. The useless "Unlock Levels" cheat was replaced by "Amphibious" in preparation for the release of Part 2.
The Samsung 176x220 version released in May is interesting, as it's a midlet suite, and each Zone is a separate midlet.
June 2006 (Samsung SGH-D900 Demo)#
Only one digital version from the June batch is preserved, and it's for Nokia 240x320 phones. It's one of the earlier versions to bear the Glu Mobile name. Starting with the June batch, the help and credits screens are glitched due to an off-by-one error.
June 2006 also saw the first build (Samsung SGH-D900) of the preinstalled demos for Samsung phones released in Europe, with the company M-Biz Global being credited for programming the demo wrapper. This version starts out as a demo that takes you through a single act of Green Hill and a tiny bit of Marble before asking you to buy the game or go back. Buying the game writes a save file and unlocks the full version.
Oh wait, have we mentioned the absolutely genius activation procedure?
Okay, so, the game generates the unlocking code randomly on first launch (so there's not really a way to borrow it from someone else, sorry to disappoint). When you confirm to send the message to the premium number, it sends a message with the code, which is then followed by the number sending you back that same code, which you then enter into the window. If that's not inventive, we don't know what is.
July 2006 (Part 2's initial release)#
Glu Mobile finishes Part 2. The Nokia s60v2 (176x208) version has some interesting debug prints.
August 2006 (Nokia and Sony Ericsson Demo)#
August saw the release of what appears to be the first demo made by Glu Mobile for phone manufacturers and carriers without M-Biz Global's involvement. Several of those have been made over the coming years, and they appear to follow the same formula, which is that they let you play Act 1 of Green Hill and ask you to buy the full game from a now-defunct store. At least some of these demos feature a screen with unique artwork at the end of the demo (pictured here is the version preinstalled on Sony Ericsson K810i and some other models from certain carriers). The screen shows a phone with iFone's logo on-screen, even though the actual game displays the Glu Mobile logo at startup.
September 2006 (American version)#
Brizo Interactive finishes the American version for Sega Mobile. The preserved version for Motorola (176x204) has some differences compared to the European version:
- The "Enable Sound?" screen was added, making it more similar in this regard to many other J2ME games.
- Two (!) loading bars are present on act intro screens, which make the game load slower than it does otherwise.
- There are noticeable text changes, such as "SONIC HAS PASSED" being replaced with "COMPLETED".
- Green Hill Zone theme is different:
|
greenhill_intro.mid (EU) |
greenhill_intro.mid (US, Motorola) |
|---|---|
|
greenhill_loop.mid (EU) |
greenhill_loop.mid (US, Motorola) |
|---|---|
December 2006 (Samsung SGH-E390 Demo)#
This demo introduces M-Biz Global's newer version of the wrapper to this game. While the previous one was LCDUI-based (drawing everything using the phone's built-in interface forms), this one is more fancy and has its own Canvas rendering of the GUI. The game itself in the Samsung preinstalled versions gained a very incomplete Russian translation in which almost all of the text is still in English.
Later device versions with this wrapper introduced an amusing backdoor: sideloading the game with the custom app property FullVersion: true unlocks the full game right off the bat.
January 2007#
Glu Mobile finishes a new batch of Part 2 versions, two of which are preserved.
April 2007 (Asian versions)#
The Asian versions of Part 1 are done. These versions only have a "Sega Corporation" credit in the intro and the credits screen. The preserved Asian versions of Part One for Nokia phones use the "EA Mobile and Sega Asia mix" of the game's soundtrack.
The After Years#
Glu Mobile kept going, but obviously, not as much has been happening afterwards.
- 2008: Tectoy Mobile finishes the Samsung SGH-U900L demo of Part Two. There are also a lot of Spanish demos of the Nokia and Sony Ericsson variety that are finished this year.
- Early 2009: The UK carrier Three releases Sony Ericsson C903 with a full version of Part One paywalled using the ALW wrapper (not to be confused with the ALW1/ALW2 wrapper), similar to what Samsung and M-Biz Global have been doing earlier.
- Mid-Late 2009: Glu Mobile finishes the Nokia 360x640 version in June 2009 and a Samsung 240x320 version in September. These have text changes in the pause menu: "BACK TO TITLE" was changed to "QUIT".
References#
- Tec Toy investe no mercado de jogos para celular "Tec Toy invests in the mobile phone game market" - Folha de S.Paulo, July 3, 2006↩︎