Path: blob/master/RSDKv5/RSDK/Scene/Legacy/v4/SceneLegacyv4.cpp
1174 views
1#if RETRO_USE_MOD_LOADER2namespace RSDK3{4namespace Legacy5{6namespace v47{89bool32 loadGlobalScripts = false; // stored here so I can use it later10int32 globalObjCount = 0;1112} // namespace v413} // namespace Legacy14} // namespace RSDK15#endif1617void RSDK::Legacy::v4::InitFirstStage(void)18{19xScrollOffset = 0;20yScrollOffset = 0;21StopMusic();22fadeMode = 0;23ClearGraphicsData();24ClearAnimationData();25activePalette = fullPalette[0];26stageMode = STAGEMODE_LOAD;27gameMode = ENGINE_MAINGAME;28}2930void RSDK::Legacy::v4::ProcessStage(void)31{32#if !RETRO_USE_ORIGINAL_CODE33debugHitboxCount = 0;34#endif3536switch (stageMode) {37case STAGEMODE_LOAD: // Startup38SetActivePalette(0, 0, 256);39gameMenu[0].visibleRowOffset = 0;40gameMenu[1].visibleRowOffset = 0;41videoSettings.dimLimit = (5 * 60) * videoSettings.refreshRate;42fadeMode = 0;43InitCameras();44cameraShift = 0;45cameraLockedY = 0;46xScrollOffset = 0;47yScrollOffset = 0;48cameraShakeX = 0;49cameraShakeY = 0;50vertexCount = 0;51faceCount = 0;52frameCounter = 0;53pauseEnabled = false;54timeEnabled = false;55stageMilliseconds = 0;56stageSeconds = 0;57stageMinutes = 0;58stageMode = STAGEMODE_NORMAL;5960#if RSDK_AUTOBUILD61// Prevent playing as Amy if on autobuilds62if (GetGlobalVariableByName("PLAYER_AMY") && playerListPos == GetGlobalVariableByName("PLAYER_AMY"))63playerListPos = 0;64else if (GetGlobalVariableByName("PLAYER_AMY_TAILS") && playerListPos == GetGlobalVariableByName("PLAYER_AMY_TAILS"))65playerListPos = 0;66#endif6768#if RETRO_USE_MOD_LOADER69if (devMenu.modsChanged)70RefreshModFolders();71#endif72ResetBackgroundSettings();73LoadStageFiles();74break;7576case STAGEMODE_NORMAL:77if (fadeMode > 0)78fadeMode--;7980lastXSize = -1;81lastYSize = -1;8283ProcessInput();8485if (pauseEnabled && controller[CONT_ANY].keyStart.press) {86stageMode += STAGEMODE_STEPOVER;87PauseSound();88}8990ProcessSceneTimer();9192// Update93ProcessObjects();94HandleCameras();95ProcessParallaxAutoScroll();9697#if !RETRO_USE_ORIGINAL_CODE98for (int32 i = 1; i < engine.gameSpeed; ++i) {99ProcessSceneTimer();100101// Update102ProcessObjects();103HandleCameras();104ProcessParallaxAutoScroll();105}106#endif107108currentScreen = &screens[0];109sceneInfo.currentScreenID = 0;110DrawStageGFX();111break;112113case STAGEMODE_PAUSED:114if (fadeMode > 0)115fadeMode--;116117lastXSize = -1;118lastYSize = -1;119120ProcessInput();121122if (pauseEnabled && controller[CONT_ANY].keyStart.press) {123stageMode += STAGEMODE_STEPOVER;124PauseSound();125}126127// Update128ProcessPausedObjects();129130#if !RETRO_USE_ORIGINAL_CODE131for (int32 i = 1; i < engine.gameSpeed; ++i) {132ProcessPausedObjects();133}134#endif135136for (int32 s = 0; s < videoSettings.screenCount; ++s) {137currentScreen = &screens[s];138sceneInfo.currentScreenID = s;139140DrawObjectList(0);141DrawObjectList(1);142DrawObjectList(2);143DrawObjectList(3);144DrawObjectList(4);145DrawObjectList(5);146DrawObjectList(7); // ???147DrawObjectList(6);148}149150currentScreen = &screens[0];151sceneInfo.currentScreenID = 0;152153#if !RETRO_USE_ORIGINAL_CODE154DrawDebugOverlays();155#endif156break;157158case STAGEMODE_FROZEN:159if (fadeMode > 0)160fadeMode--;161162lastXSize = -1;163lastYSize = -1;164165ProcessInput();166167if (pauseEnabled && controller[CONT_ANY].keyStart.press) {168stageMode += STAGEMODE_STEPOVER;169PauseSound();170}171172// Update173ProcessFrozenObjects();174HandleCameras();175176#if !RETRO_USE_ORIGINAL_CODE177for (int32 i = 1; i < engine.gameSpeed; ++i) {178ProcessFrozenObjects();179HandleCameras();180}181#endif182183currentScreen = &screens[0];184sceneInfo.currentScreenID = 0;185DrawStageGFX();186break;187188case STAGEMODE_2P:189if (fadeMode > 0)190fadeMode--;191192lastXSize = -1;193lastYSize = -1;194195ProcessInput();196197if (pauseEnabled && controller[CONT_ANY].keyStart.press) {198stageMode += STAGEMODE_STEPOVER;199PauseSound();200}201202ProcessSceneTimer();203204// Update205Process2PObjects();206ProcessParallaxAutoScroll();207208#if !RETRO_USE_ORIGINAL_CODE209for (int32 i = 1; i < engine.gameSpeed; ++i) {210ProcessSceneTimer();211212Process2PObjects();213ProcessParallaxAutoScroll();214}215#endif216217for (int32 s = 0; s < videoSettings.screenCount; ++s) {218currentScreen = &screens[s];219sceneInfo.currentScreenID = s;220221HandleCameras();222DrawStageGFX();223}224225currentScreen = &screens[0];226sceneInfo.currentScreenID = 0;227228break;229230case STAGEMODE_NORMAL + STAGEMODE_STEPOVER:231if (fadeMode > 0)232fadeMode--;233234lastXSize = -1;235lastYSize = -1;236237ProcessInput();238239if (controller[CONT_ANY].keyC.press || engine.frameStep) {240#if !RETRO_USE_ORIGINAL_CODE241if (!engine.frameStep) {242for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;243}244engine.frameStep = false;245#else246for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;247#endif248249ProcessSceneTimer();250251ProcessObjects();252HandleCameras();253254DrawStageGFX();255ProcessParallaxAutoScroll();256257#if !RETRO_USE_ORIGINAL_CODE258engine.frameStep = false;259#endif260}261262if (pauseEnabled && controller[CONT_ANY].keyStart.press) {263stageMode -= STAGEMODE_STEPOVER;264ResumeSound();265}266break;267268case STAGEMODE_PAUSED + STAGEMODE_STEPOVER:269if (fadeMode > 0)270fadeMode--;271272lastXSize = -1;273lastYSize = -1;274275ProcessInput();276277if (controller[CONT_ANY].keyC.press || engine.frameStep) {278#if !RETRO_USE_ORIGINAL_CODE279if (!engine.frameStep) {280for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;281}282engine.frameStep = false;283#else284for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;285#endif286287ProcessPausedObjects();288289DrawObjectList(0);290DrawObjectList(1);291DrawObjectList(2);292DrawObjectList(3);293DrawObjectList(4);294DrawObjectList(5);295DrawObjectList(7); // ???296DrawObjectList(6);297298#if !RETRO_USE_ORIGINAL_CODE299DrawDebugOverlays();300#endif301}302303if (pauseEnabled && controller[CONT_ANY].keyStart.press) {304stageMode -= STAGEMODE_STEPOVER;305ResumeSound();306}307break;308309case STAGEMODE_FROZEN + STAGEMODE_STEPOVER:310if (fadeMode > 0)311fadeMode--;312313lastXSize = -1;314lastYSize = -1;315316ProcessInput();317318if (controller[CONT_ANY].keyC.press || engine.frameStep) {319#if !RETRO_USE_ORIGINAL_CODE320if (!engine.frameStep) {321for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;322}323engine.frameStep = false;324#else325for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;326#endif327328// Update329ProcessFrozenObjects();330HandleCameras();331332DrawStageGFX();333}334335if (pauseEnabled && controller[CONT_ANY].keyStart.press) {336stageMode -= STAGEMODE_STEPOVER;337ResumeSound();338}339break;340341case STAGEMODE_2P + STAGEMODE_STEPOVER:342if (fadeMode > 0)343fadeMode--;344345lastXSize = -1;346lastYSize = -1;347348ProcessInput();349350if (controller[CONT_ANY].keyC.press || engine.frameStep) {351#if !RETRO_USE_ORIGINAL_CODE352if (!engine.frameStep) {353for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;354}355engine.frameStep = false;356#else357for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;358#endif359360ProcessSceneTimer();361362// Update363Process2PObjects();364HandleCameras();365366DrawStageGFX();367ProcessParallaxAutoScroll();368}369370if (pauseEnabled && controller[CONT_ANY].keyStart.press) {371stageMode -= STAGEMODE_STEPOVER;372ResumeSound();373}374break;375}376}377378void RSDK::Legacy::v4::HandleCameras()379{380currentCamera = &cameras[sceneInfo.currentScreenID];381if (currentCamera->target >= LEGACY_v4_ENTITY_COUNT)382return;383384if (currentCamera->enabled == 1) {385switch (currentCamera->style) {386case CAMERASTYLE_FOLLOW: SetPlayerScreenPosition(&objectEntityList[currentCamera->target]); break;387case CAMERASTYLE_EXTENDED:388case CAMERASTYLE_EXTENDED_OFFSET_L:389case CAMERASTYLE_EXTENDED_OFFSET_R: SetPlayerScreenPositionCDStyle(&objectEntityList[currentCamera->target]); break;390case CAMERASTYLE_HLOCKED: SetPlayerHLockedScreenPosition(&objectEntityList[currentCamera->target]); break;391case CAMERASTYLE_FIXED: SetPlayerScreenPositionFixed(&objectEntityList[currentCamera->target]); break;392case CAMERASTYLE_STATIC: SetPlayerScreenPositionStatic(&objectEntityList[currentCamera->target]); break;393default: break;394}395}396else {397SetPlayerLockedScreenPosition(&objectEntityList[currentCamera->target]);398}399}400401void RSDK::Legacy::v4::ProcessParallaxAutoScroll()402{403for (int32 i = 0; i < hParallax.entryCount; ++i) hParallax.scrollPos[i] += hParallax.scrollSpeed[i];404for (int32 i = 0; i < vParallax.entryCount; ++i) vParallax.scrollPos[i] += vParallax.scrollSpeed[i];405}406407void RSDK::Legacy::v4::LoadStageFiles()408{409int32 scriptID = 1;410char strBuffer[0x100];411412FileInfo info;413InitFileInfo(&info);414415if (!CheckCurrentStageFolder()) {416PrintLog(PRINT_NORMAL, "Loading Scene %s - %s", sceneInfo.listCategory[sceneInfo.activeCategory].name,417sceneInfo.listData[sceneInfo.listPos].name);418419// Unload stage sfx & audio channels420ClearStageSfx();421422ClearScriptData();423424for (int32 i = LEGACY_SURFACE_COUNT; i > 0; i--) RemoveGraphicsFile((char *)"", i - 1);425426#if RETRO_USE_MOD_LOADER427loadGlobalScripts = false;428#else429bool32 loadGlobalScripts = false;430#endif431432InitFileInfo(&info);433if (LoadStageFile("StageConfig.bin", &info)) {434loadGlobalScripts = ReadInt8(&info);435CloseFile(&info);436}437438InitFileInfo(&info);439if (loadGlobalScripts && LoadFile(&info, "Data/Game/GameConfig.bin", FMODE_RB)) {440ReadString(&info, strBuffer); // Title441ReadString(&info, strBuffer); // Subtitle442443uint8 buf[3];444for (int32 c = 0; c < 0x60; ++c) {445ReadBytes(&info, buf, 3);446SetPaletteEntry(-1, c, buf[0], buf[1], buf[2]);447}448449uint8 globalObjectCount = ReadInt8(&info);450for (uint8 i = 0; i < globalObjectCount; ++i) {451ReadString(&info, strBuffer);452SetObjectTypeName(strBuffer, scriptID + i);453}454455#if RETRO_USE_MOD_LOADER && LEGACY_RETRO_USE_COMPILER456for (uint8 i = 0; i < modObjCount && loadGlobalScripts; ++i) {457SetObjectTypeName(modTypeNames[i], globalObjectCount + i + 1);458}459#endif460461#if LEGACY_RETRO_USE_COMPILER462#if RETRO_USE_MOD_LOADER463bool32 bytecodeExists = false;464FileInfo bytecodeInfo;465InitFileInfo(&bytecodeInfo);466467if (LoadFile(&bytecodeInfo, "Bytecode/GlobalCode.bin", FMODE_RB)) {468bytecodeExists = true;469CloseFile(&bytecodeInfo);470}471472if (bytecodeExists && !modSettings.forceScripts) {473#else474if (usingBytecode) {475#endif476LoadBytecode(scriptID, true);477scriptID += globalObjectCount;478}479else {480for (uint8 i = 0; i < globalObjectCount; ++i) {481ReadString(&info, strBuffer);482ParseScriptFile(strBuffer, scriptID++);483484if (gameMode == ENGINE_SCRIPTERROR)485return;486}487}488#else489LoadBytecode(scriptID, true);490scriptID += globalObjectCount;491#endif492CloseFile(&info);493494#if RETRO_USE_MOD_LOADER495LoadGameXML(true);496#endif497498#if RETRO_USE_MOD_LOADER && LEGACY_RETRO_USE_COMPILER499globalObjCount = globalObjectCount;500for (uint8 i = 0; i < modObjCount && loadGlobalScripts; ++i) {501SetObjectTypeName(modTypeNames[i], scriptID);502503ParseScriptFile(modScriptPaths[i], scriptID++);504if (gameMode == ENGINE_SCRIPTERROR)505return;506}507#endif508}509510InitFileInfo(&info);511if (LoadStageFile("StageConfig.bin", &info)) {512ReadInt8(&info); // Load Globals513514uint8 clr[3];515for (int32 i = 0x60; i < 0x80; ++i) {516ReadBytes(&info, clr, 3);517SetPaletteEntry(-1, i, clr[0], clr[1], clr[2]);518}519520stageSFXCount = ReadInt8(&info);521for (uint8 i = 0; i < stageSFXCount; ++i) {522ReadString(&info, strBuffer);523SetSfxName(strBuffer, i + globalSFXCount);524}525526for (uint8 i = 0; i < stageSFXCount; ++i) {527ReadString(&info, strBuffer);528529RSDK::Legacy::LoadSfx(strBuffer, globalSFXCount + i, SCOPE_STAGE);530}531532uint8 stageObjectCount = ReadInt8(&info);533for (uint8 i = 0; i < stageObjectCount; ++i) {534ReadString(&info, strBuffer);535536SetObjectTypeName(strBuffer, scriptID + i);537}538539#if LEGACY_RETRO_USE_COMPILER540#if RETRO_USE_MOD_LOADER541char scriptPath[0x40];542switch (sceneInfo.activeCategory) {543case STAGELIST_PRESENTATION:544case STAGELIST_REGULAR:545case STAGELIST_BONUS:546case STAGELIST_SPECIAL:547StrCopy(scriptPath, "Bytecode/");548StrAdd(scriptPath, sceneInfo.listData[sceneInfo.listPos].folder);549StrAdd(scriptPath, ".bin");550break;551default: break;552}553554bool32 bytecodeExists = false;555FileInfo bytecodeInfo;556InitFileInfo(&bytecodeInfo);557if (LoadFile(&bytecodeInfo, scriptPath, FMODE_RB)) {558bytecodeExists = true;559CloseFile(&bytecodeInfo);560}561562if (bytecodeExists && !modSettings.forceScripts) {563#else564if (usingBytecode) {565#endif566for (uint8 i = 0; i < stageObjectCount; ++i) {567ReadString(&info, strBuffer);568}569570LoadBytecode(scriptID, false);571}572else {573for (uint8 i = 0; i < stageObjectCount; ++i) {574ReadString(&info, strBuffer);575ParseScriptFile(strBuffer, scriptID + i);576577if (gameMode == ENGINE_SCRIPTERROR)578return;579}580}581#else582for (uint8 i = 0; i < stageObjectCount; ++i) {583ReadString(&info, strBuffer);584}585LoadBytecode(scriptID, false);586#endif587CloseFile(&info);588}589590LoadStageGIFFile();591LoadStageCollisions();592LoadStageBackground();593}594else {595PrintLog(PRINT_NORMAL, "Reloading Scene %s - %s", sceneInfo.listCategory[sceneInfo.activeCategory].name,596sceneInfo.listData[sceneInfo.listPos].name);597}598LoadStageChunks();599600for (int32 i = 0; i < LEGACY_TRACK_COUNT; ++i) SetMusicTrack("", i, false, 0);601602memset(objectEntityList, 0, LEGACY_v4_ENTITY_COUNT * sizeof(Entity));603for (int32 i = 0; i < LEGACY_v4_ENTITY_COUNT; ++i) {604objectEntityList[i].drawOrder = 3;605objectEntityList[i].scale = 512;606objectEntityList[i].objectInteractions = true;607objectEntityList[i].visible = true;608objectEntityList[i].tileCollisions = true;609}610611LoadActLayout();612Init3DFloorBuffer(0);613ProcessStartupObjects();614}615void RSDK::Legacy::v4::LoadActLayout()616{617FileInfo info;618InitFileInfo(&info);619620for (int32 a = 0; a < 4; ++a) activeTileLayers[a] = 9; // disables missing scenes from rendering621622if (LoadActFile(".bin", &info)) {623int32 tCardWordLen = ReadInt8(&info);624titleCardWord2 = tCardWordLen;625for (int32 i = 0; i < tCardWordLen; ++i) {626titleCardText[i] = ReadInt8(&info);627if (titleCardText[i] == '-')628titleCardWord2 = (uint8)(i + 1);629}630titleCardText[tCardWordLen] = '\0';631632// READ TILELAYER633ReadBytes(&info, activeTileLayers, 4);634tLayerMidPoint = ReadInt8(&info);635636stageLayouts[0].xsize = ReadInt8(&info);637ReadInt8(&info); // Unused638639stageLayouts[0].ysize = ReadInt8(&info);640ReadInt8(&info); // Unused641642curXBoundary1 = 0;643newXBoundary1 = 0;644curYBoundary1 = 0;645newYBoundary1 = 0;646curXBoundary2 = stageLayouts[0].xsize << 7;647curYBoundary2 = stageLayouts[0].ysize << 7;648waterLevel = curYBoundary2 + 128;649newXBoundary2 = stageLayouts[0].xsize << 7;650newYBoundary2 = stageLayouts[0].ysize << 7;651652memset(stageLayouts[0].tiles, 0, LEGACY_TILELAYER_CHUNK_COUNT * sizeof(uint16));653memset(stageLayouts[0].lineScroll, 0, 0x7FFF);654655for (int32 y = 0; y < stageLayouts[0].ysize; ++y) {656uint16 *tiles = &stageLayouts[0].tiles[(y * LEGACY_TILELAYER_CHUNK_H)];657for (int32 x = 0; x < stageLayouts[0].xsize; ++x) {658tiles[x] = ReadInt8(&info);659tiles[x] |= ReadInt8(&info) << 8;660}661}662663// READ OBJECTS664int32 objectCount = ReadInt8(&info);665objectCount |= ReadInt8(&info) << 8;666#if !RETRO_USE_ORIGINAL_CODE667if (objectCount > 0x400)668PrintLog(PRINT_NORMAL, "WARNING: object count %d exceeds the object limit", objectCount);669#endif670671#if RETRO_USE_MOD_LOADER672int32 offsetCount = 0;673for (int32 m = 0; m < modObjCount; ++m)674if (modScriptFlags[m])675++offsetCount;676#endif677678Entity *object = &objectEntityList[32];679for (int32 i = 0; i < objectCount; ++i) {680int32 activeVars = ReadInt8(&info);681activeVars |= ReadInt8(&info) << 8;682683object->type = ReadInt8(&info);684685#if RETRO_USE_MOD_LOADER686if (loadGlobalScripts && offsetCount && object->type > globalObjCount)687object->type += offsetCount; // offset it by our mod count688#endif689690object->propertyValue = ReadInt8(&info);691692object->xpos = ReadInt8(&info);693object->xpos |= ReadInt8(&info) << 8;694object->xpos |= ReadInt8(&info) << 16;695object->xpos |= ReadInt8(&info) << 24;696697object->ypos = ReadInt8(&info);698object->ypos |= ReadInt8(&info) << 8;699object->ypos |= ReadInt8(&info) << 16;700object->ypos |= ReadInt8(&info) << 24;701702if (activeVars & 0x1) {703object->state = ReadInt8(&info);704object->state |= ReadInt8(&info) << 8;705object->state |= ReadInt8(&info) << 16;706object->state |= ReadInt8(&info) << 24;707}708709if (activeVars & 0x2)710object->direction = ReadInt8(&info);711712if (activeVars & 0x4) {713object->scale = ReadInt8(&info);714object->scale |= ReadInt8(&info) << 8;715object->scale |= ReadInt8(&info) << 16;716object->scale |= ReadInt8(&info) << 24;717}718719if (activeVars & 0x8) {720object->rotation = ReadInt8(&info);721object->rotation |= ReadInt8(&info) << 8;722object->rotation |= ReadInt8(&info) << 16;723object->rotation |= ReadInt8(&info) << 24;724}725726if (activeVars & 0x10)727object->drawOrder = ReadInt8(&info);728729if (activeVars & 0x20)730object->priority = ReadInt8(&info);731732if (activeVars & 0x40)733object->alpha = ReadInt8(&info);734735if (activeVars & 0x80)736object->animation = ReadInt8(&info);737738if (activeVars & 0x100) {739object->animationSpeed = ReadInt8(&info);740object->animationSpeed |= ReadInt8(&info) << 8;741object->animationSpeed |= ReadInt8(&info) << 16;742object->animationSpeed |= ReadInt8(&info) << 24;743}744745if (activeVars & 0x200)746object->frame = ReadInt8(&info);747748if (activeVars & 0x400)749object->inkEffect = ReadInt8(&info);750751if (activeVars & 0x800) {752object->values[0] = ReadInt8(&info);753object->values[0] |= ReadInt8(&info) << 8;754object->values[0] |= ReadInt8(&info) << 16;755object->values[0] |= ReadInt8(&info) << 24;756}757758if (activeVars & 0x1000) {759object->values[1] = ReadInt8(&info);760object->values[1] |= ReadInt8(&info) << 8;761object->values[1] |= ReadInt8(&info) << 16;762object->values[1] |= ReadInt8(&info) << 24;763}764765if (activeVars & 0x2000) {766object->values[2] = ReadInt8(&info);767object->values[2] |= ReadInt8(&info) << 8;768object->values[2] |= ReadInt8(&info) << 16;769object->values[2] |= ReadInt8(&info) << 24;770}771772if (activeVars & 0x4000) {773object->values[3] = ReadInt8(&info);774object->values[3] |= ReadInt8(&info) << 8;775object->values[3] |= ReadInt8(&info) << 16;776object->values[3] |= ReadInt8(&info) << 24;777}778779++object;780}781782CloseFile(&info);783}784785stageLayouts[0].type = LAYER_HSCROLL;786}787void RSDK::Legacy::v4::LoadStageBackground()788{789for (int32 i = 0; i < LEGACY_LAYER_COUNT; ++i) {790stageLayouts[i].type = LAYER_NOSCROLL;791stageLayouts[i].deformationOffset = 0;792stageLayouts[i].deformationOffsetW = 0;793}794795for (int32 i = 0; i < LEGACY_PARALLAX_COUNT; ++i) {796hParallax.scrollPos[i] = 0;797vParallax.scrollPos[i] = 0;798}799800FileInfo info;801InitFileInfo(&info);802if (LoadStageFile("Backgrounds.bin", &info)) {803uint8 layerCount = ReadInt8(&info);804805hParallax.entryCount = ReadInt8(&info);806for (uint8 i = 0; i < hParallax.entryCount; ++i) {807hParallax.parallaxFactor[i] = ReadInt8(&info);808hParallax.parallaxFactor[i] |= ReadInt8(&info) << 8;809810hParallax.scrollSpeed[i] = ReadInt8(&info) << 10;811812hParallax.scrollPos[i] = 0;813814hParallax.deform[i] = ReadInt8(&info);815}816817vParallax.entryCount = ReadInt8(&info);818for (uint8 i = 0; i < vParallax.entryCount; ++i) {819vParallax.parallaxFactor[i] = ReadInt8(&info);820vParallax.parallaxFactor[i] |= ReadInt8(&info) << 8;821822vParallax.scrollSpeed[i] = ReadInt8(&info) << 10;823824vParallax.scrollPos[i] = 0;825826vParallax.deform[i] = ReadInt8(&info);827}828829for (uint8 i = 1; i < layerCount + 1; ++i) {830stageLayouts[i].xsize = ReadInt8(&info);831ReadInt8(&info); // unused832833stageLayouts[i].ysize = ReadInt8(&info);834ReadInt8(&info);835836stageLayouts[i].type = ReadInt8(&info);837838stageLayouts[i].parallaxFactor = ReadInt8(&info);839stageLayouts[i].parallaxFactor |= ReadInt8(&info) << 8;840841stageLayouts[i].scrollSpeed = ReadInt8(&info) << 10;842stageLayouts[i].scrollPos = 0;843844memset(stageLayouts[i].tiles, 0, LEGACY_TILELAYER_CHUNK_COUNT * sizeof(uint16));845uint8 *lineScrollPtr = stageLayouts[i].lineScroll;846memset(stageLayouts[i].lineScroll, 0, 0x7FFF);847848// Read Line Scroll849uint8 buf[3];850while (true) {851buf[0] = ReadInt8(&info);852853if (buf[0] == 0xFF) {854buf[1] = ReadInt8(&info);855if (buf[1] == 0xFF) {856break;857}858else {859buf[2] = ReadInt8(&info);860int32 index = buf[1];861int32 cnt = buf[2] - 1;862for (int32 c = 0; c < cnt; ++c) *lineScrollPtr++ = index;863}864}865else {866*lineScrollPtr++ = buf[0];867}868}869870// Read Layout871for (int32 y = 0; y < stageLayouts[i].ysize; ++y) {872uint16 *chunks = &stageLayouts[i].tiles[y * LEGACY_TILELAYER_CHUNK_H];873for (int32 x = 0; x < stageLayouts[i].xsize; ++x) {874*chunks = ReadInt8(&info);875*chunks |= ReadInt8(&info) << 8;876877++chunks;878}879}880}881882CloseFile(&info);883}884}885886void RSDK::Legacy::v4::SetPlayerScreenPosition(Entity *target)887{888int32 targetX = target->xpos >> 16;889int32 targetY = currentCamera->adjustY + (target->ypos >> 16);890891if (newYBoundary1 > curYBoundary1) {892if (newYBoundary1 >= yScrollOffset)893curYBoundary1 = yScrollOffset;894else895curYBoundary1 = newYBoundary1;896}897898if (newYBoundary1 < curYBoundary1) {899if (curYBoundary1 >= yScrollOffset)900--curYBoundary1;901else902curYBoundary1 = newYBoundary1;903}904905if (newYBoundary2 < curYBoundary2) {906if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)907--curYBoundary2;908else909curYBoundary2 = yScrollOffset + SCREEN_YSIZE;910}911912if (newYBoundary2 > curYBoundary2) {913if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2) {914++curYBoundary2;915if (target->yvel > 0) {916int32 buf = curYBoundary2 + (target->yvel >> 16);917if (newYBoundary2 < buf) {918curYBoundary2 = newYBoundary2;919}920else {921curYBoundary2 += target->yvel >> 16;922}923}924}925else926curYBoundary2 = newYBoundary2;927}928if (newXBoundary1 > curXBoundary1) {929if (xScrollOffset <= newXBoundary1)930curXBoundary1 = xScrollOffset;931else932curXBoundary1 = newXBoundary1;933}934if (newXBoundary1 < curXBoundary1) {935if (xScrollOffset <= curXBoundary1) {936--curXBoundary1;937if (target->xvel < 0) {938curXBoundary1 += target->xvel >> 16;939if (curXBoundary1 < newXBoundary1)940curXBoundary1 = newXBoundary1;941}942}943else {944curXBoundary1 = newXBoundary1;945}946}947948if (newXBoundary2 < curXBoundary2) {949if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)950curXBoundary2 = newXBoundary2;951else952curXBoundary2 = SCREEN_XSIZE + xScrollOffset;953}954955if (newXBoundary2 > curXBoundary2) {956if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {957++curXBoundary2;958if (target->xvel > 0) {959curXBoundary2 += target->xvel >> 16;960if (curXBoundary2 > newXBoundary2)961curXBoundary2 = newXBoundary2;962}963}964else {965curXBoundary2 = newXBoundary2;966}967}968969int32 xPosDif = targetX - currentCamera->xpos;970if (targetX > currentCamera->xpos) {971xPosDif -= 8;972if (xPosDif >= 0) {973if (xPosDif >= 17)974xPosDif = 16;975}976else {977xPosDif = 0;978}979}980else {981xPosDif += 8;982if (xPosDif > 0) {983xPosDif = 0;984}985else if (xPosDif <= -17) {986xPosDif = -16;987}988}989990int32 centeredXBound1 = currentCamera->xpos + xPosDif;991currentCamera->xpos = centeredXBound1;992if (centeredXBound1 < SCREEN_CENTERX + curXBoundary1) {993currentCamera->xpos = SCREEN_CENTERX + curXBoundary1;994centeredXBound1 = SCREEN_CENTERX + curXBoundary1;995}996997int32 centeredXBound2 = curXBoundary2 - SCREEN_CENTERX;998if (centeredXBound2 < centeredXBound1) {999currentCamera->xpos = centeredXBound2;1000centeredXBound1 = centeredXBound2;1001}10021003int32 yPosDif = 0;1004if (target->scrollTracking) {1005if (targetY <= currentCamera->ypos) {1006yPosDif = (targetY - currentCamera->ypos) + 32;1007if (yPosDif <= 0) {1008if (yPosDif <= -17)1009yPosDif = -16;1010}1011else1012yPosDif = 0;1013}1014else {1015yPosDif = (targetY - currentCamera->ypos) - 32;1016if (yPosDif >= 0) {1017if (yPosDif >= 17)1018yPosDif = 16;1019}1020else1021yPosDif = 0;1022}1023cameraLockedY = false;1024}1025else if (cameraLockedY) {1026yPosDif = 0;1027currentCamera->ypos = targetY;1028}1029else if (targetY <= currentCamera->ypos) {1030yPosDif = targetY - currentCamera->ypos;1031if (targetY - currentCamera->ypos <= 0) {1032if (yPosDif >= -32 && abs(target->yvel) <= 0x60000) {1033if (yPosDif < -6) {1034yPosDif = -6;1035}1036}1037else if (yPosDif < -16) {1038yPosDif = -16;1039}1040}1041else {1042yPosDif = 0;1043cameraLockedY = true;1044}1045}1046else {1047yPosDif = targetY - currentCamera->ypos;1048if (targetY - currentCamera->ypos < 0) {1049yPosDif = 0;1050cameraLockedY = true;1051}1052else if (yPosDif > 32 || abs(target->yvel) > 0x60000) {1053if (yPosDif > 16) {1054yPosDif = 16;1055}1056else {1057cameraLockedY = true;1058}1059}1060else {1061if (yPosDif <= 6) {1062cameraLockedY = true;1063}1064else {1065yPosDif = 6;1066}1067}1068}10691070int32 newCamY = currentCamera->ypos + yPosDif;1071if (newCamY <= curYBoundary1 + (LEGACY_SCREEN_SCROLL_UP - 1))1072newCamY = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1073currentCamera->ypos = newCamY;1074if (curYBoundary2 - (LEGACY_SCREEN_SCROLL_DOWN - 1) <= newCamY) {1075currentCamera->ypos = curYBoundary2 - LEGACY_SCREEN_SCROLL_DOWN;1076}10771078xScrollOffset = cameraShakeX + centeredXBound1 - SCREEN_CENTERX;10791080int32 pos = currentCamera->ypos + target->lookPosY - LEGACY_SCREEN_SCROLL_UP;1081if (pos < curYBoundary1) {1082yScrollOffset = curYBoundary1;1083}1084else {1085yScrollOffset = currentCamera->ypos + target->lookPosY - LEGACY_SCREEN_SCROLL_UP;1086}10871088int32 y = curYBoundary2 - SCREEN_YSIZE;1089if (curYBoundary2 - (SCREEN_YSIZE - 1) > yScrollOffset)1090y = yScrollOffset;1091yScrollOffset = cameraShakeY + y;10921093if (cameraShakeX) {1094if (cameraShakeX <= 0) {1095cameraShakeX = ~cameraShakeX;1096}1097else {1098cameraShakeX = -cameraShakeX;1099}1100}11011102if (cameraShakeY) {1103if (cameraShakeY <= 0) {1104cameraShakeY = ~cameraShakeY;1105}1106else {1107cameraShakeY = -cameraShakeY;1108}1109}1110}1111void RSDK::Legacy::v4::SetPlayerScreenPositionCDStyle(Entity *target)1112{1113int32 targetX = target->xpos >> 16;1114int32 targetY = currentCamera->adjustY + (target->ypos >> 16);11151116if (newYBoundary1 > curYBoundary1) {1117if (newYBoundary1 >= yScrollOffset)1118curYBoundary1 = yScrollOffset;1119else1120curYBoundary1 = newYBoundary1;1121}11221123if (newYBoundary1 < curYBoundary1) {1124if (curYBoundary1 >= yScrollOffset)1125--curYBoundary1;1126else1127curYBoundary1 = newYBoundary1;1128}11291130if (newYBoundary2 < curYBoundary2) {1131if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)1132--curYBoundary2;1133else1134curYBoundary2 = yScrollOffset + SCREEN_YSIZE;1135}11361137if (newYBoundary2 > curYBoundary2) {1138if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2) {1139++curYBoundary2;1140if (target->yvel > 0) {1141int32 buf = curYBoundary2 + (target->yvel >> 16);1142if (newYBoundary2 < buf) {1143curYBoundary2 = newYBoundary2;1144}1145else {1146curYBoundary2 += target->yvel >> 16;1147}1148}1149}1150else1151curYBoundary2 = newYBoundary2;1152}11531154if (newXBoundary1 > curXBoundary1) {1155if (xScrollOffset <= newXBoundary1)1156curXBoundary1 = xScrollOffset;1157else1158curXBoundary1 = newXBoundary1;1159}11601161if (newXBoundary1 < curXBoundary1) {1162if (xScrollOffset <= curXBoundary1) {1163--curXBoundary1;1164if (target->xvel < 0) {1165curXBoundary1 += target->xvel >> 16;1166if (curXBoundary1 < newXBoundary1)1167curXBoundary1 = newXBoundary1;1168}1169}1170else {1171curXBoundary1 = newXBoundary1;1172}1173}11741175if (newXBoundary2 < curXBoundary2) {1176if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)1177curXBoundary2 = newXBoundary2;1178else1179curXBoundary2 = SCREEN_XSIZE + xScrollOffset;1180}11811182if (newXBoundary2 > curXBoundary2) {1183if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {1184++curXBoundary2;1185if (target->xvel > 0) {1186curXBoundary2 += target->xvel >> 16;1187if (curXBoundary2 > newXBoundary2)1188curXBoundary2 = newXBoundary2;1189}1190}1191else {1192curXBoundary2 = newXBoundary2;1193}1194}11951196if (!target->gravity) {1197if (target->direction) {1198if (currentCamera->style == CAMERASTYLE_EXTENDED_OFFSET_R || target->speed < -0x5F5C2) {1199cameraShift = 2;1200if (target->lookPosX <= 63) {1201target->lookPosX += 2;1202}1203}1204else {1205cameraShift = 0;1206if (target->lookPosX < 0) {1207target->lookPosX += 2;1208}12091210if (target->lookPosX > 0) {1211target->lookPosX -= 2;1212}1213}1214}1215else {1216if (currentCamera->style == CAMERASTYLE_EXTENDED_OFFSET_L || target->speed > 0x5F5C2) {1217cameraShift = 1;1218if (target->lookPosX >= -63) {1219target->lookPosX -= 2;1220}1221}1222else {1223cameraShift = 0;1224if (target->lookPosX < 0) {1225target->lookPosX += 2;1226}12271228if (target->lookPosX > 0) {1229target->lookPosX -= 2;1230}1231}1232}1233}1234else {1235if (cameraShift == 1) {1236if (target->lookPosX >= -63) {1237target->lookPosX -= 2;1238}1239}1240else if (cameraShift < 1) {1241if (target->lookPosX < 0) {1242target->lookPosX += 2;1243}1244if (target->lookPosX > 0) {1245target->lookPosX -= 2;1246}1247}1248else if (cameraShift == 2) {1249if (target->lookPosX <= 63) {1250target->lookPosX += 2;1251}1252}1253}1254currentCamera->xpos = targetX - target->lookPosX;12551256if (!target->scrollTracking) {1257if (cameraLockedY) {1258currentCamera->ypos = targetY;1259if (currentCamera->ypos < curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1260currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1261}1262}1263else if (targetY > currentCamera->ypos) {1264int32 dif = targetY - currentCamera->ypos;1265if (targetY - currentCamera->ypos < 0) {1266cameraLockedY = true;1267if (currentCamera->ypos < curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1268currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1269}1270}1271else {1272if (dif > 32 || abs(target->yvel) > 0x60000) {1273if (dif > 16) {1274dif = 16;1275if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1276currentCamera->ypos += dif;1277}1278else {1279currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1280}1281}1282else {1283cameraLockedY = true;1284if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1285currentCamera->ypos += dif;1286}1287else {1288currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1289}1290}1291}1292else if (dif > 6) {1293dif = 6;1294if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1295currentCamera->ypos += dif;1296}1297else {1298currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1299}1300}1301else {1302cameraLockedY = true;1303if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1304currentCamera->ypos += dif;1305}1306else {1307currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1308}1309}1310}1311}1312else {1313int32 dif = targetY - currentCamera->ypos;1314if (targetY - currentCamera->ypos <= 0) {1315if (dif < -32 || abs(target->yvel) > 0x60000) {1316if (dif < -16) {1317dif = -16;1318if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1319currentCamera->ypos += dif;1320}1321else {1322currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1323}1324}1325else {1326cameraLockedY = true;1327if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1328currentCamera->ypos += dif;1329}1330else {1331currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1332}1333}1334}1335else if (dif < -6) {1336dif = -6;1337if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1338currentCamera->ypos += dif;1339}1340else {1341currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1342}1343}1344}1345else {1346dif = 0;1347if (abs(target->yvel) > 0x60000) {1348cameraLockedY = true;1349if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1350currentCamera->ypos += dif;1351}1352else {1353currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1354}1355}1356else {1357cameraLockedY = true;1358if (currentCamera->ypos + dif >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1359currentCamera->ypos += dif;1360}1361else {1362currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1363}1364}1365}1366}1367}1368else {1369int32 dif = targetY - currentCamera->ypos;1370int32 difY = 0;1371if (targetY > currentCamera->ypos) {1372difY = dif - 32;1373if (difY >= 0) {1374if (difY >= 17)1375difY = 16;13761377cameraLockedY = false;1378if (currentCamera->ypos + difY >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1379currentCamera->ypos += difY;1380}1381else {1382currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1383}1384}1385else {1386cameraLockedY = false;1387if (currentCamera->ypos < curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1388currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1389}1390}1391}1392else {1393difY = dif + 32;1394if (difY > 0) {1395difY = 0;13961397cameraLockedY = false;1398if (currentCamera->ypos < curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1399currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1400}1401}1402else if (difY <= -17) {1403difY = -16;14041405cameraLockedY = false;1406if (currentCamera->ypos + difY >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1407currentCamera->ypos += difY;1408}1409else {1410currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1411}1412}1413else {1414cameraLockedY = false;1415if (currentCamera->ypos + difY >= curYBoundary1 + LEGACY_SCREEN_SCROLL_UP) {1416currentCamera->ypos += difY;1417}1418else {1419currentCamera->ypos = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1420}1421}1422}1423}14241425if (currentCamera->ypos >= curYBoundary2 - LEGACY_SCREEN_SCROLL_DOWN - 1) {1426currentCamera->ypos = curYBoundary2 - LEGACY_SCREEN_SCROLL_DOWN;1427}14281429xScrollOffset = currentCamera->xpos - SCREEN_CENTERX;1430yScrollOffset = target->lookPosY + currentCamera->ypos - LEGACY_SCREEN_SCROLL_UP;14311432int32 x = curXBoundary1;1433if (x <= xScrollOffset)1434x = xScrollOffset;1435else1436xScrollOffset = x;14371438if (x > curXBoundary2 - SCREEN_XSIZE) {1439x = curXBoundary2 - SCREEN_XSIZE;1440xScrollOffset = curXBoundary2 - SCREEN_XSIZE;1441}14421443int32 y = curYBoundary1;1444if (yScrollOffset >= y)1445y = yScrollOffset;1446else1447yScrollOffset = y;14481449if (curYBoundary2 - SCREEN_YSIZE - 1 <= y)1450y = curYBoundary2 - SCREEN_YSIZE;14511452xScrollOffset = cameraShakeX + x;1453yScrollOffset = cameraShakeY + y;14541455if (cameraShakeX) {1456if (cameraShakeX <= 0) {1457cameraShakeX = ~cameraShakeX;1458}1459else {1460cameraShakeX = -cameraShakeX;1461}1462}14631464if (cameraShakeY) {1465if (cameraShakeY <= 0) {1466cameraShakeY = ~cameraShakeY;1467}1468else {1469cameraShakeY = -cameraShakeY;1470}1471}1472}1473void RSDK::Legacy::v4::SetPlayerHLockedScreenPosition(Entity *target)1474{1475int32 targetY = currentCamera->adjustY + (target->ypos >> 16);14761477if (newYBoundary1 <= curYBoundary1) {1478if (curYBoundary1 > yScrollOffset)1479--curYBoundary1;1480else1481curYBoundary1 = newYBoundary1;1482}1483else {1484if (newYBoundary1 >= yScrollOffset)1485curYBoundary1 = yScrollOffset;1486else1487curYBoundary1 = newYBoundary1;1488}14891490if (newYBoundary2 < curYBoundary2) {1491if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)1492--curYBoundary2;1493else1494curYBoundary2 = yScrollOffset + SCREEN_YSIZE;1495}1496if (newYBoundary2 > curYBoundary2) {1497if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2) {1498++curYBoundary2;1499if (target->yvel > 0) {1500if (newYBoundary2 < curYBoundary2 + (target->yvel >> 16)) {1501curYBoundary2 = newYBoundary2;1502}1503else {1504curYBoundary2 += target->yvel >> 16;1505}1506}1507}1508else1509curYBoundary2 = newYBoundary2;1510}15111512if (newXBoundary1 > curXBoundary1) {1513if (xScrollOffset <= newXBoundary1)1514curXBoundary1 = xScrollOffset;1515else1516curXBoundary1 = newXBoundary1;1517}1518if (newXBoundary1 < curXBoundary1) {1519if (xScrollOffset <= curXBoundary1) {1520--curXBoundary1;1521if (target->xvel < 0) {1522curXBoundary1 += target->xvel >> 16;1523if (curXBoundary1 < newXBoundary1)1524curXBoundary1 = newXBoundary1;1525}1526}1527else {1528curXBoundary1 = newXBoundary1;1529}1530}15311532if (newXBoundary2 < curXBoundary2) {1533if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)1534curXBoundary2 = newXBoundary2;1535else1536curXBoundary2 = SCREEN_XSIZE + xScrollOffset;1537}15381539if (newXBoundary2 > curXBoundary2) {1540if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {1541++curXBoundary2;1542if (target->xvel > 0) {1543curXBoundary2 += target->xvel >> 16;1544if (curXBoundary2 > newXBoundary2)1545curXBoundary2 = newXBoundary2;1546}1547}1548else {1549curXBoundary2 = newXBoundary2;1550}1551}15521553int32 camScroll = 0;1554if (target->scrollTracking) {1555if (targetY <= currentCamera->ypos) {1556camScroll = targetY - currentCamera->ypos + 32;1557if (camScroll <= 0) {1558if (camScroll <= -17)1559camScroll = -16;1560}1561else1562camScroll = 0;1563}1564else {1565camScroll = targetY - currentCamera->ypos - 32;1566if (camScroll >= 0) {1567if (camScroll >= 17)1568camScroll = 16;1569}1570else1571camScroll = 0;1572}1573cameraLockedY = false;1574}1575else if (cameraLockedY) {1576camScroll = 0;1577currentCamera->ypos = targetY;1578}1579else if (targetY > currentCamera->ypos) {1580camScroll = targetY - currentCamera->ypos;1581if (camScroll >= 0) {1582if (camScroll > 32 || abs(target->yvel) > 0x60000) {1583if (camScroll > 16) {1584camScroll = 16;1585}1586else {1587cameraLockedY = true;1588}1589}1590else if (camScroll > 6) {1591camScroll = 6;1592}1593else {1594cameraLockedY = true;1595}1596}1597else {1598camScroll = 0;1599cameraLockedY = true;1600}1601}1602else {1603camScroll = targetY - currentCamera->ypos;1604if (camScroll > 0) {1605camScroll = 0;1606cameraLockedY = true;1607}1608else if (camScroll < -32 || abs(target->yvel) > 0x60000) {1609if (camScroll < -16) {1610camScroll = -16;1611}1612else {1613cameraLockedY = true;1614}1615}1616else {1617if (camScroll >= -6)1618cameraLockedY = true;1619else1620camScroll = -6;1621}1622}16231624int32 newCamY = currentCamera->ypos + camScroll;1625if (newCamY <= curYBoundary1 + (LEGACY_SCREEN_SCROLL_UP - 1))1626newCamY = curYBoundary1 + LEGACY_SCREEN_SCROLL_UP;1627currentCamera->ypos = newCamY;1628if (curYBoundary2 - (LEGACY_SCREEN_SCROLL_DOWN - 1) <= newCamY) {1629newCamY = curYBoundary2 - LEGACY_SCREEN_SCROLL_DOWN;1630currentCamera->ypos = curYBoundary2 - LEGACY_SCREEN_SCROLL_DOWN;1631}16321633xScrollOffset = cameraShakeX + currentCamera->xpos - SCREEN_CENTERX;16341635int32 pos = newCamY + target->lookPosY - LEGACY_SCREEN_SCROLL_UP;1636if (pos < curYBoundary1) {1637yScrollOffset = curYBoundary1;1638}1639else {1640yScrollOffset = newCamY + target->lookPosY - LEGACY_SCREEN_SCROLL_UP;1641}1642int32 y1 = curYBoundary2 - (SCREEN_YSIZE - 1);1643int32 y2 = curYBoundary2 - SCREEN_YSIZE;1644if (y1 > yScrollOffset)1645y2 = yScrollOffset;1646yScrollOffset = cameraShakeY + y2;16471648if (cameraShakeX) {1649if (cameraShakeX <= 0) {1650cameraShakeX = ~cameraShakeX;1651}1652else {1653cameraShakeX = -cameraShakeX;1654}1655}16561657if (cameraShakeY) {1658if (cameraShakeY <= 0) {1659cameraShakeY = ~cameraShakeY;1660}1661else {1662cameraShakeY = -cameraShakeY;1663}1664}1665}1666void RSDK::Legacy::v4::SetPlayerLockedScreenPosition(Entity *target)1667{1668if (newYBoundary1 > curYBoundary1) {1669if (yScrollOffset <= newYBoundary1)1670curYBoundary1 = yScrollOffset;1671else1672curYBoundary1 = newYBoundary1;1673}1674if (newYBoundary1 < curYBoundary1) {1675if (yScrollOffset <= curYBoundary1)1676--curYBoundary1;1677else1678curYBoundary1 = newYBoundary1;1679}16801681if (newYBoundary2 < curYBoundary2) {1682if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)1683--curYBoundary2;1684else1685curYBoundary2 = yScrollOffset + SCREEN_YSIZE;1686}16871688if (newYBoundary2 > curYBoundary2) {1689if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2)1690++curYBoundary2;1691else1692curYBoundary2 = newYBoundary2;1693}16941695if (newXBoundary1 > curXBoundary1) {1696if (xScrollOffset <= newXBoundary1)1697curXBoundary1 = xScrollOffset;1698else1699curXBoundary1 = newXBoundary1;1700}17011702if (newXBoundary1 < curXBoundary1) {1703if (xScrollOffset <= curXBoundary1) {1704--curXBoundary1;1705if (target->xvel < 0) {1706curXBoundary1 += target->xvel >> 16;1707if (curXBoundary1 < newXBoundary1)1708curXBoundary1 = newXBoundary1;1709}1710}1711else {1712curXBoundary1 = newXBoundary1;1713}1714}17151716if (newXBoundary2 < curXBoundary2) {1717if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)1718curXBoundary2 = newXBoundary2;1719else1720curXBoundary2 = SCREEN_XSIZE + xScrollOffset;1721}17221723if (newXBoundary2 > curXBoundary2) {1724if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {1725++curXBoundary2;1726if (target->xvel > 0) {1727curXBoundary2 += target->xvel >> 16;1728if (curXBoundary2 > newXBoundary2)1729curXBoundary2 = newXBoundary2;1730}1731}1732else {1733curXBoundary2 = newXBoundary2;1734}1735}17361737if (cameraShakeX) {1738if (cameraShakeX <= 0) {1739cameraShakeX = ~cameraShakeX;1740}1741else {1742cameraShakeX = -cameraShakeX;1743}1744}17451746if (cameraShakeY) {1747if (cameraShakeY <= 0) {1748cameraShakeY = ~cameraShakeY;1749}1750else {1751cameraShakeY = -cameraShakeY;1752}1753}1754}1755void RSDK::Legacy::v4::SetPlayerScreenPositionFixed(Entity *target)1756{1757int32 targetX = target->xpos >> 16;1758int32 targetY = currentCamera->adjustY + (target->ypos >> 16);17591760if (newYBoundary1 > curYBoundary1) {1761if (newYBoundary1 >= yScrollOffset)1762curYBoundary1 = yScrollOffset;1763else1764curYBoundary1 = newYBoundary1;1765}17661767if (newYBoundary1 < curYBoundary1) {1768if (curYBoundary1 >= yScrollOffset)1769--curYBoundary1;1770else1771curYBoundary1 = newYBoundary1;1772}17731774if (newYBoundary2 < curYBoundary2) {1775if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)1776--curYBoundary2;1777else1778curYBoundary2 = yScrollOffset + SCREEN_YSIZE;1779}17801781if (newYBoundary2 > curYBoundary2) {1782if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2) {1783++curYBoundary2;1784if (target->yvel > 0) {1785int32 buf = curYBoundary2 + (target->yvel >> 16);1786if (newYBoundary2 < buf) {1787curYBoundary2 = newYBoundary2;1788}1789else {1790curYBoundary2 += target->yvel >> 16;1791}1792}1793}1794else1795curYBoundary2 = newYBoundary2;1796}17971798if (newXBoundary1 > curXBoundary1) {1799if (xScrollOffset <= newXBoundary1)1800curXBoundary1 = xScrollOffset;1801else1802curXBoundary1 = newXBoundary1;1803}18041805if (newXBoundary1 < curXBoundary1) {1806if (xScrollOffset <= curXBoundary1) {1807--curXBoundary1;1808if (target->xvel < 0) {1809curXBoundary1 += target->xvel >> 16;1810if (curXBoundary1 < newXBoundary1)1811curXBoundary1 = newXBoundary1;1812}1813}1814else {1815curXBoundary1 = newXBoundary1;1816}1817}18181819if (newXBoundary2 < curXBoundary2) {1820if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)1821curXBoundary2 = newXBoundary2;1822else1823curXBoundary2 = SCREEN_XSIZE + xScrollOffset;1824}18251826if (newXBoundary2 > curXBoundary2) {1827if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {1828++curXBoundary2;1829if (target->xvel > 0) {1830curXBoundary2 += target->xvel >> 16;1831if (curXBoundary2 > newXBoundary2)1832curXBoundary2 = newXBoundary2;1833}1834}1835else {1836curXBoundary2 = newXBoundary2;1837}1838}18391840currentCamera->xpos = targetX;1841if (targetX < SCREEN_CENTERX + curXBoundary1) {1842targetX = SCREEN_CENTERX + curXBoundary1;1843currentCamera->xpos = SCREEN_CENTERX + curXBoundary1;1844}1845int32 boundX2 = curXBoundary2 - SCREEN_CENTERX;1846if (boundX2 < targetX) {1847targetX = boundX2;1848currentCamera->xpos = boundX2;1849}18501851if (targetY <= curYBoundary1 + 119) {1852targetY = curYBoundary1 + 120;1853currentCamera->ypos = curYBoundary1 + 120;1854}1855else {1856currentCamera->ypos = targetY;1857}1858if (curYBoundary2 - ((SCREEN_YSIZE / 2) - 1) <= targetY) {1859targetY = curYBoundary2 - (SCREEN_YSIZE / 2);1860currentCamera->ypos = curYBoundary2 - (SCREEN_YSIZE / 2);1861}18621863xScrollOffset = cameraShakeX + targetX - SCREEN_CENTERX;1864int32 camY = targetY + target->lookPosY - (SCREEN_YSIZE / 2);1865if (curYBoundary1 > camY) {1866yScrollOffset = curYBoundary1;1867}1868else {1869yScrollOffset = targetY + target->lookPosY - (SCREEN_YSIZE / 2);1870}18711872int32 newCamY = curYBoundary2 - SCREEN_YSIZE;1873if (curYBoundary2 - (SCREEN_YSIZE - 1) > yScrollOffset)1874newCamY = yScrollOffset;1875yScrollOffset = cameraShakeY + newCamY;18761877if (cameraShakeX) {1878if (cameraShakeX <= 0) {1879cameraShakeX = ~cameraShakeX;1880}1881else {1882cameraShakeX = -cameraShakeX;1883}1884}18851886if (cameraShakeY) {1887if (cameraShakeY <= 0) {1888cameraShakeY = ~cameraShakeY;1889}1890else {1891cameraShakeY = -cameraShakeY;1892}1893}1894}1895void RSDK::Legacy::v4::SetPlayerScreenPositionStatic(Entity *target)1896{1897xScrollOffset = currentCamera->xpos - SCREEN_CENTERX;1898yScrollOffset = currentCamera->ypos + target->lookPosY - LEGACY_SCREEN_SCROLL_UP;18991900if (yScrollOffset < curYBoundary1)1901yScrollOffset = curYBoundary1;1902if (yScrollOffset > curYBoundary2 - SCREEN_YSIZE)1903yScrollOffset = curYBoundary2 - SCREEN_YSIZE;1904}190519061907