diff --git a/.vscode/settings.json b/.vscode/settings.json index 48e724a2e..2885adb66 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -37,6 +37,11 @@ "cinttypes": "cpp", "type_traits": "cpp", "tuple": "cpp", - "algorithm": "cpp" + "algorithm": "cpp", + "cassert": "cpp", + "map": "cpp", + "set": "cpp", + "locale": "cpp", + "*.ipp": "cpp" } } \ No newline at end of file diff --git a/3rdParty/Storm/Source/storm.cpp b/3rdParty/Storm/Source/storm.cpp index 2dfa0f5ce..e08960ad0 100644 --- a/3rdParty/Storm/Source/storm.cpp +++ b/3rdParty/Storm/Source/storm.cpp @@ -73,7 +73,7 @@ BOOL STORMAPI SFileDdaInitialize(HANDLE directsound) rBool; BOOL STORMAPI SFileDdaSetVolume(HANDLE directsound, signed int bigvolume, signed int volume) rBool; BOOL STORMAPI SFileDestroy() rBool; -BOOL STORMAPI SFileGetFileArchive(HANDLE hFile, HANDLE archive) rBool; +BOOL STORMAPI SFileGetFileArchive(HANDLE hFile, HANDLE *archive) rBool; LONG STORMAPI SFileGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) rInt; BOOL STORMAPI SFileOpenArchive(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq) rBool; BOOL STORMAPI SFileOpenFile(const char *filename, HANDLE *phFile) rBool; diff --git a/3rdParty/Storm/Source/storm.h b/3rdParty/Storm/Source/storm.h index 6ea7a8b0e..0d1c01378 100644 --- a/3rdParty/Storm/Source/storm.h +++ b/3rdParty/Storm/Source/storm.h @@ -488,7 +488,7 @@ BOOL STORMAPI SFileDdaInitialize(HANDLE directsound); BOOL STORMAPI SFileDdaSetVolume(HANDLE directsound, signed int bigvolume, signed int volume); BOOL STORMAPI SFileDestroy(); -BOOL STORMAPI SFileGetFileArchive(HANDLE hFile, HANDLE archive); +BOOL STORMAPI SFileGetFileArchive(HANDLE hFile, HANDLE *archive); LONG STORMAPI SFileGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh); BOOL STORMAPI SFileOpenArchive(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq); diff --git a/CMakeLists.txt b/CMakeLists.txt index c35cb4016..efbfa9dde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -236,7 +236,8 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Silence warnings about __int64 alignment hack not always being applicable target_compile_options(devilutionx PRIVATE -Wno-ignored-attributes) # Fix: error: cast from pointer to smaller type 'unsigned char' loses information - target_compile_options(devilutionx PRIVATE -fms-extensions) + target_compile_options(devilution PRIVATE -fms-extensions -fms-compatibility -fms-compatibility-version=19.00) + target_link_options(devilutionx PRIVATE -liconv) endif() if(COTIRE) diff --git a/Source/engine.cpp b/Source/engine.cpp index ea41c71f7..679eb18dc 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -1683,7 +1683,7 @@ void __fastcall Cl2DecodeFrm1(int x, int y, char *pCelBuff, int nCel, int width, if (pCelBuff) { if (nCel > 0) { v9 = *(LONG*)&pCelBuff[4 * nCel]; - pCelBuffa = v9; + pCelBuffa = (char *)v9; v10 = (INT_PTR)&v8[v9]; if (*(_WORD *)(v10 + dir1)) { if (dir2 == 8 || (v11 = *(unsigned short *)(v10 + dir2), !*(_WORD *)(v10 + dir2))) diff --git a/SourceS/macos_stdarg.h b/SourceS/macos_stdarg.h new file mode 100644 index 000000000..8f545cc00 --- /dev/null +++ b/SourceS/macos_stdarg.h @@ -0,0 +1,27 @@ +#if defined(__MACH__) +#ifndef __STDARG_H +#define __STDARG_H + +#ifndef _VA_LIST_T +typedef __builtin_va_list va_list; +#define _VA_LIST_T +#endif +#define va_start(ap, param) __builtin_va_start(ap, param) +#define va_end(ap) __builtin_va_end(ap) +#define va_arg(ap, type) __builtin_va_arg(ap, type) + +/* GCC always defines __va_copy, but does not define va_copy unless in c99 mode + * or -ansi is not specified, since it was not part of C90. + */ +#define __va_copy(d,s) __builtin_va_copy(d,s) + +#if __STDC_VERSION__ >= 199900L || __cplusplus >= 201103L || !defined(__STRICT_ANSI__) +#define va_copy(dest, src) __builtin_va_copy(dest, src) +#endif + +/* Hack required to make standard headers work, at least on Ubuntu */ +#define __GNUC_VA_LIST 1 +typedef __builtin_va_list __gnuc_va_list; + +#endif /* __STDARG_H */ +#endif \ No newline at end of file diff --git a/SourceS/miniwin.h b/SourceS/miniwin.h index 470986566..fe79bc8b8 100644 --- a/SourceS/miniwin.h +++ b/SourceS/miniwin.h @@ -3,7 +3,12 @@ #include #include #include +// work around https://reviews.llvm.org/D51265 +#ifdef __MACH__ +#include "macos_stdarg.h" +#else #include +#endif #include #include #include @@ -277,7 +282,7 @@ typedef WORD ATOM; #define CS_HREDRAW 0x0001 #define CS_VREDRAW 0x0002 -#define IDC_ARROW 0x1 // Dummy value +#define IDC_ARROW (LPCSTR)0x1 // Dummy value #define CSIDL_STARTMENU 0x000b diff --git a/SourceS/miniwin_ui.h b/SourceS/miniwin_ui.h index 9d9be2a24..5e8b38acb 100644 --- a/SourceS/miniwin_ui.h +++ b/SourceS/miniwin_ui.h @@ -4,5 +4,5 @@ BOOL EndDialog(HWND hDlg, INT_PTR nResult); BOOL SetDlgItemText(HWND hDlg, int nIDDlgItem, LPCSTR lpString); BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags); DWORD FormatMessage(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, char *lpBuffer, DWORD nSize, va_list *Arguments); -int DialogBoxParam(HINSTANCE hInstance, int msgId, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); -int MAKEINTRESOURCE(int i); +int DialogBoxParam(HINSTANCE hInstance, LPCSTR msgId, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); +LPCSTR MAKEINTRESOURCE(int i); diff --git a/SourceX/DiabloUI/diabloui.cpp b/SourceX/DiabloUI/diabloui.cpp index 111ee81f9..12c3828ed 100644 --- a/SourceX/DiabloUI/diabloui.cpp +++ b/SourceX/DiabloUI/diabloui.cpp @@ -66,40 +66,40 @@ DWORD FormatMessage( return 0; } -int MAKEINTRESOURCE(int i) +LPCSTR MAKEINTRESOURCE(int i) { switch (i) { case IDD_DIALOG1: - return 0; + return (LPCSTR)0; case IDD_DIALOG2: - return 1; + return (LPCSTR)1; case IDD_DIALOG3: - return 2; + return (LPCSTR)2; case IDD_DIALOG4: - return 3; + return (LPCSTR)3; case IDD_DIALOG5: - return 4; + return (LPCSTR)4; case IDD_DIALOG7: - return 5; + return (LPCSTR)5; case IDD_DIALOG8: - return 6; + return (LPCSTR)6; case IDD_DIALOG9: - return 7; + return (LPCSTR)7; case IDD_DIALOG10: - return 8; + return (LPCSTR)8; case IDD_DIALOG11: - return 9; + return (LPCSTR)9; } - return -1; + return (LPCSTR)-1; } -int DialogBoxParam(HINSTANCE hInstance, int msgId, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) +int DialogBoxParam(HINSTANCE hInstance, LPCSTR msgId, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { char text[1024]; - snprintf(text, 1024, errorMessages[msgId], dwInitParam); + snprintf(text, 1024, errorMessages[(intptr_t)msgId], dwInitParam); - return SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, errorTitle[msgId], text, window) < 0 ? -1 : 0; + return SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, errorTitle[(intptr_t)msgId], text, window) < 0 ? -1 : 0; } BOOL SetDlgItemText(HWND hDlg, int nIDDlgItem, LPCSTR lpString) diff --git a/SourceX/storm.cpp b/SourceX/storm.cpp index 08d32c834..d552ac178 100644 --- a/SourceX/storm.cpp +++ b/SourceX/storm.cpp @@ -77,7 +77,7 @@ BOOL STORMAPI SFileDdaSetVolume(HANDLE directsound, signed int bigvolume, signed return TRUE; } -BOOL STORMAPI SFileGetFileArchive(HANDLE hFile, HANDLE archive) +BOOL STORMAPI SFileGetFileArchive(HANDLE hFile, HANDLE *archive) { UNIMPLEMENTED(); } @@ -434,7 +434,7 @@ BOOL STORMAPI SVidPlayBegin(char *filename, int a2, int a3, int a4, int a5, int // Copy frame to buffer SVidSurface = SDL_CreateRGBSurfaceWithFormatFrom( - smk_get_video(SVidSMK), + (unsigned char *)smk_get_video(SVidSMK), width, height, 8,