Path: blob/master/SonicMania/Objects/TMZ/JacobsLadder.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: JacobsLadder Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectJacobsLadder *JacobsLadder;1011void JacobsLadder_Update(void)12{13RSDK_THIS(JacobsLadder);1415bool32 showElectricity = self->showElectricity;1617self->electricFadeOut = false;18self->showElectricity = false;19self->direction = self->flip ? FLIP_Y : FLIP_NONE;2021int32 timer = (self->intervalOffset + Zone->timer) % self->interval;2223if (timer < self->duration) {24if (!showElectricity && self->onScreen == 1)25RSDK.PlaySfx(JacobsLadder->sfxLadder, false, 255);2627self->showElectricity = true;28}29else if (timer < self->duration + 12)30self->electricFadeOut = true;3132if (self->electricFadeOut) {33self->electricPos = self->height << 20;34RSDK.SetSpriteAnimation(JacobsLadder->aniFrames, 3, &self->electricAnimator, true, 10);35}3637if (self->showElectricity) {38int32 storeX = self->position.x;39int32 storeY = self->position.y;40self->electricPos = timer * ((self->height << 20) / self->duration);41self->position.y += (2 * self->flip - 1) * (self->electricPos + 0x300000);4243foreach_active(Player, player)44{45int32 playerID = RSDK.GetEntitySlot(player);4647if (((1 << playerID) & self->activePlayers)) {48if (player->state == Player_State_Static && player->shield == SHIELD_LIGHTNING) {49if (player->jumpPress) {50self->playerTimers[playerID] = 15;51self->activePlayers &= ~(1 << playerID);52player->jumpAbilityState = 1;53player->state = Player_State_Air;5455SceneInfo->entity = (Entity *)player;56StateMachine_Run(player->stateAbility);57SceneInfo->entity = (Entity *)self;58}59else {60player->position.x = self->position.x + self->playerPositions[playerID].x;61player->position.y = self->position.y + self->playerPositions[playerID].y;62}63}64else {65self->activePlayers &= ~(1 << playerID);66}67}68else {69if (self->playerTimers[playerID]) {70self->playerTimers[playerID]--;71}72else {73if (Player_CheckCollisionTouch(player, self, &self->hitbox)) {74if (player->shield == SHIELD_LIGHTNING) {75if (player->state != Player_State_Static) {76RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);77player->state = Player_State_Static;78player->nextAirState = StateMachine_None;79player->nextGroundState = StateMachine_None;8081self->playerPositions[playerID].x = player->position.x - self->position.x;82self->playerPositions[playerID].y = player->position.y - self->position.y;8384player->velocity.x = 0;85player->velocity.y = 0;86player->groundVel = 0;8788self->activePlayers |= 1 << playerID;89}90}91else {92Player_Hurt(player, self);93}94}95}96}97}9899self->position.x = storeX;100self->position.y = storeY;101102RSDK.ProcessAnimation(&self->electricAnimator);103}104else {105foreach_active(Player, player)106{107int32 playerID = RSDK.GetEntitySlot(player);108109if ((1 << playerID) & self->activePlayers) {110self->activePlayers &= ~(1 << playerID);111112if (player->state == Player_State_Static) {113player->velocity.x = 0;114player->velocity.y = 0;115player->groundVel = 0;116player->jumpAbilityState = 1;117player->state = Player_State_Air;118}119}120}121}122}123124void JacobsLadder_LateUpdate(void) {}125126void JacobsLadder_StaticUpdate(void) {}127128void JacobsLadder_Draw(void)129{130RSDK_THIS(JacobsLadder);131132self->drawFX = FX_FLIP;133self->inkEffect = INK_NONE;134self->alpha = 0xFF;135136// what a line of code tbh137int32 direction = -(-(int32)self->flip != false) & 0xFFFFFF02;138139int32 yOff = 0x300000 * (2 * (self->flip != false) - 1);140int32 side = 0;141for (int32 i = 0; i < 2; ++i) {142self->direction = direction ^ side;143144Vector2 drawPos;145drawPos.x = self->position.x + ((2 * (side != false) - 1) << 21);146drawPos.y = self->position.y;147RSDK.SetSpriteAnimation(JacobsLadder->aniFrames, 0, &self->sideAnimator, true, 0);148RSDK.DrawSprite(&self->sideAnimator, &drawPos, false);149150drawPos.y += yOff;151for (int32 y = 0; y < self->height; ++y) {152RSDK.SetSpriteAnimation(JacobsLadder->aniFrames, 1, &self->sideAnimator, true, 0);153RSDK.DrawSprite(&self->sideAnimator, &drawPos, false);154drawPos.y += (2 * (self->flip != false) - 1) << 20;155}156157RSDK.SetSpriteAnimation(JacobsLadder->aniFrames, 2, &self->sideAnimator, true, 0);158RSDK.DrawSprite(&self->sideAnimator, &drawPos, false);159side++;160}161162self->direction = direction;163if (self->showElectricity || self->electricFadeOut) {164self->inkEffect = INK_ADD;165if (self->electricFadeOut)166self->alpha = 21 * (self->duration - (self->intervalOffset + Zone->timer) % self->interval) + 255;167168Vector2 drawPos;169drawPos.x = self->position.x;170drawPos.y = self->position.y + (2 * (self->flip != false) - 1) * (self->electricPos + 0x300000);171RSDK.DrawSprite(&self->electricAnimator, &drawPos, false);172RSDK.DrawSprite(&self->electricAnimator, &drawPos, false);173}174}175176void JacobsLadder_Create(void *data)177{178RSDK_THIS(JacobsLadder);179180self->active = ACTIVE_BOUNDS;181self->drawGroup = Zone->objectDrawGroup[0];182self->startPos = self->position;183self->visible = true;184self->updateRange.x = 0x800000;185self->updateRange.y = (self->height + 8) << 20;186self->drawFX = FX_FLIP;187self->direction = self->flip ? FLIP_Y : FLIP_NONE;188189if (!self->interval)190self->interval = 120;191192if (!self->duration)193self->duration = 60;194195RSDK.SetSpriteAnimation(JacobsLadder->aniFrames, 3, &self->electricAnimator, true, 0);196197self->hitbox.left = -35;198self->hitbox.top = -4;199self->hitbox.right = 35;200self->hitbox.bottom = 4;201}202203void JacobsLadder_StageLoad(void)204{205JacobsLadder->aniFrames = RSDK.LoadSpriteAnimation("TMZ1/JacobsLadder.bin", SCOPE_STAGE);206207JacobsLadder->sfxLadder = RSDK.GetSfx("TMZ1/JacobsLadder.wav");208}209210#if GAME_INCLUDE_EDITOR211void JacobsLadder_EditorDraw(void)212{213JacobsLadder_Create(NULL);214JacobsLadder_Draw();215}216217void JacobsLadder_EditorLoad(void) { JacobsLadder->aniFrames = RSDK.LoadSpriteAnimation("TMZ1/JacobsLadder.bin", SCOPE_STAGE); }218#endif219220void JacobsLadder_Serialize(void)221{222RSDK_EDITABLE_VAR(JacobsLadder, VAR_UINT32, height);223RSDK_EDITABLE_VAR(JacobsLadder, VAR_ENUM, interval);224RSDK_EDITABLE_VAR(JacobsLadder, VAR_ENUM, intervalOffset);225RSDK_EDITABLE_VAR(JacobsLadder, VAR_ENUM, duration);226RSDK_EDITABLE_VAR(JacobsLadder, VAR_BOOL, flip);227}228229230