diff --git a/3rdParty/Storm/Source/storm.h b/3rdParty/Storm/Source/storm.h index ec06ef181..b7da79bb1 100644 --- a/3rdParty/Storm/Source/storm.h +++ b/3rdParty/Storm/Source/storm.h @@ -72,10 +72,10 @@ BOOL STORMAPI SNetDestroy(); * Returns TRUE if the function was called successfully and FALSE otherwise. */ BOOL -STORMAPI -SNetDropPlayer( - int playerid, - DWORD flags); + STORMAPI + SNetDropPlayer( + int playerid, + DWORD flags); /* SNetGetGameInfo @ 107 * @@ -89,11 +89,11 @@ SNetDropPlayer( * Returns TRUE if the function was called successfully and FALSE otherwise. */ BOOL -STORMAPI -SNetGetGameInfo( - int type, - void *dst, - unsigned int length); + STORMAPI + SNetGetGameInfo( + int type, + void *dst, + unsigned int length); /* SNetGetTurnsInTransit @ 115 * @@ -105,36 +105,34 @@ SNetGetGameInfo( * Returns TRUE if the function was called successfully and FALSE otherwise. */ BOOL -STORMAPI -SNetGetTurnsInTransit( - DWORD *turns); + STORMAPI + SNetGetTurnsInTransit( + DWORD *turns); // Network provider structures -typedef struct _client_info -{ - DWORD dwSize; // 60 - char *pszName; - char *pszVersion; - DWORD dwProduct; - DWORD dwVerbyte; - DWORD dwUnk5; - DWORD dwMaxPlayers; - DWORD dwUnk7; - DWORD dwUnk8; - DWORD dwUnk9; - DWORD dwUnk10; // 0xFF - char *pszCdKey; - char *pszCdOwner; - DWORD dwIsShareware; - DWORD dwLangId; +typedef struct _client_info { + DWORD dwSize; // 60 + char *pszName; + char *pszVersion; + DWORD dwProduct; + DWORD dwVerbyte; + DWORD dwUnk5; + DWORD dwMaxPlayers; + DWORD dwUnk7; + DWORD dwUnk8; + DWORD dwUnk9; + DWORD dwUnk10; // 0xFF + char *pszCdKey; + char *pszCdOwner; + DWORD dwIsShareware; + DWORD dwLangId; } client_info; -typedef struct _user_info -{ - DWORD dwSize; // 16 - char *pszPlayerName; - char *pszUnknown; - DWORD dwUnknown; +typedef struct _user_info { + DWORD dwSize; // 16 + char *pszPlayerName; + char *pszUnknown; + DWORD dwUnknown; } user_info; BOOL STORMAPI SNetJoinGame(int id, char *gameName, char *gamePassword, char *playerName, char *userStats, int *playerid); @@ -149,15 +147,15 @@ BOOL STORMAPI SNetJoinGame(int id, char *gameName, char *gamePassword, char *pla * Returns TRUE if the function was called successfully and FALSE otherwise. */ BOOL -STORMAPI -SNetLeaveGame( - int type); + STORMAPI + SNetLeaveGame( + int type); BOOL STORMAPI SNetPerformUpgrade(DWORD *upgradestatus); BOOL STORMAPI SNetReceiveMessage(int *senderplayerid, char **data, int *databytes); BOOL STORMAPI SNetReceiveTurns(int a1, int arraysize, char **arraydata, DWORD *arraydatabytes, DWORD *arrayplayerstatus); -typedef void (STORMAPI *SEVTHANDLER)(struct _SNETEVENT *); +typedef void(STORMAPI *SEVTHANDLER)(struct _SNETEVENT *); /* SNetSendMessage @ 127 * @@ -175,12 +173,11 @@ typedef void (STORMAPI *SEVTHANDLER)(struct _SNETEVENT *); * Returns TRUE if the function was called successfully and FALSE otherwise. */ BOOL -STORMAPI -SNetSendMessage( - int playerID, - void *data, - unsigned int databytes); - + STORMAPI + SNetSendMessage( + int playerID, + void *data, + unsigned int databytes); // Macro values to target specific players #define SNPLAYER_ALL -1 @@ -202,10 +199,10 @@ SNetSendMessage( * Returns TRUE if the function was called successfully and FALSE otherwise. */ BOOL -STORMAPI -SNetSendTurn( - char *data, - unsigned int databytes); + STORMAPI + SNetSendTurn( + char *data, + unsigned int databytes); BOOL STORMAPI SFileCloseArchive(HANDLE hArchive); BOOL STORMAPI SFileCloseFile(HANDLE hFile); @@ -235,15 +232,15 @@ BOOL STORMAPI SFileReadFile(HANDLE hFile, void *buffer, DWORD nNumberOfBytesToRe * Returns TRUE if the image was supported and loaded correctly, FALSE otherwise. */ BOOL -STORMAPI -SBmpLoadImage( - const char *pszFileName, - SDL_Color *pPalette , - BYTE *pBuffer, - DWORD dwBuffersize, - DWORD *pdwWidth, - DWORD *pdwHeight, - DWORD *pdwBpp); + STORMAPI + SBmpLoadImage( + const char *pszFileName, + SDL_Color *pPalette, + BYTE *pBuffer, + DWORD dwBuffersize, + DWORD *pdwWidth, + DWORD *pdwHeight, + DWORD *pdwBpp); /* SMemAlloc @ 401 * @@ -280,18 +277,18 @@ void * * Returns TRUE if the call was successful and FALSE otherwise. */ BOOL -STORMAPI -SMemFree( - void *location, - const char *logfilename, - int logline, - char defaultValue); + STORMAPI + SMemFree( + void *location, + const char *logfilename, + int logline, + char defaultValue); bool getIniBool(const char *sectionName, const char *keyName, bool defaultValue = false); -bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, int *dataSize = NULL); +bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString = ""); void setIniValue(const char *sectionName, const char *keyName, const char *value, int len = 0); -BOOL STORMAPI SRegLoadValue(const char *keyname, const char *valuename, BYTE flags, int *value); -BOOL STORMAPI SRegSaveValue(const char *keyname, const char *valuename, BYTE flags, DWORD result); +int getIniInt(const char *keyname, const char *valuename, int defaultValue); +void setIniInt(const char *keyname, const char *valuename, int value); void SVidPlayBegin(const char *filename, int a2, int a3, int a4, int a5, int flags, HANDLE *video); void SVidPlayEnd(HANDLE video); @@ -314,9 +311,9 @@ SErrGetLastError(); * dwErrCode: The error code that will be set. */ void -STORMAPI -SErrSetLastError( - DWORD dwErrCode); + STORMAPI + SErrSetLastError( + DWORD dwErrCode); // Values for dwErrCode #define STORM_ERROR_GAME_TERMINATED 0x85100069 @@ -336,11 +333,11 @@ SErrSetLastError( * */ void -STORMAPI -SStrCopy( - char *dest, - const char *src, - int max_length); + STORMAPI + SStrCopy( + char *dest, + const char *src, + int max_length); BOOL SFileSetBasePath(const char *); BOOL SVidPlayContinue(void); @@ -357,4 +354,4 @@ BOOL SFileEnableDirectAccess(BOOL enable); } #endif -} +} // namespace dvl diff --git a/CMake/ctr/n3ds_defs.cmake b/CMake/ctr/n3ds_defs.cmake index 3a50c91a2..eed358494 100644 --- a/CMake/ctr/n3ds_defs.cmake +++ b/CMake/ctr/n3ds_defs.cmake @@ -19,8 +19,8 @@ set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}\ -DTTF_FONT_PATH=\\"romfs #Force scaling, for now.. set(SDL1_VIDEO_MODE_FLAGS SDL_FULLSCREEN) -set(SDL1_VIDEO_MODE_WIDTH 800) -set(SDL1_VIDEO_MODE_HEIGHT 480) +set(DEFAULT_WIDTH 800) +set(DEFAULT_HEIGHT 480) #SDL Joystick axis mapping (circle-pad) set(JOY_AXIS_LEFTX 0) diff --git a/CMake/gkd350h_defs.cmake b/CMake/gkd350h_defs.cmake index b1780ad28..10d2a4c81 100644 --- a/CMake/gkd350h_defs.cmake +++ b/CMake/gkd350h_defs.cmake @@ -2,8 +2,8 @@ set(NONET ON) set(USE_SDL1 ON) # GKD350h IPU scaler is broken at the moment -set(SDL1_VIDEO_MODE_WIDTH 320) -set(SDL1_VIDEO_MODE_HEIGHT 240) +set(DEFAULT_WIDTH 320) +set(DEFAULT_HEIGHT 240) set(SDL1_VIDEO_MODE_BPP 16) set(PREFILL_PLAYER_NAME ON) diff --git a/CMakeLists.txt b/CMakeLists.txt index d39be4daa..a14f9abd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -395,6 +395,9 @@ file(GENERATE OUTPUT ${CONFIG_PATH} CONTENT "#pragma once #define PROJECT_NAME \"${PROJECT_NAME}\" #define PROJECT_VERSION \"${PROJECT_VERSION}${VERSION_SUFFIX}\" +#define PROJECT_VERSION_MAJOR ${PROJECT_VERSION_MAJOR} +#define PROJECT_VERSION_MINOR ${PROJECT_VERSION_MINOR} +#define PROJECT_VERSION_PATCH ${PROJECT_VERSION_PATCH} ") if(RUN_TESTS) @@ -454,8 +457,8 @@ endforeach(def_name) # Defines with value foreach( def_name - SDL1_VIDEO_MODE_WIDTH - SDL1_VIDEO_MODE_HEIGHT + DEFAULT_WIDTH + DEFAULT_HEIGHT TTF_FONT_DIR TTF_FONT_NAME SDL1_VIDEO_MODE_BPP diff --git a/DiabloUI/diabloui.h b/DiabloUI/diabloui.h index fc5b79152..81bf7765f 100644 --- a/DiabloUI/diabloui.h +++ b/DiabloUI/diabloui.h @@ -9,8 +9,8 @@ void UiTitleDialog(); void UiSetSpawned(BOOL bSpawned); void UiInitialize(); BOOL UiValidPlayerName(const char *name); /* check */ -BOOL UiSelHeroMultDialog(BOOL(*fninfo)(BOOL(*fninfofunc)(_uiheroinfo *)), BOOL(*fncreate)(_uiheroinfo *), BOOL(*fnremove)(_uiheroinfo *), void(*fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, BOOL *hero_is_created, char (* name)[16]); -BOOL UiSelHeroSingDialog(BOOL(*fninfo)(BOOL(*fninfofunc)(_uiheroinfo *)), BOOL(*fncreate)(_uiheroinfo *), BOOL(*fnremove)(_uiheroinfo *), void(*fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, char (* name)[16], int *difficulty); +void UiSelHeroMultDialog(BOOL(*fninfo)(BOOL(*fninfofunc)(_uiheroinfo *)), BOOL(*fncreate)(_uiheroinfo *), BOOL(*fnremove)(_uiheroinfo *), void(*fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, BOOL *hero_is_created, char (* name)[16]); +void UiSelHeroSingDialog(BOOL(*fninfo)(BOOL(*fninfofunc)(_uiheroinfo *)), BOOL(*fncreate)(_uiheroinfo *), BOOL(*fnremove)(_uiheroinfo *), void(*fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, char (* name)[16], int *difficulty); BOOL UiCreditsDialog(); BOOL UiSupportDialog(); BOOL UiMainMenuDialog(const char *name, int *pdwResult, void(*fnSound)(const char *file), int attractTimeOut); diff --git a/Source/diablo.cpp b/Source/diablo.cpp index d597b9d6f..580bcb1c0 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -35,27 +35,22 @@ int setseed; int PauseMode; bool forceSpawn; bool forceDiablo; -BOOLEAN UseTheoQuest; -BOOLEAN UseCowFarmer; -BOOLEAN UseNestArt; -BOOLEAN UseBardTest; -BOOLEAN UseBarbarianTest; -BOOLEAN UseMultiTest; +bool gbTheoQuest; +bool gbCowQuest; +bool gbNestArt; +bool gbBard; +bool gbBarbarian; int sgnTimeoutCurs; char sgbMouseDown; int color_cycle_timer; -int ticks_per_sec = 20; -WORD tick_delay = 50; +int gnTickRate; +WORD gnTickDelay = 50; /** Game options */ Options sgOptions; /* rdata */ -/** - * Specifies whether to give the game exclusive access to the - * screen, as needed for efficient rendering in fullscreen mode. - */ -BOOL fullscreen = TRUE; +bool gbForceWindowed = false; bool gbShowIntro = true; BOOL leveldebug; #ifdef _DEBUG @@ -110,8 +105,6 @@ static void print_help_and_exit() printf(" %-20s %-30s\n", "--barbariantest", "Enable the Barbarian class"); printf("\nHellfire options:\n"); printf(" %-20s %-30s\n", "--diablo", "Force diablo mode even if hellfire.mpq is found"); - printf(" %-20s %-30s\n", "--theoquest", "Enable the Theo quest"); - printf(" %-20s %-30s\n", "--cowquest", "Enable the Cow quest"); printf(" %-20s %-30s\n", "--nestart", "Use alternate nest palette"); #ifdef _DEBUG printf("\nDebug options:\n"); @@ -153,21 +146,17 @@ static void diablo_parse_flags(int argc, char **argv) } else if (strcasecmp("-f", argv[i]) == 0) { EnableFrameCount(); } else if (strcasecmp("-x", argv[i]) == 0) { - fullscreen = FALSE; + gbForceWindowed = true; } else if (strcasecmp("--spawn", argv[i]) == 0) { forceSpawn = TRUE; } else if (strcasecmp("--diablo", argv[i]) == 0) { forceDiablo = TRUE; - } else if (strcasecmp("--theoquest", argv[i]) == 0) { - UseTheoQuest = TRUE; - } else if (strcasecmp("--cowquest", argv[i]) == 0) { - UseCowFarmer = TRUE; } else if (strcasecmp("--nestart", argv[i]) == 0) { - UseNestArt = TRUE; + gbNestArt = true; } else if (strcasecmp("--bardtest", argv[i]) == 0) { - UseBardTest = TRUE; + gbBard = true; } else if (strcasecmp("--barbariantest", argv[i]) == 0) { - UseBarbarianTest = TRUE; + gbBarbarian = true; #ifdef _DEBUG } else if (strcasecmp("-^", argv[i]) == 0) { debug_mode_key_inverted_v = TRUE; @@ -413,8 +402,33 @@ BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer) */ static void SaveOptions() { - SRegSaveValue("devilutionx", "game speed", 0, sgOptions.ticksPerSecound); - SRegSaveValue("devilutionx", "blended transparency", 0, sgOptions.blendedTransparancy); + setIniInt("Audio", "Sound Volume", sgOptions.nSoundVolume); + setIniInt("Audio", "Music Volume", sgOptions.nMusicVolume); + setIniInt("Audio", "Walking Sound", sgOptions.bWalkingSound); + +#ifdef __vita__ + setIniInt("Graphics", "Width", sgOptions.nWidth); + setIniInt("Graphics", "Height", sgOptions.nHeight); +#endif + setIniInt("Graphics", "Fullscreen", sgOptions.bFullscreen); +#ifdef __vita__ + setIniInt("Graphics", "Upscale", sgOptions.bUpscale); +#endif + setIniInt("Graphics", "Fit to Screen", sgOptions.bFitToScreen); + setIniValue("Graphics", "Scaling Quality", sgOptions.szScaleQuality); + setIniInt("Graphics", "Integer Scaling", sgOptions.bIntegerScaling); + setIniInt("Graphics", "Vertical Sync", sgOptions.bVSync); + setIniInt("Graphics", "Blended Transparency", sgOptions.bBlendedTransparancy); + setIniInt("Graphics", "Gamma Correction", sgOptions.nGammaCorrection); + setIniInt("Graphics", "Color Cycling", sgOptions.bColorCycling); + + setIniInt("Game", "Speed", sgOptions.nTickRate); + setIniInt("Game", "Fast Walk", sgOptions.bJogInTown); + setIniInt("Game", "Grab Input", sgOptions.bGrabInput); + setIniInt("Game", "Theo Quest", sgOptions.bTheoQuest); + setIniInt("Game", "Cow Quest", sgOptions.bCowQuest); + + setIniValue("Network", "Bind Address", sgOptions.szBindAddress); } /** @@ -422,9 +436,38 @@ static void SaveOptions() */ static void LoadOptions() { - sgOptions.ticksPerSecound = ticks_per_sec; - SRegLoadValue("devilutionx", "game speed", 0, &sgOptions.ticksPerSecound); - sgOptions.blendedTransparancy = getIniBool("devilutionx", "blended transparency", true); + sgOptions.nSoundVolume = getIniInt("Audio", "Sound Volume", VOLUME_MAX); + sgOptions.nMusicVolume = getIniInt("Audio", "Music Volume", VOLUME_MAX); + sgOptions.bWalkingSound = getIniBool("Audio", "Walking Sound", true); + +#ifndef __vita__ + sgOptions.nWidth = getIniInt("Graphics", "Width", DEFAULT_WIDTH); + sgOptions.nHeight = getIniInt("Graphics", "Height", DEFAULT_HEIGHT); +#else + sgOptions.nWidth = DEFAULT_WIDTH; + sgOptions.nHeight = DEFAULT_HEIGHT; +#endif + sgOptions.bFullscreen = getIniBool("Graphics", "Fullscreen", true); +#if !defined(USE_SDL1) && !defined(__vita__) + sgOptions.bUpscale = getIniBool("Graphics", "Upscale", true); +#else + sgOptions.bUpscale = false; +#endif + sgOptions.bFitToScreen = getIniBool("Graphics", "Fit to Screen", true); + getIniValue("Graphics", "Scaling Quality", sgOptions.szScaleQuality, sizeof(sgOptions.szScaleQuality), "2"); + sgOptions.bIntegerScaling = getIniBool("Graphics", "Integer Scaling", false); + sgOptions.bVSync = getIniBool("Graphics", "Vertical Sync", true); + sgOptions.bBlendedTransparancy = getIniBool("Graphics", "Blended Transparency", true); + sgOptions.nGammaCorrection = getIniInt("Graphics", "Gamma Correction", 100); + sgOptions.bColorCycling = getIniBool("Graphics", "Color Cycling", true); + + sgOptions.nTickRate = getIniInt("Game", "Speed", 20); + sgOptions.bJogInTown = getIniBool("Game", "Fast Walk", false); + sgOptions.bGrabInput = getIniBool("Game", "Grab Input", false); + sgOptions.bTheoQuest = getIniBool("Game", "Theo Quest", false); + sgOptions.bCowQuest = getIniBool("Game", "Cow Quest", false); + + getIniValue("Network", "Bind Address", sgOptions.szBindAddress, sizeof(sgOptions.szBindAddress), "0.0.0.0"); } static void diablo_init_screen() @@ -482,7 +525,8 @@ static void diablo_splash() if (gbIsHellfire && getIniBool("Hellfire", "Intro", true)) { play_movie("gendata\\Hellfire.smk", TRUE); setIniValue("Hellfire", "Intro", "0"); - } else if (!gbIsSpawn && getIniBool("Diablo", "Intro", true)) { + } + if (!gbIsHellfire && !gbIsSpawn && getIniBool("Diablo", "Intro", true)) { play_movie("gendata\\diablo1.smk", TRUE); setIniValue("Diablo", "Intro", "0"); } @@ -494,7 +538,6 @@ static void diablo_deinit() { if (was_snd_init) { effects_cleanup_sfx(); - sound_cleanup(); } if (was_ui_init) UiDestroy(); @@ -1901,7 +1944,7 @@ void game_loop(BOOL bStartup) { int i; - i = bStartup ? ticks_per_sec * 3 : 3; + i = bStartup ? gnTickRate * 3 : 3; while (i--) { if (!multi_handle_delta()) { @@ -1918,7 +1961,7 @@ void game_loop(BOOL bStartup) void diablo_color_cyc_logic() { - if (!palette_get_color_cycling()) + if (!sgOptions.bColorCycling) return; if (leveltype == DTYPE_HELL) { diff --git a/Source/diablo.h b/Source/diablo.h index 26549a5cb..8553bed85 100644 --- a/Source/diablo.h +++ b/Source/diablo.h @@ -12,9 +12,37 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif +#ifndef DEFAULT_WIDTH +#define DEFAULT_WIDTH 640 +#endif +#ifndef DEFAULT_HEIGHT +#define DEFAULT_HEIGHT 480 +#endif + typedef struct Options { - bool blendedTransparancy; // Use blended transparency rather than stippled - int ticksPerSecound; // Game play ticks per secound + Sint32 nSoundVolume; // Movie and SFX volume + Sint32 nMusicVolume; // Music volume + bool bWalkingSound; // Player emits sound when walking + + Sint32 nWidth; // Render width + Sint32 nHeight; // Render height + bool bFullscreen; // Run in fullscreen or windowed mode + bool bUpscale; // Scale the image after rendering + bool bFitToScreen; // Expand the aspect ratio to match the screen + char szScaleQuality[2]; // See SDL_HINT_RENDER_SCALE_QUALITY + bool bIntegerScaling; // Only scale by values divisible by the width and height + bool bVSync; // Enable vsync on the output + bool bBlendedTransparancy; // Use blended transparency rather than stippled + Sint32 nGammaCorrection; // Gamma correction level + bool bColorCycling; // Enable color cycling animations + + Sint32 nTickRate; // Game play ticks per secound + bool bJogInTown; // Enable double walk speed when in town + bool bGrabInput; // Do not let the mouse leave the application window + bool bTheoQuest; // Enable the Theo quest + bool bCowQuest; // Enable the cow quest + + char szBindAddress[129]; // Optionally bind to a specific network interface } Options; extern SDL_Window *ghMainWnd; @@ -34,15 +62,14 @@ extern BOOL was_fonts_init; extern void FontsCleanup(); extern BOOL light4flag; extern int PauseMode; -extern BOOLEAN UseTheoQuest; -extern BOOLEAN UseCowFarmer; -extern BOOLEAN UseNestArt; -extern BOOLEAN UseBardTest; -extern BOOLEAN UseBarbarianTest; -extern BOOLEAN UseMultiTest; +extern bool gbTheoQuest; +extern bool gbCowQuest; +extern bool gbNestArt; +extern bool gbBard; +extern bool gbBarbarian; extern char sgbMouseDown; -extern int ticks_per_sec; -extern WORD tick_delay; +extern int gnTickRate; +extern WORD gnTickDelay; extern Options sgOptions; void FreeGameMem(); @@ -60,7 +87,7 @@ void diablo_color_cyc_logic(); /* rdata */ -extern BOOL fullscreen; +extern bool gbForceWindowed; extern BOOL leveldebug; #ifdef _DEBUG extern BOOL monstdebug; diff --git a/Source/engine.cpp b/Source/engine.cpp index 5cc2c35e4..6b5f0996f 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -385,7 +385,7 @@ void CelClippedBlitLightTransTo(CelOutputBuffer out, int sx, int sy, BYTE *pCelB pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize); if (cel_transparency_active) { - if (sgOptions.blendedTransparancy) + if (sgOptions.bBlendedTransparancy) CelBlitLightBlendedSafeTo(out, sx, sy, pRLEBytes, nDataSize, nWidth, NULL); else CelBlitLightTransSafeTo(out, sx, sy, pRLEBytes, nDataSize, nWidth); @@ -655,7 +655,7 @@ BYTE *DiabloAllocPtr(DWORD dwBytes) if (buf == NULL) { const char *text = "System memory exhausted.\n" - "Make sure you have at least 64MB of free system memory before running the game"; + "Make sure you have at least 64MB of free system memory before running the game"; ERR_DLG("Out of Memory Error", text); } diff --git a/Source/gamemenu.cpp b/Source/gamemenu.cpp index 519182f95..98cf6f22d 100644 --- a/Source/gamemenu.cpp +++ b/Source/gamemenu.cpp @@ -9,7 +9,7 @@ DEVILUTION_BEGIN_NAMESPACE -BOOL jogging_opt = TRUE; +bool gbJogInTown = false; /** Contains the game menu items of the single player menu. */ TMenuItem sgSingleMenu[] = { @@ -61,8 +61,7 @@ const char *jogging_toggle_names[] = { "Jog", "Walk", }; -const char *jogging_title = "Fast Walk"; -/** Specifies the menu names for colour cycling disabled and enabled. */ +/** Specifies the menu names for color cycling disabled and enabled. */ const char *const color_cycling_toggle_names[] = { "Color Cycling Off", "Color Cycling On" }; static void gamemenu_update_single(TMenuItem *pMenuItems) @@ -221,8 +220,8 @@ static void gamemenu_get_sound() static void gamemenu_jogging() { gmenu_slider_steps(&sgOptionsMenu[3], 2); - gmenu_slider_set(&sgOptionsMenu[3], 0, 1, jogging_opt); - sgOptionsMenu[3].pszStr = jogging_toggle_names[!jogging_opt ? 1 : 0]; + gmenu_slider_set(&sgOptionsMenu[3], 0, 1, sgOptions.bJogInTown); + sgOptionsMenu[3].pszStr = jogging_toggle_names[!sgOptions.bJogInTown ? 1 : 0]; } static void gamemenu_get_gamma() @@ -235,13 +234,13 @@ static void gamemenu_get_speed() { if (gbIsMultiplayer) { sgOptionsMenu[3].dwFlags &= ~(GMENU_ENABLED | GMENU_SLIDER); - if (ticks_per_sec >= 50) + if (gnTickRate >= 50) sgOptionsMenu[3].pszStr = "Speed: Fastest"; - else if (ticks_per_sec >= 40) + else if (gnTickRate >= 40) sgOptionsMenu[3].pszStr = "Speed: Faster"; - else if (ticks_per_sec >= 30) + else if (gnTickRate >= 30) sgOptionsMenu[3].pszStr = "Speed: Fast"; - else if (ticks_per_sec == 20) + else if (gnTickRate == 20) sgOptionsMenu[3].pszStr = "Speed: Normal"; return; } @@ -250,12 +249,12 @@ static void gamemenu_get_speed() sgOptionsMenu[3].pszStr = "Speed"; gmenu_slider_steps(&sgOptionsMenu[3], 46); - gmenu_slider_set(&sgOptionsMenu[3], 20, 50, ticks_per_sec); + gmenu_slider_set(&sgOptionsMenu[3], 20, 50, gnTickRate); } static void gamemenu_get_color_cycling() { - sgOptionsMenu[3].pszStr = color_cycling_toggle_names[palette_get_color_cycling() & 1]; + sgOptionsMenu[3].pszStr = color_cycling_toggle_names[sgOptions.bColorCycling ? 1 : 0]; } static int gamemenu_slider_gamma() @@ -351,8 +350,8 @@ void gamemenu_sound_volume(BOOL bActivate) void gamemenu_loadjog(BOOL bActivate) { if (!gbIsMultiplayer) { - jogging_opt = !jogging_opt; - SRegSaveValue("Hellfire", jogging_title, FALSE, jogging_opt); + sgOptions.bJogInTown = !sgOptions.bJogInTown; + gbJogInTown = sgOptions.bJogInTown; PlaySFX(IS_TITLEMOV); gamemenu_jogging(); } @@ -378,25 +377,23 @@ void gamemenu_gamma(BOOL bActivate) void gamemenu_speed(BOOL bActivate) { if (bActivate) { - if (ticks_per_sec != 20) - ticks_per_sec = 20; + if (gnTickRate != 20) + gnTickRate = 20; else - ticks_per_sec = 50; - gmenu_slider_set(&sgOptionsMenu[3], 20, 50, ticks_per_sec); + gnTickRate = 50; + gmenu_slider_set(&sgOptionsMenu[3], 20, 50, gnTickRate); } else { - ticks_per_sec = gmenu_slider_get(&sgOptionsMenu[3], 20, 50); + gnTickRate = gmenu_slider_get(&sgOptionsMenu[3], 20, 50); } - SRegSaveValue("devilutionx", "game speed", 0, ticks_per_sec); - tick_delay = 1000 / ticks_per_sec; + sgOptions.nTickRate = gnTickRate; + gnTickDelay = 1000 / gnTickRate; } void gamemenu_color_cycling(BOOL bActivate) { - BOOL color_cycling; - - color_cycling = palette_set_color_cycling(palette_get_color_cycling() == 0); - sgOptionsMenu[3].pszStr = color_cycling_toggle_names[color_cycling & 1]; + sgOptions.bColorCycling = !sgOptions.bColorCycling; + sgOptionsMenu[3].pszStr = color_cycling_toggle_names[sgOptions.bColorCycling ? 1 : 0]; } DEVILUTION_END_NAMESPACE diff --git a/Source/gamemenu.h b/Source/gamemenu.h index c56c04e5b..a9d208c44 100644 --- a/Source/gamemenu.h +++ b/Source/gamemenu.h @@ -12,8 +12,7 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern const char *jogging_title; -extern BOOL jogging_opt; +extern bool gbJogInTown; void gamemenu_on(); void gamemenu_off(); diff --git a/Source/init.cpp b/Source/init.cpp index 3ad7f8b21..b1ca3c5fb 100644 --- a/Source/init.cpp +++ b/Source/init.cpp @@ -163,7 +163,11 @@ void init_archives() gbIsHellfire = true; hfmonk_mpq = init_test_access("hfmonk.mpq", "DiabloInstall", 8100, FS_PC); hfbard_mpq = init_test_access("hfbard.mpq", "DiabloInstall", 8110, FS_PC); + if (hfbard_mpq != NULL) + gbBard = true; hfbarb_mpq = init_test_access("hfbarb.mpq", "DiabloInstall", 8120, FS_PC); + if (hfbarb_mpq != NULL) + gbBarbarian = true; hfmusic_mpq = init_test_access("hfmusic.mpq", "DiabloInstall", 8200, FS_PC); hfvoice_mpq = init_test_access("hfvoice.mpq", "DiabloInstall", 8500, FS_PC); hfopt1_mpq = init_test_access("hfopt1.mpq", "DiabloInstall", 8600, FS_PC); diff --git a/Source/interfac.cpp b/Source/interfac.cpp index 833f812dc..f9f5c747e 100644 --- a/Source/interfac.cpp +++ b/Source/interfac.cpp @@ -11,7 +11,7 @@ BYTE *sgpBackCel; DWORD sgdwProgress; int progress_id; -/** The colour used for the progress bar as an index into the palette. */ +/** The color used for the progress bar as an index into the palette. */ const BYTE BarColor[3] = { 138, 43, 254 }; /** The screen position of the top left corner of the progress bar. */ const int BarPos[3][2] = { { 53, 37 }, { 53, 421 }, { 53, 37 } }; diff --git a/Source/items.cpp b/Source/items.cpp index b1f38610f..f1bb3871d 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -264,7 +264,6 @@ int ItemInvSnds[] = { IS_ILARM, IS_ILARM, }; -const char *off_4A5AC4 = "SItem"; /** Specifies the current Y-coordinate used for validation of items on ground. */ int idoppely = 16; /** Maps from Griswold premium item number to a quality level delta as added to the base quality level. */ @@ -651,9 +650,9 @@ void InitItems() SpawnRock(); if (QuestStatus(Q_ANVIL)) SpawnQuestItem(IDI_ANVIL, 2 * setpc_x + 27, 2 * setpc_y + 27, 0, 1); - if (UseCowFarmer && currlevel == 20) + if (gbCowQuest && currlevel == 20) SpawnQuestItem(IDI_BROWNSUIT, 25, 25, 3, 1); - if (UseCowFarmer && currlevel == 19) + if (gbCowQuest && currlevel == 19) SpawnQuestItem(IDI_GREYSUIT, 25, 25, 3, 1); if (currlevel > 0 && currlevel < 16) AddInitItems(); @@ -2977,9 +2976,9 @@ void items_427A72() sprintf(&hexId[i * 2], "%02X", buffer[i]); } - setIniValue("Hellfire", off_4A5AC4, hexId, sizeof(hexId)); + setIniValue("Hellfire", "SItem", hexId, sizeof(hexId)); } else { - setIniValue("Hellfire", off_4A5AC4, "", 1); + setIniValue("Hellfire", "SItem", "", 1); } } } @@ -3023,11 +3022,10 @@ void items_427ABA(int x, int y) dItem[x][y] = 0; } - int dwSize = 0; - if (!getIniValue("Hellfire", off_4A5AC4, hexPkSItem, sizeof(hexPkSItem), &dwSize)) + if (!getIniValue("Hellfire", "SItem", hexPkSItem, sizeof(hexPkSItem))) return; - if (dwSize < sizeof(PkItemStruct) * 2) + if (strlen(hexPkSItem) < sizeof(PkItemStruct) * 2) return; hex2bin(hexPkSItem, sizeof(PkItemStruct), (char *)&PkSItem); diff --git a/Source/mainmenu.cpp b/Source/mainmenu.cpp index efafb968d..d9ee6c5e5 100644 --- a/Source/mainmenu.cpp +++ b/Source/mainmenu.cpp @@ -51,20 +51,18 @@ static BOOL mainmenu_init_menu(int type) static BOOL mainmenu_single_player() { - if (!SRegLoadValue("qol", jogging_title, 0, &jogging_opt)) { - jogging_opt = FALSE; - } - gbIsMultiplayer = false; - ticks_per_sec = sgOptions.ticksPerSecound; + gbJogInTown = sgOptions.bJogInTown; + gnTickRate = sgOptions.nTickRate; + gbTheoQuest = sgOptions.bTheoQuest; + gbCowQuest = sgOptions.bCowQuest; return mainmenu_init_menu(SELHERO_NEW_DUNGEON); } static BOOL mainmenu_multi_player() { - jogging_opt = FALSE; gbIsMultiplayer = true; return mainmenu_init_menu(SELHERO_CONNECT); } @@ -97,31 +95,29 @@ BOOL mainmenu_select_hero_dialog( BOOL hero_is_created = TRUE; int dlgresult = 0; if (!gbIsMultiplayer) { - if (!UiSelHeroSingDialog( - pfile_ui_set_hero_infos, - pfile_ui_save_create, - pfile_delete_save, - pfile_ui_set_class_stats, - &dlgresult, - &gszHero, - &gnDifficulty)) - app_fatal("Unable to display SelHeroSing"); - client_info->initdata->bDiff = gnDifficulty; + UiSelHeroSingDialog( + pfile_ui_set_hero_infos, + pfile_ui_save_create, + pfile_delete_save, + pfile_ui_set_class_stats, + &dlgresult, + &gszHero, + &gnDifficulty); + client_info->initdata->nDifficulty = gnDifficulty; if (dlgresult == SELHERO_CONTINUE) gbLoadGame = TRUE; else gbLoadGame = FALSE; - - } else if (!UiSelHeroMultDialog( - pfile_ui_set_hero_infos, - pfile_ui_save_create, - pfile_delete_save, - pfile_ui_set_class_stats, - &dlgresult, - &hero_is_created, - &gszHero)) { - app_fatal("Can't load multiplayer dialog"); + } else { + UiSelHeroMultDialog( + pfile_ui_set_hero_infos, + pfile_ui_save_create, + pfile_delete_save, + pfile_ui_set_class_stats, + &dlgresult, + &hero_is_created, + &gszHero); } if (dlgresult == SELHERO_PREVIOUS) { SErrSetLastError(1223); diff --git a/Source/monster.cpp b/Source/monster.cpp index 7e3540c7f..f062e847f 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1723,7 +1723,7 @@ void SpawnLoot(int i, BOOL sendmsg) quests[Q_DEFILER]._qlog = 0; SpawnMapOfDoom(Monst->_mx, Monst->_my); } else if (Monst->mName == UniqMonst[UMT_HORKDMN].mName) { - if (UseTheoQuest) { + if (gbTheoQuest) { SpawnTheodore(Monst->_mx, Monst->_my); } else { CreateAmulet(Monst->_mx, Monst->_my, 13, FALSE, TRUE); @@ -1731,7 +1731,7 @@ void SpawnLoot(int i, BOOL sendmsg) } else if (Monst->MType->mtype == MT_HORKSPWN) { } else if (Monst->MType->mtype == MT_NAKRUL) { nSFX = IsUberRoomOpened ? USFX_NAKRUL4 : USFX_NAKRUL5; - if (UseCowFarmer) + if (gbCowQuest) nSFX = USFX_NAKRUL6; if (effect_is_playing(nSFX)) stream_stop(); @@ -4680,7 +4680,7 @@ void ProcessMonsters() PlaySFX(USFX_CLEAVER); } if (Monst->MType->mtype == MT_NAKRUL) { - if (UseCowFarmer) { + if (gbCowQuest) { PlaySFX(USFX_NAKRUL6); } else { if (IsUberRoomOpened) diff --git a/Source/multi.cpp b/Source/multi.cpp index 7af191d6c..ceea0c8fe 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -22,7 +22,7 @@ BOOL gbShouldValidatePackage; BYTE gbActivePlayers; BOOLEAN gbGameDestroyed; BOOLEAN sgbSendDeltaTbl[MAX_PLRS]; -_gamedata sgGameInitInfo; +GameData sgGameInitInfo; BOOLEAN gbSelectProvider; int sglTimeoutStart; int sgdwPlayerLeftReasonTbl[MAX_PLRS]; @@ -659,16 +659,17 @@ static BOOL multi_upgrade(BOOL *pfExitProgram) static void multi_handle_events(_SNETEVENT *pEvt) { DWORD LeftReason; - _gamedata *gameData; + GameData *gameData; switch (pEvt->eventid) { - case EVENT_TYPE_PLAYER_CREATE_GAME: - gameData = (_gamedata *)pEvt->data; - sgGameInitInfo.dwSeed = gameData->dwSeed; - sgGameInitInfo.bDiff = gameData->bDiff; - sgGameInitInfo.bRate = gameData->bRate; + case EVENT_TYPE_PLAYER_CREATE_GAME: { + GameData *gameData = (GameData *)pEvt->data; + if (gameData->size != sizeof(GameData)) + app_fatal("Invalid size of game data: %d", gameData->size); + sgGameInitInfo = *gameData; sgbPlayerTurnBitTbl[pEvt->playerid] = TRUE; break; + } case EVENT_TYPE_PLAYER_LEAVE_GAME: sgbPlayerLeftGameTbl[pEvt->playerid] = TRUE; sgbPlayerTurnBitTbl[pEvt->playerid] = FALSE; @@ -728,7 +729,6 @@ void NetClose() BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram) { - int i; _SNETPROGRAMDATA ProgramData; _SNETUIDATA UiData; _SNETPLAYERDATA plrdata; @@ -736,22 +736,21 @@ BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram) while (1) { *pfExitProgram = FALSE; SetRndSeed(0); + sgGameInitInfo.size = sizeof(sgGameInitInfo); sgGameInitInfo.dwSeed = time(NULL); - sgGameInitInfo.bDiff = gnDifficulty; - sgGameInitInfo.bRate = ticks_per_sec; + sgGameInitInfo.programid = GAME_ID; + sgGameInitInfo.versionMajor = PROJECT_VERSION_MAJOR; + sgGameInitInfo.versionMinor = PROJECT_VERSION_MINOR; + sgGameInitInfo.versionPatch = PROJECT_VERSION_PATCH; + sgGameInitInfo.nDifficulty = gnDifficulty; + sgGameInitInfo.nTickRate = sgOptions.nTickRate; + sgGameInitInfo.bJogInTown = sgOptions.bJogInTown; + sgGameInitInfo.bTheoQuest = sgOptions.bTheoQuest; + sgGameInitInfo.bCowQuest = sgOptions.bCowQuest; memset(&ProgramData, 0, sizeof(ProgramData)); ProgramData.size = sizeof(ProgramData); - - ProgramData.programname = PROJECT_NAME; - - ProgramData.programdescription = gszVersionNumber; - ProgramData.programid = GAME_ID; - ProgramData.versionid = GAME_VERSION; ProgramData.maxplayers = MAX_PLRS; ProgramData.initdata = &sgGameInitInfo; - ProgramData.initdatabytes = sizeof(sgGameInitInfo); - ProgramData.optcategorybits = 15; - ProgramData.lcid = 1033; /* LANG_ENGLISH */ memset(&plrdata, 0, sizeof(plrdata)); plrdata.size = sizeof(plrdata); memset(&UiData, 0, sizeof(UiData)); @@ -799,12 +798,15 @@ BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram) NetClose(); gbSelectProvider = FALSE; } - gnDifficulty = sgGameInitInfo.bDiff; - ticks_per_sec = sgGameInitInfo.bRate; - tick_delay = 1000 / ticks_per_sec; SetRndSeed(sgGameInitInfo.dwSeed); - - for (i = 0; i < NUMLEVELS; i++) { + gnDifficulty = sgGameInitInfo.nDifficulty; + gnTickRate = sgGameInitInfo.nTickRate; + gnTickDelay = 1000 / gnTickRate; + gbJogInTown = sgGameInitInfo.bJogInTown; + gbTheoQuest = sgGameInitInfo.bTheoQuest; + gbCowQuest = sgGameInitInfo.bCowQuest; + + for (int i = 0; i < NUMLEVELS; i++) { glSeedTbl[i] = AdvanceRndSeed(); gnLevelTypeTbl[i] = InitLevelType(i); } diff --git a/Source/multi.h b/Source/multi.h index 1c55e4ca7..7e90c245f 100644 --- a/Source/multi.h +++ b/Source/multi.h @@ -12,6 +12,26 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif +typedef struct GameData { + Sint32 size; + Sint32 dwSeed; + Sint32 programid; + Uint8 versionMajor; + Uint8 versionMinor; + Uint8 versionPatch; + Uint8 nDifficulty; + Uint8 nTickRate; + Uint8 bJogInTown; + Uint8 bTheoQuest; + Uint8 bCowQuest; +} GameData; + +typedef struct _SNETPROGRAMDATA { + Sint32 size; + Uint8 maxplayers; + GameData *initdata; +} _SNETPROGRAMDATA; + extern BOOLEAN gbSomebodyWonGameKludge; extern char szPlayerDescript[128]; extern WORD sgwPackPlrOffsetTbl[MAX_PLRS]; diff --git a/Source/nthread.cpp b/Source/nthread.cpp index 90eb162d2..96082d967 100644 --- a/Source/nthread.cpp +++ b/Source/nthread.cpp @@ -78,7 +78,7 @@ BOOL nthread_recv_turns(BOOL *pfSendAsync) *pfSendAsync = FALSE; sgbPacketCountdown--; if (sgbPacketCountdown) { - last_tick += tick_delay; + last_tick += gnTickDelay; return TRUE; } sgbSyncCountdown--; @@ -86,7 +86,7 @@ BOOL nthread_recv_turns(BOOL *pfSendAsync) if (sgbSyncCountdown != 0) { *pfSendAsync = TRUE; - last_tick += tick_delay; + last_tick += gnTickDelay; return TRUE; } #ifdef __3DS__ @@ -107,7 +107,7 @@ BOOL nthread_recv_turns(BOOL *pfSendAsync) sgbSyncCountdown = 4; multi_msg_countdown(); *pfSendAsync = TRUE; - last_tick += tick_delay; + last_tick += gnTickDelay; return TRUE; } #endif @@ -127,7 +127,7 @@ static unsigned int nthread_handler(void *data) if (nthread_recv_turns(&received)) delta = last_tick - SDL_GetTicks(); else - delta = tick_delay; + delta = gnTickDelay; sgMemCrit.Leave(); if (delta > 0) SDL_Delay(delta); @@ -235,7 +235,7 @@ BOOL nthread_has_500ms_passed() currentTickCount = SDL_GetTicks(); ticksElapsed = currentTickCount - last_tick; - if (!gbIsMultiplayer && ticksElapsed > tick_delay * 10) { + if (!gbIsMultiplayer && ticksElapsed > gnTickDelay * 10) { last_tick = currentTickCount; ticksElapsed = 0; } diff --git a/Source/palette.cpp b/Source/palette.cpp index 2a007983f..0125e38e3 100644 --- a/Source/palette.cpp +++ b/Source/palette.cpp @@ -16,10 +16,6 @@ Uint8 paletteTransparencyLookup[256][256]; //Lookup table for transparency /* data */ -/** Specifies the gamma correction level. */ -int gamma_correction = 100; -/** Specifies whether colour cycling is enabled. */ -BOOL color_cycling_enabled = TRUE; /** Specifies whether the palette has max brightness. */ BOOLEAN sgbFadedIn = TRUE; @@ -37,7 +33,7 @@ void ApplyGamma(SDL_Color *dst, const SDL_Color *src, int n) int i; double g; - g = gamma_correction / 100.0; + g = sgOptions.nGammaCorrection / 100.0; for (i = 0; i < n; i++) { dst[i].r = pow(src[i].r / 256.0, g) * 256.0; @@ -47,30 +43,16 @@ void ApplyGamma(SDL_Color *dst, const SDL_Color *src, int n) force_redraw = 255; } -static void SaveGamma() -{ - SRegSaveValue("Diablo", "Gamma Correction", 0, gamma_correction); - SRegSaveValue("Diablo", "Color Cycling", FALSE, color_cycling_enabled); -} - static void LoadGamma() { - int gamma_value; - int value; - - value = gamma_correction; - if (!SRegLoadValue("Diablo", "Gamma Correction", 0, &value)) - value = 100; - gamma_value = value; - if (value < 30) { + int gamma_value = sgOptions.nGammaCorrection; + + if (gamma_value < 30) { gamma_value = 30; - } else if (value > 100) { + } else if (gamma_value > 100) { gamma_value = 100; } - gamma_correction = gamma_value - gamma_value % 5; - if (!SRegLoadValue("Diablo", "Color Cycling", 0, &value)) - value = 1; - color_cycling_enabled = value; + sgOptions.nGammaCorrection = gamma_value - gamma_value % 5; } void palette_init() @@ -85,7 +67,7 @@ void palette_init() * * This is based of the same technique found in Quake2. * - * To mimic 50% transparency we figure out what colours in the existing palette are the best match for the combination of any 2 colours. + * To mimic 50% transparency we figure out what colors in the existing palette are the best match for the combination of any 2 colors. * We save this into a lookup table for use during rendering. * * @param palette The colors to operate on @@ -97,7 +79,7 @@ static void GenerateBlendedLookupTable(SDL_Color *palette, int skipFrom, int ski { for (int i = 0; i < 256; i++) { for (int j = 0; j < 256; j++) { - if (i == j) { // No need to calculate transparency between 2 identical colours + if (i == j) { // No need to calculate transparency between 2 identical colors paletteTransparencyLookup[i][j] = j; continue; } @@ -153,7 +135,7 @@ void LoadPalette(const char *pszFileName) #endif } - if (sgOptions.blendedTransparancy) { + if (sgOptions.bBlendedTransparancy) { if (leveltype == DTYPE_CAVES || leveltype == DTYPE_CRYPT) { GenerateBlendedLookupTable(orig_palette, 1, 31); } else if (leveltype == DTYPE_NEST) { @@ -178,7 +160,7 @@ void LoadRndLvlPal(int l) sprintf(szFileName, "NLevels\\L5Data\\L5Base.PAL"); } if (l == 6) { - if (!UseNestArt) { + if (!gbNestArt) { rv++; } sprintf(szFileName, "NLevels\\L%iData\\L%iBase%i.PAL", 6, 6, rv); @@ -193,10 +175,10 @@ void ResetPal() void IncreaseGamma() { - if (gamma_correction < 100) { - gamma_correction += 5; - if (gamma_correction > 100) - gamma_correction = 100; + if (sgOptions.nGammaCorrection < 100) { + sgOptions.nGammaCorrection += 5; + if (sgOptions.nGammaCorrection > 100) + sgOptions.nGammaCorrection = 100; ApplyGamma(system_palette, logical_palette, 256); palette_update(); } @@ -204,10 +186,10 @@ void IncreaseGamma() void DecreaseGamma() { - if (gamma_correction > 30) { - gamma_correction -= 5; - if (gamma_correction < 30) - gamma_correction = 30; + if (sgOptions.nGammaCorrection > 30) { + sgOptions.nGammaCorrection -= 5; + if (sgOptions.nGammaCorrection < 30) + sgOptions.nGammaCorrection = 30; ApplyGamma(system_palette, logical_palette, 256); palette_update(); } @@ -216,12 +198,11 @@ void DecreaseGamma() int UpdateGamma(int gamma) { if (gamma) { - gamma_correction = 130 - gamma; + sgOptions.nGammaCorrection = 130 - gamma; ApplyGamma(system_palette, logical_palette, 256); palette_update(); } - SaveGamma(); - return 130 - gamma_correction; + return 130 - sgOptions.nGammaCorrection; } void SetFadeLevel(DWORD fadeval) @@ -288,7 +269,7 @@ static void CycleColors(int from, int to) } system_palette[to] = col; - if (!sgOptions.blendedTransparancy) + if (!sgOptions.bBlendedTransparancy) return; for (int i = 0; i < 256; i++) { @@ -320,7 +301,7 @@ static void CycleColorsReverse(int from, int to) } system_palette[from] = col; - if (!sgOptions.blendedTransparancy) + if (!sgOptions.bBlendedTransparancy) return; for (int i = 0; i < 256; i++) { @@ -333,9 +314,9 @@ static void CycleColorsReverse(int from, int to) Uint8 colRow[256]; memcpy(colRow, &paletteTransparencyLookup[to], sizeof(*paletteTransparencyLookup)); - for (int i = to; i > from; i--) { + for (int i = to; i > from; i--) { memcpy(&paletteTransparencyLookup[i], &paletteTransparencyLookup[i - 1], sizeof(*paletteTransparencyLookup)); - } + } memcpy(&paletteTransparencyLookup[from], colRow, sizeof(colRow)); } @@ -399,18 +380,6 @@ void palette_update_quest_palette(int n) ApplyGamma(system_palette, logical_palette, 32); palette_update(); GenerateBlendedLookupTable(logical_palette, 1, 31, 32 - n); // Possible optimization would be to only update color 0 as only the UI can overlap with transparency in this quest - -} - -BOOL palette_get_color_cycling() -{ - return color_cycling_enabled; -} - -BOOL palette_set_color_cycling(BOOL enabled) -{ - color_cycling_enabled = enabled; - return enabled; } DEVILUTION_END_NAMESPACE diff --git a/Source/palette.h b/Source/palette.h index 5d48e9ce0..651eb6c3d 100644 --- a/Source/palette.h +++ b/Source/palette.h @@ -34,8 +34,6 @@ void palette_update_caves(); void palette_update_crypt(); void palette_update_hive(); void palette_update_quest_palette(int n); -BOOL palette_get_color_cycling(); -BOOL palette_set_color_cycling(BOOL enabled); #ifdef __cplusplus } diff --git a/Source/player.cpp b/Source/player.cpp index 522bd26e5..99ba2b198 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -1303,7 +1303,7 @@ void PM_ChangeOffset(int pnum) plr[pnum]._pVar6 += plr[pnum]._pxvel; plr[pnum]._pVar7 += plr[pnum]._pyvel; - if (currlevel == 0 && jogging_opt) { + if (currlevel == 0 && gbJogInTown) { plr[pnum]._pVar6 += plr[pnum]._pxvel; plr[pnum]._pVar7 += plr[pnum]._pyvel; } @@ -2154,7 +2154,7 @@ bool PM_DoWalk(int pnum, int variant) } //Play walking sound effect on certain animation frames - if (!gbIsHellfire) { + if (sgOptions.bWalkingSound) { if (plr[pnum]._pAnimFrame == 3 || (plr[pnum]._pWFrames == 8 && plr[pnum]._pAnimFrame == 7) || (plr[pnum]._pWFrames != 8 && plr[pnum]._pAnimFrame == 4)) { @@ -2163,7 +2163,7 @@ bool PM_DoWalk(int pnum, int variant) } //"Jog" in town which works by doubling movement speed and skipping every other animation frame - if (currlevel == 0 && jogging_opt) { + if (currlevel == 0 && gbJogInTown) { if (plr[pnum]._pAnimFrame % 2 == 0) { plr[pnum]._pAnimFrame++; plr[pnum]._pVar8++; diff --git a/Source/plrmsg.cpp b/Source/plrmsg.cpp index a60e4b570..0537c4ed8 100644 --- a/Source/plrmsg.cpp +++ b/Source/plrmsg.cpp @@ -10,7 +10,7 @@ DEVILUTION_BEGIN_NAMESPACE static BYTE plr_msg_slot; _plrmsg plr_msgs[PMSG_COUNT]; -/** Maps from player_num to text colour, as used in chat messages. */ +/** Maps from player_num to text color, as used in chat messages. */ const char text_color_from_player_num[MAX_PLRS + 1] = { COL_WHITE, COL_WHITE, COL_WHITE, COL_WHITE, COL_GOLD }; void plrmsg_delay(BOOL delay) diff --git a/Source/render.cpp b/Source/render.cpp index 57462e2ec..b591a5f2f 100644 --- a/Source/render.cpp +++ b/Source/render.cpp @@ -398,7 +398,7 @@ inline static void RenderLine(BYTE **dst, BYTE **src, int n, BYTE *tbl, DWORD ma assert(n != 0 && n <= sizeof(DWORD) * CHAR_BIT); mask &= DWORD(-1) << ((sizeof(DWORD) * CHAR_BIT) - n); - if (sgOptions.blendedTransparancy) { // Blended transparancy + if (sgOptions.bBlendedTransparancy) { // Blended transparancy if (light_table_index == lightmax) { // Complete darkness for (int i = 0; i < n; i++, mask <<= 1) { if (mask & 0x80000000) @@ -464,7 +464,7 @@ RenderTile(BYTE *pBuff) if (cel_transparency_active) { if (arch_draw_type == 0) { - if (sgOptions.blendedTransparancy) // Use a fully transparent mask + if (sgOptions.bBlendedTransparancy) // Use a fully transparent mask mask = &WallMask_FullyTrasparent[TILE_HEIGHT - 1]; else mask = &WallMask[TILE_HEIGHT - 1]; @@ -472,7 +472,7 @@ RenderTile(BYTE *pBuff) if (arch_draw_type == 1 && tile != RT_LTRIANGLE) { c = block_lvid[level_piece_id]; if (c == 1 || c == 3) { - if (sgOptions.blendedTransparancy) // Use a fully transparent mask + if (sgOptions.bBlendedTransparancy) // Use a fully transparent mask mask = &LeftMask_Transparent[TILE_HEIGHT - 1]; else mask = &LeftMask[TILE_HEIGHT - 1]; @@ -481,7 +481,7 @@ RenderTile(BYTE *pBuff) if (arch_draw_type == 2 && tile != RT_RTRIANGLE) { c = block_lvid[level_piece_id]; if (c == 2 || c == 3) { - if (sgOptions.blendedTransparancy) // Use a fully transparent mask + if (sgOptions.bBlendedTransparancy) // Use a fully transparent mask mask = &RightMask_Transparent[TILE_HEIGHT - 1]; else mask = &RightMask[TILE_HEIGHT - 1]; @@ -615,7 +615,7 @@ void trans_rect(int sx, int sy, int width, int height) int row, col; BYTE *pix = &gpBuffer[SCREENXY(sx, sy)]; - if (sgOptions.blendedTransparancy) { // Blended + if (sgOptions.bBlendedTransparancy) { // Blended for (row = 0; row < height; row++) { for (col = 0; col < width; col++) { *pix = paletteTransparencyLookup[0][*pix]; diff --git a/Source/tmsg.cpp b/Source/tmsg.cpp index 25e67b34b..b876ff6b4 100644 --- a/Source/tmsg.cpp +++ b/Source/tmsg.cpp @@ -38,7 +38,7 @@ void tmsg_add(Uint8 *pbMsg, Uint8 bLen) TMsg *msg = (TMsg *)DiabloAllocPtr(bLen + sizeof(*msg)); msg->hdr.pNext = nullptr; - msg->hdr.dwTime = SDL_GetTicks() + tick_delay * 10; + msg->hdr.dwTime = SDL_GetTicks() + gnTickDelay * 10; msg->hdr.bLen = bLen; memcpy(msg->body, pbMsg, bLen); for (tail = &sgpTimedMsgHead; *tail; tail = &(*tail)->hdr.pNext) { diff --git a/Source/towners.cpp b/Source/towners.cpp index 53621f516..6b3768fb0 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -483,12 +483,12 @@ void InitTowners() InitBoy(); InitCows(); if (gbIsHellfire) { - if (UseCowFarmer) { + if (gbCowQuest) { InitCowFarmer(); } else if (quests[Q_FARMER]._qactive != 10) { InitFarmer(); } - if (UseTheoQuest && plr->_pLvlVisited[17]) { + if (gbTheoQuest && plr->_pLvlVisited[17]) { InitGirl(); } } diff --git a/Source/track.cpp b/Source/track.cpp index 3ac5b9f33..73aaf05f8 100644 --- a/Source/track.cpp +++ b/Source/track.cpp @@ -28,7 +28,7 @@ void track_process() if (cursmx != plr[myplr]._ptargx || cursmy != plr[myplr]._ptargy) { Uint32 tick = SDL_GetTicks(); - if ((int)(tick - sgdwLastWalk) >= tick_delay * 6) { + if ((int)(tick - sgdwLastWalk) >= gnTickDelay * 6) { sgdwLastWalk = tick; NetSendCmdLoc(true, CMD_WALKXY, cursmx, cursmy); if (!sgbIsScrolling) @@ -45,7 +45,7 @@ void track_repeat_walk(bool rep) sgbIsWalking = rep; if (rep) { sgbIsScrolling = false; - sgdwLastWalk = SDL_GetTicks() - tick_delay; + sgdwLastWalk = SDL_GetTicks() - gnTickDelay; NetSendCmdLoc(true, CMD_WALKXY, cursmx, cursmy); } else if (sgbIsScrolling) { sgbIsScrolling = false; diff --git a/SourceX/DiabloUI/diabloui.cpp b/SourceX/DiabloUI/diabloui.cpp index 27e33fc51..c6c37ce11 100644 --- a/SourceX/DiabloUI/diabloui.cpp +++ b/SourceX/DiabloUI/diabloui.cpp @@ -884,24 +884,4 @@ void DrawMouse() DrawArt(MouseX, MouseY, &ArtCursor); } - -/** - * @brief Get int from ini, if not found the provided value will be added to the ini instead - */ -void DvlIntSetting(const char *valuename, int *value) -{ - if (!SRegLoadValue("devilutionx", valuename, 0, value)) { - SRegSaveValue("devilutionx", valuename, 0, *value); - } -} - -/** - * @brief Get string from ini, if not found the provided value will be added to the ini instead - */ -void DvlStringSetting(const char *valuename, char *string, int len) -{ - if (!getIniValue("devilutionx", valuename, string, len)) { - setIniValue("devilutionx", valuename, string); - } -} } // namespace dvl diff --git a/SourceX/DiabloUI/diabloui.h b/SourceX/DiabloUI/diabloui.h index f9c4d6f82..f7a243d55 100644 --- a/SourceX/DiabloUI/diabloui.h +++ b/SourceX/DiabloUI/diabloui.h @@ -53,8 +53,5 @@ void UiPollAndRender(); void UiRenderItems(std::vector items); void UiInitList_clear(); -void DvlIntSetting(const char *valuename, int *value); -void DvlStringSetting(const char *valuename, char *string, int len); - void mainmenu_restart_repintro(); } // namespace dvl diff --git a/SourceX/DiabloUI/selgame.cpp b/SourceX/DiabloUI/selgame.cpp index 4cda137a6..1769a1a0f 100644 --- a/SourceX/DiabloUI/selgame.cpp +++ b/SourceX/DiabloUI/selgame.cpp @@ -381,12 +381,37 @@ void selgame_Password_Init(int value) UiInitList(0, NULL, selgame_Password_Select, selgame_Password_Esc, vecSelGameDialog); } +static bool IsGameCompatible(GameData *data) +{ + if (data->versionMajor == PROJECT_VERSION_MAJOR + && data->versionMinor == PROJECT_VERSION_MINOR + && data->versionPatch == PROJECT_VERSION_PATCH + && data->programid == GAME_ID) { + return IsDifficultyAllowed(data->nDifficulty); + } + + selgame_Free(); + + if (data->programid != GAME_ID) { + UiSelOkDialog(title, "The host is running a different game then you.", false); + } else { + char msg[64]; + sprintf(msg, "Your version %s does not match the host %d.%d.%d.", PROJECT_VERSION, PROJECT_VERSION_MAJOR, PROJECT_VERSION_MINOR, PROJECT_VERSION_PATCH); + + UiSelOkDialog(title, msg, false); + } + + LoadBackgroundArt("ui_art\\selgame.pcx"); + + return false; +} + void selgame_Password_Select(int value) { if (selgame_selectedGame) { setIniValue("Phone Book", "Entry1", selgame_Ip); if (SNetJoinGame(selgame_selectedGame, selgame_Ip, selgame_Password, NULL, NULL, gdwPlayerId)) { - if (!IsDifficultyAllowed(m_client_info->initdata->bDiff)) { + if (!IsGameCompatible(m_client_info->initdata)) { selgame_GameSelection_Select(1); return; } @@ -402,11 +427,14 @@ void selgame_Password_Select(int value) return; } - _gamedata *info = m_client_info->initdata; - info->bDiff = gbDifficulty; - info->bRate = gbTickRate; + GameData *data = m_client_info->initdata; + data->nDifficulty = gbDifficulty; + data->nTickRate = sgOptions.nTickRate; + data->bJogInTown = sgOptions.bJogInTown; + data->bTheoQuest = sgOptions.bTheoQuest; + data->bCowQuest = sgOptions.bCowQuest; - if (SNetCreateGame(NULL, selgame_Password, NULL, 0, (char *)info, sizeof(_gamedata), MAX_PLRS, NULL, NULL, gdwPlayerId)) { + if (SNetCreateGame(NULL, selgame_Password, NULL, 0, (char *)data, sizeof(GameData), MAX_PLRS, NULL, NULL, gdwPlayerId)) { UiInitList_clear(); selgame_endMenu = true; } else { diff --git a/SourceX/DiabloUI/selhero.cpp b/SourceX/DiabloUI/selhero.cpp index f1f044f18..30652c5a0 100644 --- a/SourceX/DiabloUI/selhero.cpp +++ b/SourceX/DiabloUI/selhero.cpp @@ -274,10 +274,10 @@ void selhero_List_Select(int value) if (gbIsHellfire) { vecSelHeroDlgItems.push_back(new UiListItem("Monk", PC_MONK)); } - if (UseBardTest) { + if (gbBard) { vecSelHeroDlgItems.push_back(new UiListItem("Bard", PC_BARD)); } - if (UseBarbarianTest) { + if (gbBarbarian) { vecSelHeroDlgItems.push_back(new UiListItem("Barbarian", PC_BARBARIAN)); } if (vecSelHeroDlgItems.size() > 4) @@ -469,7 +469,7 @@ BOOL SelHero_GetHeroInfo(_uiheroinfo *pInfo) return true; } -static BOOL UiSelHeroDialog( +static void UiSelHeroDialog( BOOL (*fninfo)(BOOL (*fninfofunc)(_uiheroinfo *)), BOOL (*fncreate)(_uiheroinfo *), void (*fnstats)(unsigned int, _uidefaultstats *), @@ -526,10 +526,9 @@ static BOOL UiSelHeroDialog( snprintf(*name, sizeof(*name), selhero_heroInfo.name); UnloadScrollBar(); - return true; } -BOOL UiSelHeroSingDialog( +void UiSelHeroSingDialog( BOOL (*fninfo)(BOOL (*fninfofunc)(_uiheroinfo *)), BOOL (*fncreate)(_uiheroinfo *), BOOL (*fnremove)(_uiheroinfo *), @@ -539,12 +538,11 @@ BOOL UiSelHeroSingDialog( int *difficulty) { selhero_isMultiPlayer = false; - BOOL success = UiSelHeroDialog(fninfo, fncreate, fnstats, fnremove, dlgresult, name); + UiSelHeroDialog(fninfo, fncreate, fnstats, fnremove, dlgresult, name); *difficulty = gbDifficulty; - return success; } -BOOL UiSelHeroMultDialog( +void UiSelHeroMultDialog( BOOL (*fninfo)(BOOL (*fninfofunc)(_uiheroinfo *)), BOOL (*fncreate)(_uiheroinfo *), BOOL (*fnremove)(_uiheroinfo *), @@ -554,7 +552,7 @@ BOOL UiSelHeroMultDialog( char (*name)[16]) { selhero_isMultiPlayer = true; - return UiSelHeroDialog(fninfo, fncreate, fnstats, fnremove, dlgresult, name); + UiSelHeroDialog(fninfo, fncreate, fnstats, fnremove, dlgresult, name); } const char *selhero_GenerateName(uint8_t hero_class) diff --git a/SourceX/display.cpp b/SourceX/display.cpp index b572feb75..9c97c58f8 100644 --- a/SourceX/display.cpp +++ b/SourceX/display.cpp @@ -4,11 +4,10 @@ #include "controls/controller.h" #include "controls/devices/game_controller.h" #include "controls/devices/joystick.h" - -#ifdef __vita__ -#include -#endif - + +#ifdef __vita__ +#include +#endif #ifdef USE_SDL1 #ifndef SDL1_VIDEO_MODE_BPP @@ -17,19 +16,6 @@ #ifndef SDL1_VIDEO_MODE_FLAGS #define SDL1_VIDEO_MODE_FLAGS SDL_SWSURFACE #endif -#ifdef SDL1_VIDEO_MODE_WIDTH -#define DEFAULT_WIDTH SDL1_VIDEO_MODE_WIDTH -#endif -#ifdef SDL1_VIDEO_MODE_HEIGHT -#define DEFAULT_HEIGHT SDL1_VIDEO_MODE_HEIGHT -#endif -#endif - -#ifndef DEFAULT_WIDTH -#define DEFAULT_WIDTH 640 -#endif -#ifndef DEFAULT_HEIGHT -#define DEFAULT_HEIGHT 480 #endif namespace dvl { @@ -42,7 +28,8 @@ int viewportHeight; int borderRight; #ifdef USE_SDL1 -void SetVideoMode(int width, int height, int bpp, uint32_t flags) { +void SetVideoMode(int width, int height, int bpp, uint32_t flags) +{ SDL_Log("Setting video mode %dx%d bpp=%u flags=0x%08X", width, height, bpp, flags); SDL_SetVideoMode(width, height, bpp, flags); const SDL_VideoInfo ¤t = *SDL_GetVideoInfo(); @@ -51,7 +38,8 @@ void SetVideoMode(int width, int height, int bpp, uint32_t flags) { ghMainWnd = SDL_GetVideoSurface(); } -void SetVideoModeToPrimary(bool fullscreen, int width, int height) { +void SetVideoModeToPrimary(bool fullscreen, int width, int height) +{ int flags = SDL1_VIDEO_MODE_FLAGS | SDL_HWPALETTE; if (fullscreen) flags |= SDL_FULLSCREEN; @@ -59,11 +47,16 @@ void SetVideoModeToPrimary(bool fullscreen, int width, int height) { if (OutputRequiresScaling()) SDL_Log("Using software scaling"); } +#endif -bool IsFullScreen() { +bool IsFullScreen() +{ +#ifdef USE_SDL1 return (SDL_GetVideoSurface()->flags & SDL_FULLSCREEN) != 0; -} +#else + return (SDL_GetWindowFlags(ghMainWnd) & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP)) != 0; #endif +} void AdjustToScreenGeometry(int width, int height) { @@ -83,7 +76,7 @@ void AdjustToScreenGeometry(int width, int height) } } -void CalculatePreferdWindowSize(int &width, int &height, bool useIntegerScaling) +void CalculatePreferdWindowSize(int &width, int &height) { #ifdef USE_SDL1 const SDL_VideoInfo &best = *SDL_GetVideoInfo(); @@ -95,7 +88,7 @@ void CalculatePreferdWindowSize(int &width, int &height, bool useIntegerScaling) ErrSdl(); } - if (!useIntegerScaling) { + if (!sgOptions.bIntegerScaling) { float wFactor = (float)mode.w / width; float hFactor = (float)mode.h / height; @@ -126,7 +119,7 @@ bool SpawnWindow(const char *lpWindowName) scePowerSetArmClockFrequency(444); #endif -#if SDL_VERSION_ATLEAST(2,0,6) +#if SDL_VERSION_ATLEAST(2, 0, 6) SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0"); #endif @@ -141,15 +134,14 @@ bool SpawnWindow(const char *lpWindowName) #ifndef USE_SDL1 char mapping[1024]; memset(mapping, 0, 1024); - getIniValue("controls","sdl2_controller_mapping", mapping, 1024); + getIniValue("controls", "sdl2_controller_mapping", mapping, 1024); if (mapping[0] != '\0') { SDL_GameControllerAddMapping(mapping); } #endif - - dpad_hotkeys = getIniBool("controls","dpad_hotkeys"); - switch_potions_and_clicks = getIniBool("controls","switch_potions_and_clicks"); - + + dpad_hotkeys = getIniBool("controls", "dpad_hotkeys"); + switch_potions_and_clicks = getIniBool("controls", "switch_potions_and_clicks"); #ifdef USE_SDL1 SDL_EnableUNICODE(1); @@ -164,61 +156,34 @@ bool SpawnWindow(const char *lpWindowName) #endif #endif - int width = DEFAULT_WIDTH; - int height = DEFAULT_HEIGHT; -#ifndef __vita__ - DvlIntSetting("width", &width); - DvlIntSetting("height", &height); -#endif - BOOL integerScalingEnabled = false; - DvlIntSetting("integer scaling", &integerScalingEnabled); + int width = sgOptions.nWidth; + int height = sgOptions.nHeight; - if (fullscreen) - DvlIntSetting("fullscreen", &fullscreen); - - int grabInput = 0; - DvlIntSetting("grab input", &grabInput); - -#ifdef __vita__ - BOOL upscale = false; -#else - BOOL upscale = true; - DvlIntSetting("upscale", &upscale); -#endif - BOOL oar = false; - DvlIntSetting("original aspect ratio", &oar); - - if (upscale && !oar) { - CalculatePreferdWindowSize(width, height, integerScalingEnabled); + if (sgOptions.bUpscale && sgOptions.bFitToScreen) { + CalculatePreferdWindowSize(width, height); } AdjustToScreenGeometry(width, height); #ifdef USE_SDL1 - if (upscale) { - upscale = false; - SDL_Log("upscaling not supported with USE_SDL1"); - } SDL_WM_SetCaption(lpWindowName, WINDOW_ICON_NAME); - SetVideoModeToPrimary(fullscreen, width, height); - if (grabInput) + SetVideoModeToPrimary(!gbForceWindowed && sgOptions.bFullscreen, width, height); + if (sgOptions.bGrabInput) SDL_WM_GrabInput(SDL_GRAB_ON); atexit(SDL_VideoQuit); // Without this video mode is not restored after fullscreen. #else int flags = 0; - if (upscale) { - if (fullscreen) { + if (sgOptions.bUpscale) { + if (!gbForceWindowed && sgOptions.bFullscreen) { flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; } flags |= SDL_WINDOW_RESIZABLE; - char scaleQuality[2] = "2"; - DvlStringSetting("scaling quality", scaleQuality, 2); - SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scaleQuality); - } else if (fullscreen) { + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, sgOptions.szScaleQuality); + } else if (!gbForceWindowed && sgOptions.bFullscreen) { flags |= SDL_WINDOW_FULLSCREEN; } - if (grabInput) { + if (sgOptions.bGrabInput) { flags |= SDL_WINDOW_INPUT_GRABBED; } @@ -238,13 +203,11 @@ bool SpawnWindow(const char *lpWindowName) #endif refreshDelay = 1000000 / refreshRate; - if (upscale) { + if (sgOptions.bUpscale) { #ifndef USE_SDL1 Uint32 rendererFlags = SDL_RENDERER_ACCELERATED; - vsyncEnabled = 1; - DvlIntSetting("vsync", &vsyncEnabled); - if (vsyncEnabled) { + if (sgOptions.bVSync) { rendererFlags |= SDL_RENDERER_PRESENTVSYNC; } @@ -258,7 +221,7 @@ bool SpawnWindow(const char *lpWindowName) ErrSdl(); } - if (integerScalingEnabled && SDL_RenderSetIntegerScale(renderer, SDL_TRUE) < 0) { + if (sgOptions.bIntegerScaling && SDL_RenderSetIntegerScale(renderer, SDL_TRUE) < 0) { ErrSdl(); } @@ -319,7 +282,7 @@ SDL_Surface *CreateScaledSurface(SDL_Surface *src) SDL_Rect stretched_rect = { 0, 0, static_cast(src->w), static_cast(src->h) }; ScaleOutputRect(&stretched_rect); SDL_Surface *stretched = SDL_CreateRGBSurface( - SDL_SWSURFACE, stretched_rect.w, stretched_rect.h, src->format->BitsPerPixel, + SDL_SWSURFACE, stretched_rect.w, stretched_rect.h, src->format->BitsPerPixel, src->format->Rmask, src->format->Gmask, src->format->Bmask, src->format->Amask); if (SDL_HasColorKey(src)) { SDL_SetColorKey(stretched, SDL_SRCCOLORKEY, src->format->colorkey); diff --git a/SourceX/display.h b/SourceX/display.h index 345e8309f..298563941 100644 --- a/SourceX/display.h +++ b/SourceX/display.h @@ -20,10 +20,11 @@ extern unsigned int pal_surface_palette_version; #ifdef USE_SDL1 void SetVideoMode(int width, int height, int bpp, uint32_t flags); -bool IsFullScreen(); void SetVideoModeToPrimary(bool fullscreen, int width, int height); #endif +bool IsFullScreen(); + // Returns: // SDL1: Video surface. // SDL2, no upscale: Window surface. diff --git a/SourceX/dvlnet/packet.cpp b/SourceX/dvlnet/packet.cpp index 8078e6289..1521f3087 100644 --- a/SourceX/dvlnet/packet.cpp +++ b/SourceX/dvlnet/packet.cpp @@ -50,9 +50,11 @@ wrong_packet_type_exception::wrong_packet_type_exception(std::initializer_list

expected_types, std::uint8_t actual_type) { +void CheckPacketTypeOneOf(std::initializer_list expected_types, std::uint8_t actual_type) +{ for (std::uint8_t packet_type : expected_types) - if (actual_type == packet_type) return; + if (actual_type == packet_type) + return; throw wrong_packet_type_exception(std::move(expected_types), actual_type); } @@ -90,7 +92,7 @@ const buffer_t &packet::message() { if (!have_decrypted) ABORT(); - CheckPacketTypeOneOf({PT_MESSAGE}, m_type); + CheckPacketTypeOneOf({ PT_MESSAGE }, m_type); return m_message; } @@ -98,7 +100,7 @@ turn_t packet::turn() { if (!have_decrypted) ABORT(); - CheckPacketTypeOneOf({PT_TURN}, m_type); + CheckPacketTypeOneOf({ PT_TURN }, m_type); return m_turn; } @@ -106,7 +108,7 @@ cookie_t packet::cookie() { if (!have_decrypted) ABORT(); - CheckPacketTypeOneOf({PT_JOIN_REQUEST, PT_JOIN_ACCEPT}, m_type); + CheckPacketTypeOneOf({ PT_JOIN_REQUEST, PT_JOIN_ACCEPT }, m_type); return m_cookie; } @@ -114,7 +116,7 @@ plr_t packet::newplr() { if (!have_decrypted) ABORT(); - CheckPacketTypeOneOf({PT_JOIN_ACCEPT, PT_CONNECT, PT_DISCONNECT}, m_type); + CheckPacketTypeOneOf({ PT_JOIN_ACCEPT, PT_CONNECT, PT_DISCONNECT }, m_type); return m_newplr; } @@ -122,7 +124,7 @@ const buffer_t &packet::info() { if (!have_decrypted) ABORT(); - CheckPacketTypeOneOf({PT_JOIN_REQUEST, PT_JOIN_ACCEPT}, m_type); + CheckPacketTypeOneOf({ PT_JOIN_REQUEST, PT_JOIN_ACCEPT }, m_type); return m_info; } @@ -130,7 +132,7 @@ leaveinfo_t packet::leaveinfo() { if (!have_decrypted) ABORT(); - CheckPacketTypeOneOf({PT_DISCONNECT}, m_type); + CheckPacketTypeOneOf({ PT_DISCONNECT }, m_type); return m_leaveinfo; } @@ -151,20 +153,20 @@ void packet_in::decrypt() #ifndef NONET if (!disable_encryption) { if (encrypted_buffer.size() < crypto_secretbox_NONCEBYTES - + crypto_secretbox_MACBYTES - + sizeof(packet_type) + 2 * sizeof(plr_t)) + + crypto_secretbox_MACBYTES + + sizeof(packet_type) + 2 * sizeof(plr_t)) throw packet_exception(); auto pktlen = (encrypted_buffer.size() - - crypto_secretbox_NONCEBYTES - - crypto_secretbox_MACBYTES); + - crypto_secretbox_NONCEBYTES + - crypto_secretbox_MACBYTES); decrypted_buffer.resize(pktlen); if (crypto_secretbox_open_easy(decrypted_buffer.data(), - encrypted_buffer.data() - + crypto_secretbox_NONCEBYTES, - encrypted_buffer.size() - - crypto_secretbox_NONCEBYTES, - encrypted_buffer.data(), - key.data())) + encrypted_buffer.data() + + crypto_secretbox_NONCEBYTES, + encrypted_buffer.size() + - crypto_secretbox_NONCEBYTES, + encrypted_buffer.data(), + key.data())) throw packet_exception(); } else #endif @@ -192,17 +194,17 @@ void packet_out::encrypt() if (!disable_encryption) { auto len_cleartext = encrypted_buffer.size(); encrypted_buffer.insert(encrypted_buffer.begin(), - crypto_secretbox_NONCEBYTES, 0); + crypto_secretbox_NONCEBYTES, 0); encrypted_buffer.insert(encrypted_buffer.end(), - crypto_secretbox_MACBYTES, 0); + crypto_secretbox_MACBYTES, 0); randombytes_buf(encrypted_buffer.data(), crypto_secretbox_NONCEBYTES); if (crypto_secretbox_easy(encrypted_buffer.data() - + crypto_secretbox_NONCEBYTES, - encrypted_buffer.data() - + crypto_secretbox_NONCEBYTES, - len_cleartext, - encrypted_buffer.data(), - key.data())) + + crypto_secretbox_NONCEBYTES, + encrypted_buffer.data() + + crypto_secretbox_NONCEBYTES, + len_cleartext, + encrypted_buffer.data(), + key.data())) ABORT(); } #endif @@ -216,14 +218,14 @@ packet_factory::packet_factory(std::string pw) ABORT(); pw.resize(std::min(pw.size(), crypto_pwhash_argon2id_PASSWD_MAX)); pw.resize(std::max(pw.size(), crypto_pwhash_argon2id_PASSWD_MIN), 0); - std::string salt("devilution-salt 1.1.0"); + std::string salt("W9bE9dQgVaeybwr2"); salt.resize(crypto_pwhash_argon2id_SALTBYTES, 0); if (crypto_pwhash(key.data(), crypto_secretbox_KEYBYTES, - pw.data(), pw.size(), - reinterpret_cast(salt.data()), - crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE, - crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE, - crypto_pwhash_ALG_ARGON2ID13)) + pw.data(), pw.size(), + reinterpret_cast(salt.data()), + crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE, + crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE, + crypto_pwhash_ALG_ARGON2ID13)) ABORT(); #endif } diff --git a/SourceX/dx.cpp b/SourceX/dx.cpp index 219c0baec..54757a60e 100644 --- a/SourceX/dx.cpp +++ b/SourceX/dx.cpp @@ -152,20 +152,23 @@ void dx_cleanup() void dx_reinit() { #ifdef USE_SDL1 - ghMainWnd = SDL_SetVideoMode(0, 0, 0, ghMainWnd->flags ^ SDL_FULLSCREEN); + Uint32 flags = ghMainWnd->flags ^ SDL_FULLSCREEN; + if (!IsFullScreen()) { + flags |= SDL_FULLSCREEN; + } + ghMainWnd = SDL_SetVideoMode(0, 0, 0, flags); if (ghMainWnd == NULL) { ErrSdl(); } #else Uint32 flags = 0; - if (!fullscreen) { + if (!IsFullScreen()) { flags = renderer ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_FULLSCREEN; } if (SDL_SetWindowFullscreen(ghMainWnd, flags)) { ErrSdl(); } #endif - fullscreen = !fullscreen; force_redraw = 255; } @@ -187,8 +190,8 @@ void Blit(SDL_Surface *src, SDL_Rect *src_rect, SDL_Rect *dst_rect) SDL_Surface *dst = GetOutputSurface(); #ifndef USE_SDL1 if (SDL_BlitSurface(src, src_rect, dst, dst_rect) < 0) - ErrSdl(); - return; + ErrSdl(); + return; #else if (!OutputRequiresScaling()) { if (SDL_BlitSurface(src, src_rect, dst, dst_rect) < 0) @@ -270,9 +273,9 @@ void RenderPresent() } // Clear buffer to avoid artifacts in case the window was resized -#ifndef __vita__ - // There's no window resizing on vita, so texture always properly overwrites display area. - // Thus, there's no need to clear the screen and unnecessary modify sdl render context state. +#ifndef __vita__ + // There's no window resizing on vita, so texture always properly overwrites display area. + // Thus, there's no need to clear the screen and unnecessary modify sdl render context state. if (SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255) <= -1) { // TODO only do this if window was resized ErrSdl(); } @@ -280,7 +283,7 @@ void RenderPresent() if (SDL_RenderClear(renderer) <= -1) { ErrSdl(); } -#endif +#endif if (SDL_RenderCopy(renderer, texture, NULL, NULL) <= -1) { ErrSdl(); } diff --git a/SourceX/sound.cpp b/SourceX/sound.cpp index e8172e7e6..9ad9cf289 100644 --- a/SourceX/sound.cpp +++ b/SourceX/sound.cpp @@ -12,8 +12,6 @@ namespace dvl { BOOLEAN gbSndInited; -int sglMusicVolume; -int sglSoundVolume; /** Specifies whether background music is enabled. */ HANDLE sghMusic; @@ -51,25 +49,14 @@ const char *const sgszMusicTracks[NUM_MUSIC] = { "Music\\Dintro.wav", }; -static void snd_get_volume(const char *value_name, int *value) +static int CapVolume(int volume) { - int v = *value; - if (!SRegLoadValue("Diablo", value_name, 0, &v)) { - v = VOLUME_MAX; + if (volume < VOLUME_MIN) { + volume = VOLUME_MIN; + } else if (volume > VOLUME_MAX) { + volume = VOLUME_MAX; } - *value = v; - - if (*value < VOLUME_MIN) { - *value = VOLUME_MIN; - } else if (*value > VOLUME_MAX) { - *value = VOLUME_MAX; - } - *value -= *value % 100; -} - -static void snd_set_volume(const char *key, int value) -{ - SRegSaveValue("Diablo", key, 0, value); + return volume - volume % 100; } BOOL snd_playing(TSnd *pSnd) @@ -99,12 +86,7 @@ void snd_play_snd(TSnd *pSnd, int lVolume, int lPan) return; } - lVolume += sglSoundVolume; - if (lVolume < VOLUME_MIN) { - lVolume = VOLUME_MIN; - } else if (lVolume > VOLUME_MAX) { - lVolume = VOLUME_MAX; - } + lVolume = CapVolume(lVolume + sgOptions.nSoundVolume); DSB->Play(lVolume, lPan); pSnd->start_tc = tc; } @@ -154,12 +136,12 @@ void sound_file_cleanup(TSnd *sound_file) void snd_init() { - snd_get_volume("Sound Volume", &sglSoundVolume); - gbSoundOn = sglSoundVolume > VOLUME_MIN; + sgOptions.nSoundVolume = CapVolume(sgOptions.nSoundVolume); + gbSoundOn = sgOptions.nSoundVolume > VOLUME_MIN; sgbSaveSoundOn = gbSoundOn; - snd_get_volume("Music Volume", &sglMusicVolume); - gbMusicOn = sglMusicVolume > VOLUME_MIN; + sgOptions.nMusicVolume = CapVolume(sgOptions.nMusicVolume); + gbMusicOn = sgOptions.nMusicVolume > VOLUME_MIN; int result = Mix_OpenAudio(22050, AUDIO_S16LSB, 2, 1024); if (result < 0) { @@ -171,15 +153,6 @@ void snd_init() gbSndInited = true; } -void sound_cleanup() -{ - if (gbSndInited) { - gbSndInited = false; - snd_set_volume("Sound Volume", sglSoundVolume); - snd_set_volume("Music Volume", sglMusicVolume); - } -} - void music_stop() { if (sghMusic) { @@ -219,7 +192,7 @@ void music_start(int nTrack) ErrSdl(); } music = Mix_LoadMUSType_RW(musicRw, MUS_NONE, 1); - Mix_VolumeMusic(MIX_MAX_VOLUME - MIX_MAX_VOLUME * sglMusicVolume / VOLUME_MIN); + Mix_VolumeMusic(MIX_MAX_VOLUME - MIX_MAX_VOLUME * sgOptions.nMusicVolume / VOLUME_MIN); Mix_PlayMusic(music, -1); sgnMusicTrack = nTrack; @@ -239,24 +212,24 @@ void sound_disable_music(BOOL disable) int sound_get_or_set_music_volume(int volume) { if (volume == 1) - return sglMusicVolume; + return sgOptions.nMusicVolume; - sglMusicVolume = volume; + sgOptions.nMusicVolume = volume; if (sghMusic) SFileDdaSetVolume(sghMusic, volume, 0); - return sglMusicVolume; + return sgOptions.nMusicVolume; } int sound_get_or_set_sound_volume(int volume) { if (volume == 1) - return sglSoundVolume; + return sgOptions.nSoundVolume; - sglSoundVolume = volume; + sgOptions.nSoundVolume = volume; - return sglSoundVolume; + return sgOptions.nSoundVolume; } } // namespace dvl diff --git a/SourceX/storm/storm.cpp b/SourceX/storm/storm.cpp index 29b158e7a..13c8bf1ed 100644 --- a/SourceX/storm/storm.cpp +++ b/SourceX/storm/storm.cpp @@ -274,8 +274,10 @@ bool getIniBool(const char *sectionName, const char *keyName, bool defaultValue) return strtol(string, NULL, 10) != 0; } -bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, int *dataSize) +bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString) { + strncpy(string, defaultString, stringSize); + radon::Section *section = getIni().getSection(sectionName); if (!section) return false; @@ -285,8 +287,6 @@ bool getIniValue(const char *sectionName, const char *keyName, char *string, int return false; std::string value = key->getStringValue(); - if (dataSize) - *dataSize = value.length(); if (string != NULL) strncpy(string, value.c_str(), stringSize); @@ -316,24 +316,21 @@ void setIniValue(const char *sectionName, const char *keyName, const char *value ini.saveToFile(); } -BOOL SRegLoadValue(const char *keyname, const char *valuename, BYTE flags, int *value) +int getIniInt(const char *keyname, const char *valuename, int defaultValue) { char string[10]; - if (getIniValue(keyname, valuename, string, 10)) { - *value = strtol(string, NULL, 10); - return true; + if (!getIniValue(keyname, valuename, string, sizeof(string))) { + return defaultValue; } - return false; + return strtol(string, NULL, sizeof(string)); } -BOOL SRegSaveValue(const char *keyname, const char *valuename, BYTE flags, DWORD result) +void setIniInt(const char *keyname, const char *valuename, int value) { char str[10]; - sprintf(str, "%d", result); + sprintf(str, "%d", value); setIniValue(keyname, valuename, str); - - return true; } double SVidFrameEnd; diff --git a/SourceX/storm/storm_net.cpp b/SourceX/storm/storm_net.cpp index dfc644e64..062b4ff13 100644 --- a/SourceX/storm/storm_net.cpp +++ b/SourceX/storm/storm_net.cpp @@ -106,20 +106,18 @@ int SNetInitializeProvider(unsigned long provider, struct _SNETPROGRAMDATA *clie * @brief Called by engine for single, called by ui for multi */ BOOL SNetCreateGame(const char *pszGameName, const char *pszGamePassword, const char *pszGameStatString, - DWORD dwGameType, char *GameTemplateData, int GameTemplateSize, int playerCount, + DWORD dwGameType, char *GameTemplateData, int GameTemplateSize, int playerCount, const char *creatorName, const char *a11, int *playerID) { - if (GameTemplateSize != sizeof(_gamedata)) + if (GameTemplateSize != sizeof(GameData)) ABORT(); net::buffer_t game_init_info(GameTemplateData, GameTemplateData + GameTemplateSize); dvlnet_inst->setup_gameinfo(std::move(game_init_info)); - char addrstr[129] = "0.0.0.0"; - getIniValue("dvlnet", "bindaddr", addrstr, 128); - strncpy(gpszGameName, addrstr, sizeof(gpszGameName) - 1); + strncpy(gpszGameName, sgOptions.szBindAddress, sizeof(gpszGameName) - 1); if (pszGamePassword) strncpy(gpszGamePassword, pszGamePassword, sizeof(gpszGamePassword) - 1); - *playerID = dvlnet_inst->create(addrstr, pszGamePassword); + *playerID = dvlnet_inst->create(sgOptions.szBindAddress, pszGamePassword); return *playerID != -1; } @@ -162,4 +160,4 @@ BOOL SNetPerformUpgrade(DWORD *upgradestatus) UNIMPLEMENTED(); } -} +} // namespace dvl diff --git a/defs.h b/defs.h index 5cdd89015..73765e92b 100644 --- a/defs.h +++ b/defs.h @@ -93,7 +93,6 @@ #define PMSG_COUNT 8 #define GAME_ID (gbIsHellfire ? (gbIsSpawn ? 'HSHR' : 'HRTL') : (gbIsSpawn ? 'DSHR' : 'DRTL')) -#define GAME_VERSION 50 // Diablo uses a 256 color palette // Entry 0-127 (0x00-0x7F) are level specific diff --git a/structs.h b/structs.h index 41a9545cf..7c2e8548d 100644 --- a/structs.h +++ b/structs.h @@ -438,7 +438,7 @@ typedef struct CMonster { unsigned char mAFNum; char mdeadval; const MonsterData *MData; - // A TRN file contains a sequence of colour transitions, represented + // A TRN file contains a sequence of color transitions, represented // as indexes into a palette. (a 256 byte array of palette indices) BYTE *trans_file; } CMonster; @@ -701,12 +701,6 @@ typedef struct InvXY { // TPDEF PTR FCN VOID PLAYSND -typedef struct _gamedata { - int dwSeed; - BYTE bDiff; - BYTE bRate; -} _gamedata; - typedef struct _uidefaultstats { WORD strength; WORD magic; @@ -785,22 +779,6 @@ typedef struct _SNETPLAYERDATA { char *playerdescription; } _SNETPLAYERDATA; -typedef struct _SNETPROGRAMDATA { - int size; - const char *programname; - const char *programdescription; - int programid; - int versionid; - int maxplayers; - _gamedata *initdata; - int initdatabytes; - int optcategorybits; - char *cdkey; - char *registereduser; - int spawned; - int lcid; -} _SNETPROGRAMDATA; - typedef struct _SNETVERSIONDATA { int size; const char *versionstring;