Path: blob/master/SonicMania/Objects/SPZ/GreenScreen.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: GreenScreen Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectGreenScreen *GreenScreen;1011void GreenScreen_Update(void) {}1213void GreenScreen_LateUpdate(void) {}1415void GreenScreen_StaticUpdate(void)16{17int32 count = 0;1819foreach_active(GreenScreen, screen)20{21RSDK.AddDrawListRef(Zone->objectDrawGroup[1], RSDK.GetEntitySlot(screen));22++count;23}2425GreenScreen->greenScreenActive = count > 0;26}2728void GreenScreen_Draw(void) { GreenScreen_DrawSprites(); }2930void GreenScreen_Create(void *data)31{32RSDK_THIS(GreenScreen);3334self->active = ACTIVE_BOUNDS;35self->drawGroup = Zone->objectDrawGroup[0];36self->startPos = self->position;37self->visible = true;38self->drawFX = FX_FLIP;39self->updateRange.x = 0x800000;40self->updateRange.y = 0x800000;41self->showBG = true;4243if (!self->paraYFactor)44self->paraYFactor = 32;4546// A... Secondary Setup....?47GreenScreen->hitbox.left = -104;48GreenScreen->hitbox.top = -64;49GreenScreen->hitbox.right = 104;50GreenScreen->hitbox.bottom = 64;51}5253void GreenScreen_StageLoad(void)54{55GreenScreen->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/GreenScreen.bin", SCOPE_STAGE);5657GreenScreen->hitbox.left = -104;58GreenScreen->hitbox.top = -64;59GreenScreen->hitbox.right = 104;60GreenScreen->hitbox.bottom = 64;6162GreenScreen->parallaxFactor[0] = 0;63GreenScreen->parallaxFactor[1] = 42;64GreenScreen->parallaxFactor[2] = 64;65GreenScreen->parallaxFactor[3] = 96;66GreenScreen->parallaxFactor[4] = 112;6768GreenScreen->bgSize[0] = 16 << 16;69GreenScreen->bgSize[1] = 180 << 16;70GreenScreen->bgSize[2] = 190 << 16;71GreenScreen->bgSize[3] = 192 << 16;72GreenScreen->bgSize[4] = 192 << 16;73}7475void GreenScreen_DrawBG(int32 x, int32 y, uint8 bgID, int32 parallaxFactor)76{77RSDK_THIS(GreenScreen);78Vector2 drawPos;7980int32 paraX = parallaxFactor * (-x / 128);81while (paraX >= 0) paraX -= GreenScreen->bgSize[bgID];8283drawPos = self->position;84drawPos.y += (self->paraYFactor * (-y / 128));85drawPos.x += (GreenScreen->hitbox.left << 16) + paraX;8687int32 sizeX = self->position.x + (GreenScreen->hitbox.right << 16);88RSDK.SetSpriteAnimation(GreenScreen->aniFrames, 1, &self->animator, true, bgID);89while (drawPos.x < sizeX) {90RSDK.DrawSprite(&self->animator, &drawPos, false);91drawPos.x += GreenScreen->bgSize[bgID];92}93}9495void GreenScreen_DrawBackgrounds(void)96{97RSDK_THIS(GreenScreen);9899int32 clipX1 = 0, clipY1 = 0, clipX2 = 0, clipY2 = 0;100if (!SceneInfo->inEditor) {101clipX1 = ScreenInfo->clipBound_X1;102clipY1 = ScreenInfo->clipBound_Y1;103clipX2 = ScreenInfo->clipBound_X2;104clipY2 = ScreenInfo->clipBound_Y2;105RSDK.SetClipBounds(SceneInfo->currentScreenID, (self->position.x >> 16) + GreenScreen->hitbox.left - ScreenInfo->position.x,106(self->position.y >> 16) + GreenScreen->hitbox.top - ScreenInfo->position.y,107(self->position.x >> 16) + GreenScreen->hitbox.right - ScreenInfo->position.x,108(self->position.y >> 16) + GreenScreen->hitbox.bottom - ScreenInfo->position.y);109}110111for (int32 bgID = 0; bgID < 5; ++bgID) {112GreenScreen_DrawBG(self->position.x - self->startPos.x + self->paraOffset.x, self->position.y - self->startPos.y + self->paraOffset.y, bgID,113GreenScreen->parallaxFactor[bgID]);114}115116if (!SceneInfo->inEditor)117RSDK.SetClipBounds(SceneInfo->currentScreenID, clipX1, clipY1, clipX2, clipY2);118}119120void GreenScreen_DrawSprites(void)121{122RSDK_THIS(GreenScreen);123124if ((SceneInfo->currentDrawGroup != Zone->objectDrawGroup[1] && self->showBG) || (SceneInfo->inEditor && self->paraPreview))125GreenScreen_DrawBackgrounds();126127if (SceneInfo->currentDrawGroup == Zone->objectDrawGroup[1] || SceneInfo->inEditor) {128RSDK.SetSpriteAnimation(GreenScreen->aniFrames, 0, &self->animator, true, 0);129RSDK.DrawSprite(&self->animator, NULL, false);130}131}132133#if GAME_INCLUDE_EDITOR134void GreenScreen_EditorDraw(void)135{136RSDK_THIS(GreenScreen);137138self->active = ACTIVE_BOUNDS;139self->startPos = self->position;140self->visible = true;141self->drawFX = FX_FLIP;142self->updateRange.x = 0x800000;143self->updateRange.y = 0x800000;144self->showBG = false;145146if (!self->paraYFactor)147self->paraYFactor = 32;148149GreenScreen_DrawSprites();150}151152void GreenScreen_EditorLoad(void)153{154GreenScreen->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/GreenScreen.bin", SCOPE_STAGE);155156GreenScreen->parallaxFactor[0] = 0;157GreenScreen->parallaxFactor[1] = 42;158GreenScreen->parallaxFactor[2] = 64;159GreenScreen->parallaxFactor[3] = 96;160GreenScreen->parallaxFactor[4] = 112;161162GreenScreen->bgSize[0] = 16 << 16;163GreenScreen->bgSize[1] = 180 << 16;164GreenScreen->bgSize[2] = 190 << 16;165GreenScreen->bgSize[3] = 192 << 16;166GreenScreen->bgSize[4] = 192 << 16;167}168#endif169170void GreenScreen_Serialize(void)171{172RSDK_EDITABLE_VAR(GreenScreen, VAR_VECTOR2, paraOffset);173RSDK_EDITABLE_VAR(GreenScreen, VAR_ENUM, paraYFactor);174RSDK_EDITABLE_VAR(GreenScreen, VAR_BOOL, paraPreview);175}176177178