Browse Source

Revamp ini options and sync in multiplayer

[NetMsg]
F12=Now you DIE!
F11=Here's something for you.
F10=Follow me.
F9=I need help! Come Here!

[Game]
Speed=50
Fast Walk=1
Grab Input=0
Theo Quest=0
Cow Quest=0

[Audio]
Sound Volume=0
Music Volume=0
Walking Sound=1

[Graphics]
Fullscreen=1
Fit to Screen=1
Scaling Quality=2
Integer Scaling=0
Vertical Sync=1
Blended Transparency=1
Gamma Correction=100
Color Cycling=1

[Diablo]
Intro=0

[Hellfire]
Intro=0
SItem=

[Phone Book]
Entry1=127.0.0.1

[Network]
Bind Address=0.0.0.0
pull/1080/head
Anders Jenbo 5 years ago
parent
commit
39999791b3
  1. 149
      3rdParty/Storm/Source/storm.h
  2. 4
      CMake/ctr/n3ds_defs.cmake
  3. 4
      CMake/gkd350h_defs.cmake
  4. 7
      CMakeLists.txt
  5. 4
      DiabloUI/diabloui.h
  6. 107
      Source/diablo.cpp
  7. 49
      Source/diablo.h
  8. 4
      Source/engine.cpp
  9. 45
      Source/gamemenu.cpp
  10. 3
      Source/gamemenu.h
  11. 4
      Source/init.cpp
  12. 2
      Source/interfac.cpp
  13. 14
      Source/items.cpp
  14. 48
      Source/mainmenu.cpp
  15. 6
      Source/monster.cpp
  16. 50
      Source/multi.cpp
  17. 20
      Source/multi.h
  18. 10
      Source/nthread.cpp
  19. 79
      Source/palette.cpp
  20. 2
      Source/palette.h
  21. 6
      Source/player.cpp
  22. 2
      Source/plrmsg.cpp
  23. 10
      Source/render.cpp
  24. 2
      Source/tmsg.cpp
  25. 4
      Source/towners.cpp
  26. 4
      Source/track.cpp
  27. 20
      SourceX/DiabloUI/diabloui.cpp
  28. 3
      SourceX/DiabloUI/diabloui.h
  29. 38
      SourceX/DiabloUI/selgame.cpp
  30. 16
      SourceX/DiabloUI/selhero.cpp
  31. 111
      SourceX/display.cpp
  32. 3
      SourceX/display.h
  33. 66
      SourceX/dvlnet/packet.cpp
  34. 21
      SourceX/dx.cpp
  35. 63
      SourceX/sound.cpp
  36. 21
      SourceX/storm/storm.cpp
  37. 12
      SourceX/storm/storm_net.cpp
  38. 1
      defs.h
  39. 24
      structs.h

149
3rdParty/Storm/Source/storm.h vendored

@ -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

4
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)

4
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)

7
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

4
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);

107
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) {

49
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;

4
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);
}

45
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

3
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();

4
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);

2
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 } };

14
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);

48
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);

6
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)

50
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);
}

20
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];

10
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;
}

79
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

2
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
}

6
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++;

2
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)

10
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];

2
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) {

4
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();
}
}

4
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;

20
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

3
SourceX/DiabloUI/diabloui.h

@ -53,8 +53,5 @@ void UiPollAndRender();
void UiRenderItems(std::vector<UiItemBase *> 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

38
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 {

16
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)

111
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 <psp2/power.h>
#endif
#ifdef __vita__
#include <psp2/power.h>
#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 &current = *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<Uint16>(src->w), static_cast<Uint16>(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);

3
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.

66
SourceX/dvlnet/packet.cpp

@ -50,9 +50,11 @@ wrong_packet_type_exception::wrong_packet_type_exception(std::initializer_list<p
namespace {
void CheckPacketTypeOneOf(std::initializer_list<packet_type> expected_types, std::uint8_t actual_type) {
void CheckPacketTypeOneOf(std::initializer_list<packet_type> 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<std::size_t>(pw.size(), crypto_pwhash_argon2id_PASSWD_MAX));
pw.resize(std::max<std::size_t>(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<const unsigned char *>(salt.data()),
crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE,
crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE,
crypto_pwhash_ALG_ARGON2ID13))
pw.data(), pw.size(),
reinterpret_cast<const unsigned char *>(salt.data()),
crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE,
crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE,
crypto_pwhash_ALG_ARGON2ID13))
ABORT();
#endif
}

21
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();
}

63
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

21
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;

12
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

1
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

24
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;

Loading…
Cancel
Save