Path: blob/master/SonicMania/Objects/FBZ/HangGlider.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: HangGlider Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectHangGlider *HangGlider;1112void HangGlider_Update(void)13{14RSDK_THIS(HangGlider);1516StateMachine_Run(self->state);17}1819void HangGlider_LateUpdate(void) {}2021void HangGlider_StaticUpdate(void) {}2223void HangGlider_Draw(void)24{25RSDK_THIS(HangGlider);2627if (SceneInfo->currentDrawGroup == self->drawGroup) {28RSDK.DrawSprite(&self->sailAnimator, NULL, false);29RSDK.DrawSprite(&self->handleBackAnimator, NULL, false);3031if (self->attachedPlayer)32RSDK.DrawSprite(&self->playerAnimator, NULL, false);3334RSDK.AddDrawListRef(Zone->objectDrawGroup[1], SceneInfo->entitySlot);35}36else {37RSDK.DrawSprite(&self->handleFrontAnimator, NULL, false);38}39}4041void HangGlider_Create(void *data)42{43RSDK_THIS(HangGlider);4445if (!SceneInfo->inEditor) {46self->visible = true;47self->drawGroup = Zone->objectDrawGroup[0];48self->active = ACTIVE_BOUNDS;49self->updateRange.x = 0x400000;50self->updateRange.y = 0x400000;51self->gravityStrength = 0x1000;52self->state = HangGlider_State_CheckGrab;5354RSDK.SetSpriteAnimation(HangGlider->aniFrames, 0, &self->sailAnimator, true, 0);55RSDK.SetSpriteAnimation(HangGlider->aniFrames, 1, &self->handleBackAnimator, true, 0);56RSDK.SetSpriteAnimation(HangGlider->aniFrames, 1, &self->handleFrontAnimator, true, 1);57}58}5960void HangGlider_StageLoad(void)61{62if (RSDK.CheckSceneFolder("FBZ"))63HangGlider->aniFrames = RSDK.LoadSpriteAnimation("FBZ/HangGlider.bin", SCOPE_STAGE);64else65HangGlider->aniFrames = RSDK.LoadSpriteAnimation("PSZ1/HangGlider.bin", SCOPE_STAGE);6667// A distance check was used instead68HangGlider->hitboxUnused.left = 12;69HangGlider->hitboxUnused.top = 8;70HangGlider->hitboxUnused.right = 24;71HangGlider->hitboxUnused.bottom = 128;72}7374void HangGlider_State_CheckGrab(void)75{76RSDK_THIS(HangGlider);7778foreach_active(Player, player)79{80if (abs(player->position.x - self->position.x) < 0x40000 && abs(player->position.y - self->position.y) < 0x140000) {81self->attachedPlayer = player;82player->active = ACTIVE_NEVER;83player->visible = false;84self->velocity.x = (0xC0 * player->velocity.x) >> 8;8586RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_DIAGONAL, &self->playerAnimator, true, 0);87self->playerAnimator.rotationStyle = ROTSTYLE_FULL;88self->rotation = 0x80;89self->drawFX = FX_ROTATE;90RSDK.PlaySfx(Player->sfxGrab, false, 255);91self->state = HangGlider_State_Glide;92}93}94}95void HangGlider_State_Glide(void)96{97RSDK_THIS(HangGlider);9899self->velocity.y += self->gravityStrength;100if (self->velocity.y > 0x10000)101self->velocity.y = 0x10000;102103self->position.x += self->velocity.x;104self->position.y += self->velocity.y;105106EntityPlayer *player = self->attachedPlayer;107if (player) {108player->position.x = self->position.x;109player->position.y = self->position.y;110}111112RSDK.ProcessAnimation(&self->sailAnimator);113RSDK.ProcessAnimation(&self->playerAnimator);114}115116#if GAME_INCLUDE_EDITOR117void HangGlider_EditorDraw(void)118{119RSDK_THIS(HangGlider);120121RSDK.SetSpriteAnimation(HangGlider->aniFrames, 0, &self->sailAnimator, true, 0);122RSDK.SetSpriteAnimation(HangGlider->aniFrames, 1, &self->handleBackAnimator, true, 0);123RSDK.SetSpriteAnimation(HangGlider->aniFrames, 1, &self->handleFrontAnimator, true, 1);124125RSDK.DrawSprite(&self->sailAnimator, NULL, false);126RSDK.DrawSprite(&self->handleBackAnimator, NULL, false);127RSDK.DrawSprite(&self->handleFrontAnimator, NULL, false);128}129130void HangGlider_EditorLoad(void)131{132if (RSDK.CheckSceneFolder("FBZ"))133HangGlider->aniFrames = RSDK.LoadSpriteAnimation("FBZ/HangGlider.bin", SCOPE_STAGE);134else135HangGlider->aniFrames = RSDK.LoadSpriteAnimation("PSZ1/HangGlider.bin", SCOPE_STAGE);136}137#endif138139void HangGlider_Serialize(void) {}140#endif141142143