Path: blob/master/SonicMania/Objects/MSZ/Honkytonk.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Honkytonk Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectHonkytonk *Honkytonk;1011void Honkytonk_Update(void)12{13RSDK_THIS(Honkytonk);1415if (self->depression > 0)16self->depression = MAX(self->depression - 0x20000, 0);1718foreach_active(Player, player)19{20int32 startX = player->position.x;21int32 startY = player->position.y;22int32 startXVel = player->velocity.x;23int32 startYVel = player->velocity.y;2425Zone_RotateOnPivot(&player->position, &self->position, self->negAngle);2627Vector2 pivotCenter = { 0, 0 };28Zone_RotateOnPivot(&player->velocity, &pivotCenter, self->negAngle);2930if (Player_CheckCollisionTouch(player, self, &Honkytonk->hitboxTrigger)) {31Hitbox *playerHitbox = Player_GetHitbox(player);32self->depression = MAX(self->depression, player->position.y + ((playerHitbox->bottom + 12) << 16) - self->position.y);33}3435if (Player_CheckCollisionTouch(player, self, &Honkytonk->hitboxRebound) && player->tileCollisions != TILECOLLISION_NONE) {36player->state = Player_State_Air;37player->onGround = false;38player->applyJumpCap = false;39player->velocity.y = -0x80000;40if (player->animator.animationID != ANI_JUMP)41RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_CS, &player->animator, true, 0);4243player->velocity.y = CLAMP(player->velocity.y, -0x80000, -0x20000);4445Zone_RotateOnPivot(&player->position, &self->position, self->angle);46Zone_RotateOnPivot(&player->velocity, &pivotCenter, self->angle);4748float speeds[] = { 1.0, 1.25, 1.5, 0.75 };49int32 channel = RSDK.PlaySfx(Honkytonk->sfxPiano, false, 0xFF);50RSDK.SetChannelAttributes(channel, 1.0, 0.0, speeds[Zone->timer & 3]);51}52else {53player->position.x = startX;54player->position.y = startY;55player->velocity.x = startXVel;56player->velocity.y = startYVel;57}58}5960if (self->depression >= 0x140000)61self->depression = 0x140000;62}6364void Honkytonk_LateUpdate(void) {}6566void Honkytonk_StaticUpdate(void) {}6768void Honkytonk_Draw(void)69{70RSDK_THIS(Honkytonk);7172self->animator.frameID = 4;73self->scale.y = 0x200;74RSDK.DrawSprite(&self->animator, NULL, false);7576self->animator.frameID = 1;7778Vector2 drawPos;79drawPos.x = self->position.x + (-0xC00 * RSDK.Sin256(self->angle));80drawPos.y = self->position.y + (-0xC00 * RSDK.Cos256(self->angle));81self->scale.y = ((self->depression + 0x20000) >> 7) / 24;82RSDK.DrawSprite(&self->animator, &drawPos, false);8384self->animator.frameID = 3;85drawPos.x = self->position.x - (((0x80000 - self->depression) >> 8) * RSDK.Sin256(self->angle));86drawPos.y = self->position.y - (((0x80000 - self->depression) >> 8) * RSDK.Cos256(self->angle));87self->scale.y = 0x200 + ((self->depression >> 7) / 24);88RSDK.DrawSprite(&self->animator, &drawPos, false);8990self->animator.frameID = 2;91drawPos.x += -0x400 * RSDK.Sin256(self->angle);92drawPos.y += -0x400 * RSDK.Cos256(self->angle);93self->scale.y = 0x200;94RSDK.DrawSprite(&self->animator, &drawPos, false);95}9697void Honkytonk_Create(void *data)98{99RSDK_THIS(Honkytonk);100101if (!SceneInfo->inEditor) {102RSDK.SetSpriteAnimation(Honkytonk->aniFrames, 0, &self->animator, true, 0);103104self->active = ACTIVE_BOUNDS;105self->updateRange.x = 0x800000;106self->updateRange.y = 0x800000;107self->visible = true;108self->angle &= 0xFF;109self->drawGroup = Zone->objectDrawGroup[0];110self->negAngle = 0x100 - self->angle;111self->drawFX = FX_SCALE | FX_ROTATE;112self->scale.x = 0x200;113self->rotation = self->negAngle << 1;114}115}116117void Honkytonk_StageLoad(void)118{119Honkytonk->aniFrames = RSDK.LoadSpriteAnimation("MSZ/HonkyTonk.bin", SCOPE_STAGE);120121Honkytonk->hitboxTrigger.left = -24;122Honkytonk->hitboxTrigger.top = -12;123Honkytonk->hitboxTrigger.right = 24;124Honkytonk->hitboxTrigger.bottom = 12;125126Honkytonk->hitboxRebound.left = -24;127Honkytonk->hitboxRebound.top = 6;128Honkytonk->hitboxRebound.right = 24;129Honkytonk->hitboxRebound.bottom = 12;130131Honkytonk->sfxPiano = RSDK.GetSfx("MSZ/Piano00C2.wav");132}133134#if GAME_INCLUDE_EDITOR135void Honkytonk_EditorDraw(void)136{137RSDK_THIS(Honkytonk);138139RSDK.SetSpriteAnimation(Honkytonk->aniFrames, 0, &self->animator, true, 0);140141int32 angle = self->angle;142self->angle &= 0xFF;143self->negAngle = 0x100 - self->angle;144self->drawFX = FX_SCALE | FX_ROTATE;145self->scale.x = 0x200;146self->rotation = self->negAngle << 1;147148Honkytonk_Draw();149150self->angle = angle;151}152153void Honkytonk_EditorLoad(void) { Honkytonk->aniFrames = RSDK.LoadSpriteAnimation("MSZ/HonkyTonk.bin", SCOPE_STAGE); }154#endif155156void Honkytonk_Serialize(void) { RSDK_EDITABLE_VAR(Honkytonk, VAR_ENUM, angle); }157158159