Path: blob/master/SonicMania/Objects/SPZ/FilmProjector.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: FilmProjector Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectFilmProjector *FilmProjector;1011void FilmProjector_Update(void)12{13RSDK_THIS(FilmProjector);1415self->rotation += self->pathMovement != FLIP_NONE ? -4 : 4;16self->rotation &= 0x1FF;1718RSDK.ProcessAnimation(&self->celluoidAnimator);19RSDK.ProcessAnimation(&self->eggmanAnimator);20}2122void FilmProjector_LateUpdate(void) {}2324void FilmProjector_StaticUpdate(void) {}2526void FilmProjector_Draw(void)27{28RSDK_THIS(FilmProjector);2930if (SceneInfo->currentDrawGroup == Zone->objectDrawGroup[1]) {31Vector2 drawPos;32self->drawFX &= ~FX_FLIP;3334drawPos.y = self->position.y - 0x440000;35if (self->direction == FLIP_NONE) {36drawPos.x = self->position.x - 0x3C0000;37RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);38self->drawFX |= FX_ROTATE;3940RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);41self->drawFX &= ~FX_ROTATE;4243RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);44drawPos.x += 0x680000;45}46else {47drawPos.x = self->position.x + 0x3C0000;48RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);49self->drawFX |= FX_ROTATE;5051RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);52self->drawFX &= ~FX_ROTATE;5354RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);55drawPos.x -= 0x680000;56}57RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);5859self->drawFX |= FX_ROTATE;60RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);6162self->drawFX &= ~FX_ROTATE;63RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);6465// ???66// This is the ONLY reference to this in the entire game67// (Not counting the editor funcs since they're for RE2 and custom-made)68SceneInfo->effectGizmo = true;6970self->drawFX |= FX_FLIP;71RSDK.DrawSprite(&self->projectorAnimator, NULL, false);7273self->inkEffect = INK_BLEND;74RSDK.DrawSprite(&self->eggmanAnimator, &self->filmPos, false);7576self->inkEffect = INK_NONE;77}78else {79RSDK.DrawSprite(&self->screenAnimator, &self->filmPos, false);80RSDK.DrawSprite(&self->eggmanAnimator, &self->filmPos, false);81RSDK.AddDrawListRef(Zone->objectDrawGroup[1], SceneInfo->entitySlot);82}83}8485void FilmProjector_Create(void *data)86{87RSDK_THIS(FilmProjector);8889RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 0, &self->projectorAnimator, true, 0);90RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 0, &self->screenAnimator, true, 1);91RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 1, &self->filmReelAnimator, true, 0);92RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 1, &self->reelEdgeAnimator, true, 1);93RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 2, &self->celluoidAnimator, true, 0);94RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 3, &self->eggmanAnimator, true, 1);9596if (!SceneInfo->inEditor) {97self->active = ACTIVE_BOUNDS;98self->updateRange.x = 0x1000000;99self->updateRange.y = 0x1000000;100self->visible = true;101self->drawGroup = Zone->objectDrawGroup[0];102103self->filmPos = self->position;104if (self->direction == FLIP_NONE)105self->filmPos.x += 0xB80000;106else107self->filmPos.x -= 0xB80000;108}109}110111void FilmProjector_StageLoad(void) { FilmProjector->aniFrames = RSDK.LoadSpriteAnimation("SPZ1/FilmProjector.bin", SCOPE_STAGE); }112113#if GAME_INCLUDE_EDITOR114void FilmProjector_EditorDraw(void)115{116RSDK_THIS(FilmProjector);117118self->updateRange.x = 0x1000000;119self->updateRange.y = 0x1000000;120121self->filmPos.x = self->position.x;122self->filmPos.y = self->position.y;123if (self->direction == FLIP_NONE)124self->filmPos.x += 0xB80000;125else126self->filmPos.x -= 0xB80000;127128RSDK.DrawSprite(&self->screenAnimator, &self->filmPos, false);129RSDK.DrawSprite(&self->eggmanAnimator, &self->filmPos, false);130131Vector2 drawPos;132self->drawFX &= ~FX_FLIP;133134drawPos.y = self->position.y - 0x440000;135if (self->direction == FLIP_NONE) {136drawPos.x = self->position.x - 0x3C0000;137RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);138self->drawFX |= FX_ROTATE;139140RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);141self->drawFX &= ~FX_ROTATE;142143RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);144drawPos.x += 0x680000;145}146else {147drawPos.x = self->position.x + 0x3C0000;148RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);149self->drawFX |= FX_ROTATE;150151RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);152self->drawFX &= ~FX_ROTATE;153154RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);155drawPos.x -= 0x680000;156}157RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);158159self->drawFX |= FX_ROTATE;160RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);161162self->drawFX &= ~FX_ROTATE;163RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);164165self->drawFX |= FX_FLIP;166RSDK.DrawSprite(&self->projectorAnimator, NULL, false);167168self->inkEffect = INK_BLEND;169RSDK.DrawSprite(&self->eggmanAnimator, &self->filmPos, false);170171self->inkEffect = INK_NONE;172}173174void FilmProjector_EditorLoad(void)175{176FilmProjector->aniFrames = RSDK.LoadSpriteAnimation("SPZ1/FilmProjector.bin", SCOPE_STAGE);177178RSDK_ACTIVE_VAR(FilmProjector, direction);179RSDK_ENUM_VAR("Right", FLIP_NONE);180RSDK_ENUM_VAR("Left", FLIP_X);181182// Confusing name, but controls what dir the projector wheels spin183RSDK_ACTIVE_VAR(FilmProjector, pathMovement);184RSDK_ENUM_VAR("Clockwise", FLIP_NONE);185RSDK_ENUM_VAR("Counter-Clockwise", FLIP_X);186}187#endif188189void FilmProjector_Serialize(void)190{191RSDK_EDITABLE_VAR(FilmProjector, VAR_UINT8, direction);192RSDK_EDITABLE_VAR(FilmProjector, VAR_UINT8, pathMovement);193}194195196