Path: blob/main/RSDKv4/Scene.cpp
817 views
#include "RetroEngine.hpp"12int stageListCount[STAGELIST_MAX];3char stageListNames[STAGELIST_MAX][0x20] = {4"Presentation Stages",5"Regular Stages",6"Bonus Stages",7"Special Stages",8};9SceneInfo stageList[STAGELIST_MAX][0x100];1011int stageMode = STAGEMODE_LOAD;1213int cameraTarget = -1;14int cameraStyle = CAMERASTYLE_FOLLOW;15int cameraEnabled = 0;16int cameraAdjustY = 0;17int xScrollOffset = 0;18int yScrollOffset = 0;19int cameraXPos = 0;20int cameraYPos = 0;21int cameraShift = 0;22int cameraLockedY = 0;23int cameraShakeX = 0;24int cameraShakeY = 0;25int cameraLag = 0;26int cameraLagStyle = 0;2728int curXBoundary1 = 0;29int newXBoundary1 = 0;30int curYBoundary1 = 0;31int newYBoundary1 = 0;32int curXBoundary2 = 0;33int curYBoundary2 = 0;34int waterLevel = 0;35int waterDrawPos = 0;36int newXBoundary2 = 0;37int newYBoundary2 = 0;3839int SCREEN_SCROLL_LEFT = SCREEN_CENTERX - 8;40int SCREEN_SCROLL_RIGHT = SCREEN_CENTERX + 8;4142int lastYSize = -1;43int lastXSize = -1;4445bool pauseEnabled = true;46bool timeEnabled = true;47bool debugMode = false;48int frameCounter = 0;49int stageMilliseconds = 0;50int stageSeconds = 0;51int stageMinutes = 0;5253// Category and Scene IDs54int activeStageList = 0;55int stageListPosition = 0;56char currentStageFolder[0x100];57int actID = 0;5859char titleCardText[0x100];60byte titleCardWord2 = 0;6162byte activeTileLayers[4];63byte tLayerMidPoint;64TileLayer stageLayouts[LAYER_COUNT];6566int bgDeformationData0[DEFORM_COUNT];67int bgDeformationData1[DEFORM_COUNT];68int bgDeformationData2[DEFORM_COUNT];69int bgDeformationData3[DEFORM_COUNT];7071LineScroll hParallax;72LineScroll vParallax;7374Tiles128x128 tiles128x128;75CollisionMasks collisionMasks[2];7677byte tilesetGFXData[TILESET_SIZE];7879ushort tile3DFloorBuffer[0x100 * 0x100];80bool drawStageGFXHQ = false;8182#if RETRO_USE_MOD_LOADER83bool loadGlobalScripts = false; // stored here so I can use it later84int globalObjCount = 0;85#endif8687void InitFirstStage(void)88{89xScrollOffset = 0;90yScrollOffset = 0;91StopMusic(true);92StopAllSfx();93ReleaseStageSfx();94fadeMode = 0;95ClearGraphicsData();96ClearAnimationData();97activePalette = fullPalette[0];98activePalette32 = fullPalette32[0];99stageMode = STAGEMODE_LOAD;100Engine.gameMode = ENGINE_MAINGAME;101activeStageList = 0;102stageListPosition = 0;103}104105void InitStartingStage(int list, int stage, int player)106{107xScrollOffset = 0;108yScrollOffset = 0;109StopMusic(true);110StopAllSfx();111ReleaseStageSfx();112fadeMode = 0;113playerListPos = player;114ClearGraphicsData();115ClearAnimationData();116ResetCurrentStageFolder();117activeStageList = list;118activePalette = fullPalette[0];119activePalette32 = fullPalette32[0];120stageMode = STAGEMODE_LOAD;121Engine.gameMode = ENGINE_MAINGAME;122stageListPosition = stage;123}124125void ProcessStage(void)126{127#if !RETRO_USE_ORIGINAL_CODE128debugHitboxCount = 0;129#endif130131switch (stageMode) {132case STAGEMODE_LOAD: // Startup133SetActivePalette(0, 0, 256);134gameMenu[0].visibleRowOffset = 0;135gameMenu[1].alignment = 0;136gameMenu[1].selectionCount = 0;137fadeMode = 0;138cameraEnabled = true;139cameraTarget = -1;140cameraShift = 0;141cameraStyle = CAMERASTYLE_FOLLOW;142cameraXPos = 0;143cameraYPos = 0;144cameraLockedY = 0;145cameraAdjustY = 0;146xScrollOffset = 0;147yScrollOffset = 0;148cameraShakeX = 0;149cameraShakeY = 0;150vertexCount = 0;151faceCount = 0;152frameCounter = 0;153pauseEnabled = false;154timeEnabled = false;155stageMilliseconds = 0;156stageSeconds = 0;157stageMinutes = 0;158stageMode = STAGEMODE_NORMAL;159160#if RSDK_AUTOBUILD161// Prevent playing as Amy if on autobuilds162if (GetGlobalVariableByName("PLAYER_AMY") && playerListPos == GetGlobalVariableByName("PLAYER_AMY"))163playerListPos = 0;164else if (GetGlobalVariableByName("PLAYER_AMY_TAILS") && playerListPos == GetGlobalVariableByName("PLAYER_AMY_TAILS"))165playerListPos = 0;166#endif167168#if RETRO_USE_MOD_LOADER169for (int m = 0; m < modList.size(); ++m) ScanModFolder(&modList[m]);170#endif171ResetBackgroundSettings();172LoadStageFiles();173174#if RETRO_HARDWARE_RENDER175texBufferMode = 0;176for (int i = 0; i < LAYER_COUNT; i++) {177if (stageLayouts[i].type == LAYER_3DSKY)178texBufferMode = 1;179}180for (int i = 0; i < hParallax.entryCount; i++) {181if (hParallax.deform[i])182texBufferMode = 1;183}184185if (tilesetGFXData[0x32002] > 0)186texBufferMode = 0;187188if (texBufferMode) {189for (int i = 0; i < TILEUV_SIZE; i += 4) {190tileUVArray[i + 0] = (i >> 2) % 28 * 18 + 1;191tileUVArray[i + 1] = (i >> 2) / 28 * 18 + 1;192tileUVArray[i + 2] = tileUVArray[i + 0] + 16;193tileUVArray[i + 3] = tileUVArray[i + 1] + 16;194}195tileUVArray[TILEUV_SIZE - 4] = 487.0f;196tileUVArray[TILEUV_SIZE - 3] = 487.0f;197tileUVArray[TILEUV_SIZE - 2] = 503.0f;198tileUVArray[TILEUV_SIZE - 1] = 503.0f;199}200else {201for (int i = 0; i < TILEUV_SIZE; i += 4) {202tileUVArray[i + 0] = (i >> 2 & 31) * 16;203tileUVArray[i + 1] = (i >> 2 >> 5) * 16;204tileUVArray[i + 2] = tileUVArray[i + 0] + 16;205tileUVArray[i + 3] = tileUVArray[i + 1] + 16;206}207}208209UpdateHardwareTextures();210gfxIndexSize = 0;211gfxVertexSize = 0;212gfxIndexSizeOpaque = 0;213gfxVertexSizeOpaque = 0;214#endif215break;216217case STAGEMODE_NORMAL:218drawStageGFXHQ = false;219if (fadeMode > 0)220fadeMode--;221222lastXSize = -1;223lastYSize = -1;224CheckKeyDown(&keyDown);225CheckKeyPress(&keyPress);226if (pauseEnabled && keyPress.start) {227stageMode = STAGEMODE_NORMAL_STEP;228PauseSound();229}230231if (timeEnabled) {232if (++frameCounter == 60) {233frameCounter = 0;234if (++stageSeconds > 59) {235stageSeconds = 0;236if (++stageMinutes > 59)237stageMinutes = 0;238}239}240stageMilliseconds = 100 * frameCounter / 60;241}242else {243frameCounter = 60 * stageMilliseconds / 100;244}245246// Update247ProcessObjects();248249if (cameraTarget > -1) {250if (cameraEnabled == 1) {251switch (cameraStyle) {252case CAMERASTYLE_FOLLOW: SetPlayerScreenPosition(&objectEntityList[cameraTarget]); break;253case CAMERASTYLE_EXTENDED:254case CAMERASTYLE_EXTENDED_OFFSET_L:255case CAMERASTYLE_EXTENDED_OFFSET_R: SetPlayerScreenPositionCDStyle(&objectEntityList[cameraTarget]); break;256case CAMERASTYLE_HLOCKED: SetPlayerHLockedScreenPosition(&objectEntityList[cameraTarget]); break;257default: break;258}259}260else {261SetPlayerLockedScreenPosition(&objectEntityList[cameraTarget]);262}263}264265ProcessParallaxAutoScroll();266DrawStageGFX();267break;268269case STAGEMODE_PAUSED:270drawStageGFXHQ = false;271if (fadeMode > 0)272fadeMode--;273274lastXSize = -1;275lastYSize = -1;276CheckKeyDown(&keyDown);277CheckKeyPress(&keyPress);278279if (pauseEnabled && keyPress.start) {280stageMode = STAGEMODE_PAUSED_STEP;281PauseSound();282}283284// Update285ProcessPausedObjects();286287#if RETRO_HARDWARE_RENDER288gfxIndexSize = 0;289gfxVertexSize = 0;290gfxIndexSizeOpaque = 0;291gfxVertexSizeOpaque = 0;292#endif293294DrawObjectList(0);295DrawObjectList(1);296DrawObjectList(2);297DrawObjectList(3);298DrawObjectList(4);299DrawObjectList(5);300#if RETRO_REV03301#if !RETRO_USE_ORIGINAL_CODE302// Hacky fix for Tails Object not working properly in special stages on non-Origins bytecode303if (forceUseScripts || Engine.usingOrigins)304#endif305DrawObjectList(7);306#endif307DrawObjectList(6);308309#if !RETRO_USE_ORIGINAL_CODE310DrawDebugOverlays();311#endif312break;313314case STAGEMODE_FROZEN:315drawStageGFXHQ = false;316if (fadeMode > 0)317fadeMode--;318319lastXSize = -1;320lastYSize = -1;321CheckKeyDown(&keyDown);322CheckKeyPress(&keyPress);323324// Update325ProcessFrozenObjects();326327if (cameraTarget > -1) {328if (cameraEnabled == 1) {329switch (cameraStyle) {330case CAMERASTYLE_FOLLOW: SetPlayerScreenPosition(&objectEntityList[cameraTarget]); break;331case CAMERASTYLE_EXTENDED:332case CAMERASTYLE_EXTENDED_OFFSET_L:333case CAMERASTYLE_EXTENDED_OFFSET_R: SetPlayerScreenPositionCDStyle(&objectEntityList[cameraTarget]); break;334case CAMERASTYLE_HLOCKED: SetPlayerHLockedScreenPosition(&objectEntityList[cameraTarget]); break;335default: break;336}337}338else {339SetPlayerLockedScreenPosition(&objectEntityList[cameraTarget]);340}341}342343DrawStageGFX();344break;345346#if !RETRO_REV00347case STAGEMODE_2P:348drawStageGFXHQ = false;349if (fadeMode > 0)350fadeMode--;351352lastXSize = -1;353lastYSize = -1;354CheckKeyDown(&keyDown);355CheckKeyPress(&keyPress);356if (pauseEnabled && keyPress.start) {357stageMode = STAGEMODE_2P_STEP;358PauseSound();359}360361if (timeEnabled) {362if (++frameCounter == 60) {363frameCounter = 0;364if (++stageSeconds > 59) {365stageSeconds = 0;366if (++stageMinutes > 59)367stageMinutes = 0;368}369}370stageMilliseconds = 100 * frameCounter / 60;371}372else {373frameCounter = 60 * stageMilliseconds / 100;374}375376// Update377Process2PObjects();378379if (cameraTarget > -1) {380if (cameraEnabled == 1) {381switch (cameraStyle) {382case CAMERASTYLE_FOLLOW: SetPlayerScreenPosition(&objectEntityList[cameraTarget]); break;383case CAMERASTYLE_EXTENDED:384case CAMERASTYLE_EXTENDED_OFFSET_L:385case CAMERASTYLE_EXTENDED_OFFSET_R: SetPlayerScreenPositionCDStyle(&objectEntityList[cameraTarget]); break;386case CAMERASTYLE_HLOCKED: SetPlayerHLockedScreenPosition(&objectEntityList[cameraTarget]); break;387default: break;388}389}390else {391SetPlayerLockedScreenPosition(&objectEntityList[cameraTarget]);392}393}394395ProcessParallaxAutoScroll();396DrawStageGFX();397break;398#endif399400case STAGEMODE_NORMAL_STEP:401drawStageGFXHQ = false;402if (fadeMode > 0)403fadeMode--;404405lastXSize = -1;406lastYSize = -1;407CheckKeyDown(&keyDown);408CheckKeyPress(&keyPress);409410if (keyPress.C) {411keyPress.C = false;412413if (timeEnabled) {414if (++frameCounter == 60) {415frameCounter = 0;416if (++stageSeconds > 59) {417stageSeconds = 0;418if (++stageMinutes > 59)419stageMinutes = 0;420}421}422stageMilliseconds = 100 * frameCounter / 60;423}424else {425frameCounter = 60 * stageMilliseconds / 100;426}427428ProcessObjects();429if (cameraTarget > -1) {430if (cameraEnabled == 1) {431switch (cameraStyle) {432case CAMERASTYLE_FOLLOW: SetPlayerScreenPosition(&objectEntityList[cameraTarget]); break;433case CAMERASTYLE_EXTENDED:434case CAMERASTYLE_EXTENDED_OFFSET_L:435case CAMERASTYLE_EXTENDED_OFFSET_R: SetPlayerScreenPositionCDStyle(&objectEntityList[cameraTarget]); break;436case CAMERASTYLE_HLOCKED: SetPlayerHLockedScreenPosition(&objectEntityList[cameraTarget]); break;437default: break;438}439}440else {441SetPlayerLockedScreenPosition(&objectEntityList[cameraTarget]);442}443}444445DrawStageGFX();446ProcessParallaxAutoScroll();447}448449if (pauseEnabled && keyPress.start) {450stageMode = STAGEMODE_NORMAL;451ResumeSound();452}453break;454455case STAGEMODE_PAUSED_STEP:456drawStageGFXHQ = false;457if (fadeMode > 0)458fadeMode--;459460lastXSize = -1;461lastYSize = -1;462CheckKeyDown(&keyDown);463CheckKeyPress(&keyPress);464465if (keyPress.C) {466#if RETRO_HARDWARE_RENDER467gfxIndexSize = 0;468gfxVertexSize = 0;469gfxIndexSizeOpaque = 0;470gfxVertexSizeOpaque = 0;471#endif472473keyPress.C = false;474ProcessPausedObjects();475DrawObjectList(0);476DrawObjectList(1);477DrawObjectList(2);478DrawObjectList(3);479DrawObjectList(4);480DrawObjectList(5);481#if RETRO_REV03482#if !RETRO_USE_ORIGINAL_CODE483// Hacky fix for Tails Object not working properly in special stages on non-Origins bytecode484if (forceUseScripts || Engine.usingOrigins)485#endif486DrawObjectList(7);487#endif488DrawObjectList(6);489490#if !RETRO_USE_ORIGINAL_CODE491DrawDebugOverlays();492#endif493}494495if (pauseEnabled && keyPress.start) {496stageMode = STAGEMODE_PAUSED;497ResumeSound();498}499break;500501case STAGEMODE_FROZEN_STEP:502drawStageGFXHQ = false;503if (fadeMode > 0)504fadeMode--;505506lastXSize = -1;507lastYSize = -1;508CheckKeyDown(&keyDown);509CheckKeyPress(&keyPress);510511if (keyPress.C) {512keyPress.C = false;513514// Update515ProcessFrozenObjects();516517if (cameraTarget > -1) {518if (cameraEnabled == 1) {519switch (cameraStyle) {520case CAMERASTYLE_FOLLOW: SetPlayerScreenPosition(&objectEntityList[cameraTarget]); break;521case CAMERASTYLE_EXTENDED:522case CAMERASTYLE_EXTENDED_OFFSET_L:523case CAMERASTYLE_EXTENDED_OFFSET_R: SetPlayerScreenPositionCDStyle(&objectEntityList[cameraTarget]); break;524case CAMERASTYLE_HLOCKED: SetPlayerHLockedScreenPosition(&objectEntityList[cameraTarget]); break;525default: break;526}527}528else {529SetPlayerLockedScreenPosition(&objectEntityList[cameraTarget]);530}531}532533DrawStageGFX();534}535if (pauseEnabled && keyPress.start) {536stageMode = STAGEMODE_FROZEN;537ResumeSound();538}539break;540541#if !RETRO_REV00542case STAGEMODE_2P_STEP:543drawStageGFXHQ = false;544if (fadeMode > 0)545fadeMode--;546547lastXSize = -1;548lastYSize = -1;549CheckKeyDown(&keyDown);550CheckKeyPress(&keyPress);551if (keyPress.C) {552keyPress.C = false;553554if (timeEnabled) {555if (++frameCounter == 60) {556frameCounter = 0;557if (++stageSeconds > 59) {558stageSeconds = 0;559if (++stageMinutes > 59)560stageMinutes = 0;561}562}563stageMilliseconds = 100 * frameCounter / 60;564}565else {566frameCounter = 60 * stageMilliseconds / 100;567}568569// Update570Process2PObjects();571572if (cameraTarget > -1) {573if (cameraEnabled == 1) {574switch (cameraStyle) {575case CAMERASTYLE_FOLLOW: SetPlayerScreenPosition(&objectEntityList[cameraTarget]); break;576case CAMERASTYLE_EXTENDED:577case CAMERASTYLE_EXTENDED_OFFSET_L:578case CAMERASTYLE_EXTENDED_OFFSET_R: SetPlayerScreenPositionCDStyle(&objectEntityList[cameraTarget]); break;579case CAMERASTYLE_HLOCKED: SetPlayerHLockedScreenPosition(&objectEntityList[cameraTarget]); break;580default: break;581}582}583else {584SetPlayerLockedScreenPosition(&objectEntityList[cameraTarget]);585}586}587588DrawStageGFX();589ProcessParallaxAutoScroll();590}591592if (pauseEnabled && keyPress.start) {593stageMode = STAGEMODE_2P;594ResumeSound();595}596break;597#endif598}599}600601void ProcessParallaxAutoScroll()602{603for (int i = 0; i < hParallax.entryCount; ++i) hParallax.scrollPos[i] += hParallax.scrollSpeed[i];604for (int i = 0; i < vParallax.entryCount; ++i) vParallax.scrollPos[i] += vParallax.scrollSpeed[i];605}606607void LoadStageFiles(void)608{609FileInfo infoStore;610FileInfo info;611byte fileBuffer = 0;612byte fileBuffer2 = 0;613int scriptID = 1;614char strBuffer[0x100];615616StopAllSfx();617if (!CheckCurrentStageFolder(stageListPosition)) {618PrintLog("Loading Scene %s - %s", stageListNames[activeStageList], stageList[activeStageList][stageListPosition].name);619ReleaseStageSfx();620ClearScriptData();621for (int i = SURFACE_COUNT; i > 0; i--) RemoveGraphicsFile((char *)"", i - 1);622623#if RETRO_USE_MOD_LOADER624loadGlobalScripts = false;625#else626bool loadGlobalScripts = false;627#endif628if (LoadStageFile("StageConfig.bin", stageListPosition, &info)) {629byte buf = 0;630FileRead(&buf, 1);631loadGlobalScripts = buf;632CloseFile();633}634635if (loadGlobalScripts && LoadFile("Data/Game/GameConfig.bin", &info)) {636FileRead(&fileBuffer, 1);637FileRead(&strBuffer, fileBuffer);638FileRead(&fileBuffer, 1);639FileRead(&strBuffer, fileBuffer);640641byte buf[3];642for (int c = 0; c < 0x60; ++c) {643FileRead(buf, 3);644SetPaletteEntry(-1, c, buf[0], buf[1], buf[2]);645}646647byte globalObjectCount = 0;648FileRead(&globalObjectCount, 1);649for (byte i = 0; i < globalObjectCount; ++i) {650FileRead(&fileBuffer2, 1);651FileRead(strBuffer, fileBuffer2);652strBuffer[fileBuffer2] = 0;653SetObjectTypeName(strBuffer, scriptID + i);654}655656#if RETRO_USE_MOD_LOADER && RETRO_USE_COMPILER657for (byte i = 0; i < modObjCount && loadGlobalScripts; ++i) {658SetObjectTypeName(modTypeNames[i], globalObjectCount + i + 1);659}660#endif661662#if RETRO_USE_COMPILER663#if !RETRO_USE_ORIGINAL_CODE664bool bytecodeExists = false;665FileInfo bytecodeInfo;666GetFileInfo(&bytecodeInfo);667CloseFile();668if (LoadFile("Bytecode/GlobalCode.bin", &info)) {669bytecodeExists = true;670CloseFile();671}672SetFileInfo(&bytecodeInfo);673674if (bytecodeExists && !forceUseScripts) {675#else676if (Engine.usingBytecode) {677#endif678GetFileInfo(&infoStore);679CloseFile();680LoadBytecode(4, scriptID);681scriptID += globalObjectCount;682SetFileInfo(&infoStore);683}684else {685for (byte i = 0; i < globalObjectCount; ++i) {686FileRead(&fileBuffer2, 1);687FileRead(strBuffer, fileBuffer2);688strBuffer[fileBuffer2] = 0;689GetFileInfo(&infoStore);690CloseFile();691ParseScriptFile(strBuffer, scriptID++);692SetFileInfo(&infoStore);693if (Engine.gameMode == ENGINE_SCRIPTERROR)694return;695}696}697#else698GetFileInfo(&infoStore);699CloseFile();700LoadBytecode(4, scriptID);701scriptID += globalObjectCount;702SetFileInfo(&infoStore);703#endif704CloseFile();705706#if RETRO_USE_MOD_LOADER707Engine.LoadXMLPalettes();708#endif709710#if RETRO_USE_MOD_LOADER && RETRO_USE_COMPILER711globalObjCount = globalObjectCount;712for (byte i = 0; i < modObjCount && loadGlobalScripts; ++i) {713SetObjectTypeName(modTypeNames[i], scriptID);714715GetFileInfo(&infoStore);716CloseFile();717ParseScriptFile(modScriptPaths[i], scriptID++);718SetFileInfo(&infoStore);719if (Engine.gameMode == ENGINE_SCRIPTERROR)720return;721}722#endif723}724725if (LoadStageFile("StageConfig.bin", stageListPosition, &info)) {726FileRead(&fileBuffer, 1); // Load Globals727728byte clr[3];729for (int i = 0x60; i < 0x80; ++i) {730FileRead(&clr, 3);731SetPaletteEntry(-1, i, clr[0], clr[1], clr[2]);732}733734FileRead(&fileBuffer, 1);735stageSFXCount = fileBuffer;736for (byte i = 0; i < stageSFXCount; ++i) {737FileRead(&fileBuffer2, 1);738FileRead(strBuffer, fileBuffer2);739strBuffer[fileBuffer2] = 0;740741SetSfxName(strBuffer, i + globalSFXCount);742}743for (byte i = 0; i < stageSFXCount; ++i) {744FileRead(&fileBuffer2, 1);745FileRead(strBuffer, fileBuffer2);746strBuffer[fileBuffer2] = 0;747GetFileInfo(&infoStore);748CloseFile();749LoadSfx(strBuffer, globalSFXCount + i);750SetFileInfo(&infoStore);751}752753byte stageObjectCount = 0;754FileRead(&stageObjectCount, 1);755for (byte i = 0; i < stageObjectCount; ++i) {756FileRead(&fileBuffer2, 1);757FileRead(strBuffer, fileBuffer2);758strBuffer[fileBuffer2] = 0;759SetObjectTypeName(strBuffer, scriptID + i);760}761762#if RETRO_USE_COMPILER763#if !RETRO_USE_ORIGINAL_CODE764char scriptPath[0x40];765switch (activeStageList) {766case STAGELIST_PRESENTATION:767case STAGELIST_REGULAR:768case STAGELIST_BONUS:769case STAGELIST_SPECIAL:770StrCopy(scriptPath, "Bytecode/");771StrAdd(scriptPath, stageList[activeStageList][stageListPosition].folder);772StrAdd(scriptPath, ".bin");773break;774default: break;775}776bool bytecodeExists = false;777FileInfo bytecodeInfo;778GetFileInfo(&bytecodeInfo);779CloseFile();780if (LoadFile(scriptPath, &info)) {781bytecodeExists = true;782CloseFile();783}784SetFileInfo(&bytecodeInfo);785786if (bytecodeExists && !forceUseScripts) {787#else788if (Engine.usingBytecode) {789#endif790for (byte i = 0; i < stageObjectCount; ++i) {791FileRead(&fileBuffer2, 1);792FileRead(strBuffer, fileBuffer2);793strBuffer[fileBuffer2] = 0;794}795GetFileInfo(&infoStore);796CloseFile();797LoadBytecode(activeStageList, scriptID);798SetFileInfo(&infoStore);799}800else {801for (byte i = 0; i < stageObjectCount; ++i) {802FileRead(&fileBuffer2, 1);803FileRead(strBuffer, fileBuffer2);804strBuffer[fileBuffer2] = 0;805GetFileInfo(&infoStore);806CloseFile();807ParseScriptFile(strBuffer, scriptID + i);808SetFileInfo(&infoStore);809if (Engine.gameMode == ENGINE_SCRIPTERROR)810return;811}812}813#else814for (byte i = 0; i < stageObjectCount; ++i) {815FileRead(&fileBuffer2, 1);816FileRead(strBuffer, fileBuffer2);817strBuffer[fileBuffer2] = 0;818}819GetFileInfo(&infoStore);820CloseFile();821LoadBytecode(activeStageList, scriptID);822SetFileInfo(&infoStore);823#endif824CloseFile();825}826827LoadStageGIFFile(stageListPosition);828LoadStageCollisions();829LoadStageBackground();830}831else {832PrintLog("Reloading Scene %s - %s", stageListNames[activeStageList], stageList[activeStageList][stageListPosition].name);833}834LoadStageChunks();835for (int i = 0; i < TRACK_COUNT; ++i) SetMusicTrack("", i, false, 0);836837memset(objectEntityList, 0, ENTITY_COUNT * sizeof(Entity));838for (int i = 0; i < ENTITY_COUNT; ++i) {839objectEntityList[i].drawOrder = 3;840objectEntityList[i].scale = 512;841objectEntityList[i].objectInteractions = true;842objectEntityList[i].visible = true;843objectEntityList[i].tileCollisions = true;844}845LoadActLayout();846Init3DFloorBuffer(0);847ProcessStartupObjects();848}849int LoadActFile(const char *ext, int stageID, FileInfo *info)850{851char dest[0x40];852853StrCopy(dest, "Data/Stages/");854StrAdd(dest, stageList[activeStageList][stageID].folder);855StrAdd(dest, "/Act");856StrAdd(dest, stageList[activeStageList][stageID].id);857StrAdd(dest, ext);858859ConvertStringToInteger(stageList[activeStageList][stageID].id, &actID);860861return LoadFile(dest, info);862}863int LoadStageFile(const char *filePath, int stageID, FileInfo *info)864{865char dest[0x40];866867StrCopy(dest, "Data/Stages/");868StrAdd(dest, stageList[activeStageList][stageID].folder);869StrAdd(dest, "/");870StrAdd(dest, filePath);871return LoadFile(dest, info);872}873void LoadActLayout()874{875FileInfo info;876for (int a = 0; a < 4; ++a) activeTileLayers[a] = 9; // disables missing scenes from rendering877878if (LoadActFile(".bin", stageListPosition, &info)) {879byte fileBuffer[4];880881byte length = 0;882FileRead(&length, 1);883titleCardWord2 = (byte)length;884for (int i = 0; i < length; ++i) {885FileRead(&titleCardText[i], 1);886if (titleCardText[i] == '-')887titleCardWord2 = (byte)(i + 1);888}889titleCardText[length] = '\0';890891// READ TILELAYER892FileRead(activeTileLayers, 4);893FileRead(&tLayerMidPoint, 1);894895FileRead(&stageLayouts[0].xsize, 1);896FileRead(fileBuffer, 1); // Unused897898FileRead(&stageLayouts[0].ysize, 1);899FileRead(fileBuffer, 1); // Unused900curXBoundary1 = 0;901newXBoundary1 = 0;902curYBoundary1 = 0;903newYBoundary1 = 0;904curXBoundary2 = stageLayouts[0].xsize << 7;905curYBoundary2 = stageLayouts[0].ysize << 7;906waterLevel = curYBoundary2 + 128;907newXBoundary2 = stageLayouts[0].xsize << 7;908newYBoundary2 = stageLayouts[0].ysize << 7;909910memset(stageLayouts[0].tiles, 0, TILELAYER_CHUNK_COUNT * sizeof(ushort));911memset(stageLayouts[0].lineScroll, 0, 0x7FFF);912913for (int y = 0; y < stageLayouts[0].ysize; ++y) {914ushort *tiles = &stageLayouts[0].tiles[(y * TILELAYER_CHUNK_H)];915for (int x = 0; x < stageLayouts[0].xsize; ++x) {916FileRead(&fileBuffer[0], 1);917tiles[x] = fileBuffer[0];918FileRead(&fileBuffer[0], 1);919tiles[x] |= fileBuffer[0] << 8;920}921}922923// READ OBJECTS924FileRead(&fileBuffer[0], 2);925int objectCount = fileBuffer[0] + (fileBuffer[1] << 8);926#if !RETRO_USE_ORIGINAL_CODE927if (objectCount > 0x400)928PrintLog("WARNING: object count %d exceeds the object limit", objectCount);929#endif930931#if RETRO_USE_MOD_LOADER932int offsetCount = 0;933for (int m = 0; m < modObjCount; ++m)934if (modScriptFlags[m])935++offsetCount;936#endif937Entity *object = &objectEntityList[32];938for (int i = 0; i < objectCount; ++i) {939FileRead(fileBuffer, 2);940ushort attribs = (fileBuffer[1] << 8) + fileBuffer[0];941942FileRead(fileBuffer, 1);943object->type = fileBuffer[0];944945#if RETRO_USE_MOD_LOADER946if (loadGlobalScripts && offsetCount && object->type > globalObjCount)947object->type += offsetCount; // offset it by our mod count948#endif949950FileRead(fileBuffer, 1);951object->propertyValue = fileBuffer[0];952953FileRead(&fileBuffer, 4);954object->xpos = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];955956FileRead(&fileBuffer, 4);957object->ypos = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];958959if (attribs & 0x1) {960FileRead(&fileBuffer, 4);961object->state = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];962}963if (attribs & 0x2) {964FileRead(fileBuffer, 1);965object->direction = fileBuffer[0];966}967if (attribs & 0x4) {968FileRead(&fileBuffer, 4);969object->scale = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];970}971if (attribs & 0x8) {972FileRead(&fileBuffer, 4);973object->rotation = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];974}975if (attribs & 0x10) {976FileRead(fileBuffer, 1);977object->drawOrder = fileBuffer[0];978}979if (attribs & 0x20) {980FileRead(fileBuffer, 1);981object->priority = fileBuffer[0];982}983if (attribs & 0x40) {984FileRead(fileBuffer, 1);985object->alpha = fileBuffer[0];986}987if (attribs & 0x80) {988FileRead(fileBuffer, 1);989object->animation = fileBuffer[0];990}991if (attribs & 0x100) {992FileRead(&fileBuffer, 4);993object->animationSpeed = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];994}995if (attribs & 0x200) {996FileRead(fileBuffer, 1);997object->frame = fileBuffer[0];998}999if (attribs & 0x400) {1000FileRead(fileBuffer, 1);1001object->inkEffect = fileBuffer[0];1002}1003if (attribs & 0x800) {1004FileRead(&fileBuffer, 4);1005object->values[0] = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];1006}1007if (attribs & 0x1000) {1008FileRead(&fileBuffer, 4);1009object->values[1] = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];1010}1011if (attribs & 0x2000) {1012FileRead(&fileBuffer, 4);1013object->values[2] = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];1014}1015if (attribs & 0x4000) {1016FileRead(&fileBuffer, 4);1017object->values[3] = (fileBuffer[3] << 24) + (fileBuffer[2] << 16) + (fileBuffer[1] << 8) + fileBuffer[0];1018}10191020++object;1021}1022}1023stageLayouts[0].type = LAYER_HSCROLL;1024CloseFile();1025}1026void LoadStageBackground()1027{1028for (int i = 0; i < LAYER_COUNT; ++i) {1029stageLayouts[i].type = LAYER_NOSCROLL;1030stageLayouts[i].deformationOffset = 0;1031stageLayouts[i].deformationOffsetW = 0;1032}1033for (int i = 0; i < PARALLAX_COUNT; ++i) {1034hParallax.scrollPos[i] = 0;1035vParallax.scrollPos[i] = 0;1036}10371038FileInfo info;1039if (LoadStageFile("Backgrounds.bin", stageListPosition, &info)) {1040byte fileBuffer = 0;1041byte layerCount = 0;1042FileRead(&layerCount, 1);1043FileRead(&hParallax.entryCount, 1);1044for (byte i = 0; i < hParallax.entryCount; ++i) {1045FileRead(&fileBuffer, 1);1046hParallax.parallaxFactor[i] = fileBuffer;1047FileRead(&fileBuffer, 1);1048hParallax.parallaxFactor[i] |= fileBuffer << 8;10491050FileRead(&fileBuffer, 1);1051hParallax.scrollSpeed[i] = fileBuffer << 10;10521053hParallax.scrollPos[i] = 0;10541055FileRead(&hParallax.deform[i], 1);1056}10571058FileRead(&vParallax.entryCount, 1);1059for (byte i = 0; i < vParallax.entryCount; ++i) {1060FileRead(&fileBuffer, 1);1061vParallax.parallaxFactor[i] = fileBuffer;1062FileRead(&fileBuffer, 1);1063vParallax.parallaxFactor[i] |= fileBuffer << 8;10641065FileRead(&fileBuffer, 1);1066vParallax.scrollSpeed[i] = fileBuffer << 10;10671068vParallax.scrollPos[i] = 0;10691070FileRead(&vParallax.deform[i], 1);1071}10721073for (byte i = 1; i < layerCount + 1; ++i) {1074FileRead(&fileBuffer, 1);1075stageLayouts[i].xsize = fileBuffer;1076FileRead(&fileBuffer, 1); // Unused (???)1077FileRead(&fileBuffer, 1);1078stageLayouts[i].ysize = fileBuffer;1079FileRead(&fileBuffer, 1); // Unused (???)1080FileRead(&fileBuffer, 1);1081stageLayouts[i].type = fileBuffer;1082FileRead(&fileBuffer, 1);1083stageLayouts[i].parallaxFactor = fileBuffer;1084FileRead(&fileBuffer, 1);1085stageLayouts[i].parallaxFactor |= fileBuffer << 8;1086FileRead(&fileBuffer, 1);1087stageLayouts[i].scrollSpeed = fileBuffer << 10;1088stageLayouts[i].scrollPos = 0;10891090memset(stageLayouts[i].tiles, 0, TILELAYER_CHUNK_COUNT * sizeof(ushort));1091byte *lineScrollPtr = stageLayouts[i].lineScroll;1092memset(stageLayouts[i].lineScroll, 0, 0x7FFF);10931094// Read Line Scroll1095byte buf[3];1096int pos = 0;1097while (true) {1098FileRead(&buf[0], 1);1099if (buf[0] == 0xFF) {1100FileRead(&buf[1], 1);1101if (buf[1] == 0xFF) {1102break;1103}1104else {1105FileRead(&buf[2], 1);1106int index = buf[1];1107int cnt = buf[2] - 1;1108for (int c = 0; c < cnt; ++c) *lineScrollPtr++ = index;1109}1110}1111else {1112*lineScrollPtr++ = buf[0];1113}1114}11151116// Read Layout1117for (int y = 0; y < stageLayouts[i].ysize; ++y) {1118ushort *chunks = &stageLayouts[i].tiles[y * TILELAYER_CHUNK_H];1119for (int x = 0; x < stageLayouts[i].xsize; ++x) {1120FileRead(&fileBuffer, 1);1121*chunks = fileBuffer;1122FileRead(&fileBuffer, 1);1123*chunks |= fileBuffer << 8;1124++chunks;1125}1126}1127}11281129CloseFile();1130}1131}1132void LoadStageChunks()1133{1134FileInfo info;1135byte entry[3];11361137if (LoadStageFile("128x128Tiles.bin", stageListPosition, &info)) {1138for (int i = 0; i < CHUNKTILE_COUNT; ++i) {1139FileRead(&entry, 3);1140entry[0] -= (byte)((entry[0] >> 6) << 6);11411142tiles128x128.visualPlane[i] = (byte)(entry[0] >> 4);1143entry[0] -= 16 * (entry[0] >> 4);11441145tiles128x128.direction[i] = (byte)(entry[0] >> 2);1146entry[0] -= 4 * (entry[0] >> 2);11471148tiles128x128.tileIndex[i] = entry[1] + (entry[0] << 8);1149#if RETRO_SOFTWARE_RENDER1150tiles128x128.gfxDataPos[i] = tiles128x128.tileIndex[i] << 8;1151#endif1152#if RETRO_HARDWARE_RENDER1153tiles128x128.gfxDataPos[i] = tiles128x128.tileIndex[i] << 2;1154#endif11551156tiles128x128.collisionFlags[0][i] = entry[2] >> 4;1157tiles128x128.collisionFlags[1][i] = entry[2] - ((entry[2] >> 4) << 4);1158}1159CloseFile();1160}1161}1162void LoadStageCollisions()1163{1164FileInfo info;1165if (LoadStageFile("CollisionMasks.bin", stageListPosition, &info)) {11661167byte fileBuffer = 0;1168int tileIndex = 0;1169for (int t = 0; t < TILE_COUNT; ++t) {1170for (int p = 0; p < CPATH_COUNT; ++p) {1171FileRead(&fileBuffer, 1);1172bool isCeiling = fileBuffer >> 4;1173collisionMasks[p].flags[t] = fileBuffer & 0xF;1174FileRead(&fileBuffer, 1);1175collisionMasks[p].angles[t] = fileBuffer;1176FileRead(&fileBuffer, 1);1177collisionMasks[p].angles[t] |= fileBuffer << 8;1178FileRead(&fileBuffer, 1);1179collisionMasks[p].angles[t] |= fileBuffer << 16;1180FileRead(&fileBuffer, 1);1181collisionMasks[p].angles[t] |= fileBuffer << 24;11821183if (isCeiling) // Ceiling Tile1184{1185for (int c = 0; c < TILE_SIZE; c += 2) {1186FileRead(&fileBuffer, 1);1187collisionMasks[p].roofMasks[c + tileIndex] = fileBuffer >> 4;1188collisionMasks[p].roofMasks[c + tileIndex + 1] = fileBuffer & 0xF;1189}11901191// Has Collision (Pt 1)1192FileRead(&fileBuffer, 1);1193int id = 1;1194for (int c = 0; c < TILE_SIZE / 2; ++c) {1195if (fileBuffer & id) {1196collisionMasks[p].floorMasks[c + tileIndex + 8] = 0;1197}1198else {1199collisionMasks[p].floorMasks[c + tileIndex + 8] = 0x40;1200collisionMasks[p].roofMasks[c + tileIndex + 8] = -0x40;1201}1202id <<= 1;1203}12041205// Has Collision (Pt 2)1206FileRead(&fileBuffer, 1);1207id = 1;1208for (int c = 0; c < TILE_SIZE / 2; ++c) {1209if (fileBuffer & id) {1210collisionMasks[p].floorMasks[c + tileIndex] = 0;1211}1212else {1213collisionMasks[p].floorMasks[c + tileIndex] = 0x40;1214collisionMasks[p].roofMasks[c + tileIndex] = -0x40;1215}1216id <<= 1;1217}12181219// LWall rotations1220for (int c = 0; c < TILE_SIZE; ++c) {1221int h = 0;1222while (h > -1) {1223if (h == TILE_SIZE) {1224collisionMasks[p].lWallMasks[c + tileIndex] = 0x40;1225h = -1;1226}1227else if (c > collisionMasks[p].roofMasks[h + tileIndex]) {1228++h;1229}1230else {1231collisionMasks[p].lWallMasks[c + tileIndex] = h;1232h = -1;1233}1234}1235}12361237// RWall rotations1238for (int c = 0; c < TILE_SIZE; ++c) {1239int h = TILE_SIZE - 1;1240while (h < TILE_SIZE) {1241if (h == -1) {1242collisionMasks[p].rWallMasks[c + tileIndex] = -0x40;1243h = TILE_SIZE;1244}1245else if (c > collisionMasks[p].roofMasks[h + tileIndex]) {1246--h;1247}1248else {1249collisionMasks[p].rWallMasks[c + tileIndex] = h;1250h = TILE_SIZE;1251}1252}1253}1254}1255else // Regular Tile1256{1257for (int c = 0; c < TILE_SIZE; c += 2) {1258FileRead(&fileBuffer, 1);1259collisionMasks[p].floorMasks[c + tileIndex] = fileBuffer >> 4;1260collisionMasks[p].floorMasks[c + tileIndex + 1] = fileBuffer & 0xF;1261}1262FileRead(&fileBuffer, 1);1263int id = 1;1264for (int c = 0; c < TILE_SIZE / 2; ++c) // HasCollision1265{1266if (fileBuffer & id) {1267collisionMasks[p].roofMasks[c + tileIndex + 8] = 0xF;1268}1269else {1270collisionMasks[p].floorMasks[c + tileIndex + 8] = 0x40;1271collisionMasks[p].roofMasks[c + tileIndex + 8] = -0x40;1272}1273id <<= 1;1274}12751276FileRead(&fileBuffer, 1);1277id = 1;1278for (int c = 0; c < TILE_SIZE / 2; ++c) // HasCollision (pt 2)1279{1280if (fileBuffer & id) {1281collisionMasks[p].roofMasks[c + tileIndex] = 0xF;1282}1283else {1284collisionMasks[p].floorMasks[c + tileIndex] = 0x40;1285collisionMasks[p].roofMasks[c + tileIndex] = -0x40;1286}1287id <<= 1;1288}12891290// LWall rotations1291for (int c = 0; c < TILE_SIZE; ++c) {1292int h = 0;1293while (h > -1) {1294if (h == TILE_SIZE) {1295collisionMasks[p].lWallMasks[c + tileIndex] = 0x40;1296h = -1;1297}1298else if (c < collisionMasks[p].floorMasks[h + tileIndex]) {1299++h;1300}1301else {1302collisionMasks[p].lWallMasks[c + tileIndex] = h;1303h = -1;1304}1305}1306}13071308// RWall rotations1309for (int c = 0; c < TILE_SIZE; ++c) {1310int h = TILE_SIZE - 1;1311while (h < TILE_SIZE) {1312if (h == -1) {1313collisionMasks[p].rWallMasks[c + tileIndex] = -0x40;1314h = TILE_SIZE;1315}1316else if (c < collisionMasks[p].floorMasks[h + tileIndex]) {1317--h;1318}1319else {1320collisionMasks[p].rWallMasks[c + tileIndex] = h;1321h = TILE_SIZE;1322}1323}1324}1325}1326}1327tileIndex += 16;1328}1329CloseFile();1330}1331}1332void LoadStageGIFFile(int stageID)1333{1334FileInfo info;1335if (LoadStageFile("16x16Tiles.gif", stageID, &info)) {1336byte fileBuffer = 0;13371338SetFilePosition(6); // GIF89a1339FileRead(&fileBuffer, 1);1340int width = fileBuffer;1341FileRead(&fileBuffer, 1);1342width |= (fileBuffer << 8);1343FileRead(&fileBuffer, 1);1344int height = fileBuffer;1345FileRead(&fileBuffer, 1);1346height |= (fileBuffer << 8);13471348FileRead(&fileBuffer, 1); // Palette Size (thrown away) :/1349FileRead(&fileBuffer, 1); // BG Color index (thrown away)1350FileRead(&fileBuffer, 1); // idk actually (still thrown away)13511352byte clr[3];1353for (int c = 0; c < 0x80; ++c) FileRead(clr, 3);1354for (int c = 0x80; c < 0x100; ++c) {1355FileRead(clr, 3);1356SetPaletteEntry(-1, c, clr[0], clr[1], clr[2]);1357}13581359FileRead(&fileBuffer, 1);1360while (fileBuffer != ',') FileRead(&fileBuffer, 1); // gif image start identifier13611362ushort fileBuffer2 = 0;1363FileRead(&fileBuffer2, 2);1364FileRead(&fileBuffer2, 2);1365FileRead(&fileBuffer2, 2);1366FileRead(&fileBuffer2, 2);1367FileRead(&fileBuffer, 1);1368bool interlaced = (fileBuffer & 0x40) >> 6;1369if ((unsigned int)fileBuffer >> 7 == 1) {1370int c = 128;1371do {1372++c;1373FileRead(&fileBuffer, 3);1374} while (c != 256);1375}13761377ReadGifPictureData(width, height, interlaced, tilesetGFXData, 0);13781379byte transparent = tilesetGFXData[0];1380for (int i = 0; i < TILESET_SIZE; ++i) {1381if (tilesetGFXData[i] == transparent)1382tilesetGFXData[i] = 0;1383}13841385CloseFile();1386}1387}13881389void ResetBackgroundSettings()1390{1391for (int i = 0; i < LAYER_COUNT; ++i) {1392stageLayouts[i].deformationOffset = 0;1393stageLayouts[i].deformationOffsetW = 0;1394stageLayouts[i].scrollPos = 0;1395}13961397for (int i = 0; i < PARALLAX_COUNT; ++i) {1398hParallax.scrollPos[i] = 0;1399vParallax.scrollPos[i] = 0;1400}14011402for (int i = 0; i < DEFORM_COUNT; ++i) {1403bgDeformationData0[i] = 0;1404bgDeformationData1[i] = 0;1405bgDeformationData2[i] = 0;1406bgDeformationData3[i] = 0;1407}1408}14091410void SetLayerDeformation(int selectedDef, int waveLength, int waveWidth, int waveType, int YPos, int waveSize)1411{1412int *deformPtr = nullptr;1413switch (selectedDef) {1414case DEFORM_FG: deformPtr = bgDeformationData0; break;1415case DEFORM_FG_WATER: deformPtr = bgDeformationData1; break;1416case DEFORM_BG: deformPtr = bgDeformationData2; break;1417case DEFORM_BG_WATER: deformPtr = bgDeformationData3; break;1418default: break;1419}14201421#if RETRO_SOFTWARE_RENDER1422int shift = 9;1423#endif14241425#if RETRO_HARDWARE_RENDER1426int shift = 5;1427#endif14281429int id = 0;1430if (waveType == 1) {1431id = YPos;1432for (int i = 0; i < waveSize; ++i) {1433deformPtr[id] = waveWidth * sin512LookupTable[(i << 9) / waveLength & 0x1FF] >> shift;1434++id;1435}1436}1437else {1438for (int i = 0; i < 0x200 * 0x100; i += 0x200) {1439int val = waveWidth * sin512LookupTable[i / waveLength & 0x1FF] >> shift;1440deformPtr[id] = val;1441#if RETRO_SOFTWARE_RENDER1442if (deformPtr[id] >= waveWidth)1443deformPtr[id] = waveWidth - 1;1444#endif1445++id;1446}1447}14481449switch (selectedDef) {1450case DEFORM_FG:1451for (int i = DEFORM_STORE; i < DEFORM_COUNT; ++i) bgDeformationData0[i] = bgDeformationData0[i - DEFORM_STORE];1452break;1453case DEFORM_FG_WATER:1454for (int i = DEFORM_STORE; i < DEFORM_COUNT; ++i) bgDeformationData1[i] = bgDeformationData1[i - DEFORM_STORE];1455break;1456case DEFORM_BG:1457for (int i = DEFORM_STORE; i < DEFORM_COUNT; ++i) bgDeformationData2[i] = bgDeformationData2[i - DEFORM_STORE];1458break;1459case DEFORM_BG_WATER:1460for (int i = DEFORM_STORE; i < DEFORM_COUNT; ++i) bgDeformationData3[i] = bgDeformationData3[i - DEFORM_STORE];1461break;1462default: break;1463}1464}14651466void SetPlayerScreenPosition(Entity *target)1467{1468int targetX = target->xpos >> 16;1469int targetY = cameraAdjustY + (target->ypos >> 16);1470if (newYBoundary1 > curYBoundary1) {1471if (newYBoundary1 >= yScrollOffset)1472curYBoundary1 = yScrollOffset;1473else1474curYBoundary1 = newYBoundary1;1475}1476if (newYBoundary1 < curYBoundary1) {1477if (curYBoundary1 >= yScrollOffset)1478--curYBoundary1;1479else1480curYBoundary1 = newYBoundary1;1481}1482if (newYBoundary2 < curYBoundary2) {1483if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)1484--curYBoundary2;1485else1486curYBoundary2 = yScrollOffset + SCREEN_YSIZE;1487}1488if (newYBoundary2 > curYBoundary2) {1489if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2) {1490++curYBoundary2;1491if (target->yvel > 0) {1492int buf = curYBoundary2 + (target->yvel >> 16);1493if (newYBoundary2 < buf) {1494curYBoundary2 = newYBoundary2;1495}1496else {1497curYBoundary2 += target->yvel >> 16;1498}1499}1500}1501else1502curYBoundary2 = newYBoundary2;1503}1504if (newXBoundary1 > curXBoundary1) {1505if (xScrollOffset <= newXBoundary1)1506curXBoundary1 = xScrollOffset;1507else1508curXBoundary1 = newXBoundary1;1509}1510if (newXBoundary1 < curXBoundary1) {1511if (xScrollOffset <= curXBoundary1) {1512--curXBoundary1;1513if (target->xvel < 0) {1514curXBoundary1 += target->xvel >> 16;1515if (curXBoundary1 < newXBoundary1)1516curXBoundary1 = newXBoundary1;1517}1518}1519else {1520curXBoundary1 = newXBoundary1;1521}1522}1523if (newXBoundary2 < curXBoundary2) {1524if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)1525curXBoundary2 = newXBoundary2;1526else1527curXBoundary2 = SCREEN_XSIZE + xScrollOffset;1528}1529if (newXBoundary2 > curXBoundary2) {1530if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {1531++curXBoundary2;1532if (target->xvel > 0) {1533curXBoundary2 += target->xvel >> 16;1534if (curXBoundary2 > newXBoundary2)1535curXBoundary2 = newXBoundary2;1536}1537}1538else {1539curXBoundary2 = newXBoundary2;1540}1541}15421543int xPosDif = targetX - cameraXPos;1544if (targetX > cameraXPos) {1545xPosDif -= 8;1546if (xPosDif >= 0) {1547if (xPosDif >= 17)1548xPosDif = 16;1549}1550else {1551xPosDif = 0;1552}1553}1554else {1555xPosDif += 8;1556if (xPosDif > 0) {1557xPosDif = 0;1558}1559else if (xPosDif <= -17) {1560xPosDif = -16;1561}1562}15631564int centeredXBound1 = cameraXPos + xPosDif;1565cameraXPos = centeredXBound1;1566if (centeredXBound1 < SCREEN_CENTERX + curXBoundary1) {1567cameraXPos = SCREEN_CENTERX + curXBoundary1;1568centeredXBound1 = SCREEN_CENTERX + curXBoundary1;1569}15701571int centeredXBound2 = curXBoundary2 - SCREEN_CENTERX;1572if (centeredXBound2 < centeredXBound1) {1573cameraXPos = centeredXBound2;1574centeredXBound1 = centeredXBound2;1575}15761577int yPosDif = 0;1578if (target->scrollTracking) {1579if (targetY <= cameraYPos) {1580yPosDif = (targetY - cameraYPos) + 32;1581if (yPosDif <= 0) {1582if (yPosDif <= -17)1583yPosDif = -16;1584}1585else1586yPosDif = 0;1587}1588else {1589yPosDif = (targetY - cameraYPos) - 32;1590if (yPosDif >= 0) {1591if (yPosDif >= 17)1592yPosDif = 16;1593}1594else1595yPosDif = 0;1596}1597cameraLockedY = false;1598}1599else if (cameraLockedY) {1600yPosDif = 0;1601cameraYPos = targetY;1602}1603else if (targetY <= cameraYPos) {1604yPosDif = targetY - cameraYPos;1605if (targetY - cameraYPos <= 0) {1606if (yPosDif >= -32 && abs(target->yvel) <= 0x60000) {1607if (yPosDif < -6) {1608yPosDif = -6;1609}1610}1611else if (yPosDif < -16) {1612yPosDif = -16;1613}1614}1615else {1616yPosDif = 0;1617cameraLockedY = true;1618}1619}1620else {1621yPosDif = targetY - cameraYPos;1622if (targetY - cameraYPos < 0) {1623yPosDif = 0;1624cameraLockedY = true;1625}1626else if (yPosDif > 32 || abs(target->yvel) > 0x60000) {1627if (yPosDif > 16) {1628yPosDif = 16;1629}1630else {1631cameraLockedY = true;1632}1633}1634else {1635if (yPosDif <= 6) {1636cameraLockedY = true;1637}1638else {1639yPosDif = 6;1640}1641}1642}16431644int newCamY = cameraYPos + yPosDif;1645if (newCamY <= curYBoundary1 + (SCREEN_SCROLL_UP - 1))1646newCamY = curYBoundary1 + SCREEN_SCROLL_UP;1647cameraYPos = newCamY;1648if (curYBoundary2 - (SCREEN_SCROLL_DOWN - 1) <= newCamY) {1649cameraYPos = curYBoundary2 - SCREEN_SCROLL_DOWN;1650}16511652xScrollOffset = cameraShakeX + centeredXBound1 - SCREEN_CENTERX;16531654int pos = cameraYPos + target->lookPosY - SCREEN_SCROLL_UP;1655if (pos < curYBoundary1) {1656yScrollOffset = curYBoundary1;1657}1658else {1659yScrollOffset = cameraYPos + target->lookPosY - SCREEN_SCROLL_UP;1660}16611662int y = curYBoundary2 - SCREEN_YSIZE;1663if (curYBoundary2 - (SCREEN_YSIZE - 1) > yScrollOffset)1664y = yScrollOffset;1665yScrollOffset = cameraShakeY + y;16661667if (cameraShakeX) {1668if (cameraShakeX <= 0) {1669cameraShakeX = ~cameraShakeX;1670}1671else {1672cameraShakeX = -cameraShakeX;1673}1674}16751676if (cameraShakeY) {1677if (cameraShakeY <= 0) {1678cameraShakeY = ~cameraShakeY;1679}1680else {1681cameraShakeY = -cameraShakeY;1682}1683}1684}1685void SetPlayerScreenPositionCDStyle(Entity *target)1686{1687int targetX = target->xpos >> 16;1688int targetY = cameraAdjustY + (target->ypos >> 16);1689if (newYBoundary1 > curYBoundary1) {1690if (newYBoundary1 >= yScrollOffset)1691curYBoundary1 = yScrollOffset;1692else1693curYBoundary1 = newYBoundary1;1694}1695if (newYBoundary1 < curYBoundary1) {1696if (curYBoundary1 >= yScrollOffset)1697--curYBoundary1;1698else1699curYBoundary1 = newYBoundary1;1700}1701if (newYBoundary2 < curYBoundary2) {1702if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)1703--curYBoundary2;1704else1705curYBoundary2 = yScrollOffset + SCREEN_YSIZE;1706}1707if (newYBoundary2 > curYBoundary2) {1708if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2) {1709++curYBoundary2;1710if (target->yvel > 0) {1711int buf = curYBoundary2 + (target->yvel >> 16);1712if (newYBoundary2 < buf) {1713curYBoundary2 = newYBoundary2;1714}1715else {1716curYBoundary2 += target->yvel >> 16;1717}1718}1719}1720else1721curYBoundary2 = newYBoundary2;1722}1723if (newXBoundary1 > curXBoundary1) {1724if (xScrollOffset <= newXBoundary1)1725curXBoundary1 = xScrollOffset;1726else1727curXBoundary1 = newXBoundary1;1728}1729if (newXBoundary1 < curXBoundary1) {1730if (xScrollOffset <= curXBoundary1) {1731--curXBoundary1;1732if (target->xvel < 0) {1733curXBoundary1 += target->xvel >> 16;1734if (curXBoundary1 < newXBoundary1)1735curXBoundary1 = newXBoundary1;1736}1737}1738else {1739curXBoundary1 = newXBoundary1;1740}1741}1742if (newXBoundary2 < curXBoundary2) {1743if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)1744curXBoundary2 = newXBoundary2;1745else1746curXBoundary2 = SCREEN_XSIZE + xScrollOffset;1747}1748if (newXBoundary2 > curXBoundary2) {1749if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {1750++curXBoundary2;1751if (target->xvel > 0) {1752curXBoundary2 += target->xvel >> 16;1753if (curXBoundary2 > newXBoundary2)1754curXBoundary2 = newXBoundary2;1755}1756}1757else {1758curXBoundary2 = newXBoundary2;1759}1760}17611762if (!target->gravity) {1763if (target->direction) {1764if (cameraStyle == CAMERASTYLE_EXTENDED_OFFSET_R || target->speed < -0x5F5C2) {1765cameraShift = 2;1766if (target->lookPosX <= 63) {1767target->lookPosX += 2;1768}1769}1770else {1771cameraShift = 0;1772if (target->lookPosX < 0) {1773target->lookPosX += 2;1774}17751776if (target->lookPosX > 0) {1777target->lookPosX -= 2;1778}1779}1780}1781else {1782if (cameraStyle == CAMERASTYLE_EXTENDED_OFFSET_L || target->speed > 0x5F5C2) {1783cameraShift = 1;1784if (target->lookPosX >= -63) {1785target->lookPosX -= 2;1786}1787}1788else {1789cameraShift = 0;1790if (target->lookPosX < 0) {1791target->lookPosX += 2;1792}17931794if (target->lookPosX > 0) {1795target->lookPosX -= 2;1796}1797}1798}1799}1800else {1801if (cameraShift == 1) {1802if (target->lookPosX >= -63) {1803target->lookPosX -= 2;1804}1805}1806else if (cameraShift < 1) {1807if (target->lookPosX < 0) {1808target->lookPosX += 2;1809}1810if (target->lookPosX > 0) {1811target->lookPosX -= 2;1812}1813}1814else if (cameraShift == 2) {1815if (target->lookPosX <= 63) {1816target->lookPosX += 2;1817}1818}1819}1820cameraXPos = targetX - target->lookPosX;18211822if (!target->scrollTracking) {1823if (cameraLockedY) {1824cameraYPos = targetY;1825if (cameraYPos < curYBoundary1 + SCREEN_SCROLL_UP) {1826cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1827}1828}1829else if (targetY > cameraYPos) {1830int dif = targetY - cameraYPos;1831if (targetY - cameraYPos < 0) {1832cameraLockedY = true;1833if (cameraYPos < curYBoundary1 + SCREEN_SCROLL_UP) {1834cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1835}1836}1837else {1838if (dif > 32 || abs(target->yvel) > 0x60000) {1839if (dif > 16) {1840dif = 16;1841if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1842cameraYPos += dif;1843}1844else {1845cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1846}1847}1848else {1849cameraLockedY = true;1850if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1851cameraYPos += dif;1852}1853else {1854cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1855}1856}1857}1858else if (dif > 6) {1859dif = 6;1860if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1861cameraYPos += dif;1862}1863else {1864cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1865}1866}1867else {1868cameraLockedY = true;1869if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1870cameraYPos += dif;1871}1872else {1873cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1874}1875}1876}1877}1878else {1879int dif = targetY - cameraYPos;1880if (targetY - cameraYPos <= 0) {1881if (dif < -32 || abs(target->yvel) > 0x60000) {1882if (dif < -16) {1883dif = -16;1884if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1885cameraYPos += dif;1886}1887else {1888cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1889}1890}1891else {1892cameraLockedY = true;1893if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1894cameraYPos += dif;1895}1896else {1897cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1898}1899}1900}1901else if (dif < -6) {1902dif = -6;1903if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1904cameraYPos += dif;1905}1906else {1907cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1908}1909}1910}1911else {1912dif = 0;1913if (abs(target->yvel) > 0x60000) {1914cameraLockedY = true;1915if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1916cameraYPos += dif;1917}1918else {1919cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1920}1921}1922else {1923cameraLockedY = true;1924if (cameraYPos + dif >= curYBoundary1 + SCREEN_SCROLL_UP) {1925cameraYPos += dif;1926}1927else {1928cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1929}1930}1931}1932}1933}1934else {1935int dif = targetY - cameraYPos;1936int difY = 0;1937if (targetY > cameraYPos) {1938difY = dif - 32;1939if (difY >= 0) {1940if (difY >= 17)1941difY = 16;19421943cameraLockedY = false;1944if (cameraYPos + difY >= curYBoundary1 + SCREEN_SCROLL_UP) {1945cameraYPos += difY;1946}1947else {1948cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1949}1950}1951else {1952cameraLockedY = false;1953if (cameraYPos < curYBoundary1 + SCREEN_SCROLL_UP) {1954cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1955}1956}1957}1958else {1959difY = dif + 32;1960if (difY > 0) {1961difY = 0;19621963cameraLockedY = false;1964if (cameraYPos < curYBoundary1 + SCREEN_SCROLL_UP) {1965cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1966}1967}1968else if (difY <= -17) {1969difY = -16;19701971cameraLockedY = false;1972if (cameraYPos + difY >= curYBoundary1 + SCREEN_SCROLL_UP) {1973cameraYPos += difY;1974}1975else {1976cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1977}1978}1979else {1980cameraLockedY = false;1981if (cameraYPos + difY >= curYBoundary1 + SCREEN_SCROLL_UP) {1982cameraYPos += difY;1983}1984else {1985cameraYPos = curYBoundary1 + SCREEN_SCROLL_UP;1986}1987}1988}1989}19901991if (cameraYPos >= curYBoundary2 - SCREEN_SCROLL_DOWN - 1) {1992cameraYPos = curYBoundary2 - SCREEN_SCROLL_DOWN;1993}19941995xScrollOffset = cameraXPos - SCREEN_CENTERX;1996yScrollOffset = target->lookPosY + cameraYPos - SCREEN_SCROLL_UP;19971998int x = curXBoundary1;1999if (x <= xScrollOffset)2000x = xScrollOffset;2001else2002xScrollOffset = x;20032004if (x > curXBoundary2 - SCREEN_XSIZE) {2005x = curXBoundary2 - SCREEN_XSIZE;2006xScrollOffset = curXBoundary2 - SCREEN_XSIZE;2007}20082009int y = curYBoundary1;2010if (yScrollOffset >= y)2011y = yScrollOffset;2012else2013yScrollOffset = y;20142015if (curYBoundary2 - SCREEN_YSIZE - 1 <= y)2016y = curYBoundary2 - SCREEN_YSIZE;20172018xScrollOffset = cameraShakeX + x;2019yScrollOffset = cameraShakeY + y;20202021if (cameraShakeX) {2022if (cameraShakeX <= 0) {2023cameraShakeX = ~cameraShakeX;2024}2025else {2026cameraShakeX = -cameraShakeX;2027}2028}20292030if (cameraShakeY) {2031if (cameraShakeY <= 0) {2032cameraShakeY = ~cameraShakeY;2033}2034else {2035cameraShakeY = -cameraShakeY;2036}2037}2038}2039void SetPlayerHLockedScreenPosition(Entity *target)2040{2041int targetY = cameraAdjustY + (target->ypos >> 16);20422043if (newYBoundary1 <= curYBoundary1) {2044if (curYBoundary1 > yScrollOffset)2045--curYBoundary1;2046else2047curYBoundary1 = newYBoundary1;2048}2049else {2050if (newYBoundary1 >= yScrollOffset)2051curYBoundary1 = yScrollOffset;2052else2053curYBoundary1 = newYBoundary1;2054}20552056if (newYBoundary2 < curYBoundary2) {2057if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)2058--curYBoundary2;2059else2060curYBoundary2 = yScrollOffset + SCREEN_YSIZE;2061}2062if (newYBoundary2 > curYBoundary2) {2063if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2) {2064++curYBoundary2;2065if (target->yvel > 0) {2066if (newYBoundary2 < curYBoundary2 + (target->yvel >> 16)) {2067curYBoundary2 = newYBoundary2;2068}2069else {2070curYBoundary2 += target->yvel >> 16;2071}2072}2073}2074else2075curYBoundary2 = newYBoundary2;2076}20772078if (newXBoundary1 > curXBoundary1) {2079if (xScrollOffset <= newXBoundary1)2080curXBoundary1 = xScrollOffset;2081else2082curXBoundary1 = newXBoundary1;2083}2084if (newXBoundary1 < curXBoundary1) {2085if (xScrollOffset <= curXBoundary1) {2086--curXBoundary1;2087if (target->xvel < 0) {2088curXBoundary1 += target->xvel >> 16;2089if (curXBoundary1 < newXBoundary1)2090curXBoundary1 = newXBoundary1;2091}2092}2093else {2094curXBoundary1 = newXBoundary1;2095}2096}2097if (newXBoundary2 < curXBoundary2) {2098if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)2099curXBoundary2 = newXBoundary2;2100else2101curXBoundary2 = SCREEN_XSIZE + xScrollOffset;2102}2103if (newXBoundary2 > curXBoundary2) {2104if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {2105++curXBoundary2;2106if (target->xvel > 0) {2107curXBoundary2 += target->xvel >> 16;2108if (curXBoundary2 > newXBoundary2)2109curXBoundary2 = newXBoundary2;2110}2111}2112else {2113curXBoundary2 = newXBoundary2;2114}2115}21162117int camScroll = 0;2118if (target->scrollTracking) {2119if (targetY <= cameraYPos) {2120camScroll = targetY - cameraYPos + 32;2121if (camScroll <= 0) {2122if (camScroll <= -17)2123camScroll = -16;2124}2125else2126camScroll = 0;2127}2128else {2129camScroll = targetY - cameraYPos - 32;2130if (camScroll >= 0) {2131if (camScroll >= 17)2132camScroll = 16;2133}2134else2135camScroll = 0;2136}2137cameraLockedY = false;2138}2139else if (cameraLockedY) {2140camScroll = 0;2141cameraYPos = targetY;2142}2143else if (targetY > cameraYPos) {2144camScroll = targetY - cameraYPos;2145if (camScroll >= 0) {2146if (camScroll > 32 || abs(target->yvel) > 0x60000) {2147if (camScroll > 16) {2148camScroll = 16;2149}2150else {2151cameraLockedY = true;2152}2153}2154else if (camScroll > 6) {2155camScroll = 6;2156}2157else {2158cameraLockedY = true;2159}2160}2161else {2162camScroll = 0;2163cameraLockedY = true;2164}2165}2166else {2167camScroll = targetY - cameraYPos;2168if (camScroll > 0) {2169camScroll = 0;2170cameraLockedY = true;2171}2172else if (camScroll < -32 || abs(target->yvel) > 0x60000) {2173if (camScroll < -16) {2174camScroll = -16;2175}2176else {2177cameraLockedY = true;2178}2179}2180else {2181if (camScroll >= -6)2182cameraLockedY = true;2183else2184camScroll = -6;2185}2186}21872188int newCamY = cameraYPos + camScroll;2189if (newCamY <= curYBoundary1 + (SCREEN_SCROLL_UP - 1))2190newCamY = curYBoundary1 + SCREEN_SCROLL_UP;2191cameraYPos = newCamY;2192if (curYBoundary2 - (SCREEN_SCROLL_DOWN - 1) <= newCamY) {2193newCamY = curYBoundary2 - SCREEN_SCROLL_DOWN;2194cameraYPos = curYBoundary2 - SCREEN_SCROLL_DOWN;2195}21962197xScrollOffset = cameraShakeX + cameraXPos - SCREEN_CENTERX;21982199int pos = newCamY + target->lookPosY - SCREEN_SCROLL_UP;2200if (pos < curYBoundary1) {2201yScrollOffset = curYBoundary1;2202}2203else {2204yScrollOffset = newCamY + target->lookPosY - SCREEN_SCROLL_UP;2205}2206int y1 = curYBoundary2 - (SCREEN_YSIZE - 1);2207int y2 = curYBoundary2 - SCREEN_YSIZE;2208if (y1 > yScrollOffset)2209y2 = yScrollOffset;2210yScrollOffset = cameraShakeY + y2;22112212if (cameraShakeX) {2213if (cameraShakeX <= 0) {2214cameraShakeX = ~cameraShakeX;2215}2216else {2217cameraShakeX = -cameraShakeX;2218}2219}22202221if (cameraShakeY) {2222if (cameraShakeY <= 0) {2223cameraShakeY = ~cameraShakeY;2224}2225else {2226cameraShakeY = -cameraShakeY;2227}2228}2229}2230void SetPlayerLockedScreenPosition(Entity *target)2231{2232if (newYBoundary1 > curYBoundary1) {2233if (yScrollOffset <= newYBoundary1)2234curYBoundary1 = yScrollOffset;2235else2236curYBoundary1 = newYBoundary1;2237}2238if (newYBoundary1 < curYBoundary1) {2239if (yScrollOffset <= curYBoundary1)2240--curYBoundary1;2241else2242curYBoundary1 = newYBoundary1;2243}2244if (newYBoundary2 < curYBoundary2) {2245if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)2246--curYBoundary2;2247else2248curYBoundary2 = yScrollOffset + SCREEN_YSIZE;2249}2250if (newYBoundary2 > curYBoundary2) {2251if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2)2252++curYBoundary2;2253else2254curYBoundary2 = newYBoundary2;2255}2256if (newXBoundary1 > curXBoundary1) {2257if (xScrollOffset <= newXBoundary1)2258curXBoundary1 = xScrollOffset;2259else2260curXBoundary1 = newXBoundary1;2261}2262if (newXBoundary1 < curXBoundary1) {2263if (xScrollOffset <= curXBoundary1) {2264--curXBoundary1;2265if (target->xvel < 0) {2266curXBoundary1 += target->xvel >> 16;2267if (curXBoundary1 < newXBoundary1)2268curXBoundary1 = newXBoundary1;2269}2270}2271else {2272curXBoundary1 = newXBoundary1;2273}2274}2275if (newXBoundary2 < curXBoundary2) {2276if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)2277curXBoundary2 = newXBoundary2;2278else2279curXBoundary2 = SCREEN_XSIZE + xScrollOffset;2280}2281if (newXBoundary2 > curXBoundary2) {2282if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {2283++curXBoundary2;2284if (target->xvel > 0) {2285curXBoundary2 += target->xvel >> 16;2286if (curXBoundary2 > newXBoundary2)2287curXBoundary2 = newXBoundary2;2288}2289}2290else {2291curXBoundary2 = newXBoundary2;2292}2293}22942295if (cameraShakeX) {2296if (cameraShakeX <= 0) {2297cameraShakeX = ~cameraShakeX;2298}2299else {2300cameraShakeX = -cameraShakeX;2301}2302}23032304if (cameraShakeY) {2305if (cameraShakeY <= 0) {2306cameraShakeY = ~cameraShakeY;2307}2308else {2309cameraShakeY = -cameraShakeY;2310}2311}2312}2313// Completely unused in both Sonic 1 & Sonic 22314void SetPlayerScreenPositionFixed(Entity *target)2315{2316int targetX = target->xpos >> 16;2317int targetY = cameraAdjustY + (target->ypos >> 16);2318if (newYBoundary1 > curYBoundary1) {2319if (newYBoundary1 >= yScrollOffset)2320curYBoundary1 = yScrollOffset;2321else2322curYBoundary1 = newYBoundary1;2323}2324if (newYBoundary1 < curYBoundary1) {2325if (curYBoundary1 >= yScrollOffset)2326--curYBoundary1;2327else2328curYBoundary1 = newYBoundary1;2329}2330if (newYBoundary2 < curYBoundary2) {2331if (curYBoundary2 <= yScrollOffset + SCREEN_YSIZE || newYBoundary2 >= yScrollOffset + SCREEN_YSIZE)2332--curYBoundary2;2333else2334curYBoundary2 = yScrollOffset + SCREEN_YSIZE;2335}2336if (newYBoundary2 > curYBoundary2) {2337if (yScrollOffset + SCREEN_YSIZE >= curYBoundary2) {2338++curYBoundary2;2339if (target->yvel > 0) {2340int buf = curYBoundary2 + (target->yvel >> 16);2341if (newYBoundary2 < buf) {2342curYBoundary2 = newYBoundary2;2343}2344else {2345curYBoundary2 += target->yvel >> 16;2346}2347}2348}2349else2350curYBoundary2 = newYBoundary2;2351}2352if (newXBoundary1 > curXBoundary1) {2353if (xScrollOffset <= newXBoundary1)2354curXBoundary1 = xScrollOffset;2355else2356curXBoundary1 = newXBoundary1;2357}2358if (newXBoundary1 < curXBoundary1) {2359if (xScrollOffset <= curXBoundary1) {2360--curXBoundary1;2361if (target->xvel < 0) {2362curXBoundary1 += target->xvel >> 16;2363if (curXBoundary1 < newXBoundary1)2364curXBoundary1 = newXBoundary1;2365}2366}2367else {2368curXBoundary1 = newXBoundary1;2369}2370}2371if (newXBoundary2 < curXBoundary2) {2372if (newXBoundary2 > SCREEN_XSIZE + xScrollOffset)2373curXBoundary2 = newXBoundary2;2374else2375curXBoundary2 = SCREEN_XSIZE + xScrollOffset;2376}2377if (newXBoundary2 > curXBoundary2) {2378if (SCREEN_XSIZE + xScrollOffset >= curXBoundary2) {2379++curXBoundary2;2380if (target->xvel > 0) {2381curXBoundary2 += target->xvel >> 16;2382if (curXBoundary2 > newXBoundary2)2383curXBoundary2 = newXBoundary2;2384}2385}2386else {2387curXBoundary2 = newXBoundary2;2388}2389}23902391cameraXPos = targetX;2392if (targetX < SCREEN_CENTERX + curXBoundary1) {2393targetX = SCREEN_CENTERX + curXBoundary1;2394cameraXPos = SCREEN_CENTERX + curXBoundary1;2395}2396int boundX2 = curXBoundary2 - SCREEN_CENTERX;2397if (boundX2 < targetX) {2398targetX = boundX2;2399cameraXPos = boundX2;2400}24012402if (targetY <= curYBoundary1 + 119) {2403targetY = curYBoundary1 + 120;2404cameraYPos = curYBoundary1 + 120;2405}2406else {2407cameraYPos = targetY;2408}2409if (curYBoundary2 - 119 <= targetY) {2410targetY = curYBoundary2 - 120;2411cameraYPos = curYBoundary2 - 120;2412}24132414xScrollOffset = cameraShakeX + targetX - SCREEN_CENTERX;2415int camY = targetY + target->lookPosY - SCREEN_CENTERY;2416if (curYBoundary1 > camY) {2417yScrollOffset = curYBoundary1;2418}2419else {2420yScrollOffset = targetY + target->lookPosY - SCREEN_CENTERY;2421}24222423int newCamY = curYBoundary2 - SCREEN_YSIZE;2424if (curYBoundary2 - (SCREEN_YSIZE - 1) > yScrollOffset)2425newCamY = yScrollOffset;2426yScrollOffset = cameraShakeY + newCamY;24272428if (cameraShakeX) {2429if (cameraShakeX <= 0) {2430cameraShakeX = ~cameraShakeX;2431}2432else {2433cameraShakeX = -cameraShakeX;2434}2435}24362437if (cameraShakeY) {2438if (cameraShakeY <= 0) {2439cameraShakeY = ~cameraShakeY;2440}2441else {2442cameraShakeY = -cameraShakeY;2443}2444}2445}244624472448