diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c06d773e..3059ca84e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,6 +163,11 @@ set(STUB_SOURCES 3rdParty/libsmacker/smk_hufftree.c 3rdParty/libsmacker/smacker.c + 3rdParty/Radon/Radon/source/File.cpp + 3rdParty/Radon/Radon/source/Key.cpp + 3rdParty/Radon/Radon/source/Named.cpp + 3rdParty/Radon/Radon/source/Section.cpp + 3rdParty/StormLib/src/FileStream.cpp 3rdParty/StormLib/src/SBaseCommon.cpp 3rdParty/StormLib/src/SBaseFileTable.cpp diff --git a/Stub/dx.cpp b/Stub/dx.cpp index a2e6dada1..0a6742a33 100644 --- a/Stub/dx.cpp +++ b/Stub/dx.cpp @@ -361,6 +361,7 @@ void __fastcall dx_init(HWND hWnd) lpDDSPrimary = &stub_surface; lpDDSBackBuf = &stub_surface; lpDDPalette = &stub_palette; + LoadGamma(); } void __cdecl dx_cleanup() diff --git a/Stub/miniwin.cpp b/Stub/miniwin.cpp index 45aee0a0a..1f03c4a8c 100644 --- a/Stub/miniwin.cpp +++ b/Stub/miniwin.cpp @@ -107,7 +107,7 @@ DWORD WINAPI GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize) SDL_free(name); int len = strlen(lpFilename); - lpFilename[len-1] = '\\'; + lpFilename[len - 1] = '\\'; return len; } @@ -290,11 +290,10 @@ DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId) DWORD WINAPI GetPrivateProfileStringA(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName) { - DUMMY(); - - strncpy(lpReturnedString, lpDefault, nSize); - - return strlen(lpReturnedString); + if (!SRegLoadString(lpAppName, lpKeyName, 0, lpReturnedString, nSize)) { + strncpy(lpReturnedString, lpDefault, nSize); + SRegSaveString(lpAppName, lpKeyName, 0, lpReturnedString); + } } int MessageBoxA(HWND hWnd, const char *Text, const char *Title, UINT Flags) diff --git a/Stub/miniwin.h b/Stub/miniwin.h index 87974589f..4a6a5dbc3 100644 --- a/Stub/miniwin.h +++ b/Stub/miniwin.h @@ -41,8 +41,6 @@ #define VOID void -extern void *prealpha_mpq; - typedef char CHAR; typedef uint16_t SHORT; typedef int32_t LONG; diff --git a/Stub/storm.cpp b/Stub/storm.cpp index 4c1429eb1..d626dfa03 100644 --- a/Stub/storm.cpp +++ b/Stub/storm.cpp @@ -1,7 +1,20 @@ +#include "../3rdParty/Radon/Radon/include/Radon.hpp" #include "../types.h" DWORD nLastError = 0; +std::string getIniPath() +{ + char path[280]; + int len = GetModuleFileName(ghInst, path, 260); + path[len - 1] = '/'; + strcat(path, "diablo.ini"); + + return path; +} + +radon::File ini(getIniPath()); + // BOOL STORMAPI SFileCloseArchive(HANDLE hArchive) // { // UNIMPLEMENTED(); @@ -254,37 +267,87 @@ void *STORMAPI SMemReAlloc(void *location, unsigned int amount, char *logfilenam UNIMPLEMENTED(); } -BOOL STORMAPI SRegLoadData(const char *keyname, const char *valuename, int size, LPBYTE lpData, BYTE flags, - LPDWORD lpcbData) +bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, int *dataSize = NULL) { - DUMMY(); - return 0; + radon::Section* section = ini.getSection(sectionName); + if (!section) + return false; + + radon::Key *key = section->getKey(keyName); + if (!key) + return false; + + std::string value = key->getStringValue(); + if (dataSize) + *dataSize = value.length(); + + if (string) + strncpy(string, value.c_str(), stringSize); + + return true; +} + +void setIniValue(const char *sectionName, const char *keyName, char *value, int len = 0) +{ + radon::Section* section = ini.getSection(sectionName); + if (!section) { + ini.addSection(sectionName); + section = ini.getSection(sectionName); + } + + std::string stringValue(value, len ?: strlen(value)); + + radon::Key *key = section->getKey(keyName); + if (!key) { + section->addKey(radon::Key(keyName, stringValue)); + } else { + key->setValue(stringValue); + } + + ini.saveToFile(); +} + +BOOL STORMAPI SRegLoadData(const char *keyname, const char *valuename, int size, LPBYTE lpData, BYTE flags, LPDWORD lpcbData) +{ + return getIniValue(keyname, valuename, lpData, size, lpcbData); } BOOL STORMAPI SRegLoadString(const char *keyname, const char *valuename, BYTE flags, char *buffer, unsigned int buffersize) { - UNIMPLEMENTED(); + return getIniValue(keyname, valuename, buffer, buffersize); } BOOL STORMAPI SRegLoadValue(const char *keyname, const char *valuename, BYTE flags, int *value) { - DUMMY_PRINT("key: %s value: %s", keyname, valuename); + char string[10]; + if (getIniValue(keyname, valuename, string, 10)) { + *value = strtol(string, NULL, 10); + return TRUE; + } + return FALSE; } BOOL STORMAPI SRegSaveData(const char *keyname, const char *valuename, int size, BYTE *lpData, DWORD cbData) { - UNIMPLEMENTED(); + setIniValue(keyname, valuename, (char *)lpData, cbData); + + return TRUE; } BOOL STORMAPI SRegSaveString(const char *keyname, const char *valuename, BYTE flags, char *string) { - UNIMPLEMENTED(); + setIniValue(keyname, valuename, string); + + return TRUE; } BOOL STORMAPI SRegSaveValue(const char *keyname, const char *valuename, BYTE flags, DWORD result) { - DUMMY_PRINT("key: %s value: %s", keyname, valuename); + char str[10]; + sprintf(str, "%d", result); + setIniValue(keyname, valuename, str); + return TRUE; }