The current URL is datacrystal.tcrf.net.
Speedy Blupi 2/RAM map
The following article is a RAM map for Speedy Blupi 2.
This page compares addresses for two versions of the game: Speedy Blupi 2 version 2.2 (as available on blupi.org), and Speedy Eggbert 2 version 1.x. Italicized names are speculative; non-italicized names directly match the Planet Blupi source code.
Globals
Address | Datatype | Symbol | Info | |
---|---|---|---|---|
Blupi | Eggbert | |||
435030 | int | g_speedRate | How many iterations of events are processed in one frame. Default is 1. Multiplicative with CEvent.m_speed | |
435034 | int | g_timerInterval | Target frame time in milliseconds. Default is 50 ms (20 fps) | |
435038 | int | g_mouseType | ||
43503c | UINT | g_lastPhase | ||
4352a0 | BOOL | g_bDebug | ||
48a3c8 | char[260] | g_CDPath | MAX_PATH is 260 | |
48a4cc | ||||
48a4d0 | ||||
48a4d4 | ||||
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 | BOOL | g_bFullScreen | ||
48a4f4 | BOOL | g_bBenchmarkSuccess | Whether the PC is deemed strong enough for 16-bit graphics. | |
48a4f8 | BOOL | g_bTrueColor | ||
48a4fc | BOOL | g_bTrueColorDecor | ||
48a500 | BOOL | g_bCDAudio | If TRUE, forego all MIDI playback and instead play the corresponding track on an audio CD. (unused) | |
48a504 | int | g_benchmark | The numeric result of the performance benchmark (seemingly measured by the number of images drawn within a time interval?) | |
48a508 | ||||
48a50c | BOOL | g_bActive | Whether the application window is focused. | |
48a510 | 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 |