Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions bindings/2.2081/GeometryDash.bro
Original file line number Diff line number Diff line change
Expand Up @@ -14510,8 +14510,8 @@ class PlayerObject : GameObject, AnimatedSpriteDelegate {
void speedUp() = win inline, imac 0x41d610, m1 0x391bec, ios inline;
void spiderTestJump(bool dynamic) = win 0x394340, imac 0x403720, m1 0x37b2c0, ios 0x21e058;
void spiderTestJumpInternal(bool dynamic) = win 0x3943f0, imac 0x40d690, m1 0x38373c, ios 0x224a9c;
void spiderTestJumpX(bool dynamic) = imac 0x40ed60, m1 0x384b64;
void spiderTestJumpY(bool dynamic) = imac 0x40fc20, m1 0x38587c;
void spiderTestJumpX(bool dynamic) = win inline, imac 0x40ed60, m1 0x384b64;
void spiderTestJumpY(bool dynamic) = win inline, imac 0x40fc20, m1 0x38587c;
void startDashing(DashRingObject* object) = win 0x395910, imac 0x411380, m1 0x386de8, ios 0x2262e8;
void stopBurstEffect() = win 0x39b4e0, imac 0x4184f0, m1 0x38d598, ios 0x22addc;
void stopDashing() = win 0x396650, imac 0x401a50, m1 0x3796d0, ios 0x21ca7c;
Expand Down
179 changes: 151 additions & 28 deletions bindings/2.2081/inline/PlayerObject.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <Geode/Geode.hpp>

#if defined(GEODE_IS_ANDROID)
#if defined(GEODE_IS_WINDOWS) || defined(GEODE_IS_IOS)
PlayerObject::PlayerObject() {

#if defined(__clang__)
Expand Down Expand Up @@ -33,9 +33,7 @@ PlayerObject::PlayerObject() {
new (&m_holdingButtons) decltype(m_holdingButtons)();
new (&m_currentRobotAnimation) gd::string("run");
}
#endif

#if defined(GEODE_IS_WINDOWS) || defined(GEODE_IS_IOS)
void PlayerObject::addToYVelocity(double yVelocity, int type) {
this->setYVelocity(m_yVelocity + yVelocity, type);
}
Expand Down Expand Up @@ -95,10 +93,6 @@ void PlayerObject::handleRotatedSlopeCollision(float dt, GameObject* object, boo
this->handleRotatedCollisionInternal(dt, object, { 0.f, 0.f, 0.f, 0.f }, false, skipPre, true);
}

bool PlayerObject::isInNormalMode() {
return !this->isFlying() && !m_isBall && !m_isRobot && !m_isSpider;
}

bool PlayerObject::isSafeMode(float changeTime) {
return m_gameModeChangedTime != 0.0 && m_totalTime - m_gameModeChangedTime < changeTime;
}
Expand Down Expand Up @@ -166,6 +160,135 @@ void PlayerObject::speedUp() {
this->logValues();
}

void PlayerObject::spiderTestJumpX(bool dynamic) {
if (!m_gameLayer) return;

auto gl = m_gameLayer;

float minY = gl->getMinPortalY();
float maxY = gl->getMaxPortalY();

if (!gl->m_gameState.m_unkBool8 &&
!m_isOnSlope &&
!m_isShip &&
!m_isBall &&
!m_isOnGround) {
minY = 90.f;
maxY = 2490.f;
}

CCRect base = this->getObjectRect();

if (!m_isUpsideDown) {
base.origin.y = base.getMaxY() - 2.f;
base.size.height = maxY - base.origin.y;
}
else {
base.size.height = (base.origin.y - minY) + 2.f;
base.origin.y = minY;
}

CCRect sweep = base;
sweep.size.height += 4.f;

float half = (base.size.width - (m_scale * 8.f)) * 0.5f;
sweep.origin.x += half;
sweep.size.width = m_scale * 0.5f + 1.f;

auto statics = gl->staticObjectsInRect(sweep, true, true);
auto damagers = gl->damagingObjectsInRect(base);

bool expanded = false;

if ((statics && statics->count()) || (damagers && damagers->count())) {
if (dynamic) {
sweep = base;
expanded = true;
statics = gl->staticObjectsInRect(sweep, true, true);
}
}

if (!statics || !statics->count()) return;

float best = m_position.y;
bool found = false;

CCObject* obj;
CCARRAY_FOREACH(statics, obj) {
auto block = static_cast<GameObject*>(obj);
if (!block || block->m_isPassable) continue;

if (overlaps1Way(block)) continue;

auto r = block->getObjectRect();
float snap = m_isUpsideDown ? r.getMaxY() : r.getMinY();

if (!found || fabsf(snap - m_position.y) < fabsf(best - m_position.y)) {
best = snap;
found = true;
}
}

if (!found) return;

this->setPositionY(best);
this->flipGravity(!m_isUpsideDown, true);
}

void PlayerObject::spiderTestJumpY(bool dynamic) {
if (!m_gameLayer) return;

auto gl = m_gameLayer;

CCRect base = this->getObjectRect();

base.origin.y -= 3000.f;
base.size.height += 6000.f;

CCRect sweep = base;
sweep.size.width += 4.f;
sweep.origin.x -= 2.f;

auto statics = gl->staticObjectsInRect(sweep, true, true);
auto damagers = gl->damagingObjectsInRect(base);

bool expanded = false;

if ((statics && statics->count()) || (damagers && damagers->count())) {
if (dynamic) {
sweep = base;
expanded = true;
statics = gl->staticObjectsInRect(sweep, true, true);
}
}

if (!statics || !statics->count()) return;

float best = m_position.x;
bool found = false;

CCObject* obj;
CCARRAY_FOREACH(statics, obj) {
auto block = static_cast<GameObject*>(obj);
if (!block || block->m_isPassable) continue;

if (overlaps1Way(block)) continue;

auto r = block->getObjectRect();
float snap = m_isUpsideDown ? r.getMaxX() : r.getMinX();

if (!found || fabsf(snap - m_position.x) < fabsf(best - m_position.x)) {
best = snap;
found = true;
}
}

if (!found) return;

this->setPositionX(best);
this->flipGravity(!m_isUpsideDown, true);
}

void PlayerObject::storeCollision(PlayerCollisionDirection direction, int id) {
switch (direction) {
case PlayerCollisionDirection::Top: {
Expand Down Expand Up @@ -221,23 +344,6 @@ void PlayerObject::updateLastGroundObject(GameObject* object) {
if (m_isDontBoostX) m_stateBoostY = 2;
}

void PlayerObject::updatePlayerForce(cocos2d::CCPoint velocity, bool additive) {
if (additive) {
m_yVelocity += velocity.y;
if (m_isPlatformer) {
m_platformerXVelocity += velocity.x;
m_affectedByForces = true;
}
}
else {
m_yVelocity = velocity.y;
if (m_isPlatformer) {
m_platformerXVelocity = velocity.x;
m_affectedByForces = true;
}
}
}

void PlayerObject::updateSlopeYVelocity(float yVelocity) {}

void PlayerObject::updateStreaks(float dt) {
Expand Down Expand Up @@ -363,6 +469,10 @@ bool PlayerObject::isInBasicMode() {
return !this->isFlying() && !m_isBall && !m_isSpider;
}

bool PlayerObject::isInNormalMode() {
return !this->isFlying() && !m_isBall && !m_isRobot && !m_isSpider;
}

bool PlayerObject::isSafeFlip(float flipTime) {
return m_lastFlipTime != 0.0 && m_totalTime - m_lastFlipTime < flipTime;
}
Expand Down Expand Up @@ -732,6 +842,23 @@ void PlayerObject::updateEffects(float param) {
m_waveTrail->updateStroke(param);
}

void PlayerObject::updatePlayerForce(cocos2d::CCPoint velocity, bool additive) {
if (additive) {
m_yVelocity += velocity.y;
if (m_isPlatformer) {
m_platformerXVelocity += velocity.x;
m_affectedByForces = true;
}
}
else {
m_yVelocity = velocity.y;
if (m_isPlatformer) {
m_platformerXVelocity = velocity.x;
m_affectedByForces = true;
}
}
}

void PlayerObject::updatePlayerRobotFrame(int frame) {
this->createRobot(std::clamp(frame, 1, 68));
}
Expand Down Expand Up @@ -795,10 +922,6 @@ void PlayerObject::hitGroundNoJump(GameObject* object, bool notFlipped) {
m_lastLandTime = lastLandTime;
}

bool PlayerObject::levelFlipping() {
return m_playEffects && GameManager::sharedState()->m_playLayer->isFlipping();
}

void PlayerObject::updatePlayerScale() {
m_actionManager->stopInternalAction(6);
this->setScaleX(m_vehicleSize);
Expand Down
Loading