Skip to content

Instantly share code, notes, and snippets.

@MCJack123
Last active January 26, 2023 08:35
Show Gist options
  • Save MCJack123/ed00353622d562f09ccc34402a33ea6a to your computer and use it in GitHub Desktop.
Save MCJack123/ed00353622d562f09ccc34402a33ea6a to your computer and use it in GitHub Desktop.
Some reverse-engineering for Geometry Dash's memory structures - WIP

What is this?

This document attempts to document the structures of data that Geometry Dash uses to store information about the game. This is primarily intended for mod developers/hackers who want to read the executable's memory.

If you have any additional information about pointer locations or meanings, feel free to post it in the comments below.

The following data is from version 2.11, 32-bit Windows on Steam. This information will likely differ depending on the version, architecture, and platform.

Game Status - [[[GeometryDash.exe + 3222D0] + 164] + 224] + 600

This structure appears to be mirrored four bytes ahead at [[[GeometryDash.exe + 3222D0] + 164] + 228] + 600, for the second player in two-player/split mode.

Offset Type Size Description
0x00 unknown 4 Unknown
0x04 float 4 Last ground Y - character height (0 if in air)
0x08 bool 1 Did use jump ring/pad and haven't landed?
0x09 unknown 1 Unknown
0x0A 24-bit 3 Primary RGB color
0x0D 24-bit 3 Secondary RGB color
0x0E void 2 Padding
0x10 bool 1 Unknown
0x11 bool 1 Is button pressed?
0x12 bool 1 Is button pressed in air?
0x13 bool 1 Is button pressed? (copied from 0x11)
0x14 bool 1 Is button pressed in air? (copied from 0x12)
0x15 void 3 Padding
0x18 int 4 ? (Never exceeds 0x4C0)
0x1C int 4 ? (*0x20 less than 0x18)
0x20 int 4 Difference between 0x18 and 0x1C
0x24 bool 1 Is not jumping off the ground?
0x25 void 3 Padding
0x28 double 8 Vertical velocity
0x30 short 2 Unknown
0x32 void 2 Padding
0x34 unknown 4 Unknown
0x38 bool 1 Is ship?
0x39 bool 1 Is UFO? (interesting that it's earlier than ball, even though ball is older)
0x3A bool 1 Is ball?
0x3B bool 1 Is wave?
0x3C bool 1 Is robot?
0x3D bool 1 Is spider?
0x3E bool 1 Is upside-down?
0x3F bool 1 Is dead?
0x40 bool 1 Can jump?
0x41 bool 1 Is using hold ring?
0x42 void 2 Padding
0x44 float 4 Character height multiplier
0x48 float 4 Speed multiplier (0.7 = 1/2x, 0.9 = 1x, 1.1 = 2x, 1.3 = 3x, 1.6 = 4x)
0x4C float 4 X position (copy)
0x50 float 4 Y position (copy)
0x54 float 4 Last portal X position
0x58 float 4 Last portal Y position
0x5C void* 4 Pointer to something?
0x60 bool 1 Is on ground?
0x61 bool 1 Is jumping and haven't reached apex?
0x62 void 3 Padding
0x64 float 4 Last ground X position (note: this includes jumps on rings)
0x68 float 4 Last ground Y position
0x6C void* 4 Pointer to something?
0x70 void* 4 Pointer to something?
0x74 bool 1 Has jumped since start?
0x75 bool 1 Has used jump ring since start?
0x76 unknown 6 Unknown (00 FF FF 00 FF FF)
0x7C float 4 X position
0x80 float 4 Y position
0x84 bool 1 Player 2?
0x85 bool 1 Is split?
0x86 void 2 Padding
0x88 double 8 Play time in seconds
0x90 unknown 4 Unknown
0x94 float 4 Radius multiplier of music pulses (0.0-1.0)
0x98 double 8 Some other vertical velocity - less than 0x28
0xA0 void 4 Padding?
0xA4 float[200] 800 List of Y positions, probably for fade trail effect

Miscellaneous Pointers

  • [[[[[GeometryDash.exe + 3222D0] + 164] + 3C0] + E8] + 8] + 12C - Percentage string
/*
* This file contains the definitions for structures used by Geometry Dash.
*/
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* [[[GeometryDash.exe + 0x3222D0] + 0x164] + 0x224] + 0x600 */
typedef struct GameStatus {
uint32_t unknownA;
float lastGroundYWithoutHeight;
bool usedJumpAccessory;
uint8_t unknownB[8];
bool buttonPressed;
bool buttonPressedInAir;
bool buttonPressed_Copy;
bool buttonPressedInAir_Copy;
uint32_t randomValueA;
uint32_t randomValueB;
uint32_t randomDifference;
bool notJumpingFromGround;
double verticalVelocity;
short unknownC;
bool isShip;
bool isUFO;
bool isBall;
bool isWave;
bool isRobot;
bool isSpider;
bool isGravityReversed;
bool isDead;
bool canJump;
bool isUsingHoldRing;
float characterHeight;
float speedMultiplier;
float xPosition_Copy;
float yPosition_Copy;
float lastPortalX;
float lastPortalY;
void* pointerA;
bool isOnGround;
bool isAscendingJump;
float lastGroundX;
float lastGroundY;
void* pointerB;
void* pointerC;
bool hasJumpedSinceStart;
bool hasUsedRingSinceStart;
uint8_t unknownD[6];
float xPosition;
float yPosition;
bool player2;
bool isSplit;
double playTime;
uint32_t unknownE;
float pulseRadius;
double alternateVerticalVelocity;
uint32_t unknownF;
float historyY[200];
} GameStatus;
#ifdef __cplusplus
}
#endif
@GD-NTB
Copy link

GD-NTB commented Apr 9, 2022

I'll also leave the pointer address for the current timescale if anyone needs it:
Type: Float (Pointer)
Base: "GeometryDash.exe"+003222E8
Offsets: E8, 38, CC, 20

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment