Path: blob/main/RSDKv4/RetroEngine.hpp
817 views
#ifndef RETROENGINE_H1#define RETROENGINE_H23// Disables POSIX use c++ name blah blah stuff4#pragma warning(disable : 4996)56// Setting this to true removes (almost) ALL changes from the original code, the trade off is that a playable game cannot be built, it is advised to7// be set to true only for preservation purposes8#ifndef RETRO_USE_ORIGINAL_CODE9#define RETRO_USE_ORIGINAL_CODE (0)10#endif1112#ifndef RETRO_USE_MOD_LOADER13#define RETRO_USE_MOD_LOADER (!RETRO_USE_ORIGINAL_CODE && 1)14#endif1516#ifndef RETRO_USE_NETWORKING17#define RETRO_USE_NETWORKING (!RETRO_USE_ORIGINAL_CODE && 1)18#endif1920// Forces all DLC flags to be disabled, this should be enabled in any public releases21#ifndef RSDK_AUTOBUILD22#define RSDK_AUTOBUILD (0)23#endif2425// ================26// STANDARD LIBS27// ================28#include <stdio.h>29#include <string.h>30#include <cmath>31#if RETRO_USE_MOD_LOADER32#include <regex>33#endif3435// ================36// STANDARD TYPES37// ================38typedef unsigned char byte;39typedef signed char sbyte;40typedef unsigned short ushort;41typedef unsigned int uint;42// typedef unsigned long long ulong;4344// Platforms (RSDKv4 only defines these 7 (I assume), but feel free to add your own custom platform define for easier platform code changes)45#define RETRO_WIN (0)46#define RETRO_OSX (1)47#define RETRO_XBOX_360 (2)48#define RETRO_PS3 (3)49#define RETRO_iOS (4)50#define RETRO_ANDROID (5)51#define RETRO_WP7 (6)52// Custom Platforms start here53#define RETRO_UWP (7)54#define RETRO_LINUX (8)5556// Platform types (Game manages platform-specific code such as HUD position using this rather than the above)57#define RETRO_STANDARD (0)58#define RETRO_MOBILE (1)5960#if defined _WIN326162#if defined WINAPI_FAMILY63#if WINAPI_FAMILY != WINAPI_FAMILY_APP64#define RETRO_PLATFORM (RETRO_WIN)65#define RETRO_DEVICETYPE (RETRO_STANDARD)66#else67#include <WInRTIncludes.hpp>6869#define RETRO_PLATFORM (RETRO_UWP)70#define RETRO_DEVICETYPE (UAP_GetRetroGamePlatform())71#endif72#else73#define RETRO_PLATFORM (RETRO_WIN)74#define RETRO_DEVICETYPE (RETRO_STANDARD)75#endif7677#elif defined __APPLE__78#if __IPHONEOS__79#define RETRO_PLATFORM (RETRO_iOS)80#define RETRO_DEVICETYPE (RETRO_MOBILE)81#else82#define RETRO_PLATFORM (RETRO_OSX)83#define RETRO_DEVICETYPE (RETRO_STANDARD)84#endif85#elif defined __ANDROID__86#define RETRO_PLATFORM (RETRO_ANDROID)87#define RETRO_DEVICETYPE (RETRO_MOBILE)88#include <jni.h>89#elif defined(__linux__)90#define RETRO_PLATFORM (RETRO_LINUX)91#define RETRO_DEVICETYPE (RETRO_STANDARD)92#else93//#error "No Platform was defined"94#define RETRO_PLATFORM (RETRO_LINUX)95#define RETRO_DEVICETYPE (RETRO_STANDARD)96#endif9798#define DEFAULT_SCREEN_XSIZE 42499#define DEFAULT_FULLSCREEN false100#define RETRO_USING_MOUSE101#define RETRO_USING_TOUCH102103#ifndef BASE_PATH104#define BASE_PATH ""105#endif106107#if !defined(RETRO_USE_SDL2) && !defined(RETRO_USE_SDL1)108#define RETRO_USE_SDL2 (1)109#endif110111#if RETRO_PLATFORM == RETRO_WIN || RETRO_PLATFORM == RETRO_OSX || RETRO_PLATFORM == RETRO_LINUX || RETRO_PLATFORM == RETRO_UWP \112|| RETRO_PLATFORM == RETRO_ANDROID113#ifdef RETRO_USE_SDL2114#define RETRO_USING_SDL1 (0)115#define RETRO_USING_SDL2 (1)116#elif defined(RETRO_USE_SDL1)117#define RETRO_USING_SDL1 (1)118#define RETRO_USING_SDL2 (0)119#endif120#else // Since its an else & not an elif these platforms probably aren't supported yet121#define RETRO_USING_SDL1 (0)122#define RETRO_USING_SDL2 (0)123#endif124125#if RETRO_PLATFORM == RETRO_iOS || RETRO_PLATFORM == RETRO_ANDROID || RETRO_PLATFORM == RETRO_WP7126#define RETRO_GAMEPLATFORM (RETRO_MOBILE)127#elif RETRO_PLATFORM == RETRO_UWP128#define RETRO_GAMEPLATFORM (UAP_GetRetroGamePlatform())129#else130#define RETRO_GAMEPLATFORM (RETRO_STANDARD)131#endif132133#define RETRO_SW_RENDER (0)134#define RETRO_HW_RENDER (1)135136#ifdef USE_SW_REN137#define RETRO_RENDERTYPE (RETRO_SW_RENDER)138#elif defined(USE_HW_REN)139#define RETRO_RENDERTYPE (RETRO_HW_RENDER)140#elif !defined(RETRO_RENDERTYPE)141#define RETRO_RENDERTYPE (RETRO_SW_RENDER)142#endif143144#ifndef RETRO_USING_OPENGL145#define RETRO_USING_OPENGL (1)146#endif147148#define RETRO_SOFTWARE_RENDER (RETRO_RENDERTYPE == RETRO_SW_RENDER)149//#define RETRO_HARDWARE_RENDER (RETRO_RENDERTYPE == RETRO_HW_RENDER)150151#if RETRO_USING_OPENGL152#if RETRO_PLATFORM == RETRO_ANDROID153#define GL_GLEXT_PROTOTYPES154155#include <GLES/gl.h>156#include <GLES/glext.h>157158#undef glGenFramebuffers159#undef glBindFramebuffer160#undef glFramebufferTexture2D161#undef glDeleteFramebuffers162163#undef GL_FRAMEBUFFER164#undef GL_COLOR_ATTACHMENT0165#undef GL_FRAMEBUFFER_BINDING166167#define glGenFramebuffers glGenFramebuffersOES168#define glBindFramebuffer glBindFramebufferOES169#define glFramebufferTexture2D glFramebufferTexture2DOES170#define glDeleteFramebuffers glDeleteFramebuffersOES171172#define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES173#define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_OES174#define GL_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING_OES175#elif RETRO_PLATFORM == RETRO_OSX176#define GL_GLEXT_PROTOTYPES177#define GL_SILENCE_DEPRECATION178179#include <OpenGL/gl.h>180#include <OpenGL/glext.h>181182#undef glGenFramebuffers183#undef glBindFramebuffer184#undef glFramebufferTexture2D185#undef glDeleteFramebuffers186187#undef GL_FRAMEBUFFER188#undef GL_COLOR_ATTACHMENT0189#undef GL_FRAMEBUFFER_BINDING190191#define glGenFramebuffers glGenFramebuffersEXT192#define glBindFramebuffer glBindFramebufferEXT193#define glFramebufferTexture2D glFramebufferTexture2DEXT194#define glDeleteFramebuffers glDeleteFramebuffersEXT195196#define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT197#define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT198#define GL_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING_EXT199#else200#include <GL/glew.h>201#endif202#endif203204#define RETRO_USE_HAPTICS (1)205206// NOTE: This is only used for rev00 stuff, it was removed in rev01 and later builds207#if RETRO_PLATFORM <= RETRO_WP7208#define RETRO_GAMEPLATFORMID (RETRO_PLATFORM)209#else210211// use *this* macro to determine what platform the game thinks its running on (since only the first 7 platforms are supported natively by scripts)212#if RETRO_PLATFORM == RETRO_LINUX213#define RETRO_GAMEPLATFORMID (RETRO_WIN)214#elif RETRO_PLATFORM == RETRO_UWP215#define RETRO_GAMEPLATFORMID (UAP_GetRetroGamePlatformId())216#else217#error Unspecified RETRO_GAMEPLATFORMID218#endif219220#endif221222// Determines which revision to use (see defines below for specifics). Datafiles from REV00 and REV01 builds will not work on later revisions and vice versa.223#ifndef RSDK_REVISION224#define RSDK_REVISION (3)225#endif226227// Revision from early versions of Sonic 1228#define RETRO_REV00 (RSDK_REVISION == 0)229230// Revision from early versions of Sonic 2231#define RETRO_REV01 (RSDK_REVISION >= 1)232233// Revision from the S3&K POC, this is also used in the Sega Forever versions of S1 & S2234#define RETRO_REV02 (RSDK_REVISION >= 2)235236// Revision included as part of RSDKv5U (Sonic Origins)237#define RETRO_REV03 (RSDK_REVISION >= 3)238239enum RetroLanguages {240RETRO_EN = 0,241RETRO_FR = 1,242RETRO_IT = 2,243RETRO_DE = 3,244RETRO_ES = 4,245RETRO_JP = 5,246RETRO_PT = 6,247RETRO_RU = 7,248RETRO_KO = 8,249RETRO_ZH = 9,250RETRO_ZS = 10,251};252253#if RETRO_REV00254enum RetroEngineMessages {255MESSAGE_NONE = 0,256MESSAGE_MESSAGE_1 = 1,257MESSAGE_LOSTFOCUS = 2,258MESSAGE_MESSAGE_3 = 3,259MESSAGE_MESSAGE_4 = 4,260};261#endif262263enum RetroStates {264ENGINE_DEVMENU = 0,265ENGINE_MAINGAME = 1,266ENGINE_INITDEVMENU = 2,267ENGINE_WAIT = 3,268ENGINE_SCRIPTERROR = 4,269ENGINE_INITPAUSE = 5,270ENGINE_EXITPAUSE = 6,271ENGINE_ENDGAME = 7,272ENGINE_RESETGAME = 8,273274#if !RETRO_USE_ORIGINAL_CODE && RETRO_USE_NETWORKING275// Custom GameModes (required to make some features work)276ENGINE_CONNECT2PVS = 0x80,277ENGINE_WAIT2PVS = 0x81,278#endif279#if RETRO_USE_MOD_LOADER280ENGINE_INITMODMENU = 0x82,281#endif282};283284enum RetroGameType {285GAME_UNKNOWN = 0,286GAME_SONIC1 = 1,287GAME_SONIC2 = 2,288};289290// General Defines291#define SCREEN_YSIZE (240)292#define SCREEN_CENTERY (SCREEN_YSIZE / 2)293294#if RETRO_PLATFORM == RETRO_WIN || RETRO_PLATFORM == RETRO_UWP || RETRO_PLATFORM == RETRO_ANDROID || RETRO_PLATFORM == RETRO_LINUX295#if RETRO_USING_SDL2296#include <SDL.h>297#elif RETRO_USING_SDL1298#include <SDL.h>299#endif300#include <vorbis/vorbisfile.h>301#elif RETRO_PLATFORM == RETRO_OSX302#include <SDL2/SDL.h>303#include <Vorbis/vorbisfile.h>304305#include "cocoaHelpers.hpp"306307#elif RETRO_USING_SDL2308#include <SDL2/SDL.h>309#include <vorbis/vorbisfile.h>310#else311312#endif313314#if !RETRO_USE_ORIGINAL_CODE315extern bool usingCWD;316extern bool engineDebugMode;317#endif318319// Utils320#if !RETRO_USE_ORIGINAL_CODE321#include "Ini.hpp"322#endif323324#include "Math.hpp"325#include "Reader.hpp"326#include "String.hpp"327#include "Animation.hpp"328#include "Audio.hpp"329#include "Input.hpp"330#include "Object.hpp"331#include "Palette.hpp"332#include "Drawing.hpp"333#include "Scene3D.hpp"334#include "Collision.hpp"335#include "Scene.hpp"336#include "Script.hpp"337#include "Sprite.hpp"338#include "Text.hpp"339#include "Networking.hpp"340#include "Renderer.hpp"341#include "Userdata.hpp"342#include "Debug.hpp"343#include "ModAPI.hpp"344345// Native Entities346#include "NativeObjects.hpp"347348class RetroEngine349{350public:351RetroEngine()352{353if (RETRO_GAMEPLATFORM == RETRO_STANDARD) {354gamePlatform = "STANDARD";355gameDeviceType = RETRO_STANDARD;356}357else {358gamePlatform = "MOBILE";359gameDeviceType = RETRO_MOBILE;360}361}362363#if !RETRO_USE_ORIGINAL_CODE364bool usingDataFile_Config = false;365#endif366bool usingDataFile = false;367bool usingBytecode = false;368#if RETRO_REV03 && !RETRO_USE_ORIGINAL_CODE369bool usingOrigins = false;370#endif371372char dataFile[RETRO_PACKFILE_COUNT][0x80];373374bool initialised = false;375bool running = false;376double deltaTime = 0;377378int gameMode = ENGINE_MAINGAME;379int language = RETRO_EN;380#if RETRO_REV00381int message = 0;382#endif383int gameDeviceType = RETRO_STANDARD;384int globalBoxRegion = REGION_JP;385bool nativeMenuFadeIn = false;386387bool trialMode = false;388bool onlineActive = true;389bool useHighResAssets = false;390#if RETRO_USE_HAPTICS391bool hapticsEnabled = true;392#endif393394int frameSkipSetting = 0;395int frameSkipTimer = 0;396397#if !RETRO_USE_ORIGINAL_CODE398// Ported from RSDKv5399int startList_Game = -1;400int startStage_Game = -1;401402bool consoleEnabled = false;403bool devMenu = false;404int startList = -1;405int startStage = -1;406int startPlayer = -1;407int startSave = -1;408int gameSpeed = 1;409int fastForwardSpeed = 8;410bool masterPaused = false;411bool frameStep = false;412int dimTimer = 0;413int dimLimit = 0;414float dimPercent = 1.0;415float dimMax = 1.0;416417char startSceneFolder[0x10];418char startSceneID[0x10];419420bool showPaletteOverlay = false;421bool useHQModes = true;422423bool hasFocus = true;424int focusState = 0;425#endif426427void Init();428void Run();429430bool LoadGameConfig(const char *filepath);431#if RETRO_USE_MOD_LOADER432void LoadXMLWindowText();433void LoadXMLVariables();434void LoadXMLPalettes();435void LoadXMLObjects();436void LoadXMLSoundFX();437void LoadXMLPlayers(TextMenu *menu);438void LoadXMLStages(TextMenu *menu, int listNo);439#endif440441char gameWindowText[0x40];442char gameDescriptionText[0x100];443#ifdef DECOMP_VERSION444const char *gameVersion = DECOMP_VERSION;445#else446const char *gameVersion = "1.3.3";447#endif448const char *gamePlatform = nullptr;449450int gameTypeID = 0;451const char *releaseType = "USE_STANDALONE";452453#if RETRO_RENDERTYPE == RETRO_SW_RENDER454const char *gameRenderType = "SW_RENDERING";455#elif RETRO_RENDERTYPE == RETRO_HW_RENDER456const char *gameRenderType = "HW_RENDERING";457#endif458459#if RETRO_USE_HAPTICS460const char *gameHapticSetting = "USE_F_FEEDBACK"; // None is default, but people with controllers exist461#else462const char *gameHapticSetting = "NO_F_FEEDBACK";463#endif464465#if !RETRO_USE_ORIGINAL_CODE466byte gameType = GAME_UNKNOWN;467#if RETRO_USE_MOD_LOADER468bool modMenuCalled = false;469bool forceSonic1 = false;470#endif471#endif472473#if RETRO_SOFTWARE_RENDER474ushort *frameBuffer = nullptr;475ushort *frameBuffer2x = nullptr;476#endif477uint *texBuffer = nullptr;478479#if !RETRO_USE_ORIGINAL_CODE480bool isFullScreen = false;481482bool startFullScreen = false; // if should start as fullscreen483bool borderless = false;484bool vsync = false;485int scalingMode = 0;486int windowScale = 2;487int refreshRate = 60; // user-picked screen update rate488int screenRefreshRate = 60; // hardware screen update rate489int targetRefreshRate = 60; // game logic update rate490491int renderFrameIndex = 0;492int skipFrameIndex = 0;493494int windowXSize; // width of window/screen in the previous frame495int windowYSize; // height of window/screen in the previous frame496#endif497498#if !RETRO_USE_ORIGINAL_CODE499#if RETRO_USING_SDL2500SDL_Window *window = nullptr;501#if !RETRO_USING_OPENGL502SDL_Renderer *renderer = nullptr;503#if RETRO_SOFTWARE_RENDER504SDL_Texture *screenBuffer = nullptr;505SDL_Texture *screenBuffer2x = nullptr;506#endif // RETRO_SOFTWARE_RENDERER507#endif508509SDL_Event sdlEvents;510511#if RETRO_USING_OPENGL512SDL_GLContext glContext; // OpenGL context513#endif // RETRO_USING_OPENGL514#endif // RETRO_USING_SDL2515516#if RETRO_USING_SDL1517SDL_Surface *windowSurface = nullptr;518519SDL_Surface *screenBuffer = nullptr;520SDL_Surface *screenBuffer2x = nullptr;521522SDL_Event sdlEvents;523#endif // RETRO_USING_SDL1524#endif //! RETRO_USE_ORIGINAL_CODE525};526527extern RetroEngine Engine;528#endif // !RETROENGINE_H529530531