Path: blob/master/SonicMania/Objects/SSZ/Bungee.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Bungee Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectBungee *Bungee;1011void Bungee_Update(void)12{13RSDK_THIS(Bungee);1415if (self->hasAttachedPlayer) {16EntityPlayer *player = self->attachedPlayer;1718self->timer = 2;19#if GAME_VERSION != VER_10020if (player && !Player_CheckValidState(player)) {21self->attachedPlayer = NULL;22self->hasAttachedPlayer = false;23}24if (self->attachedPlayer) {25#endif26RSDK.GetHitbox(&player->animator, 0); // yeah2728player->velocity.x = 0;29player->velocity.y = 0;30player->groundVel = 0;31player->angle = 0;32player->rotation = 0;33player->drawFX = FX_ROTATE | FX_FLIP;34player->position = self->bungeePos;35player->position.y += 0x1A0000;36#if GAME_VERSION != VER_10037}38#endif3940if (self->velocity.y <= 0) {41self->stretchForce -= 0x800;4243if (self->bungeePos.y <= self->startPos.y) {44self->bungeePos.x = self->startPos.x;45self->bungeePos.y = self->startPos.y;46self->hasAttachedPlayer = false;4748if (self->attachedPlayer) {49player->tileCollisions = TILECOLLISION_DOWN;50player->velocity = self->velocity;51RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_TWIRL, &player->animator, true, 0);5253player->rotation = 0;54player->animator.speed = 48;55player->onGround = false;56player->state = Player_State_Air;57}58}59}60else {61self->stretchForce = -0x2C00;62}6364self->velocity.y += self->stretchForce;65self->bungeePos.x += self->velocity.x;66self->bungeePos.y += self->velocity.y;67}68else {69foreach_active(Player, player)70{71if (!player->sidekick) {72if (abs(player->position.y - self->position.y) < 0x180000) {73if (abs(player->position.x - self->position.x) < 0x180000 && self->playerY[player->playerID] <= self->position.y74&& player->position.y >= self->position.y) {75if (abs(player->groundVel) > 0x20000 || player->velocity.y > 0x20000) {76if (player->state != Player_State_Static && !self->hasAttachedPlayer && !self->timer) {77self->stretchForce = -0x2C00;78self->timer = 2;79self->attachedPlayer = player;80self->bungeePos.x = self->startPos.x;81self->bungeePos.y = self->startPos.y;82self->hasAttachedPlayer = true;83self->velocity.x = 0;8485int32 velocity = player->onGround ? abs(player->groundVel) : player->velocity.y;8687self->velocity.y = velocity >> 1;88player->velocity.x = 0;89player->velocity.y = 0;90player->groundVel = 0;91player->angle = 0;92player->rotation = 0;93player->position = self->bungeePos;94player->position.y += 0x1A0000;95player->onGround = false;96player->nextGroundState = StateMachine_None;97player->nextAirState = StateMachine_None;98player->tileCollisions = TILECOLLISION_NONE;99100RSDK.SetSpriteAnimation(player->aniFrames, ANI_BUNGEE, &player->animator, true, 0);101player->state = Player_State_Static;102RSDK.PlaySfx(Player->sfxGrab, false, 255);103104self->deathBoundary[player->playerID] = Zone->deathBoundary[player->playerID];105Zone->deathBoundary[player->playerID] = 0x7FFFFFFF;106}107}108}109}110}111112self->playerY[player->playerID] = player->position.y;113}114}115116if (self->timer) {117self->timer--;118}119else {120EntityPlayer *player = self->attachedPlayer;121if (player) {122Zone->deathBoundary[player->playerID] = self->deathBoundary[player->playerID];123self->deathBoundary[player->playerID] = 0;124self->attachedPlayer = NULL;125}126}127}128129void Bungee_LateUpdate(void) {}130131void Bungee_StaticUpdate(void) {}132133void Bungee_Draw(void)134{135RSDK_THIS(Bungee);136137if (self->hasAttachedPlayer) {138EntityPlayer *player = self->attachedPlayer;139Vector2 drawPos = self->startPos;140141int32 playerY = player->position.y;142for (int32 i = 0; i < 9; ++i) {143int32 offset = i * ((playerY - 0x1A0000 - self->startPos.y) >> 3);144145drawPos.x = self->startPos.x & 0xFFFF0000;146drawPos.y = (self->startPos.y + offset) & 0xFFFF0000;147RSDK.DrawSprite(&Bungee->animator, &drawPos, false);148}149}150else {151RSDK.DrawSprite(&Bungee->animator, NULL, false);152}153}154155void Bungee_Create(void *data)156{157RSDK_THIS(Bungee);158159self->active = ACTIVE_BOUNDS;160self->visible = true;161self->drawFX = FX_FLIP;162self->drawGroup = Zone->objectDrawGroup[1];163self->startPos.x = self->position.x;164self->startPos.y = self->position.y;165self->updateRange.x = 0x800000;166self->updateRange.y = 0x2000000;167}168169void Bungee_StageLoad(void)170{171Bungee->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/Bungee.bin", SCOPE_STAGE);172173RSDK.SetSpriteAnimation(Bungee->aniFrames, 0, &Bungee->animator, true, 0);174}175176#if GAME_INCLUDE_EDITOR177void Bungee_EditorDraw(void) { RSDK.DrawSprite(&Bungee->animator, NULL, false); }178179void Bungee_EditorLoad(void) { Bungee_StageLoad(); }180#endif181182void Bungee_Serialize(void) {}183184185