Path: blob/master/SonicMania/Objects/OOZ/Smog.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Smog Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectSmog *Smog;1011void Smog_Update(void)12{13RSDK_THIS(Smog);1415if (Smog->forceEnabled) {16OOZSetup->smogTimer = 0;17self->alpha = 0x80;18RSDK.SetLimitedFade(0, 1, 2, 224, 0, 255);19}20else {21if (OOZSetup->smogTimer <= 600) {22if (self->alpha > 0) {23RSDK.SetLimitedFade(0, 1, 2, 0, 0, 255);24self->alpha -= 8;25}2627self->timer = 0;28}29else {30RSDK.SetLimitedFade(0, 1, 2, (OOZSetup->smogTimer - 600) >> 2, 0, 255);3132if (self->alpha < 0x80)33self->alpha++;34}35}3637if (OOZSetup->smogTimer > 1800) {38++self->timer;3940foreach_active(Player, player)41{42if (player->superState != SUPERSTATE_SUPER) {43HUD_EnableRingFlash();4445if (self->timer == 60 && !player->sidekick && player->rings > 0)46Player_GiveRings(player, -1, true);47}48}4950if (self->timer == 60)51self->timer = 0;52}53}5455void Smog_LateUpdate(void) {}5657void Smog_StaticUpdate(void)58{59globals->tempFlags = OOZSetup->useSmogEffect;6061if (Smog->starPostID != StarPost->postIDs[0]) {62Smog->starPostID = StarPost->postIDs[0];63globals->restartFlags = OOZSetup->useSmogEffect;64}65}6667void Smog_Draw(void)68{69RSDK_THIS(Smog);7071int32 y = (Zone->timer + (ScreenInfo->position.y << 1)) << 14;72uint8 scanlineID = ((ScreenInfo->position.y >> 1) + 2 * Zone->timer);7374ScanlineInfo *scanline = Smog->scanlines;75for (int32 i = 0; i < ScreenInfo->size.y; ++i) {76scanline->position.x = TO_FIXED(ScreenInfo->position.x) + Smog->scanlineList[scanlineID].position.x;77scanline->position.y = y;78scanline->deform.x = Smog->scanlineList[scanlineID].deform.x;79scanline->deform.y = 0;8081y += Smog->scanlineList[(scanlineID + 1) & 0xFF].deform.y;82scanline++;83scanlineID++;84}8586if (self->alpha >= 0x80)87RSDK.DrawDeformedSprite(Smog->aniFrames, INK_BLEND, 0xE0);88else89RSDK.DrawDeformedSprite(Smog->aniFrames, INK_ALPHA, self->alpha);90}9192void Smog_Create(void *data)93{94RSDK_THIS(Smog);9596if (!SceneInfo->inEditor) {97self->active = ACTIVE_NORMAL;98self->visible = true;99self->inkEffect = INK_ALPHA;100self->drawGroup = Zone->hudDrawGroup - 1;101102OOZSetup->smogTimer = 0;103104if (!SceneInfo->milliseconds && !SceneInfo->seconds && !SceneInfo->minutes) {105Smog->starPostID = 0;106globals->restartFlags = 1;107globals->tempFlags = 1;108OOZSetup->useSmogEffect = true;109}110else {111if (isMainGameMode() && globals->enableIntro) {112if (CutsceneRules_CheckStageReload()) {113if (SceneInfo->minutes == globals->tempMinutes && SceneInfo->seconds == globals->tempSeconds114&& SceneInfo->milliseconds == globals->tempMilliseconds) {115OOZSetup->useSmogEffect = globals->tempFlags;116}117else {118OOZSetup->useSmogEffect = globals->restartFlags;119}120121EntityZone *zone = RSDK_GET_ENTITY(SLOT_ZONE, Zone);122zone->fadeColor = 0x000000;123zone->timer = 0;124zone->visible = true;125zone->drawGroup = DRAWGROUP_COUNT - 1;126zone->stateDraw = Zone_Draw_Fade;127}128else {129Smog->starPostID = 0;130globals->restartFlags = 1;131globals->tempFlags = 1;132OOZSetup->useSmogEffect = true;133}134}135else {136if (SceneInfo->minutes == globals->tempMinutes && SceneInfo->seconds == globals->tempSeconds137&& SceneInfo->milliseconds == globals->tempMilliseconds) {138OOZSetup->useSmogEffect = globals->tempFlags;139}140else {141OOZSetup->useSmogEffect = globals->restartFlags;142}143144EntityZone *zone = RSDK_GET_ENTITY(SLOT_ZONE, Zone);145zone->fadeColor = 0x000000;146zone->timer = 0;147zone->visible = true;148zone->drawGroup = DRAWGROUP_COUNT - 1;149zone->stateDraw = Zone_Draw_Fade;150}151}152}153}154155void Smog_StageLoad(void)156{157Smog->aniFrames = RSDK.LoadSpriteSheet("OOZ/Smog.gif", SCOPE_STAGE);158Smog->scanlines = RSDK.GetScanlines();159160ScanlineInfo *scanline = (ScanlineInfo *)Smog->scanlineList;161int32 angle = 0;162for (int32 i = 0; i < 0x100; ++i) {163scanline[i].deform.x = (RSDK.Sin256(angle >> 1) << 6) + 0x10000;164scanline[i].deform.y = (RSDK.Sin256(angle >> 1) << 5) + 0x10000;165scanline[i].position.x = (RSDK.Sin256(angle) << 10) - scanline[i].deform.x * ScreenInfo->center.x;166scanline[i].position.y = 0;167168angle += 2;169}170171RSDK.CopyPalette(0, 0, 1, 0, 128);172RSDK.CopyPalette(0, 0, 2, 0, 128);173RSDK.SetLimitedFade(2, 1, 3, 64, 0, 127);174RSDK.SetLimitedFade(0, 1, 2, 0, 0, 255);175RSDK.SetDrawGroupProperties(Zone->hudDrawGroup - 1, false, Smog_DrawHook_ApplySmogPalette);176}177178void Smog_DrawHook_ApplySmogPalette(void) { RSDK.CopyPalette(1, 0, 0, 0, 128); }179180#if GAME_INCLUDE_EDITOR181void Smog_EditorDraw(void) {}182183void Smog_EditorLoad(void) {}184#endif185186void Smog_Serialize(void) {}187188189