diff --git a/.gitignore b/.gitignore index f8320fd..5dc7830 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ rvm.xcodeproj/project.xcworkspace/xcuserdata .vs +.vscode Rvm_Win64/x64 /x64* *.o diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..773184b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,49 @@ +project(soniccd) + +cmake_minimum_required(VERSION 3.0) + +include(FindPkgConfig) + +set(CMAKE_C_FLAGS "-g -DLINUX -DSDL_DISABLE_IMMINTRIN_H -DSDL_DISABLE_MMINTRIN_H -std=c99 ${CMAKE_C_FLAGS}") + +pkg_check_modules(SDL2 sdl2 REQUIRED) +if(NSWITCH) + set(CMAKE_C_FLAGS "-DGLEW_NO_GLU ${CMAKE_C_FLAGS}") + find_package(GLEW REQUIRED) + find_library(GLEW_LIBRARY NAMES GLEW) + set(EXTRA_LIBS mpg123 modplug mikmod vorbisfile vorbis ogg FLAC fluidsynth opusfile opus ${GLEW_LIBRARY} stdc++) +else() + set(OpenGL_GL_PREFERENCE LEGACY) + find_package(OpenGL REQUIRED) + set(EXTRA_LIBS ${OPENGL_gl_LIBRARY}) +endif(NSWITCH) + +include_directories( + ${SDL2_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR}/rvm/Core +) + +file(GLOB SRC rvm/*.c rvm/Core/*.c) +add_executable(${CMAKE_PROJECT_NAME} + ${SRC} +) + +target_link_libraries(${CMAKE_PROJECT_NAME} + SDL2_mixer + ${SDL2_LIBRARIES} + ${EXTRA_LIBS} + m +) + +if(NSWITCH) + add_definitions(-D__SWITCH__) + add_custom_target(${CMAKE_PROJECT_NAME}.nro + DEPENDS ${CMAKE_PROJECT_NAME} + COMMAND nacptool --create "Sonic CD" "Sappharad, usineur" "0.7.5" ${CMAKE_PROJECT_NAME}.nacp + COMMAND elf2nro ${CMAKE_PROJECT_NAME} ${CMAKE_PROJECT_NAME}.nro --icon=${CMAKE_SOURCE_DIR}/icon.jpg --nacp=${CMAKE_PROJECT_NAME}.nacp + ) + add_custom_target(nxlink + COMMAND nxlink -a $(SWITCHIP) ${CMAKE_PROJECT_NAME}.nro -s -p ${CMAKE_PROJECT_NAME}/${CMAKE_PROJECT_NAME}.nro + DEPENDS ${CMAKE_PROJECT_NAME}.nro + ) +endif(NSWITCH) diff --git a/icon.jpg b/icon.jpg new file mode 100644 index 0000000..b4970af Binary files /dev/null and b/icon.jpg differ diff --git a/rvm/Core/AnimationSystem.c b/rvm/Core/AnimationSystem.c index 1de5fc6..8bce908 100644 --- a/rvm/Core/AnimationSystem.c +++ b/rvm/Core/AnimationSystem.c @@ -87,7 +87,7 @@ void AnimationSystem_LoadAnimationFile(char* filePath) animationFrames[animationFramesNo].xSize = (int)b2; b2 = FileIO_ReadByte(); animationFrames[animationFramesNo].ySize = (int)b2; - char b3 = (char)FileIO_ReadByte(); + signed char b3 = (signed char)FileIO_ReadByte(); animationFrames[animationFramesNo].xPivot = (int)b3; b3 = (char)FileIO_ReadByte(); animationFrames[animationFramesNo].yPivot = (int)b3; diff --git a/rvm/Core/FileIO.c b/rvm/Core/FileIO.c index 2bcc9f5..88f414a 100755 --- a/rvm/Core/FileIO.c +++ b/rvm/Core/FileIO.c @@ -278,6 +278,7 @@ bool FileIO_CheckRSDKFile() useRSDKFile = true; useByteCode = false; fclose(fileReader); + fileReader = NULL; if (FileIO_LoadFile("Data/Scripts/ByteCode/GlobalCode.bin", &fData)) { diff --git a/rvm/Core/InputSystem.c b/rvm/Core/InputSystem.c index afd4c79..3506e38 100644 --- a/rvm/Core/InputSystem.c +++ b/rvm/Core/InputSystem.c @@ -189,11 +189,19 @@ void InputSystem_CheckGamepadInput(){ { touchData.right = 1; } +#ifdef __SWITCH__ + if(SDL_GameControllerGetButton(sdlController, SDL_CONTROLLER_BUTTON_B)) +#else if(SDL_GameControllerGetButton(sdlController, SDL_CONTROLLER_BUTTON_A)) +#endif { touchData.buttonA = 1; } +#ifdef __SWITCH__ + if(SDL_GameControllerGetButton(sdlController, SDL_CONTROLLER_BUTTON_A)) +#else if(SDL_GameControllerGetButton(sdlController, SDL_CONTROLLER_BUTTON_B)) +#endif { touchData.buttonB = 1; } diff --git a/rvm/Core/RenderDevice.c b/rvm/Core/RenderDevice.c index 7b74eb3..ebb4202 100755 --- a/rvm/Core/RenderDevice.c +++ b/rvm/Core/RenderDevice.c @@ -8,9 +8,11 @@ #include #include #pragma comment(lib, "glew32s.lib") +#elif __SWITCH__ +#include #elif LINUX -#include -#include +#include +#include #else #include #endif diff --git a/rvm/main_linux.c b/rvm/main_linux.c index 45829f9..dea7880 100644 --- a/rvm/main_linux.c +++ b/rvm/main_linux.c @@ -3,8 +3,12 @@ #include #include #include +#ifdef __SWITCH__ +#include +#include +#else #include -#include +#endif #include "GlobalAppDefinitions.h" #include "GraphicsSystem.h" #ifdef __EMSCRIPTEN__ @@ -34,6 +38,10 @@ static void initAttributes() // on OpenGL double buffering. value = 1; SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, value); + +#ifdef __SWITCH__ + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); +#endif } static void printAttributes() @@ -77,6 +85,14 @@ static void createSurface(int fullscreen) exit(2); } SDL_GL_CreateContext(gWindow); +#ifdef __SWITCH__ + GLenum err = glewInit(); + if (err != GLEW_OK) { + fprintf(stderr, "glewInit() failed: %s\n", glewGetErrorString(err)); + SDL_Quit(); + return; + } +#endif glViewport(0, 0, 800, 480); //glViewport(0, 0, 864, 480); @@ -98,6 +114,7 @@ static void createSurface(int fullscreen) void UpdateIO() { InputSystem_CheckKeyboardInput(); + InputSystem_CheckGamepadInput(); InputSystem_ClearTouchData(); if (stageMode != 2) @@ -216,8 +233,12 @@ void loop_func(void *arg) { int main (int argc, char **argv) { +#ifdef __SWITCH__ + socketInitializeDefault(); + nxlinkStdio(); +#endif // Init SDL video subsystem - if (SDL_Init(SDL_INIT_VIDEO) < 0) { + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); @@ -248,6 +269,9 @@ int main (int argc, char **argv) // Cleanup SDL_Quit(); +#ifdef __SWITCH__ + socketExit(); +#endif + return 0; } - \ No newline at end of file