From f70b29ababfa3935f4676978f2bff7df9e4a7202 Mon Sep 17 00:00:00 2001 From: Ondrej Novak Date: Sat, 8 Feb 2025 09:19:55 +0100 Subject: [PATCH] compile and run in windows (improvements needed) --- .gitignore | 1 + AdvMan/DlgDialogy.cpp | 6 +- AdvMan/Pathname.h | 4 +- CMakeLists.txt | 7 +- INST/SETUP.C | 2 +- INST/SETUPLIB.C | 4 +- LZWC.C | 272 ----- LZWC.H | 56 - MAPS/ITEMS2.C | 2 +- MAPS/MAPEDIT.C | 2 +- MAPS/MOB_EDIT.C | 4 +- MAPS/WIZ_TOOL.C | 2 +- POKUSSCR.C | 58 - Skeldal.sln | 43 - Skeldal.suo | Bin 156160 -> 0 bytes Skeldal.vcproj | 1917 ------------------------------ StdAfx.cpp | 8 - StdAfx.h | 19 - VIDEO/MGFSOUND.C | 2 +- VIDEO/MGIFEDIT.C | 2 +- VIDEO/PCX2MGIF.C | 4 +- ZVUK/zvuk_dx.cpp | 2 +- addonKouzla.odt | Bin 6658 -> 0 bytes crashdump.cpp | 276 ----- crashdump.h | 1 - game/CMakeLists.txt | 1 + game/advconfig.c | 22 +- game/automap.c | 2 +- game/builder.c | 2 +- game/chargen.c | 2 +- game/console.c | 66 +- game/dialogy.c | 4 +- game/dlglib.c | 2 +- game/engine1.c | 1 + game/gamesave.c | 4 +- game/gen_stringtable.c | 2 +- game/globals.h | 12 +- game/globmap.c | 1 - game/interfac.c | 4 +- game/kniha.c | 6 +- game/kouzla.c | 2 +- game/menu.c | 8 +- game/realgame.c | 19 +- game/setup.c | 16 +- game/skeldal.c | 6 +- game/sndandmus.c | 4 +- game/souboje.c | 54 +- game/temp_storage.cpp | 3 +- game/temp_storage.h | 4 + game/wizard.c | 2 +- history.txt | 1 - insteng/SETUP.C | 2 +- insteng/SETUPLIB.C | 4 +- libs/CMakeLists.txt | 1 + libs/base64.h | 1 + libs/basicobj.c | 24 +- libs/basicobj.h | 6 +- libs/event.c | 9 +- libs/extract.c | 2 +- libs/gui.c | 25 +- libs/memman.c | 16 +- libs/memman.h | 2 +- libs/mgfplay.c | 2 +- libs/music.cpp | 2 + libs/music.h | 4 +- libs/wav_mem.h | 3 + mapedit.cpp | 10 - mapedit.vcproj | 852 ------------- platform/CMakeLists.txt | 7 +- platform/config.cpp | 16 +- platform/file_access.cpp | 38 +- platform/istr.c | 4 +- platform/platform.h | 16 +- platform/save_folder.h | 2 +- platform/sdl/BGraph2.cpp | 14 +- platform/sdl/CMakeLists.txt | 2 +- platform/sdl/sdl_context.cpp | 2 +- platform/sdl/sdl_context.h | 3 +- platform/sdl/sound.cpp | 4 +- platform/windows/app_start.cpp | 73 ++ platform/windows/map_file.cpp | 55 + platform/windows/map_file.h | 4 + platform/windows/save_folder.cpp | 13 +- 83 files changed, 415 insertions(+), 3747 deletions(-) delete mode 100644 LZWC.C delete mode 100644 LZWC.H delete mode 100644 POKUSSCR.C delete mode 100644 Skeldal.sln delete mode 100644 Skeldal.suo delete mode 100644 Skeldal.vcproj delete mode 100644 StdAfx.cpp delete mode 100644 StdAfx.h delete mode 100644 addonKouzla.odt delete mode 100644 crashdump.cpp delete mode 100644 crashdump.h delete mode 100644 history.txt delete mode 100644 mapedit.cpp delete mode 100644 mapedit.vcproj create mode 100644 platform/windows/app_start.cpp create mode 100644 platform/windows/map_file.cpp create mode 100644 platform/windows/map_file.h diff --git a/.gitignore b/.gitignore index 089a689..e18aa05 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ _UpgradeReport_Files /.cproject /.project /.settings +/.vscode /skeldal.local.ini diff --git a/AdvMan/DlgDialogy.cpp b/AdvMan/DlgDialogy.cpp index 52f9899..e226f8e 100644 --- a/AdvMan/DlgDialogy.cpp +++ b/AdvMan/DlgDialogy.cpp @@ -78,7 +78,7 @@ int DlgDialogy::GetDialogID(const char *name) char dialog[40]; if (fscanf(f," %40[^\r\n\t (] ( %d )",dialog,&id)==2) { - if (stricmp(dialog,"DIALOG")==0) + if (istrcmp(dialog,"DIALOG")==0) { fclose(f); return id; @@ -204,13 +204,13 @@ int DlgDialogy::CompareItems(int item1, int item2) { CString a=wList.GetItemText(item1,0); CString b=wList.GetItemText(item2,0); - return stricmp(a,b); + return istrcmp(a,b); } case 1: { CString a=wList.GetItemText(item1,1); CString b=wList.GetItemText(item2,1); - return stricmp(a,b); + return istrcmp(a,b); } case 2: { diff --git a/AdvMan/Pathname.h b/AdvMan/Pathname.h index 8b4c999..da57e63 100644 --- a/AdvMan/Pathname.h +++ b/AdvMan/Pathname.h @@ -24,10 +24,10 @@ enum PathNameNullEnum {PathNull}; #define PathNameCompare(op) bool operator op (const Pathname &other) const \ -{if (IsNull() || other.IsNull()) return false;else return stricmp(_fullpath,other._fullpath) op 0;}\ +{if (IsNull() || other.IsNull()) return false;else return istrcmp(_fullpath,other._fullpath) op 0;}\ bool operator op (const char *other) const \ {ASSERT(other[0]!=0);\ - if (IsNull() || other==NULL) return false;else return stricmp(_fullpath,other) op 0;} + if (IsNull() || other==NULL) return false;else return istrcmp(_fullpath,other) op 0;} #ifndef _UNICODE diff --git a/CMakeLists.txt b/CMakeLists.txt index fad32ea..cdd5e12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,14 @@ -cmake_minimum_required(VERSION 3.28) +cmake_minimum_required(VERSION 3.24) project(skeldal) # Najít SDL2 knihovnu find_package(SDL2 REQUIRED) if (MSVC) - add_compile_options(/W4 /EHsc /DNOMINMAX) + add_compile_options(/W4 /EHsc /DNOMINMAX /J) set(STANDARD_LIBRARIES "") else() - add_compile_options(-Wall -Wextra -Werror -Wno-unused-parameter -Wno-unused-value -Wno-extern-c-compat) + add_compile_options(-Wall -Wextra -Werror -Wno-unused-parameter -Wno-unused-value -Wno-extern-c-compat -funsigned-char) set(STANDARD_LIBRARIES "pthread") endif() @@ -19,7 +19,6 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/) include_directories( ${SDL2_INCLUDE_DIRS}) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char") enable_testing() add_subdirectory(libs) add_subdirectory(platform) diff --git a/INST/SETUP.C b/INST/SETUP.C index a3fb442..d27dfc8 100644 --- a/INST/SETUP.C +++ b/INST/SETUP.C @@ -929,7 +929,7 @@ static void start_install() char error=0,autostart; get_value(0,60,target_path); if (find_object(waktual,70)!=NULL) autostart=f_get_value(0,70); else autostart=1; - strupr(target_path); + strupper(target_path); if (validate_path(target_path)==0) { msg_box("Cesta je �patn�",'\x1',"Cesta s c�lov�m adres��em je chybn� zad�na. Nepou��vejte dlouh� n�zvy z WINDOWS 95!","OK",NULL); diff --git a/INST/SETUPLIB.C b/INST/SETUPLIB.C index 334acaa..658a586 100644 --- a/INST/SETUPLIB.C +++ b/INST/SETUPLIB.C @@ -200,7 +200,7 @@ long check_size(int gr) for(i=0;i -#include -#include -#include -#include - - - -#define getmem(s) malloc(s) -#define New(typ) (typ *)getmem(sizeof(typ)) -#define NewArr(typ,pocet) (typ *)getmem(sizeof(typ)*pocet); -#define ClrArr(p,typ,pocet) memset(p,0,sizeof(typ)*pocet); - -#define LZW_MAX_CODES 4096 - -typedef struct double_s - { - short group,chr,first,next; - }DOUBLE_S; - -typedef DOUBLE_S CODE_TABLE[LZW_MAX_CODES]; - -DOUBLE_S *compress_dic; -int clear_code; -int end_code; -int free_code; -int nextgroup; -int bitsize,init_bitsize; -unsigned char old_value=0; - -void do_clear_code() //funkce maze slovni (clear code) - { - int i; - - old_value=0; - nextgroup=free_code; - bitsize=init_bitsize; - for(i=0;igroup=i;p->chr=-1;p->next=-1;p->first=-1; - } - } - -void reinit_lzw() - { - do_clear_code(); - } - -char init_lzw_compressor(int dic_size) - //dic size je velikost slovniku(bitova) - //pro 8 bitove hodnoty zde vloz 8. - { - compress_dic=(DOUBLE_S *)getmem(sizeof(CODE_TABLE)); - if (compress_dic==NULL) return -1; - clear_code=1<>3; - data<<=bitepos & 7; - c[0]|=data; - c[1]=data>>8; - c[2]=data>>16; - return bitepos+bitesize; - } - -/*int input_code(void *source,long *bitepos,int bitsize,int mask); -#pragma aux input_code parm [esi][edi][ebx][edx]=\ - "mov ecx,[edi]"\ - "mov eax,ecx"\ - "shr eax,3"\ - "mov eax,[esi+eax]"\ - "and cl,7"\ - "shr eax,cl"\ - "and eax,edx"\ - "add [edi],ebx"\ - value[eax] modify [ecx]; -*/ -int input_code_c(unsigned char *source,long *bitepos,int bitsize,int mask) - { - unsigned char *c;int x; - c=source; - c+=*bitepos>>3; - x=c[0]+(c[1]<<8)+(c[2]<<16); - x>>=*bitepos & 7; - x &= mask; - *bitepos=*bitepos+bitsize; - return x; - } - - -int find_code(DOUBLE_S *p) - //hleda skupinu ve slovniku. Pokud neexistuje vraci -1; - { - int ps; - - ps=p->group; - ps=compress_dic[ps].first; - while (ps!=-1) - { - if (compress_dic[ps].chr==p->chr) return ps; - ps=compress_dic[ps].next; - } - return -1; - } - - -void add_code(DOUBLE_S *p) - //vklada novou dvojici - { - p->first=-1;p->next=compress_dic[p->group].first; - memcpy(&compress_dic[nextgroup],p,sizeof(DOUBLE_S)); - compress_dic[p->group].first=nextgroup; - nextgroup++; - } - - -long lzw_encode(unsigned char *source,void *target,int size) - //Encode LZW. zdroj, cil a velikost dat. Vraci velikost komprimovano. - { - long bitpos=0; - long maxbpos=size*8; - DOUBLE_S p; - int f; - - clear: - old_value=(unsigned char)(p.group=*source++);size--; - while (size-->0) - { - if (bitpos>maxbpos) return -1; - p.chr=(int)((unsigned char)(*source++));old_value+=p.chr; - f=find_code(&p); - if (f<0) - { - bitpos=output_code_c(target,bitpos,bitsize,p.group); - add_code(&p); - if (nextgroup==(1<=LZW_MAX_CODES) - { - bitpos=output_code_c(target,bitpos,bitsize,p.group); - bitpos=output_code_c(target,bitpos,bitsize,clear_code); - do_clear_code(); - goto clear; - } - } - else - p.group=f; - } - bitpos=output_code_c(target,bitpos,bitsize,p.group); - bitpos=output_code_c(target,bitpos,bitsize,end_code); - if (bitpos>maxbpos) return -1; - return (bitpos+8)>>3; - } - - -void de_add_code(DOUBLE_S *p,int *mask) - { - DOUBLE_S *q; - - q=&compress_dic[nextgroup];q->group=p->group;q->chr=p->chr;q->first=compress_dic[p->group].first+1; - nextgroup++; - if (nextgroup==*mask) - { - *mask=(*mask<<1)+1; - bitsize++; - } - } - - - -int expand_code(int code,unsigned char **target) - { - static int first; - - if (code>end_code) - { - assert(compress_dic[code].groupsound; if (s[0])it->sound=add_sound_to_table(s);else it->sound=0; delete_unused_sound(z); diff --git a/MAPS/MAPEDIT.C b/MAPS/MAPEDIT.C index 64b3741..b7a00b1 100644 --- a/MAPS/MAPEDIT.C +++ b/MAPS/MAPEDIT.C @@ -874,7 +874,7 @@ int main(int argc,char *argv[]) puts("...nemohu najit WSKELDAL.INI\n"); return 1; } - if (strlen(filename)>3 && stricmp(filename+strlen(filename)-3,"adv")==0) + if (strlen(filename)>3 && istrcmp(filename+strlen(filename)-3,"adv")==0) { TSTR_LIST adv_cfg=read_config(filename); config_file=merge_configs(config_file,adv_cfg); diff --git a/MAPS/MOB_EDIT.C b/MAPS/MOB_EDIT.C index 26285cd..58a8092 100644 --- a/MAPS/MOB_EDIT.C +++ b/MAPS/MOB_EDIT.C @@ -460,7 +460,7 @@ void check_mobs_name() for(i=0;i<6 && s[i];i++) if (s[i]==32) s[i]='_'; for(;i<6;i++) s[i]='_'; s[i]=0; - strupr(s); + strupper(s); set_value(0,100,s); c_set_value(0,180,0); c_set_value(0,185,0); @@ -674,7 +674,7 @@ void mob_sound_call(int mob) for(j=0;j12) { MessageBox(hDlg,"Jmeno mapy je prilis dlouhe (max 8 znaku bez pripony nebo 12 znaku s priponou)",0,MB_OK|MB_ICONEXCLAMATION); diff --git a/POKUSSCR.C b/POKUSSCR.C deleted file mode 100644 index 51b4e7f..0000000 --- a/POKUSSCR.C +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Nahodi SVGA - */ -#include -#include -#include -#include -#include - -#define SCREEN_AREA 0xa000 -#define SCREEN_LIN_ADDR ((SCREEN_AREA) << 4) -#define SCREEN_SIZE 65537 - - unsigned char pomoc[256]; -void main() - { - unsigned short *pscreen; - unsigned int sizegran; - int i,err; - int col; - int g; - union REGPACK regs; -//------------------------------------------------------------- - //pomoc = (unsigned char *)malloc(512); - memset( ®s, 0, sizeof(union REGPACK) ); - regs.w.ax = 0x4f02; - regs.w.bx = 0x0111; - intr( 0x10, ®s);//nastaveni videomodu - //regs.w.ax = 0x4f01; - //regs.w.cx = 0x0101; - //regs.w.es = FP_SEG (pomoc); - //regs.w.di = FP_OFF (pomoc); - //intr( 0x10, ®s);//zjisteni granularity v KB - //err = regs.w.ax; - //sizegran = pomoc[4]; - //sizegran = sizegran*1024; - //if (sizegran<=65536) -//---------------------------- - for( col = 0; col < 100; col++ ) { - trace:if (!(inp( 0x03da )&8 )) goto trace;// cekani na raytrace - for( g = 0; g < 10; g++ ) { - regs.w.ax = 0x4f05; - regs.w.bx = 0; - regs.w.dx = g; - intr( 0x10, ®s);//prepnuti videostranky - pscreen = (unsigned short *)SCREEN_LIN_ADDR; - for( i = 0; i < SCREEN_SIZE; i+=sizeof(*pscreen) ) { - *pscreen = i+col*g; - pscreen+=1; - } - } - } -regs.w.ax = 0x0003; -intr (0x10,®s); -//for( g = 0; g < 15; g++ ) printf("%X...%X\n",g,pomoc[g]*1024); -//free (pomoc); -//printf("err %X\n",err); -} diff --git a/Skeldal.sln b/Skeldal.sln deleted file mode 100644 index 045702f..0000000 --- a/Skeldal.sln +++ /dev/null @@ -1,43 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MapEdit", "mapedit\MapEdit.vcproj", "{F2CA5BB1-C021-4708-AED7-7290F7255537}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Skeldal", "Skeldal.vcproj", "{AE3E864A-642C-4280-93EC-77A551CF495C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Lex_Lib", "mapedit\Lex_Lib\Lex_Lib.vcproj", "{E8075868-DD7C-4F22-8751-4847A3F33F55}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CSpells", "mapedit\CSpells\CSpells.vcproj", "{9C3ABECA-90BA-4D59-BE93-BABE53117B89}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CDialogy", "mapedit\CDialogy\CDialogy.vcproj", "{CA0202C1-2629-45BC-ACBF-1063EA1F4285}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F2CA5BB1-C021-4708-AED7-7290F7255537}.Debug|Win32.ActiveCfg = Debug|Win32 - {F2CA5BB1-C021-4708-AED7-7290F7255537}.Debug|Win32.Build.0 = Debug|Win32 - {F2CA5BB1-C021-4708-AED7-7290F7255537}.Release|Win32.ActiveCfg = Release|Win32 - {F2CA5BB1-C021-4708-AED7-7290F7255537}.Release|Win32.Build.0 = Release|Win32 - {AE3E864A-642C-4280-93EC-77A551CF495C}.Debug|Win32.ActiveCfg = Debug|Win32 - {AE3E864A-642C-4280-93EC-77A551CF495C}.Debug|Win32.Build.0 = Debug|Win32 - {AE3E864A-642C-4280-93EC-77A551CF495C}.Release|Win32.ActiveCfg = Release|Win32 - {AE3E864A-642C-4280-93EC-77A551CF495C}.Release|Win32.Build.0 = Release|Win32 - {E8075868-DD7C-4F22-8751-4847A3F33F55}.Debug|Win32.ActiveCfg = Debug|Win32 - {E8075868-DD7C-4F22-8751-4847A3F33F55}.Debug|Win32.Build.0 = Debug|Win32 - {E8075868-DD7C-4F22-8751-4847A3F33F55}.Release|Win32.ActiveCfg = Release|Win32 - {E8075868-DD7C-4F22-8751-4847A3F33F55}.Release|Win32.Build.0 = Release|Win32 - {9C3ABECA-90BA-4D59-BE93-BABE53117B89}.Debug|Win32.ActiveCfg = Debug|Win32 - {9C3ABECA-90BA-4D59-BE93-BABE53117B89}.Debug|Win32.Build.0 = Debug|Win32 - {9C3ABECA-90BA-4D59-BE93-BABE53117B89}.Release|Win32.ActiveCfg = Release|Win32 - {9C3ABECA-90BA-4D59-BE93-BABE53117B89}.Release|Win32.Build.0 = Release|Win32 - {CA0202C1-2629-45BC-ACBF-1063EA1F4285}.Debug|Win32.ActiveCfg = Debug|Win32 - {CA0202C1-2629-45BC-ACBF-1063EA1F4285}.Debug|Win32.Build.0 = Debug|Win32 - {CA0202C1-2629-45BC-ACBF-1063EA1F4285}.Release|Win32.ActiveCfg = Release|Win32 - {CA0202C1-2629-45BC-ACBF-1063EA1F4285}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Skeldal.suo b/Skeldal.suo deleted file mode 100644 index 369497b7246445b80aca1ddcd702601875faa5e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156160 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 Zcp?(+>rj6ed)}qaqof#5Ot2gB{6CzaxtRa} diff --git a/Skeldal.vcproj b/Skeldal.vcproj deleted file mode 100644 index d094fcf..0000000 --- a/Skeldal.vcproj +++ /dev/null @@ -1,1917 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/StdAfx.cpp b/StdAfx.cpp deleted file mode 100644 index 1a12dd9..0000000 --- a/StdAfx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// mapedit.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/StdAfx.h b/StdAfx.h deleted file mode 100644 index a9a914f..0000000 --- a/StdAfx.h +++ /dev/null @@ -1,19 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__A63322C2_6786_488F_BB36_15C84AEB5478__INCLUDED_) -#define AFX_STDAFX_H__A63322C2_6786_488F_BB36_15C84AEB5478__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -// TODO: reference additional headers your program requires here - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__A63322C2_6786_488F_BB36_15C84AEB5478__INCLUDED_) diff --git a/VIDEO/MGFSOUND.C b/VIDEO/MGFSOUND.C index 5709892..851b3be 100644 --- a/VIDEO/MGFSOUND.C +++ b/VIDEO/MGFSOUND.C @@ -419,7 +419,7 @@ void interpret_line(FILE *f) c++; sscanf(c,"%23s",command);c=strchr(c,32); - strupr(command); + strupper(command); if (!strcmp(command,"ID")) { get_num(c,num); diff --git a/VIDEO/MGIFEDIT.C b/VIDEO/MGIFEDIT.C index ce62348..9314a74 100644 --- a/VIDEO/MGIFEDIT.C +++ b/VIDEO/MGIFEDIT.C @@ -450,7 +450,7 @@ static void change_dir() c_set_value(0,9,0); send_message(E_GUI,9,E_CONTROL,2); i=strlen(last_path); - strupr(last_path); + strupper(last_path); if (i!=0 && last_path[i-1]!='\\') { strcat(last_path,"\\"); diff --git a/VIDEO/PCX2MGIF.C b/VIDEO/PCX2MGIF.C index 216ab83..b087ff1 100644 --- a/VIDEO/PCX2MGIF.C +++ b/VIDEO/PCX2MGIF.C @@ -676,7 +676,7 @@ char *get_pcx_name(char *name,int x) sprintf(s,"%s%05d.pcx",s,x); } else sprintf(s,"%s%04d.pcx",s,x); - strupr(s); + strupper(s); } else { @@ -805,7 +805,7 @@ void script_compress(char *script_name) int j=lowq; ungetc(i,scr); i=fscanf(scr,"%s %d %d %d %d",s,&j,&min_fr,&max_fr,&colorq); - strupr(s); + strupper(s); if (!strcmp(s,"FRAMESTEP")) frame_step=j; else if (!strcmp(s,"STATIC")) statpic=j; diff --git a/ZVUK/zvuk_dx.cpp b/ZVUK/zvuk_dx.cpp index d44ce79..c74cab6 100644 --- a/ZVUK/zvuk_dx.cpp +++ b/ZVUK/zvuk_dx.cpp @@ -722,7 +722,7 @@ void change_music(const char *mus_filename) else { const char *c=strrchr(mus_filename,'.'); - if (c!=0 && stricmp(c,".mus")==0) + if (c!=0 && istrcmp(c,".mus")==0) GCurrentDecoder=&GMusDecoder; else GCurrentDecoder=&GWinAmpPlayer; diff --git a/addonKouzla.odt b/addonKouzla.odt deleted file mode 100644 index 0c96aa0a29cba39bded348f14f986b3f91bb49cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6658 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 U4|Cqb!Xm|d)-PaTo&3Q49|GaCBme*a diff --git a/crashdump.cpp b/crashdump.cpp deleted file mode 100644 index 39eaa70..0000000 --- a/crashdump.cpp +++ /dev/null @@ -1,276 +0,0 @@ -#define WINVER 0x0500 -#include -#include -#include -#include - - -#ifndef __specstrings -#define __specstrings - -#define PSTR char * -#define PCSTR const char * -#define PULONG_PTR DWORD * -#define ULONG_PTR DWORD - #define __in - #define __out - #define __inout - #define __in_opt - #define __out_opt - #define __inout_opt - #define __in_ecount(x) - #define __out_ecount(x) - #define __inout_ecount(x) - #define __in_bcount(x) - #define __out_bcount(x) - #define __inout_bcount(x) - #define __deref_opt_out - #define __deref_out - #define __out_xcount(x) -#endif - - -#include -typedef BOOL (WINAPI *MiniDumpWriteDump_Type)( - HANDLE hProcess, - DWORD ProcessId, - HANDLE hFile, - MINIDUMP_TYPE DumpType, - PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - PMINIDUMP_CALLBACK_INFORMATION CallbackParam -); - -static MiniDumpWriteDump_Type MiniDumpWriteDumpFn; - -static DWORD WINAPI SafeMsgBox(LPVOID text) -{ - MessageBox(NULL,(LPCTSTR)text,NULL,MB_OK|MB_SYSTEMMODAL); - return 0; -} - - -static bool GenerateMinidump(MINIDUMP_EXCEPTION_INFORMATION *ExceptionInfo, MINIDUMP_TYPE flags,const char *sufix) -{ - char buff[MAX_PATH+50]; - HANDLE hFile; - GetModuleFileName(NULL,buff,MAX_PATH); - strcat(buff,sufix); - hFile=CreateFile(buff,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); - if (hFile==NULL) - { - char *text=(char *)alloca(strlen(buff)+200); - sprintf(text,"Nemohu vytvorit soubor zaznamu '%s', zkontroluje prava zapisu do adresare hry",buff); - MessageBox(0,text,0,MB_SYSTEMMODAL); - return false; - } - else - { - if (MiniDumpWriteDumpFn(GetCurrentProcess(),GetCurrentProcessId(),hFile,flags,ExceptionInfo,NULL,NULL)!=TRUE) - { - char *text=(char *)alloca(strlen(buff)+200); - sprintf(text,"Selhalo volani MiniDumpWriteDump. Nelze vygenerovat zaznam do souboru '%s'",buff); - MessageBox(0,text,0,MB_SYSTEMMODAL); - return false; - } - CloseHandle(hFile); - } - return true; -} - -static BOOL WINAPI CloseOneWindow(HWND hWnd, LPARAM lParam) -{ - CloseWindow(hWnd); - return TRUE; -} - -static void CloseAllWindows() -{ - EnumThreadWindows(GetCurrentThreadId(),CloseOneWindow,NULL); -} - - -extern "C" { int GetExeVersion();} - -static DWORD WINAPI PostError(LPVOID p) -{ - char buff[MAX_PATH+50]; - char dmp[MAX_PATH+50]; - char product[MAX_PATH]; - char *tmp; - GetModuleFileName(NULL,buff,MAX_PATH); - tmp=strrchr(buff,'\\'); - if (tmp==0) tmp=buff;else tmp++; - strcpy(product,tmp); - strcpy(dmp,buff); - strcpy(strrchr(buff,'\\')+1,"poslichybu.html"); - strcat(dmp,".short.dmp"); - DeleteFile(buff); - HANDLE h=CreateFile(buff,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0); - if (h!=INVALID_HANDLE_VALUE) - { - DWORD wrt; - DWORD rd; - const char *form1= - "" - "" - "" - "" - "" - "Br�ny Skeldalu - formul�� k odesl�n� chyby" - "" - "" - "" - "
\"logo\"
" - "
" - "

Br�ny Skeldalu - formul�� k odesl�n� chyby

" - "

Autor programu se omlouv� za chybu a pros� V�s, abyste pomohl p�i odhalov�n� chyb.
" - "Sta�� kdy� pravdiv� vypln�te ode�lete n�sleduj�c� formul��.
" - "Pokuste se pros�m napsat co nejv�ce informac�.
" - "K formul��i je p�ilo�en soubor obsahuj�c� z�znam o chyb�.

" - "D�kujeme za spolupr�ci

" - "
" - "
" - "
V� e-mail pro p��pad, �e bysme v�s cht�li kontaktovat: (nepovinn�)
" - "" - "
Napi�te pros�m dal�� informace o tom, za jak�ch podm�nek chyba vznikla, pop��pad� jak chybu znovu vyvolat
" - "" - "
P��padn� p�ilo�te ulo�enou pozici nebo jin� soubory souvisej�c� s chybou
" - "" - "
" - "Pozor: Formul�� tak� obsahuje informace o posledn� chyb�.
" - "Nepou��vejte tento formul�� k odesl�n� jin�ch chybov�ch hl�en�.
" - "

Prohl�en� o ochran� soukrom�ch �daj�

" - "
" - "
" - "=0;i--) - { - char tmp[3]; - sprintf(tmp,"%02X",buff[i]); - buff[i*2]=tmp[0]; - buff[i*2+1]=tmp[1]; - } - WriteFile(h,buff,rd*2,&wrt,0); - }while (rd); - CloseHandle(v); - const char *form2="\" />

" - "

"; - WriteFile(h,(void *)(form4),strlen(form4),&wrt,0); - CloseHandle(h); - } - - int i=MessageBox(NULL,"Zaznam o chybe dokoncen. Soubory se zaznamy byly ulozeny do slozky hry. " - "Prosim nemazte tyto soubory, je mozne, ze budou potrebne k hlubsi analyze chyby. " - "Hlaseni o chybe je nyni mozne odeslat po internetu k dalsimu prozkoumani. " - "Pokud neni pocitac pripojen k internetu trvale, bude nutne jej pripojit nyni.\r\n\r\n" - "Chcete zaznam o chybe odeslat?",0,MB_YESNO|MB_SYSTEMMODAL); - if (i==IDYES) - { - if (h==INVALID_HANDLE_VALUE || (UINT)ShellExecute(0,0,buff,0,0,SW_NORMAL)<32) - MessageBox(0,"Nastala chyba pri otevirani formulare. Formular prosim otevrete rucne - soubor 'poslichybu.html'",0,MB_OK|MB_SYSTEMMODAL); - } - else - { - MessageBox(0,"Informace o chybe lze odeslat pozdeji pomoci formulare 'poslichybu.html', jenz byl vytvoren ve slozce hry",0,MB_OK|MB_SYSTEMMODAL); - } - return 0; -} - -static DWORD WINAPI CrashReportGenerateThread(LPVOID data) -{ - MINIDUMP_EXCEPTION_INFORMATION *ExceptionInfo=(MINIDUMP_EXCEPTION_INFORMATION *)data; - HWND hwnd; - int res; - - if (MiniDumpWriteDumpFn!=NULL) - { - hwnd=CreateWindowEx(WS_EX_TOPMOST,"STATIC","V programu nastala chyba\r\n\r\nSystem Windows nyni sbira informace o chybe a generuje potrebne soubory.\r\nProsim cekejte, tato operace muze trvat trochu dele...",WS_POPUP| - WS_DLGFRAME|WS_VISIBLE|SS_CENTER,0,0,640,80,NULL,NULL,GetModuleHandle(NULL),NULL); - UpdateWindow(hwnd); - if (GenerateMinidump(ExceptionInfo,MiniDumpNormal,".short.dmp")==false) return 0; - GenerateMinidump(ExceptionInfo,MiniDumpWithDataSegs,".int32_t.dmp"); - GenerateMinidump(ExceptionInfo,MiniDumpWithFullMemory,".full.dmp"); - PostError(0); - DestroyWindow(hwnd); - } - else - { - res=MessageBox(0,"V programu nastala chyba. Bohuzel neni pritomen soubor DbgHelp.dll v adresari hry, " - "neni tedy mozne vytvorit zaznam o chybe. Ze stranek http://skeldal.jinak.cz je mozne" - "tento soubor stahnout a tim pomoci autorovi odhalit a opravit tyto zaludne pady.\r\n\r\n" - "Chcete prejit na stranky obsahujici posledni verze potrebnych souboru?",0,MB_YESNO|MB_SYSTEMMODAL); - if (res==IDYES) - ShellExecute(0,0,"http://skeldal.jinak.cz/main.php?page=download",0,0,SW_NORMAL); - } - return 0; -} - - -static LONG WINAPI CrashReportGenerate(EXCEPTION_POINTERS *ExceptionInfo) -{ - HANDLE msg; - - MINIDUMP_EXCEPTION_INFORMATION nfo; - nfo.ThreadId=GetCurrentThreadId(); - nfo.ExceptionPointers=ExceptionInfo; - nfo.ClientPointers=FALSE; - -// CloseAllWindows(); - - msg=CreateThread(NULL,0,CrashReportGenerateThread,(void *)&nfo,0,NULL); - WaitForSingleObject(msg,INFINITE); - ExitProcess(1); - return 0; -} - -extern "C" -{ - void CrashReportOnBuffOverrun() - { - __try - { - RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED,EXCEPTION_NONCONTINUABLE,0,0); - } - __except(CrashReportGenerate(GetExceptionInformation())) - { - } - } - - -extern char __report_gsfailure(); -void InitCrashDump() -{ - char *p=(char *)(&__report_gsfailure); - DWORD oldProtect; - ::VirtualProtect(p,150,PAGE_EXECUTE_WRITECOPY,&oldProtect); - *p=0xCC; - ::VirtualProtect(p,150,PAGE_EXECUTE_READ,&oldProtect); - SetUnhandledExceptionFilter(CrashReportGenerate); - - HMODULE lib=LoadLibrary("DbgHelp.dll"); - MiniDumpWriteDumpFn=(MiniDumpWriteDump_Type)GetProcAddress(lib,"MiniDumpWriteDump"); -} -} \ No newline at end of file diff --git a/crashdump.h b/crashdump.h deleted file mode 100644 index 285930a..0000000 --- a/crashdump.h +++ /dev/null @@ -1 +0,0 @@ -void InitCrashDump(); diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 54a2e39..54b0ca4 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -41,3 +41,4 @@ ${CMAKE_BINARY_DIR}/default_font.cpp ) add_library(skeldal_main ${files}) +set_property(TARGET skeldal_main PROPERTY CXX_STANDARD 20) \ No newline at end of file diff --git a/game/advconfig.c b/game/advconfig.c index d51ee12..85d18c3 100644 --- a/game/advconfig.c +++ b/game/advconfig.c @@ -2,7 +2,7 @@ #include "advconfig.h" -#include +#include #include @@ -17,25 +17,25 @@ static void process_row(INI_CONFIG_SECTION *sec, const char *row) { const char *value = sep+1; - if (stricmp(key,"CESTA_GRAFIKA") == 0) { + if (istrcmp(key,"CESTA_GRAFIKA") == 0) { ini_replace_key(sec, "graphics", value); - } else if (stricmp(key, "CESTA_ZVUKY") == 0) { + } else if (istrcmp(key, "CESTA_ZVUKY") == 0) { ini_replace_key(sec, "sounds", value); - } else if (stricmp(key, "CESTA_FONTY") == 0) { + } else if (istrcmp(key, "CESTA_FONTY") == 0) { ini_replace_key(sec, "fonts", value); - } else if (stricmp(key, "CESTA_MAPY") == 0) { + } else if (istrcmp(key, "CESTA_MAPY") == 0) { ini_replace_key(sec, "maps", value); - } else if (stricmp(key, "CESTA_MUSIC") == 0) { + } else if (istrcmp(key, "CESTA_MUSIC") == 0) { ini_replace_key(sec, "music_adv", value); - } else if (stricmp(key, "CESTA_BGRAFIKA") == 0) { + } else if (istrcmp(key, "CESTA_BGRAFIKA") == 0) { ini_replace_key(sec, "gui", value); - } else if (stricmp(key, "CESTA_ITEMY") == 0) { + } else if (istrcmp(key, "CESTA_ITEMY") == 0) { ini_replace_key(sec, "items", value); - } else if (stricmp(key, "CESTA_ENEMY") == 0) { + } else if (istrcmp(key, "CESTA_ENEMY") == 0) { ini_replace_key(sec, "enemy", value); - } else if (stricmp(key, "CESTA_VIDEO") == 0) { + } else if (istrcmp(key, "CESTA_VIDEO") == 0) { ini_replace_key(sec, "video", value); - } else if (stricmp(key, "CESTA_DIALOGY") == 0) { + } else if (istrcmp(key, "CESTA_DIALOGY") == 0) { ini_replace_key(sec, "dialogs", value); } } diff --git a/game/automap.c b/game/automap.c index f5fe943..1b84221 100644 --- a/game/automap.c +++ b/game/automap.c @@ -254,7 +254,7 @@ void psani_poznamek_event(EVENT_MSG *msg,void **data) { case 8:if (index) index--; text[index]=0;break; case 27:strcpy(text,save); - [[fallthrough]]; + CASE_FALLTHROUGH; case 13:save_text_to_map(x,y,cur_depth,text); send_message(E_DONE,E_MOUSE,psani_poznamek_event); msg->msg=-2; diff --git a/game/builder.c b/game/builder.c index 2fbe372..a2810a5 100644 --- a/game/builder.c +++ b/game/builder.c @@ -1329,7 +1329,7 @@ void redraw_scene() send_message(E_KOUZLO_ANM); } -void refresh_scene() +void refresh_scene(THE_TIMER *t) { redraw_scene(); if (!cancel_render && !norefresh) diff --git a/game/chargen.c b/game/chargen.c index 85f6050..897219c 100644 --- a/game/chargen.c +++ b/game/chargen.c @@ -695,7 +695,7 @@ static char validate_character(THUMAN *h) return 1; } */ -static void empty_proc() +static void empty_proc(void) { } diff --git a/game/console.c b/game/console.c index 5f313a6..a5be67b 100644 --- a/game/console.c +++ b/game/console.c @@ -177,7 +177,7 @@ static char purge_map() _dos_findclose(&rc);*/ wzprintf("\r\n Zadej jmeno tempu (all - vse):");gets(buffer); if (buffer[0]==0) return 0; - strupr(buffer); + strupper(buffer); concat(c,pathtable[SR_TEMP],buffer); if (strcmp(buffer,ALL) && check_file_exists_ex(c)) { @@ -461,7 +461,7 @@ static int add_file_to_console(const char *name, LIST_FILE_TYPE _, size_t __, vo for (int i = 0; i < 19; ++i) buff[i] = ' '; buff[19] = 0; int l = strlen(name); - if (l > 3 && stricmp(name+l-4,".MAP") == 0) { + if (l > 3 && istrcmp(name+l-4,".MAP") == 0) { if (l>19) l = 19; memcpy(buff, name, l); wzprintf("%s", buff); @@ -475,51 +475,51 @@ static int add_file_to_console(const char *name, LIST_FILE_TYPE _, size_t __, vo } static int process_on_off_command(const char *cmd, char on) { - if (stricmp(cmd, "inner-eye") == 0) { + if (istrcmp(cmd, "inner-eye") == 0) { show_debug = on; return 1; } - if (stricmp(cmd, "hunter-instinct") == 0) { + if (istrcmp(cmd, "hunter-instinct") == 0) { show_lives = on; return 1; } - if (stricmp(cmd, "no-hassle") == 0) { + if (istrcmp(cmd, "no-hassle") == 0) { nohassle=on; return 1; } - if (stricmp(cmd, "iron-skin") == 0) { + if (istrcmp(cmd, "iron-skin") == 0) { immortality=on; return 1; } - if (stricmp(cmd, "spirit-wander") == 0) { + if (istrcmp(cmd, "spirit-wander") == 0) { cur_group=on?10:postavy[0].groupnum; return 1; } - if (stricmp(cmd, "ghost-walls") == 0) { + if (istrcmp(cmd, "ghost-walls") == 0) { ghost_walls = on; return 1; } - if (stricmp(cmd, "true-seeing") == 0) { + if (istrcmp(cmd, "true-seeing") == 0) { true_seeing = on; return 1; } - if (stricmp(cmd, "walking-in-air") == 0) { + if (istrcmp(cmd, "walking-in-air") == 0) { nofloors = on; return 1; } - if (stricmp(cmd, "enemy-insight") == 0) { + if (istrcmp(cmd, "enemy-insight") == 0) { show_mob_info = on; return 1; } - if (stricmp(cmd, "enemy-walk-diagonal") == 0) { + if (istrcmp(cmd, "enemy-walk-diagonal") == 0) { game_extras = on?(game_extras | EX_WALKDIAGONAL):(game_extras & ~EX_WALKDIAGONAL); return 1; } - if (stricmp(cmd, "ghost-form") == 0) { + if (istrcmp(cmd, "ghost-form") == 0) { pass_all_mobs = on; return 1; } - if (stricmp(cmd, "dead-food") == 0) { + if (istrcmp(cmd, "dead-food") == 0) { dead_food = on; return 1; } @@ -529,41 +529,41 @@ static int process_on_off_command(const char *cmd, char on) { void postavy_teleport_effect(int sector,int dir,int postava,char effect); static int process_actions(const char *command) { - if (stricmp(command, "flute") == 0) { + if (istrcmp(command, "flute") == 0) { bott_draw_fletna(); return 1; } - if (stricmp(command, "global-map") == 0) { + if (istrcmp(command, "global-map") == 0) { wire_global_map(); return 1; } - if (stricmp(command, "status") == 0) { + if (istrcmp(command, "status") == 0) { display_game_status(); return 1; } - if (stricmp(command, "offlers-blessing") == 0) { + if (istrcmp(command, "offlers-blessing") == 0) { money=150000; play_fx_at(FX_MONEY); return 1; } - if (stricmp(command, "i-require-gold") == 0) { + if (istrcmp(command, "i-require-gold") == 0) { money+=1; play_fx_at(FX_MONEY); return 1; } - if (stricmp(command, "to-the-moon") == 0) { + if (istrcmp(command, "to-the-moon") == 0) { money+=100000; play_fx_at(FX_MONEY); return 1; } - if (stricmp(command, "echo-location") == 0) { + if (istrcmp(command, "echo-location") == 0) { for (int i = 1; i < mapsize; ++i) { map_coord[i].flags |= MC_AUTOMAP; } play_fx_at(FX_MAP); return 1; } - if (stricmp(command, "rise-and-shine") == 0) { + if (istrcmp(command, "rise-and-shine") == 0) { int r = 0; for (int i = 0; i < POCET_POSTAV; ++i) { THUMAN *p = postavy+i; @@ -579,7 +579,7 @@ static int process_actions(const char *command) { return r; } - if (stricmp(command, "ascent") == 0) { + if (istrcmp(command, "ascent") == 0) { int lev = postavy[0].exp; for (int i = 0; i < POCET_POSTAV; ++i) { THUMAN *p = postavy+i; @@ -592,18 +592,18 @@ static int process_actions(const char *command) { } return 1; } - if (stricmp(command, "by-the-power-of-grayskull") == 0) { + if (istrcmp(command, "by-the-power-of-grayskull") == 0) { memset(runes,0xFF, sizeof(runes)); play_fx_at(FX_MAGIC); return 1; } - if (stricmp(command, "world-list") == 0) { + if (istrcmp(command, "world-list") == 0) { int cnt = 0; list_files(gpathtable[SR_MAP], file_type_normal|file_type_just_name, add_file_to_console, &cnt); printf("\n"); return 1; } - if (stricmp(command, "beam-me-up") == 0) { + if (istrcmp(command, "beam-me-up") == 0) { for (int i = 1; i < mapsize; ++i) { map_coord[i].flags |= MC_AUTOMAP; } @@ -652,14 +652,14 @@ static void wiz_find_monster(const char *name) { } static int process_with_params(const char *cmd, const char *args) { - if (stricmp(cmd, "locate") == 0) { + if (istrcmp(cmd, "locate") == 0) { if (args[0] == 0) return 0; wiz_find_item(args); wiz_find_monster(args); console_add_line(""); return 1; } - if (stricmp(cmd, "summon") == 0) { + if (istrcmp(cmd, "summon") == 0) { if (args[0] == 'i') { char *end; unsigned long id = strtoul(args+1, &end, 10); @@ -673,16 +673,16 @@ static int process_with_params(const char *cmd, const char *args) { } return 0; } - if (stricmp(cmd, "say") == 0) { + if (istrcmp(cmd, "say") == 0) { console_add_line(args); return 1; } - if (stricmp(cmd, "speed") == 0) { + if (istrcmp(cmd, "speed") == 0) { long v = strtol(args, NULL, 10); if (v > 0) timerspeed_val = v; return v > 0; } - if (stricmp(cmd, "portal-jump") == 0) { + if (istrcmp(cmd, "portal-jump") == 0) { if (check_file_exists(build_pathname(2,gpathtable[SR_MAP], args))) { TMA_LOADLEV lev; strncpy(lev.name,args,12); @@ -702,8 +702,8 @@ static int process_command(PARSED_COMMAND cmd) { } int onoff = -1; if (cmd.args) { - if (stricmp(cmd.args, "on") == 0) onoff = 1; - else if (stricmp(cmd.args, "off") == 0) onoff = 0; + if (istrcmp(cmd.args, "on") == 0) onoff = 1; + else if (istrcmp(cmd.args, "off") == 0) onoff = 0; } else { return process_actions(cmd.command); } diff --git a/game/dialogy.c b/game/dialogy.c index c10d65d..c0eb7b3 100644 --- a/game/dialogy.c +++ b/game/dialogy.c @@ -731,7 +731,7 @@ void wire_dialog_drw() ukaz_mysku(); showview(0,0,0,0); } -void unwire_dialog() +void unwire_dialog(void) { send_message(E_DONE,E_KEYBOARD,key_check); disable_click_map(); @@ -1230,7 +1230,7 @@ static void cast_spell(int spell) add_spell(spell,cil,cil,1); } -static void free_dialog_stringtable() { +static void free_dialog_stringtable(void) { stringtable_free(dialogy_strtable); } diff --git a/game/dlglib.c b/game/dlglib.c index 496a87a..ce524a2 100644 --- a/game/dlglib.c +++ b/game/dlglib.c @@ -191,7 +191,7 @@ void proved_d(char *code,char *text) if (*code!=0xff)fscanf(dlg,"%[^\n]",text); if (*code==0) { - strupr(text); + strupper(text); if (!strncmp(text,"GOTO",4)) { int n; diff --git a/game/engine1.c b/game/engine1.c index d10030f..4211fb8 100644 --- a/game/engine1.c +++ b/game/engine1.c @@ -2,6 +2,7 @@ #include #include #include +#include #include diff --git a/game/gamesave.c b/game/gamesave.c index 081f05b..714dd75 100644 --- a/game/gamesave.c +++ b/game/gamesave.c @@ -839,7 +839,7 @@ typedef struct load_specific_file_callback_data_t { static ENUM_ALL_STATUS_CALLBACK_RESULT load_specific_file_callback(FILE *f, const char *name, size_t datasize, void *ctx) { LOAD_SPECIFIC_FILE_CALLBACK_DATA *me = ctx; - if (stricmp(name, me->name) == 0) { + if (istrcmp(name, me->name) == 0) { void *d = getmem(datasize); if (fread(d, 1, datasize, f) != datasize) { free(d); @@ -1377,7 +1377,7 @@ static void saveload_keyboard(EVENT_MSG *msg,void **_) } } -void unwire_save_load() +void unwire_save_load(void) { term_task_wait(clk_ask_name[0].id); if (back_texture!=NULL) free(back_texture); diff --git a/game/gen_stringtable.c b/game/gen_stringtable.c index 4853316..43f6349 100644 --- a/game/gen_stringtable.c +++ b/game/gen_stringtable.c @@ -58,7 +58,7 @@ void cti_texty(void); static int convert_map_strings_1(const char *source_name, LIST_FILE_TYPE type, size_t sz, void *context) { int l = strlen(source_name); - if (stricmp(source_name+l-4,".map")) return 0; + if (istrcmp(source_name+l-4,".map")) return 0; source_name = set_file_extension(source_name, ".txt"); const char *target_name = set_file_extension(concat2("map_", source_name),".csv"); const char *target_path = *(const char **)context; diff --git a/game/globals.h b/game/globals.h index b067a55..fc13cb8 100644 --- a/game/globals.h +++ b/game/globals.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #define POCET_POSTAV 6 @@ -645,11 +646,11 @@ extern char marker; //tato promenna je 0, jen v pripade ze je 1 probehne assert //builder - skeldal -void *game_keyboard(EVENT_MSG *msg,void **usr); +void game_keyboard(EVENT_MSG *msg,void **usr); void calc_animations(void); int load_map(char *filename); void other_draw(void); -void refresh_scene(void); +void refresh_scene(THE_TIMER *t); const void *pcx_fade_decomp(const void *p, int32_t *s); const void *pcx_15bit_decomp(const void *p, int32_t *s); const void *pcx_15bit_autofade(const void *p, int32_t *s); @@ -663,10 +664,11 @@ const void *load_mob_legacy_format(const void *p, int32_t *s); const void *load_spells_legacy_format(const void *p, int32_t *s); void wire_main_functs(void); void ukaz_kompas(char mode); -void *timming(EVENT_MSG *msg,void **data); +void timming(EVENT_MSG *msg,void **data); void do_timer(void); void hold_timer(int id,char hld); -THE_TIMER *add_to_timer(int id,int delay,int maxcall,void *proc); +typedef void (*TIMER_PROC)(THE_TIMER *t); +THE_TIMER *add_to_timer(int id,int delay,int maxcall,TIMER_PROC proc); void delete_from_timer(int id); THE_TIMER *find_timer(int id); void objekty_mimo(void); @@ -999,7 +1001,7 @@ int count_items_inside(short *place); int count_items_total(short *place); char put_item_to_inv(THUMAN *p,short *picked_items); //funkce vklada predmet(y) do batohu postavy void pick_set_cursor(void); //nastavuje kurzor podle vlozeneho predmetu; -void calc_fly(void); +void calc_fly(THE_TIMER *t); void zmen_skupinu(THUMAN *p); void add_to_group(int num); void group_all(void); diff --git a/game/globmap.c b/game/globmap.c index 95f6cb6..eca4396 100644 --- a/game/globmap.c +++ b/game/globmap.c @@ -19,7 +19,6 @@ #include "globals.h" #include -#include #define GLOBMAP "GLOBMAP.DAT" #define ODDELOVACE ";:=,\n\r{}" diff --git a/game/interfac.c b/game/interfac.c index 95e1c7d..ef9688f 100644 --- a/game/interfac.c +++ b/game/interfac.c @@ -25,7 +25,7 @@ #include "globals.h" #include "engine1.h" #include -#include + #define MES_MAXSIZE 500 #define CHECK_BOX_ANIM 6 @@ -1555,7 +1555,7 @@ void show_jrc_logo(char *filename) word palette[256],*palw; int cntr,cdiff,cpalf,ccc; - change_music("?"); + change_music(NULL); curcolor=0;bar32(0,0,639,479); showview(0,0,0,0);sleep_ms(1000); const char *s = build_pathname(2, gpathtable[SR_VIDEO],filename); diff --git a/game/kniha.c b/game/kniha.c index 902ff7e..af51f86 100644 --- a/game/kniha.c +++ b/game/kniha.c @@ -303,8 +303,8 @@ static char read_set(TMPFILE_RD *txt,char *var,char *set) } } *cc=0; - strupr(set); - strupr(var); + strupper(set); + strupper(var); return c; } @@ -370,7 +370,7 @@ static char read_tag(TMPFILE_RD *txt) i=temp_storage_scanf(txt,"%[^> ] %c",var,&c); while(c<33 && i!=EOF) c=i=temp_storage_getc(txt); if (c!='>') temp_storage_ungetc(txt); - strupr(var); + strupper(var); if (!strcmp(var,PARAGRAPH)) { break_line(); diff --git a/game/kouzla.c b/game/kouzla.c index 62e7f84..808a290 100644 --- a/game/kouzla.c +++ b/game/kouzla.c @@ -1023,7 +1023,7 @@ void spell_teleport_sector(int cil,int owner) if (TelepLocation.map) { destroy_player_map(); - if (stricmp(TelepLocation.map,level_fname)!=0) + if (istrcmp(TelepLocation.map,level_fname)!=0) { diff --git a/game/menu.c b/game/menu.c index 40d300a..de27d2f 100644 --- a/game/menu.c +++ b/game/menu.c @@ -368,8 +368,8 @@ int enter_menu(char open) } static const char *end_titles_path(const char *fname) { - if (stricmp(fname,"TITULKY.TXT") == 0) fname = "end_titles.txt"; - else if (stricmp(fname,"ENDTEXT.TXT") == 0) fname = "epilog.txt"; + if (istrcmp(fname,"TITULKY.TXT") == 0) fname = "end_titles.txt"; + else if (istrcmp(fname,"ENDTEXT.TXT") == 0) fname = "epilog.txt"; return lang_replace_path_if_exists(fname); } @@ -430,7 +430,7 @@ static int insert_next_line(int ztrata) if (title_mode!=TITLE_KONEC) c=get_next_title(0,NULL);else c[0]=0; if (c[0]=='*') { - strupr(c); + strupper(c); if (!strcmp(c+1,"HEAD")) { title_mode=TITLE_HEAD; @@ -633,7 +633,7 @@ void konec_hry() task_id=add_task(8196,titles,0,"TITULKY.TXT"); task_wait_event(E_KEYBOARD); if (is_running(task_id)) term_task(task_id); - change_music("?"); + change_music(NULL); curcolor=0; bar32(0,0,639,479); ukaz_mysku(); diff --git a/game/realgame.c b/game/realgame.c index 08d482f..c499db1 100644 --- a/game/realgame.c +++ b/game/realgame.c @@ -114,7 +114,7 @@ int32_t load_section(FILE *f,void **section, int *sct_type,int32_t *sect_size) } -void prepare_graphics(int *ofs,char *names,int32_t size,void *decomp,int class) +void prepare_graphics(int *ofs,char *names,int32_t size,ABLOCK_DECODEPROC decomp,int class) { char *p,*end; @@ -210,7 +210,7 @@ int load_map(char *filename) level_fname=(char *)getmem(strlen(filename)+1); strcpy(level_fname,filename); SEND_LOG("(GAME) Loading map: '%s'",level_fname); - strupr(level_fname); + strupper(level_fname); mob_template=NULL; mob_size=0; if (f==NULL) return -1; @@ -406,7 +406,7 @@ void leave_current_map() destroy_fly_map(); p=letici_veci; while (p!=NULL) {stop_fly(p,0);p=p->next;} - calc_fly(); + calc_fly(0); save_map=1; free(map_sides); free(map_sectors); @@ -560,7 +560,7 @@ TFLY *duplic_fly(TFLY *p) return q; } -void calc_fly() +void calc_fly(THE_TIMER *t) { LETICI_VEC *p,*q; short ss; @@ -1393,7 +1393,7 @@ void sector0(void) } } -static void tele_redraw() +static void tele_redraw(THE_TIMER *_) { if (!running_anm) return; redraw_scene(); @@ -1442,7 +1442,7 @@ void postavy_teleport_effect(int sector,int dir,int postava,char effect) if (zavora) return; if (effect) { - void *c; + void (*c)(void); zavora=1; c=wire_proc; @@ -1851,13 +1851,13 @@ void sleep_players(va_list args) } -void *game_keyboard(EVENT_MSG *msg,void **usr) +void game_keyboard(EVENT_MSG *msg,void **usr) { int c; usr; - if (pass_zavora) return NULL; - if (cur_mode==MD_END_GAME) return NULL; + if (pass_zavora) return ; + if (cur_mode==MD_END_GAME) return ; if (msg->msg==E_KEYBOARD) { c=quit_request_as_escape(va_arg(msg->data, int)); @@ -1917,7 +1917,6 @@ void *game_keyboard(EVENT_MSG *msg,void **usr) }*/ } } - return &game_keyboard; } diff --git a/game/setup.c b/game/setup.c index cc99a40..49dd0f4 100644 --- a/game/setup.c +++ b/game/setup.c @@ -28,7 +28,7 @@ char q_runsetup(char *parm) char c[6]; strncpy(c,parm,6); - strupr(c); + strupper(c); return !strncmp(c,"/SETUP",6); } @@ -46,7 +46,7 @@ static void checkbox_animator(THE_TIMER *t) static int effects[]={SND_GVOLUME,SND_MUSIC,SND_GFX,SND_TREBL,SND_BASS,SND_XBASS}; -static void do_setup_change() +static void do_setup_change(void) { char c; @@ -59,7 +59,7 @@ static void do_setup_change() } } -static void change_zoom() +static void change_zoom(void) { int id=o_aktual->id; int i; @@ -68,7 +68,7 @@ static void change_zoom() zoom_speed((id-30)/10); } -static void change_turn() +static void change_turn(void) { int id=o_aktual->id; int i; @@ -77,7 +77,7 @@ static void change_turn() turn_speed((id-60)/10); } -static void unwire_setup(); +static void unwire_setup(void); static void setup_keyboard(EVENT_MSG *msg,void **_) { @@ -91,7 +91,7 @@ static void setup_keyboard(EVENT_MSG *msg,void **_) } } -static void wire_setup() +static void wire_setup(void) { unwire_proc(); unwire_proc=unwire_setup; @@ -101,7 +101,7 @@ static void wire_setup() SEND_LOG("(GAME) Starting setup"); } -static void unwire_setup() +static void unwire_setup(void) { show_names=f_get_value(0,90) & 1; enable_sort=f_get_value(0,100) & 1; @@ -200,7 +200,7 @@ void new_setup() add_to_timer(TM_CHECKBOX,4,-1,checkbox_animator); } -void game_setup_() +void game_setup_(void) { wire_setup(); new_setup(); diff --git a/game/skeldal.c b/game/skeldal.c index cbe9ddd..7695d03 100644 --- a/game/skeldal.c +++ b/game/skeldal.c @@ -524,13 +524,13 @@ void back_music(void) puts("\x7"); } */ -void *timming(EVENT_MSG *msg,void **data) +void timming(EVENT_MSG *msg,void **data) { THE_TIMER *p,*q; int i,j; data; - if (msg->msg==E_INIT) return &timming; + if (msg->msg==E_INIT) return ; *otevri_zavoru=1; j=va_arg(msg->data,int); for (i=0;i #include -#include + #define PL_RANDOM 1 #define PL_FORWARD 2 #define PL_FIRST 3 @@ -463,7 +463,7 @@ void create_playlist(char *playlist) c=playlist; while (*c && *c==32) c++; sscanf(c,"%s",mode); - strupr(mode); + strupper(mode); shift=1; if (!strcmp(mode,"RANDOM")) play_list_mode=PL_RANDOM; else if (!strcmp(mode,"FORWARD")) play_list_mode=PL_FORWARD; diff --git a/game/souboje.c b/game/souboje.c index af1026f..d87f0e9 100644 --- a/game/souboje.c +++ b/game/souboje.c @@ -114,10 +114,10 @@ void (*after_spell_wire)(); short *poradi=NULL; short *prave_hraje; -void wire_programming(); -void unwire_programming(); -void wire_jadro_souboje(); -void unwire_jadro_souboje(); +void wire_programming(void); +void unwire_programming(void); +void wire_jadro_souboje(void); +void unwire_jadro_souboje(void); uint8_t sel_zivel=0; static char prekvapeni=0; @@ -443,7 +443,7 @@ void rozhodni_o_poradi() *r++=0; prave_hraje=poradi; } -void hrat_souboj() +void hrat_souboj(THE_TIMER *_) { static int counter=0; char cond=ms_last_event.y>378 && ms_last_event.x>510 && cur_mode!=MD_PRESUN; @@ -459,7 +459,7 @@ void hrat_souboj() } showview(0,0,0,0); if (neco_v_pohybu==2) neco_v_pohybu=0; else neco_v_pohybu=2; - calc_fly();mob_animuj(); + calc_fly(NULL);mob_animuj(); if (d_action!=NULL) do_delay_actions(); } if (cond) ukaz_mysku(); @@ -768,8 +768,8 @@ void konec_presunu(EVENT_MSG *msg,void **unused) } } -void wire_presun_postavy(); -void unwire_presun_postavy() +void wire_presun_postavy(void); +void unwire_presun_postavy(void) { disable_click_map(); send_message(E_DONE,E_KEYBOARD,game_keyboard); @@ -782,7 +782,7 @@ void unwire_presun_postavy() hromadny_utek=0; } -void wire_presun_postavy() +void wire_presun_postavy(void) { unwire_proc(); @@ -1370,7 +1370,7 @@ void jadro_souboje(EVENT_MSG *msg,void **unused) //!!!! Jadro souboje } } -void wire_jadro_souboje() +void wire_jadro_souboje(void) { int battlespeed=gamespeed-gamespeed*gamespeedbattle/5; recalc_volumes(viewsector,viewdir); @@ -1383,7 +1383,7 @@ void wire_jadro_souboje() pgm_help=10; } -void unwire_jadro_souboje() +void unwire_jadro_souboje(void) { delete_from_timer(TM_SCENE); send_message(E_DONE,E_IDLE,jadro_souboje); @@ -1411,7 +1411,7 @@ void fill_rune(char *d,int i) static void *runebar; static char *rune_name=NULL; -void display_rune_bar() +void display_rune_bar(THE_TIMER *_) { short coords[][2]={{3,26},{32,26},{61,26},{90,26},{18,64},{47,64},{76,64}}; char c; @@ -1437,14 +1437,14 @@ void display_rune_bar() -void rune_bar_redrawing() +void rune_bar_redrawing(THE_TIMER *_) { redraw_scene(); if (!norefresh && !cancel_render) { schovej_mysku(); program_draw(); - display_rune_bar(); + display_rune_bar(NULL); ukaz_mysku(); showview(0,0,0,0); } @@ -1471,9 +1471,9 @@ void display_power_bar_tm(THE_TIMER *tm) display_power_bar(1); } -void wire_select_rune(); -void unwire_select_rune(); -void wire_select_power(); +void wire_select_rune(void); +void unwire_select_rune(void); +void wire_select_power(void); char cancel_power(int id,int xa,int ya,int xr,int yr) { @@ -1598,7 +1598,7 @@ char runes_mask(int id,int xa,int ya,int xr,int yr) } if (cc<0) rune_name=NULL; free(runebar);runebar=NULL; - display_rune_bar(); + display_rune_bar(NULL); return 1; } @@ -1614,7 +1614,7 @@ char cancel_runes(int id,int xa,int ya,int xr,int yr) return 1; } -void unwire_select_rune() +void unwire_select_rune(void) { wire_proc=wire_select_rune; delete_from_timer(TM_DELAIER); @@ -1623,7 +1623,7 @@ void unwire_select_rune() free(runebar);runebar=NULL; } -void wire_select_rune() +void wire_select_rune(void) { THUMAN *p; HUM_ACTION *c; @@ -1653,13 +1653,13 @@ void wire_select_rune_fly() cancel_render=1; } -void unwire_select_power() +void unwire_select_power(void) { rune_name=NULL; delete_from_timer(TM_DELAIER); } -void wire_select_power() +void wire_select_power(void) { THUMAN *p; int i; @@ -1727,7 +1727,7 @@ void program_draw() } -void souboje_redrawing() +void souboje_redrawing(THE_TIMER *_) { if (neco_v_pohybu) calc_mobs(); calc_animations(); @@ -1926,7 +1926,7 @@ char mask_click(int id,int xa,int ya,int xr,int yr) switch(d) { case AC_RUN: postavy[select_player].utek=5+postavy[select_player].actions; - [[fallthrough]]; + CASE_FALLTHROUGH; case AC_ATTACK: case AC_STAND: case AC_ARMOR: @@ -2042,7 +2042,7 @@ void programming_keyboard(EVENT_MSG *msg,void **unused) } -void unwire_programming() +void unwire_programming(void) { disable_click_map(); send_message(E_DONE,E_KEYBOARD,programming_keyboard); @@ -2053,7 +2053,7 @@ void unwire_programming() -void wire_programming() +void wire_programming(void) { schovej_mysku(); after_spell_wire=wire_programming; @@ -2080,7 +2080,7 @@ void wait_to_stop(EVENT_MSG *msg,void **unused) unwire_proc(); calc_mobs(); mouse_set_default(H_MS_DEFAULT); - refresh_scene(); + refresh_scene(0); cancel_render=1; if (prekvapeni) zahajit_kolo(1);else wire_programming(); msg->msg=-2; diff --git a/game/temp_storage.cpp b/game/temp_storage.cpp index c9d5b92..9537687 100644 --- a/game/temp_storage.cpp +++ b/game/temp_storage.cpp @@ -43,8 +43,7 @@ void temp_storage_store(const char *name, const void *data, int32_t size) { v.resize(size+1); v[size] = 0; v.resize(size); - std::copy(b,e, v.begin()); - v[size] = 0; + std::copy(b,e, v.begin()); } int32_t temp_storage_find(const char *name) { diff --git a/game/temp_storage.h b/game/temp_storage.h index f9c2d11..bf0d289 100644 --- a/game/temp_storage.h +++ b/game/temp_storage.h @@ -27,6 +27,10 @@ void temp_storage_write(const void *data, uint32_t size, TMPFILE_WR *f); uint32_t temp_storage_read(void *data, uint32_t size, TMPFILE_RD *f); void temp_storage_skip(TMPFILE_RD *f, int bytes); +#ifdef _MSC_VER +#define __attribute__(__VA_ARG__) +#endif + int *temp_storage_internal_skip_ptr(TMPFILE_RD *f); int temp_storage_internal_begin_scanf(TMPFILE_RD *f, const char *format, ... ) __attribute__((format(scanf, 2, 3))); int temp_storage_internal_end_scanf(TMPFILE_RD *f, int r); diff --git a/game/wizard.c b/game/wizard.c index 185549e..d894151 100644 --- a/game/wizard.c +++ b/game/wizard.c @@ -217,7 +217,7 @@ static char purge_map() _dos_findclose(&rc);*/ wzprintf("\r\n Zadej jmeno tempu (all - vse):");gets(buffer); if (buffer[0]==0) return 0; - strupr(buffer); + strupper(buffer); concat(c,pathtable[SR_TEMP],buffer); if (strcmp(buffer,ALL) && check_file_exists_ex(c)) { diff --git a/history.txt b/history.txt deleted file mode 100644 index 30d74d2..0000000 --- a/history.txt +++ /dev/null @@ -1 +0,0 @@ -test \ No newline at end of file diff --git a/insteng/SETUP.C b/insteng/SETUP.C index e15408c..3249d9d 100644 --- a/insteng/SETUP.C +++ b/insteng/SETUP.C @@ -956,7 +956,7 @@ static void start_install() char error=0,autostart; get_value(0,60,target_path); if (find_object(waktual,70)!=NULL) autostart=f_get_value(0,70); else autostart=1; - strupr(target_path); + strupper(target_path); if (validate_path(target_path)==0) { msg_box("Incorrect path",'\x1',"The path is incorrect. Don't use long filenames!","OK",NULL); diff --git a/insteng/SETUPLIB.C b/insteng/SETUPLIB.C index e8e56c6..d53d4f6 100644 --- a/insteng/SETUPLIB.C +++ b/insteng/SETUPLIB.C @@ -200,7 +200,7 @@ long check_size(int gr) for(i=0;i +#include class base64_t { diff --git a/libs/basicobj.c b/libs/basicobj.c index 09dcafc..26697b8 100644 --- a/libs/basicobj.c +++ b/libs/basicobj.c @@ -241,16 +241,16 @@ void draw_status_line(char *c) showview(0,y-2,SCR_WIDTH_X-1,ysize+5); } -void *status_mem_info(EVENT_MSG *msg) +void status_mem_info(EVENT_MSG *msg) { - return NULL; + } -void *status_idle(EVENT_MSG *msg) +void status_idle(EVENT_MSG *msg) { - if (msg->msg==E_INIT) return &status_idle; + if (msg->msg==E_INIT) return; send_message(E_STATUS_LINE,msg->msg); - return NULL; + return; } static int enter_event_msg_to(EVENT_MSG *msg, void *ctx) { @@ -299,29 +299,29 @@ void status_line(EVENT_MSG *msg, T_EVENT_ROOT **user_data) { return; } -void *mouse_xy(EVENT_MSG *msg) +void mouse_xy(EVENT_MSG *msg) { char **c = va_arg(msg->data, char **); - if (msg->msg==E_INIT) return &mouse_xy; + if (msg->msg==E_INIT) return; sprintf(*c," X: %d Y: %d",ms_last_event.x,ms_last_event.y); *c=strchr(*c,'\0'); - return NULL; + return ; } -void *show_time(EVENT_MSG *msg) +void show_time(EVENT_MSG *msg) { char **c = va_arg(msg->data, char **); time_t t; struct tm cas; - if (msg->msg==E_INIT) return &show_time; + if (msg->msg==E_INIT) return; t=time(NULL); cas=*localtime(&t); sprintf(*c,"%02d:%02d:%02d ",cas.tm_hour,cas.tm_min,cas.tm_sec); *c=strchr(*c,'\0'); - return NULL; + return ; } //------------------------------------------ @@ -684,7 +684,7 @@ void input_line_init(OBJREC *o,va_list len) void input_line_draw(int x1,int y1, int x2, int y2, OBJREC *o) { - char d[2]=" \0"; + char d[2]=" "; int x; char *c; int len; diff --git a/libs/basicobj.h b/libs/basicobj.h index eeed509..0d5a52e 100644 --- a/libs/basicobj.h +++ b/libs/basicobj.h @@ -13,9 +13,9 @@ void xor_rectangle(int x,int y,int xs,int ys); // status lines void status_line(EVENT_MSG *msg,T_EVENT_ROOT **user_data); -void *status_mem_info(EVENT_MSG *msg); -void *mouse_xy(EVENT_MSG *msg); -void *show_time(EVENT_MSG *msg); +void status_mem_info(EVENT_MSG *msg); +void mouse_xy(EVENT_MSG *msg); +void show_time(EVENT_MSG *msg); // objects //void sample(OBJREC *o); diff --git a/libs/event.c b/libs/event.c index b9760c0..a88c5a2 100644 --- a/libs/event.c +++ b/libs/event.c @@ -293,9 +293,11 @@ void deinstall_event(T_EVENT_ROOT **tree,int32_t ev_num,EV_PROC proc,void *procd if (!p->calls) force_delete_curr(tree,r,p); } +typedef void (*initproc)(); + void tree_basics(T_EVENT_ROOT **ev_tree,EVENT_MSG *msg) { - void (*q)(); + initproc q; if (msg->msg==E_ADD || msg->msg==E_ADDEND) { @@ -308,9 +310,10 @@ void tree_basics(T_EVENT_ROOT **ev_tree,EVENT_MSG *msg) install_event(ev_tree,msg,proc,msg->msg==E_ADDEND); return; } + if (msg->msg==E_INIT) - { - q = va_arg(msg->data, void (*)()); + { + q = va_arg(msg->data, initproc); q(); return; } diff --git a/libs/extract.c b/libs/extract.c index 6f71968..acb2570 100644 --- a/libs/extract.c +++ b/libs/extract.c @@ -16,7 +16,7 @@ main(int argc,char **argv) if (argc==3) help(); init_manager(argv[1],NULL); - z=afile(strupr(argv[2]),read_group(0),&s); + z=afile(strupper(argv[2]),read_group(0),&s); if (z==NULL) { puts("File not found"); diff --git a/libs/gui.c b/libs/gui.c index d84d837..552d88e 100644 --- a/libs/gui.c +++ b/libs/gui.c @@ -26,7 +26,7 @@ word desktop_y_size; char force_redraw_desktop=0; static char change_flag=0,f_cancel_event=0; const word *default_font; -void empty() +void empty(void) { } @@ -339,7 +339,7 @@ void define(int id,int x,int y,int xs,int ys,char align,void (*initproc)(OBJREC o->call_done=empty1; o->autoresizex=0; o->autoresizey=0; - o->on_event=empty; + o->on_event=empty3; o->on_enter=empty; o->on_exit=empty; o->on_change=empty; @@ -767,16 +767,16 @@ void uninstall_gui(void) //send_message(E_GUI,cislo,E_UDALOST,data....) -void on_control_change(void (*proc)()) +void on_control_change(void (*proc)(void)) { o_end->on_change=proc; } -void on_control_enter(void (*proc)()) +void on_control_enter(void (*proc)(void)) { o_end->on_enter=proc; } -void on_control_exit(void (*proc)()) +void on_control_exit(void (*proc)(void)) { o_end->on_exit=proc; } @@ -920,28 +920,29 @@ void close_current() close_window(waktual); } +typedef void (*PROG)(void); + void background_runner(EVENT_MSG *msg,void **prog) { - void (*p)(); + PROG *prog_ptr = (PROG *)(prog); if (msg->msg==E_INIT) { - *prog = va_arg(msg->data, void (*)()); + *prog_ptr = va_arg(msg->data, PROG); return; } if (msg->msg==E_DONE) { - *prog=NULL; + *prog_ptr=NULL; return; - } - p=*prog; - p(); + } + (*prog_ptr)(); msg->msg=-2; } -void run_background(void (*p)()) +void run_background(PROG p) { send_message(E_ADD,E_IDLE,background_runner,p); } diff --git a/libs/memman.c b/libs/memman.c index 5dcd299..4903bbc 100644 --- a/libs/memman.c +++ b/libs/memman.c @@ -10,7 +10,7 @@ #include #include #include -#include + #define DPMI_INT 0x31 #define LOAD_BUFFER 4096 @@ -42,7 +42,7 @@ void standard_mem_error(size_t size) { char buff[256]; SEND_LOG("(ERROR) Memory allocation error detected, %lu bytes missing",size); - sprintf(buff,"Memory allocation error\n Application can't allocate %lu bytes of memory (%xh)\n",size,memman_handle); + sprintf(buff,"Memory allocation error\n Application can't allocate %lu bytes of memory (%xh)\n",(unsigned long)size,memman_handle); display_error(buff); exit(1); } @@ -271,7 +271,7 @@ THANDLE_DATA *zneplatnit_block(int handle) return h; } -static void heap_error() { +static void heap_error(size_t s) { display_error("out of memory"); abort(); } @@ -315,7 +315,7 @@ void *load_swaped_block(THANDLE_DATA *h) } -int find_same(const char *name,void *decomp) +int find_same(const char *name,ABLOCK_DECODEPROC decomp) { THANDLE_DATA *p; int i,j; @@ -332,7 +332,7 @@ int find_same(const char *name,void *decomp) return -1; } -int find_handle(const char *name,void *decomp) +int find_handle(const char *name,ABLOCK_DECODEPROC decomp) { return find_same(name,decomp); } @@ -364,7 +364,7 @@ THANDLE_DATA *def_handle(int handle,const char *filename,ABLOCK_DECODEPROC decom } memcpy(h->src_file,filename,12); h->seekpos=0; - strupr(h->src_file); + strupper(h->src_file); h->loadproc=decompress; if (filename[0]) h->seekpos=get_file_entry(path,h->src_file); @@ -385,7 +385,7 @@ const void *afile(char *filename,int group,int32_t *blocksize) d=alloca(strlen(filename)+1); strcpy(d,filename); - strupr(d); + strupper(d); if (mman_patch && test_file_exist_DOS(group,d)) entr=0; else entr=get_file_entry(group,d); if (entr!=0) @@ -669,7 +669,7 @@ void display_status() if (h->src_file[0]) strncpy(nname,h->src_file,12);else strcpy(nname,""); printf("%04Xh ... %12s %s %s %08lXh %6d %10d %6d \n",i*BK_MINOR_HANDLES+j, nname,names[h->status-1], - copys,(uintptr_t)h->blockdata,h->size,h->counter,h->lockcount); + copys,(unsigned long)h->blockdata,h->size,h->counter,h->lockcount); ln++; total_data+=h->size; if(h->status==BK_PRESENT)total_mem+=h->size; diff --git a/libs/memman.h b/libs/memman.h index b7d159c..e1a0cc9 100644 --- a/libs/memman.h +++ b/libs/memman.h @@ -96,7 +96,7 @@ void close_manager(void); //uzavre manager a uvolni veskerou pam void undef_handle(int handle); //uvolni hadle k dalsimu pouziti THANDLE_DATA *zneplatnit_block(int handle); //zneplatni data bloku THANDLE_DATA *get_handle(int handle); //vraci informace o rukojeti -int find_handle(const char *name,void *decomp); //hleda mezi rukojeti stejnou definici +int find_handle(const char *name,ABLOCK_DECODEPROC decomp); //hleda mezi rukojeti stejnou definici int test_file_exist(int group,char *filename); //testuje zda soubor existuje v ramci mmanageru const void *afile(char *filename,int group,int32_t *blocksize); //nahraje do pameti soubor registrovany v ramci mmanageru void *afile_copy(char *filename,int group,int32_t *blocksize); //nahraje do pameti soubor registrovany v ramci mmanageru diff --git a/libs/mgfplay.c b/libs/mgfplay.c index 81b66ea..0c38e31 100644 --- a/libs/mgfplay.c +++ b/libs/mgfplay.c @@ -335,7 +335,7 @@ static void done_mgif_player() free(f); free(temp); mix_back_sound(3); - change_music("?"); + change_music(NULL); } static void init_load_buffer(int size) diff --git a/libs/music.cpp b/libs/music.cpp index 9443aab..724aa2e 100644 --- a/libs/music.cpp +++ b/libs/music.cpp @@ -1,3 +1,5 @@ +#include + #include "music.h" #include diff --git a/libs/music.h b/libs/music.h index 56f62de..b0ae927 100644 --- a/libs/music.h +++ b/libs/music.h @@ -5,7 +5,9 @@ extern "C" { #endif -typedef struct music_stream_t {} TMUSIC_STREAM; +typedef struct music_stream_t { + char dummy; +} TMUSIC_STREAM; typedef struct music_stream_info_t { int freq; diff --git a/libs/wav_mem.h b/libs/wav_mem.h index 7652734..c4083b1 100644 --- a/libs/wav_mem.h +++ b/libs/wav_mem.h @@ -1,6 +1,9 @@ #ifndef _WAV_H #define _WAV_H + +#include + #define WAV_RIFF "RIFF" #define WAV_WAVE "WAVE" #define WAV_FMT "fmt " diff --git a/mapedit.cpp b/mapedit.cpp deleted file mode 100644 index 890f739..0000000 --- a/mapedit.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// mapedit.cpp : Defines the entry point for the console application. -// - -#include "stdafx.h" - - -int main(int argc, char* argv[]) -{ - return 0; -} diff --git a/mapedit.vcproj b/mapedit.vcproj deleted file mode 100644 index 96b7ed1..0000000 --- a/mapedit.vcproj +++ /dev/null @@ -1,852 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt index a6827e4..c87bba7 100644 --- a/platform/CMakeLists.txt +++ b/platform/CMakeLists.txt @@ -19,6 +19,10 @@ target_sources(skeldal_platform PRIVATE if(WIN32) target_sources(skeldal_platform PRIVATE windows/save_folder.cpp + windows/map_file.cpp + ) + target_sources(skeldal PRIVATE + windows/app_start.cpp ) target_compile_definitions(skeldal_platform PRIVATE PLATFORM_WINDOWS) message(STATUS "Building for Windows") @@ -57,4 +61,5 @@ target_link_libraries(skeldal skeldal_platform skeldal_sdl skeldal_libs - ${SDL2_LIBRARIES} pthread) + ${SDL2_LIBRARIES} + ${STANDARD_LIBRARIES}) diff --git a/platform/config.cpp b/platform/config.cpp index d020716..8f76c80 100644 --- a/platform/config.cpp +++ b/platform/config.cpp @@ -121,15 +121,15 @@ double ini_get_value_double(const char *value, int *conv_ok) { int ini_get_value_boolean(const char *value) { int r = -1; if (value != NULL) { - if (stricmp(value, "true") == 0 - || stricmp(value, "1") == 0 - || stricmp(value, "on") == 0 - || stricmp(value, "yes") == 0) { + if (istrcmp(value, "true") == 0 + || istrcmp(value, "1") == 0 + || istrcmp(value, "on") == 0 + || istrcmp(value, "yes") == 0) { r = 1; - } else if (stricmp(value, "false") == 0 - || stricmp(value, "0") == 0 - || stricmp(value, "off") == 0 - || stricmp(value, "no") == 0) { + } else if (istrcmp(value, "false") == 0 + || istrcmp(value, "0") == 0 + || istrcmp(value, "off") == 0 + || istrcmp(value, "no") == 0) { r = 0; } else { r = -1; diff --git a/platform/file_access.cpp b/platform/file_access.cpp index 462d046..266a532 100644 --- a/platform/file_access.cpp +++ b/platform/file_access.cpp @@ -1,5 +1,6 @@ #include "platform.h" - +#include +#include #include #include #include "../libs/logfile.h" @@ -8,11 +9,15 @@ std::filesystem::path break_and_compose_path(const std::string_view &pathname, char sep) { auto p = pathname.rfind(sep); if (p == pathname.npos) { - if (pathname == "." || pathname == "..") return std::filesystem::canonical("."); - else if (pathname.empty()) return std::filesystem::current_path().root_path(); - else if (pathname == std::filesystem::current_path().root_name()) - return pathname; - else return std::filesystem::current_path()/pathname; + if (pathname == "." || pathname == "..") { + return std::filesystem::canonical("."); + } else if (pathname.empty()) { + return std::filesystem::current_path().root_path(); + } else if (pathname == std::filesystem::current_path().root_name()) { + return std::filesystem::current_path().root_path(); + } else { + return std::filesystem::current_path()/pathname; + } } return break_and_compose_path(pathname.substr(0,p), sep) / pathname.substr(p+1); @@ -44,7 +49,11 @@ std::filesystem::path try_to_find_file(const std::filesystem::path &p) { while (iter != end) { const std::filesystem::directory_entry &e = *iter; auto fn = e.path().filename(); - if (stricmp(n.c_str(), fn.c_str()) == 0) { + #ifdef _WIN32 + if (_wcsicmp(n.c_str(), fn.c_str()) == 0) { + #else + if (istrcmp(n.c_str(), fn.c_str()) == 0) { + #endif return e.path(); } ++iter; @@ -65,13 +74,13 @@ char check_file_exists(const char *pathname) { const char *file_icase_find(const char *pathname) { static std::string p; std::filesystem::path path = try_to_find_file(convert_pathname_to_path(pathname)); - p = path; + p = path.string(); return p.c_str(); } FILE *fopen_icase(const char *pathname, const char *mode) { std::filesystem::path path = try_to_find_file(convert_pathname_to_path(pathname)); - return fopen(path.c_str(), mode); + return fopen(path.string().c_str(), mode); } static thread_local std::string build_pathname_buffer; @@ -86,7 +95,7 @@ const char * build_pathname(size_t nparts, const char *part1, ...) { for (size_t i = 1; i < nparts; ++i) { p = p / va_arg(lst, const char *); } - build_pathname_buffer = p; + build_pathname_buffer = p.string(); SEND_LOG("(BUILD_PATHNAME) %s", build_pathname_buffer.c_str()); return build_pathname_buffer.c_str(); } @@ -112,8 +121,13 @@ int list_files(const char *directory, int type, LIST_FILES_CALLBACK cb, void *ct int r = 0; const auto &entry = *iter; const char *name; - if (type & file_type_just_name) name = entry.path().filename().c_str(); - else name = entry.path().filename().c_str(); + std::string tmp; + if (type & file_type_just_name) { + tmp = entry.path().filename().string(); + } else { + tmp = entry.path().string(); + } + name = tmp.c_str(); if (entry.is_regular_file(ec) && (type & file_type_normal)) { r = cb(name, file_type_normal, entry.file_size(ec), ctx); } else if (entry.is_directory(ec)) { diff --git a/platform/istr.c b/platform/istr.c index 042e2c6..65e155c 100644 --- a/platform/istr.c +++ b/platform/istr.c @@ -1,7 +1,7 @@ #include "platform.h" #include -int stricmp(const char *a, const char *b) { +int istrcmp(const char *a, const char *b) { while (*a && *b) { char ca = toupper(*a); char cb = toupper(*b); @@ -15,7 +15,7 @@ int stricmp(const char *a, const char *b) { return 0; } -void strupr(char *c) { +void strupper(char *c) { while (*c) { *c = toupper(*c); ++c; diff --git a/platform/platform.h b/platform/platform.h index 6434934..db75203 100644 --- a/platform/platform.h +++ b/platform/platform.h @@ -7,6 +7,18 @@ #define BGSWITCHBIT 0x8000 +#ifdef _MSC_VER +#pragma warning(disable: 4244) +#pragma warning(disable: 4996) +#pragma warning(disable: 4459) +#pragma warning(disable: 4267) +#pragma warning(disable: 4100) +#pragma warning(disable: 4456) +#define CASE_FALLTHROUGH +#else +#define CASE_FALLTHROUGH [[fallthrough]] +#endif + #define SKELDALINI "skeldal.ini" @@ -72,11 +84,11 @@ char check_file_exists(const char *pathname); FILE *fopen_icase(const char *pathname, const char *mode); const char *file_icase_find(const char *pathname); -int stricmp(const char *a, const char *b); +int istrcmp(const char *a, const char *b); int imatch(const char *haystack, const char *needle); #define MIN(a, b) ((a)<(b)?(a):(b)) #define MAX(a, b) ((a)>(b)?(a):(b)) -void strupr(char *c); +void strupper(char *c); const char * int2ascii(int i, char *c, int radix); int get_timer_value(void); diff --git a/platform/save_folder.h b/platform/save_folder.h index 5cacad7..a7545ca 100644 --- a/platform/save_folder.h +++ b/platform/save_folder.h @@ -4,7 +4,7 @@ extern "C" { #endif -#define SAVEGAME_FOLDERNAME "Skeldal"; +#define SAVEGAME_FOLDERNAME "Skeldal" const char *get_default_savegame_directory(void); diff --git a/platform/sdl/BGraph2.cpp b/platform/sdl/BGraph2.cpp index 542dda5..8656819 100644 --- a/platform/sdl/BGraph2.cpp +++ b/platform/sdl/BGraph2.cpp @@ -21,9 +21,9 @@ char game_display_init(const INI_CONFIG_SECTION *display_section, const char *ti } cfg.fullscreen = ini_get_boolean(display_section, "fullscreen", 1) == 1; const char *comp = ini_get_string(display_section, "composer", "auto"); - if (stricmp(comp, "hardware") == 0 || stricmp(comp, "hw") == 0) { + if (istrcmp(comp, "hardware") == 0 || istrcmp(comp, "hw") == 0) { cfg.composer = SDL_RENDERER_ACCELERATED; - } else if (stricmp(comp, "software") == 0 || stricmp(comp, "sw") == 0) { + } else if (istrcmp(comp, "software") == 0 || istrcmp(comp, "sw") == 0) { cfg.composer = SDL_RENDERER_SOFTWARE; } else { cfg.composer = 0; @@ -33,11 +33,11 @@ char game_display_init(const INI_CONFIG_SECTION *display_section, const char *ti cfg.window_width = ini_get_int(display_section, "window_width", 640); const char *filter = ini_get_string(display_section, "crt_filter", "auto"); - if (stricmp(filter,"none") == 0) cfg.crt_filter = SDLContext::CrtFilterType::none; - else if (stricmp(filter,"scanlines") == 0) cfg.crt_filter = SDLContext::CrtFilterType::scanlines; - else if (stricmp(filter,"scanlines_2") == 0) cfg.crt_filter = SDLContext::CrtFilterType::scanlines_2; - else if (stricmp(filter,"rgbmatrix_2") == 0) cfg.crt_filter = SDLContext::CrtFilterType::rgb_matrix_2; - else if (stricmp(filter,"rgbmatrix_3") == 0) cfg.crt_filter = SDLContext::CrtFilterType::rgb_matrix_3; + if (istrcmp(filter,"none") == 0) cfg.crt_filter = SDLContext::CrtFilterType::none; + else if (istrcmp(filter,"scanlines") == 0) cfg.crt_filter = SDLContext::CrtFilterType::scanlines; + else if (istrcmp(filter,"scanlines_2") == 0) cfg.crt_filter = SDLContext::CrtFilterType::scanlines_2; + else if (istrcmp(filter,"rgbmatrix_2") == 0) cfg.crt_filter = SDLContext::CrtFilterType::rgb_matrix_2; + else if (istrcmp(filter,"rgbmatrix_3") == 0) cfg.crt_filter = SDLContext::CrtFilterType::rgb_matrix_3; else cfg.crt_filter = SDLContext::CrtFilterType::autoselect; diff --git a/platform/sdl/CMakeLists.txt b/platform/sdl/CMakeLists.txt index da07b3a..ed2cb06 100644 --- a/platform/sdl/CMakeLists.txt +++ b/platform/sdl/CMakeLists.txt @@ -1,4 +1,4 @@ -add_subdirectory(tests) +#add_subdirectory(tests) add_library(skeldal_sdl sdl_context.cpp diff --git a/platform/sdl/sdl_context.cpp b/platform/sdl/sdl_context.cpp index 58e178e..67e8191 100644 --- a/platform/sdl/sdl_context.cpp +++ b/platform/sdl/sdl_context.cpp @@ -184,7 +184,7 @@ void SDLContext::init_video(const VideoConfig &config, const char *title) { SDL_RendererInfo rinfo; SDL_GetRendererInfo(renderer, &rinfo); - if (stricmp(config.scale_quality, "auto") == 0) { + if (istrcmp(config.scale_quality, "auto") == 0) { if (rinfo.flags & SDL_RENDERER_ACCELERATED) { SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best"); } diff --git a/platform/sdl/sdl_context.h b/platform/sdl/sdl_context.h index 16980a2..396d670 100644 --- a/platform/sdl/sdl_context.h +++ b/platform/sdl/sdl_context.h @@ -2,8 +2,9 @@ #include #include -#include +#include #include +#include #include #include #include diff --git a/platform/sdl/sound.cpp b/platform/sdl/sound.cpp index 97f1300..6b1df9c 100644 --- a/platform/sdl/sound.cpp +++ b/platform/sdl/sound.cpp @@ -7,7 +7,7 @@ #include #include - +#include #include #define countof(array) (sizeof(array)/sizeof(array[0])) @@ -96,7 +96,7 @@ void set_channel_volume(int channel,int left,int right) { vp.left = l; vp.right = r; sound_mixer.visit_track(channel, [&](WaveMixer<2> &mx){ - mx.set_channel_volumes_fade(make_channel_volume(vp.left, vp.right), {2e-4,2e-4}); + mx.set_channel_volumes_fade(make_channel_volume(vp.left, vp.right), {2e-4f,2e-4f}); }); } diff --git a/platform/windows/app_start.cpp b/platform/windows/app_start.cpp new file mode 100644 index 0000000..531819a --- /dev/null +++ b/platform/windows/app_start.cpp @@ -0,0 +1,73 @@ +#include "../../game/skeldal.h" +#include "../getopt.h" +#include "../platform.h" +#include +#include + +void show_help(const char *arg0) { + printf( + "Brany Skeldalu (Gates of Skeldal) portable game player\n" + "Copyright (c) 2025 Ondrej Novak. All rights reserved.\n\n" + "This work is licensed under the terms of the MIT license.\n" + "For a copy, see .\n" + "\n" + "Usage:" + ); + printf("%s [-f ] [-a ] [-l ] [-s ] [-h]\n\n", arg0); + + printf("-f path to configuration file\n" + "-a path for adventure file (.adv)\n" + "-l set language (cz|en)" + "-s generate string-tables (for localization) and exit\n" + "-h this help\n"); + exit(0); +} + +void show_help_short() { + printf("Use -h for help\n"); +} + + +int main(int argc, char **argv) { + std::string config_name = SKELDALINI; + std::string adv_config_file; + std::string gen_stringtable_path; + std::string lang; + for (int optchr = -1; (optchr = getopt(argc, argv, "hf:a:s:l:")) != -1; ) { + switch (optchr) { + case 'f': config_name = optarg;break; + case 'a': adv_config_file = optarg;break; + case 'h': show_help(argv[0]);break; + case 'l': lang = optarg;break; + case 's': gen_stringtable_path = optarg;break; + default: show_help_short(); + return 1; + } + } + + SKELDAL_CONFIG cfg; + cfg.short_help = show_help_short; + cfg.show_error = [](const char *txt) { + std::cerr << "ERROR: " << txt << std::endl; + }; + cfg.adventure_path = adv_config_file.empty()?NULL:adv_config_file.c_str(); + cfg.config_path = config_name.c_str(); + cfg.lang_path = lang.empty()?NULL:lang.c_str(); + try { + + if (!gen_stringtable_path.empty()) { + skeldal_gen_string_table_entry_point(&cfg, gen_stringtable_path.c_str()); + return 0; + } else { + return skeldal_entry_point(&cfg); + } + + } catch (const std::exception &e) { + std::cerr << "ERROR: " << e.what() << std::endl; + return 1; + } + + return 0; + +} + diff --git a/platform/windows/map_file.cpp b/platform/windows/map_file.cpp new file mode 100644 index 0000000..a2e8e03 --- /dev/null +++ b/platform/windows/map_file.cpp @@ -0,0 +1,55 @@ + +extern "C" { +#include "map_file.h" +} + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include + +// Funkce pro mapování souboru do paměti +void* map_file_to_memory_cpp(const char *name, size_t *sz) { + if (!name || !sz) { + return NULL; + } + + HANDLE h = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if (h == INVALID_HANDLE_VALUE) throw std::runtime_error(std::string("Failed to open file for mapping: ").append(name)); + + LARGE_INTEGER fsize; + if (!GetFileSizeEx(h, &fsize)) { + CloseHandle(h); + throw std::runtime_error(std::string("failed to get size of file:").append(name)); + } + + + + HANDLE hMapping = CreateFileMapping(h,NULL,PAGE_READONLY,0,0,NULL); + if (hMapping == NULL || hMapping == INVALID_HANDLE_VALUE) { + CloseHandle(h); + throw std::runtime_error(std::string("Failed to create mapping of file:").append(name)); + } + + void *mappedData = MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0); + CloseHandle(h); + CloseHandle(hMapping); + if (mappedData == NULL) { + throw std::runtime_error(std::string("Failed to map file:").append(name)); + } + + *sz = fsize.LowPart; + return mappedData; +} + +void* map_file_to_memory(const char *name, size_t *sz) { + return map_file_to_memory_cpp(name, sz); +} + +// Funkce pro zrušení mapování +void unmap_file(void *ptr, size_t) { + UnmapViewOfFile(ptr); +} diff --git a/platform/windows/map_file.h b/platform/windows/map_file.h new file mode 100644 index 0000000..e4495ed --- /dev/null +++ b/platform/windows/map_file.h @@ -0,0 +1,4 @@ +#include +#include +void *map_file_to_memory(const char *name, size_t *sz); +void unmap_file(void *ptr, size_t sz); diff --git a/platform/windows/save_folder.cpp b/platform/windows/save_folder.cpp index 851b9f1..c0b53c9 100644 --- a/platform/windows/save_folder.cpp +++ b/platform/windows/save_folder.cpp @@ -1,23 +1,22 @@ +#include "../platform.h" #include "../save_folder.h" #include "../error.h" #include #include #include +#include #pragma comment(lib, "shell32.lib") #pragma comment(lib, "ole32.lib") -// Pro získání uživatelské složky namespace fs = std::filesystem; -// Funkce pro získání složky "Saved Games" std::string getSavedGamesDirectory() { PWSTR path = nullptr; - // Použití identifikátoru složky FOLDERID_SavedGames - if (SUCCEEDED(SHGetKnownFolderPathA(FOLDERID_SavedGames, 0, NULL, &path))) { + if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_SavedGames, 0, NULL, &path))) { fs::path savedGamesPath(path); - CoTaskMemFree(path); // Uvolnění paměti - return savedGamesPath / SAVEGAME_FOLDERNAME + CoTaskMemFree(path); + return (savedGamesPath / SAVEGAME_FOLDERNAME).string(); } else { display_error("Failed to retrieve FOLDEROD_SavedGames"); abort(); @@ -25,7 +24,7 @@ std::string getSavedGamesDirectory() { } const char *get_default_savegame_directory() { - static std::string dir = get_default_savgetSavedGamesDirectoryegame_dir(); + static std::string dir = getSavedGamesDirectory(); return dir.c_str(); }