Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.

Speedy Blupi 2/RAM map: Difference between revisions

From Data Crystal
Jump to navigation Jump to search
No edit summary
No edit summary
 
(No difference)

Latest revision as of 14:21, 26 May 2024

Chip tiny.png 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.
  • 1 - left
  • 2 - right
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.
  • 0 - yellow
  • 1 - orange
  • 2 - blue
  • 3 - green
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
  • 1 - pressed
  • 2+ - submenu expanded
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

Structs