Path: blob/master/RSDKv5/RSDK/Scene/Legacy/v3/SceneLegacyv3.cpp
1177 views
1int32 RSDK::Legacy::v3::yScrollA = 0;2int32 RSDK::Legacy::v3::yScrollB = SCREEN_YSIZE;3int32 RSDK::Legacy::v3::xScrollA = 0;4int32 RSDK::Legacy::v3::xScrollB = Legacy::SCREEN_XSIZE;5int32 RSDK::Legacy::v3::yScrollMove = 0;67#if RETRO_USE_MOD_LOADER8namespace RSDK9{10namespace Legacy11{12namespace v313{1415bool32 loadGlobalScripts = false; // stored here so I can use it later16int32 globalObjCount = 0;1718} // namespace v319} // namespace Legacy20} // namespace RSDK21#endif2223void RSDK::Legacy::v3::InitFirstStage()24{25xScrollOffset = 0;26yScrollOffset = 0;27StopMusic();28fadeMode = 0;29ClearGraphicsData();30ClearAnimationData();31activePalette = fullPalette[0];32LoadPalette("MasterPalette.act", 0, 0, 0, 256);33#if RETRO_USE_MOD_LOADER34LoadGameXML(true);35#endif3637stageMode = STAGEMODE_LOAD;38gameMode = ENGINE_MAINGAME;39}4041void RSDK::Legacy::v3::ProcessStage()42{4344#if !RETRO_USE_ORIGINAL_CODE45debugHitboxCount = 0;46#endif4748switch (stageMode) {49case STAGEMODE_LOAD: // Startup50fadeMode = 0;51SetActivePalette(0, 0, 256);52InitCameras();53videoSettings.dimLimit = (5 * 60) * videoSettings.refreshRate;5455xScrollOffset = 0;56yScrollOffset = 0;57yScrollA = 0;58yScrollB = SCREEN_YSIZE;59xScrollA = 0;60xScrollB = SCREEN_XSIZE;61yScrollMove = 0;62cameraShakeX = 0;63cameraShakeY = 0;6465vertexCount = 0;66faceCount = 0;6768#if RSDK_AUTOBUILD69// Prevent playing as Knuckles or Amy if on autobuilds70if (GetGlobalVariableByName("PLAYER_KNUCKLES") && playerListPos == GetGlobalVariableByName("PLAYER_KNUCKLES"))71playerListPos = 0;72else if (GetGlobalVariableByName("PLAYER_KNUCKLES_TAILS") && playerListPos == GetGlobalVariableByName("PLAYER_KNUCKLES_TAILS"))73playerListPos = 0;74else if (GetGlobalVariableByName("PLAYER_AMY") && playerListPos == GetGlobalVariableByName("PLAYER_AMY"))75playerListPos = 0;76else if (GetGlobalVariableByName("PLAYER_AMY_TAILS") && playerListPos == GetGlobalVariableByName("PLAYER_AMY_TAILS"))77playerListPos = 0;78#endif7980for (int32 p = 0; p < LEGACY_v3_PLAYER_COUNT; ++p) {81memset(&playerList[p], 0, sizeof(playerList[p]));82playerList[p].visible = true;83playerList[p].gravity = 1; // Air84playerList[p].tileCollisions = true;85playerList[p].objectInteractions = true;86}8788pauseEnabled = false;89timeEnabled = false;90frameCounter = 0;91stageMilliseconds = 0;92stageSeconds = 0;93stageMinutes = 0;94stageMode = STAGEMODE_NORMAL;9596sceneInfo.currentScreenID = 0;97currentScreen = screens;98#if RETRO_USE_MOD_LOADER99if (devMenu.modsChanged)100RefreshModFolders();101#endif102ResetBackgroundSettings();103LoadStageFiles();104break;105106case STAGEMODE_NORMAL:107if (fadeMode > 0)108fadeMode--;109110if (paletteMode > 0) {111paletteMode = 0;112SetActivePalette(0, 0, 256);113}114115lastXSize = -1;116lastYSize = -1;117118ProcessInput();119120if (pauseEnabled && controller[CONT_ANY].keyStart.press) {121stageMode = STAGEMODE_PAUSED;122PauseSound();123}124125ProcessSceneTimer();126127// Update128ProcessObjects();129HandleCameras();130ProcessParallaxAutoScroll();131132#if !RETRO_USE_ORIGINAL_CODE133for (int32 i = 1; i < engine.gameSpeed; ++i) {134ProcessSceneTimer();135136// Update137ProcessObjects();138HandleCameras();139ProcessParallaxAutoScroll();140}141#endif142143DrawStageGFX();144break;145146case STAGEMODE_PAUSED:147if (fadeMode > 0)148fadeMode--;149150lastXSize = -1;151lastYSize = -1;152153ProcessInput();154155if (controller[CONT_ANY].keyC.press || engine.frameStep) {156#if !RETRO_USE_ORIGINAL_CODE157if (!engine.frameStep) {158for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;159}160engine.frameStep = false;161#else162for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;163#endif164165ProcessSceneTimer();166ProcessObjects();167HandleCameras();168169DrawStageGFX();170171if (fadeMode)172DrawRectangle(0, 0, SCREEN_XSIZE, SCREEN_YSIZE, fadeR, fadeG, fadeB, fadeA);173}174else {175// Update176ProcessPausedObjects();177178DrawObjectList(0);179DrawObjectList(1);180DrawObjectList(2);181DrawObjectList(3);182DrawObjectList(4);183DrawObjectList(5);184DrawObjectList(7); // ???185DrawObjectList(6);186}187188#if !RETRO_USE_ORIGINAL_CODE189DrawDebugOverlays();190#endif191192if (pauseEnabled && controller[CONT_ANY].keyStart.press) {193stageMode = STAGEMODE_NORMAL;194ResumeSound();195}196break;197198case STAGEMODE_NORMAL + STAGEMODE_STEPOVER:199if (fadeMode > 0)200fadeMode--;201202lastXSize = -1;203lastYSize = -1;204205ProcessInput();206207if (controller[CONT_ANY].keyC.press || engine.frameStep) {208#if !RETRO_USE_ORIGINAL_CODE209if (!engine.frameStep) {210for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;211}212engine.frameStep = false;213#else214for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;215#endif216217ProcessSceneTimer();218219ProcessObjects();220HandleCameras();221222DrawStageGFX();223ProcessParallaxAutoScroll();224225#if !RETRO_USE_ORIGINAL_CODE226engine.frameStep = false;227#endif228}229230if (pauseEnabled && controller[CONT_ANY].keyStart.press) {231stageMode -= STAGEMODE_STEPOVER;232ResumeSound();233}234break;235236case STAGEMODE_PAUSED + STAGEMODE_STEPOVER:237if (fadeMode > 0)238fadeMode--;239240lastXSize = -1;241lastYSize = -1;242243ProcessInput();244245if (controller[CONT_ANY].keyC.press || engine.frameStep) {246#if !RETRO_USE_ORIGINAL_CODE247if (!engine.frameStep) {248for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;249}250engine.frameStep = false;251#else252for (int32 c = CONT_ANY; c <= CONT_P1; ++c) controller[c].keyC.press = false;253#endif254255ProcessPausedObjects();256257DrawObjectList(0);258DrawObjectList(1);259DrawObjectList(2);260DrawObjectList(3);261DrawObjectList(4);262DrawObjectList(5);263DrawObjectList(7); // ???264DrawObjectList(6);265266#if !RETRO_USE_ORIGINAL_CODE267DrawDebugOverlays();268#endif269}270271if (pauseEnabled && controller[CONT_ANY].keyStart.press) {272stageMode -= STAGEMODE_STEPOVER;273ResumeSound();274}275break;276}277}278279void RSDK::Legacy::v3::HandleCameras()280{281if (currentCamera->target >= LEGACY_v3_ENTITY_COUNT)282return;283284if (currentCamera->enabled) {285switch (currentCamera->style) {286case CAMERASTYLE_FOLLOW: SetPlayerScreenPosition(&playerList[currentCamera->target]); break;287case CAMERASTYLE_EXTENDED:288case CAMERASTYLE_EXTENDED_OFFSET_L:289case CAMERASTYLE_EXTENDED_OFFSET_R: SetPlayerScreenPositionCDStyle(&playerList[currentCamera->target]); break;290case CAMERASTYLE_HLOCKED: SetPlayerHLockedScreenPosition(&playerList[currentCamera->target]); break;291default: break;292}293}294else {295SetPlayerLockedScreenPosition(&playerList[currentCamera->target]);296}297}298299void RSDK::Legacy::v3::ProcessParallaxAutoScroll()300{301for (int32 i = 0; i < hParallax.entryCount; ++i) hParallax.scrollPos[i] += hParallax.scrollSpeed[i];302for (int32 i = 0; i < vParallax.entryCount; ++i) vParallax.scrollPos[i] += vParallax.scrollSpeed[i];303}304305void RSDK::Legacy::v3::LoadStageFiles()306{307int32 scriptID = 1;308char strBuffer[0x100];309310FileInfo info;311InitFileInfo(&info);312313if (!CheckCurrentStageFolder()) {314PrintLog(PRINT_NORMAL, "Loading Scene %s - %s", sceneInfo.listCategory[sceneInfo.activeCategory].name,315sceneInfo.listData[sceneInfo.listPos].name);316317// Unload stage sfx & audio channels318ClearStageSfx();319320LoadPalette("MasterPalette.act", 0, 0, 0, 256);321#if RETRO_USE_MOD_LOADER322LoadGameXML(true);323#endif324325ClearScriptData();326327for (int32 i = LEGACY_SURFACE_COUNT; i > 0; i--) RemoveGraphicsFile((char *)"", i - 1);328329#if RETRO_USE_MOD_LOADER330loadGlobalScripts = false;331#else332bool32 loadGlobalScripts = false;333#endif334335if (LoadStageFile("StageConfig.bin", &info)) {336loadGlobalScripts = ReadInt8(&info);337CloseFile(&info);338}339340InitFileInfo(&info);341if (loadGlobalScripts && LoadFile(&info, "Data/Game/GameConfig.bin", FMODE_RB)) {342ReadString(&info, strBuffer); // Title343ReadString(&info, strBuffer); // "Data"344ReadString(&info, strBuffer); // Description345346uint8 globalObjectCount = ReadInt8(&info);347for (uint8 i = 0; i < globalObjectCount; ++i) {348ReadString(&info, strBuffer);349SetObjectTypeName(strBuffer, i + scriptID);350}351352#if RETRO_USE_MOD_LOADER353for (uint8 i = 0; i < modObjCount && loadGlobalScripts; ++i) {354SetObjectTypeName(modTypeNames[i], globalObjectCount + i + 1);355}356#endif357358#if LEGACY_RETRO_USE_COMPILER359#if RETRO_USE_MOD_LOADER360char scriptPath[0x40];361StrCopy(scriptPath, "Data/Scripts/ByteCode/GlobalCode.bin");362363bool32 bytecodeExists = false;364FileInfo bytecodeInfo;365InitFileInfo(&bytecodeInfo);366if (LoadFile(&bytecodeInfo, scriptPath, FMODE_RB)) {367bytecodeExists = true;368CloseFile(&bytecodeInfo);369}370371if (bytecodeExists && !modSettings.forceScripts) {372#else373if (usingBytecode) {374#endif375LoadBytecode(scriptID, true);376scriptID += globalObjectCount;377}378else {379for (uint8 i = 0; i < globalObjectCount; ++i) {380ReadString(&info, strBuffer);381382ParseScriptFile(strBuffer, scriptID++);383384if (gameMode == ENGINE_SCRIPTERROR)385return;386}387}388#else389LoadBytecode(scriptID, true);390scriptID += globalObjectCount;391#endif392CloseFile(&info);393394#if RETRO_USE_MOD_LOADER && LEGACY_RETRO_USE_COMPILER395globalObjCount = globalObjectCount;396for (uint8 i = 0; i < modObjCount && loadGlobalScripts; ++i) {397SetObjectTypeName(modTypeNames[i], scriptID);398399ParseScriptFile(modScriptPaths[i], scriptID++);400if (gameMode == ENGINE_SCRIPTERROR)401return;402}403#endif404}405406InitFileInfo(&info);407if (LoadStageFile("StageConfig.bin", &info)) {408ReadInt8(&info); // Load Globals409410for (int32 i = 96; i < 128; ++i) {411uint8 clr[3];412ReadBytes(&info, &clr, 3);413SetPaletteEntry(-1, i, clr[0], clr[1], clr[2]);414}415416uint8 stageObjectCount = ReadInt8(&info);417for (uint8 i = 0; i < stageObjectCount; ++i) {418ReadString(&info, strBuffer);419420SetObjectTypeName(strBuffer, scriptID + i);421}422423#if LEGACY_RETRO_USE_COMPILER424#if RETRO_USE_MOD_LOADER425char scriptPath[0x40];426switch (sceneInfo.activeCategory) {427case STAGELIST_PRESENTATION:428case STAGELIST_REGULAR:429case STAGELIST_BONUS:430case STAGELIST_SPECIAL:431StrCopy(scriptPath, "Data/Scripts/ByteCode/");432StrAdd(scriptPath, sceneInfo.listData[sceneInfo.listPos].folder);433StrAdd(scriptPath, ".bin");434break;435default: break;436}437438bool32 bytecodeExists = false;439FileInfo bytecodeInfo;440InitFileInfo(&bytecodeInfo);441if (LoadFile(&bytecodeInfo, scriptPath, FMODE_RB)) {442bytecodeExists = true;443CloseFile(&bytecodeInfo);444}445446if (bytecodeExists && !modSettings.forceScripts) {447#else448if (usingBytecode) {449#endif450for (uint8 i = 0; i < stageObjectCount; ++i) ReadString(&info, strBuffer);451452LoadBytecode(scriptID, false);453}454else {455for (uint8 i = 0; i < stageObjectCount; ++i) {456ReadString(&info, strBuffer);457458ParseScriptFile(strBuffer, scriptID + i);459460if (gameMode == ENGINE_SCRIPTERROR)461return;462}463}464#else465for (uint8 i = 0; i < stageObjectCount; ++i) ReadString(&info, strBuffer);466467LoadBytecode(scriptID, false);468#endif469470stageSFXCount = ReadInt8(&info);471for (int32 i = 0; i < stageSFXCount; ++i) {472ReadString(&info, strBuffer);473474RSDK::Legacy::LoadSfx(strBuffer, globalSFXCount + i, SCOPE_STAGE);475476#if RETRO_USE_MOD_LOADER477SetSfxName(strBuffer, i, false);478#endif479}480CloseFile(&info);481}482483LoadStageGIFFile();484LoadStageCollisions();485LoadStageBackground();486}487else {488PrintLog(PRINT_NORMAL, "Reloading Scene %s - %s", sceneInfo.listCategory[sceneInfo.activeCategory].name,489sceneInfo.listData[sceneInfo.listPos].name);490}491LoadStageChunks();492493for (int32 i = 0; i < LEGACY_TRACK_COUNT; ++i) SetMusicTrack((char *)"", i, 0, 0);494for (int32 i = 0; i < LEGACY_v3_ENTITY_COUNT; ++i) {495memset(&objectEntityList[i], 0, sizeof(objectEntityList[i]));496497objectEntityList[i].drawOrder = 3;498objectEntityList[i].scale = 512;499}500501LoadActLayout();502Init3DFloorBuffer(0);503ProcessStartupObjects();504505xScrollA = (playerList[0].XPos >> 16) - SCREEN_CENTERX;506xScrollB = (playerList[0].XPos >> 16) - SCREEN_CENTERX + SCREEN_XSIZE;507yScrollA = (playerList[0].YPos >> 16) - LEGACY_SCREEN_SCROLL_UP;508yScrollB = (playerList[0].YPos >> 16) - LEGACY_SCREEN_SCROLL_UP + SCREEN_YSIZE;509}510void RSDK::Legacy::v3::LoadActLayout()511{512FileInfo info;513InitFileInfo(&info);514515if (LoadActFile(".bin", &info)) {516uint8 length = ReadInt8(&info);517titleCardWord2 = (uint8)length;518for (int32 i = 0; i < length; i++) {519titleCardText[i] = ReadInt8(&info);520if (titleCardText[i] == '-')521titleCardWord2 = (uint8)(i + 1);522}523titleCardText[length] = '\0';524525// READ TILELAYER526ReadBytes(&info, activeTileLayers, 4);527tLayerMidPoint = ReadInt8(&info);528529stageLayouts[0].xsize = ReadInt8(&info);530stageLayouts[0].ysize = ReadInt8(&info);531curXBoundary1 = 0;532newXBoundary1 = 0;533curYBoundary1 = 0;534newYBoundary1 = 0;535curXBoundary2 = stageLayouts[0].xsize << 7;536curYBoundary2 = stageLayouts[0].ysize << 7;537waterLevel = curYBoundary2 + 128;538newXBoundary2 = stageLayouts[0].xsize << 7;539newYBoundary2 = stageLayouts[0].ysize << 7;540541for (int32 i = 0; i < 0x10000; ++i) stageLayouts[0].tiles[i] = 0;542543for (int32 y = 0; y < stageLayouts[0].ysize; ++y) {544uint16 *tiles = &stageLayouts[0].tiles[y * 0x100];545for (int32 x = 0; x < stageLayouts[0].xsize; ++x) {546tiles[x] = ReadInt8(&info) << 8;547tiles[x] |= ReadInt8(&info);548}549}550551// READ TYPENAMES552int32 typenameCount = ReadInt8(&info);553for (int32 i = 0; i < typenameCount; ++i) {554int32 nameLen = ReadInt8(&info);555for (int32 l = 0; l < nameLen; ++l) ReadInt8(&info);556}557558// READ OBJECTS559int32 entityCount = ReadInt8(&info) << 8;560entityCount |= ReadInt8(&info);561562#if !RETRO_USE_ORIGINAL_CODE563if (entityCount > 0x400)564PrintLog(PRINT_NORMAL, "WARNING: entity count %d exceeds the entity limit", entityCount);565#endif566567#if RETRO_USE_MOD_LOADER568int32 offsetCount = 0;569for (int32 m = 0; m < modObjCount; ++m)570if (modScriptFlags[m])571++offsetCount;572#endif573574Entity *entity = &objectEntityList[32];575for (int32 i = 0; i < entityCount; ++i) {576entity->type = ReadInt8(&info);577578#if RETRO_USE_MOD_LOADER579if (loadGlobalScripts && offsetCount && entity->type > globalObjCount)580entity->type += offsetCount; // offset it by our mod count581#endif582583entity->propertyValue = ReadInt8(&info);584585entity->XPos = ReadInt8(&info) << 8;586entity->XPos |= ReadInt8(&info);587entity->XPos <<= 16;588589entity->YPos = ReadInt8(&info) << 8;590entity->YPos |= ReadInt8(&info);591entity->YPos <<= 16;592593++entity;594}595CloseFile(&info);596}597stageLayouts[0].type = LAYER_HSCROLL;598}599void RSDK::Legacy::v3::LoadStageBackground()600{601for (int32 i = 0; i < LEGACY_LAYER_COUNT; ++i) {602stageLayouts[i].type = LAYER_NOSCROLL;603stageLayouts[i].deformationOffset = 0;604stageLayouts[i].deformationOffsetW = 0;605}606for (int32 i = 0; i < LEGACY_PARALLAX_COUNT; ++i) {607hParallax.scrollPos[i] = 0;608vParallax.scrollPos[i] = 0;609}610611FileInfo info;612InitFileInfo(&info);613if (LoadStageFile("Backgrounds.bin", &info)) {614uint8 layerCount = ReadInt8(&info);615616hParallax.entryCount = ReadInt8(&info);617for (int32 i = 0; i < hParallax.entryCount; ++i) {618hParallax.parallaxFactor[i] = ReadInt8(&info) << 8;619hParallax.parallaxFactor[i] |= ReadInt8(&info);620621hParallax.scrollSpeed[i] = ReadInt8(&info) << 10;622623hParallax.scrollPos[i] = 0;624625hParallax.deform[i] = ReadInt8(&info);626}627628vParallax.entryCount = ReadInt8(&info);629for (int32 i = 0; i < vParallax.entryCount; ++i) {630vParallax.parallaxFactor[i] = ReadInt8(&info) << 8;631vParallax.parallaxFactor[i] |= ReadInt8(&info);632633vParallax.scrollSpeed[i] = ReadInt8(&info) << 10;634635vParallax.scrollPos[i] = 0;636637vParallax.deform[i] = ReadInt8(&info);638}639640for (int32 i = 1; i < layerCount + 1; ++i) {641stageLayouts[i].xsize = ReadInt8(&info);642stageLayouts[i].ysize = ReadInt8(&info);643644stageLayouts[i].type = ReadInt8(&info);645646stageLayouts[i].parallaxFactor = ReadInt8(&info) << 8;647stageLayouts[i].parallaxFactor |= ReadInt8(&info);648649stageLayouts[i].scrollSpeed = ReadInt8(&info) << 10;650stageLayouts[i].scrollPos = 0;651652memset(stageLayouts[i].tiles, 0, LEGACY_TILELAYER_CHUNK_COUNT * sizeof(uint16));653uint8 *lineScrollPtr = stageLayouts[i].lineScroll;654memset(stageLayouts[i].lineScroll, 0, 0x7FFF);655656// Read Line Scroll657uint8 buf[3];658while (true) {659buf[0] = ReadInt8(&info);660if (buf[0] == 0xFF) {661buf[1] = ReadInt8(&info);662if (buf[1] == 0xFF) {663break;664}665else {666buf[2] = ReadInt8(&info);667int32 val = buf[1];668int32 cnt = buf[2] - 1;669for (int32 c = 0; c < cnt; ++c) *lineScrollPtr++ = val;670}671}672else {673*lineScrollPtr++ = buf[0];674}675}676677// Read Layout678for (int32 y = 0; y < stageLayouts[i].ysize; ++y) {679uint16 *chunks = &stageLayouts[i].tiles[y * 0x100];680for (int32 x = 0; x < stageLayouts[i].xsize; ++x) {681*chunks = ReadInt8(&info) << 8;682*chunks |= ReadInt8(&info);683684++chunks;685}686}687}688689CloseFile(&info);690}691}692693void RSDK::Legacy::v3::SetPlayerScreenPosition(Player *player)694{695int32 playerXPos = player->XPos >> 16;696int32 playerYPos = player->YPos >> 16;697if (newYBoundary1 > curYBoundary1) {698if (yScrollOffset <= newYBoundary1)699curYBoundary1 = yScrollOffset;700else701curYBoundary1 = newYBoundary1;702}703if (newYBoundary1 < curYBoundary1) {704if (yScrollOffset <= curYBoundary1)705--curYBoundary1;706else707curYBoundary1 = newYBoundary1;708}709if (newYBoundary2 < curYBoundary2) {710if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2 || yScrollOffset + SCREEN_YSIZE <= newYBoundary2)711--curYBoundary2;712else713curYBoundary2 = yScrollOffset + SCREEN_YSIZE;714}715if (newYBoundary2 > curYBoundary2) {716if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2)717++curYBoundary2;718else719curYBoundary2 = newYBoundary2;720}721if (newXBoundary1 > curXBoundary1) {722if (xScrollOffset <= newXBoundary1)723curXBoundary1 = xScrollOffset;724else725curXBoundary1 = newXBoundary1;726}727if (newXBoundary1 < curXBoundary1) {728if (xScrollOffset <= curXBoundary1) {729--curXBoundary1;730if (player->XVelocity < 0) {731curXBoundary1 += player->XVelocity >> 16;732if (curXBoundary1 < newXBoundary1)733curXBoundary1 = newXBoundary1;734}735}736else {737curXBoundary1 = newXBoundary1;738}739}740if (newXBoundary2 < curXBoundary2) {741if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2)742curXBoundary2 = SCREEN_XSIZE + xScrollOffset;743else744curXBoundary2 = newXBoundary2;745}746if (newXBoundary2 > curXBoundary2) {747if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {748++curXBoundary2;749if (player->XVelocity > 0) {750curXBoundary2 += player->XVelocity >> 16;751if (curXBoundary2 > newXBoundary2)752curXBoundary2 = newXBoundary2;753}754}755else {756curXBoundary2 = newXBoundary2;757}758}759int32 xscrollA = xScrollA;760int32 xscrollB = xScrollB;761int32 scrollAmount = playerXPos - (SCREEN_CENTERX + xScrollA);762if (abs(playerXPos - (SCREEN_CENTERX + xScrollA)) >= 25) {763if (scrollAmount <= 0)764xscrollA -= 16;765else766xscrollA += 16;767xscrollB = SCREEN_XSIZE + xscrollA;768}769else {770if (playerXPos > (SCREEN_CENTERX + 8) + xscrollA) {771xscrollA = playerXPos - (SCREEN_CENTERX + 8);772xscrollB = SCREEN_XSIZE + playerXPos - (SCREEN_CENTERX + 8);773}774if (playerXPos < (SCREEN_CENTERX - 8) + xscrollA) {775xscrollA = playerXPos - (SCREEN_CENTERX - 8);776xscrollB = SCREEN_XSIZE + playerXPos - (SCREEN_CENTERX - 8);777}778}779if (xscrollA < curXBoundary1) {780xscrollA = curXBoundary1;781xscrollB = SCREEN_XSIZE + curXBoundary1;782}783if (xscrollB > curXBoundary2) {784xscrollB = curXBoundary2;785xscrollA = curXBoundary2 - SCREEN_XSIZE;786}787788xScrollA = xscrollA;789xScrollB = xscrollB;790if (playerXPos <= SCREEN_CENTERX + xscrollA) {791player->screenXPos = cameraShakeX + playerXPos - xscrollA;792xScrollOffset = xscrollA - cameraShakeX;793}794else {795xScrollOffset = cameraShakeX + playerXPos - SCREEN_CENTERX;796player->screenXPos = SCREEN_CENTERX - cameraShakeX;797if (playerXPos > xscrollB - SCREEN_CENTERX) {798player->screenXPos = cameraShakeX + SCREEN_CENTERX + playerXPos - (xscrollB - SCREEN_CENTERX);799xScrollOffset = xscrollB - SCREEN_XSIZE - cameraShakeX;800}801}802803int32 yscrollA = yScrollA;804int32 yscrollB = yScrollB;805int32 adjustYPos = currentCamera->adjustY + playerYPos;806int32 adjustAmount = player->lookPos + adjustYPos - (yscrollA + LEGACY_SCREEN_SCROLL_UP);807if (player->trackScroll) {808yScrollMove = 32;809}810else {811if (yScrollMove == 32) {812yScrollMove = 2 * ((LEGACY_SCREEN_SCROLL_UP - player->screenYPos - player->lookPos) >> 1);813if (yScrollMove > 32)814yScrollMove = 32;815if (yScrollMove < -32)816yScrollMove = -32;817}818if (yScrollMove > 0)819yScrollMove -= 6;820yScrollMove += yScrollMove < 0 ? 6 : 0;821}822823if (abs(adjustAmount) >= abs(yScrollMove) + 17) {824if (adjustAmount <= 0)825yscrollA -= 16;826else827yscrollA += 16;828yscrollB = yscrollA + SCREEN_YSIZE;829}830else if (yScrollMove == 32) {831if (player->lookPos + adjustYPos > yscrollA + yScrollMove + LEGACY_SCREEN_SCROLL_UP) {832yscrollA = player->lookPos + adjustYPos - (yScrollMove + LEGACY_SCREEN_SCROLL_UP);833yscrollB = yscrollA + SCREEN_YSIZE;834}835if (player->lookPos + adjustYPos < yscrollA + LEGACY_SCREEN_SCROLL_UP - yScrollMove) {836yscrollA = player->lookPos + adjustYPos - (LEGACY_SCREEN_SCROLL_UP - yScrollMove);837yscrollB = yscrollA + SCREEN_YSIZE;838}839}840else {841yscrollA = player->lookPos + adjustYPos + yScrollMove - LEGACY_SCREEN_SCROLL_UP;842yscrollB = yscrollA + SCREEN_YSIZE;843}844if (yscrollA < curYBoundary1) {845yscrollA = curYBoundary1;846yscrollB = curYBoundary1 + SCREEN_YSIZE;847}848if (yscrollB > curYBoundary2) {849yscrollB = curYBoundary2;850yscrollA = curYBoundary2 - SCREEN_YSIZE;851}852yScrollA = yscrollA;853yScrollB = yscrollB;854if (player->lookPos + adjustYPos <= yScrollA + LEGACY_SCREEN_SCROLL_UP) {855player->screenYPos = adjustYPos - yScrollA - cameraShakeY;856yScrollOffset = cameraShakeY + yScrollA;857}858else {859yScrollOffset = cameraShakeY + adjustYPos + player->lookPos - LEGACY_SCREEN_SCROLL_UP;860player->screenYPos = LEGACY_SCREEN_SCROLL_UP - player->lookPos - cameraShakeY;861if (player->lookPos + adjustYPos > yScrollB - LEGACY_SCREEN_SCROLL_DOWN) {862player->screenYPos = adjustYPos - (yScrollB - LEGACY_SCREEN_SCROLL_DOWN) + cameraShakeY + LEGACY_SCREEN_SCROLL_UP;863yScrollOffset = yScrollB - SCREEN_YSIZE - cameraShakeY;864}865}866player->screenYPos -= currentCamera->adjustY;867868if (cameraShakeX) {869if (cameraShakeX <= 0) {870cameraShakeX = ~cameraShakeX;871}872else {873cameraShakeX = -cameraShakeX;874}875}876877if (cameraShakeY) {878if (cameraShakeY <= 0) {879cameraShakeY = ~cameraShakeY;880}881else {882cameraShakeY = -cameraShakeY;883}884}885}886void RSDK::Legacy::v3::SetPlayerScreenPositionCDStyle(Player *player)887{888int32 playerXPos = player->XPos >> 16;889int32 playerYPos = player->YPos >> 16;890891if (newYBoundary1 > curYBoundary1) {892if (yScrollOffset <= newYBoundary1)893curYBoundary1 = yScrollOffset;894else895curYBoundary1 = newYBoundary1;896}897898if (newYBoundary1 < curYBoundary1) {899if (yScrollOffset <= curYBoundary1)900--curYBoundary1;901else902curYBoundary1 = newYBoundary1;903}904905if (newYBoundary2 < curYBoundary2) {906if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2 || yScrollOffset + SCREEN_YSIZE <= newYBoundary2)907--curYBoundary2;908else909curYBoundary2 = yScrollOffset + SCREEN_YSIZE;910}911912if (newYBoundary2 > curYBoundary2) {913if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2)914++curYBoundary2;915else916curYBoundary2 = newYBoundary2;917}918919if (newXBoundary1 > curXBoundary1) {920if (xScrollOffset <= newXBoundary1)921curXBoundary1 = xScrollOffset;922else923curXBoundary1 = newXBoundary1;924}925926if (newXBoundary1 < curXBoundary1) {927if (xScrollOffset <= curXBoundary1) {928--curXBoundary1;929if (player->XVelocity < 0) {930curXBoundary1 += player->XVelocity >> 16;931if (curXBoundary1 < newXBoundary1)932curXBoundary1 = newXBoundary1;933}934}935else {936curXBoundary1 = newXBoundary1;937}938}939940if (newXBoundary2 < curXBoundary2) {941if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2)942curXBoundary2 = SCREEN_XSIZE + xScrollOffset;943else944curXBoundary2 = newXBoundary2;945}946947if (newXBoundary2 > curXBoundary2) {948if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {949++curXBoundary2;950if (player->XVelocity > 0) {951curXBoundary2 += player->XVelocity >> 16;952if (curXBoundary2 > newXBoundary2)953curXBoundary2 = newXBoundary2;954}955}956else {957curXBoundary2 = newXBoundary2;958}959}960961if (!player->gravity) {962if (player->boundEntity->direction) {963if (currentCamera->style == CAMERASTYLE_EXTENDED_OFFSET_R || player->speed < -0x5F5C2)964cameraLagStyle = 2;965else966cameraLagStyle = 0;967}968else {969cameraLagStyle = (currentCamera->style == CAMERASTYLE_EXTENDED_OFFSET_L || player->speed > 0x5F5C2) != 0;970}971}972973if (cameraLagStyle) {974if (cameraLagStyle == 1) {975if (cameraLag > -64)976cameraLag -= 2;977}978else if (cameraLagStyle == 2 && cameraLag < 64) {979cameraLag += 2;980}981}982else {983cameraLag += cameraLag < 0 ? 2 : 0;984if (cameraLag > 0)985cameraLag -= 2;986}987if (playerXPos <= cameraLag + SCREEN_CENTERX + curXBoundary1) {988player->screenXPos = cameraShakeX + playerXPos - curXBoundary1;989xScrollOffset = curXBoundary1 - cameraShakeX;990}991else {992xScrollOffset = cameraShakeX + playerXPos - SCREEN_CENTERX - cameraLag;993player->screenXPos = cameraLag + SCREEN_CENTERX - cameraShakeX;994if (playerXPos - cameraLag > curXBoundary2 - SCREEN_CENTERX) {995player->screenXPos = cameraShakeX + SCREEN_CENTERX + playerXPos - (curXBoundary2 - SCREEN_CENTERX);996xScrollOffset = curXBoundary2 - SCREEN_XSIZE - cameraShakeX;997}998}999xScrollA = xScrollOffset;1000xScrollB = SCREEN_XSIZE + xScrollOffset;1001int32 yscrollA = yScrollA;1002int32 yscrollB = yScrollB;1003int32 adjustY = currentCamera->adjustY + playerYPos;1004int32 adjustOffset = player->lookPos + adjustY - (yScrollA + LEGACY_SCREEN_SCROLL_UP);1005if (player->trackScroll == 1) {1006yScrollMove = 32;1007}1008else {1009if (yScrollMove == 32) {1010yScrollMove = 2 * ((LEGACY_SCREEN_SCROLL_UP - player->screenYPos - player->lookPos) >> 1);1011if (yScrollMove > 32)1012yScrollMove = 32;1013if (yScrollMove < -32)1014yScrollMove = -32;1015}1016if (yScrollMove > 0)1017yScrollMove -= 6;1018yScrollMove += yScrollMove < 0 ? 6 : 0;1019}10201021int32 absAdjust = abs(adjustOffset);1022if (absAdjust >= abs(yScrollMove) + 17) {1023if (adjustOffset <= 0)1024yscrollA -= 16;1025else1026yscrollA += 16;1027yscrollB = yscrollA + SCREEN_YSIZE;1028}1029else if (yScrollMove == 32) {1030if (player->lookPos + adjustY > yscrollA + yScrollMove + LEGACY_SCREEN_SCROLL_UP) {1031yscrollA = player->lookPos + adjustY - (yScrollMove + LEGACY_SCREEN_SCROLL_UP);1032yscrollB = yscrollA + SCREEN_YSIZE;1033}1034if (player->lookPos + adjustY < yscrollA + LEGACY_SCREEN_SCROLL_UP - yScrollMove) {1035yscrollA = player->lookPos + adjustY - (LEGACY_SCREEN_SCROLL_UP - yScrollMove);1036yscrollB = yscrollA + SCREEN_YSIZE;1037}1038}1039else {1040yscrollA = player->lookPos + adjustY + yScrollMove - LEGACY_SCREEN_SCROLL_UP;1041yscrollB = yscrollA + SCREEN_YSIZE;1042}1043if (yscrollA < curYBoundary1) {1044yscrollA = curYBoundary1;1045yscrollB = curYBoundary1 + SCREEN_YSIZE;1046}1047if (yscrollB > curYBoundary2) {1048yscrollB = curYBoundary2;1049yscrollA = curYBoundary2 - SCREEN_YSIZE;1050}1051yScrollA = yscrollA;1052yScrollB = yscrollB;1053if (player->lookPos + adjustY <= yscrollA + LEGACY_SCREEN_SCROLL_UP) {1054player->screenYPos = adjustY - yscrollA - cameraShakeY;1055yScrollOffset = cameraShakeY + yscrollA;1056}1057else {1058yScrollOffset = cameraShakeY + adjustY + player->lookPos - LEGACY_SCREEN_SCROLL_UP;1059player->screenYPos = LEGACY_SCREEN_SCROLL_UP - player->lookPos - cameraShakeY;1060if (player->lookPos + adjustY > yscrollB - LEGACY_SCREEN_SCROLL_DOWN) {1061player->screenYPos = adjustY - (yscrollB - LEGACY_SCREEN_SCROLL_DOWN) + cameraShakeY + LEGACY_SCREEN_SCROLL_UP;1062yScrollOffset = yscrollB - SCREEN_YSIZE - cameraShakeY;1063}1064}1065player->screenYPos -= currentCamera->adjustY;10661067if (cameraShakeX) {1068if (cameraShakeX <= 0) {1069cameraShakeX = ~cameraShakeX;1070}1071else {1072cameraShakeX = -cameraShakeX;1073}1074}10751076if (cameraShakeY) {1077if (cameraShakeY <= 0) {1078cameraShakeY = ~cameraShakeY;1079}1080else {1081cameraShakeY = -cameraShakeY;1082}1083}1084}1085void RSDK::Legacy::v3::SetPlayerHLockedScreenPosition(Player *player)1086{1087int32 playerXPos = player->XPos >> 16;1088int32 playerYPos = player->YPos >> 16;1089if (newYBoundary1 > curYBoundary1) {1090if (yScrollOffset <= newYBoundary1)1091curYBoundary1 = yScrollOffset;1092else1093curYBoundary1 = newYBoundary1;1094}1095if (newYBoundary1 < curYBoundary1) {1096if (yScrollOffset <= curYBoundary1)1097--curYBoundary1;1098else1099curYBoundary1 = newYBoundary1;1100}1101if (newYBoundary2 < curYBoundary2) {1102if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2 || yScrollOffset + SCREEN_YSIZE <= newYBoundary2)1103--curYBoundary2;1104else1105curYBoundary2 = yScrollOffset + SCREEN_YSIZE;1106}1107if (newYBoundary2 > curYBoundary2) {1108if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2)1109++curYBoundary2;1110else1111curYBoundary2 = newYBoundary2;1112}11131114int32 xscrollA = xScrollA;1115int32 xscrollB = xScrollB;1116if (playerXPos <= SCREEN_CENTERX + xScrollA) {1117player->screenXPos = cameraShakeX + playerXPos - xScrollA;1118xScrollOffset = xscrollA - cameraShakeX;1119}1120else {1121xScrollOffset = cameraShakeX + playerXPos - SCREEN_CENTERX;1122player->screenXPos = SCREEN_CENTERX - cameraShakeX;1123if (playerXPos > xscrollB - SCREEN_CENTERX) {1124player->screenXPos = cameraShakeX + SCREEN_CENTERX + playerXPos - (xscrollB - SCREEN_CENTERX);1125xScrollOffset = xscrollB - SCREEN_XSIZE - cameraShakeX;1126}1127}11281129int32 yscrollA = yScrollA;1130int32 yscrollB = yScrollB;1131int32 adjustY = currentCamera->adjustY + playerYPos;1132int32 lookOffset = player->lookPos + adjustY - (yScrollA + LEGACY_SCREEN_SCROLL_UP);1133if (player->trackScroll == 1) {1134yScrollMove = 32;1135}1136else {1137if (yScrollMove == 32) {1138yScrollMove = 2 * ((LEGACY_SCREEN_SCROLL_UP - player->screenYPos - player->lookPos) >> 1);1139if (yScrollMove > 32)1140yScrollMove = 32;1141if (yScrollMove < -32)1142yScrollMove = -32;1143}1144if (yScrollMove > 0)1145yScrollMove -= 6;1146yScrollMove += yScrollMove < 0 ? 6 : 0;1147}11481149int32 absLook = abs(lookOffset);1150if (absLook >= abs(yScrollMove) + 17) {1151if (lookOffset <= 0)1152yscrollA -= 16;1153else1154yscrollA += 16;1155yscrollB = yscrollA + SCREEN_YSIZE;1156}1157else if (yScrollMove == 32) {1158if (player->lookPos + adjustY > yscrollA + yScrollMove + LEGACY_SCREEN_SCROLL_UP) {1159yscrollA = player->lookPos + adjustY - (yScrollMove + LEGACY_SCREEN_SCROLL_UP);1160yscrollB = yscrollA + SCREEN_YSIZE;1161}1162if (player->lookPos + adjustY < yscrollA + LEGACY_SCREEN_SCROLL_UP - yScrollMove) {1163yscrollA = player->lookPos + adjustY - (LEGACY_SCREEN_SCROLL_UP - yScrollMove);1164yscrollB = yscrollA + SCREEN_YSIZE;1165}1166}1167else {1168yscrollA = player->lookPos + adjustY + yScrollMove - LEGACY_SCREEN_SCROLL_UP;1169yscrollB = yscrollA + SCREEN_YSIZE;1170}1171if (yscrollA < curYBoundary1) {1172yscrollA = curYBoundary1;1173yscrollB = curYBoundary1 + SCREEN_YSIZE;1174}1175if (yscrollB > curYBoundary2) {1176yscrollB = curYBoundary2;1177yscrollA = curYBoundary2 - SCREEN_YSIZE;1178}1179yScrollA = yscrollA;1180yScrollB = yscrollB;1181if (player->lookPos + adjustY <= yscrollA + LEGACY_SCREEN_SCROLL_UP) {1182player->screenYPos = adjustY - yscrollA - cameraShakeY;1183yScrollOffset = cameraShakeY + yscrollA;1184}1185else {1186yScrollOffset = cameraShakeY + adjustY + player->lookPos - LEGACY_SCREEN_SCROLL_UP;1187player->screenYPos = LEGACY_SCREEN_SCROLL_UP - player->lookPos - cameraShakeY;1188if (player->lookPos + adjustY > yscrollB - LEGACY_SCREEN_SCROLL_DOWN) {1189player->screenYPos = adjustY - (yscrollB - LEGACY_SCREEN_SCROLL_DOWN) + cameraShakeY + LEGACY_SCREEN_SCROLL_UP;1190yScrollOffset = yscrollB - SCREEN_YSIZE - cameraShakeY;1191}1192}1193player->screenYPos -= currentCamera->adjustY;11941195if (cameraShakeX) {1196if (cameraShakeX <= 0) {1197cameraShakeX = ~cameraShakeX;1198}1199else {1200cameraShakeX = -cameraShakeX;1201}1202}12031204if (cameraShakeY) {1205if (cameraShakeY <= 0) {1206cameraShakeY = ~cameraShakeY;1207}1208else {1209cameraShakeY = -cameraShakeY;1210}1211}1212}1213void RSDK::Legacy::v3::SetPlayerLockedScreenPosition(Player *player)1214{1215int32 playerXPos = player->XPos >> 16;1216int32 playerYPos = player->YPos >> 16;1217int32 xscrollA = xScrollA;1218int32 xscrollB = xScrollB;1219if (playerXPos <= SCREEN_CENTERX + xScrollA) {1220player->screenXPos = cameraShakeX + playerXPos - xScrollA;1221xScrollOffset = xscrollA - cameraShakeX;1222}1223else {1224xScrollOffset = cameraShakeX + playerXPos - SCREEN_CENTERX;1225player->screenXPos = SCREEN_CENTERX - cameraShakeX;1226if (playerXPos > xscrollB - SCREEN_CENTERX) {1227player->screenXPos = cameraShakeX + SCREEN_CENTERX + playerXPos - (xscrollB - SCREEN_CENTERX);1228xScrollOffset = xscrollB - SCREEN_XSIZE - cameraShakeX;1229}1230}12311232int32 yscrollA = yScrollA;1233int32 yscrollB = yScrollB;1234int32 adjustY = currentCamera->adjustY + playerYPos;1235// int32 adjustOffset = player->lookPos + adjustY - (yScrollA + LEGACY_SCREEN_SCROLL_UP);1236if (player->lookPos + adjustY <= yScrollA + LEGACY_SCREEN_SCROLL_UP) {1237player->screenYPos = adjustY - yScrollA - cameraShakeY;1238yScrollOffset = cameraShakeY + yscrollA;1239}1240else {1241yScrollOffset = cameraShakeY + adjustY + player->lookPos - LEGACY_SCREEN_SCROLL_UP;1242player->screenYPos = LEGACY_SCREEN_SCROLL_UP - player->lookPos - cameraShakeY;1243if (player->lookPos + adjustY > yscrollB - LEGACY_SCREEN_SCROLL_DOWN) {1244player->screenYPos = adjustY - (yscrollB - LEGACY_SCREEN_SCROLL_DOWN) + cameraShakeY + LEGACY_SCREEN_SCROLL_UP;1245yScrollOffset = yscrollB - SCREEN_YSIZE - cameraShakeY;1246}1247}1248player->screenYPos -= currentCamera->adjustY;12491250if (cameraShakeX) {1251if (cameraShakeX <= 0) {1252cameraShakeX = ~cameraShakeX;1253}1254else {1255cameraShakeX = -cameraShakeX;1256}1257}12581259if (cameraShakeY) {1260if (cameraShakeY <= 0) {1261cameraShakeY = ~cameraShakeY;1262}1263else {1264cameraShakeY = -cameraShakeY;1265}1266}1267}126812691270