The current URL is datacrystal.tcrf.net.
Speedy Blupi 2/RAM map
The following article is a RAM map for Speedy Blupi 2.
Italicized names are speculative; non-italicized names directly match the Planet Blupi source code.
Globals
This section compares addresses for various versions of the game. For the sake of comparison, this includes Speedy Blupi 1 as well.
- SB2 - Speedy Blupi 2 version 2.2 (as available on blupi.org)
- SE2 - Speedy Eggbert 2 version 1.0
- SB - Speedy Blupi 1 version 1.0 (as available on blupi.org)
- SE - Speedy Eggbert 1 version 1.0 or 1.1
| Address | Datatype | Symbol | Info | |||
|---|---|---|---|---|---|---|
| SB2 | SE2 | SB | SE | |||
| 435030 | 436030 | 42e030 | 42d030 | int | g_speedRate | How many iterations of events are processed in one frame. Default is 1. Multiplicative with CEvent.m_speed |
| 435034 | 436034 | 42e034 | 42d034 | int | g_timerInterval | Target frame time in milliseconds. Default is 50 ms (20 fps) |
| 435038 | 436038 | 42e038 | 42d038 | int | g_mouseType | |
| 43503c | 43603c | 42e03c | 42d03c | UINT | g_lastPhase | |
| 4352a0 | 436298 | BOOL | g_bDebug | Enables debug output related to DirectDraw, except OutputDebug is stubbed in all release builds. So this does nothing. | ||
| 48a3c8 | 48eae8 | char[260] | g_CDPath | MAX_PATH is 260 | ||
| 48a4cc | 48ebec | |||||
| 48a4d0 | 48ebf0 | |||||
| 48a4d4 | 48ebf4 | |||||
| 48a4d8 | 48ebf8 | CEvent * | g_pEvent | Event handler | ||
| 48a4dc | 48ebfc | CPixmap * | g_pPixmap | Graphics handler | ||
| 48a4e0 | 48ec00 | CSound * | g_pSound | Sound handler | ||
| 48a4e4 | 48ec04 | CNetwork * | g_pNetwork | Netplay handler | ||
| 48a4e8 | 48ec08 | CMovie * | g_pMovie | Video playback handler (leftover) | ||
| 48a4ec | 48ec0c | CDecor * | g_pDecor | Gameplay handler | ||
| 48a4f0 | 48ec10 | BOOL | g_bFullScreen | |||
| 48a4f4 | 48ec14 | BOOL | g_bBenchmarkSuccess | Whether the PC is deemed strong enough for 16-bit graphics. | ||
| 48a4f8 | 48ec18 | BOOL | g_bTrueColor | |||
| 48a4fc | 48ec1c | BOOL | g_bTrueColorDecor | |||
| 48a500 | 48ec20 | BOOL | g_bCDAudio | If TRUE, forego all MIDI playback and instead play the corresponding track on an audio CD. (unused) | ||
| 48a504 | 48ec24 | int | g_benchmark | The numeric result of the performance benchmark (seemingly measured by the number of images drawn within a time interval?) | ||
| 48a508 | 48ec28 | |||||
| 48a50c | 48ec2c | BOOL | g_bActive | Whether the application window is focused. | ||
| 48a510 | 48ec30 | BOOL | g_bTermInit | TRUE when the application is done initializing.
FALSE when starting up (loading graphics, doing benchmark, etc). | ||
CEvent class
The CEvent class is a singleton that covers overarching systematic functionality, e.g. functionality of each individual menu screen. Comparable to the CEvent class in Planet Blupi, with a handful of changes.
| Address | Datatype | Symbol | Info | |
|---|---|---|---|---|
| Blupi | Eggbert | |||
| 0004 | int | m_joyID | DInput device ID for joystick | |
| 041C | int | m_gamer | Currently selected player file index; [1..8] | |
| 0420 | int | m_textHiliStart | Index of first highlighted character in text input box | |
| 0424 | int | m_textHiliEnd | Index of last highlighted character in text input box | |
| 0428 | int | m_textCursorIndex | Position of text cursor in text box | |
| 042c | char[100] | m_textInput | Text input box contents | |
| 0490 | char[100] | m_playerName | Current player file name | |
| 0904 | char[100][256] | m_filenameBuffer | Buffer for custom level filenames in C:\User. Only the first 100 files are shown. | |
| 6d04 | ||||
| 6d08 | ||||
| 6d0c | int | m_userDirectoryIndex | ||
| 6d10 | ||||
| 6d14 | int | m_lives | Number of extra lives | |
| 6d18 | int | m_speed | How many iterations of events are processed in one frame. Default is 1. F5/F6 keys toggle between 1x and 2x. Multiplicative with g_speedRate | |
| 6d1c | int | m_mission | ||
| 6d20 | int | m_private | ||
| 6d24 | int | m_multi | ||
| 6d28 | int | m_phase | ||
| 6d2c | int | m_index | ||
| 6d30 | ||||
| 6d34 | ||||
| 6d38 | BOOL | m_bPrivate | ||
| 6d3c | BOOL | m_bMulti | ||
| 6d40 | BOOL | m_bAccessBuild | Whether the XMISSION (xnjttjpo) cheat is enabled, allowing the player to edit the singleplayer campaign. | |
| 6d44 | ||||
| 6d48 | m_mouseType | |||
| 6d4c | HINSTANCE | m_hInstance | ||
| 6d50 | HWND | m_hWnd | ||
| 6d54 | CPixmap * | m_pPixmap | ||
| 6d58 | CDecor * | m_pDecor | ||
| 6d5c | CSound * | m_pSound | ||
| 6d60 | CNetwork * | m_pNetwork | ||
| 6d64 | CMovie * | m_pMovie | ||
| 6d68 | char[260] | m_movieToStart | Filename of the currently loaded AVI file. MAX_PATH is 260. (leftover) | |
| 6d6c | int | m_phaseAfterMovie | Which Phase to switch to after AVI playback is done. | |
| 6d70 | Button[40] | m_buttons | Menu buttons on the current screen. | |
| 9494 | int | m_input | Bitmap of current player input. If a demo is running, this represents the input of the demo. | |
| 9860 | POINT | m_oldMousePos | ||
| 98c0 | POINT | m_posToolTips | Screen coordinates of the currently visible UI tooltip. | |
| 98c8 | char[50] | m_textToolTips | Current UI tooltip text. | |
| 992c | int | m_mouseSprite | ||
| 9930 | BOOL | m_bWaitMouse | ||
| 9934 | BOOL | m_bHideMouse | ||
| 9938 | BOOL | m_bFillMouse | ||
| 993c | BOOL | m_bShowMouse | ||
| 9940 | int | m_tryPhase | ||
| 9944 | int | m_rankCheat | Which cheat the player is currently typing. Since every cheat begins with a unique letter, any given input can only correspond to one cheat. | |
| 9948 | int | m_posCheat | ||
| 9964 | BOOL | m_bDemoRec | TRUE if a demo is being recorded. | |
| 9968 | BOOL | m_bDemoPlay | TRUE if a demo is being played back. | |
| 996c | DemoEvent * | m_pDemoBuffer | Pointer to the currently processing demo event | |
| 9970 | int | m_demoTime | Demo playback frame counter | |
| 9974 | int | m_demoIndex | The index of the current input event in the demo | |
| 9978 | int | m_demoEnd | ||
| 997c | int | m_demoNumber | The index of the currently playing demo in the queue. | |
| 9980 | ||||
| 9984 | ||||
| 9988 | char[100][5] | m_chatZone | Netplay chat log buffer. | |
| 9b7c | char[100] | m_text | Currently active tutorial text. | |
CDecor class
The CDecor class is a singleton that covers everything in the physical game world. Drastically modified with little resemblance to Planet Blupi's CDecor.
| Address | Datatype | Symbol | Info | |
|---|---|---|---|---|
| Blupi | Eggbert | |||
| 00000 | HWND | m_hWnd | ||
| 00004 | CSound * | m_pSound | ||
| 00008 | CPixmap * | m_pPixmap | ||
| 0000c | CNetwork * | m_pNetwork | ||
| 00010 | short[100][100] | m_objects | The grid of square tiles that makes up the physical world. | |
| 04e30 | short[100][100] | m_explos | The grid of square tiles that make up the decorative middleground layer. | |
| 09c50 | byte[100][13] | m_gluePaths | A bitmapped grid of the world, which gets invisibly "painted" by glue projectiles. This serves to invalidate respawn points which are considered "unsafe". | |
| 0a164 | byte[100][13] | m_gluePaths2 | i dont know why there are 2 of them | |
| 0a678 | Perso[200] | m_persos | Array of entity slots ("personnages"). | |
| 0cbf8 | int | m_input | Bitmap of player input. | |
| 0cbfc | int | m_previousInput | Previous frame's m_input | |
| 0cc00 | POINT | m_cameraPos | The world coordinates of the camera view | |
| 0cc08 | POINT | m_worldDims | Dimensions of the world in cells. Any nonzero value is hardcoded to be treated as 100. A value of 0 represents a lack of scrolling in that dimension. | |
| 0cc10 | POINT | m_selectedCelPos | Position of the currently selected cell. Only effective in level editor. | |
| 0cc18 | ||||
| 0cc1c | ||||
| 0cc20 | ||||
| 0cc24 | UINT | m_phase | Current phase | |
| 0cc28 | int | m_targetMission | The level ID to be entered after the current level transition. | |
| 0cc2c | int | m_music | Level BGM index | |
| 0cc30 | int | m_region | Level background image | |
| 0cc34 | ||||
| 0cc38 | ||||
| 0cc3c | int | m_time | ||
| 0cc40 | char[100] | m_missionTitle | Current level title. Only apparent for custom levels, but still present (usually empty) for campaign levels. | |
| 0cca4 | ||||
| 0cca8 | int | m_nbCases | Number of entity slots occupied by pushable wooden cases [crates]. | |
| 0ccac | int[200] | m_caseIndexes | Array of entity ID's which contain crates. | |
| 0cfcc | int | m_nbSomethings | Number of entity slots occupied by something unknown. | |
| 0cfd0 | int[200] | m_somethingIndexes | Array of entity ID's which contain something unknown. | |
| 0d2f0 | POINT | m_pos | Blupi's position in world space | |
| 0d2f8 | POINT | m_safePos | The primary safe position to respawn Blupi | |
| 0d300 | int | m_action | The current action performed by Blupi. | |
| 0d304 | int | m_direction | The direction Blupi is facing.
| |
| 0d308 | int | m_actionTime | How many frames Blupi has been in his current action. | |
| 0d30c | POINT | m_velocity | Blupi's current velocity. X velocity is only effective with vehicles/transformations and underwater. Y velocity is ineffective when grounded. In many cases, Y velocity is multiplied by 2 before applying to Blupi. | |
| 0d314 | int | m_blupiIcon | Blupi's current frame of animation. | |
| 0d318 | ||||
| 0d31c | int | m_blupiChannel | The graphics file ("channel") of Blupi's current animation. | |
| 0d320 | POINT | m_activeConveyorVelocity | Additional velocity applied to Blupi by a conveyor belt lift entity. To verify: does this also cover lifts in general? | |
| 0d328 | int | m_activeLiftIndex | Entity ID of the lift Blupi is standing on. -1 for none. | |
| 0d32c | BOOL | m_bPlayerHasControl | Whether the player can move Blupi. | |
| 0d330 | BOOL | m_bIsFalling | Whether Blupi is airborne. | |
| 0d334 | BOOL | m_bHelicopter | Whether Blupi is driving the helicopter. | |
| 0d338 | BOOL | m_bHovercraft | Whether Blupi is driving the hovercraft. | |
| 0d33c | BOOL | m_bJeep | Whether Blupi is driving the jeep. | |
| 0d340 | BOOL | m_bTank | Whether Blupi is driving the tank. | |
| 0d344 | BOOL | m_bSkateboard | Whether Blupi is riding the skateboard. | |
| 0d348 | BOOL | m_bInDeepWater | Whether Blupi is submerged underwater. | |
| 0d34c | BOOL | m_bInSurfaceWater | Whether Blupi is treading at the water's surface. | |
| 0d350 | BOOL | m_bInWind | Whether Blupi is in wind. | |
| 0d354 | BOOL | m_bIsHangingFromBar | Whether Blupi is hanging onto a bar. | |
| 0d358 | BOOL | m_bHeadache | If TRUE, Blupi hit his head too hard and will play a pain animation upon landing. | |
| 0d35c | BOOL | m_bShield | Whether Blupi has a shield. | |
| 0d360 | BOOL | m_bLollipop | Whether Blupi has a speed boost from eating a lollipop. | |
| 0d364 | BOOL | m_bPowercharge | Whether Blupi has a power aura from a recharging device. | |
| 0d368 | BOOL | m_bInvisible | Whether Blupi is under the effect of an invisibility potion. | |
| 0d36c | BOOL | m_bInverter | Whether Blupi's controls are inverted due to an inverter. | |
| 0d370 | BOOL | m_bWaspSting | Whether Blupi is under the effect of a wasp sting. | |
| 0d374 | BOOL | m_bCrushed | Whether Blupi is flattened by a crusher. | |
| 0d378 | ||||
| 0d37c | ||||
| 0d380 | ||||
| 0d384 | ||||
| 0d388 | BOOL | m_bUseSafePosition | Whether to use a safe respawn position. Probably FALSE when level starts and no points exist. | |
| 0d38c | BOOL | m_bIsTerminating | If TRUE, Blupi is exiting the level. | |
| 0d390 | int | m_glue | Blupi's current stock of glue ammunition. | |
| 0d394 | int | m_keys | Bitmap of Blupi's currently held keys. | |
| 0d398 | int | m_personalBombs | Blupi's current stock of team-specific bombs. | |
| 0d39c | int | m_dynamite | Blupi's current stock of dynamite. (To verify:) Not a BOOL, despite being capped at 1. | |
| 0d3a0 | ||||
| 0d3a4 | int | m_powerEnergy | Amount of energy remaining for Blupi's current transformation/powerup. If multiple are active, their energy drain is stacked. | |
| 0d3a8 | ||||
| 0d3ac | ||||
| 0d3b0 | ||||
| 0d3b4 | int | m_queuedActionFrames | ||
| 0d3b8 | int | m_queuedAction | Which action to play when Blupi comes to a stop. | |
| 0d3bc | int | m_nbSafePositions | Number of safe respawn points available. | |
| 0d3c0 | POINT[13] | m_safePositions | ||
| 0d428 | ||||
| 0d440 | BOOL | m_bMulti | If TRUE, the current game is a multiplayer deathmatch game. | |
| 0d444 | int | m_team | Which team the player is on for multiplayer purposes. Only apparent when m_bMulti==TRUE, otherwise appears yellow. However, team affiliation is still effective in singleplayer, affecting the behavior of personal bombs.
| |
| 0d534 | SoundEvent[20] | m_soundEvents | Array of currently active sound events. | |
| 0d5d4 | ||||
| 0d5d8 | ||||
| 0d5dc | ||||
| 0d5e0 | char[5][100] | m_infoTexts | Text buffer for informational popups in the top-left corner of gameplay, mostly for multiplayer events. | |
| 0d7d4 | int | m_air | Amount of air remaining while swimming. | |
| 0d7d8 | int | m_energy | Unused. Always 100. Only accessed when quicksaving/loading. Name is entirely speculative. | |
| 0d7dc | BOOL | m_bHelicopterFlying | Whether Blupi is airborne in a helicopter. | |
| 0d7e0 | BOOL | m_bHelicopterStationary | Whether Blupi is grounded in a helicopter. | |
| 0d7e4 | BOOL | m_bCarMoving | Whether Blupi is moving in a car-like vehicle. | |
| 0d7e8 | BOOL | m_bCarStationary | Whether Blupi is idling in a car-like vehicle. | |
| 0d7ec | BOOL | m_bWorldComplete | ||
| 0d7f0 | BOOL | m_bPrivate | If TRUE, the current level is a user level and does not save progress to the player file. | |
| 0d7f4 | BOOL | m_bAllMissions | Whether the OPENDOORS cheat is active. | |
| 0d7f8 | BOOL | m_bInvincible | Whether the MEGABLUPI cheat is active. | |
| 0d7fc | BOOL | m_bShowSecret | Whether the SHOWSECRET cheat is active. | |
| 0d800 | BOOL | m_bAccessBuild | Whether the XMISSION (xnjttjpo) cheat is active. | |
| 0d804 | BOOL | m_bNetPacked | Whether the NETPACKED cheat is active. | |
| 0d808 | BOOL | m_bNetMovePredict | Whether the YNOSMOOTH cheat is inactive. | |
| 0d80c | BOOL | m_bNetDebug | Whether the ZNETDEBUG cheat is active. | |
| 0d810 | ||||
| 0d814 | ||||
| 0d818 | int | m_mission | Current level ID. | |
| 0d81c | byte[180] | m_missionsCleared | Array of which levels are completed. Oddly, 1 is incomplete, 0 is cleared. | |
| 0d8d0 | byte[20] | m_worldsCleared | Array of which worlds are completed. As above, 1 is incomplete. | |
| 0d8e4 | int | m_lives | ||
| 0d8e8 | int | m_chestsCollected | How many treasure chests have been collected in the current level. | |
| 0d8ec | int | m_chestsTotal | Treasure chests required to complete level. Always equal to total amount of chests. | |
| 0d8f0 | ||||
| 0d8f4 | ||||
| 0d8f8 | ||||
| 0d8fc | POINT | m_cameraTargetPos | The point in world space the camera will focus on. | |
| 0d904 | POINT | m_cameraTargetOffset | Additional offset to m_cameraTargetPos. | |
| 0d90c | int | m_flyupIcon | Graphics frame of current item flyup. | |
| 0d910 | int | m_flyupChannel | Graphics file (channel) of current item flyup. | |
| 0d914 | int | m_flyupFrameCount | How long the flyup has been moving. | |
| 0d918 | int | m_flyupFrameTotal | The length in frames of the flyup animation. | |
| 0d91c | POINT | m_flyupStartPos | The starting point of the flyup's movement. | |
| 0d924 | POINT | m_flyupEndPos | The target point of the flyup's movement. | |
| 0d92c | BOOL | m_bScreenShake | Whether the screen is currently shaking from an explosion. | |
| 0d930 | int | m_screenShakeIndex | Index into an array of X/Y offsets to apply to the camera for screen shake. If >= 32, screen stops shaking. | |
| 0d934 | int[112] | m_menuSelections | Tracks the indexes of level editor objects that cycle through a set of subtypes (e.g. the color of personal bombs, the direction of wind, and the aesthetic variants of tech-blocks) | |
| 0daf4 | int[99] | Uncertain. See the following entry on m_reserve for a possible explanation. | ||
| 0dc80 | byte[100000] | m_reserve | This block of memory only seems to exist as a spatial buffer to prevent memory corruption when m_missionsCompleted is indexed out-of-bounds. Had this block not existed, winning or losing a level whose ID exceeds 1,124 (decimal) would collide with and corrupt CEvent. With this buffer in place, problems are avoided until level ID 101,124. | |
CPixmap class
CSound class
CNetwork class
CMovie class
CJauge class
CMenu class
CButton class
The CButton class represents a single menu button during runtime. Very similar to the equivalent class in Planet Blupi, with the addition of a single member at offset 0x1c.
| Address | Datatype | Symbol | Info | |
|---|---|---|---|---|
| Blupi | Eggbert | |||
| 00 | HWND | m_hWnd | ||
| 04 | CPixmap * | m_pPixmap | ||
| 08 | CDecor * | m_pDecor | ||
| 0c | CSound * | m_pSound | ||
| 10 | int | m_type | ||
| 14 | BOOL | m_bEnable | TRUE if button is active | |
| 18 | BOOL | m_bHide | TRUE if button is hidden | |
| 1c | ||||
| 20 | UINT | m_message | Message invoked when button is activated. Usually an Event or Phase ID. | |
| 24 | POINT | m_pos | ||
| 2c | POINT | m_dim | Dimensions | |
| 34 | int | m_state | * 0 - released
| |
| 38 | int | m_mouseState | Same values as m_state | |
| 3c | int[20] | m_iconMenu | Icons in submenu | |
| 8c | int[20] | m_toolTips | String ID's per button in submenu | |
| dc | int | m_nbMenu | Number of options in submenu | |
| e0 | int | m_nbToolTips | ||
| e4 | int | m_selMenu | Index of selected submenu option | |
| e8 | BOOL | m_bMouseDown | ||
| ec | BOOL | m_bMinimizeRedraw | ||
| f0 | BOOL | m_bRedraw | If TRUE, button is marked to be redrawn | |