Path: blob/master/SonicMania/Objects/Helpers/PlayerProbe.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: PlayerProbe Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectPlayerProbe *PlayerProbe;1011void PlayerProbe_Update(void)12{13RSDK_THIS(PlayerProbe);1415// Pretty much just an edit of the PlaneSwitch collision code16foreach_active(Player, player)17{18int32 playerID = RSDK.GetEntitySlot(player);1920Vector2 pivotPos = player->position;21Vector2 pivotVel = player->velocity;2223Zone_RotateOnPivot(&pivotPos, &self->position, self->negAngle);24Zone_RotateOnPivot(&pivotVel, &self->velocity, self->negAngle);2526if (abs(pivotPos.x - self->position.x) < TO_FIXED(24) && abs(pivotPos.y - self->position.y) < self->size << 19) {27if (pivotPos.x >= self->position.x) {28if (!self->direction) {29if (!((1 << playerID) & self->activePlayers))30PlayerProbe_Print(player);3132self->activePlayers |= 1 << playerID;33}34}35else {36if (self->direction) {37if (!((1 << playerID) & self->activePlayers))38PlayerProbe_Print(player);3940self->activePlayers |= 1 << playerID;41}42}43}44else {45self->activePlayers &= ~(1 << playerID);46}47}4849self->visible = DebugMode->debugActive;50}5152void PlayerProbe_LateUpdate(void) {}5354void PlayerProbe_StaticUpdate(void) {}5556void PlayerProbe_Draw(void) { PlayerProbe_DrawSprites(); }5758void PlayerProbe_Create(void *data)59{60RSDK_THIS(PlayerProbe);6162RSDK.SetSpriteAnimation(PlayerProbe->aniFrames, 0, &self->animator, true, 0);6364self->drawFX |= FX_FLIP;65self->active = ACTIVE_BOUNDS;66self->animator.frameID = 4;6768self->updateRange.x = TO_FIXED(32) + abs(self->size * RSDK.Sin256(self->angle) << 11);69self->updateRange.y = TO_FIXED(32) + abs(self->size * RSDK.Cos256(self->angle) << 11);70self->visible = false;71self->drawGroup = Zone->objectDrawGroup[0];72self->activePlayers = 0;73self->negAngle = -self->angle & 0xFF;74}7576void PlayerProbe_StageLoad(void) { PlayerProbe->aniFrames = RSDK.LoadSpriteAnimation("Global/PlaneSwitch.bin", SCOPE_STAGE); }7778void PlayerProbe_Print(EntityPlayer *player)79{80RSDK_THIS(PlayerProbe);81if (!SceneInfo->inEditor) {8283LogHelpers_Print("====================");84LogHelpers_Print("= Begin Probe =");85LogHelpers_Print("====================");8687if (self->direction)88LogHelpers_Print("self->direction = S/U");89else90LogHelpers_Print("self->direction = U/S");9192LogHelpers_Print("self->angle = %i", self->angle);93LogHelpers_Print("Cos256(self->angle) = %i", RSDK.Cos256(self->angle));94LogHelpers_Print("Sin256(self->angle) = %i", RSDK.Sin256(self->angle));95LogHelpers_Print("====================");9697if (player->direction)98LogHelpers_Print("self->direction = FACING_LEFT");99else100LogHelpers_Print("self->direction = FACING_RIGHT");101102LogHelpers_Print("playerPtr->groundVel = %i", player->groundVel);103LogHelpers_Print("playerPtr->angle = %i", player->angle);104LogHelpers_Print("playerPtr->collisionMode = %i", player->collisionMode);105LogHelpers_Print("playerPtr->onGround = %i", player->onGround);106107LogHelpers_Print("====================");108LogHelpers_Print("= End Probe =");109LogHelpers_Print("====================");110}111}112113void PlayerProbe_DrawSprites(void)114{115RSDK_THIS(PlayerProbe);116117Vector2 drawPos;118119drawPos.x = self->position.x;120drawPos.y = self->position.y - (self->size << 19);121Zone_RotateOnPivot(&drawPos, &self->position, self->angle);122123for (int32 i = 0; i < self->size; ++i) {124RSDK.DrawSprite(&self->animator, &drawPos, false);125drawPos.x += RSDK.Sin256(self->angle) << 12;126drawPos.y += RSDK.Cos256(self->angle) << 12;127}128129if (SceneInfo->inEditor) {130uint8 angle = -(uint8)(self->angle);131if (self->direction)132angle = -0x80 - (uint8)(self->angle);133134int32 x2 = self->position.x + 0x5000 * RSDK.Cos256(angle);135int32 y2 = self->position.y + 0x5000 * RSDK.Sin256(angle);136PlayerProbe_DrawArrow(self->position.x, self->position.y, x2, y2, !self->direction ? 0x00FFFF : 0xFF00FF);137}138}139140void PlayerProbe_DrawArrow(int32 x1, int32 y1, int32 x2, int32 y2, uint32 color)141{142int32 angle = RSDK.ATan2(x1 - x2, y1 - y2);143144RSDK.DrawLine(x1, y1, x2, y2, color, 0x7F, INK_ADD, false);145RSDK.DrawLine(x2, y2, x2 + (RSDK.Cos256(angle + 12) << 12), (RSDK.Sin256(angle + 12) << 12) + y2, color, 0x7F, INK_ADD, false);146RSDK.DrawLine(x2, y2, (RSDK.Cos256(angle - 12) << 12) + x2, (RSDK.Sin256(angle - 12) << 12) + y2, color, 0x7F, INK_ADD, false);147}148149#if GAME_INCLUDE_EDITOR150void PlayerProbe_EditorDraw(void)151{152RSDK_THIS(PlayerProbe);153154self->updateRange.x = TO_FIXED(32) + abs(self->size * RSDK.Sin256(self->angle) << 11);155self->updateRange.y = TO_FIXED(32) + abs(self->size * RSDK.Cos256(self->angle) << 11);156self->visible = true;157self->drawGroup = Zone ? Zone->objectDrawGroup[0] : 2;158159PlayerProbe_DrawSprites();160}161162void PlayerProbe_EditorLoad(void)163{164PlayerProbe->aniFrames = RSDK.LoadSpriteAnimation("Global/PlaneSwitch.bin", SCOPE_STAGE);165166RSDK_ACTIVE_VAR(PlayerProbe, direction);167RSDK_ENUM_VAR("U/S", FLIP_NONE);168RSDK_ENUM_VAR("S/U", FLIP_X);169}170#endif171172void PlayerProbe_Serialize(void)173{174RSDK_EDITABLE_VAR(PlayerProbe, VAR_UINT8, direction);175RSDK_EDITABLE_VAR(PlayerProbe, VAR_ENUM, size);176RSDK_EDITABLE_VAR(PlayerProbe, VAR_INT32, angle);177}178179180