Path: blob/master/SonicMania/Objects/LRZ/LRZ2Setup.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: LRZ2Setup Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectLRZ2Setup *LRZ2Setup;1011void LRZ2Setup_Update(void) {}1213void LRZ2Setup_LateUpdate(void) {}1415void LRZ2Setup_StaticUpdate(void)16{17// Lava18LRZ2Setup->lavaPalTimer += 24;19if (LRZ2Setup->lavaPalTimer >= 256) {20LRZ2Setup->lavaPalTimer -= 256;2122RSDK.RotatePalette(1, 224, 227, true);23RSDK.RotatePalette(2, 224, 227, true);24RSDK.RotatePalette(3, 224, 227, true);25RSDK.RotatePalette(4, 224, 227, true);26}2728// Conveyor Belt Animations29++LRZ2Setup->conveyorPalTimer;30if (LRZ2Setup->conveyorPalTimer == 128) {31LRZ2Setup->conveyorPalTimer = 0;32++LRZ2Setup->conveyorDstPal;33++LRZ2Setup->conveyorSrcPal;3435if (LRZ2Setup->conveyorDstPal > 3)36LRZ2Setup->conveyorDstPal = 1;3738if (LRZ2Setup->conveyorSrcPal > 3)39LRZ2Setup->conveyorSrcPal = 1;40}4142RSDK.SetLimitedFade(0, LRZ2Setup->conveyorSrcPal, LRZ2Setup->conveyorDstPal, (RSDK.Cos256(LRZ2Setup->conveyorPalTimer) >> 1) + 0x80, 160, 168);43if (!LRZ2Setup->conveyorOff && !(Zone->timer & 1))44RSDK.RotatePalette(0, 228, 231, (LRZ2Setup->conveyorDir & 0xFF));4546// Rock Hues47RSDK.SetLimitedFade(5, 1, 4, abs(RSDK.Cos1024(2 * (Zone->timer & 0x1FF)) >> 3), 224, 227);48RSDK.RotatePalette(3, 224, 227, true);49RSDK.RotatePalette(4, 224, 227, true);5051RSDK.SetLimitedFade(6, 2, 4, abs(RSDK.Cos1024(2 * (Zone->timer & 0x1FF)) >> 3), 224, 227);52RSDK.RotatePalette(3, 224, 227, false);53RSDK.RotatePalette(4, 224, 227, false);5455// Apply Lava Fading56RSDK.SetLimitedFade(0, 5, 6, LRZ2Setup->lavaPalTimer, 224, 227);5758// Tile Behaviours59foreach_active(Player, player)60{61if (player->onGround) {62Hitbox *playerHitbox = Player_GetHitbox(player);63uint8 behaviour = LRZ2_TFLAGS_NORMAL;64int32 tileInfo = 0;6566LRZ2Setup_GetTileInfo(player->position.x, player->position.y + (playerHitbox->bottom << 16), player->moveLayerPosition.x,67player->moveLayerPosition.y, player->collisionPlane, &tileInfo, &behaviour);6869if (behaviour == LRZ2_TFLAGS_NORMAL) {70LRZ2Setup_GetTileInfo(player->position.x + (playerHitbox->right << 16), player->position.y + (playerHitbox->bottom << 16),71player->moveLayerPosition.x, player->moveLayerPosition.y, player->collisionPlane, &tileInfo, &behaviour);72}7374if (behaviour == LRZ2_TFLAGS_NORMAL) {75LRZ2Setup_GetTileInfo(player->position.x + (playerHitbox->left << 16), player->position.y + (playerHitbox->bottom << 16),76player->moveLayerPosition.x, player->moveLayerPosition.y, player->collisionPlane, &tileInfo, &behaviour);77}7879bool32 conveyorCollided = false;80uint8 conveyorDir = 0;81switch (behaviour) {82default: break;83case LRZ2_TFLAGS_LAVA: {84int32 solid = 1 << 14;85if (player->collisionPlane)86solid = 1 << 12;8788if ((solid & tileInfo) && player->shield != SHIELD_FIRE)89Player_HurtFlip(player);90break;91}9293case LRZ2_TFLAGS_CONVEYOR_L:94conveyorCollided = true;95conveyorDir = 0;96break;9798case LRZ2_TFLAGS_CONVEYOR_R:99conveyorCollided = true;100conveyorDir = 1;101break;102}103104if (!LRZ2Setup->conveyorOff && conveyorCollided) {105if (player->onGround) {106player->position.x += (2 * ((((tileInfo & 0x400) != 0) ^ (LRZ2Setup->conveyorDir & 0xFF)) != conveyorDir) - 1) << 17;107player->position.y += 0x10000;108}109}110}111}112}113114void LRZ2Setup_Draw(void) {}115116void LRZ2Setup_Create(void *data) {}117118void LRZ2Setup_StageLoad(void)119{120Animals->animalTypes[0] = ANIMAL_FLICKY;121Animals->animalTypes[1] = ANIMAL_CUCKY;122123if (!isMainGameMode() || !globals->atlEnabled || CutsceneRules_CheckStageReload()) {124for (int32 p = 0; p < Player->playerCount; ++p) {125Zone->cameraBoundsL[p] += 0x100;126}127}128else {129LRZ2Setup_HandleStageReload();130}131132#if MANIA_USE_PLUS133if (SceneInfo->filter & FILTER_ENCORE) {134RSDK.LoadPalette(0, "EncoreLRZ2.act", 0b0000000011111111);135RSDK.CopyPalette(0, 128, 1, 128, 128);136}137#endif138139LRZ2Setup->conveyorDstPal = 1;140LRZ2Setup->conveyorSrcPal = 2;141142if (globals->gameMode == MODE_TIMEATTACK || globals->gameMode == MODE_COMPETITION)143GenericTrigger->callbacks[GENERICTRIGGER_LRZ2_OUTRO] = StateMachine_None;144else145GenericTrigger->callbacks[GENERICTRIGGER_LRZ2_OUTRO] = LRZ2Setup_Trigger_StartOutro;146}147148void LRZ2Setup_HandleStageReload(void)149{150Vector2 pos = { 0, 0 };151152foreach_all(DashLift, lift)153{154pos.x = lift->position.x;155pos.y = lift->position.y;156foreach_break;157}158159Zone_ReloadStoredEntities(pos.x, pos.y, false);160161foreach_all(Player, player)162{163player->position.x = pos.x;164player->position.y = pos.y - 0x100000;165}166167CREATE_ENTITY(LRZ1Outro, NULL, 0, 0);168}169170void LRZ2Setup_Trigger_StartOutro(void)171{172if (isMainGameMode()) {173EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);174175#if MANIA_USE_PLUS176if (globals->gameMode == MODE_ENCORE)177globals->tempFlags = player1->position.y > (1024 << 16);178#endif179180if (player1->stateInput) {181player1->stateInput = StateMachine_None;182player1->left = false;183player1->right = true;184185for (int32 p = 0; p < Player->playerCount; ++p) StarPost->postIDs[p] = 0;186187SaveGame_SavePlayerState();188189globals->enableIntro = true;190globals->suppressAutoMusic = true;191globals->suppressTitlecard = true;192193++SceneInfo->listPos;194if (!RSDK.CheckValidScene())195RSDK.SetScene("Presentation", "Title Screen");196197Zone_StartFadeOut(10, 0x000000);198}199200if (player1->superState == SUPERSTATE_SUPER || player1->state == Player_State_Transform)201globals->restartPowerups |= 0x80;202203#if GAME_VERSION != VER_100204globals->restartMusicID = Music->activeTrack;205#endif206}207}208209EntityButton *LRZ2Setup_SetupTagLink(int32 tag, Entity *entity)210{211// Yes..... :smirk:212// if (SceneInfo->inEditor)213// return NULL;214215EntityButton *taggedButton = NULL;216if (tag > 0) {217if (Button) {218foreach_all(Button, button)219{220if (button->tag == tag) {221taggedButton = button;222foreach_break;223}224}225}226227if (TurretSwitch && !taggedButton) {228foreach_all(TurretSwitch, turretSwitch)229{230if (turretSwitch->tag == tag) {231taggedButton = (EntityButton *)turretSwitch;232foreach_break;233}234}235}236}237238if (taggedButton) {239if ((Button && taggedButton->classID == Button->classID) || (TurretSwitch && taggedButton->classID == TurretSwitch->classID)) {240if (entity) {241int32 distX = abs(entity->position.x - taggedButton->position.x);242int32 distY = abs(entity->position.y - taggedButton->position.y);243244if (entity->updateRange.x < 0x800000 + distX)245entity->updateRange.x = 0x800000 + distX;246247if (entity->updateRange.y < 0x800000 + distY)248entity->updateRange.y = 0x800000 + distY;249}250}251else {252taggedButton = NULL;253}254}255256return taggedButton;257}258259void LRZ2Setup_GetTileInfo(int32 x, int32 y, int32 moveOffsetX, int32 moveOffsetY, int32 cPlane, int32 *tile, uint8 *flags)260{261int32 tileLow = RSDK.GetTile(Zone->fgLayer[0], x >> 20, y >> 20);262int32 tileHigh = RSDK.GetTile(Zone->fgLayer[1], x >> 20, y >> 20);263264int32 flagsLow = RSDK.GetTileFlags(tileLow, cPlane);265int32 flagsHigh = RSDK.GetTileFlags(tileHigh, cPlane);266267int32 tileMove = 0;268int32 flagsMove = 0;269if (Zone->moveLayer) {270tileMove = RSDK.GetTile(Zone->moveLayer, (moveOffsetX + x) >> 20, (moveOffsetY + y) >> 20);271flagsMove = RSDK.GetTileFlags(tileMove, cPlane);272}273274int32 tileSolidLow = 0;275int32 tileSolidHigh = 0;276int32 tileSolidMove = 0;277if (cPlane) {278tileSolidHigh = (tileHigh >> 14) & 3;279tileSolidLow = (tileLow >> 14) & 3;280}281else {282tileSolidHigh = (tileHigh >> 12) & 3;283tileSolidLow = (tileLow >> 12) & 3;284}285286if (Zone->moveLayer)287tileSolidMove = (tileMove >> 12) & 3;288289*tile = 0;290*flags = LRZ2_TFLAGS_NORMAL;291if (flagsMove && tileSolidMove) {292*tile = tileMove;293*flags = flagsMove;294}295else if (flagsHigh && tileSolidHigh) {296*tile = tileHigh;297*flags = flagsHigh;298}299else if (flagsLow && tileSolidLow) {300*tile = tileLow;301*flags = flagsLow;302}303}304305#if GAME_INCLUDE_EDITOR306void LRZ2Setup_EditorDraw(void) {}307308void LRZ2Setup_EditorLoad(void)309{310RSDK_ACTIVE_VAR(GenericTrigger, triggerID);311RSDK_ENUM_VAR("LRZ2 Outro", GENERICTRIGGER_LRZ2_OUTRO);312}313#endif314315void LRZ2Setup_Serialize(void) {}316317318