From 3d8ee275e4e2cc3513a2c63069415b5a991702e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Nov=C3=A1k?= Date: Sat, 8 Feb 2025 19:27:47 +0100 Subject: [PATCH] linux release build, cleanup repository --- AdvMan/AdvMan.cpp | 187 - AdvMan/AdvMan.h | 55 - AdvMan/AdvMan.rc | 569 ---- AdvMan/AdvMan.sln | 21 - AdvMan/AdvMan.vcproj | 525 --- AdvMan/ChildView.cpp | 57 - AdvMan/ChildView.h | 51 - AdvMan/DlgDialogy.cpp | 264 -- AdvMan/DlgDialogy.h | 76 - AdvMan/DlgNoveDobr.cpp | 83 - AdvMan/DlgNoveDobr.h | 57 - AdvMan/DlgNovyDialog.cpp | 127 - AdvMan/DlgNovyDialog.h | 57 - AdvMan/FS_tasker.h | 0 AdvMan/MainFrm.cpp | 677 ---- AdvMan/MainFrm.h | 95 - AdvMan/Pathname.cpp | 621 ---- AdvMan/Pathname.h | 451 --- AdvMan/StdAfx.cpp | 8 - AdvMan/StdAfx.h | 33 - AdvMan/bgraph2dx.h | 0 AdvMan/debug.h | 0 AdvMan/idc_note.ico | Bin 2550 -> 0 bytes AdvMan/mem.h | 4 - AdvMan/res/AdvMan.ico | Bin 1078 -> 0 bytes AdvMan/res/AdvMan.rc2 | 13 - AdvMan/res/Toolbar.bmp | Bin 886 -> 0 bytes AdvMan/res/editory.bmp | Bin 838 -> 0 bytes AdvMan/res/prekladace.bmp | Bin 478 -> 0 bytes AdvMan/resource.h | 88 - AdvMan/skeldal_win.h | 4 - CMakeLists.txt | 2 +- DDLReader/DDLFile.cpp | 93 - DDLReader/DDLFile.h | 45 - DDLReader/DDLReader.cpp | 67 - DDLReader/DDLReader.h | 49 - DDLReader/DDLReader.rc | 278 -- DDLReader/DDLReader.sln | 34 - DDLReader/DDLReader.vcproj | 291 -- DDLReader/DDLReaderDlg.cpp | 533 --- DDLReader/DDLReaderDlg.h | 76 - DDLReader/DlgProgress.cpp | 41 - DDLReader/DlgProgress.h | 28 - DDLReader/IWStringEffect.h | 36 - .../Projects/Skeldal/DDLReader/DDLFile.cpp | 93 - .../Projects/Skeldal/DDLReader/DDLFile.h | 45 - .../Projects/Skeldal/DDLReader/DDLReader.cpp | 67 - .../Projects/Skeldal/DDLReader/DDLReader.h | 49 - .../Projects/Skeldal/DDLReader/DDLReader.rc | 278 -- .../Projects/Skeldal/DDLReader/DDLReader.sln | 34 - .../Skeldal/DDLReader/DDLReader.vcproj | 291 -- .../Skeldal/DDLReader/DDLReaderDlg.cpp | 533 --- .../Projects/Skeldal/DDLReader/DDLReaderDlg.h | 76 - .../Skeldal/DDLReader/DlgProgress.cpp | 41 - .../Projects/Skeldal/DDLReader/DlgProgress.h | 28 - .../Skeldal/DDLReader/IWStringEffect.h | 36 - .../Projects/Skeldal/DDLReader/StdAfx.cpp | 8 - DDLReader/Projects/Skeldal/DDLReader/StdAfx.h | 27 - .../Projects/Skeldal/DDLReader/WPathname.cpp | 408 --- .../Projects/Skeldal/DDLReader/WPathname.h | 400 --- .../Projects/Skeldal/DDLReader/WString.cpp | 193 -- .../Projects/Skeldal/DDLReader/WString.h | 496 --- .../Skeldal/DDLReader/WStringMemory.cpp | 397 --- .../Skeldal/DDLReader/WStringMemory.h | 61 - .../Skeldal/DDLReader/WStringProxy.cpp | 185 - .../Projects/Skeldal/DDLReader/WStringProxy.h | 232 -- .../Skeldal/DDLReader/res/DDLReader.ico | Bin 1078 -> 0 bytes .../Projects/Skeldal/DDLReader/resource.h | 49 - DDLReader/StdAfx.cpp | 8 - DDLReader/StdAfx.h | 27 - DDLReader/WPathname.cpp | 408 --- DDLReader/WPathname.h | 400 --- DDLReader/WString.cpp | 194 -- DDLReader/WString.h | 496 --- DDLReader/WStringMemory.cpp | 397 --- DDLReader/WStringMemory.h | 61 - DDLReader/WStringProxy.cpp | 185 - DDLReader/WStringProxy.h | 232 -- DDLReader/res/DDLReader.ico | Bin 1078 -> 0 bytes DDLReader/res/DDLReader.rc2 | 13 - DDLReader/resource.h | 49 - FONT/BIG.FON | Bin 12309 -> 0 bytes FONT/BIG2.FON | Bin 12064 -> 0 bytes FONT/BOLDCZ.FON | Bin 9034 -> 0 bytes FONT/BROOKLIN.FON | Bin 17336 -> 0 bytes FONT/EUROMODE.FON | Bin 12673 -> 0 bytes FONT/FONT4X8.FON | Bin 4496 -> 0 bytes FONT/FONT5X8.FON | Bin 4408 -> 0 bytes FONT/FONT6X9.FON | Bin 5593 -> 0 bytes FONT/IKONES.FON | Bin 8909 -> 0 bytes FONT/KNIHA.FON | Bin 8880 -> 0 bytes FONT/SADA16.FON | Bin 9163 -> 0 bytes FONT/SADA7.FON | Bin 8813 -> 0 bytes FONT/TIMESBIG.FON | Bin 40400 -> 0 bytes FONT/TIMESBIT.FON | Bin 31710 -> 0 bytes FONT/TIMESE.FON | Bin 11547 -> 0 bytes FONT/TINY.FON | Bin 8880 -> 0 bytes FONT/ikony.fon | Bin 4918 -> 0 bytes INST/SETUP.C | 1427 -------- INST/SETUP.H | 18 - INST/SETUPCPY.C | 165 - INST/SETUPCPY.H | 9 - INST/SETUPLIB.C | 505 --- INST/SETUPLIB.H | 22 - INST/SETVIDEO.C | 197 -- INST/SETVIDEO.H | 6 - INST/STUB.C | 53 - INST/TEXTLIB.ASM | 101 - INST/TEXTLIB.C | 4 - MAPS/CDIALOGY.C | 585 ---- MAPS/DLGPRINT.C | 188 - MAPS/DUMP.C | 78 - MAPS/DUMP.H | 1 - MAPS/EDIT_MAP.C | 1179 ------- MAPS/EDIT_MAP.H | 21 - MAPS/GLOBALS.H | 133 - MAPS/ITEMS.C | 1012 ------ MAPS/ITEMS2.C | 1707 ---------- MAPS/MAPEDIT.C | 977 ------ MAPS/MAPY.C | 1108 ------ MAPS/MAPY.H | 631 ---- MAPS/MOB_EDIT.C | 1184 ------- MAPS/MOB_EDIT.H | 20 - MAPS/PCXVIEW.C | 459 --- MAPS/SAVE_MAP.C | 694 ---- MAPS/SAVE_MAP.H | 14 - MAPS/STENY.C | 542 --- MAPS/STENY.H | 33 - MAPS/WIN_TEST.C | 175 - MAPS/WIZ_TOOL.C | 3010 ----------------- MAPS/WIZ_TOOL.H | 5 - PCX/3DMAN.C | 102 - PCX/BOLDCZ.FON | Bin 8730 -> 0 bytes PCX/PCX.C | 180 - PCX/PCX.H | 25 - PCX/PCXTST.C | 173 - PCX/PODLAHY.C | 330 -- UTILS/ITEMLIST.C | 328 -- UTILS/Podlahar/Podlahar.cpp | 73 - UTILS/Podlahar/Podlahar.h | 31 - UTILS/Podlahar/Podlahar.rc | 200 -- UTILS/Podlahar/Podlahar.vcproj | 193 -- UTILS/Podlahar/PodlaharDlg.cpp | 161 - UTILS/Podlahar/PodlaharDlg.h | 34 - UTILS/Podlahar/Resource.h | 23 - UTILS/Podlahar/res/Podlahar.ico | Bin 21630 -> 0 bytes UTILS/Podlahar/res/Podlahar.rc2 | 13 - UTILS/Podlahar/stdafx.cpp | 7 - UTILS/Podlahar/stdafx.h | 43 - VIDEO/ANIPACK.ASM | 318 -- VIDEO/ANIPACK.H | 39 - VIDEO/BITLINE.ASM | 342 -- VIDEO/BITLINE.H | 16 - VIDEO/BOLDCZ.FON | Bin 9034 -> 0 bytes VIDEO/CINEMA.H | 8 - VIDEO/CNMBUILD.C | 667 ---- VIDEO/CNMCONTR.C | 74 - VIDEO/FLC.C | 202 -- VIDEO/FLC.H | 62 - VIDEO/FLC/ANALYSE/DOSMEM.C | 71 - VIDEO/FLC/ANALYSE/DOSMEM.H | 46 - VIDEO/FLC/ANALYSE/FLC.C | 5 - VIDEO/FLC/ANALYSE/FLC.H | 54 - VIDEO/FLC/ANALYSE/PLAY.C | 54 - VIDEO/FLC/ANALYSE/VESA.C | 296 -- VIDEO/FLC/ANALYSE/VESA.H | 70 - VIDEO/FLC/ANALYSE/VESA_.ASM | 63 - VIDEO/FLC/DOSMEM.C | 71 - VIDEO/FLC/DOSMEM.H | 46 - VIDEO/FLC/FLC.C | 176 - VIDEO/FLC/FLC.H | 61 - VIDEO/FLC/PLAY.C | 54 - VIDEO/FLC/VESA.C | 296 -- VIDEO/FLC/VESA.H | 70 - VIDEO/FLC/VESA_.ASM | 63 - VIDEO/FLC2MGIF.C | 620 ---- VIDEO/JPEGMGFA.ASM | 119 - VIDEO/JPEGMGIF.C | 172 - VIDEO/JPEGMGIF.H | 10 - VIDEO/JPEG_SIM.C | 252 -- VIDEO/LZW.C | 225 -- VIDEO/LZW.H | 5 - VIDEO/LZWA.ASM | 55 - VIDEO/LZWC.C | 261 -- VIDEO/LZW_EX.C | 92 - VIDEO/MGFPLAYA.ASM | 500 --- VIDEO/MGFSOUND.C | 558 --- VIDEO/MGIF.C | 646 ---- VIDEO/MGIF98.C | 376 -- VIDEO/MGIFCAT.C | 216 -- VIDEO/MGIFEACT.C | 906 ----- VIDEO/MGIFEACT.H | 98 - VIDEO/MGIFEBLD.C | 426 --- VIDEO/MGIFEBLD.H | 9 - VIDEO/MGIFEDIT.C | 905 ----- VIDEO/MGIFEDIT.H | 40 - VIDEO/MGIFEOBJ.C | 275 -- VIDEO/MGIFEOBJ.H | 6 - VIDEO/MGIFPLAY.C | 331 -- VIDEO/OLD/MGIFMEM.C | 209 -- VIDEO/OLD/MGIFMEM.H | 21 - VIDEO/PCX2MGIF.C | 892 ----- VIDEO/PLAY.C | 54 - VIDEO/PLAYCNM.C | 356 -- VIDEO/SADA7.FON | Bin 8815 -> 0 bytes VIDEO/VIDEO.C | 102 - Windows/BGraph2Dx.cpp | 684 ---- Windows/BGraph2Dx.h | 58 - Windows/BOLDCZ.FON | Bin 9034 -> 0 bytes Windows/FCS_Tasker.c | 209 -- Windows/FCS_Tasker.h | 32 - Windows/Music.cpp | 507 --- Windows/Music.h | 121 - Windows/Skeldal.rc | 499 --- Windows/StdAfx.cpp | 8 - Windows/StdAfx.h | 26 - Windows/WAInputPlugin.cpp | 632 ---- Windows/WAInputPlugin.h | 130 - Windows/WAPlayer.cpp | 74 - Windows/WAPlayer.h | 23 - Windows/WaveOut.cpp | 157 - Windows/WaveOut.h | 52 - Windows/WinAmpInterface.cpp | 27 - Windows/WinAmpInterface.h | 0 Windows/bios.c | 0 Windows/bios.h | 2 - Windows/debug.h | 19 - Windows/extras.rtf | 77 - Windows/fiber_task.h | 21 - Windows/icon.bmp | Bin 1132 -> 0 bytes Windows/icon.ico | Bin 3638 -> 0 bytes Windows/install.cpp | 325 -- Windows/install.h | 5 - Windows/konfig.cpp | 492 --- Windows/konfig.h | 1 - Windows/logo.bmp | Bin 19440 -> 0 bytes Windows/mem.h | 2 - Windows/plugins.rtf | 0 Windows/resource.h | 139 - Windows/richview.cpp | 91 - Windows/richview.h | 1 - Windows/seladv_male.bmp | Bin 25078 -> 0 bytes Windows/skeldal_win.c | 199 -- Windows/skeldal_win.h | 52 - Windows/uvodni.bmp | Bin 308280 -> 0 bytes Windows/uvodni.cpp | 322 -- Windows/uvodni.h | 11 - Windows/uvodni_sel.bmp | Bin 40520 -> 0 bytes Windows/wa_ipc.h | 1028 ------ Windows/winamp/In2.h | 103 - Windows/winamp/Out.h | 62 - Windows/zvuk_win.cpp | 95 - ZVUK/ANALYSE/DOSMEM.C | 71 - ZVUK/ANALYSE/DOSMEM.H | 46 - ZVUK/ANALYSE/FLC.C | 5 - ZVUK/ANALYSE/FLC.H | 54 - ZVUK/ANALYSE/PLAY.C | 54 - ZVUK/ANALYSE/VESA.C | 296 -- ZVUK/ANALYSE/VESA.H | 70 - ZVUK/ANALYSE/VESA_.ASM | 63 - ZVUK/DOSMEM.C | 71 - ZVUK/DOSMEM.H | 46 - ZVUK/EXAMPLE.ASM | 67 - ZVUK/FLC.C | 176 - ZVUK/FLC.H | 61 - ZVUK/PLAY.C | 54 - ZVUK/SNDPACK.C | 254 -- ZVUK/SPK_TEST.C | 74 - ZVUK/TRACK.C | 834 ----- ZVUK/VESA.C | 296 -- ZVUK/VESA.H | 70 - ZVUK/VESA_.ASM | 63 - ZVUK/ZVUK1.C | 872 ----- ZVUK/ZVUK1A.ASM | 271 -- ZVUK/ZVUK2A.ASM | 741 ---- ZVUK/zvuk.c | 1425 -------- ZVUK/zvuk.h | 74 - ZVUK/zvuk_dx.cpp | 842 ----- ZVUK/zvuka.asm | 1247 ------- game/CMakeLists.txt | 10 +- game/automap.c | 3 +- game/builder.c | 16 +- game/console.c | 6 +- game/default_font.h | 5 - game/default_font.in.cpp | 14 - game/default_font_to_cpp.cmake | 4 - game/dialogy.c | 12 +- game/enemy.c | 12 +- game/gamesave.c | 6 +- game/globals.h | 2 +- game/globmap.c | 6 +- AdvMan/FCS_tasker.h => game/icon.base64 | 0 game/icon.bmp | Bin 0 -> 630 bytes game/interfac.c | 6 +- game/inv.c | 8 +- game/kniha.c | 4 +- game/kouzla.c | 22 +- game/macros.c | 6 +- game/menu.c | 2 +- game/realgame.c | 4 +- game/resources.h | 8 + game/resources.in.cpp | 21 + game/resources_to_cpp.cmake | 5 + game/setup.c | 2 +- game/skeldal.c | 25 +- game/souboje.c | 6 +- game/specproc.c | 11 +- game/temp_storage.cpp | 2 +- game/transav.c | 4 +- game/wizard.c | 2 +- insteng/SETUP.C | 1462 -------- insteng/SETUP.H | 18 - insteng/SETUPCPY.C | 165 - insteng/SETUPCPY.H | 9 - insteng/SETUPLIB.C | 505 --- insteng/SETUPLIB.H | 22 - insteng/SETVIDEO.C | 210 -- insteng/SETVIDEO.H | 6 - insteng/STUB.C | 53 - insteng/TEXTLIB.ASM | 101 - insteng/TEXTLIB.C | 4 - libs/basicobj.c | 3 +- libs/cspells.c | 2 +- libs/file_to_base64.cpp | 9 +- libs/gui.c | 6 +- libs/inicfg.c | 2 +- libs/memman.c | 4 +- libs/pady.c | 136 +- libs/pcx.c | 7 +- mapedit/CDialogy/CDialogy.vcproj | 204 -- mapedit/CDialogy/Debug/BuildLog.htm | Bin 30474 -> 0 bytes mapedit/CDialogy/Debug/CDialogy.exe | Bin 532480 -> 0 bytes .../Debug/CDialogy.exe.embed.manifest | 10 - .../Debug/CDialogy.exe.embed.manifest.res | Bin 472 -> 0 bytes .../Debug/CDialogy.exe.intermediate.manifest | 10 - mapedit/CDialogy/Debug/mt.dep | 1 - mapedit/CDialogy/Debug/vc80.idb | Bin 117760 -> 0 bytes mapedit/CDialogy/Debug/vc90.idb | Bin 134144 -> 0 bytes mapedit/CDialogy/Release/BuildLog.htm | Bin 9544 -> 0 bytes mapedit/CDialogy/Release/CDialogy.exe | Bin 85504 -> 0 bytes .../CDialogy.exe.intermediate.manifest | 10 - mapedit/CDialogy/Release/mt.dep | 1 - mapedit/CDialogy/Release/vc80.idb | Bin 117760 -> 0 bytes mapedit/CDialogy/Release/vc90.idb | Bin 125952 -> 0 bytes mapedit/CSpells/CSpells.cpp | 10 - mapedit/CSpells/CSpells.vcproj | 208 -- mapedit/CSpells/Debug/BuildLog.htm | Bin 23022 -> 0 bytes mapedit/CSpells/Debug/CSpells.exe | Bin 514560 -> 0 bytes .../CSpells/Debug/CSpells.exe.embed.manifest | 10 - .../Debug/CSpells.exe.embed.manifest.res | Bin 472 -> 0 bytes .../Debug/CSpells.exe.intermediate.manifest | 10 - mapedit/CSpells/Debug/mt.dep | 1 - mapedit/CSpells/Debug/vc80.idb | Bin 125952 -> 0 bytes mapedit/CSpells/Debug/vc90.idb | Bin 134144 -> 0 bytes mapedit/CSpells/Release/BuildLog.htm | Bin 9048 -> 0 bytes mapedit/CSpells/Release/CSpells.exe | Bin 78336 -> 0 bytes .../Release/CSpells.exe.intermediate.manifest | 10 - mapedit/CSpells/Release/mt.dep | 1 - mapedit/CSpells/Release/vc80.idb | Bin 117760 -> 0 bytes mapedit/CSpells/Release/vc90.idb | Bin 134144 -> 0 bytes mapedit/CSpells/stdafx.cpp | 8 - mapedit/CSpells/stdafx.h | 12 - mapedit/ColEdit/ColEdit.cpp | 72 - mapedit/ColEdit/ColEdit.h | 49 - mapedit/ColEdit/ColEdit.rc | 281 -- mapedit/ColEdit/ColEdit.sln | 21 - mapedit/ColEdit/ColEdit.vcproj | 454 --- mapedit/ColEdit/ColEditDlg.cpp | 489 --- mapedit/ColEdit/ColEditDlg.h | 79 - mapedit/ColEdit/EditPaletteDlg.cpp | 233 -- mapedit/ColEdit/EditPaletteDlg.h | 63 - mapedit/ColEdit/PaletteEditor.cpp | 113 - mapedit/ColEdit/PaletteEditor.h | 61 - mapedit/ColEdit/StdAfx.cpp | 8 - mapedit/ColEdit/StdAfx.h | 26 - mapedit/ColEdit/res/ColEdit.ico | Bin 1078 -> 0 bytes mapedit/ColEdit/res/ColEdit.rc2 | 13 - mapedit/ColEdit/res/down.ico | Bin 766 -> 0 bytes mapedit/ColEdit/res/icon1.ico | Bin 766 -> 0 bytes mapedit/ColEdit/resource.h | 44 - mapedit/ItemIcons/DlgOpen.cpp | 184 - mapedit/ItemIcons/DlgOpen.h | 39 - mapedit/ItemIcons/IconViewerButton.cpp | 86 - mapedit/ItemIcons/IconViewerButton.h | 30 - mapedit/ItemIcons/ItemIcons.cpp | 71 - mapedit/ItemIcons/ItemIcons.h | 31 - mapedit/ItemIcons/ItemIcons.rc | 354 -- mapedit/ItemIcons/ItemIcons.sln | 30 - mapedit/ItemIcons/ItemIcons.vcproj | 208 -- mapedit/ItemIcons/ItemIconsDlg.cpp | 554 --- mapedit/ItemIcons/ItemIconsDlg.h | 69 - mapedit/ItemIcons/res/ItemIcons.ico | Bin 21630 -> 0 bytes mapedit/ItemIcons/res/ItemIcons.rc2 | 13 - mapedit/ItemIcons/resource.h | 66 - mapedit/ItemIcons/stdafx.cpp | 7 - mapedit/ItemIcons/stdafx.h | 46 - mapedit/Lex_Lib/Debug/BuildLog.htm | Bin 21932 -> 0 bytes mapedit/Lex_Lib/Debug/Lex_Lib.exe | Bin 499200 -> 0 bytes .../Lex_Lib/Debug/Lex_Lib.exe.embed.manifest | 10 - .../Debug/Lex_Lib.exe.embed.manifest.res | Bin 472 -> 0 bytes .../Debug/Lex_Lib.exe.intermediate.manifest | 10 - mapedit/Lex_Lib/Debug/mt.dep | 1 - mapedit/Lex_Lib/Debug/vc80.idb | Bin 27648 -> 0 bytes mapedit/Lex_Lib/Debug/vc90.idb | Bin 35840 -> 0 bytes mapedit/Lex_Lib/Lex_Lib.cpp | 10 - mapedit/Lex_Lib/Lex_Lib.vcproj | 208 -- mapedit/Lex_Lib/Release/BuildLog.htm | Bin 8002 -> 0 bytes mapedit/Lex_Lib/Release/Lex_Lib.exe | Bin 69120 -> 0 bytes .../Release/Lex_Lib.exe.intermediate.manifest | 10 - mapedit/Lex_Lib/Release/mt.dep | 1 - mapedit/Lex_Lib/Release/vc80.idb | Bin 27648 -> 0 bytes mapedit/Lex_Lib/Release/vc90.idb | Bin 27648 -> 0 bytes mapedit/Lex_Lib/stdafx.cpp | 8 - mapedit/Lex_Lib/stdafx.h | 12 - mapedit/Podlahar/ColorButton.cpp | 46 - mapedit/Podlahar/ColorButton.h | 26 - mapedit/Podlahar/ImageView.cpp | 64 - mapedit/Podlahar/ImageView.h | 27 - mapedit/Podlahar/Podlahar.cpp | 96 - mapedit/Podlahar/Podlahar.h | 32 - mapedit/Podlahar/Podlahar.rc | 235 -- mapedit/Podlahar/Podlahar.sln | 30 - mapedit/Podlahar/Podlahar.vcproj | 338 -- mapedit/Podlahar/PodlaharDlg.cpp | 260 -- mapedit/Podlahar/PodlaharDlg.h | 62 - mapedit/Podlahar/Podlahy.c | 397 --- mapedit/Podlahar/res/Podlahar.ico | Bin 1078 -> 0 bytes mapedit/Podlahar/res/Podlahar.rc2 | 13 - mapedit/Podlahar/res/Podlahář.ico | Bin 21630 -> 0 bytes mapedit/Podlahar/res/Podlahář.rc2 | 13 - mapedit/Podlahar/resource.h | 39 - mapedit/Podlahar/stdafx.cpp | 7 - mapedit/Podlahar/stdafx.h | 41 - platform/CMakeLists.txt | 6 +- platform/istr.c | 10 + platform/linux/skeldal.sh | 26 + platform/platform.h | 5 +- platform/sdl/BGraph2.cpp | 5 + platform/sdl/BGraph2.h | 2 + platform/sdl/sdl_context.cpp | 15 + platform/sdl/sdl_context.h | 2 + 441 files changed, 280 insertions(+), 65861 deletions(-) delete mode 100644 AdvMan/AdvMan.cpp delete mode 100644 AdvMan/AdvMan.h delete mode 100644 AdvMan/AdvMan.rc delete mode 100644 AdvMan/AdvMan.sln delete mode 100644 AdvMan/AdvMan.vcproj delete mode 100644 AdvMan/ChildView.cpp delete mode 100644 AdvMan/ChildView.h delete mode 100644 AdvMan/DlgDialogy.cpp delete mode 100644 AdvMan/DlgDialogy.h delete mode 100644 AdvMan/DlgNoveDobr.cpp delete mode 100644 AdvMan/DlgNoveDobr.h delete mode 100644 AdvMan/DlgNovyDialog.cpp delete mode 100644 AdvMan/DlgNovyDialog.h delete mode 100644 AdvMan/FS_tasker.h delete mode 100644 AdvMan/MainFrm.cpp delete mode 100644 AdvMan/MainFrm.h delete mode 100644 AdvMan/Pathname.cpp delete mode 100644 AdvMan/Pathname.h delete mode 100644 AdvMan/StdAfx.cpp delete mode 100644 AdvMan/StdAfx.h delete mode 100644 AdvMan/bgraph2dx.h delete mode 100644 AdvMan/debug.h delete mode 100644 AdvMan/idc_note.ico delete mode 100644 AdvMan/mem.h delete mode 100644 AdvMan/res/AdvMan.ico delete mode 100644 AdvMan/res/AdvMan.rc2 delete mode 100644 AdvMan/res/Toolbar.bmp delete mode 100644 AdvMan/res/editory.bmp delete mode 100644 AdvMan/res/prekladace.bmp delete mode 100644 AdvMan/resource.h delete mode 100644 AdvMan/skeldal_win.h delete mode 100644 DDLReader/DDLFile.cpp delete mode 100644 DDLReader/DDLFile.h delete mode 100644 DDLReader/DDLReader.cpp delete mode 100644 DDLReader/DDLReader.h delete mode 100644 DDLReader/DDLReader.rc delete mode 100644 DDLReader/DDLReader.sln delete mode 100644 DDLReader/DDLReader.vcproj delete mode 100644 DDLReader/DDLReaderDlg.cpp delete mode 100644 DDLReader/DDLReaderDlg.h delete mode 100644 DDLReader/DlgProgress.cpp delete mode 100644 DDLReader/DlgProgress.h delete mode 100644 DDLReader/IWStringEffect.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLFile.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLFile.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLReader.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLReader.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLReader.rc delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLReader.sln delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLReader.vcproj delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLReaderDlg.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DDLReaderDlg.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DlgProgress.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/DlgProgress.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/IWStringEffect.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/StdAfx.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/StdAfx.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/WPathname.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/WPathname.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/WString.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/WString.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/WStringMemory.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/WStringMemory.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/WStringProxy.cpp delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/WStringProxy.h delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/res/DDLReader.ico delete mode 100644 DDLReader/Projects/Skeldal/DDLReader/resource.h delete mode 100644 DDLReader/StdAfx.cpp delete mode 100644 DDLReader/StdAfx.h delete mode 100644 DDLReader/WPathname.cpp delete mode 100644 DDLReader/WPathname.h delete mode 100644 DDLReader/WString.cpp delete mode 100644 DDLReader/WString.h delete mode 100644 DDLReader/WStringMemory.cpp delete mode 100644 DDLReader/WStringMemory.h delete mode 100644 DDLReader/WStringProxy.cpp delete mode 100644 DDLReader/WStringProxy.h delete mode 100644 DDLReader/res/DDLReader.ico delete mode 100644 DDLReader/res/DDLReader.rc2 delete mode 100644 DDLReader/resource.h delete mode 100644 FONT/BIG.FON delete mode 100644 FONT/BIG2.FON delete mode 100644 FONT/BOLDCZ.FON delete mode 100644 FONT/BROOKLIN.FON delete mode 100644 FONT/EUROMODE.FON delete mode 100644 FONT/FONT4X8.FON delete mode 100644 FONT/FONT5X8.FON delete mode 100644 FONT/FONT6X9.FON delete mode 100644 FONT/IKONES.FON delete mode 100644 FONT/KNIHA.FON delete mode 100644 FONT/SADA16.FON delete mode 100644 FONT/SADA7.FON delete mode 100644 FONT/TIMESBIG.FON delete mode 100644 FONT/TIMESBIT.FON delete mode 100644 FONT/TIMESE.FON delete mode 100644 FONT/TINY.FON delete mode 100644 FONT/ikony.fon delete mode 100644 INST/SETUP.C delete mode 100644 INST/SETUP.H delete mode 100644 INST/SETUPCPY.C delete mode 100644 INST/SETUPCPY.H delete mode 100644 INST/SETUPLIB.C delete mode 100644 INST/SETUPLIB.H delete mode 100644 INST/SETVIDEO.C delete mode 100644 INST/SETVIDEO.H delete mode 100644 INST/STUB.C delete mode 100644 INST/TEXTLIB.ASM delete mode 100644 INST/TEXTLIB.C delete mode 100644 MAPS/CDIALOGY.C delete mode 100644 MAPS/DLGPRINT.C delete mode 100644 MAPS/DUMP.C delete mode 100644 MAPS/DUMP.H delete mode 100644 MAPS/EDIT_MAP.C delete mode 100644 MAPS/EDIT_MAP.H delete mode 100644 MAPS/GLOBALS.H delete mode 100644 MAPS/ITEMS.C delete mode 100644 MAPS/ITEMS2.C delete mode 100644 MAPS/MAPEDIT.C delete mode 100644 MAPS/MAPY.C delete mode 100644 MAPS/MAPY.H delete mode 100644 MAPS/MOB_EDIT.C delete mode 100644 MAPS/MOB_EDIT.H delete mode 100644 MAPS/PCXVIEW.C delete mode 100644 MAPS/SAVE_MAP.C delete mode 100644 MAPS/SAVE_MAP.H delete mode 100644 MAPS/STENY.C delete mode 100644 MAPS/STENY.H delete mode 100644 MAPS/WIN_TEST.C delete mode 100644 MAPS/WIZ_TOOL.C delete mode 100644 MAPS/WIZ_TOOL.H delete mode 100644 PCX/3DMAN.C delete mode 100644 PCX/BOLDCZ.FON delete mode 100644 PCX/PCX.C delete mode 100644 PCX/PCX.H delete mode 100644 PCX/PCXTST.C delete mode 100644 PCX/PODLAHY.C delete mode 100644 UTILS/ITEMLIST.C delete mode 100644 UTILS/Podlahar/Podlahar.cpp delete mode 100644 UTILS/Podlahar/Podlahar.h delete mode 100644 UTILS/Podlahar/Podlahar.rc delete mode 100644 UTILS/Podlahar/Podlahar.vcproj delete mode 100644 UTILS/Podlahar/PodlaharDlg.cpp delete mode 100644 UTILS/Podlahar/PodlaharDlg.h delete mode 100644 UTILS/Podlahar/Resource.h delete mode 100644 UTILS/Podlahar/res/Podlahar.ico delete mode 100644 UTILS/Podlahar/res/Podlahar.rc2 delete mode 100644 UTILS/Podlahar/stdafx.cpp delete mode 100644 UTILS/Podlahar/stdafx.h delete mode 100644 VIDEO/ANIPACK.ASM delete mode 100644 VIDEO/ANIPACK.H delete mode 100644 VIDEO/BITLINE.ASM delete mode 100644 VIDEO/BITLINE.H delete mode 100644 VIDEO/BOLDCZ.FON delete mode 100644 VIDEO/CINEMA.H delete mode 100644 VIDEO/CNMBUILD.C delete mode 100644 VIDEO/CNMCONTR.C delete mode 100644 VIDEO/FLC.C delete mode 100644 VIDEO/FLC.H delete mode 100644 VIDEO/FLC/ANALYSE/DOSMEM.C delete mode 100644 VIDEO/FLC/ANALYSE/DOSMEM.H delete mode 100644 VIDEO/FLC/ANALYSE/FLC.C delete mode 100644 VIDEO/FLC/ANALYSE/FLC.H delete mode 100644 VIDEO/FLC/ANALYSE/PLAY.C delete mode 100644 VIDEO/FLC/ANALYSE/VESA.C delete mode 100644 VIDEO/FLC/ANALYSE/VESA.H delete mode 100644 VIDEO/FLC/ANALYSE/VESA_.ASM delete mode 100644 VIDEO/FLC/DOSMEM.C delete mode 100644 VIDEO/FLC/DOSMEM.H delete mode 100644 VIDEO/FLC/FLC.C delete mode 100644 VIDEO/FLC/FLC.H delete mode 100644 VIDEO/FLC/PLAY.C delete mode 100644 VIDEO/FLC/VESA.C delete mode 100644 VIDEO/FLC/VESA.H delete mode 100644 VIDEO/FLC/VESA_.ASM delete mode 100644 VIDEO/FLC2MGIF.C delete mode 100644 VIDEO/JPEGMGFA.ASM delete mode 100644 VIDEO/JPEGMGIF.C delete mode 100644 VIDEO/JPEGMGIF.H delete mode 100644 VIDEO/JPEG_SIM.C delete mode 100644 VIDEO/LZW.C delete mode 100644 VIDEO/LZW.H delete mode 100644 VIDEO/LZWA.ASM delete mode 100644 VIDEO/LZWC.C delete mode 100644 VIDEO/LZW_EX.C delete mode 100644 VIDEO/MGFPLAYA.ASM delete mode 100644 VIDEO/MGFSOUND.C delete mode 100644 VIDEO/MGIF.C delete mode 100644 VIDEO/MGIF98.C delete mode 100644 VIDEO/MGIFCAT.C delete mode 100644 VIDEO/MGIFEACT.C delete mode 100644 VIDEO/MGIFEACT.H delete mode 100644 VIDEO/MGIFEBLD.C delete mode 100644 VIDEO/MGIFEBLD.H delete mode 100644 VIDEO/MGIFEDIT.C delete mode 100644 VIDEO/MGIFEDIT.H delete mode 100644 VIDEO/MGIFEOBJ.C delete mode 100644 VIDEO/MGIFEOBJ.H delete mode 100644 VIDEO/MGIFPLAY.C delete mode 100644 VIDEO/OLD/MGIFMEM.C delete mode 100644 VIDEO/OLD/MGIFMEM.H delete mode 100644 VIDEO/PCX2MGIF.C delete mode 100644 VIDEO/PLAY.C delete mode 100644 VIDEO/PLAYCNM.C delete mode 100644 VIDEO/SADA7.FON delete mode 100644 VIDEO/VIDEO.C delete mode 100644 Windows/BGraph2Dx.cpp delete mode 100644 Windows/BGraph2Dx.h delete mode 100644 Windows/BOLDCZ.FON delete mode 100644 Windows/FCS_Tasker.c delete mode 100644 Windows/FCS_Tasker.h delete mode 100644 Windows/Music.cpp delete mode 100644 Windows/Music.h delete mode 100644 Windows/Skeldal.rc delete mode 100644 Windows/StdAfx.cpp delete mode 100644 Windows/StdAfx.h delete mode 100644 Windows/WAInputPlugin.cpp delete mode 100644 Windows/WAInputPlugin.h delete mode 100644 Windows/WAPlayer.cpp delete mode 100644 Windows/WAPlayer.h delete mode 100644 Windows/WaveOut.cpp delete mode 100644 Windows/WaveOut.h delete mode 100644 Windows/WinAmpInterface.cpp delete mode 100644 Windows/WinAmpInterface.h delete mode 100644 Windows/bios.c delete mode 100644 Windows/bios.h delete mode 100644 Windows/debug.h delete mode 100644 Windows/extras.rtf delete mode 100644 Windows/fiber_task.h delete mode 100644 Windows/icon.bmp delete mode 100644 Windows/icon.ico delete mode 100644 Windows/install.cpp delete mode 100644 Windows/install.h delete mode 100644 Windows/konfig.cpp delete mode 100644 Windows/konfig.h delete mode 100644 Windows/logo.bmp delete mode 100644 Windows/mem.h delete mode 100644 Windows/plugins.rtf delete mode 100644 Windows/resource.h delete mode 100644 Windows/richview.cpp delete mode 100644 Windows/richview.h delete mode 100644 Windows/seladv_male.bmp delete mode 100644 Windows/skeldal_win.c delete mode 100644 Windows/skeldal_win.h delete mode 100644 Windows/uvodni.bmp delete mode 100644 Windows/uvodni.cpp delete mode 100644 Windows/uvodni.h delete mode 100644 Windows/uvodni_sel.bmp delete mode 100644 Windows/wa_ipc.h delete mode 100644 Windows/winamp/In2.h delete mode 100644 Windows/winamp/Out.h delete mode 100644 Windows/zvuk_win.cpp delete mode 100644 ZVUK/ANALYSE/DOSMEM.C delete mode 100644 ZVUK/ANALYSE/DOSMEM.H delete mode 100644 ZVUK/ANALYSE/FLC.C delete mode 100644 ZVUK/ANALYSE/FLC.H delete mode 100644 ZVUK/ANALYSE/PLAY.C delete mode 100644 ZVUK/ANALYSE/VESA.C delete mode 100644 ZVUK/ANALYSE/VESA.H delete mode 100644 ZVUK/ANALYSE/VESA_.ASM delete mode 100644 ZVUK/DOSMEM.C delete mode 100644 ZVUK/DOSMEM.H delete mode 100644 ZVUK/EXAMPLE.ASM delete mode 100644 ZVUK/FLC.C delete mode 100644 ZVUK/FLC.H delete mode 100644 ZVUK/PLAY.C delete mode 100644 ZVUK/SNDPACK.C delete mode 100644 ZVUK/SPK_TEST.C delete mode 100644 ZVUK/TRACK.C delete mode 100644 ZVUK/VESA.C delete mode 100644 ZVUK/VESA.H delete mode 100644 ZVUK/VESA_.ASM delete mode 100644 ZVUK/ZVUK1.C delete mode 100644 ZVUK/ZVUK1A.ASM delete mode 100644 ZVUK/ZVUK2A.ASM delete mode 100644 ZVUK/zvuk.c delete mode 100644 ZVUK/zvuk.h delete mode 100644 ZVUK/zvuk_dx.cpp delete mode 100644 ZVUK/zvuka.asm delete mode 100644 game/default_font.h delete mode 100644 game/default_font.in.cpp delete mode 100644 game/default_font_to_cpp.cmake rename AdvMan/FCS_tasker.h => game/icon.base64 (100%) create mode 100644 game/icon.bmp create mode 100644 game/resources.h create mode 100644 game/resources.in.cpp create mode 100644 game/resources_to_cpp.cmake delete mode 100644 insteng/SETUP.C delete mode 100644 insteng/SETUP.H delete mode 100644 insteng/SETUPCPY.C delete mode 100644 insteng/SETUPCPY.H delete mode 100644 insteng/SETUPLIB.C delete mode 100644 insteng/SETUPLIB.H delete mode 100644 insteng/SETVIDEO.C delete mode 100644 insteng/SETVIDEO.H delete mode 100644 insteng/STUB.C delete mode 100644 insteng/TEXTLIB.ASM delete mode 100644 insteng/TEXTLIB.C delete mode 100644 mapedit/CDialogy/CDialogy.vcproj delete mode 100644 mapedit/CDialogy/Debug/BuildLog.htm delete mode 100644 mapedit/CDialogy/Debug/CDialogy.exe delete mode 100644 mapedit/CDialogy/Debug/CDialogy.exe.embed.manifest delete mode 100644 mapedit/CDialogy/Debug/CDialogy.exe.embed.manifest.res delete mode 100644 mapedit/CDialogy/Debug/CDialogy.exe.intermediate.manifest delete mode 100644 mapedit/CDialogy/Debug/mt.dep delete mode 100644 mapedit/CDialogy/Debug/vc80.idb delete mode 100644 mapedit/CDialogy/Debug/vc90.idb delete mode 100644 mapedit/CDialogy/Release/BuildLog.htm delete mode 100644 mapedit/CDialogy/Release/CDialogy.exe delete mode 100644 mapedit/CDialogy/Release/CDialogy.exe.intermediate.manifest delete mode 100644 mapedit/CDialogy/Release/mt.dep delete mode 100644 mapedit/CDialogy/Release/vc80.idb delete mode 100644 mapedit/CDialogy/Release/vc90.idb delete mode 100644 mapedit/CSpells/CSpells.cpp delete mode 100644 mapedit/CSpells/CSpells.vcproj delete mode 100644 mapedit/CSpells/Debug/BuildLog.htm delete mode 100644 mapedit/CSpells/Debug/CSpells.exe delete mode 100644 mapedit/CSpells/Debug/CSpells.exe.embed.manifest delete mode 100644 mapedit/CSpells/Debug/CSpells.exe.embed.manifest.res delete mode 100644 mapedit/CSpells/Debug/CSpells.exe.intermediate.manifest delete mode 100644 mapedit/CSpells/Debug/mt.dep delete mode 100644 mapedit/CSpells/Debug/vc80.idb delete mode 100644 mapedit/CSpells/Debug/vc90.idb delete mode 100644 mapedit/CSpells/Release/BuildLog.htm delete mode 100644 mapedit/CSpells/Release/CSpells.exe delete mode 100644 mapedit/CSpells/Release/CSpells.exe.intermediate.manifest delete mode 100644 mapedit/CSpells/Release/mt.dep delete mode 100644 mapedit/CSpells/Release/vc80.idb delete mode 100644 mapedit/CSpells/Release/vc90.idb delete mode 100644 mapedit/CSpells/stdafx.cpp delete mode 100644 mapedit/CSpells/stdafx.h delete mode 100644 mapedit/ColEdit/ColEdit.cpp delete mode 100644 mapedit/ColEdit/ColEdit.h delete mode 100644 mapedit/ColEdit/ColEdit.rc delete mode 100644 mapedit/ColEdit/ColEdit.sln delete mode 100644 mapedit/ColEdit/ColEdit.vcproj delete mode 100644 mapedit/ColEdit/ColEditDlg.cpp delete mode 100644 mapedit/ColEdit/ColEditDlg.h delete mode 100644 mapedit/ColEdit/EditPaletteDlg.cpp delete mode 100644 mapedit/ColEdit/EditPaletteDlg.h delete mode 100644 mapedit/ColEdit/PaletteEditor.cpp delete mode 100644 mapedit/ColEdit/PaletteEditor.h delete mode 100644 mapedit/ColEdit/StdAfx.cpp delete mode 100644 mapedit/ColEdit/StdAfx.h delete mode 100644 mapedit/ColEdit/res/ColEdit.ico delete mode 100644 mapedit/ColEdit/res/ColEdit.rc2 delete mode 100644 mapedit/ColEdit/res/down.ico delete mode 100644 mapedit/ColEdit/res/icon1.ico delete mode 100644 mapedit/ColEdit/resource.h delete mode 100644 mapedit/ItemIcons/DlgOpen.cpp delete mode 100644 mapedit/ItemIcons/DlgOpen.h delete mode 100644 mapedit/ItemIcons/IconViewerButton.cpp delete mode 100644 mapedit/ItemIcons/IconViewerButton.h delete mode 100644 mapedit/ItemIcons/ItemIcons.cpp delete mode 100644 mapedit/ItemIcons/ItemIcons.h delete mode 100644 mapedit/ItemIcons/ItemIcons.rc delete mode 100644 mapedit/ItemIcons/ItemIcons.sln delete mode 100644 mapedit/ItemIcons/ItemIcons.vcproj delete mode 100644 mapedit/ItemIcons/ItemIconsDlg.cpp delete mode 100644 mapedit/ItemIcons/ItemIconsDlg.h delete mode 100644 mapedit/ItemIcons/res/ItemIcons.ico delete mode 100644 mapedit/ItemIcons/res/ItemIcons.rc2 delete mode 100644 mapedit/ItemIcons/resource.h delete mode 100644 mapedit/ItemIcons/stdafx.cpp delete mode 100644 mapedit/ItemIcons/stdafx.h delete mode 100644 mapedit/Lex_Lib/Debug/BuildLog.htm delete mode 100644 mapedit/Lex_Lib/Debug/Lex_Lib.exe delete mode 100644 mapedit/Lex_Lib/Debug/Lex_Lib.exe.embed.manifest delete mode 100644 mapedit/Lex_Lib/Debug/Lex_Lib.exe.embed.manifest.res delete mode 100644 mapedit/Lex_Lib/Debug/Lex_Lib.exe.intermediate.manifest delete mode 100644 mapedit/Lex_Lib/Debug/mt.dep delete mode 100644 mapedit/Lex_Lib/Debug/vc80.idb delete mode 100644 mapedit/Lex_Lib/Debug/vc90.idb delete mode 100644 mapedit/Lex_Lib/Lex_Lib.cpp delete mode 100644 mapedit/Lex_Lib/Lex_Lib.vcproj delete mode 100644 mapedit/Lex_Lib/Release/BuildLog.htm delete mode 100644 mapedit/Lex_Lib/Release/Lex_Lib.exe delete mode 100644 mapedit/Lex_Lib/Release/Lex_Lib.exe.intermediate.manifest delete mode 100644 mapedit/Lex_Lib/Release/mt.dep delete mode 100644 mapedit/Lex_Lib/Release/vc80.idb delete mode 100644 mapedit/Lex_Lib/Release/vc90.idb delete mode 100644 mapedit/Lex_Lib/stdafx.cpp delete mode 100644 mapedit/Lex_Lib/stdafx.h delete mode 100644 mapedit/Podlahar/ColorButton.cpp delete mode 100644 mapedit/Podlahar/ColorButton.h delete mode 100644 mapedit/Podlahar/ImageView.cpp delete mode 100644 mapedit/Podlahar/ImageView.h delete mode 100644 mapedit/Podlahar/Podlahar.cpp delete mode 100644 mapedit/Podlahar/Podlahar.h delete mode 100644 mapedit/Podlahar/Podlahar.rc delete mode 100644 mapedit/Podlahar/Podlahar.sln delete mode 100644 mapedit/Podlahar/Podlahar.vcproj delete mode 100644 mapedit/Podlahar/PodlaharDlg.cpp delete mode 100644 mapedit/Podlahar/PodlaharDlg.h delete mode 100644 mapedit/Podlahar/Podlahy.c delete mode 100644 mapedit/Podlahar/res/Podlahar.ico delete mode 100644 mapedit/Podlahar/res/Podlahar.rc2 delete mode 100644 mapedit/Podlahar/res/Podlahář.ico delete mode 100644 mapedit/Podlahar/res/Podlahář.rc2 delete mode 100644 mapedit/Podlahar/resource.h delete mode 100644 mapedit/Podlahar/stdafx.cpp delete mode 100644 mapedit/Podlahar/stdafx.h create mode 100755 platform/linux/skeldal.sh diff --git a/AdvMan/AdvMan.cpp b/AdvMan/AdvMan.cpp deleted file mode 100644 index 88670a8..0000000 --- a/AdvMan/AdvMan.cpp +++ /dev/null @@ -1,187 +0,0 @@ -// AdvMan.cpp : Defines the class behaviors for the application. -// - -#include "stdafx.h" -#include "AdvMan.h" - -#include "MainFrm.h" -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CAdvManApp - -BEGIN_MESSAGE_MAP(CAdvManApp, CWinApp) - //{{AFX_MSG_MAP(CAdvManApp) - ON_COMMAND(ID_APP_ABOUT, OnAppAbout) - // NOTE - the ClassWizard will add and remove mapping macros here. - // DO NOT EDIT what you see in these blocks of generated code! - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CAdvManApp construction - -CAdvManApp::CAdvManApp() -{ - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - -///////////////////////////////////////////////////////////////////////////// -// The one and only CAdvManApp object - -CAdvManApp theApp; - -///////////////////////////////////////////////////////////////////////////// -// CAdvManApp initialization - -extern "C" -{ -#include "..\crashdump.h" - -int GetExeVersion(); -} - -int GetExeVersion() -{ - return 1; -} - -BOOL CAdvManApp::InitInstance() -{ -InitCrashDump(); - // Standard initialization - // If you are not using these features and wish to reduce the size - // of your final executable, you should remove from the following - // the specific initialization routines you do not need. - -#ifdef _AFXDLL - Enable3dControls(); // Call this when using MFC in a shared DLL -#else - Enable3dControlsStatic(); // Call this when linking to MFC statically -#endif - - // Change the registry key under which our settings are stored. - // TODO: You should modify this string to be something appropriate - // such as the name of your company or organization. - SetRegistryKey(_T("Bredysoft")); - - - // To create the main window, this code creates a new frame window - // object and then sets it as the application's main window object. - - CMainFrame* pFrame = new CMainFrame; - m_pMainWnd = pFrame; - - // create and load the frame with its resources - - pFrame->LoadFrame(IDR_MAINFRAME, - WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, - NULL); - - - - - // The one and only window has been initialized, so show and update it. - pFrame->ShowWindow(SW_SHOW); - pFrame->UpdateWindow(); - - return TRUE; -} - -///////////////////////////////////////////////////////////////////////////// -// CAdvManApp message handlers - - - - - -///////////////////////////////////////////////////////////////////////////// -// CAboutDlg dialog used for App About - -class CAboutDlg : public CDialog -{ -public: - CAboutDlg(); - -// Dialog Data - //{{AFX_DATA(CAboutDlg) - enum { IDD = IDD_ABOUTBOX }; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAboutDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - //{{AFX_MSG(CAboutDlg) - // No message handlers - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) -{ - //{{AFX_DATA_INIT(CAboutDlg) - //}}AFX_DATA_INIT -} - -void CAboutDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CAboutDlg) - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) - //{{AFX_MSG_MAP(CAboutDlg) - // No message handlers - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -// App command to run the dialog -void CAdvManApp::OnAppAbout() -{ - CAboutDlg aboutDlg; - aboutDlg.DoModal(); -} - -///////////////////////////////////////////////////////////////////////////// -// CAdvManApp message handlers - -struct TestDlgInfo -{ - MSG *msg; - BOOL found; - HWND exclude; -}; - -static BOOL WINAPI TestDlgWindows(HWND hWnd, LPARAM lParam) -{ - TestDlgInfo *nfo=(TestDlgInfo *)lParam; - if (hWnd==nfo->exclude) return TRUE; - if (SendMessage(hWnd,WM_APP+9998,0,(LPARAM)nfo->msg) || IsDialogMessage(hWnd,nfo->msg)) - { - nfo->found=TRUE; - return FALSE; - } - return TRUE; -} - -BOOL CAdvManApp::PreTranslateMessage(MSG *pMsg) -{ - TestDlgInfo nfo; - nfo.msg=pMsg; - nfo.found=FALSE; - nfo.exclude=*m_pMainWnd; - - EnumThreadWindows(GetCurrentThreadId(),TestDlgWindows,(LPARAM)&nfo); - return nfo.found; -} diff --git a/AdvMan/AdvMan.h b/AdvMan/AdvMan.h deleted file mode 100644 index f08f54b..0000000 --- a/AdvMan/AdvMan.h +++ /dev/null @@ -1,55 +0,0 @@ -// AdvMan.h : main header file for the ADVMAN application -// - -#if !defined(AFX_ADVMAN_H__A43CD3B3_508C_4DDB_B89C_50FE1291B8B9__INCLUDED_) -#define AFX_ADVMAN_H__A43CD3B3_508C_4DDB_B89C_50FE1291B8B9__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - -///////////////////////////////////////////////////////////////////////////// -// CAdvManApp: -// See AdvMan.cpp for the implementation of this class -// - -class CAdvManApp : public CWinApp -{ -public: - CAdvManApp(); - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAdvManApp) - public: - virtual BOOL InitInstance(); - //}}AFX_VIRTUAL - -// Implementation - -public: - //{{AFX_MSG(CAdvManApp) - afx_msg void OnAppAbout(); - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code ! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() - - virtual BOOL PreTranslateMessage(MSG *pMsg); -}; - - -///////////////////////////////////////////////////////////////////////////// - -extern CAdvManApp theApp; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_ADVMAN_H__A43CD3B3_508C_4DDB_B89C_50FE1291B8B9__INCLUDED_) diff --git a/AdvMan/AdvMan.rc b/AdvMan/AdvMan.rc deleted file mode 100644 index 1d9b914..0000000 --- a/AdvMan/AdvMan.rc +++ /dev/null @@ -1,569 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Czech resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) -#ifdef _WIN32 -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -#pragma code_page(1250) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#endif //_WIN32\r\n" - "#include ""res\\AdvMan.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDR_MAINFRAME BITMAP "res\\Toolbar.bmp" -IDR_TOOLEDITORY BITMAP "res\\editory.bmp" -IDR_PREKLADACE BITMAP "res\\prekladace.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Toolbar -// - -IDR_MAINFRAME TOOLBAR 16, 16 -BEGIN - BUTTON ID_FILE_NOVDOBRODRUST - BUTTON ID_FILE_NATIDOBRODRUSTV - SEPARATOR - BUTTON ID_NSTROJE_MAPEDIT - BUTTON ID_NSTROJE_TESTUJDOBRODRUSTV - SEPARATOR - BUTTON ID_APP_EXIT - SEPARATOR - BUTTON ID_APP_ABOUT -END - -IDR_TOOLEDITORY TOOLBAR 16, 15 -BEGIN - BUTTON ID_EDITORY_KOUZLATAB - BUTTON ID_EDITORY_POSTAVYTAB - BUTTON ID_EDITORY_DIALOGY - BUTTON ID_EDITORY_WEAPONSSCR - BUTTON ID_EDITORY_ITEMSPIC - BUTTON ID_EDITORY_ITEMSSCR -END - -IDR_PREKLADACE TOOLBAR 16, 15 -BEGIN - BUTTON ID_PEKLADAE_PELOKOUZLA - BUTTON ID_PEKLADAE_PELODIALOGY - BUTTON ID_PEKLADAE_PELOPOSTAVYTAB -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINFRAME MENU -BEGIN - POPUP "&File" - BEGIN - MENUITEM "Nov dobrodrust", ID_FILE_NOVDOBRODRUST - MENUITEM SEPARATOR - MENUITEM "Nati dobrodrustv", ID_FILE_NATIDOBRODRUSTV - MENUITEM "Znovu nast", ID_FILE_ZNOVUNAST - MENUITEM SEPARATOR - MENUITEM "E&xit", ID_APP_EXIT - END - POPUP "Editory" - BEGIN - MENUITEM "KOUZLA.TAB", ID_EDITORY_KOUZLATAB - MENUITEM "POSTAVY.TAB", ID_EDITORY_POSTAVYTAB - MENUITEM "Dialogy", ID_EDITORY_DIALOGY - MENUITEM "ITEMS.SCR", ID_EDITORY_ITEMSSCR - MENUITEM "ITEMS.PIC", ID_EDITORY_ITEMSPIC - MENUITEM "WEAPONS.SCR", ID_EDITORY_WEAPONSSCR - MENUITEM "Soubor ADV", ID_EDITORY_SOUBORADV - END - POPUP "Pekladae" - BEGIN - MENUITEM "Pelo kouzla", ID_PEKLADAE_PELOKOUZLA - MENUITEM "Pelo dialogy", ID_PEKLADAE_PELODIALOGY - MENUITEM "Pelo POSTAVY.TAB", ID_PEKLADAE_PELOPOSTAVYTAB - END - POPUP "Nstroje" - BEGIN - MENUITEM "MapEdit", ID_NSTROJE_MAPEDIT - MENUITEM "Testuj dobrodrustv", ID_NSTROJE_TESTUJDOBRODRUSTV - MENUITEM SEPARATOR - MENUITEM "Tvrce podlah", ID_NSTROJE_TVRCEPODLAH - MENUITEM "Tvrce palet pro nestvry", ID_NSTROJE_TVRCEPALETPRONESTVRY - - MENUITEM "Tvrce ikon pro pedmty", ID_NSTROJE_TVRCEIKONPROPEDMTY - - MENUITEM "teka DDL soubor", ID_NSTROJE_TEKADDLSOUBOR - MENUITEM SEPARATOR - MENUITEM "Exportuj dobrodrustv", ID_NSTROJE_EXPORTUJDOBRODRUSTV - - END - POPUP "&View" - BEGIN - MENUITEM "Hlavn toolbar", ID_VIEW_TOOLBAR - MENUITEM "Pekladae", ID_VIEW_PREKLADACE - MENUITEM "Editory", 32810 - MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR - END - POPUP "&Help" - BEGIN - MENUITEM "&About AdvMan...", ID_APP_ABOUT - END -END - -IDR_EDITORMENU MENU -BEGIN - POPUP "Soubor" - BEGIN - MENUITEM "Uloit", IDOK - MENUITEM SEPARATOR - MENUITEM "Konec", IDCANCEL - END - POPUP "pravy" - BEGIN - MENUITEM "Zpt", ID_PRAVY_UNDO - MENUITEM SEPARATOR - MENUITEM "Koprovat", ID_UPRAVY_COPY - MENUITEM "Vyjmout", ID_UPRAVY_VYJMOUT - MENUITEM "Vloit", ID_UPRAVY_VLOZIT - MENUITEM "Vymazat", ID_UPRAVY_VYMAZAT - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_NOVEDOBR DIALOGEX 0, 0, 234, 297 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Zaloit nov dobrodrustv" -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - LTEXT "Jmno novho dobrodrustv",IDC_STATIC,7,7,92,8 - EDITTEXT IDC_JMENO,7,18,159,12,ES_AUTOHSCROLL | WS_GROUP - GROUPBOX "Vyber organizaci projektu",IDC_STATIC,7,36,162,60, - WS_GROUP - CONTROL "Nov organizace (doporueno)",IDC_ORGANIZACE,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,15,55,114,10 - CONTROL "Pvodn DOSov organizace (kompatibiln)",IDC_RADIO2, - "Button",BS_AUTORADIOBUTTON,15,66,152,10 - CONTROL "Ve v jedn sloce (mal projeky)",IDC_RADIO3,"Button", - BS_AUTORADIOBUTTON,15,77,121,10 - GROUPBOX "Do novho projektu vloit",IDC_STATIC,7,98,162,82, - WS_GROUP - CONTROL "Tak soubory pro editaci kouzel",IDC_KOUZLA,"Button", - BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,15,111,117,10 - CONTROL "Tak soubory pro editaci dialog",IDC_DIALOGY,"Button", - BS_AUTOCHECKBOX,15,123,119,10 - CONTROL "Tak definice grafiky originln hry",IDC_DEFINICE, - "Button",BS_AUTOCHECKBOX,15,135,123,10 - CONTROL "Tak vechny mapy z originln hry",IDC_MAPY,"Button", - BS_AUTOCHECKBOX,15,147,127,10 - GROUPBOX "Startovn mapa",IDC_STATIC,7,183,161,29,WS_GROUP - EDITTEXT IDC_STARTMAP,16,193,145,12,ES_AUTOHSCROLL | WS_GROUP - GROUPBOX "Poet len druiny",IDC_STATIC,7,214,161,42,WS_GROUP - LTEXT "Nejmn",IDC_STATIC,15,228,29,8 - LTEXT "Nejvce",IDC_STATIC,15,242,26,8 - EDITTEXT IDC_MINPOSTAV,53,226,16,12,ES_MULTILINE | WS_GROUP - EDITTEXT IDC_MAXPOSTAV,53,240,16,12,ES_MULTILINE | WS_GROUP - DEFPUSHBUTTON "OK",IDOK,177,7,50,14,WS_GROUP - PUSHBUTTON "Storno",IDCANCEL,177,24,50,14,NOT WS_TABSTOP - CONTROL "Tak originln dialogy",IDC_ORIGDLGS,"Button", - BS_AUTOCHECKBOX,15,159,87,10 -END - -IDD_TEXTEDITOR DIALOGEX 0, 0, 599, 412 -STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | - WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Textov editor" -MENU IDR_EDITORMENU -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "Uloit (Ctrl+S)",IDOK,540,397,58,14 - EDITTEXT IDC_EDIT,44,0,553,395,ES_MULTILINE | ES_AUTOVSCROLL | - ES_AUTOHSCROLL | ES_WANTRETURN | NOT WS_BORDER | - WS_VSCROLL | WS_HSCROLL,WS_EX_STATICEDGE -END - -IDD_DIALOGY DIALOGEX 0, 0, 334, 202 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Dialogy" -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - PUSHBUTTON "Zavt",IDCANCEL,267,24,60,14 - PUSHBUTTON "Upravit dialog",IDC_EDIT,267,68,60,14 - PUSHBUTTON "Pidat dialog",IDC_ADD,267,52,60,14 - PUSHBUTTON "Vymazat dialog",IDC_DELETE,267,85,60,14 - CONTROL "List1",IDC_DLGLIST,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_EDITLABELS | WS_BORDER | - WS_TABSTOP,7,7,256,188 - PUSHBUTTON "Obnovit",IDC_RESCAN,267,181,60,14 - DEFPUSHBUTTON "OK",IDOK,267,7,60,14 -END - -IDD_NOVYDIALOG DIALOG 0, 0, 214, 105 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Nov dialog" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,157,67,50,14 - PUSHBUTTON "Cancel",IDCANCEL,157,84,50,14 - LTEXT "Popis dialogu:",IDC_STATIC,7,7,45,8 - EDITTEXT IDC_POPIS,7,18,200,12,ES_AUTOHSCROLL - LTEXT "Jmno souboru dialogu bez ppony (.dlg) - 8 znak", - IDC_STATIC,7,32,162,8 - COMBOBOX IDC_JMENO,7,43,73,61,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - LTEXT "islo dialogu:",IDC_STATIC,7,60,42,8 - LTEXT "Uplatn se pouze pro nov zaloen dialog",IDC_STATIC,7, - 89,134,8 - COMBOBOX IDC_CISLO,7,72,33,105,CBS_DROPDOWN | CBS_SORT | - WS_VSCROLL | WS_TABSTOP -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_NOVEDOBR, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 227 - TOPMARGIN, 7 - BOTTOMMARGIN, 290 - END - - IDD_TEXTEDITOR, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 592 - TOPMARGIN, 7 - BOTTOMMARGIN, 405 - END - - IDD_DIALOGY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 327 - TOPMARGIN, 7 - BOTTOMMARGIN, 195 - END - - IDD_NOVYDIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 207 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_NOTEPADICON ICON "idc_note.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDR_MAINFRAME "Adventure Manager" - IDS_NOVEDOBRODRUZSTVIDOKONCENO - "Prvodce novm dobrodrustvm dokonil vechny koly.\r\n\r\nPokud se zobrazila njak chyba, bude nutn po oprav chyby pkaz opakovat, jinak nebude dobrodrustv hrateln." - IDS_ADVFILTER "Dobrodrustv Skeldalu|*.adv|Vechny soubory|*.*||" - IDS_CHYBAPRICTENI "Chyba pi ten souboru dobrodrustv" - IDS_MAINFRAMETITLE "%s - Adventure Manager " - IDS_UNTITLED "Nepojmenovan.ADV" - IDS_CANNOTEXECUTE "Nemohu spustit aplikaci '%1'" - IDS_NEMOHUNAJITNICOD "Pozor! Nemohu najt nsledujc soubor(y):\r\n\r\n%1\r\n\r\nChybjc soubory mohou zpsobit, e dobrodrustv nebude mon hrt." - IDS_EDITADVWARN "Pozor! Zmny v souboru ADV se neprojev ihned. Po uloen nechte znovu nast dobrodrustv pomoc funkce Soubor -> Znovu nast." - IDS_DLGNAME "Jmno" - IDS_DLGDESC "Popis" - IDS_DLGID "ID" - IDS_UNABLETOSAVEDIALOGYDLG - "Nemohu uloit soubor DIALOGY.DLG. Nastala njak chyba." - IDS_NODESC "" -END - -STRINGTABLE -BEGIN - AFX_IDS_APP_TITLE "AdvMan" - AFX_IDS_IDLEMESSAGE "Ready" -END - -STRINGTABLE -BEGIN - ID_INDICATOR_EXT "EXT" - ID_INDICATOR_CAPS "CAP" - ID_INDICATOR_NUM "NUM" - ID_INDICATOR_SCRL "SCRL" - ID_INDICATOR_OVR "OVR" - ID_INDICATOR_REC "REC" -END - -STRINGTABLE -BEGIN - ID_APP_ABOUT "Display program information, version number and copyright\nAbout" - ID_APP_EXIT "Quit the application; prompts to save documents\nExit" -END - -STRINGTABLE -BEGIN - ID_NEXT_PANE "Switch to the next window pane\nNext Pane" - ID_PREV_PANE "Switch back to the previous window pane\nPrevious Pane" -END - -STRINGTABLE -BEGIN - ID_WINDOW_SPLIT "Split the active window into panes\nSplit" -END - -STRINGTABLE -BEGIN - ID_EDIT_CLEAR "Erase the selection\nErase" - ID_EDIT_CLEAR_ALL "Erase everything\nErase All" - ID_EDIT_COPY "Copy the selection and put it on the Clipboard\nCopy" - ID_EDIT_CUT "Cut the selection and put it on the Clipboard\nCut" - ID_EDIT_FIND "Find the specified text\nFind" - ID_EDIT_PASTE "Insert Clipboard contents\nPaste" - ID_EDIT_REPEAT "Repeat the last action\nRepeat" - ID_EDIT_REPLACE "Replace specific text with different text\nReplace" - ID_EDIT_SELECT_ALL "Select the entire document\nSelect All" - ID_EDIT_UNDO "Undo the last action\nUndo" - ID_EDIT_REDO "Redo the previously undone action\nRedo" -END - -STRINGTABLE -BEGIN - ID_VIEW_TOOLBAR "Show or hide the toolbar\nToggle ToolBar" - ID_VIEW_STATUS_BAR "Show or hide the status bar\nToggle StatusBar" -END - -STRINGTABLE -BEGIN - AFX_IDS_SCSIZE "Change the window size" - AFX_IDS_SCMOVE "Change the window position" - AFX_IDS_SCMINIMIZE "Reduce the window to an icon" - AFX_IDS_SCMAXIMIZE "Enlarge the window to full size" - AFX_IDS_SCNEXTWINDOW "Switch to the next document window" - AFX_IDS_SCPREVWINDOW "Switch to the previous document window" - AFX_IDS_SCCLOSE "Close the active window and prompts to save the documents" -END - -STRINGTABLE -BEGIN - AFX_IDS_SCRESTORE "Restore the window to normal size" - AFX_IDS_SCTASKLIST "Activate Task List" -END - -#endif // Czech resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG 0, 0, 235, 55 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About AdvMan" -FONT 8, "MS Sans Serif" -BEGIN - ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 - LTEXT "AdvMan Version 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX - LTEXT "Copyright (C) 2005",IDC_STATIC,40,25,119,8 - DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON "res\\AdvMan.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDR_MAINFRAME ACCELERATORS -BEGIN - "C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT - "V", ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT - VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT, NOINVERT - VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT - VK_F6, ID_NEXT_PANE, VIRTKEY, NOINVERT - VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT, NOINVERT - VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT - VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT - "X", ID_EDIT_CUT, VIRTKEY, CONTROL, NOINVERT - "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "FileDescription", "AdvMan MFC Application" - VALUE "FileVersion", "1, 0, 0, 1" - VALUE "InternalName", "AdvMan" - VALUE "LegalCopyright", "Copyright (C) 2005" - VALUE "OriginalFilename", "AdvMan.EXE" - VALUE "ProductName", "AdvMan Application" - VALUE "ProductVersion", "1, 0, 0, 1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#pragma code_page(1252) -#endif //_WIN32 -#include "res\AdvMan.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/AdvMan/AdvMan.sln b/AdvMan/AdvMan.sln deleted file mode 100644 index d4e56d1..0000000 --- a/AdvMan/AdvMan.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AdvMan", "AdvMan.vcproj", "{D38E31E6-CC5E-4C25-B966-85BF48E8C53E}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {D38E31E6-CC5E-4C25-B966-85BF48E8C53E}.Debug.ActiveCfg = Debug|Win32 - {D38E31E6-CC5E-4C25-B966-85BF48E8C53E}.Debug.Build.0 = Debug|Win32 - {D38E31E6-CC5E-4C25-B966-85BF48E8C53E}.Release.ActiveCfg = Release|Win32 - {D38E31E6-CC5E-4C25-B966-85BF48E8C53E}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/AdvMan/AdvMan.vcproj b/AdvMan/AdvMan.vcproj deleted file mode 100644 index b3f0061..0000000 --- a/AdvMan/AdvMan.vcproj +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AdvMan/ChildView.cpp b/AdvMan/ChildView.cpp deleted file mode 100644 index d4dc2da..0000000 --- a/AdvMan/ChildView.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// ChildView.cpp : implementation of the CChildView class -// - -#include "stdafx.h" -#include "AdvMan.h" -#include "ChildView.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CChildView - -CChildView::CChildView() -{ -} - -CChildView::~CChildView() -{ -} - - -BEGIN_MESSAGE_MAP(CChildView,CWnd ) - //{{AFX_MSG_MAP(CChildView) - ON_WM_PAINT() - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - - -///////////////////////////////////////////////////////////////////////////// -// CChildView message handlers - -BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) -{ - if (!CWnd::PreCreateWindow(cs)) - return FALSE; - - cs.dwExStyle |= WS_EX_CLIENTEDGE; - cs.style &= ~WS_BORDER; - cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, - ::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL); - - return TRUE; -} - -void CChildView::OnPaint() -{ - CPaintDC dc(this); // device context for painting - - // TODO: Add your message handler code here - - // Do not call CWnd::OnPaint() for painting messages -} - diff --git a/AdvMan/ChildView.h b/AdvMan/ChildView.h deleted file mode 100644 index 1a31b1d..0000000 --- a/AdvMan/ChildView.h +++ /dev/null @@ -1,51 +0,0 @@ -// ChildView.h : interface of the CChildView class -// -///////////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_CHILDVIEW_H__C7E216F0_6DED_46F2_9E4F_0F71719D08CA__INCLUDED_) -#define AFX_CHILDVIEW_H__C7E216F0_6DED_46F2_9E4F_0F71719D08CA__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -///////////////////////////////////////////////////////////////////////////// -// CChildView window - -class CChildView : public CWnd -{ -// Construction -public: - CChildView(); - -// Attributes -public: - -// Operations -public: - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CChildView) - protected: - virtual BOOL PreCreateWindow(CREATESTRUCT& cs); - //}}AFX_VIRTUAL - -// Implementation -public: - virtual ~CChildView(); - - // Generated message map functions -protected: - //{{AFX_MSG(CChildView) - afx_msg void OnPaint(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_CHILDVIEW_H__C7E216F0_6DED_46F2_9E4F_0F71719D08CA__INCLUDED_) diff --git a/AdvMan/DlgDialogy.cpp b/AdvMan/DlgDialogy.cpp deleted file mode 100644 index e226f8e..0000000 --- a/AdvMan/DlgDialogy.cpp +++ /dev/null @@ -1,264 +0,0 @@ -// DlgDialogy.cpp : implementation file -// - -#include "stdafx.h" -#include "AdvMan.h" -#include "DlgDialogy.h" -#include "../cztable.h" -#include "MainFrm.h" -#include "DlgNovyDialog.h" -#include -#include ".\dlgdialogy.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// DlgDialogy dialog - - -DlgDialogy::DlgDialogy(CWnd* pParent /*=NULL*/) - : CDialog(DlgDialogy::IDD, pParent) -{ - //{{AFX_DATA_INIT(DlgDialogy) - // NOTE: the ClassWizard will add member initialization here - //}}AFX_DATA_INIT -} - - -void DlgDialogy::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(DlgDialogy) - DDX_Control(pDX, IDC_DLGLIST, wList); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(DlgDialogy, CDialog) - //{{AFX_MSG_MAP(DlgDialogy) - ON_BN_CLICKED(IDC_RESCAN, OnRescan) - ON_BN_CLICKED(IDC_DELETE, OnDelete) - ON_BN_CLICKED(IDC_EDIT, OnEdit) - ON_NOTIFY(LVN_COLUMNCLICK, IDC_DLGLIST, OnColumnclickDlglist) - ON_BN_CLICKED(IDC_ADD, OnAdd) - ON_NOTIFY(NM_DBLCLK, IDC_DLGLIST, OnNMDblclkDlglist) - //}}AFX_MSG_MAP - ON_NOTIFY(LVN_ENDLABELEDIT, IDC_DLGLIST, OnLvnEndlabeleditDlglist) -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// DlgDialogy message handlers - -BOOL DlgDialogy::OnInitDialog() -{ - CDialog::OnInitDialog(); - - wList.InsertColumn(0,CString(MAKEINTRESOURCE(IDS_DLGDESC)),LVCFMT_LEFT,200,0); - wList.InsertColumn(1,CString(MAKEINTRESOURCE(IDS_DLGNAME)),LVCFMT_LEFT,100,1); - wList.InsertColumn(2,CString(MAKEINTRESOURCE(IDS_DLGID)),LVCFMT_CENTER,30,2); - ListView_SetExtendedListViewStyleEx(wList,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); - OnRescan(); - - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -int DlgDialogy::GetDialogID(const char *name) -{ - Pathname dialogPath=_dlgpath; - dialogPath.SetFilename(name); - FILE *f=fopen_icase(dialogPath,"r"); - if (f==0) return -1; - int id; - char dialog[40]; - if (fscanf(f," %40[^\r\n\t (] ( %d )",dialog,&id)==2) - { - if (istrcmp(dialog,"DIALOG")==0) - { - fclose(f); - return id; - } - } - fclose(f); - return -1; -} - -void DlgDialogy::LoadDialogyDlg() -{ - FILE *f=fopen_icase(_dlgpath,"r"); - if (f==0) return; - - int p=0; - - while (!feof(f)) - { - char name[80]; - char desc[256]; - name[0]=0; - desc[0]=0; - fscanf(f,"%80s",name); - fscanf(f," %250[^\r\n]",desc); - kamenik2windows(name,strlen(name),name); - kamenik2windows(desc,strlen(desc),desc); - int row; - - if (name[0]!=0 || desc[0]!=0) - { - row=wList.InsertItem(p,desc,0); - wList.SetItemText(row,1,name); - int dlgId=GetDialogID(name); - wList.SetItemText(row,2,itoa(dlgId,desc,10)); - p++; - } - } - fclose(f); -} - -void DlgDialogy::OnRescan() -{ - wList.DeleteAllItems(); - LoadDialogyDlg(); -} - -void DlgDialogy::OnDelete() -{ - int w; - while ((w=wList.GetNextItem(-1,LVNI_SELECTED))!=-1) - { - wList.DeleteItem(w); - } -} - -void DlgDialogy::OnEdit() -{ - CString name; - int w=-1; - while ((w=wList.GetNextItem(w,LVNI_SELECTED))!=-1) - { - name=wList.GetItemText(w,1); - Pathname editName=_dlgpath; - editName.SetFilename(name); - _mainFrame->OpenEditor(editName); - } -} - -void DlgDialogy::OnOK() -{ - FILE *f=fopen_icase(_dlgpath,"w"); - if (f==0) - { - AfxMessageBox(IDS_UNABLETOSAVEDIALOGYDLG,MB_ICONEXCLAMATION); - return; - } - - for (int i=0,cnt=wList.GetItemCount();iiSubItem; - wList.SortItems(CompareFunc,(DWORD)this); - - *pResult = 0; -} - - -int DlgDialogy::CompareItems(int item1, int item2) -{ - switch (_sortItem) - { - case 0: - { - CString a=wList.GetItemText(item1,0); - CString b=wList.GetItemText(item2,0); - return istrcmp(a,b); - } - case 1: - { - CString a=wList.GetItemText(item1,1); - CString b=wList.GetItemText(item2,1); - return istrcmp(a,b); - } - case 2: - { - char buff[20]; - int a,b; - wList.GetItemText(item1,2,buff,20);a=atoi(buff); - wList.GetItemText(item2,2,buff,20);b=atoi(buff); - return (a>b)-(a_dlgpath; - nw.sourceLst=&wList; - if (nw.DoModal()==IDOK) - { - int p=wList.InsertItem(wList.GetItemCount(),nw.vPopis); - Pathname dlgName=_dlgpath; - dlgName.SetFiletitle(nw.vJmeno); - dlgName.SetExtension(".dlg"); - wList.SetItemText(p,1,dlgName.GetFilename()); - if (_check_file_exists(dlgName)!=0) - { - FILE *f=fopen_icase(dlgName,"w"); - fprintf(f,"DIALOG(%d)\n",nw.vCislo); - fprintf(f,"{\nPICTURE (\"SCREEN\")\nDESC (\"Popis\")\nSTANDARD (1)\n}\n\nSENTENCE (1,0)\n{\n\n}"); - fclose(f); - } - int num=GetDialogID(dlgName.GetFilename()); - char buff[20]; - wList.SetItemText(p,2,itoa(num,buff,10)); - } -} - - -void DlgDialogy::OnNMDblclkDlglist(NMHDR *pNMHDR, LRESULT *pResult) -{ - OnEdit(); - *pResult = 0; -} - -void DlgDialogy::OnLvnEndlabeleditDlglist(NMHDR *pNMHDR, LRESULT *pResult) -{ - NMLVDISPINFO *pDispInfo = reinterpret_cast(pNMHDR); - // TODO: Add your control notification handler code here - *pResult = 1; -} diff --git a/AdvMan/DlgDialogy.h b/AdvMan/DlgDialogy.h deleted file mode 100644 index 10efb2d..0000000 --- a/AdvMan/DlgDialogy.h +++ /dev/null @@ -1,76 +0,0 @@ -#if !defined(AFX_DLGDIALOGY_H__E47269D5_6849_42F5_AF6F_32EEEE32104D__INCLUDED_) -#define AFX_DLGDIALOGY_H__E47269D5_6849_42F5_AF6F_32EEEE32104D__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -// DlgDialogy.h : header file -// - -///////////////////////////////////////////////////////////////////////////// -// DlgDialogy dialog - -#define MAXDIALOGY 240 - -class CMainFrame; - -class DlgDialogy : public CDialog -{ -// Construction -public: - void LoadDialogyDlg(); - DlgDialogy(CWnd* pParent = NULL); // standard constructor - -// Dialog Data - //{{AFX_DATA(DlgDialogy) - enum { IDD = IDD_DIALOGY }; - CListCtrl wList; - //}}AFX_DATA - - Pathname _dlgpath; - CMainFrame *_mainFrame; - int _sortItem; - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(DlgDialogy) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(DlgDialogy) - virtual BOOL OnInitDialog(); - afx_msg void OnRescan(); - afx_msg void OnDelete(); - afx_msg void OnEdit(); - virtual void OnOK(); - virtual void OnCancel(); - afx_msg void OnColumnclickDlglist(NMHDR* pNMHDR, LRESULT* pResult); - afx_msg void OnAdd(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() - - int GetDialogID(const char *name); - static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) - { - DlgDialogy *self=(DlgDialogy *)lParamSort; - return self->CompareItems(lParam1,lParam2); - } - - int CompareItems(int item1, int item2); - - -public: - afx_msg void OnNMDblclkDlglist(NMHDR *pNMHDR, LRESULT *pResult); - afx_msg void OnLvnEndlabeleditDlglist(NMHDR *pNMHDR, LRESULT *pResult); -}; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_DLGDIALOGY_H__E47269D5_6849_42F5_AF6F_32EEEE32104D__INCLUDED_) diff --git a/AdvMan/DlgNoveDobr.cpp b/AdvMan/DlgNoveDobr.cpp deleted file mode 100644 index 9c30222..0000000 --- a/AdvMan/DlgNoveDobr.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// DlgNoveDobr.cpp : implementation file -// - -#include "stdafx.h" -#include "AdvMan.h" -#include "DlgNoveDobr.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// DlgNoveDobr dialog - - -DlgNoveDobr::DlgNoveDobr(CWnd* pParent /*=NULL*/) - : CDialog(DlgNoveDobr::IDD, pParent) -{ - //{{AFX_DATA_INIT(DlgNoveDobr) - vJmeno = _T(""); - vKouzla = TRUE; - vMapy = FALSE; - vDialogy = TRUE; - vDefinice = FALSE; - vOrganizace = 0; - vStartMap = _T("start.map"); - vMaxPostav = 3; - vMinPostav = 3; - //}}AFX_DATA_INIT -} - - -void DlgNoveDobr::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(DlgNoveDobr) - DDX_Text(pDX, IDC_JMENO, vJmeno); - DDX_Check(pDX, IDC_KOUZLA, vKouzla); - DDX_Check(pDX, IDC_MAPY, vMapy); - DDX_Check(pDX, IDC_DIALOGY, vDialogy); - DDX_Check(pDX, IDC_DEFINICE, vDefinice); - DDX_Radio(pDX, IDC_ORGANIZACE, vOrganizace); - DDX_Text(pDX, IDC_STARTMAP, vStartMap); - DDX_Check(pDX, IDC_ORIGDLGS, vDialogyDlg); - DDV_MaxChars(pDX, vStartMap, 12); - //}}AFX_DATA_MAP - DDX_Text(pDX, IDC_MINPOSTAV, vMinPostav); - DDV_MinMaxUInt(pDX, vMinPostav, 1, 6); - DDX_Text(pDX, IDC_MAXPOSTAV, vMaxPostav); - DDV_MinMaxUInt(pDX, vMaxPostav, vMinPostav, 6); -} - - -BEGIN_MESSAGE_MAP(DlgNoveDobr, CDialog) - //{{AFX_MSG_MAP(DlgNoveDobr) - ON_EN_CHANGE(IDC_JMENO, OnChangeJmeno) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// DlgNoveDobr message handlers - -void DlgNoveDobr::DialogRules() -{ - GetDlgItem(IDOK)->EnableWindow(GetDlgItem(IDC_JMENO)->GetWindowTextLength()); -} - -BOOL DlgNoveDobr::OnInitDialog() -{ - CDialog::OnInitDialog(); - - DialogRules(); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void DlgNoveDobr::OnChangeJmeno() -{ - DialogRules(); -} diff --git a/AdvMan/DlgNoveDobr.h b/AdvMan/DlgNoveDobr.h deleted file mode 100644 index a3db1f4..0000000 --- a/AdvMan/DlgNoveDobr.h +++ /dev/null @@ -1,57 +0,0 @@ -#if !defined(AFX_DLGNOVEDOBR_H__410472E5_5BCF_4CE8_8FE3_10693C0F05F7__INCLUDED_) -#define AFX_DLGNOVEDOBR_H__410472E5_5BCF_4CE8_8FE3_10693C0F05F7__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -// DlgNoveDobr.h : header file -// - -///////////////////////////////////////////////////////////////////////////// -// DlgNoveDobr dialog - -class DlgNoveDobr : public CDialog -{ -// Construction -public: - void DialogRules(); - DlgNoveDobr(CWnd* pParent = NULL); // standard constructor - -// Dialog Data - //{{AFX_DATA(DlgNoveDobr) - enum { IDD = IDD_NOVEDOBR }; - CString vJmeno; - BOOL vKouzla; - BOOL vMapy; - BOOL vDialogy; - BOOL vDefinice; - BOOL vDialogyDlg; - int vOrganizace; - CString vStartMap; - UINT vMaxPostav; - UINT vMinPostav; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(DlgNoveDobr) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(DlgNoveDobr) - virtual BOOL OnInitDialog(); - afx_msg void OnChangeJmeno(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_DLGNOVEDOBR_H__410472E5_5BCF_4CE8_8FE3_10693C0F05F7__INCLUDED_) diff --git a/AdvMan/DlgNovyDialog.cpp b/AdvMan/DlgNovyDialog.cpp deleted file mode 100644 index a5d119e..0000000 --- a/AdvMan/DlgNovyDialog.cpp +++ /dev/null @@ -1,127 +0,0 @@ -// DlgNovyDialog.cpp : implementation file -// - -#include "stdafx.h" -#include "AdvMan.h" -#include "DlgNovyDialog.h" -#include - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// DlgNovyDialog dialog - - -DlgNovyDialog::DlgNovyDialog(CWnd* pParent /*=NULL*/) - : CDialog(DlgNovyDialog::IDD, pParent) -{ - //{{AFX_DATA_INIT(DlgNovyDialog) - vCislo = 0; - vJmeno = _T(""); - vPopis = _T(""); - //}}AFX_DATA_INIT -} - - -void DlgNovyDialog::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(DlgNovyDialog) - DDX_Control(pDX, IDC_CISLO, wCislo); - DDX_Control(pDX, IDC_JMENO, wJmeno); - DDX_Text(pDX, IDC_CISLO, vCislo); - DDV_MinMaxInt(pDX, vCislo, 1, 254); - DDX_CBString(pDX, IDC_JMENO, vJmeno); - DDV_MaxChars(pDX, vJmeno, 8); - DDX_Text(pDX, IDC_POPIS, vPopis); - DDV_MaxChars(pDX, vPopis, 50); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(DlgNovyDialog, CDialog) - //{{AFX_MSG_MAP(DlgNovyDialog) - ON_CBN_EDITCHANGE(IDC_JMENO, OnEditchangeJmeno) - ON_CBN_SELENDOK(IDC_JMENO, OnSelendokJmeno) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// DlgNovyDialog message handlers - -BOOL DlgNovyDialog::OnInitDialog() -{ - CDialog::OnInitDialog(); - - bool idlist[256]; - memset(idlist,0,sizeof(idlist)); - - dlgSource.SetFilename("*.dlg"); - CFileFind fnd; - BOOL next; - if (fnd.FindFile(dlgSource)) do - { - next=fnd.FindNextFile(); - CString name=fnd.GetFileTitle(); - name.MakeLower(); - wJmeno.AddString(name); - }while (next); - - int i,cnt; - for (i=0,cnt=sourceLst->GetItemCount();iGetItemText(i,1); - dlgSource.SetFilename(name); - name=dlgSource.GetTitle(); - name.MakeLower(); - int p=wJmeno.FindStringExact(-1,name); - if (p!=-1) wJmeno.DeleteString(p); - - name=sourceLst->GetItemText(i,2); - p=atoi(name); - if (p>=0 && p<256) idlist[p]=true; - } - bool x=true; - for (i=1;i<254;i++) if (!idlist[i]) - { - char buff[50]; - sprintf(buff,"%3d",i); - wCislo.AddString(buff); - if (x) - { - wCislo.SetWindowText(buff); - x=false; - } - } - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void DlgNovyDialog::DialogRules() -{ - BOOL ok=wJmeno.GetWindowTextLength() && wCislo.GetWindowTextLength(); - GetDlgItem(IDOK)->EnableWindow(ok); - CString name; - wJmeno.GetWindowText(name); - dlgSource.SetFiletitle(name); - wCislo.EnableWindow(check_file_exists(dlgSource)==-1); -} - -void DlgNovyDialog::OnEditchangeJmeno() -{ - DialogRules(); -} - -void DlgNovyDialog::OnSelendokJmeno() -{ - int p=wJmeno.GetCurSel(); - CString z; - wJmeno.GetLBText(p,z); - wJmeno.SetWindowText(z); - DialogRules(); -} diff --git a/AdvMan/DlgNovyDialog.h b/AdvMan/DlgNovyDialog.h deleted file mode 100644 index 526175a..0000000 --- a/AdvMan/DlgNovyDialog.h +++ /dev/null @@ -1,57 +0,0 @@ -#if !defined(AFX_DLGNOVYDIALOG_H__00136ADF_E2C6_4081_83AB_D5110EE43612__INCLUDED_) -#define AFX_DLGNOVYDIALOG_H__00136ADF_E2C6_4081_83AB_D5110EE43612__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -// DlgNovyDialog.h : header file -// - -///////////////////////////////////////////////////////////////////////////// -// DlgNovyDialog dialog - -class DlgDialogy; - -class DlgNovyDialog : public CDialog -{ -// Construction -public: - void DialogRules(); - DlgNovyDialog(CWnd* pParent = NULL); // standard constructor - -// Dialog Data - //{{AFX_DATA(DlgNovyDialog) - enum { IDD = IDD_NOVYDIALOG }; - CComboBox wCislo; - CComboBox wJmeno; - int vCislo; - CString vJmeno; - CString vPopis; - //}}AFX_DATA - - CListCtrl *sourceLst; - Pathname dlgSource; - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(DlgNovyDialog) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - - // Generated message map functions - //{{AFX_MSG(DlgNovyDialog) - virtual BOOL OnInitDialog(); - afx_msg void OnEditchangeJmeno(); - afx_msg void OnSelendokJmeno(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_DLGNOVYDIALOG_H__00136ADF_E2C6_4081_83AB_D5110EE43612__INCLUDED_) diff --git a/AdvMan/FS_tasker.h b/AdvMan/FS_tasker.h deleted file mode 100644 index e69de29..0000000 diff --git a/AdvMan/MainFrm.cpp b/AdvMan/MainFrm.cpp deleted file mode 100644 index b0743b6..0000000 --- a/AdvMan/MainFrm.cpp +++ /dev/null @@ -1,677 +0,0 @@ -// MainFrm.cpp : implementation of the CMainFrame class -// - -#include "stdafx.h" -#include "AdvMan.h" -#include "..\cztable.h" - -#include "MainFrm.h" -#include "DlgDialogy.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CMainFrame - -IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) - -BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) - //{{AFX_MSG_MAP(CMainFrame) - ON_WM_CREATE() - ON_WM_SETFOCUS() - ON_WM_INITMENUPOPUP() - ON_COMMAND(ID_FILE_NOVDOBRODRUST, OnFileNovdobrodrust) - ON_COMMAND(ID_FILE_NATIDOBRODRUSTV, OnFileNatidobrodrustv) - ON_COMMAND(ID_EDITORY_KOUZLATAB, OnEditoryKouzlatab) - ON_COMMAND(ID_EDITORY_POSTAVYTAB, OnEditoryPostavytab) - ON_COMMAND(ID_EDITORY_ITEMSSCR, OnEditoryItemsscr) - ON_COMMAND(ID_EDITORY_ITEMSPIC, OnEditoryItemspic) - ON_COMMAND(ID_EDITORY_WEAPONSSCR, OnEditoryWeaponsscr) - ON_WM_DESTROY() - ON_COMMAND(ID_PEKLADAE_PELOKOUZLA, OnPekladaePelokouzla) - ON_COMMAND(ID_PEKLADAE_PELODIALOGY, OnPekladaePelodialogy) - ON_COMMAND(ID_PEKLADAE_PELOPOSTAVYTAB, OnPekladaePelopostavytab) - ON_COMMAND(ID_NSTROJE_MAPEDIT, OnNstrojeMapedit) - ON_COMMAND(ID_NSTROJE_TESTUJDOBRODRUSTV, OnNstrojeTestujdobrodrustv) - ON_COMMAND(ID_NSTROJE_TVRCEPODLAH, OnNstrojeTvrcepodlah) - ON_COMMAND(ID_NSTROJE_TVRCEPALETPRONESTVRY, OnNstrojeTvrcepaletpronestvry) - ON_COMMAND(ID_NSTROJE_TVRCEIKONPROPEDMTY, OnNstrojeTvrceikonpropedmty) - ON_COMMAND(ID_EDITORY_SOUBORADV, OnEditorySouboradv) - ON_COMMAND(ID_FILE_ZNOVUNAST, OnFileZnovunast) - ON_UPDATE_COMMAND_UI(ID_FILE_ZNOVUNAST, OnUpdateFileZnovunast) - ON_COMMAND(ID_EDITORY_DIALOGY, OnEditoryDialogy) - ON_COMMAND_EX(ID_VIEW_EDITORY,OnBarCheck) - ON_COMMAND_EX(ID_VIEW_PREKLADACE,OnBarCheck) - ON_UPDATE_COMMAND_UI(ID_VIEW_EDITORY,OnUpdateControlBarMenu) - ON_UPDATE_COMMAND_UI(ID_VIEW_PREKLADACE,OnUpdateControlBarMenu) - ON_UPDATE_COMMAND_UI_RANGE(ID_EDITORY_KOUZLATAB,ID_EDITORY_WEAPONSSCR,OnUpdateEditory) - ON_UPDATE_COMMAND_UI_RANGE(ID_PEKLADAE_PELOKOUZLA,ID_PEKLADAE_PELOPOSTAVYTAB,OnUpdateEditory) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -static UINT indicators[] = -{ - ID_SEPARATOR, // status line indicator - ID_INDICATOR_CAPS, - ID_INDICATOR_NUM, - ID_INDICATOR_SCRL, -}; - -///////////////////////////////////////////////////////////////////////////// -// CMainFrame construction/destruction - -CMainFrame::CMainFrame() -{ - // TODO: add member initialization code here - -} - -CMainFrame::~CMainFrame() -{ - -} - -int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) -{ - if (CFrameWnd::OnCreate(lpCreateStruct) == -1) - return -1; - // create a view to occupy the client area of the frame - if (!m_wndView.Create(ES_READONLY|WS_VISIBLE|WS_CHILD|ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL|WS_VSCROLL|WS_HSCROLL,CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST)) - { - TRACE0("Failed to create view window\n"); - return -1; - } - - if (!m_wndToolBar.CreateEx(this, TBSTYLE_BUTTON, WS_CHILD | WS_VISIBLE | CBRS_TOP - | CBRS_TOOLTIPS | CBRS_FLYBY |BTNS_AUTOSIZE | CBRS_SIZE_DYNAMIC) || - !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) - { - TRACE0("Failed to create toolbar\n"); - return -1; // fail to create - } - - if (!m_wndEditoryBar.CreateEx(this, TBSTYLE_BUTTON, WS_CHILD | WS_VISIBLE | CBRS_TOP - | CBRS_TOOLTIPS | CBRS_FLYBY |BTNS_AUTOSIZE | CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),ID_VIEW_EDITORY) || - !m_wndEditoryBar.LoadToolBar(IDR_TOOLEDITORY)) - { - TRACE0("Failed to create toolbar\n"); - return -1; // fail to create - } - - if (!m_wndPrekladaceBar.CreateEx(this, TBSTYLE_BUTTON, WS_CHILD | WS_VISIBLE | CBRS_TOP - | CBRS_TOOLTIPS | CBRS_FLYBY |BTNS_AUTOSIZE | CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),ID_VIEW_PREKLADACE) || - !m_wndPrekladaceBar.LoadToolBar(IDR_PREKLADACE)) - { - TRACE0("Failed to create toolbar\n"); - return -1; // fail to create - } - - if (!m_wndStatusBar.Create(this) || - !m_wndStatusBar.SetIndicators(indicators, - sizeof(indicators)/sizeof(UINT))) - { - TRACE0("Failed to create status bar\n"); - return -1; // fail to create - } - - // TODO: Delete these three lines if you don't want the toolbar to - // be dockable - ShowWindow(SW_SHOW); - m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); - m_wndEditoryBar.EnableDocking(CBRS_ALIGN_ANY); - m_wndPrekladaceBar.EnableDocking(CBRS_ALIGN_ANY); - EnableDocking(CBRS_ALIGN_ANY); - DockControlBar(&m_wndToolBar); - DockControlBar(&m_wndEditoryBar); - DockControlBar(&m_wndPrekladaceBar); - UpdateWindow(); - CRect rc; - GetClientRect(&rc); - ClientToScreen(&rc); - DockControlBar(&m_wndEditoryBar,(UINT)0,CRect(rc.left+180,rc.top+5,rc.left+180,rc.top+5)); - DockControlBar(&m_wndPrekladaceBar,(UINT)0,CRect(rc.left+350,rc.top+5,rc.left+350,rc.top+5)); - - _adv=0; - CString untitled; - untitled.LoadString(IDS_UNTITLED); - SetTitle(untitled); - - SetClassLong(*this,GCL_HICON,(LONG)(theApp.LoadIcon(IDR_MAINFRAME))); - - return 0; -} - -BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) -{ - if( !CFrameWnd::PreCreateWindow(cs) ) - return FALSE; - // TODO: Modify the Window class or styles here by modifying - // the CREATESTRUCT cs - - cs.dwExStyle &= ~WS_EX_CLIENTEDGE; - cs.lpszClass = AfxRegisterWndClass(0); - return TRUE; -} - -///////////////////////////////////////////////////////////////////////////// -// CMainFrame diagnostics - -#ifdef _DEBUG -void CMainFrame::AssertValid() const -{ - CFrameWnd::AssertValid(); -} - -void CMainFrame::Dump(CDumpContext& dc) const -{ - CFrameWnd::Dump(dc); -} - -#endif //_DEBUG - -///////////////////////////////////////////////////////////////////////////// -// CMainFrame message handlers -void CMainFrame::OnSetFocus(CWnd* pOldWnd) -{ - // forward focus to the view window - m_wndView.SetFocus(); -} - -BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) -{ - // let the view have first crack at the command - if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) - return TRUE; - - // otherwise, do default handling - return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); -} - - -void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) -{ - if (_adv==0) - { - for (int i=0,cnt=pPopupMenu->GetMenuItemCount();iGetMenuItemID(i); - if (id!=ID_FILE_NOVDOBRODRUST && id!=ID_FILE_NATIDOBRODRUSTV && id!=ID_APP_EXIT && - id!=ID_VIEW_TOOLBAR && id!=ID_VIEW_STATUS_BAR && id!=ID_APP_ABOUT && id!=ID_VIEW_EDITORY) - pPopupMenu->EnableMenuItem(i,MF_GRAYED|MF_BYPOSITION); - } - } - else - CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); -} - -#include "DlgNoveDobr.h" - -static str_add_wildcard(TSTR_LIST *lst, const char *mask) -{ - CFileFind fnd; - BOOL nxt=fnd.FindFile(mask); - if (nxt==FALSE) - { - CString msg; - AfxFormatString1(msg,IDS_NEMOHUNAJITNICOD,mask); - AfxMessageBox(msg,MB_ICONEXCLAMATION); - } - while (nxt) - { - nxt=fnd.FindNextFile(); - str_add(lst,fnd.GetFilePath()); - } -} - -void CMainFrame::OnFileNovdobrodrust() -{ - DlgNoveDobr dlg; - int id=dlg.DoModal(); - if (id==IDOK) - { - release_list(_adv); - _adv=create_list(10); - CString baseMap=_T("adv\\")+dlg.vJmeno+_T("\\"); - add_field_txt(&_adv,_T("CESTA_MAPY"),baseMap); - CString cestaGrafika; - CString cestaDialogy; - CString cestaEnemy; - CString cestaItemy; - CString cestaPozice; - CString cestaZvuky; - CString cestaBasicGr; - switch (dlg.vOrganizace) - { - case 0: - cestaGrafika=baseMap+_T("GRFSTENY" PATH_SEPARATOR); - cestaDialogy=baseMap+_T("GRFDIALG" PATH_SEPARATOR); - cestaEnemy=baseMap+_T("GRFENEMY" PATH_SEPARATOR); - cestaItemy=baseMap+_T("GRFITEMS" PATH_SEPARATOR); - cestaPozice=baseMap+_T("SAVEGAME" PATH_SEPARATOR); - cestaZvuky=baseMap+_T("SOUNDS" PATH_SEPARATOR); - cestaBasicGr=baseMap+_T("GRFBASIC" PATH_SEPARATOR); - break; - case 1: - cestaGrafika=baseMap+_T("graphics" PATH_SEPARATOR); - cestaDialogy=baseMap+_T("graphics" PATH_SEPARATOR "dialogs" PATH_SEPARATOR); - cestaEnemy=baseMap+_T("graphics" PATH_SEPARATOR "enemies" PATH_SEPARATOR); - cestaItemy=baseMap+_T("graphics" PATH_SEPARATOR "items"); - cestaPozice=baseMap+_T("SAVEGAME" PATH_SEPARATOR ); - cestaZvuky=baseMap+_T("SAMPLES" PATH_SEPARATOR); - cestaBasicGr=baseMap+_T("graphics" PATH_SEPARATOR "basic" PATH_SEPARATOR); - break; - case 2: - cestaGrafika=baseMap; - cestaDialogy=baseMap; - cestaEnemy=baseMap; - cestaItemy=baseMap; - cestaPozice=baseMap+_T("SAVEGAME" PATH_SEPARATOR); - cestaZvuky=baseMap; - cestaBasicGr=baseMap; - break; - } - - add_field_txt(&_adv,_T("CESTA_GRAFIKA"),cestaGrafika); - add_field_txt(&_adv,_T("CESTA_DIALOGY"),cestaDialogy); - add_field_txt(&_adv,_T("CESTA_ENEMY"),cestaEnemy); - add_field_txt(&_adv,_T("CESTA_ITEMY"),cestaItemy); - add_field_txt(&_adv,_T("CESTA_POZICE"),cestaPozice); - add_field_txt(&_adv,_T("CESTA_ZVUKY"),cestaZvuky); - add_field_txt(&_adv,_T("CESTA_BGRAFIKA"),cestaBasicGr); - - add_field_txt(&_adv,_T("DEFAULT_MAP"),dlg.vStartMap); - add_field_num(&_adv,_T("CHAR_MIN"),dlg.vMinPostav); - add_field_num(&_adv,_T("CHAR_MAX"),dlg.vMaxPostav); - add_field_num(&_adv,_T("PATCH"),1); - - Pathname pth=Pathname::GetExePath(); - pth.SetFiletitle(dlg.vJmeno); - pth.SetExtension(_T(".adv")); - - save_config(_adv,pth); - - _advName=pth; - _advPath=pth.GetDirectoryWithDrive(); - - SetTitle(pth); - - - Pathname exePath=Pathname::GetExePath(); - - pth.CreateFolder(exePath.GetDirectoryWithDrive()+baseMap); - pth.CreateFolder(exePath.GetDirectoryWithDrive()+cestaGrafika); - pth.CreateFolder(exePath.GetDirectoryWithDrive()+cestaDialogy); - pth.CreateFolder(exePath.GetDirectoryWithDrive()+cestaItemy); - pth.CreateFolder(exePath.GetDirectoryWithDrive()+cestaEnemy); - pth.CreateFolder(exePath.GetDirectoryWithDrive()+cestaPozice); - pth.CreateFolder(exePath.GetDirectoryWithDrive()+cestaZvuky); - pth.CreateFolder(exePath.GetDirectoryWithDrive()+cestaBasicGr); - - CString basePath=pth.GetDirectoryWithDrive(); - - TSTR_LIST fileList=create_list(10); - str_add_wildcard(&fileList,basePath+_T("maps\\*.dat")); - if (!dlg.vDefinice) str_add_wildcard(&fileList,basePath+_T("AdvManData\\weapons.scr")); - if (!dlg.vDefinice) str_add_wildcard(&fileList,basePath+_T("AdvManData\\items.scr")); - str_add_wildcard(&fileList,basePath+_T("AdvManData\\items.pic")); - str_add_wildcard(&fileList,basePath+_T("AdvManData\\*.lst")); - str_add_wildcard(&fileList,basePath+_T("AdvManData\\postavy.def")); - str_add_wildcard(&fileList,basePath+_T("AdvManData\\postavy.tab")); - str_add_wildcard(&fileList,basePath+_T("AdvManData\\predmety.tab")); - if (dlg.vKouzla) - { - str_add_wildcard(&fileList,basePath+_T("AdvManData\\kouzla.def")); - str_add_wildcard(&fileList,basePath+_T("AdvManData\\kouzla.tab")); - } - if (dlg.vDialogy) - { - str_add_wildcard(&fileList,basePath+_T("AdvManData\\dialogy.def")); - str_add_wildcard(&fileList,basePath+_T("AdvManData\\dlgsecrt.def")); - } - if (dlg.vDefinice) - { - str_add_wildcard(&fileList,basePath+_T("AdvManData\\*.scr")); - str_add_wildcard(&fileList,basePath+_T("AdvManData\\*.txt")); - } - if (dlg.vMapy) - { - str_add_wildcard(&fileList,basePath+_T("maps\\*.map")); - } - if (dlg.vDialogyDlg) - { - str_add_wildcard(&fileList,basePath+_T("AdvManData\\*.dlg")); - } - int totalszneed=0; - int i,cnt; - for (i=0,cnt=str_count(fileList);imessage,pMsg->wParam,pMsg->lParam); - pMsg->time=res; - return res==0; -} - - -LRESULT CMainFrame::BroadcastMessage(UINT msg, WPARAM wParam, LPARAM lParam) -{ - MSG Msg; - Msg.message=msg; - Msg.wParam=wParam; - Msg.lParam=lParam; - Msg.time=0; - EnumThreadWindows(GetCurrentThreadId(),BroadcastMsgCallback,(LPARAM)&Msg); - return Msg.time; -} - -void CMainFrame::SaveAll() -{ - BroadcastMessage(MSG_FORCESAVE,0,0); -} - -void CMainFrame::OpenEditor(const char *name) -{ - if (BroadcastMessage(MSG_FINDANDPOPUP,0,(LPARAM)name)==0) - { - EditSkeldalFile(name); - } -} - -void CMainFrame::OnDestroy() -{ - SaveBarState("MainFrame"); - CFrameWnd::OnDestroy(); - - BroadcastMessage(MSG_CLOSEEDITOR,0,0); - release_list(_adv); - _adv=0; - - -} - -void CMainFrame::StartApp(const char *appname, CString cmdline, bool wait, const char *folder) -{ - SaveAll(); - STARTUPINFO nfo; - memset(&nfo,0,sizeof(nfo)); - nfo.cb=sizeof(nfo); - HANDLE pipe; - if (wait) - { - HANDLE output; - CreatePipe(&pipe,&output,0,0); - DuplicateHandle(GetCurrentProcess(),output,GetCurrentProcess(),&output,0,TRUE,DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE); - nfo.hStdOutput=output; - nfo.hStdError=output; - nfo.dwFlags|=STARTF_USESTDHANDLES; - m_wndView.SetWindowText(""); - } - Pathname app=appname; - cmdline=_T("\"")+CString(appname)+_T("\" ")+cmdline; - CString startdir; - PROCESS_INFORMATION pi; - if (folder==0) - startdir=app.GetDirectoryWithDrive(); - else - startdir=folder; - if (startdir[startdir.GetLength()-1]=='\\') startdir.Delete(startdir.GetLength()-1); - BOOL res=CreateProcess(appname,cmdline.LockBuffer(),0,0,TRUE,NORMAL_PRIORITY_CLASS|DETACHED_PROCESS,0,startdir,&nfo,&pi); - cmdline.UnlockBuffer(); - if (res==FALSE) - { - CString ss; - AfxFormatString1(ss,IDS_CANNOTEXECUTE,cmdline); - AfxMessageBox(ss,MB_ICONSTOP); - } - else - { - CloseHandle(pi.hThread); - if (wait) - { - int rep=10; - bool end; - do - { - DWORD datalen; - PeekNamedPipe(pipe,0,0,0,&datalen,0); - while (datalen) - { - DWORD readed=0; - char buff[256]; - if (ReadFile(pipe,&buff,255,&readed,0)==FALSE) break; - if (readed==0) break; - int cnt=m_wndView.GetWindowTextLength(); - if (cnt>20000) - { - m_wndView.SetSel(0,10000); - m_wndView.ReplaceSel(""); - cnt=m_wndView.GetWindowTextLength(); - } - buff[readed]=0; - kamenik2windows(buff,readed,buff); - m_wndView.SetSel(cnt,cnt); - m_wndView.ReplaceSel(buff); - PeekNamedPipe(pipe,0,0,0,&datalen,0); - rep=10; - } - UpdateWindow(); - end=WaitForSingleObject(pi.hProcess,200)==WAIT_TIMEOUT; - rep--; - } - while (rep>0 || end); - } - CloseHandle(pi.hProcess); - } - if (wait) - { - CloseHandle(pipe); - CloseHandle(nfo.hStdOutput); - } - SetForegroundWindow(); -} - -void CMainFrame::OnPekladaePelokouzla() -{ - CString cmdline=_T("\"")+_baseMapPath+_T("KOUZLA.TAB")+_T("\""); - Pathname apppath=Pathname::GetExePath(); - CString appname=apppath.GetDirectoryWithDrive()+CString(_T("AdvManData\\CSPELLS.EXE")); - StartApp(appname,cmdline,true,_baseMapPath); -} - -void CMainFrame::OnPekladaePelodialogy() -{ - CString cmdline=_T("\"")+_baseMapPath+_T("DIALOGY.DLG")+_T("\""); - Pathname apppath=Pathname::GetExePath(); - CString appname=apppath.GetDirectoryWithDrive()+CString(_T("AdvManData\\CDIALOGY.EXE")); - StartApp(appname,cmdline,true,_baseMapPath); - -} - -void CMainFrame::OnPekladaePelopostavytab() -{ - CString cmdline=_T("\"")+_baseMapPath+_T("POSTAVY.TAB\" \"")+_baseMapPath+_T("POSTAVY.DAT")+_T("\""); - Pathname apppath=Pathname::GetExePath(); - CString appname=apppath.GetDirectoryWithDrive()+CString(_T("AdvManData\\Lex_Lib.exe")); - StartApp(appname,cmdline,true,_baseMapPath); - -} - -void CMainFrame::OnNstrojeMapedit() -{ - Pathname apppath=Pathname::GetExePath(); - apppath.SetFilename(_T("MapEdit.exe")); - StartApp(apppath,CString(_T("\""))+_advName+_T("\""),false); -} - -void CMainFrame::OnNstrojeTestujdobrodrustv() -{ - Pathname apppath=Pathname::GetExePath(); - apppath.SetFilename(_T("Skeldal.exe")); - StartApp(apppath,CString(_T("\""))+_advName+_T("\""),false); -} - -void CMainFrame::OnNstrojeTvrcepodlah() -{ - Pathname apppath=Pathname::GetExePath(); - apppath.SetFilename(_T("AdvManData\\Podlahar.exe")); - StartApp(apppath,"",false,_advPath+get_text_field(_adv,"CESTA_GRAFIKA")); - -} - -void CMainFrame::OnNstrojeTvrcepaletpronestvry() -{ - Pathname apppath=Pathname::GetExePath(); - apppath.SetFilename(_T("AdvManData\\ColEdit.exe")); - StartApp(apppath,"",false,_advPath+get_text_field(_adv,"CESTA_ENEMY")); -} - - -void CMainFrame::OnNstrojeTvrceikonpropedmty() -{ - Pathname apppath=Pathname::GetExePath(); - apppath.SetFilename(_T("AdvManData\\ItemIcons.exe")); - StartApp(apppath,"",false,_advPath+get_text_field(_adv,"CESTA_ITEMY")); -} - -void CMainFrame::OnEditorySouboradv() -{ - AfxMessageBox(IDS_EDITADVWARN,MB_ICONEXCLAMATION); - OpenEditor(_advName); -} - -void CMainFrame::OnFileZnovunast() -{ - release_list(_adv); - _adv=read_config(_advName); - _baseMapPath=_advPath+get_text_field(_adv,"CESTA_MAPY"); -} - -void CMainFrame::OnUpdateFileZnovunast(CCmdUI* pCmdUI) -{ - pCmdUI->Enable(_adv!=0); -} - -void CMainFrame::OnEditoryDialogy() -{ - DlgDialogy dlg; - dlg._dlgpath.SetDirectory(_baseMapPath); - dlg._dlgpath.SetFilename(_T("Dialogy.dlg")); - dlg.DoModal(); -} - -void CMainFrame::OnUpdateEditory(CCmdUI *pCmdUI) -{ - pCmdUI->Enable(_adv!=0); -} diff --git a/AdvMan/MainFrm.h b/AdvMan/MainFrm.h deleted file mode 100644 index 5a31502..0000000 --- a/AdvMan/MainFrm.h +++ /dev/null @@ -1,95 +0,0 @@ -// MainFrm.h : interface of the CMainFrame class -// -///////////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_MAINFRM_H__0420AD88_2B58_4379_BD0D_069A821C039D__INCLUDED_) -#define AFX_MAINFRM_H__0420AD88_2B58_4379_BD0D_069A821C039D__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "ChildView.h" - - -class CMainFrame : public CFrameWnd -{ - -public: - CMainFrame(); -protected: - DECLARE_DYNAMIC(CMainFrame) - -// Attributes -public: - TSTR_LIST _adv; - CString _baseMapPath; - CString _advPath; - CString _advName; -// Operations -public: - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CMainFrame) - virtual BOOL PreCreateWindow(CREATESTRUCT& cs); - virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo); - //}}AFX_VIRTUAL - -// Implementation -public: - void StartApp(const char *appname, CString cmdline, bool wait, const char *folder=0); - void OpenEditor(const char *name); - void SaveAll(); - static LRESULT BroadcastMessage(UINT msg, WPARAM wParam, LPARAM lParam); - void SetTitle(const _TCHAR *name); - virtual ~CMainFrame(); -#ifdef _DEBUG - virtual void AssertValid() const; - virtual void Dump(CDumpContext& dc) const; -#endif - -protected: // control bar embedded members - CStatusBar m_wndStatusBar; - CToolBar m_wndToolBar; - CToolBar m_wndEditoryBar; - CToolBar m_wndPrekladaceBar; - CEdit m_wndView; - -// Generated message map functions -protected: - //{{AFX_MSG(CMainFrame) - afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); - afx_msg void OnSetFocus(CWnd *pOldWnd); - afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu); - afx_msg void OnFileNovdobrodrust(); - afx_msg void OnFileNatidobrodrustv(); - afx_msg void OnEditoryKouzlatab(); - afx_msg void OnEditoryPostavytab(); - afx_msg void OnEditoryItemsscr(); - afx_msg void OnEditoryItemspic(); - afx_msg void OnEditoryWeaponsscr(); - afx_msg void OnDestroy(); - afx_msg void OnPekladaePelokouzla(); - afx_msg void OnPekladaePelodialogy(); - afx_msg void OnPekladaePelopostavytab(); - afx_msg void OnNstrojeMapedit(); - afx_msg void OnNstrojeTestujdobrodrustv(); - afx_msg void OnNstrojeTvrcepodlah(); - afx_msg void OnNstrojeTvrcepaletpronestvry(); - afx_msg void OnNstrojeTvrceikonpropedmty(); - afx_msg void OnEditorySouboradv(); - afx_msg void OnFileZnovunast(); - afx_msg void OnUpdateFileZnovunast(CCmdUI* pCmdUI); - afx_msg void OnEditoryDialogy(); - afx_msg void OnUpdateEditory(CCmdUI *pCmdUI); -//}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_MAINFRM_H__0420AD88_2B58_4379_BD0D_069A821C039D__INCLUDED_) diff --git a/AdvMan/Pathname.cpp b/AdvMan/Pathname.cpp deleted file mode 100644 index 681b90c..0000000 --- a/AdvMan/Pathname.cpp +++ /dev/null @@ -1,621 +0,0 @@ -// Pathname.cpp: implementation of the Pathname class. -// -////////////////////////////////////////////////////////////////////// - -#include "Pathname.h" -#include -#include -#include -#include -#include - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -#pragma comment(lib,"User32") -#pragma comment(lib,"shell32") - -Pathname::Pathname(const char *name) -{ - _fullpath=NULL; - _path=_filetitle=_extension=_end=""; - - if (name==NULL) SetPathName("*.*"); - else SetPathName(name); -} - -Pathname::Pathname(PathNameNullEnum null) -{ - _fullpath=NULL; - _path=_filetitle=_extension=_end=""; -} - - -Pathname::Pathname(const char *relpath, const Pathname &abspath) -{ - _path=_filetitle=_extension=_end=""; - _fullpath=NULL; - - char *part; - char *pth=strcpy((char *)alloca(sizeof(*relpath)+strlen(relpath)+1),relpath); - part=strrchr(pth,'\\'); - if (part) part++;else part=NULL; - if (part) - { - SetFilename(part); - *part=0; - SetDirectory(pth); - } - else - SetFilename(pth); - if (RelativeToFull(abspath)==false) SetNull(); -} - - -Pathname::~Pathname() -{ - delete [] _fullpath; -} - -const char *Pathname::GetNameFromPath(const char *path) -{ - char *c=strrchr(path,'\\'); - if (c!=NULL) c++;else return path; - return c; -} - -const char *Pathname::GetExtensionFromPath(const char *path) -{ - const char *fname=GetNameFromPath(path); - char *c=strrchr(fname,'.'); - if (c==NULL) c=strrchr(path,0); - return c; -} - -void Pathname::RebuildData(const char *path, const char *filetitle, const char *extension, int pathlen, int titlelen, int extlen) -{ - int totalsize=(pathlen+titlelen+extlen)*2+10; - char *olddata=_fullpath; - _fullpath=new char[totalsize]; - _path=_fullpath+pathlen+titlelen+extlen+1; - memcpy(_path,path,pathlen+1); - _filetitle=_path+pathlen+1; - memcpy(_filetitle,filetitle,titlelen+1); - _extension=_filetitle+titlelen+1; - memcpy(_extension,extension,extlen+1); - _end=_extension+extlen+1; - RebuildPath(); - delete [] olddata; -} - -void Pathname::RebuildPath() -{ - sprintf(_fullpath,"%s%s%s",_path,_filetitle,_extension); -} - -void Pathname::SetDrive(const char dr) -{ - if (HasDrive()) - { - if (dr==0) - { - strcpy(_path,_path+2); - strcpy(_fullpath,_fullpath+2); - } - else - { - _path[0]=dr; - _fullpath[0]=dr; - } - } - else if (dr!=0) - { - int np=IsNetworkPath(); - if (np) - { - _path[0]=dr; - _path[1]=':'; - strcpy(_path+2,_path+np); - RebuildPath(); - } - else - { - char *c=(char *)alloca((strlen(_path)+4)*sizeof(*c)); - sprintf(c,"%c:%s",dr,_path); - SetDirectory(c); - } - } -} - -void Pathname::SetDirectory(const char *dir) -{ - bool copydrv; //directory doesn't contain drive, need copy from original - bool addslash; //directory doesn't ending by backslash, need add it - - int len=strlen(dir); - copydrv=HasDrive() && !HasDrive(dir); //copy original drive, if exists and directory doesn't contaion drive - if (strncmp(dir,"\\\\",2)==0) copydrv=false; //network path, don't copy drive - addslash=len && dir[len-1]!='\\'; //add slash - if (addslash || copydrv) - { - char *c=(char *)alloca((len+4)*sizeof(dir[0])); //allocate some space for string - if (addslash && copydrv) - sprintf(c,"%c%c%s\\",_path[0],_path[1],dir); //add drive and add slash - else if (addslash) - sprintf(c,"%s\\",dir); //add slash only - else - sprintf(c,"%c%c%s",_path[0],_path[1],dir); //add drive only - dir=c; //this is new path for now - len=strlen(dir); - } - if (len<_filetitle-_path) //there is space for store path - {strcpy(_path,dir); RebuildPath();} //store it and rebuild result - else - RebuildData(dir,_filetitle,_extension,len,strlen(_filetitle),strlen(_extension)); - //rebuild internal data complettly -} - -void Pathname::SetFilename(const char *filename) -{ - char *dot=strrchr(filename,'.'); - if (dot==NULL) - { - SetFiletitle(filename); - SetExtension(""); - return; - } - int tllen=dot-filename; - int exlen=strlen(dot); - char *c=(char *)alloca((tllen+1)*sizeof(*c)); - memcpy(c,filename,tllen); - c[tllen]=0; - if (exlen+tllen+1<_end-_filetitle) - { - memcpy(_filetitle,c,tllen+1); - _extension=_filetitle+tllen+1; - memcpy(_extension,dot,exlen+1); - RebuildPath(); - } - else - RebuildData(_path,c,dot,strlen(_path),tllen,exlen); -} - -void Pathname::SetExtension(const char *ext) -{ - int len=strlen(ext); - if (ext[0] && ext[0]!='.') - { - char *s=(char *)alloca((len+2)*sizeof(*s)); - sprintf(s,".%s",ext); - ext=s; - len++; - } - if (len<_end-_extension) - { - memcpy(_extension,ext,len+1); - RebuildPath(); - } - else - { - RebuildData(_path,_filetitle,ext,strlen(_path),strlen(_filetitle),len); - } -} - -void Pathname::SetFiletitle(const char *title) -{ - int len=strlen(title); - if (len<_extension-_filetitle) - { - memcpy(_filetitle,title,len+1); - RebuildPath(); - } - else - { - RebuildData(_path,title,_extension,strlen(_path),len,strlen(_extension)); - } -} - -void Pathname::SetPathName(const char *pathname) -{ - if (pathname==NULL || pathname[0]==0) - { - SetNull(); - return; - } - char *part; - DWORD needsz=GetFullPathName(pathname,0,NULL,&part); - char *fpth=(char *)alloca(needsz*sizeof(*fpth)); - GetFullPathName(pathname,needsz,fpth,&part); - part=strrchr(fpth,'\\'); - if (part) part++;else part=NULL; - if (part) - { - SetFilename(part); - *part=0; - } - else - SetFilename(""); - SetDirectory(fpth); -} - -Pathname& Pathname::operator=(const Pathname& other) -{ - if (other.IsNull()) SetNull(); - else RebuildData(other._path,other._filetitle,other._extension,strlen(other._path),strlen(other._filetitle),strlen(other._extension)); - return *this; -} - -Pathname::Pathname(const Pathname &other) -{ - _fullpath=NULL; - if (other.IsNull()) SetNull(); - else RebuildData(other._path,other._filetitle,other._extension,strlen(other._path),strlen(other._filetitle),strlen(other._extension)); -} - -bool Pathname::FullToRelative(const Pathname &relativeto) -{ - if (relativeto.IsNull() || IsNull()) return false; - bool h1=HasDrive(); - bool h2=relativeto.HasDrive(); - if (h1!=h2) return false; //rozdilny zpusob adresace - nelze vytvorit relatvni cestu - if (h1==true && h2==true && toupper(GetDrive())!=toupper(relativeto.GetDrive())) - return false; //ruzne disky, nelze vytvorit relativni cestu - if (strncmp(_path,"\\\\",2)==0) //sitova cesta - { - int slsh=0; //citac lomitek - const char *a=_path; - const char *b=relativeto._path; - while (toupper(*a)==toupper(*b) && *a && slsh<3) //zacatek sitove cesty musi byt stejny - { - if (*a=='\\') slsh++; - a++;b++; - } - if (slsh!=3) return false; //pokud neni stejny, nelze vytvorit relativni cestu - } - int sublevel=0; - const char *ps1=_path; - const char *ps2=relativeto._path; - if (h1) - {ps1+=2;ps2+=2;} - const char *sls=ps2; - while (toupper(*ps1)==toupper(*ps2) && *ps1) - { - if (*ps2=='\\') sls=ps2+1; - ps1++;ps2++; - } - ps1-=ps2-sls; - if (sls) - { - while (sls=strchr(sls,'\\')) - { - sls++; - sublevel++; - } - } - char *buff=(char *)alloca((sublevel*3+strlen(ps1)+1)*sizeof(*buff)); - char *pos=buff; - for (int i=0;iref._path) - { - end--; - while (end>ref._path && end[-1]!='\\') end--; - } - beg+=3; - } - else - beg+=2; - } - int partln=end-ref._path; - char *buff=(char *)alloca((partln+strlen(beg)+1)*sizeof(*buff)); - memcpy(buff,ref._path,partln); - strcpy(buff+partln,beg); - SetDrive(0); - SetDirectory(buff); - return true; -} - -int Pathname::IsNetworkPath() const -{ - if (strncmp(_path,"\\\\",2)==0) //sitova cesta - { - const char *p=_path+2; - char *c=strchr(p,'\\'); - if (c) return c-_path; - } - return 0; -} - -void Pathname::SetServerName(const char *server) -{ - if (HasDrive()) SetDrive(0); - else - { - int np=IsNetworkPath(); - if (np) strcpy(_path,_path+np); //str - } - char *buff=(char *)alloca((strlen(server)+strlen(_path)+5)*sizeof(*buff)); - if (_path[0]!='\\') - sprintf(buff,"\\\\%s\\%s",server,_path); - else - sprintf(buff,"\\\\%s%s",server,_path); - SetDirectory(buff); -} - -void Pathname::SetNull() -{ - delete [] _fullpath; - _fullpath=NULL; - _path=_filetitle=_extension=_end=""; -} - -bool Pathname::GetPartFromPath(const char *path, int partnum, char *buff, int bufsize, int mode) -{ - const char *scan=path; - while (*scan=='\\') scan++; - while (partnum && *scan) - { - while (*scan!='\\' && *scan) scan++; - while (*scan=='\\') scan++; - partnum--; - } - if (*scan==0) - { - buff[0]=0; - return false; - } - int pt=0; - if (mode==-1) - { - pt=scan-path; - if (pt>bufsize) - { - buff[0]=0; - return true; - } - else - memcpy(buff,path,pt); - } - bool nlast=false; - while (*scan && (mode==1 || !nlast) && ptsize) return false; - if (psize==0) {buff[0]=0;return true;} - strncpy(buff,GetDirectoryWithDrive(),psize-1); - buff[psize-1]=0; - return true; -} - -bool Pathname::IsPathValid() const -{ - if (IsNull()) return false; - char *invalidChars="/*?\"<>|"; - const char *path=GetFullPath(); - if (*path==0) return false; - while (*path) - { - if (strchr(invalidChars,*path)!=NULL) return false; - path++; - } - return true; -} - - - -bool Pathname::SetTempDirectory() -{ - char buff[1]; - DWORD size=GetTempPath(1,buff); - if (size==0) return false; - size++; - char *p=(char *)alloca(size); - if (GetTempPath(size,p)==0) return false; - SetDirectory(p); - return true; -} - -bool Pathname::SetDirectorySpecial(int nSpecCode) -{ - char buff[MAX_PATH]; - if (SHGetSpecialFolderPath(GetForegroundWindow(),buff,nSpecCode,FALSE)!=NOERROR) return false; - SetDirectory(buff); - return true; -} - -bool Pathname::SetTempFile(const char *prefix, unsigned int unique) -{ - char tempname[MAX_PATH]; - if (GetTempFileName(GetDirectoryWithDrive(),prefix,unique,tempname)==0) return false; - this->SetPathName(tempname); - return true; -} - -Pathname Pathname::GetExePath() -{ - char buff[MAX_PATH*4]; - GetModuleFileName(NULL,buff,sizeof(buff)); - return Pathname(buff); -} - -const char *Pathname::FullToRelativeProjectRoot(const char *full, const char *projectRoot) -{ - const char *a=full,*b=projectRoot; - while (*a && tolower(*a)==tolower(*b)) {a++;b++;}; - if (*b) return full; - return a; -} - -bool Pathname::CreateFolder(void *security_descriptor) -{ - int begpart=-1; - int len=strlen(_fullpath)+1; - char *buff=(char *)alloca(len); - for (int i=1;GetPart(i,buff,len,-1);i++) - { - if (begpart==-1 && _check_file_exists(buff)!=0) begpart=i; - if (begpart!=-1) - { - if (begpart==-1) begpart=i; - BOOL res=CreateDirectory(buff,(LPSECURITY_ATTRIBUTES)security_descriptor); - if (res==FALSE) - { - for (int j=i;i>=begpart;i--) - { - GetPart(i,buff,len,-1); - RemoveDirectory(buff); - } - return false; - } - } - } - return true; -} - -bool Pathname::CreateFolder(const char *path, void *security_descriptor) -{ - Pathname pth; - pth.SetDirectory(path); - return pth.CreateFolder(security_descriptor); -} - -static bool RemoveDirectoryFull(const Pathname &p, int part, char *buff, int bufsize) -{ - if (p.GetPart(part+1,buff,bufsize,-1)) - if (RemoveDirectoryFull(p,part+1,buff,bufsize)==false) return false; - p.GetPart(part,buff,bufsize, -1); - return RemoveDirectory(buff)!=FALSE; -} - -static bool RemoveDirRecursive(const char *dir, const char *mask) -{ - if (dir==0 || dir[0]==0) return false; - if (strcmp(dir,"\\")==0) return false; - bool res=true; - Pathname newp; - newp.SetDirectory(dir); - if (mask) - { - WIN32_FIND_DATAA fnd; - HANDLE h; - newp.SetFilename(mask); - h=FindFirstFileA(newp,&fnd); - if (h) - { - do - { - if (!(fnd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - { - newp.SetFilename(fnd.cFileName); - if (DeleteFile(newp)==FALSE) res=false; - } - }while (FindNextFileA(h,&fnd)); - CloseHandle(h); - } - } - { - WIN32_FIND_DATAA fnd; - HANDLE h; - newp.SetFilename("*.*"); - h=FindFirstFileA(newp,&fnd); - if (h) - { - do - { - if ((fnd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(fnd.cFileName,".")!=0 && strcmp(fnd.cFileName,"..")!=0) - { - newp.SetFilename(fnd.cFileName); - if (RemoveDirRecursive(newp,mask)==false) res=false; - else DeleteFile(newp); - } - }while (FindNextFileA(h,&fnd)); - CloseHandle(h); - } - } - return res; - -} - -bool Pathname::DeleteFolder(int dfFlags) -{ - int bufflen=strlen(_fullpath)+1; - char *buff=(char *)alloca(bufflen); -/* if (dfFlags & DFRecycleBin) - { - GetDirectoryWithDriveWLBS(buff,bufflen); - SHFILEOPSTRUCT delinfo; - delinfo.hwnd=NULL; - delinfo.wFunc=FO_DELETE; - delinfo.pFrom=GetFullPath(); - delinfo.pTo=NULL; - delinfo.fFlags=FOF_ALLOWUNDO|FOF_NOCONFIRMATION|FOF_NOERRORUI|((dfFlags & DFRecursive)?0:FOF_NORECURSION)| - ((dfFlags & DFShowProgress)?0:FOF_SILENT); - delinfo.fAnyOperationsAborted=0; - delinfo.hNameMappings=0; - delinfo.lpszProgressTitle=0; - - } - else*/ - { - if (dfFlags & DFRecursive) - { - bool res=RemoveDirRecursive(GetDirectoryWithDrive(),dfFlags & DFFile?GetFilename():0); - if (res==false) return false; - } - if (dfFlags & DFPath) - { - if (GetPart(1,buff,bufflen,-1)==false) return false; - return RemoveDirectoryFull(*this, 1,buff,bufflen); - } - else - { - GetDirectoryWithDriveWLBS(buff,bufflen); - return RemoveDirectory(buff)!=FALSE; - } - - } - return false; -} \ No newline at end of file diff --git a/AdvMan/Pathname.h b/AdvMan/Pathname.h deleted file mode 100644 index da57e63..0000000 --- a/AdvMan/Pathname.h +++ /dev/null @@ -1,451 +0,0 @@ -// Pathname.h: interface for the Pathname class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_Pathname_H__40F41C23_3AA2_486C_B9E5_33AEE67FB313__INCLUDED_) -#define AFX_Pathname_H__40F41C23_3AA2_486C_B9E5_33AEE67FB313__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include -#include -#include - -#ifndef ASSERT -#ifdef _DEBUG -#define ASSERT(x) assert(x) -#else -#define ASSERT(x) -#endif -#endif - -enum PathNameNullEnum {PathNull}; - -#define PathNameCompare(op) bool operator op (const Pathname &other) const \ -{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 istrcmp(_fullpath,other) op 0;} - -#ifndef _UNICODE - -/** class Pathname simplifying manipulation with pathnames, filenames, general paths, and -also supports convert from absolute path to relative respectively */ - - - -class Pathname -{ - ///object value and data - /**The implementation of Pathname creates only one buffer for all variables. It can - increase speed by effective memory use. Strings are stored one after another separated - by zero byte. Evry time any string changed, implementation recalculate buffer usage, and - decide, whether it should resize buffer or not. - - _fullpath also points to string contain full path with filename, - it is dominant value of the class - */ - char *_fullpath; - char *_path; /// - If name is provided, Pathname will expand it into full name with drive and folder name. - @param name optional argument to inicialize object - */ - Pathname(const char *name=NULL); - - ///Construct Pathname class - /** Using this constructor Pathname(PathNull) will create Pathname class with null content is set. - If null content is set, all string-query function returns NULL. IsNull function returns true. This state - is sets until new path is assigned. There is a set of functions invalid called in null state. - */ - - Pathname(PathNameNullEnum null); - - ///Construct Pathname class - /** - @param relpath Relative path or uncomplette path or single filename with extension. - Pathname will expand this pathname into full using absolute path provided by the second - argument. - @param abspath Absolute path used as reference to folder - the origin of relative path - provided in the first argument. - */ - Pathname(const char *relpath, const Pathname &abspath); - - ///Construct Pathname as copy of another pathname - Pathname(const Pathname &other); - - ///Destruct Pathname - virtual ~Pathname(); - - ///Function returns the current drive letter. - /** Before usage, ensure, that current pathname contain drive. - In network path drive letter is missing. - In this case, result is undefined. To ensure, use HasDrive function - @return the drive letter of current path. - */ - char GetDrive() const - { - if (IsNull()) return 0; - return _path[0]; - } - - ///Static function determines, if argument contain a drive information. - /** - @param dir directory to inspect - @return true, if directory contain drive.

- This function is independed, it don't need any Pathname variable declared. - */ - static bool HasDrive(const char *dir) - {return (isalpha(dir[0]) && dir[1]==':');} - - ///Function determines, if current pathname contain a drive information - /** - @return true, if current pathname contain a drive information - */ - bool HasDrive() const - { - if (IsNull()) return false; - return HasDrive(_path); - } - - - ///Function returns current folder name - /** - if current folder name contain drive, only folder name is returned (without drive). - In other cases (relative or network drives) returns full path. - @return folder name or full path. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const char *GetDirectory() const - { - if (HasDrive()) return _path+3; - else return _path; - } - - const char *GetDirectoryWithDrive() const - { - return _path; - } - - ///Function returns current filename with extension - /** - @return current filename with extension. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const char *GetFilename() const - { - if (IsNull()) return NULL; - const char *blk=strrchr(_fullpath,'\\'); - if (blk) blk=blk+1;else blk=_fullpath; - return blk; - } - - ///Function returns current extension (with starting dot) - /** - @return current extension. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const char *GetExtension() const - {return _extension;} - - ///Function returns current filename without extension (without dot) - /** - @return current filename without extension (without dot). Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const char *GetTitle() const - {return _filetitle;} - - ///Function changes current drive. - /**If object contain pathname with drive, then current drive is changed and function returns. - If object contain network path, then computer name is changed to the drive name. - If object contain relative path, then whole path is replaced by path on root on drive. - @param dr new drive letter. This parameter can be set to zero. It means, that current - driver is deleted, and path is converted to relative path from root. Note: Zero c - cannot be used with network paths and relative paths, and finnaly has no effect to the object - */ - - void SetDrive(const char dr); - - ///Sets new directory for object - /** if object contain a drive letter and argument dir doesn't, then current drive is remain - and only directory part is replaced. If current path is network path or relative path, - then whole path is replaced by new one. - If argument dir contain drive letter, then whole path is replaced too. - @param dir contain new pathname. Backslash should be the last character in string - */ - void SetDirectory(const char *dir); - - ///Sets new filename for object. - /** - If filename contain dot, function assumes, that filename is provided with extension. - Otherwise, current extension remains untouched. - @param filename new filename for object - */ - - void SetFilename(const char *filename); - - ///Sets new extension for object. - /** - If ext doesn't starting with dot, function adds it. - @param ext new extension for object - */ - void SetExtension(const char *ext); - - ///Sets new file title - /** Function changes file title, extension remains untouched. - if title contains extension (dot inside its name), this extension doesn't change - current extension. For example, if current extension is ".cpp" and filetitle contain - "source.h", then result is "source.h.cpp" - @param title a new title for object. - */ - - void SetFiletitle(const char *title); - - ///Function returns full pathname. - /** - @return current pathname. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - - const char *GetFullPath() const - {return _fullpath;} - - ///Sets pathname - /** Function has same effect as constructor. But it can be used - anytime during object lifetime. It simply replaces current pathname with newer. Pathname - in argument is expanded to full pathname, current directory is used as reference. - @param pathname new pathname - */ - void SetPathName(const char *pathname); - - Pathname& operator=(const char *other) - {SetPathName(other);return *this;} - Pathname& operator=(const Pathname& other); - - ///converts object to string - operator const char *() const - {return GetFullPath();} - - ///Static function to help getting filename from pathname - /** Function finds last backslash / and return pointer to first character after it. - Pointer stays valid until original path is destroyed or until original path is changed - @param path pathname to inspect as string - @return pointer to filename - */ - static const char *GetNameFromPath(const char *path); - - ///Static function to help getting extension from pathname - /** Function finds last dot '.' in filename return pointer to it (extension with dot). - Pointer stays valid until original path is destroyed or until original path is changed - @param path pathname to inspect as string - @return pointer to extension - */ - static const char *GetExtensionFromPath(const char *path); - - ///Function sets server name for network path - /** If current path is network path, then changes server name to newer. Otherwise - it remove drive letter, and insert server name before remain path - @param server server name without slashes - */ - void SetServerName(const char *server); - - ///Function inspects current path and returns, whether contain server name - /**@return zero, if current path is not valid network path. Nonzero if path contain - server name. Then value returned count characters containing server name with precedent - slashes. - */ - int IsNetworkPath() const; - - ///Function converts current relative path into absolute path - /** - If current path is not relative, function do nothing. - @param ref reference to path, against which path is relative. - @return true if path has been converted, or false, if conversion is impossible - */ - bool RelativeToFull(const Pathname &ref); - - ///Function converts current absolute path into relative path - /** - If current path is not relative, function do nothing. Both paths must be on the same - drive or network computer. - - @param ref reference to path, against which path should be relative. - @return true if path has been converted, or false, if conversion is impossible - */ - bool FullToRelative(const Pathname &relativeto); - - Pathname& operator+=(const char *relativePath) - {*this=Pathname(relativePath,*this);return *this;} - - Pathname operator+(const char *relativePath) - {Pathname out(relativePath,*this);return out;} - - bool IsNull() const {return _fullpath==NULL;} - - void SetNull(); - - PathNameCompare(<) - PathNameCompare(>) - PathNameCompare(==) - PathNameCompare(>=) - PathNameCompare(<=) - PathNameCompare(!=) - - - ///Function gets part of pathname - /** - @param path subject of examine - @param partnum zero-base index of part of pathname. Index 0 mostly contain drive or server, in case of - relative path, there is the name of the first folder or dots. - @param buff buffer for store result - @param bufsize count characters in buffer; - @param mode mode=0, gets only name of part. - mode=1, get current part and remain parts of path. - mode=-1, gets all parts till current - @return Function returns true, if it was succesful, and it was not last part. Function returns - false, if it was succesful, and it was last part. Function returns false and sets buffer empty, - if an error occured. Function returns true and sets buffer empty, if buffer is too small to hold data - */ - static bool GetPartFromPath(const char *path, int partnum, char *buff, int bufsize, int mode=0); - - ///Function gets part of object - /** - @param partnum zero-base index of part of pathname. Index 0 mostly contain drive or server, in case of - relative path, there is the name of the first folder or dots. - @param buff buffer for store result - @param bufsize count characters in buffer; - @param mode mode=0, gets only name of part. - mode=1, get current part and remain parts of path. - mode=-1, gets all parts till current - @return Function returns true, if it was succesful, and it was not last part. Function returns - false, if it was succesful, and it was last part. Function returns false and sets buffer empty, - if an error occured. Function returns true and sets buffer empty, if buffer is too small to hold data - */ - bool GetPart(int partnum, char *buff, int bufsize,int mode=0) const - { - return GetPartFromPath(this->_fullpath,partnum,buff,bufsize,mode); - } - - /// Get Directory With Drive Without Last Back Slash - /** Retrieves into buffer directory with drive and removes last backslash - @param buff buffer that retrieves path - @param size size of buffer - @return true, if success, failed if buffer is too small*/ - - - bool GetDirectoryWithDriveWLBS(char *buff, size_t size) const; - - - /// function checks, if path is valid and returns true, if does. - bool IsPathValid() const; - - /// Sets special directory. - /** - @param bSpecCode this value may be operation-system - depend. Windows implementation using CSIDL_XXXX constants, which is described in SHGetSpecialFolderLocation function - description - @return true, if function were successful - */ - bool SetDirectorySpecial(int nSpecCode); - - ///Sets temporaly directory. - bool SetTempDirectory(); - - ///Guess temporaly file name - /** - @param prefix prefix string for name - @param unique if unique is non-zero, it is used for new temporaly file. If unique is zero, function guess own unique - value. - @return true if function were successful - */ - bool SetTempFile(const char *prefix="tmp", unsigned int unique=NULL); - - ///Returns path of current executable. - /**It useful, when accessing folder, from when current module has been executed */ - static Pathname GetExePath(); - - ///Solves most used conversion from fullpath to path relative to project root - /** - @param full full pathname with drive - @param projectRoot project root path - @return function returns pointer to full path, where starts relative part. If - fullpath doesn't contain project root path, it returns pointer to full. - @example FullToProjectRoot("x:\\project\\data\\example.txt","x:\\project"); //result is "data\\example.txt" - */ - - static const char *FullToRelativeProjectRoot(const char *full, const char *projectRoot); - - ///Creates folder from path - static bool CreateFolder(const char *path, void *security_descriptor=0); - - ///Creates all folders from path stored in object - /** - Function creates path stored in object. Function creates whole path, when it doesn't - exists. - @param security_descriptor pointer for additional information about security on new folder - if this parameter is NULL, default descriptor is used. This parameter is platform - depended. - @return if path has been created, returns true. In case of error, returns false - and no changes are made on disk (Function rollbacks any changes) - */ - bool CreateFolder(void *security_descriptor=0); - - - enum DeleteFolderFlags { - DFSimple=0, //only deletes latest folder - DFPath=1, //deletes whole path, if there are no files - DFFile=2, //deletes file specified in object. You can use wildcards - DFRecursive=4, //also deletes all folders inside the path -/* DFRecycleBin=8, //move all deleted files or folders into recycle bin - DFShowProgress=16, //enables progress bar during deleting*/ - }; - - ///Deletes folder stored in object - /** - @param dfFlags combination of flags. - @return function returns true, when no error occured. Function return false, - when error occured. - */ - bool DeleteFolder(int dfFlags); - - -protected: - ///Function rebuild buffer with new values - /** This protected function recalculates space for buffer, allocated it, and rebuild its - content with data supplied by arguments. Function doesn't assumes, that all strings are - terminated by zero by default. "pathlen, titlelen and extlen" must contain correct values. - Terminating zero is not included, but function excepting it. - Valid using is: RebuildData(a,b,c,strlen(a),strlen(b),strlen(c)); - All pointers returned by Get functions can be used and stays valid, until this function returns. - */ - void RebuildData(const char *path, const char *filetitle, const char *extension, int pathlen, int titlelen, int extlen); - ///Function only rebuild _fullpath string. - /** It doesn't check space for string! This function is used, when length of path is excepted - the same or smaller, then current. - */ - void RebuildPath(); - - -}; - - -#else - -#error unicode version of Pathname is not currently supported - -#endif - -#undef PathNameCompare - -#endif // !defined(AFX_Pathname_H__40F41C23_3AA2_486C_B9E5_33AEE67FB313__INCLUDED_) diff --git a/AdvMan/StdAfx.cpp b/AdvMan/StdAfx.cpp deleted file mode 100644 index 46c628d..0000000 --- a/AdvMan/StdAfx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// AdvMan.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - - - diff --git a/AdvMan/StdAfx.h b/AdvMan/StdAfx.h deleted file mode 100644 index 3541103..0000000 --- a/AdvMan/StdAfx.h +++ /dev/null @@ -1,33 +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__978B5377_B3F7_4A88_A4CA_02390EC070E2__INCLUDED_) -#define AFX_STDAFX_H__978B5377_B3F7_4A88_A4CA_02390EC070E2__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -#include // MFC core and standard components -#include // MFC extensions -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - -extern "C" -{ -#include -#include -} -#include "Pathname.h" -#include -#include "..\mapedit\editor.h" -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__978B5377_B3F7_4A88_A4CA_02390EC070E2__INCLUDED_) diff --git a/AdvMan/bgraph2dx.h b/AdvMan/bgraph2dx.h deleted file mode 100644 index e69de29..0000000 diff --git a/AdvMan/debug.h b/AdvMan/debug.h deleted file mode 100644 index e69de29..0000000 diff --git a/AdvMan/idc_note.ico b/AdvMan/idc_note.ico deleted file mode 100644 index c6dc4fe93294834c9ab82ccf4b2de2d9dbd8bff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2550 zcmbW3J!oS`5P(OqxF?=n*ecveg=0cE*PF(mBA7smU^pJQ_BGlj7z8OCM2c6bNfQVd zw#pSrNQyfS6GA|ZszBl;rQO6}aB*M@B0~y+l1#o`z34v|$V#*Gc4l_wd$UjCiIn6G z+1ZgezNv`3&DG}SW?VlmiTr}?F{>TqU8E!!7&0sUZrsEKc-D0=cEq04NY;)KhcE`eDci2(l zv3u+uyT{(I8nt1=1`C6ymNLf{QfK^O9orka0~NI$QL)w3b}%`L zItn*(smebQy>2x}Bc6KHg7Z-AVelAy6S8{!QEw{I~a(8zp4-XGA z91dkLQu*@PGk(W8-3`BipvV_jA#Yf!q^}(xz1F+v>@SY_fMjv>`?CSiXl-^%k~x3U z91mOQW^LZzZ!{XsX5&SzT^&dC=lw~OfJUR%u4TkAbivzf*rvt!7zv zUt`L$#$tZk9*?Y+QKZ&b;G5oSy?v6kvuaU)v^3H->6^_W|0r4bjPO@MEcP$DlMw+Y zQ-8V~kk&{);a^A}!qdz)r~FF+fuLh2{aY?DN~_KLX@8aj(&qjBv_DG)AUL_7GQLKV9p;3O!kk|dt=h#(@gul_#TqJpq(F*$g z@5cIrs0q{GTOW42-R~(pLI&&`u8I5&2MZ}L diff --git a/AdvMan/mem.h b/AdvMan/mem.h deleted file mode 100644 index b0216b8..0000000 --- a/AdvMan/mem.h +++ /dev/null @@ -1,4 +0,0 @@ -__inline void *getmem(int32_t sz) -{ - return malloc(sz); -} \ No newline at end of file diff --git a/AdvMan/res/AdvMan.ico b/AdvMan/res/AdvMan.ico deleted file mode 100644 index 5311fc7bb56d51f35cf31db5506d70d8281a435a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmd6lF^=3Y3`IHX04iK~jxbfQs->Fug~nS63_ zWfW6B#N?etihYXkW`mmk#iY}P@q=;bw4mYFwxAIRnq&+97*tuH?@cIYeD5Sq0{XLV__Wi}Kqg-`c_Rrn4j#_K~&R-%{ z53lbyzlBfX@#v2)eBcpt;nWU4$9weQcQ(_`^auU?iA*R!Klt76oOK=}9-Oz{sJWr{ zNDKOL;Ut?!2+)rNMYReK;qb_*AG~^CxOpVqJ%loG>ebJs#IL()o_e#t;{Ra30V3vA A&;S4c diff --git a/AdvMan/res/AdvMan.rc2 b/AdvMan/res/AdvMan.rc2 deleted file mode 100644 index cb2e42e..0000000 --- a/AdvMan/res/AdvMan.rc2 +++ /dev/null @@ -1,13 +0,0 @@ -// -// ADVMAN.RC2 - resources Microsoft Visual C++ does not edit directly -// - -#ifdef APSTUDIO_INVOKED - #error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/AdvMan/res/Toolbar.bmp b/AdvMan/res/Toolbar.bmp deleted file mode 100644 index 90aadbeaf9d575719d8c3036e1c87f0e6dca2031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 886 zcmZXSJxc>I7{?P#S}8w zk91I>!VU5NBzN_w|GZo-&o9sO}W2Yg_Q;V81hRUYX z_(6{$TP~OQlEH_{yr&Tw3QeI?TY|ag=B|{D$h_x$wZX_8)cy+xMc!zv`NtbX!TPX> zE7jrG^%l=yS4Mf1iXB7!KmJC_I&1kfM3;&E=0MmN#164YWOpyd-{HcJk-8q%HH7 zm+O_3St7T2TL}N=Un-G7SfBJ=nIuVH4p#YPmN$IJC-^t|%U}3|idzW0D^ZZYOdsmn zf`|6H`(4EI7a3*KYrE@x$Xhq>;P`HSXkfR_s6fQRJ z?fQco5A3{|oyY7O;QjOCQG$KLzhZr1C0Gyg1TXS83lQ83JXf?v1h+Iz1bBq9-|vAe z_;8E&jIeNVi%vvox9GOF`L&+-A@G4^u4NwbTJ2>2T)&_(sZROzeZCQyrRaA?Q3;AW|sc~``aSc zGgxlDNsEGY=vfCju5&Fi%Wpj*I36Ou1YNE7X`Du@xnHhP?{-}efczm*#R;eW3jJyi z6cnu4j1~B+UFT}@2T4Hw<$RIA_hS!l*Y+|Cr02y4~weH%@|NuJ=@~| SAM*>Jdeol|)9O+_(}@28b6Z3J diff --git a/AdvMan/res/prekladace.bmp b/AdvMan/res/prekladace.bmp deleted file mode 100644 index 5493fd2e79b976b2294b8ab1fc96985d19e98f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478 zcmYL@F>b>!3`LosLy@I9f}uqndxkqcoe*E4H|Pc0$P=Q-$8yemzlgcW;9G`)8H9yonkG1j`4%%~5Ec=G zi1M3#Y-|1e{pH-fH-ndhmc#BmXb4g1JviJs&V$G{!Y`M(UlZ2u{Ml`T1o)`!x51qw zbRl#RKBB+DwIsX%@qW5$vz4WkoYQmYM>=MTrn_^_Yk=sf@adYp&M{}_7{R4U|8CA} pjKHW1@qd4HjN0$2KZ^I*xNv0tZ+9fu^is4oBj diff --git a/AdvMan/resource.h b/AdvMan/resource.h deleted file mode 100644 index 009d8cc..0000000 --- a/AdvMan/resource.h +++ /dev/null @@ -1,88 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by AdvMan.rc -// -#define IDC_ADD 4 -#define IDC_DELETE 5 -#define IDC_RESCAN 6 -#define IDD_ABOUTBOX 101 -#define IDD_TEXTEDITOR 105 -#define IDR_EDITORMENU 107 -#define IDI_MAINICON 117 -#define IDI_NOTEPADICON 118 -#define IDR_MAINFRAME 128 -#define IDR_ADVMANTYPE 129 -#define IDS_NOVEDOBRODRUZSTVIDOKONCENO 129 -#define IDD_NOVEDOBR 130 -#define IDS_ADVFILTER 130 -#define IDS_CHYBAPRICTENI 131 -#define IDS_MAINFRAMETITLE 132 -#define IDS_UNTITLED 133 -#define IDS_CANNOTEXECUTE 134 -#define IDD_DIALOGY 134 -#define IDS_NEMOHUNAJITNICOD 135 -#define IDD_NOVYDIALOG 135 -#define IDS_EDITADVWARN 136 -#define IDR_TOOLEDITORY 136 -#define IDS_DLGNAME 137 -#define IDS_DLGDESC 138 -#define IDR_PREKLADACE 138 -#define IDS_DLGID 139 -#define IDS_UNABLETOSAVEDIALOGYDLG 140 -#define IDS_NODESC 141 -#define IDC_JMENO 1000 -#define IDC_EDIT 1000 -#define IDC_ORGANIZACE 1001 -#define IDC_RADIO2 1002 -#define IDC_RADIO3 1003 -#define IDC_KOUZLA 1004 -#define IDC_DIALOGY 1005 -#define IDC_DEFINICE 1006 -#define IDC_MAPY 1007 -#define IDC_MAPY2 1008 -#define IDC_ORIGDLGS 1008 -#define IDC_STARTMAP 1009 -#define IDC_MINPOSTAV 1010 -#define IDC_MAXPOSTAV 1011 -#define IDC_DLGLIST 1012 -#define IDC_POPIS 1013 -#define IDC_CISLO 1016 -#define ID_FILE_NOVDOBRODRUST 32771 -#define ID_FILE_NATIDOBRODRUSTV 32773 -#define ID_EDITORY_KOUZLATAB 32774 -#define ID_EDITORY_POSTAVYTAB 32775 -#define ID_EDITORY_DIALOGY 32776 -#define ID_EDITORY_ITEMSSCR 32777 -#define ID_EDITORY_ITEMSPIC 32778 -#define ID_EDITORY_WEAPONSSCR 32779 -#define ID_NSTROJE_TVRCEPODLAH 32780 -#define ID_NSTROJE_TVRCEPALETPRONESTVRY 32781 -#define ID_NSTROJE_TVRCEIKONPROPEDMTY 32782 -#define ID_PEKLADAE_PELOKOUZLA 32783 -#define ID_PEKLADAE_PELODIALOGY 32784 -#define ID_PEKLADAE_PELOPOSTAVYTAB 32785 -#define ID_NSTROJE_EXPORTUJDOBRODRUSTV 32786 -#define ID_NSTROJE_TEKADDLSOUBOR 32787 -#define ID_NSTROJE_MAPEDIT 32788 -#define ID_NSTROJE_TESTUJDOBRODRUSTV 32789 -#define ID_EDITORY_SOUBORADV 32790 -#define ID_FILE_ZNOVUNAST 32791 -#define ID_VIEW_PREKLADACE 32802 -#define ID_VIEW_EDITORY 32810 -#define ID_PRAVY_UNDO 40001 -#define ID_UPRAVY_COPY 40002 -#define ID_UPRAVY_VYJMOUT 40003 -#define ID_UPRAVY_VLOZIT 40004 -#define ID_UPRAVY_VYMAZAT 40005 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 140 -#define _APS_NEXT_COMMAND_VALUE 32815 -#define _APS_NEXT_CONTROL_VALUE 1018 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/AdvMan/skeldal_win.h b/AdvMan/skeldal_win.h deleted file mode 100644 index 4fa48b5..0000000 --- a/AdvMan/skeldal_win.h +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include -#include -#include \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index ad8266b..f937be8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ if (MSVC) 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 -funsigned-char) + add_compile_options(-Wall -Wextra -Werror -Wno-unused-result -Wno-unused-parameter -Wno-unused-value -Wno-extern-c-compat -funsigned-char) set(STANDARD_LIBRARIES "pthread") endif() diff --git a/DDLReader/DDLFile.cpp b/DDLReader/DDLFile.cpp deleted file mode 100644 index e0cc247..0000000 --- a/DDLReader/DDLFile.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "stdafx.h" -#include ".\ddlfile.h" - -DDLFile::DDLFile(void) -{ - _hFile=0; -} - -DDLFile::~DDLFile(void) -{ - if (_hFile!=0) CloseHandle(_hFile); -} - - - - -bool DDLFile::OpenDDLFile(WString filename) -{ - _hFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, - OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,NULL); - if (_hFile==INVALID_HANDLE_VALUE) - { - _hFile=0; - return false; - } - return true; -} - -bool DDLFile::ReadFile(void *data, size_t sz) -{ - DWORD readed=0; - if (::ReadFile(_hFile,data,sz,&readed,NULL)==FALSE) return false; - if (readed!=sz) return false; - return true; -} - -bool DDLFile::EnumFiles(IDDLFileEnumerator &enmClass) -{ - uint32_t firstGroup; - uint32_t groupEndOffset; - uint32_t endGroups; - int i; - int ngroups; - SetFilePointer(_hFile,0,0,FILE_BEGIN); - if (ReadFile(&firstGroup,sizeof(firstGroup))==false) return false; - if (ReadFile(&groupEndOffset,sizeof(firstGroup))==false) return false; - uint32_t *group=(uint32_t *)alloca(groupEndOffset); - group[0]=firstGroup; - group[1]=groupEndOffset; - ngroups=groupEndOffset/8; - if (groupEndOffset!=8 && ReadFile(group+2,groupEndOffset-8)==false) return false; - SetFilePointer(_hFile,12,0,FILE_CURRENT); - if (ReadFile(&endGroups,sizeof(endGroups))==false) return false; - for (i=0;i(other); - dother.data=0;dother.sz=0; - } - DDLData& operator =(const DDLData &other) - { - DDLData &dother=const_cast(other); - data=other.data;sz=other.sz; - dother.data=0;dother.sz=0; - return *this; - } -}; - -class DDLFile -{ - HANDLE _hFile; - - bool ReadFile(void *data, size_t sz); -public: - DDLFile(void); - ~DDLFile(void); - - bool OpenDDLFile(WString filename); - bool EnumFiles(IDDLFileEnumerator &enmClass); - DDLData ExtractFile(uint32_t offset); - uint32_t GetFileSize(uint32_t offset); -}; diff --git a/DDLReader/DDLReader.cpp b/DDLReader/DDLReader.cpp deleted file mode 100644 index 2042ba3..0000000 --- a/DDLReader/DDLReader.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// DDLReader.cpp : Defines the class behaviors for the application. -// - -#include "stdafx.h" -#include "DDLReader.h" -#include "DDLReaderDlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderApp - -BEGIN_MESSAGE_MAP(CDDLReaderApp, CWinApp) - //{{AFX_MSG_MAP(CDDLReaderApp) - // NOTE - the ClassWizard will add and remove mapping macros here. - // DO NOT EDIT what you see in these blocks of generated code! - //}}AFX_MSG - ON_COMMAND(ID_HELP, CWinApp::OnHelp) -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderApp construction - -CDDLReaderApp::CDDLReaderApp() -{ - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - -///////////////////////////////////////////////////////////////////////////// -// The one and only CDDLReaderApp object - -CDDLReaderApp theApp; - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderApp initialization - -BOOL CDDLReaderApp::InitInstance() -{ - // Standard initialization - // If you are not using these features and wish to reduce the size - // of your final executable, you should remove from the following - // the specific initialization routines you do not need. - - - CDDLReaderDlg dlg; - m_pMainWnd = &dlg; - int nResponse = dlg.DoModal(); - if (nResponse == IDOK) - { - // TODO: Place code here to handle when the dialog is - // dismissed with OK - } - else if (nResponse == IDCANCEL) - { - // TODO: Place code here to handle when the dialog is - // dismissed with Cancel - } - - // Since the dialog has been closed, return FALSE so that we exit the - // application, rather than start the application's message pump. - return FALSE; -} diff --git a/DDLReader/DDLReader.h b/DDLReader/DDLReader.h deleted file mode 100644 index 08dbe48..0000000 --- a/DDLReader/DDLReader.h +++ /dev/null @@ -1,49 +0,0 @@ -// DDLReader.h : main header file for the DDLREADER application -// - -#if !defined(AFX_DDLREADER_H__9FE8F7F8_112D_4735_A4BA_5141A991D609__INCLUDED_) -#define AFX_DDLREADER_H__9FE8F7F8_112D_4735_A4BA_5141A991D609__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderApp: -// See DDLReader.cpp for the implementation of this class -// - -class CDDLReaderApp : public CWinApp -{ -public: - CDDLReaderApp(); - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CDDLReaderApp) - public: - virtual BOOL InitInstance(); - //}}AFX_VIRTUAL - -// Implementation - - //{{AFX_MSG(CDDLReaderApp) - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code ! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_DDLREADER_H__9FE8F7F8_112D_4735_A4BA_5141A991D609__INCLUDED_) diff --git a/DDLReader/DDLReader.rc b/DDLReader/DDLReader.rc deleted file mode 100644 index f1fcb4b..0000000 --- a/DDLReader/DDLReader.rc +++ /dev/null @@ -1,278 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Czech resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) -#ifdef _WIN32 -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -#pragma code_page(1250) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#endif //_WIN32\r\n" - "#include ""res\\DDLReader.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON "res\\DDLReader.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_EXPORTING DIALOGEX 0, 0, 186, 82 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | - WS_CAPTION | WS_SYSMENU -CAPTION "Exporting" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - CONTROL "",IDC_PROGRESS,"msctls_progress32",WS_BORDER | 0x1,7,39, - 172,14 - CTEXT "Exporting",IDC_STATIC,7,7,172,8 - CTEXT "Static",IDC_NAME,7,23,172,8 - PUSHBUTTON "Stop",IDC_BUTTON1,68,61,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_EXPORTING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_ABOUTBOX "&About DDLReader..." - IDS_FILEOPENFAILED "Failed to open DDL" - IDC_HEADGROUP "Group" - IDC_HEADFNAME "Filename" - IDC_HEADSIZE "Size" - IDC_HEADOFFSET "Offset" - IDS_DDLFILTER "DDLFiles|*.ddl|All Files|*.*||" - IDC_GROUP_GRAPHICS "Graphics" - IDC_GROUP_SOUNDS "Sounds" - IDC_GROUP_FONTS "Fonts" - IDC_GROUP_BASIC "Basic graphics" -END - -STRINGTABLE -BEGIN - IDC_GROUP_ITEMS "Item graphics" - IDC_GROUP_MONSTERS "Monster graphics" - IDC_GROUP_DIALOGS "Dialog graphics" - IDC_GROUP_UNSPECIFIED "Unspecified" - IDC_GROUP_UNKNOWN "Unknown (%d)" - IDS_UNABLETOCREATEFILE "Unable to create target file: \r\n%1" - IDS_UNABLETOEXTACTDATA "Unable to extract data. General reading error" -END - -#endif // Czech resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG 0, 0, 235, 55 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About DDLReader" -FONT 8, "MS Sans Serif" -BEGIN - ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 - LTEXT "DDLReader Version 1.0",IDC_STATIC,40,10,119,8, - SS_NOPREFIX - LTEXT "Copyright (C) 2005",IDC_STATIC,40,25,119,8 - DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP -END - -IDD_DDLREADER_DIALOG DIALOGEX 0, 0, 364, 262 -STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_APPWINDOW -CAPTION "DDLReader" -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - CONTROL "List2",IDC_FILELIST,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,0,14,363,219 - LTEXT "Export to folder:",IDC_POPISEK,0,235,50,8 - EDITTEXT IDC_FOLDER,0,248,263,14,ES_AUTOHSCROLL - PUSHBUTTON "Browse",IDC_BROWSE,268,248,34,14 - PUSHBUTTON "Export",IDC_EXPORT,306,248,58,14 - EDITTEXT IDC_DDLFILE,0,0,313,12,ES_AUTOHSCROLL - PUSHBUTTON "Browse DDL",IDC_DDLBROWSE,314,0,50,12 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "FileDescription", "DDLReader MFC Application" - VALUE "FileVersion", "1, 0, 0, 1" - VALUE "InternalName", "DDLReader" - VALUE "LegalCopyright", "Copyright (C) 2005" - VALUE "OriginalFilename", "DDLReader.EXE" - VALUE "ProductName", "DDLReader Application" - VALUE "ProductVersion", "1, 0, 0, 1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END - - IDD_DDLREADER_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 357 - TOPMARGIN, 7 - BOTTOMMARGIN, 255 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#pragma code_page(1252) -#endif //_WIN32 -#include "res\DDLReader.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/DDLReader/DDLReader.sln b/DDLReader/DDLReader.sln deleted file mode 100644 index cc4c08b..0000000 --- a/DDLReader/DDLReader.sln +++ /dev/null @@ -1,34 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DDLReader", "DDLReader.vcproj", "{A5326507-3420-4D03-B9EB-5583790B412B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SourceCodeControl) = preSolution - SccNumberOfProjects = 2 - SccProjectName0 = \u0022$/Skeldal/DDLReader\u0022,\u0020NJEAAAAA - SccLocalPath0 = ..\\..\\.. - SccProvider0 = MSSCCI:Microsoft\u0020Visual\u0020SourceSafe - CanCheckoutShared = false - SccProjectFilePathRelativizedFromConnection0 = Projects\\Skeldal\\DDLReader\\ - SolutionUniqueID = {A1A5598F-1F71-475C-8CAA-699B487DC20F} - SccProjectUniqueName1 = DDLReader.vcproj - SccLocalPath1 = ..\\..\\.. - CanCheckoutShared = false - SccProjectFilePathRelativizedFromConnection1 = Projects\\Skeldal\\DDLReader\\ - EndGlobalSection - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {A5326507-3420-4D03-B9EB-5583790B412B}.Debug.ActiveCfg = Debug|Win32 - {A5326507-3420-4D03-B9EB-5583790B412B}.Debug.Build.0 = Debug|Win32 - {A5326507-3420-4D03-B9EB-5583790B412B}.Release.ActiveCfg = Release|Win32 - {A5326507-3420-4D03-B9EB-5583790B412B}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/DDLReader/DDLReader.vcproj b/DDLReader/DDLReader.vcproj deleted file mode 100644 index f50a9a4..0000000 --- a/DDLReader/DDLReader.vcproj +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DDLReader/DDLReaderDlg.cpp b/DDLReader/DDLReaderDlg.cpp deleted file mode 100644 index 7e7a1f7..0000000 --- a/DDLReader/DDLReaderDlg.cpp +++ /dev/null @@ -1,533 +0,0 @@ -// DDLReaderDlg.cpp : implementation file -// - -#include "stdafx.h" -#include "DDLReader.h" -#include "DDLReaderDlg.h" -#include ".\ddlreaderdlg.h" -#include "WPathname.h" -#include "DlgProgress.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CAboutDlg dialog used for App About - -class CAboutDlg : public CDialog -{ -public: - CAboutDlg(); - -// Dialog Data - //{{AFX_DATA(CAboutDlg) - enum { IDD = IDD_ABOUTBOX }; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAboutDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - //{{AFX_MSG(CAboutDlg) - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) -{ - //{{AFX_DATA_INIT(CAboutDlg) - //}}AFX_DATA_INIT -} - -void CAboutDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CAboutDlg) - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) - //{{AFX_MSG_MAP(CAboutDlg) - // No message handlers - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderDlg dialog - -CDDLReaderDlg::CDDLReaderDlg(CWnd* pParent /*=NULL*/) - : CDialog(CDDLReaderDlg::IDD, pParent) -{ - //{{AFX_DATA_INIT(CDDLReaderDlg) - vFolder = _T(""); - //}}AFX_DATA_INIT - // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); -} - -CDDLReaderDlg::~CDDLReaderDlg() -{ - if (!_lastTemp.IsNull()) DeleteFile(_lastTemp); -} - -void CDDLReaderDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CDDLReaderDlg) - DDX_Control(pDX, IDC_FOLDER, wFolder); - DDX_Control(pDX, IDC_FILELIST, wFileList); - DDX_Control(pDX, IDC_BROWSE, wBrowse); - DDX_Control(pDX, IDC_EXPORT, wExport); - DDX_Text(pDX, IDC_FOLDER, vFolder); - DDX_Control(pDX, IDC_POPISEK, wPopisek); - //}}AFX_DATA_MAP - DDX_Control(pDX, IDC_DDLFILE, wDDLFile); - DDX_Control(pDX, IDC_DDLBROWSE, wDDLBrowse); -} - -BEGIN_MESSAGE_MAP(CDDLReaderDlg, CDialog) - //{{AFX_MSG_MAP(CDDLReaderDlg) - ON_WM_SYSCOMMAND() - ON_WM_PAINT() - ON_WM_QUERYDRAGICON() - //}}AFX_MSG_MAP - ON_WM_SIZE() - ON_WM_GETMINMAXINFO() - ON_EN_KILLFOCUS(IDC_DDLFILE, OnEnKillfocusDdlfile) - ON_BN_CLICKED(IDC_DDLBROWSE, OnBnClickedDdlbrowse) - ON_NOTIFY(LVN_COLUMNCLICK, IDC_FILELIST, OnLvnColumnclickFilelist) - ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse) - ON_BN_CLICKED(IDC_EXPORT, OnBnClickedExport) - ON_NOTIFY(NM_DBLCLK, IDC_FILELIST, OnNMDblclkFilelist) -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderDlg message handlers - -BOOL CDDLReaderDlg::OnInitDialog() -{ - CRect rc; - GetClientRect(&rc); - _dlgSize=rc.Size(); - CDialog::OnInitDialog(); - - // Add "About..." menu item to system menu. - - // IDM_ABOUTBOX must be in the system command range. - ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); - ASSERT(IDM_ABOUTBOX < 0xF000); - - CMenu* pSysMenu = GetSystemMenu(FALSE); - if (pSysMenu != NULL) - { - CString strAboutMenu; - strAboutMenu.LoadString(IDS_ABOUTBOX); - if (!strAboutMenu.IsEmpty()) - { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); - } - } - - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon - - CString header; - header.LoadString(IDC_HEADGROUP); - wFileList.InsertColumn(0,header,LVCFMT_CENTER,100,0); - header.LoadString(IDC_HEADFNAME); - wFileList.InsertColumn(1,header,LVCFMT_LEFT,140,1); - header.LoadString(IDC_HEADSIZE); - wFileList.InsertColumn(2,header,LVCFMT_RIGHT,80,2); - header.LoadString(IDC_HEADOFFSET); - wFileList.InsertColumn(3,header,LVCFMT_RIGHT,80,3); - ListView_SetExtendedListViewStyleEx(wFileList,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP); - - // TODO: Add extra initialization here - - return TRUE; // return TRUE unless you set the focus to a control -} - -void CDDLReaderDlg::OnSysCommand(UINT nID, LPARAM lParam) -{ - if ((nID & 0xFFF0) == IDM_ABOUTBOX) - { - CAboutDlg dlgAbout; - dlgAbout.DoModal(); - } - else - { - CDialog::OnSysCommand(nID, lParam); - } -} - -// If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. - -void CDDLReaderDlg::OnPaint() -{ - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } -} - -// The system calls this to obtain the cursor to display while the user drags -// the minimized window. -HCURSOR CDDLReaderDlg::OnQueryDragIcon() -{ - return (HCURSOR) m_hIcon; -} - -void MoveWindowRel(HDWP &hdwp, CWnd &wnd, int xr,int yr, int xs, int ys) -{ - CRect rc; - wnd.GetWindowRect(&rc); - wnd.GetParent()->ScreenToClient(&rc); - rc.left+=xr; - rc.top+=yr; - rc.bottom+=yr+ys; - rc.right+=xr+xs; - hdwp=DeferWindowPos(hdwp,wnd,NULL,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,SWP_NOZORDER); -} - -void CDDLReaderDlg::OnSize(UINT nType, int cx, int cy) -{ - CDialog::OnSize(nType, cx, cy); - if (nType!=SIZE_MINIMIZED) - { - if (wFileList.GetSafeHwnd()!=0) - { - HDWP dwp=BeginDeferWindowPos(10); - int difx=cx-_dlgSize.cx; - int dify=cy-_dlgSize.cy; - MoveWindowRel(dwp,wFileList,0,0,difx,dify); - MoveWindowRel(dwp,wPopisek,0,dify,0,0); - MoveWindowRel(dwp,wFolder,0,dify,difx,0); - MoveWindowRel(dwp,wExport,difx,dify,0,0); - MoveWindowRel(dwp,wBrowse,difx,dify,0,0); - MoveWindowRel(dwp,wDDLFile,0,0,difx,0); - MoveWindowRel(dwp,wDDLBrowse,difx,0,0,0); - EndDeferWindowPos(dwp); - - } - _dlgSize.cx=cx; - _dlgSize.cy=cy; - } -} - - -void CDDLReaderDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) -{ - CDialog::OnGetMinMaxInfo(lpMMI); - lpMMI->ptMinTrackSize.x=200; - lpMMI->ptMinTrackSize.y=150; - -} - -void CDDLReaderDlg::OnEnKillfocusDdlfile() -{ - CString name; - wDDLFile.GetWindowText(name); - if (_ddlfile.OpenDDLFile(WString(name.GetString()))==false) - AfxMessageBox(IDS_FILEOPENFAILED); - UpdateList(); -} - -static CString GetGroupName(int group) -{ - int id; - switch (group) - { - case 1: id= IDC_GROUP_GRAPHICS;break; - case 2: id= IDC_GROUP_SOUNDS;break; - case 3: id= IDC_GROUP_FONTS;break; - case 7: id= IDC_GROUP_BASIC;break; - case 8: id= IDC_GROUP_ITEMS;break; - case 9: id= IDC_GROUP_MONSTERS;break; - case 11: id= IDC_GROUP_DIALOGS;break; - case 0: id=IDC_GROUP_UNSPECIFIED;break; - default: id=IDC_GROUP_UNKNOWN;break; - } - CString res; - res.Format(id,group); - return res; -} - -bool CDDLReaderDlg::File(WString name, int group, uint32_t offset) -{ - LVITEM item; - CString grpname=GetGroupName(group); - wchar_t buff[40]; - item.iItem=wFileList.GetItemCount(); - item.iSubItem=0; - item.mask=LVIF_GROUPID|LVIF_TEXT; - item.iGroupId=group; - item.pszText=grpname.LockBuffer(); - int ipos=wFileList.InsertItem(&item); - wFileList.SetItemText(ipos,1,name); - wFileList.SetItemText(ipos,3,_ui64tow(offset,buff,10)); - grpname.UnlockBuffer(); - return true; -} - -void CDDLReaderDlg::UpdateList(void) -{ - CString tmp; - wFileList.DeleteAllItems(); - _ddlfile.EnumFiles(*this); - for (int i=0,cnt=wFileList.GetItemCount();iGetItemText(lParam1,sinfo.index); - sinfo.right=sinfo.list->GetItemText(lParam2,sinfo.index); - switch (sinfo.index) - { - case 0: - case 1: res=wcsicmp(sinfo.left,sinfo.right);break; - case 3: { - int l=_wtoi(sinfo.left); - int r=_wtoi(sinfo.right); - res=(l>r)-(lGetItemText(lParam1,3); - sinfo.right=sinfo.list->GetItemText(lParam2,3); - uint32_t l=_wtoi(sinfo.left); - uint32_t r=_wtoi(sinfo.right); - l=sinfo._ddlfile->GetFileSize(l); - r=sinfo._ddlfile->GetFileSize(r); - res=(l>r)-(llParam2)-(lParam1(pNMHDR); - for (int i=0,cnt=wFileList.GetItemCount();iiSubItem; - sinfo.list=&wFileList; - sinfo._ddlfile=&_ddlfile; - wFileList.SortItems(SortItemsInFileList,(LPARAM)&sinfo); - *pResult = 0; -} - -static int WINAPI PosBrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData) - { - const wchar_t *curpath=(const wchar_t *)lpData; - if (uMsg == BFFM_INITIALIZED) - { - if (curpath && curpath[0]) - { - ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)((LPCSTR)curpath)); - ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)((LPCSTR)curpath)); - } - } - else if (uMsg == BFFM_SELCHANGED) - { - wchar_t buff[_MAX_PATH]; - if (SHGetPathFromIDList((LPITEMIDLIST)lParam,buff)) - { - ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buff); - } - } - return 0; - }; - -static bool PathBrowser(HWND hWnd, wchar_t *path /* MAX_PATH size */) -{ - BROWSEINFO brw; - memset(&brw,0,sizeof(brw)); - brw.hwndOwner=hWnd; - brw.pidlRoot=NULL; - brw.pszDisplayName=path; - brw.lParam=(LPARAM)path; - brw.ulFlags= BIF_RETURNONLYFSDIRS |BIF_STATUSTEXT|BIF_USENEWUI ; - brw.lpfn = (BFFCALLBACK)(PosBrowseCallbackProc); - LPITEMIDLIST il=SHBrowseForFolder( &brw ); - if (il==NULL) return false; - SHGetPathFromIDList(il,path); - IMalloc *shmalloc; - SHGetMalloc(&shmalloc); - shmalloc->Free(il); - if (path[0]==0) return false; - return true; -} - - -void CDDLReaderDlg::OnBnClickedBrowse() -{ - wchar_t path[MAX_PATH]; - wFolder.GetWindowText(path,MAX_PATH); - if (PathBrowser(*this,path)) - { - wFolder.SetWindowText(path); - } -} - -void CDDLReaderDlg::OnBnClickedExport() -{ - wchar_t path[MAX_PATH]; - wFolder.GetWindowText(path,MAX_PATH); - if (path[0]==0) OnBnClickedBrowse(); - wFolder.GetWindowText(path,MAX_PATH); - if (path[0]==0) return; - WPathname fpath; - fpath.SetDirectory(path); - POSITION pos=wFileList.GetFirstSelectedItemPosition(); - int max=wFileList.GetSelectedCount(); - int cur=0; - DlgProgress pb; - if (max) {pb.Create(IDD_EXPORTING);pb.CenterWindow(this);EnableWindow(FALSE);} - while (pos) - { - MSG msg; - pb.wProgress.SetRange(0,max); - pb.wProgress.SetPos(++cur); - int i=wFileList.GetNextSelectedItem(pos); - CString fname; - uint32_t offset; - fname=wFileList.GetItemText(i,1); - offset=(uint32_t)_wtoi64(wFileList.GetItemText(i,3)); - pb.wDesc.SetWindowText(fname); - if (PeekMessage(&msg,0,0,0,PM_NOREMOVE)==TRUE) AfxPumpMessage(); - if (pb.stop) break; - DDLData data=_ddlfile.ExtractFile(offset); - if (data.data!=NULL) - { - fpath.SetFilename(fname); - HANDLE hFile=CreateFile(fpath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); - while (hFile==INVALID_HANDLE_VALUE) - { - CString msg; - AfxFormatString1(msg,IDS_UNABLETOCREATEFILE,fpath); - int retry=AfxMessageBox(msg,MB_ABORTRETRYIGNORE); - if (retry==IDABORT) {EnableWindow(TRUE);return;} - if (retry==IDIGNORE) break; - hFile=CreateFile(fpath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); - } - if (hFile!=INVALID_HANDLE_VALUE) - { - DWORD written; - WriteFile(hFile,data.data,data.sz,&written,NULL); - CloseHandle(hFile); - } - } - else - { - CString msg; - AfxFormatString1(msg,IDS_UNABLETOEXTACTDATA,fpath); - AfxMessageBox(msg,MB_OK|MB_ICONSTOP); - } - } - EnableWindow(TRUE); - - -} - -WPathname CDDLReaderDlg::CreateTemp(int index) -{ - if (!_lastTemp.IsNull()) DeleteFile(_lastTemp); - CString fname; - uint32_t offset; - fname=wFileList.GetItemText(index,1); - offset=(uint32_t)_wtoi64(wFileList.GetItemText(index,3)); - _lastTemp.SetTempDirectory(); - _lastTemp.SetFileTitle(WSC("SkeldalDDLReader")); - _lastTemp.SetExtension(WSC(".")+WString(fname)); - DDLData data=_ddlfile.ExtractFile(offset); - if (data.data) - { - HANDLE hFile=CreateFile(_lastTemp,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); - DWORD written; - WriteFile(hFile,data.data,data.sz,&written,NULL); - CloseHandle(hFile); - } - return _lastTemp; -} - -void CDDLReaderDlg::OnNMDblclkFilelist(NMHDR *pNMHDR, LRESULT *pResult) -{ - // TODO: Add your control notification handler code here - *pResult = 0; - int index=wFileList.GetNextItem(-1,LVNI_FOCUSED); - WPathname pth=CreateTemp(index); - ShellExecute(*this,0,pth,0,0,SW_NORMAL); -} diff --git a/DDLReader/DDLReaderDlg.h b/DDLReader/DDLReaderDlg.h deleted file mode 100644 index 7faf316..0000000 --- a/DDLReader/DDLReaderDlg.h +++ /dev/null @@ -1,76 +0,0 @@ -// DDLReaderDlg.h : header file -// - -#include "t:\h\atlmfc\include\afxwin.h" -#include "ddlfile.h" -#include "WPathname.h" -#if !defined(AFX_DDLREADERDLG_H__E765355F_0112_4B3E_90CE_111E28FE8EC6__INCLUDED_) -#define AFX_DDLREADERDLG_H__E765355F_0112_4B3E_90CE_111E28FE8EC6__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderDlg dialog - -class CDDLReaderDlg : public CDialog, public IDDLFileEnumerator -{ -// Construction - CSize _dlgSize; - WPathname _lastTemp; -public: - CDDLReaderDlg(CWnd* pParent = NULL); // standard constructor - ~CDDLReaderDlg(); - -// Dialog Data - //{{AFX_DATA(CDDLReaderDlg) - enum { IDD = IDD_DDLREADER_DIALOG }; - CEdit wFolder; - CListCtrl wFileList; - CButton wBrowse; - CButton wExport; - CString vFolder; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CDDLReaderDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - HICON m_hIcon; - - // Generated message map functions - //{{AFX_MSG(CDDLReaderDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnSysCommand(UINT nID, LPARAM lParam); - afx_msg void OnPaint(); - afx_msg HCURSOR OnQueryDragIcon(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -public: - afx_msg void OnSize(UINT nType, int cx, int cy); - CStatic wPopisek; - CEdit wDDLFile; - CButton wDDLBrowse; - afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI); - DDLFile _ddlfile; - afx_msg void OnEnKillfocusDdlfile(); - void UpdateList(void); - virtual bool File(WString name, int group, uint32_t offset); - afx_msg void OnBnClickedDdlbrowse(); - afx_msg void OnLvnColumnclickFilelist(NMHDR *pNMHDR, LRESULT *pResult); - afx_msg void OnBnClickedBrowse(); - afx_msg void OnBnClickedExport(); - afx_msg void OnNMDblclkFilelist(NMHDR *pNMHDR, LRESULT *pResult); - - WPathname CreateTemp(int index); -}; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_DDLREADERDLG_H__E765355F_0112_4B3E_90CE_111E28FE8EC6__INCLUDED_) diff --git a/DDLReader/DlgProgress.cpp b/DDLReader/DlgProgress.cpp deleted file mode 100644 index cccfd60..0000000 --- a/DDLReader/DlgProgress.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// DlgProgress.cpp : implementation file -// - -#include "stdafx.h" -#include "DDLReader.h" -#include "DlgProgress.h" -#include ".\dlgprogress.h" - - -// DlgProgress dialog - -IMPLEMENT_DYNAMIC(DlgProgress, CDialog) -DlgProgress::DlgProgress(CWnd* pParent /*=NULL*/) - : CDialog(DlgProgress::IDD, pParent) -{ - stop=false; -} - -DlgProgress::~DlgProgress() -{ -} - -void DlgProgress::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - DDX_Control(pDX, IDC_PROGRESS, wProgress); - DDX_Control(pDX, IDC_NAME, wDesc); -} - - -BEGIN_MESSAGE_MAP(DlgProgress, CDialog) - ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) -END_MESSAGE_MAP() - - -// DlgProgress message handlers - -void DlgProgress::OnBnClickedButton1() -{ - stop=true; -} diff --git a/DDLReader/DlgProgress.h b/DDLReader/DlgProgress.h deleted file mode 100644 index 8e6e3fb..0000000 --- a/DDLReader/DlgProgress.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include "t:\h\atlmfc\include\afxcmn.h" -#include "t:\h\atlmfc\include\afxwin.h" - - -// DlgProgress dialog - -class DlgProgress : public CDialog -{ - DECLARE_DYNAMIC(DlgProgress) - -public: - DlgProgress(CWnd* pParent = NULL); // standard constructor - virtual ~DlgProgress(); - -// Dialog Data - enum { IDD = IDD_EXPORTING }; - -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - DECLARE_MESSAGE_MAP() -public: - CProgressCtrl wProgress; - CStatic wDesc; - afx_msg void OnBnClickedButton1(); - bool stop; -}; diff --git a/DDLReader/IWStringEffect.h b/DDLReader/IWStringEffect.h deleted file mode 100644 index 084f813..0000000 --- a/DDLReader/IWStringEffect.h +++ /dev/null @@ -1,36 +0,0 @@ -#if !defined(AFX_IWSTRINGEFFECT_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_) -#define AFX_IWSTRINGEFFECT_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include - -class IWStringEffect -{ -public: - ///function returns extra size that effect needs - /** - @param curSize size of string that enters to the effect - @return count of extra characters needs to effects; - */ - virtual uint32_t GetEffectExtraSize(uint32_t curSize) {return 0;} - - ///function renders begin of string. - /** Function returns number of characters rendered, and must be <= then size returned by GetEffectExtraSize() - @param renderPtr pointer to render buffer - @param curSize size of string that enters to the effect - @return number of characters rendered. Entered string will be rendered behind. - */ - virtual uint32_t PreRenderString(wchar_t *renderPtr,uint32_t curSize) {return 0;} - - ///function renders effect. - /** - @param renderPtr pointer to begin of render buffer. - @param rendered number of characters rendered by previous effect. Value doesn't point to the end - of buffer, function must add result of PreRenderString */ - virtual void RenderString(wchar_t *renderPtr, uint32_t rendered)=0; -}; - -#endif diff --git a/DDLReader/Projects/Skeldal/DDLReader/DDLFile.cpp b/DDLReader/Projects/Skeldal/DDLReader/DDLFile.cpp deleted file mode 100644 index e0cc247..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DDLFile.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "stdafx.h" -#include ".\ddlfile.h" - -DDLFile::DDLFile(void) -{ - _hFile=0; -} - -DDLFile::~DDLFile(void) -{ - if (_hFile!=0) CloseHandle(_hFile); -} - - - - -bool DDLFile::OpenDDLFile(WString filename) -{ - _hFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, - OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,NULL); - if (_hFile==INVALID_HANDLE_VALUE) - { - _hFile=0; - return false; - } - return true; -} - -bool DDLFile::ReadFile(void *data, size_t sz) -{ - DWORD readed=0; - if (::ReadFile(_hFile,data,sz,&readed,NULL)==FALSE) return false; - if (readed!=sz) return false; - return true; -} - -bool DDLFile::EnumFiles(IDDLFileEnumerator &enmClass) -{ - uint32_t firstGroup; - uint32_t groupEndOffset; - uint32_t endGroups; - int i; - int ngroups; - SetFilePointer(_hFile,0,0,FILE_BEGIN); - if (ReadFile(&firstGroup,sizeof(firstGroup))==false) return false; - if (ReadFile(&groupEndOffset,sizeof(firstGroup))==false) return false; - uint32_t *group=(uint32_t *)alloca(groupEndOffset); - group[0]=firstGroup; - group[1]=groupEndOffset; - ngroups=groupEndOffset/8; - if (groupEndOffset!=8 && ReadFile(group+2,groupEndOffset-8)==false) return false; - SetFilePointer(_hFile,12,0,FILE_CURRENT); - if (ReadFile(&endGroups,sizeof(endGroups))==false) return false; - for (i=0;i(other); - dother.data=0;dother.sz=0; - } - DDLData& operator =(const DDLData &other) - { - DDLData &dother=const_cast(other); - data=other.data;sz=other.sz; - dother.data=0;dother.sz=0; - return *this; - } -}; - -class DDLFile -{ - HANDLE _hFile; - - bool ReadFile(void *data, size_t sz); -public: - DDLFile(void); - ~DDLFile(void); - - bool OpenDDLFile(WString filename); - bool EnumFiles(IDDLFileEnumerator &enmClass); - DDLData ExtractFile(uint32_t offset); - uint32_t GetFileSize(uint32_t offset); -}; diff --git a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.cpp b/DDLReader/Projects/Skeldal/DDLReader/DDLReader.cpp deleted file mode 100644 index 2042ba3..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// DDLReader.cpp : Defines the class behaviors for the application. -// - -#include "stdafx.h" -#include "DDLReader.h" -#include "DDLReaderDlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderApp - -BEGIN_MESSAGE_MAP(CDDLReaderApp, CWinApp) - //{{AFX_MSG_MAP(CDDLReaderApp) - // NOTE - the ClassWizard will add and remove mapping macros here. - // DO NOT EDIT what you see in these blocks of generated code! - //}}AFX_MSG - ON_COMMAND(ID_HELP, CWinApp::OnHelp) -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderApp construction - -CDDLReaderApp::CDDLReaderApp() -{ - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - -///////////////////////////////////////////////////////////////////////////// -// The one and only CDDLReaderApp object - -CDDLReaderApp theApp; - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderApp initialization - -BOOL CDDLReaderApp::InitInstance() -{ - // Standard initialization - // If you are not using these features and wish to reduce the size - // of your final executable, you should remove from the following - // the specific initialization routines you do not need. - - - CDDLReaderDlg dlg; - m_pMainWnd = &dlg; - int nResponse = dlg.DoModal(); - if (nResponse == IDOK) - { - // TODO: Place code here to handle when the dialog is - // dismissed with OK - } - else if (nResponse == IDCANCEL) - { - // TODO: Place code here to handle when the dialog is - // dismissed with Cancel - } - - // Since the dialog has been closed, return FALSE so that we exit the - // application, rather than start the application's message pump. - return FALSE; -} diff --git a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.h b/DDLReader/Projects/Skeldal/DDLReader/DDLReader.h deleted file mode 100644 index 08dbe48..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.h +++ /dev/null @@ -1,49 +0,0 @@ -// DDLReader.h : main header file for the DDLREADER application -// - -#if !defined(AFX_DDLREADER_H__9FE8F7F8_112D_4735_A4BA_5141A991D609__INCLUDED_) -#define AFX_DDLREADER_H__9FE8F7F8_112D_4735_A4BA_5141A991D609__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderApp: -// See DDLReader.cpp for the implementation of this class -// - -class CDDLReaderApp : public CWinApp -{ -public: - CDDLReaderApp(); - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CDDLReaderApp) - public: - virtual BOOL InitInstance(); - //}}AFX_VIRTUAL - -// Implementation - - //{{AFX_MSG(CDDLReaderApp) - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code ! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_DDLREADER_H__9FE8F7F8_112D_4735_A4BA_5141A991D609__INCLUDED_) diff --git a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.rc b/DDLReader/Projects/Skeldal/DDLReader/DDLReader.rc deleted file mode 100644 index f1fcb4b..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.rc +++ /dev/null @@ -1,278 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Czech resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) -#ifdef _WIN32 -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -#pragma code_page(1250) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#endif //_WIN32\r\n" - "#include ""res\\DDLReader.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON "res\\DDLReader.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_EXPORTING DIALOGEX 0, 0, 186, 82 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | - WS_CAPTION | WS_SYSMENU -CAPTION "Exporting" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - CONTROL "",IDC_PROGRESS,"msctls_progress32",WS_BORDER | 0x1,7,39, - 172,14 - CTEXT "Exporting",IDC_STATIC,7,7,172,8 - CTEXT "Static",IDC_NAME,7,23,172,8 - PUSHBUTTON "Stop",IDC_BUTTON1,68,61,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_EXPORTING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_ABOUTBOX "&About DDLReader..." - IDS_FILEOPENFAILED "Failed to open DDL" - IDC_HEADGROUP "Group" - IDC_HEADFNAME "Filename" - IDC_HEADSIZE "Size" - IDC_HEADOFFSET "Offset" - IDS_DDLFILTER "DDLFiles|*.ddl|All Files|*.*||" - IDC_GROUP_GRAPHICS "Graphics" - IDC_GROUP_SOUNDS "Sounds" - IDC_GROUP_FONTS "Fonts" - IDC_GROUP_BASIC "Basic graphics" -END - -STRINGTABLE -BEGIN - IDC_GROUP_ITEMS "Item graphics" - IDC_GROUP_MONSTERS "Monster graphics" - IDC_GROUP_DIALOGS "Dialog graphics" - IDC_GROUP_UNSPECIFIED "Unspecified" - IDC_GROUP_UNKNOWN "Unknown (%d)" - IDS_UNABLETOCREATEFILE "Unable to create target file: \r\n%1" - IDS_UNABLETOEXTACTDATA "Unable to extract data. General reading error" -END - -#endif // Czech resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG 0, 0, 235, 55 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About DDLReader" -FONT 8, "MS Sans Serif" -BEGIN - ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 - LTEXT "DDLReader Version 1.0",IDC_STATIC,40,10,119,8, - SS_NOPREFIX - LTEXT "Copyright (C) 2005",IDC_STATIC,40,25,119,8 - DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP -END - -IDD_DDLREADER_DIALOG DIALOGEX 0, 0, 364, 262 -STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_APPWINDOW -CAPTION "DDLReader" -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - CONTROL "List2",IDC_FILELIST,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,0,14,363,219 - LTEXT "Export to folder:",IDC_POPISEK,0,235,50,8 - EDITTEXT IDC_FOLDER,0,248,263,14,ES_AUTOHSCROLL - PUSHBUTTON "Browse",IDC_BROWSE,268,248,34,14 - PUSHBUTTON "Export",IDC_EXPORT,306,248,58,14 - EDITTEXT IDC_DDLFILE,0,0,313,12,ES_AUTOHSCROLL - PUSHBUTTON "Browse DDL",IDC_DDLBROWSE,314,0,50,12 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "FileDescription", "DDLReader MFC Application" - VALUE "FileVersion", "1, 0, 0, 1" - VALUE "InternalName", "DDLReader" - VALUE "LegalCopyright", "Copyright (C) 2005" - VALUE "OriginalFilename", "DDLReader.EXE" - VALUE "ProductName", "DDLReader Application" - VALUE "ProductVersion", "1, 0, 0, 1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END - - IDD_DDLREADER_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 357 - TOPMARGIN, 7 - BOTTOMMARGIN, 255 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#pragma code_page(1252) -#endif //_WIN32 -#include "res\DDLReader.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.sln b/DDLReader/Projects/Skeldal/DDLReader/DDLReader.sln deleted file mode 100644 index cc4c08b..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.sln +++ /dev/null @@ -1,34 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DDLReader", "DDLReader.vcproj", "{A5326507-3420-4D03-B9EB-5583790B412B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SourceCodeControl) = preSolution - SccNumberOfProjects = 2 - SccProjectName0 = \u0022$/Skeldal/DDLReader\u0022,\u0020NJEAAAAA - SccLocalPath0 = ..\\..\\.. - SccProvider0 = MSSCCI:Microsoft\u0020Visual\u0020SourceSafe - CanCheckoutShared = false - SccProjectFilePathRelativizedFromConnection0 = Projects\\Skeldal\\DDLReader\\ - SolutionUniqueID = {A1A5598F-1F71-475C-8CAA-699B487DC20F} - SccProjectUniqueName1 = DDLReader.vcproj - SccLocalPath1 = ..\\..\\.. - CanCheckoutShared = false - SccProjectFilePathRelativizedFromConnection1 = Projects\\Skeldal\\DDLReader\\ - EndGlobalSection - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {A5326507-3420-4D03-B9EB-5583790B412B}.Debug.ActiveCfg = Debug|Win32 - {A5326507-3420-4D03-B9EB-5583790B412B}.Debug.Build.0 = Debug|Win32 - {A5326507-3420-4D03-B9EB-5583790B412B}.Release.ActiveCfg = Release|Win32 - {A5326507-3420-4D03-B9EB-5583790B412B}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.vcproj b/DDLReader/Projects/Skeldal/DDLReader/DDLReader.vcproj deleted file mode 100644 index f50a9a4..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DDLReader.vcproj +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DDLReader/Projects/Skeldal/DDLReader/DDLReaderDlg.cpp b/DDLReader/Projects/Skeldal/DDLReader/DDLReaderDlg.cpp deleted file mode 100644 index 7e7a1f7..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DDLReaderDlg.cpp +++ /dev/null @@ -1,533 +0,0 @@ -// DDLReaderDlg.cpp : implementation file -// - -#include "stdafx.h" -#include "DDLReader.h" -#include "DDLReaderDlg.h" -#include ".\ddlreaderdlg.h" -#include "WPathname.h" -#include "DlgProgress.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CAboutDlg dialog used for App About - -class CAboutDlg : public CDialog -{ -public: - CAboutDlg(); - -// Dialog Data - //{{AFX_DATA(CAboutDlg) - enum { IDD = IDD_ABOUTBOX }; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAboutDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - //{{AFX_MSG(CAboutDlg) - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) -{ - //{{AFX_DATA_INIT(CAboutDlg) - //}}AFX_DATA_INIT -} - -void CAboutDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CAboutDlg) - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) - //{{AFX_MSG_MAP(CAboutDlg) - // No message handlers - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderDlg dialog - -CDDLReaderDlg::CDDLReaderDlg(CWnd* pParent /*=NULL*/) - : CDialog(CDDLReaderDlg::IDD, pParent) -{ - //{{AFX_DATA_INIT(CDDLReaderDlg) - vFolder = _T(""); - //}}AFX_DATA_INIT - // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); -} - -CDDLReaderDlg::~CDDLReaderDlg() -{ - if (!_lastTemp.IsNull()) DeleteFile(_lastTemp); -} - -void CDDLReaderDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CDDLReaderDlg) - DDX_Control(pDX, IDC_FOLDER, wFolder); - DDX_Control(pDX, IDC_FILELIST, wFileList); - DDX_Control(pDX, IDC_BROWSE, wBrowse); - DDX_Control(pDX, IDC_EXPORT, wExport); - DDX_Text(pDX, IDC_FOLDER, vFolder); - DDX_Control(pDX, IDC_POPISEK, wPopisek); - //}}AFX_DATA_MAP - DDX_Control(pDX, IDC_DDLFILE, wDDLFile); - DDX_Control(pDX, IDC_DDLBROWSE, wDDLBrowse); -} - -BEGIN_MESSAGE_MAP(CDDLReaderDlg, CDialog) - //{{AFX_MSG_MAP(CDDLReaderDlg) - ON_WM_SYSCOMMAND() - ON_WM_PAINT() - ON_WM_QUERYDRAGICON() - //}}AFX_MSG_MAP - ON_WM_SIZE() - ON_WM_GETMINMAXINFO() - ON_EN_KILLFOCUS(IDC_DDLFILE, OnEnKillfocusDdlfile) - ON_BN_CLICKED(IDC_DDLBROWSE, OnBnClickedDdlbrowse) - ON_NOTIFY(LVN_COLUMNCLICK, IDC_FILELIST, OnLvnColumnclickFilelist) - ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse) - ON_BN_CLICKED(IDC_EXPORT, OnBnClickedExport) - ON_NOTIFY(NM_DBLCLK, IDC_FILELIST, OnNMDblclkFilelist) -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderDlg message handlers - -BOOL CDDLReaderDlg::OnInitDialog() -{ - CRect rc; - GetClientRect(&rc); - _dlgSize=rc.Size(); - CDialog::OnInitDialog(); - - // Add "About..." menu item to system menu. - - // IDM_ABOUTBOX must be in the system command range. - ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); - ASSERT(IDM_ABOUTBOX < 0xF000); - - CMenu* pSysMenu = GetSystemMenu(FALSE); - if (pSysMenu != NULL) - { - CString strAboutMenu; - strAboutMenu.LoadString(IDS_ABOUTBOX); - if (!strAboutMenu.IsEmpty()) - { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); - } - } - - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon - - CString header; - header.LoadString(IDC_HEADGROUP); - wFileList.InsertColumn(0,header,LVCFMT_CENTER,100,0); - header.LoadString(IDC_HEADFNAME); - wFileList.InsertColumn(1,header,LVCFMT_LEFT,140,1); - header.LoadString(IDC_HEADSIZE); - wFileList.InsertColumn(2,header,LVCFMT_RIGHT,80,2); - header.LoadString(IDC_HEADOFFSET); - wFileList.InsertColumn(3,header,LVCFMT_RIGHT,80,3); - ListView_SetExtendedListViewStyleEx(wFileList,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP); - - // TODO: Add extra initialization here - - return TRUE; // return TRUE unless you set the focus to a control -} - -void CDDLReaderDlg::OnSysCommand(UINT nID, LPARAM lParam) -{ - if ((nID & 0xFFF0) == IDM_ABOUTBOX) - { - CAboutDlg dlgAbout; - dlgAbout.DoModal(); - } - else - { - CDialog::OnSysCommand(nID, lParam); - } -} - -// If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. - -void CDDLReaderDlg::OnPaint() -{ - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } -} - -// The system calls this to obtain the cursor to display while the user drags -// the minimized window. -HCURSOR CDDLReaderDlg::OnQueryDragIcon() -{ - return (HCURSOR) m_hIcon; -} - -void MoveWindowRel(HDWP &hdwp, CWnd &wnd, int xr,int yr, int xs, int ys) -{ - CRect rc; - wnd.GetWindowRect(&rc); - wnd.GetParent()->ScreenToClient(&rc); - rc.left+=xr; - rc.top+=yr; - rc.bottom+=yr+ys; - rc.right+=xr+xs; - hdwp=DeferWindowPos(hdwp,wnd,NULL,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,SWP_NOZORDER); -} - -void CDDLReaderDlg::OnSize(UINT nType, int cx, int cy) -{ - CDialog::OnSize(nType, cx, cy); - if (nType!=SIZE_MINIMIZED) - { - if (wFileList.GetSafeHwnd()!=0) - { - HDWP dwp=BeginDeferWindowPos(10); - int difx=cx-_dlgSize.cx; - int dify=cy-_dlgSize.cy; - MoveWindowRel(dwp,wFileList,0,0,difx,dify); - MoveWindowRel(dwp,wPopisek,0,dify,0,0); - MoveWindowRel(dwp,wFolder,0,dify,difx,0); - MoveWindowRel(dwp,wExport,difx,dify,0,0); - MoveWindowRel(dwp,wBrowse,difx,dify,0,0); - MoveWindowRel(dwp,wDDLFile,0,0,difx,0); - MoveWindowRel(dwp,wDDLBrowse,difx,0,0,0); - EndDeferWindowPos(dwp); - - } - _dlgSize.cx=cx; - _dlgSize.cy=cy; - } -} - - -void CDDLReaderDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) -{ - CDialog::OnGetMinMaxInfo(lpMMI); - lpMMI->ptMinTrackSize.x=200; - lpMMI->ptMinTrackSize.y=150; - -} - -void CDDLReaderDlg::OnEnKillfocusDdlfile() -{ - CString name; - wDDLFile.GetWindowText(name); - if (_ddlfile.OpenDDLFile(WString(name.GetString()))==false) - AfxMessageBox(IDS_FILEOPENFAILED); - UpdateList(); -} - -static CString GetGroupName(int group) -{ - int id; - switch (group) - { - case 1: id= IDC_GROUP_GRAPHICS;break; - case 2: id= IDC_GROUP_SOUNDS;break; - case 3: id= IDC_GROUP_FONTS;break; - case 7: id= IDC_GROUP_BASIC;break; - case 8: id= IDC_GROUP_ITEMS;break; - case 9: id= IDC_GROUP_MONSTERS;break; - case 11: id= IDC_GROUP_DIALOGS;break; - case 0: id=IDC_GROUP_UNSPECIFIED;break; - default: id=IDC_GROUP_UNKNOWN;break; - } - CString res; - res.Format(id,group); - return res; -} - -bool CDDLReaderDlg::File(WString name, int group, uint32_t offset) -{ - LVITEM item; - CString grpname=GetGroupName(group); - wchar_t buff[40]; - item.iItem=wFileList.GetItemCount(); - item.iSubItem=0; - item.mask=LVIF_GROUPID|LVIF_TEXT; - item.iGroupId=group; - item.pszText=grpname.LockBuffer(); - int ipos=wFileList.InsertItem(&item); - wFileList.SetItemText(ipos,1,name); - wFileList.SetItemText(ipos,3,_ui64tow(offset,buff,10)); - grpname.UnlockBuffer(); - return true; -} - -void CDDLReaderDlg::UpdateList(void) -{ - CString tmp; - wFileList.DeleteAllItems(); - _ddlfile.EnumFiles(*this); - for (int i=0,cnt=wFileList.GetItemCount();iGetItemText(lParam1,sinfo.index); - sinfo.right=sinfo.list->GetItemText(lParam2,sinfo.index); - switch (sinfo.index) - { - case 0: - case 1: res=wcsicmp(sinfo.left,sinfo.right);break; - case 3: { - int l=_wtoi(sinfo.left); - int r=_wtoi(sinfo.right); - res=(l>r)-(lGetItemText(lParam1,3); - sinfo.right=sinfo.list->GetItemText(lParam2,3); - uint32_t l=_wtoi(sinfo.left); - uint32_t r=_wtoi(sinfo.right); - l=sinfo._ddlfile->GetFileSize(l); - r=sinfo._ddlfile->GetFileSize(r); - res=(l>r)-(llParam2)-(lParam1(pNMHDR); - for (int i=0,cnt=wFileList.GetItemCount();iiSubItem; - sinfo.list=&wFileList; - sinfo._ddlfile=&_ddlfile; - wFileList.SortItems(SortItemsInFileList,(LPARAM)&sinfo); - *pResult = 0; -} - -static int WINAPI PosBrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData) - { - const wchar_t *curpath=(const wchar_t *)lpData; - if (uMsg == BFFM_INITIALIZED) - { - if (curpath && curpath[0]) - { - ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)((LPCSTR)curpath)); - ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)((LPCSTR)curpath)); - } - } - else if (uMsg == BFFM_SELCHANGED) - { - wchar_t buff[_MAX_PATH]; - if (SHGetPathFromIDList((LPITEMIDLIST)lParam,buff)) - { - ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buff); - } - } - return 0; - }; - -static bool PathBrowser(HWND hWnd, wchar_t *path /* MAX_PATH size */) -{ - BROWSEINFO brw; - memset(&brw,0,sizeof(brw)); - brw.hwndOwner=hWnd; - brw.pidlRoot=NULL; - brw.pszDisplayName=path; - brw.lParam=(LPARAM)path; - brw.ulFlags= BIF_RETURNONLYFSDIRS |BIF_STATUSTEXT|BIF_USENEWUI ; - brw.lpfn = (BFFCALLBACK)(PosBrowseCallbackProc); - LPITEMIDLIST il=SHBrowseForFolder( &brw ); - if (il==NULL) return false; - SHGetPathFromIDList(il,path); - IMalloc *shmalloc; - SHGetMalloc(&shmalloc); - shmalloc->Free(il); - if (path[0]==0) return false; - return true; -} - - -void CDDLReaderDlg::OnBnClickedBrowse() -{ - wchar_t path[MAX_PATH]; - wFolder.GetWindowText(path,MAX_PATH); - if (PathBrowser(*this,path)) - { - wFolder.SetWindowText(path); - } -} - -void CDDLReaderDlg::OnBnClickedExport() -{ - wchar_t path[MAX_PATH]; - wFolder.GetWindowText(path,MAX_PATH); - if (path[0]==0) OnBnClickedBrowse(); - wFolder.GetWindowText(path,MAX_PATH); - if (path[0]==0) return; - WPathname fpath; - fpath.SetDirectory(path); - POSITION pos=wFileList.GetFirstSelectedItemPosition(); - int max=wFileList.GetSelectedCount(); - int cur=0; - DlgProgress pb; - if (max) {pb.Create(IDD_EXPORTING);pb.CenterWindow(this);EnableWindow(FALSE);} - while (pos) - { - MSG msg; - pb.wProgress.SetRange(0,max); - pb.wProgress.SetPos(++cur); - int i=wFileList.GetNextSelectedItem(pos); - CString fname; - uint32_t offset; - fname=wFileList.GetItemText(i,1); - offset=(uint32_t)_wtoi64(wFileList.GetItemText(i,3)); - pb.wDesc.SetWindowText(fname); - if (PeekMessage(&msg,0,0,0,PM_NOREMOVE)==TRUE) AfxPumpMessage(); - if (pb.stop) break; - DDLData data=_ddlfile.ExtractFile(offset); - if (data.data!=NULL) - { - fpath.SetFilename(fname); - HANDLE hFile=CreateFile(fpath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); - while (hFile==INVALID_HANDLE_VALUE) - { - CString msg; - AfxFormatString1(msg,IDS_UNABLETOCREATEFILE,fpath); - int retry=AfxMessageBox(msg,MB_ABORTRETRYIGNORE); - if (retry==IDABORT) {EnableWindow(TRUE);return;} - if (retry==IDIGNORE) break; - hFile=CreateFile(fpath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); - } - if (hFile!=INVALID_HANDLE_VALUE) - { - DWORD written; - WriteFile(hFile,data.data,data.sz,&written,NULL); - CloseHandle(hFile); - } - } - else - { - CString msg; - AfxFormatString1(msg,IDS_UNABLETOEXTACTDATA,fpath); - AfxMessageBox(msg,MB_OK|MB_ICONSTOP); - } - } - EnableWindow(TRUE); - - -} - -WPathname CDDLReaderDlg::CreateTemp(int index) -{ - if (!_lastTemp.IsNull()) DeleteFile(_lastTemp); - CString fname; - uint32_t offset; - fname=wFileList.GetItemText(index,1); - offset=(uint32_t)_wtoi64(wFileList.GetItemText(index,3)); - _lastTemp.SetTempDirectory(); - _lastTemp.SetFileTitle(WSC("SkeldalDDLReader")); - _lastTemp.SetExtension(WSC(".")+WString(fname)); - DDLData data=_ddlfile.ExtractFile(offset); - if (data.data) - { - HANDLE hFile=CreateFile(_lastTemp,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); - DWORD written; - WriteFile(hFile,data.data,data.sz,&written,NULL); - CloseHandle(hFile); - } - return _lastTemp; -} - -void CDDLReaderDlg::OnNMDblclkFilelist(NMHDR *pNMHDR, LRESULT *pResult) -{ - // TODO: Add your control notification handler code here - *pResult = 0; - int index=wFileList.GetNextItem(-1,LVNI_FOCUSED); - WPathname pth=CreateTemp(index); - ShellExecute(*this,0,pth,0,0,SW_NORMAL); -} diff --git a/DDLReader/Projects/Skeldal/DDLReader/DDLReaderDlg.h b/DDLReader/Projects/Skeldal/DDLReader/DDLReaderDlg.h deleted file mode 100644 index 7faf316..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DDLReaderDlg.h +++ /dev/null @@ -1,76 +0,0 @@ -// DDLReaderDlg.h : header file -// - -#include "t:\h\atlmfc\include\afxwin.h" -#include "ddlfile.h" -#include "WPathname.h" -#if !defined(AFX_DDLREADERDLG_H__E765355F_0112_4B3E_90CE_111E28FE8EC6__INCLUDED_) -#define AFX_DDLREADERDLG_H__E765355F_0112_4B3E_90CE_111E28FE8EC6__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -///////////////////////////////////////////////////////////////////////////// -// CDDLReaderDlg dialog - -class CDDLReaderDlg : public CDialog, public IDDLFileEnumerator -{ -// Construction - CSize _dlgSize; - WPathname _lastTemp; -public: - CDDLReaderDlg(CWnd* pParent = NULL); // standard constructor - ~CDDLReaderDlg(); - -// Dialog Data - //{{AFX_DATA(CDDLReaderDlg) - enum { IDD = IDD_DDLREADER_DIALOG }; - CEdit wFolder; - CListCtrl wFileList; - CButton wBrowse; - CButton wExport; - CString vFolder; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CDDLReaderDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - HICON m_hIcon; - - // Generated message map functions - //{{AFX_MSG(CDDLReaderDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnSysCommand(UINT nID, LPARAM lParam); - afx_msg void OnPaint(); - afx_msg HCURSOR OnQueryDragIcon(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -public: - afx_msg void OnSize(UINT nType, int cx, int cy); - CStatic wPopisek; - CEdit wDDLFile; - CButton wDDLBrowse; - afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI); - DDLFile _ddlfile; - afx_msg void OnEnKillfocusDdlfile(); - void UpdateList(void); - virtual bool File(WString name, int group, uint32_t offset); - afx_msg void OnBnClickedDdlbrowse(); - afx_msg void OnLvnColumnclickFilelist(NMHDR *pNMHDR, LRESULT *pResult); - afx_msg void OnBnClickedBrowse(); - afx_msg void OnBnClickedExport(); - afx_msg void OnNMDblclkFilelist(NMHDR *pNMHDR, LRESULT *pResult); - - WPathname CreateTemp(int index); -}; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_DDLREADERDLG_H__E765355F_0112_4B3E_90CE_111E28FE8EC6__INCLUDED_) diff --git a/DDLReader/Projects/Skeldal/DDLReader/DlgProgress.cpp b/DDLReader/Projects/Skeldal/DDLReader/DlgProgress.cpp deleted file mode 100644 index cccfd60..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DlgProgress.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// DlgProgress.cpp : implementation file -// - -#include "stdafx.h" -#include "DDLReader.h" -#include "DlgProgress.h" -#include ".\dlgprogress.h" - - -// DlgProgress dialog - -IMPLEMENT_DYNAMIC(DlgProgress, CDialog) -DlgProgress::DlgProgress(CWnd* pParent /*=NULL*/) - : CDialog(DlgProgress::IDD, pParent) -{ - stop=false; -} - -DlgProgress::~DlgProgress() -{ -} - -void DlgProgress::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - DDX_Control(pDX, IDC_PROGRESS, wProgress); - DDX_Control(pDX, IDC_NAME, wDesc); -} - - -BEGIN_MESSAGE_MAP(DlgProgress, CDialog) - ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) -END_MESSAGE_MAP() - - -// DlgProgress message handlers - -void DlgProgress::OnBnClickedButton1() -{ - stop=true; -} diff --git a/DDLReader/Projects/Skeldal/DDLReader/DlgProgress.h b/DDLReader/Projects/Skeldal/DDLReader/DlgProgress.h deleted file mode 100644 index 8e6e3fb..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/DlgProgress.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include "t:\h\atlmfc\include\afxcmn.h" -#include "t:\h\atlmfc\include\afxwin.h" - - -// DlgProgress dialog - -class DlgProgress : public CDialog -{ - DECLARE_DYNAMIC(DlgProgress) - -public: - DlgProgress(CWnd* pParent = NULL); // standard constructor - virtual ~DlgProgress(); - -// Dialog Data - enum { IDD = IDD_EXPORTING }; - -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - DECLARE_MESSAGE_MAP() -public: - CProgressCtrl wProgress; - CStatic wDesc; - afx_msg void OnBnClickedButton1(); - bool stop; -}; diff --git a/DDLReader/Projects/Skeldal/DDLReader/IWStringEffect.h b/DDLReader/Projects/Skeldal/DDLReader/IWStringEffect.h deleted file mode 100644 index 084f813..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/IWStringEffect.h +++ /dev/null @@ -1,36 +0,0 @@ -#if !defined(AFX_IWSTRINGEFFECT_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_) -#define AFX_IWSTRINGEFFECT_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include - -class IWStringEffect -{ -public: - ///function returns extra size that effect needs - /** - @param curSize size of string that enters to the effect - @return count of extra characters needs to effects; - */ - virtual uint32_t GetEffectExtraSize(uint32_t curSize) {return 0;} - - ///function renders begin of string. - /** Function returns number of characters rendered, and must be <= then size returned by GetEffectExtraSize() - @param renderPtr pointer to render buffer - @param curSize size of string that enters to the effect - @return number of characters rendered. Entered string will be rendered behind. - */ - virtual uint32_t PreRenderString(wchar_t *renderPtr,uint32_t curSize) {return 0;} - - ///function renders effect. - /** - @param renderPtr pointer to begin of render buffer. - @param rendered number of characters rendered by previous effect. Value doesn't point to the end - of buffer, function must add result of PreRenderString */ - virtual void RenderString(wchar_t *renderPtr, uint32_t rendered)=0; -}; - -#endif diff --git a/DDLReader/Projects/Skeldal/DDLReader/StdAfx.cpp b/DDLReader/Projects/Skeldal/DDLReader/StdAfx.cpp deleted file mode 100644 index 1a90873..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/StdAfx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// DDLReader.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - - - diff --git a/DDLReader/Projects/Skeldal/DDLReader/StdAfx.h b/DDLReader/Projects/Skeldal/DDLReader/StdAfx.h deleted file mode 100644 index 666c5f5..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/StdAfx.h +++ /dev/null @@ -1,27 +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__C5BDACC6_729E_4CA2_B27E_A1F209FB32A7__INCLUDED_) -#define AFX_STDAFX_H__C5BDACC6_729E_4CA2_B27E_A1F209FB32A7__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -#include // MFC core and standard components -#include // MFC extensions -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - -#include "wstring.h" - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__C5BDACC6_729E_4CA2_B27E_A1F209FB32A7__INCLUDED_) diff --git a/DDLReader/Projects/Skeldal/DDLReader/WPathname.cpp b/DDLReader/Projects/Skeldal/DDLReader/WPathname.cpp deleted file mode 100644 index fab2f57..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/WPathname.cpp +++ /dev/null @@ -1,408 +0,0 @@ -// WPathname.cpp: implementation of the WPathname class. -// -////////////////////////////////////////////////////////////////////// - -#include "WPathname.h" -#include -#include - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -WPathname::WPathname(const wchar_t *name /*=NULL*/) -{ - if (name) SetPathname(name); -} - -WPathname::WPathname(const WString &name) -{ - SetPathname(name); -} - -WPathname::WPathname(const wchar_t *relpath, const WPathname &abspath) -{ - _fullpath=WString(relpath); - int chr=_fullpath.FindLast('\\'); - if (chr!=-1) - { - _path=_fullpath.Left(chr+1); - _filetitle=_fullpath.Right(chr+1); - } - else - { - _filetitle=_fullpath; - } - chr=_filetitle.FindLast('.'); - if (chr!=-1) - { - _extension=_filetitle.Right(chr); - _filetitle=_filetitle.Left(chr); - } - - RelativeToFull(abspath); -} - - -WPathname::WPathname(const WPathname &other) -{ - _fullpath=other._fullpath; - _path=other._path; - _filetitle=other._filetitle; - _extension=other._extension; -} - -void WPathname::SetDrive(wchar_t dr) -{ - if (HasDrive()) - { - if (dr==0) _path=_path.Right(2); - else _path[0]=dr; - } - else if (dr!=0) - { - int np=IsNetworkPath(); - wchar_t buff[2]; - buff[0]=dr; - buff[1]=':'; - buff[2]=0; - if (np) - _path=WString(buff)+_path.Right(np); - else - _path=WString(buff)+_path; - - } - RebuildPath(); -} - -void WPathname::SetDirectory(const wchar_t *dir) -{ - bool copydrv; //directory doesn't contain drive, need copy from original - bool addslash; //directory doesn't ending by backslash, need add it - - int len=wcslen(dir); - copydrv=HasDrive(dir) || !HasDrive(); //copy original drive, if exists and directory doesn't contaion drive - if (wcsncmp(dir,L"\\\\",2)==0) copydrv=true; //network path, don't copy drive - addslash=len && dir[len-1]!='\\'; //add slash - if (copydrv) - _path=WString(dir); - else - _path=_path.Left(2)+WString(dir); - if (addslash) - _path+=WSC("\\"); - - RebuildPath(); -} - -void WPathname::SetFilename(const wchar_t *filename) -{ - WString wfilename=WString(filename); - int dot=wfilename.FindLast('.'); - if (dot==-1) - { - _filetitle=wfilename; - _extension=0; - } - else - { - _filetitle=wfilename.Left(dot); - _extension=wfilename.Right(dot); - } - - RebuildPath(); -} - -void WPathname::SetExtension(const wchar_t *ext) -{ - _extension=WString(ext); - RebuildPath(); -} - -void WPathname::SetFileTitle(const wchar_t *title) -{ - _filetitle=WString(title); - RebuildPath(); -} - -void WPathname::SetPathname(const wchar_t *pathname) -{ - SetPathname(WString(pathname)); -} - -void WPathname::SetPathname(const WString &pathname) -{ - if (pathname.GetLength()==0) SetNull(); - else - { - wchar_t *part; - DWORD needsz=GetFullPathNameW(pathname,0,NULL,&part); - wchar_t *fpth=(wchar_t *)alloca(needsz*sizeof(*fpth)); - GetFullPathNameW(pathname,needsz,fpth,&part); - part=wcsrchr(fpth,'\\'); - if (part) part++;else part=NULL; - if (part) - { - SetFilename(part); - *part=0; - } - else - SetFilename(WString()); - SetDirectory(fpth); - } -} - -const wchar_t *WPathname::GetNameFromPath(const wchar_t *path) -{ - const wchar_t *c=wcsrchr(path,'\\'); - if (c!=NULL) c++;else return path; - return c; -} - -const wchar_t *WPathname::GetExtensionFromPath(const wchar_t *path) -{ - const wchar_t *fname=GetNameFromPath(path); - const wchar_t *c=wcsrchr(fname,'.'); - if (c==NULL) c=wcsrchr(path,0); - return c; -} - -void WPathname::RebuildPath() -{ - _fullpath=_path+_filetitle+_extension; -} - -bool WPathname::GetDirectoryWithDriveWLBS(wchar_t *buff, size_t size) const -{ - size_t psize=wcslen(GetDirectoryWithDrive()); - if (psize>size) return false; - if (psize==0) {buff[0]=0;return true;} - wcsncpy(buff,GetDirectoryWithDrive(),psize-1); - buff[psize-1]=0; - return true; -} - -WString WPathname::GetDirectoryWithDriveWLBS() const -{ - if (_path.GetLength()) return _path.Left(_path.GetLength()-1); - return WString(); -} - -bool WPathname::IsPathValid() const -{ - if (IsNull()) return false; - wchar_t *invalidChars=L"/*?\"<>|"; - const wchar_t *path=GetFullPath(); - if (*path==0) return false; - while (*path) - { - if (wcschr(invalidChars,*path)!=NULL) return false; - path++; - } - return true; -} - -bool WPathname::SetTempDirectory() -{ - wchar_t buff[1]; - DWORD size=GetTempPathW(1,buff); - if (size==0) return false; - WString pth; - wchar_t *p=pth.CreateBuffer(size); - if (GetTempPathW(size,p)==0) return false; - pth.UnlockBuffer(); - _path=pth; - return true; -} - -bool WPathname::SetDirectorySpecial(int nSpecCode) -{ - wchar_t buff[MAX_PATH]; - if (SHGetSpecialFolderPathW(GetForegroundWindow(),buff,nSpecCode,FALSE)!=NOERROR) return false; - SetDirectory(buff); - return true; -} - -bool WPathname::SetTempFile(const wchar_t *prefix, unsigned int unique) -{ - wchar_t tempname[MAX_PATH]; - if (GetTempFileNameW(GetDirectoryWithDrive(),prefix,unique,tempname)==0) return false; - this->SetPathname(tempname); - return true; -} - -WPathname WPathname::GetExePath() -{ - wchar_t buff[MAX_PATH*4]; - GetModuleFileNameW(NULL,buff,sizeof(buff)); - return WPathname(buff); -} - -const wchar_t *WPathname::FullToRelativeProjectRoot(const wchar_t *full, const wchar_t *projectRoot) -{ - const wchar_t *a=full,*b=projectRoot; - while (*a && towlower(*a)==towlower(*b)) {a++;b++;}; - if (*b) return full; - return a; -} - -bool WPathname::FullToRelative(const WPathname &relativeto) -{ - if (relativeto.IsNull() || IsNull()) return false; - bool h1=HasDrive(); - bool h2=relativeto.HasDrive(); - if (h1!=h2) return false; //rozdilny zpusob adresace - nelze vytvorit relatvni cestu - if (h1==true && h2==true && towupper(GetDrive())!=towupper(relativeto.GetDrive())) - return false; //ruzne disky, nelze vytvorit relativni cestu - if (wcsncmp(_path,L"\\\\",2)==0) //sitova cesta - { - int slsh=0; //citac lomitek - const wchar_t *a=_path; - const wchar_t *b=relativeto._path; - while (towupper(*a)==towupper(*b) && *a && slsh<3) //zacatek sitove cesty musi byt stejny - { - if (*a=='\\') slsh++; - a++;b++; - } - if (slsh!=3) return false; //pokud neni stejny, nelze vytvorit relativni cestu - } - int sublevel=0; - const wchar_t *ps1=_path; - const wchar_t *ps2=relativeto._path; - if (h1) {ps1+=2;ps2+=2;} - const wchar_t *sls=ps2; - while (towupper(*ps1)==towupper(*ps2) && *ps1) - { - if (*ps2=='\\') sls=ps2+1; - ps1++;ps2++; - } - ps1-=ps2-sls; - if (sls) - { - while (sls=wcschr(sls,'\\')) - { - sls++; - sublevel++; - } - } - wchar_t *buff=(wchar_t *)alloca((sublevel*3+wcslen(ps1)+1)*sizeof(*buff)); - wchar_t *pos=buff; - for (int i=0;iref._path.GetString()) - { - end--; - while (end>ref._path.GetString() && end[-1]!='\\') end--; - } - beg+=3; - } - else - beg+=2; - } - int partln=end-ref._path; - wchar_t *buff=(wchar_t *)alloca((partln+wcslen(beg)+1)*sizeof(*buff)); - wcsncpy(buff,ref._path,partln); - wcscpy(buff+partln,beg); - SetDrive(0); - SetDirectory(buff); - return true; -} - -int WPathname::IsNetworkPath() const -{ - if (wcsncmp(_path,L"\\\\",2)==0) //sitova cesta - { - const wchar_t *p=_path+2; - const wchar_t *c=wcschr(p,'\\'); - if (c) return c-_path; - } - return 0; -} - -void WPathname::SetServerName(const wchar_t *server) -{ - if (HasDrive()) SetDrive(0); - else - { - int np=IsNetworkPath(); - _path=_path.Right(np); - } - - _path=WSC("\\\\")+WString(server)+WSC("\\"); - RebuildPath(); -} - -void WPathname::SetNull() -{ - _fullpath=_path=_filetitle=_extension=0; -} - -bool WPathname::GetPartFromPath(const wchar_t *path, int partnum, wchar_t *buff, int bufsize, int mode) -{ - const wchar_t *scan=path; - while (*scan=='\\') scan++; - while (partnum && *scan) - { - while (*scan!='\\' && *scan) scan++; - while (*scan=='\\') scan++; - partnum--; - } - if (*scan==0) - { - buff[0]=0; - return false; - } - int pt=0; - if (mode==-1) - { - pt=scan-path; - if (pt>bufsize) - { - buff[0]=0; - return true; - } - else - memcpy(buff,path,pt); - } - bool nlast=false; - while (*scan && (mode==1 || !nlast) && pt 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "WString.h" - -#ifndef ASSERT -#ifdef _DEBUG -#define ASSERT(x) assert(x) -#else -#define ASSERT(x) -#endif -#endif - -#define WPathnameCompare(op) bool operator op (const WPathname &other) const \ -{if (IsNull() || other.IsNull()) return false;else return wcsicmp(_fullpath,other._fullpath) op 0;}\ - bool operator op (const wchar_t *other) const \ -{ASSERT(!other || other[0]!=0);\ - if (IsNull() || other==NULL) return false;else return wcsicmp(_fullpath,other) op 0;} - -/** class WPathname simplifying manipulation with WPathnames, filenames, general paths, and -also supports convert from absolute path to relative respectively */ - - - -class WPathname -{ - ///object value and data - /**The implementation of WPathname creates only one buffer for all variables. It can - increase speed by effective memory use. Strings are stored one after another separated - by zero byte. Evry time any string changed, implementation recalculate buffer usage, and - decide, whether it should resize buffer or not. - - _fullpath also points to string contain full path with filename, - it is dominant value of the class - */ - WString _fullpath; - WString _path; /// - If name is provided, WPathname will expand it into full name with drive and folder name. - @param name optional argument to inicialize object - */ - WPathname(const wchar_t *name=NULL); - WPathname(const WString &name); - - ///Construct WPathname class - /** - @param relpath Relative path or uncomplette path or single filename with extension. - WPathname will expand this WPathname into full using absolute path provided by the second - argument. - @param abspath Absolute path used as reference to folder - the origin of relative path - provided in the first argument. - */ - WPathname(const wchar_t *relpath, const WPathname &abspath); - - ///Construct WPathname as copy of another WPathname - WPathname(const WPathname &other); - - - ///Function returns the current drive letter. - /** Before usage, ensure, that current WPathname contain drive. - In network path drive letter is missing. - In this case, result is undefined. To ensure, use HasDrive function - @return the drive letter of current path. - */ - wchar_t GetDrive() const - { - if (IsNull()) return 0; - return _path[0]; - } - - ///Static function determines, if argument contain a drive information. - /** - @param dir directory to inspect - @return true, if directory contain drive.

- This function is independed, it don't need any WPathname variable declared. - */ - static bool HasDrive(const wchar_t *dir) - {return (dir[0]>='A' && dir[0]<='Z' || dir[0]>='a' && dir[0]<='z') && dir[1]==':';} - - ///Function determines, if current WPathname contain a drive information - /** - @return true, if current WPathname contain a drive information - */ - bool HasDrive() const - { - if (IsNull()) return false; - return HasDrive(_path); - } - - - ///Function returns current folder name - /** - if current folder name contain drive, only folder name is returned (without drive). - In other cases (relative or network drives) returns full path. - @return folder name or full path. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const wchar_t *GetDirectory() const - { - if (HasDrive()) return _path.GetString()+3; - else return _path.GetString()+IsNetworkPath(); - } - - const wchar_t *GetDirectoryWithDrive() const - { - return _path; - } - - ///Function returns current filename with extension - /** - @return current filename with extension. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const wchar_t *GetFilename() const - { - if (IsNull()) return NULL; - const wchar_t *blk=wcsrchr(_fullpath,'\\'); - if (blk) blk=blk+1;else blk=_fullpath; - return blk; - } - - ///Function returns current extension (with starting dot) - /** - @return current extension. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const wchar_t *GetExtension() const - {return _extension;} - - ///Function returns current filename without extension (without dot) - /** - @return current filename without extension (without dot). Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const wchar_t *GetTitle() const - {return _filetitle;} - - ///Function changes current drive. - /**If object contain WPathname with drive, then current drive is changed and function returns. - If object contain network path, then computer name is changed to the drive name. - If object contain relative path, then whole path is replaced by path on root on drive. - @param dr new drive letter. This parameter can be set to zero. It means, that current - driver is deleted, and path is converted to relative path from root. Note: Zero c - cannot be used with network paths and relative paths, and finnaly has no effect to the object - */ - - void SetDrive(wchar_t dr); - - ///Sets new directory for object - /** if object contain a drive letter and argument dir doesn't, then current drive is remain - and only directory part is replaced. If current path is network path or relative path, - then whole path is replaced by new one. - If argument dir contain drive letter, then whole path is replaced too. - @param dir contain new WPathname. Backslash should be the last wchar_tacter in string - */ - void SetDirectory(const wchar_t *dir); - - ///Sets new filename for object. - /** - If filename contain dot, function assumes, that filename is provided with extension. - Otherwise, current extension remains untouched. - @param filename new filename for object - */ - - void SetFilename(const wchar_t *filename); - - ///Sets new extension for object. - /** - If ext doesn't starting with dot, function adds it. - @param ext new extension for object - */ - void SetExtension(const wchar_t *ext); - - ///Sets new file title - /** Function changes file title, extension remains untouched. - if title contains extension (dot inside its name), this extension doesn't change - current extension. For example, if current extension is ".cpp" and filetitle contain - "source.h", then result is "source.h.cpp" - @param title a new title for object. - */ - - void SetFileTitle(const wchar_t *title); - - ///Function returns full WPathname. - /** - @return current WPathname. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - - const wchar_t *GetFullPath() const - {return _fullpath;} - - ///Sets WPathname - /** Function has same effect as constructor. But it can be used - anytime during object lifetime. It simply replaces current WPathname with newer. WPathname - in argument is expanded to full WPathname, current directory is used as reference. - @param WPathname new WPathname - */ - void SetPathname(const wchar_t *pathname); - void SetPathname(const WString &pathname); - - WPathname& operator=(const wchar_t *other) - {SetPathname(other);return *this;} - - WPathname& operator=(const WString &other) - {SetPathname(other);return *this;} - - WPathname& operator=(const WPathname& other) - { - _fullpath=other._fullpath; - _path=other._path; - _filetitle=other._filetitle; - _extension=other._extension; - return *this; - } - - ///converts object to string - operator const wchar_t *() const - {return GetFullPath();} - - ///Static function to help getting filename from WPathname - /** Function finds last backslash / and return pointer to first wchar_tacter after it. - Pointer stays valid until original path is destroyed or until original path is changed - @param path WPathname to inspect as string - @return pointer to filename - */ - static const wchar_t *GetNameFromPath(const wchar_t *path); - - ///Static function to help getting extension from WPathname - /** Function finds last dot '.' in filename return pointer to it (extension with dot). - Pointer stays valid until original path is destroyed or until original path is changed - @param path WPathname to inspect as string - @return pointer to extension - */ - static const wchar_t *GetExtensionFromPath(const wchar_t *path); - - ///Function sets server name for network path - /** If current path is network path, then changes server name to newer. Otherwise - it remove drive letter, and insert server name before remain path - @param server server name without slashes - */ - void SetServerName(const wchar_t *server); - - ///Function inspects current path and returns, whether contain server name - /**@return zero, if current path is not valid network path. Nonzero if path contain - server name. Then value returned count wchar_tacters containing server name with precedent - slashes. - */ - int IsNetworkPath() const; - - ///Function converts current relative path into absolute path - /** - If current path is not relative, function do nothing. - @param ref reference to path, against which path is relative. - @return true if path has been converted, or false, if conversion is impossible - */ - bool RelativeToFull(const WPathname &ref); - - ///Function converts current absolute path into relative path - /** - If current path is not relative, function do nothing. Both paths must be on the same - drive or network computer. - - @param ref reference to path, against which path should be relative. - @return true if path has been converted, or false, if conversion is impossible - */ - bool FullToRelative(const WPathname &relativeto); - - WPathname& operator+=(const wchar_t *relativePath) - {*this=WPathname(relativePath,*this);return *this;} - - WPathname operator+(const wchar_t *relativePath) - {WPathname out(relativePath,*this);return out;} - - bool IsNull() const {return _fullpath.GetLength()==0;} - - void SetNull(); - - WPathnameCompare(<) - WPathnameCompare(>) - WPathnameCompare(==) - WPathnameCompare(>=) - WPathnameCompare(<=) - WPathnameCompare(!=) - - - ///Function gets part of WPathname - /** - @param path subject of examine - @param partnum zero-base index of part of WPathname. Index 0 mostly contain drive or server, in case of - relative path, there is the name of the first folder or dots. - @param buff buffer for store result - @param bufsize count wchar_tacters in buffer; - @param mode mode=0, gets only name of part. - mode=1, get current part and remain parts of path. - mode=-1, gets all parts till current - @return Function returns true, if it was succesful, and it was not last part. Function returns - false, if it was succesful, and it was last part. Function returns false and sets buffer empty, - if an error occured. Function returns true and sets buffer empty, if buffer is too small to hold data - */ - static bool GetPartFromPath(const wchar_t *path, int partnum, wchar_t *buff, int bufsize, int mode=0); - - ///Function gets part of object - /** - @param partnum zero-base index of part of WPathname. Index 0 mostly contain drive or server, in case of - relative path, there is the name of the first folder or dots. - @param buff buffer for store result - @param bufsize count wchar_tacters in buffer; - @param mode mode=0, gets only name of part. - mode=1, get current part and remain parts of path. - mode=-1, gets all parts till current - @return Function returns true, if it was succesful, and it was not last part. Function returns - false, if it was succesful, and it was last part. Function returns false and sets buffer empty, - if an error occured. Function returns true and sets buffer empty, if buffer is too small to hold data - */ - bool GetPart(int partnum, wchar_t *buff, int bufsize,int mode=0) const - { - return GetPartFromPath(this->_fullpath,partnum,buff,bufsize,mode); - } - - /// Get Directory With Drive Without Last Back Slash - /** Retrieves into buffer directory with drive and removes last backslash - @param buff buffer that retrieves path - @param size size of buffer - @return true, if success, failed if buffer is too small*/ - - - bool GetDirectoryWithDriveWLBS(wchar_t *buff, size_t size) const; - - WString GetDirectoryWithDriveWLBS() const; - - - /// function checks, if path is valid and returns true, if does. - bool IsPathValid() const; - - /// Sets special directory. - /** - @param bSpecCode this value may be operation-system - depend. Windows implementation using CSIDL_XXXX constants, which is described in SHGetSpecialFolderLocation function - description - @return true, if function were successful - */ - bool SetDirectorySpecial(int nSpecCode); - - ///Sets temporaly directory. - bool SetTempDirectory(); - - ///Guess temporaly file name - /** - @param prefix prefix string for name - @param unique if unique is non-zero, it is used for new temporaly file. If unique is zero, function guess own unique - value. - @return true if function were successful - */ - bool SetTempFile(const wchar_t *prefix=L"tmp", unsigned int unique=NULL); - - ///Returns path of current executable. - /**It useful, when accessing folder, from when current module has been executed */ - static WPathname GetExePath(); - - ///Solves most used conversion from fullpath to path relative to project root - /** - @param full full WPathname with drive - @param projectRoot project root path - @return function returns pointer to full path, where starts relative part. If - fullpath doesn't contain project root path, it returns pointer to full. - @example FullToProjectRoot("x:\\project\\data\\example.txt","x:\\project"); //result is "data\\example.txt" - */ - - static const wchar_t *FullToRelativeProjectRoot(const wchar_t *full, const wchar_t *projectRoot); - - -protected: - ///Function only rebuild _fullpath string. - /** It doesn't check space for string! This function is used, when length of path is excepted - the same or smaller, then current. - */ - void RebuildPath(); - - -}; - - - -#endif // !defined(AFX_WPathname_H__158F59D5_B422_4FA6_86AC_10B5EC48C81B__INCLUDED_) diff --git a/DDLReader/Projects/Skeldal/DDLReader/WString.cpp b/DDLReader/Projects/Skeldal/DDLReader/WString.cpp deleted file mode 100644 index a485574..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/WString.cpp +++ /dev/null @@ -1,193 +0,0 @@ -// WString.cpp: implementation of the WString class. -// -////////////////////////////////////////////////////////////////////// - -#include "WString.h" -#include -#include - - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -WString::WString(const char *sbstring, unsigned int codePage) -{ - if (sbstring==NULL || *sbstring==0) - { - _ref=NULL; - } - else - { - size_t reqBuff=MultiByteToWideChar(codePage,0,sbstring,-1,NULL,0); - - _ref=WStringMemory::AllocString(NULL,reqBuff); - _ref->AddRef(); - wchar_t *str=const_cast(_ref->GetStringFromMemBlock()); - - MultiByteToWideChar(codePage,0,sbstring,-1,str,reqBuff); - } -} - -int WString::FormatV(wchar_t *format, va_list lst) -{ - size_t curSize=4096; - int written; - do - { - _ref=WStringMemory::AllocString(NULL,curSize); - wchar_t *str=const_cast(_ref->GetStringFromMemBlock()); - written=_vsnwprintf(str,curSize,format,lst); - if (written<0) - { - curSize*=2; - WStringMemory::FreeProxy(_ref); - } - } - while (written<-1); - _ref->RecalcLength(); - _ref->AddRef(); - return written; -} - -int WString::Format(wchar_t *format, ...) -{ - va_list valst; - va_start(valst,format); - return FormatV(format,valst); -} - - -int WString::ScanStringV(const wchar_t *format, va_list lst) const -{ - uint32_t *ptr=(uint32_t *)lst; - return swscanf(GetString(),format,ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5],ptr[6],ptr[7],ptr[8],ptr[9], - ptr[10],ptr[11],ptr[12],ptr[13],ptr[14],ptr[15],ptr[16],ptr[17],ptr[18],ptr[19]); - -} - -int WString::ScanString(const wchar_t *format, ...) const -{ - va_list valst; - va_start(valst,format); - return ScanStringV(format,valst); -} - -bool WString::ReplaceOnce(const WString &findWhat,const WString &replaceWith) -{ - int pos=Find(findWhat); - if (pos==-1) return false; - (*this)=Left(pos)+replaceWith+Right(pos+replaceWith.GetLength()); - return true; -} - -bool WString::ReplaceAll(const WString &findWhat,const WString &replaceWith) -{ - WString process=*this; - WString result; - int pos; - bool processed=false; - while ((pos=process.Find(findWhat))!=-1) - { - result=result+process.Left(pos)+replaceWith; - process=process.Right(pos+findWhat.GetLength()); - processed=true; - } - *this=result+process; - return processed; -} - -WString WString::TrimLeft() const -{ - return TrimLeft(L" \r\n\t"); -} - -WString WString::TrimRight() const -{ - return TrimRight(L" \r\n\t"); -} - -WString WString::TrimLeft(wchar_t *trimChars) const -{ - const wchar_t *proStr=GetString(); - int p=0; - while (proStr[p] && wcschr(trimChars,proStr[p]!=NULL)) p++; - return Right(p); -} - -WString WString::TrimRight(wchar_t *trimChars) const -{ - const wchar_t *proStr=GetString(); - int p=GetLength()-1; - while (p>=0 && wcschr(trimChars,proStr[p]!=NULL)) p--; - return Left(p+1); -} - -WString WString::Upper() const -{ - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,WStringProxy::EfUpper))); -} - -WString WString::Lower() const -{ - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,WStringProxy::EfLower))); -} - -WString WString::Reverse() const -{ - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,WStringProxy::EfReverse))); -} - -WString WString::Effect(IWStringEffect *effect) const -{ - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,effect))); -} - -void WString::SetUTF7(const char *utf7) -{ - *this=WString(utf7,CP_UTF7); -} - -void WString::SetUTF8(const char *utf8) -{ - *this=WString(utf8,CP_UTF8); -} - -const char *WString::AsSBString(unsigned int codePage, WString &holder) -{ - const wchar_t *str=GetString(); - size_t reqsize=WideCharToMultiByte(codePage,0,str,-1,NULL,0,NULL,NULL); - WStringProxy *holderProxy=WStringMemory::AllocString(NULL,reqsize/2); //reqsize/2+(2 bytes) - char *mbstr=reinterpret_cast(const_cast(holderProxy->GetStringFromMemBlock())); - WideCharToMultiByte(codePage,0,str,-1,mbstr,reqsize,NULL,NULL); - holder=WString(holderProxy); - return mbstr; -} - -const char *WString::AsUTF7(WString &holder) -{ - return AsSBString(CP_UTF7,holder); -} - -const char *WString::AsUTF8(WString &holder) -{ - return AsSBString(CP_UTF8,holder); -} - -void WString::ReadFromStream(size_t (*streamReader)(wchar_t *buffer, size_t bufferLen, void *context),void *context) -{ - _ref->Release(); - _ref=NULL; - wchar_t buff[256]; - size_t rd; - while ((rd=streamReader(buff,sizeof(buff)/sizeof(wchar_t),context))!=0) - { - *this=*this+WString(buff,rd); - } -} - -const WString WStringConst(const wchar_t *text) -{ - return WString(WStringMemory::AllocProxy(WStringProxy(text))); -} - diff --git a/DDLReader/Projects/Skeldal/DDLReader/WString.h b/DDLReader/Projects/Skeldal/DDLReader/WString.h deleted file mode 100644 index a244adb..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/WString.h +++ /dev/null @@ -1,496 +0,0 @@ -// WString.h: interface for the WString class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_WSTRING_H__481164FB_3BB7_4824_B0E3_8B371F0AAF3A__INCLUDED_) -#define AFX_WSTRING_H__481164FB_3BB7_4824_B0E3_8B371F0AAF3A__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "WStringProxy.h" -#include - -class WString -{ - mutable WStringProxy *_ref; - - - -public: - ///constructs empty string - WString():_ref(0) {} - - ///constructs string. - explicit WString(const wchar_t *string):_ref(string==NULL?NULL:WStringMemory::AllocString(string,0)) {_ref->AddRef();}; - - ///constructs string from wide-char array with specified length - WString(const wchar_t *string, size_t sz):_ref(WStringMemory::AllocString(string,sz)) {_ref->AddRef();}; - - ///copy constructor - /**constructor doesn't copy the string, only reference. - String is shared until it is changed - */ - WString(const WString &other):_ref(other._ref) {_ref->AddRef();} - - ///constructs string from multi-byte string. codePage specified code page of string - WString(const char *sbstring, unsigned int codePage); - - ///constructs string from string-proxy. Used internally with WStringMemory::AllocXXX functions - WString(WStringProxy *proxy):_ref(proxy) {_ref->AddRef();} - - ///assignment operator - /** assignment operator doesn't copy the string only reference. - String is shared until it is changed */ - WString &operator=(const WString &other) - {other._ref->AddRef();_ref->Release();_ref=other._ref;return *this;} - - ///Destructor - releases reference - ~WString() {_ref->Release();} - - ///function converts instance of WString to wchar_t pointer - /** - Function will perform RenderString, if it is needed. - */ - const wchar_t *GetString() const - { - if (_ref==NULL) return L""; - WStringProxy *str=_ref->RenderString(); - if (_ref!=str) - { - str->AddRef();_ref->Release();_ref=str; - } - return _ref->GetStringFromMemBlock(); - } - - ///operator can convert WString to wchar_t pointer anytime - operator const wchar_t *() const {return GetString();} - - ///function returns count of characters in string - /** function doesn't need to render string, so it can be called anytime - without loosing the benefit of "pseudo-strings" boosting */ - size_t GetLength() const - { - if (_ref) return _ref->GetLength(); - else return 0; - } - - ///function creates string as sum of this and another string - /** function creates "pseudo-string" that represents sum of two string. - pseudo-string is rendered to "real-string" automatically, when it is needed */ - WString operator+(const WString other) const - { - if (_ref==NULL) return other; - if (other._ref==NULL) return *this; - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,other._ref))); - } - - WString &operator+=(const WString other) - { - *this=*this+other; - return *this; - } - - ///function creates string as substring of another string - /** function creates "pseudo-string" that represents substring of anothers string. - Pseudo-string is rendered to "real-string" automatically, when it is needed */ - WString Mid(size_t begin, size_t len) const - { - if (begin==0) return Left(len); - if (_ref==NULL || begin>GetLength()) return WString(); - if (begin+len>GetLength()) return Right(begin); - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,begin,len))); - } - - WString Left(size_t len) const - { - if (_ref==NULL) return WString(); - if (len>=GetLength()) return *this; - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,0,len))); - } - - WString Right(size_t begin) const - { - if (_ref==NULL || begin>GetLength()) return WString(); - if (begin==0) return *this; - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,begin,GetLength()-begin))); - } - - WString RightR(size_t count) const - { - if (_ref==NULL || count==0) return WString(); - if (count>=GetLength()) return *this; - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,GetLength()-count,count))); - } - - WString Delete(size_t begin, size_t count) const - { - if (_ref==NULL) return WString(); - if (begin==0) return Right(count); - if (begin+count>=GetLength()) return Left(begin); - return WString(WStringMemory::AllocProxy(WStringProxy(Left(begin)._ref,Right(begin+count)._ref))); - } - - WString Insert(const WString &what, size_t index) const - { - if (_ref==NULL) return what; - if (index==0) return what+*this; - if (index>=GetLength()) return *this+what; - return Left(index)+what+Right(index); - } - - /// function allows to access any char in string - wchar_t operator[](int index) const - { - assert(index<=(int)GetLength() && index>=0); - return GetString()[index]; - } - - /// functions allows lock string for accesing it directly. - /** Function returns pointer to buffer which holds string. - Buffer size is equal to string length plus terminating zero. - Application can modify content of buffer. - If string is shared with another WString object, LockBuffer - creates copy of string - Do not forger to call UnlockBuffer, when you finish modifiing the content - */ - wchar_t *LockBuffer() - { - if (_ref==NULL) return NULL; - GetString(); - WStringMemory::LockProxy(_ref); - if (_ref->IsShared()) - { - WStringMemory::UnlockProxy(_ref); - _ref->Release(); - _ref=WStringMemory::AllocString(_ref->GetStringFromMemBlock(),0); - _ref->AddRef(); - WStringMemory::LockProxy(_ref); - } - return const_cast(_ref->GetStringFromMemBlock()); - } - - /// Function creates buffer for string and returns its address - /** Application can use buffer in functions, that cannot work with - WString objects. Size of buffer is specified by sz value, and it is in characters. - Application must call UnlockBuffer after writes all data into buffer. - - NOTE: Prevoius content of string is lost. - NOTE: sz specifies buffer size without terminating zero character - */ - wchar_t *CreateBuffer(size_t sz) - { - _ref->Release(); - _ref=WStringMemory::AllocString(NULL,sz); - _ref->AddRef(); - WStringMemory::LockProxy(_ref); - return const_cast(_ref->GetStringFromMemBlock()); - } - - /// Function creates buffer, and copies string into it. - /** Parameter sz specifies size of new buffer in characters - When sz is smaller then size of string, string is truncated - When sz is larger then size of string, string is copied unchanged, - but extra characters can be appended. - - NOTE: sz specifies buffer size without terminating zero character - */ - wchar_t *CreateBufferCopy(size_t sz) - { - WString save=*this; - wchar_t *wbuff=CreateBuffer(sz); - int minsz=__min(sz,save.GetLength()); - wcsncpy(wbuff,save.GetString(),minsz); - return wbuff; - } - - /// Function unlocks internal buffer - /** parameter sz specifies final lenght of string in buffer. Default - value -1 forces function calc size by own - */ - void UnlockBuffer(int sz=-1) - { - if (_ref==NULL) return; - wchar_t *wbuff=const_cast(_ref->GetStringFromMemBlock()); - if (sz<0) sz=wcslen(wbuff); - else wbuff[sz]=0; - if (sz!=(signed)_ref->GetLength()) - { - _ref->RecalcLength(); - WStringMemory::UnlockProxy(_ref); - } - } - - class WStringAtCharHelper - { - WString &_str; - size_t _index; - public: - WStringAtCharHelper(WString &str,size_t index):_str(str),_index(index) {} - WString &operator=(wchar_t z) - { - wchar_t *buff=_str.LockBuffer(); - assert(buff && _index<_str.GetLength()); - buff[_index]=z; - _str.UnlockBuffer(); - return _str; - } - operator wchar_t() - { - assert(_index<_str.GetLength()); - return ((const wchar_t *)_str)[_index]; - } - }; - - /// Function will return helper object, which can access single character in string - /** - Using array operator is slower than accessing characters by LockBuffer function - */ - WStringAtCharHelper operator[](int index) - { - return WStringAtCharHelper(*this,index); - } - - int Find(wchar_t z,size_t from=0) const - { - if (from>=GetLength()) return -1; - const wchar_t *res=wcschr(GetString()+from,z); - if (res) return res-GetString(); - else return -1; - } - - int FindLast(wchar_t z) const - { - const wchar_t *res=wcsrchr(GetString(),z); - if (res) return res-GetString(); - else return -1; - } - - int Find(const wchar_t *z,size_t from=0) const - { - if (z==NULL) return -1; - if (from>=GetLength()) return -1; - const wchar_t *res=wcsstr(GetString()+from,z); - if (res) return res-GetString(); - else return -1; - } - - int FormatV(wchar_t *format, va_list lst); - - int Format(wchar_t *format, ...); - - ///Scans string for format - /** function is limited, item count is limited up to 20 items */ - int ScanStringV(const wchar_t *format, va_list lst) const; - - ///Scans string for format - /** function is limited, item count is limited up to 20 items */ - int ScanString(const wchar_t *format, ...) const; - - bool ReplaceOnce(const WString &findWhat,const WString &replaceWith); - - bool ReplaceAll(const WString &findWhat,const WString &replaceWith); - - WString TrimLeft() const; - - WString TrimRight() const; - - WString TrimLeft(wchar_t *trimChars) const; - - WString TrimRight(wchar_t *trimChars) const; - - ///Function splits string into two - /** Left part of string is returned. - Right part of string is leaved in object - @param splitPos split position. - @return if splitPos==0, function returns empty string. if splitPos>=length, function - moves string from object to result*/ - WString Split(size_t splitPos) - { - WString result=Left(splitPos); - *this=Right(splitPos); - return result; - } - - bool IsEmpty() const {return _ref==NULL;} - - void Empty() const {_ref->Release();_ref=NULL;} - - int Compare(const wchar_t *other) const - { - return wcscmp(*this,other); - } - - bool operator>(const WString &other) const {return Compare(other)>0;} - bool operator<(const WString &other) const {return Compare(other)<0;} - bool operator>=(const WString &other) const {return Compare(other)>=0;} - bool operator<=(const WString &other) const {return Compare(other)<=0;} - bool operator!=(const WString &other) const {return Compare(other)<=0;} - bool operator==(const WString &other) const {return Compare(other)<=0;} - - WString Upper() const; - WString Lower() const; - WString Reverse() const; - - ///Applies user effect on string - /** pointer should be static allocated object, or must be valid during lifetime of resulting string */ - WString Effect(IWStringEffect *effect) const; - - void SetUTF7(const char *utf7); - void SetUTF8(const char *utf8); - - ///Function converts string to SingleByte string - /** - @param codePage Platform depends code page of result - @param holder Object that holds result. Result pointer is valid during lifetime of holder. Once holder - released, pointer is invalidated. You can get resulting pointer anytime from holder reintepreting - wchar_t to char - @result pointer to string - */ - const char *AsSBString(unsigned int codePage, WString &holder); - - ///Returns multibyte string in UTF7 codepage - /**See AsSBString description*/ - const char *AsUTF7(WString &holder); - - ///Returns multibyte string in UTF7 codepage - /**See AsSBString description*/ - const char *AsUTF8(WString &holder); - - - ///Function reads string from stream - /** - Function calls streamReader repeatly until function returns zero. In each call, streamReader returns - number of characters, that has been readed. - @param sreamReader pointer to function which provides reading from a stream - @param context user defined context pointer (most in cases, pointer to stream is passed) - @param buffer space allocated for data readed from stream - @param bufferLen maximum count of characters can be written to buffer - @return streamReader returns number of characters, that has been written to buffer. Function must return zero - to stop reading - */ - void ReadFromStream(size_t (*streamReader)(wchar_t *buffer, size_t bufferLen, void *context),void *context); - - WString operator() (int from) const {return from<0?RightR(-from):Right(from);} - WString operator() (int from, int to) const - { - if (from>=0) - return to<0?Mid(from,-to):Mid(from,to-from); - else - return to<0?Mid(GetLength()+from,-to):Mid(GetLength()+from,GetLength()-from-to); - } - - ///Enables global string sharing. - /** Function Share allows share strings that contains same text. It can reduce memory - usage. Function is useful when there is many objects that contains string with same text. - - Basically, two strings is shared, if one string is created as copy of another string. Strings - is sharing they content, until one of them is modified. - - Calling Share function, string is registered for global sharing. If string with same content is already - registered, then content of current string is released, and string is shared. - - To successfully share two strings, both strings must call Share() function. Sharing is provided until one - of strings is modified. After modifications are done, Share function of modified string must be called again. - - Remember: Global sharing can reduce amount of memory, if there are multiple strings that containging - the same content. But sharing of each unique string takes small piece of memory to store sharing - informations. - - To share string automatically, use WSharedString class - WSC strings cannot be shared! - */ - void Share() const - { - WStringProxy *curref=_ref; - GetString(); - _ref=WStringMemory::ShareString(curref); - _ref->AddRef(); - curref->Release(); - } - - ///Disables global string sharing - /** Function unregisters string from global sharing database. If string is shared, function doesn't break - it. But all strings that currently sharing content will not be shared with newly created strings. - */ - void Unshare() - { - WStringMemory::UnshareString(_ref); - } -}; - -///Function will create constant WString -/** function will not copy content of string. Only creates reference to string - Using WStringConst is faster for strings in code -@exmple result=a+WStringConst(L"text")+b; -*/ -const WString WStringConst(const wchar_t *text); - -///Macro to easy convert incode string to WString -/** -function also marks text wide. -@example WString text=WSC("Hello world"); -*/ -#define WSC(x) WStringConst(L##x) -///Macro to easy convert any wchar_t buffer to constant WString -/** -IMPORTANT NOTE!: Buffer must exists until string is rendered. -If you are using WSCB in function, don't forget call GetString before function exits -If you are excepting additional string operations outside function, using standard -WString conversion can be more effecient. -*/ -#define WSCB(x) WStringConst(x) - - - -class WSharedString: public WString -{ -public: - WSharedString() {} - - ///constructs string. - explicit WSharedString(const wchar_t *string):WString(string) {Share();} - - ///constructs string from wide-char array with specified length - WSharedString(const wchar_t *string, size_t sz):WString(string,sz) {Share();}; - - ///copy constructor - /**constructor doesn't copy the string, only reference. - String is shared until it is changed - */ - WSharedString(const WSharedString &other):WString(other) {} - WSharedString(const WString &other):WString(other) {Share();} - - ///constructs string from multi-byte string. codePage specified code page of string - WSharedString(const char *sbstring, unsigned int codePage):WString(sbstring,codePage) {Share();} - - ///assignment operator - /** assignment operator doesn't copy the string only reference. - String is shared until it is changed */ - WSharedString &operator=(const WString &other) - {WString::operator =(other);Share();return *this;} - - const wchar_t *GetString() const - { - const wchar_t *res=WString::GetString(); - Share(); - return res; - } - operator const wchar_t *() const {return GetString();} - wchar_t operator[](int index) const - { - assert(index<=(int)GetLength() && index>=0); - return GetString()[index]; - } - - void UnlockBuffer(int sz=-1) - { - WString::UnlockBuffer(sz); - Share(); - } - -}; - - -#endif // !defined(AFX_WSTRING_H__481164FB_3BB7_4824_B0E3_8B371F0AAF3A__INCLUDED_) diff --git a/DDLReader/Projects/Skeldal/DDLReader/WStringMemory.cpp b/DDLReader/Projects/Skeldal/DDLReader/WStringMemory.cpp deleted file mode 100644 index 947ed02..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/WStringMemory.cpp +++ /dev/null @@ -1,397 +0,0 @@ -// WStringMemorySingleThread.cpp: implementation of the WStringMemory class. -// -////////////////////////////////////////////////////////////////////// - -#include -#include -#include "WStringMemory.h" -#include "WStringProxy.h" -#include -#include -#include - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -#ifdef _MT //multithreading -#define WSTRING_MT -#endif - -#ifdef WSTRING_MT //multithreading - - -struct WStringMTLock -{ - WStringProxy *_lockProxy; - LONG _recursionCount; - DWORD _owner; - HANDLE _event; - WStringMTLock(WStringProxy *x):_lockProxy(x) {} - WStringMTLock():_lockProxy(NULL) {} - - bool operator==(const WStringMTLock &other) const {return _lockProxy==other._lockProxy;} - bool operator!=(const WStringMTLock &other) const {return _lockProxy!=other._lockProxy;} - bool operator>=(const WStringMTLock &other) const {return _lockProxy>=other._lockProxy;} - bool operator<=(const WStringMTLock &other) const {return _lockProxy<=other._lockProxy;} - bool operator>(const WStringMTLock &other) const {return _lockProxy>other._lockProxy;} - bool operator<(const WStringMTLock &other) const {return _lockProxy *GLockDB=NULL; //Lock proxy database - -static void exitMT() -{ - DeleteCriticalSection(&GLocker); -} - - -static void OnStartup() -{ - InitializeCriticalSection(&GLocker); - atexit(exitMT); -} - -#define ON_STARTUP_PRIORITY_NORMAL OnStartup -#include - -#endif - - - -#define WS_MAXFREELISTS 32 -#define WS_FREELISTSTEP 32 -#define WS_TOTALMAXFREEKBYTES 256 - -#define WS_MAXIMUMFASTALLOC (WS_MAXFREELISTS*WS_FREELISTSTEP) - -#define WS_MAXFREEBYTES PerSlotMaxAlloc - - -static size_t PerSlotMaxAlloc=(WS_TOTALMAXFREEKBYTES*1024/WS_MAXFREELISTS); -static WStringProxy *FreeList=NULL; -static void **StringFreeList[WS_MAXFREELISTS]; -static size_t StringFreeBytes[WS_MAXFREELISTS]; -static bool InitManager=true; - - -static void InitManagerPointers() -{ - memset(StringFreeList,0,sizeof(StringFreeList)); - memset(StringFreeBytes,0,sizeof(StringFreeBytes)); - InitManager=false; -} - -static void *AllocStringBlock(size_t sz) -{ - if (InitManager) InitManagerPointers(); - if (sz>WS_MAXIMUMFASTALLOC) return malloc(sz); - int pos=(sz+WS_FREELISTSTEP-1)/WS_FREELISTSTEP; - void **nxt=StringFreeList[pos]; - if (nxt==0) - { - printf("malloc %d\n",pos*WS_FREELISTSTEP); - return malloc(pos*WS_FREELISTSTEP); - } - printf("fast_alloc %d\n",pos*WS_FREELISTSTEP); - StringFreeList[pos]=(void **)(*nxt); - StringFreeBytes[pos]-=_msize(nxt); - return nxt; -} - -static void DeallocStringBlock(void *ptr) -{ - size_t sz=_msize(ptr); - if (sz>WS_MAXIMUMFASTALLOC) {free(ptr);return;} - int pos=(sz+WS_FREELISTSTEP-1)/WS_FREELISTSTEP; - if (sz+StringFreeBytes[pos]>WS_MAXFREEBYTES) - { - printf("free %d\n",sz); - free(ptr);return; - } - void **proxy=(void **)ptr; - *proxy=(void *)StringFreeList[pos]; - StringFreeList[pos]=proxy; - StringFreeBytes[pos]+=sz; - printf("fast_free %d\n",sz); -} - - -static inline void *operator new(size_t alloc,size_t sz) -{ - return AllocStringBlock(sz+alloc); -} - -static inline void operator delete(void *p,size_t alloc) -{ - DeallocStringBlock(p); -} - -static inline void *operator new(size_t sz,void *ptr) -{ - return ptr; -} - -static inline void operator delete(void *ptr,void *p) -{ -} - -WStringProxy * WStringMemory::AllocString(const wchar_t *text, size_t size) -{ -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - assert(size!=0 || text!=0); - if (size==0) size=wcslen(text); - WStringProxy *proxy=new((size+1)*sizeof(wchar_t)) WStringProxy(size,0,0); - wchar_t *alloctext=const_cast(proxy->GetStringFromMemBlock()); - if (text) wcsncpy(alloctext,text,size); - alloctext[size]=0; - if (proxy->_redirect==0) - { - proxy->_redirect=alloctext; - proxy->_blockData2=1; - } -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif - return proxy; -} - -WStringProxy * WStringMemory::AllocProxy(const WStringProxy &templateProxy) -{ - WStringProxy * res; -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - if (FreeList==NULL) res=new WStringProxy(templateProxy); - else - { - WStringProxy *alloc=FreeList; - FreeList=alloc->_baseString; - res=new((void *)alloc) WStringProxy(templateProxy); - } -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif - return res; -} - -void WStringMemory::FreeProxy(WStringProxy *proxy) -{ -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - if (proxy->_operation==proxy->OpMemBlck && !(proxy->_blockData2==0 && proxy->_redirect!=NULL)) - { - if (proxy->_blockData2==2) UnshareString(proxy); - DeallocStringBlock(proxy); - } - else - { - proxy->~WStringProxy(); - proxy->_baseString=FreeList; - FreeList=proxy; - } -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif -} - -#ifdef WSTRING_MT - -void WStringMemory::LockProxy( WStringProxy *proxy) -{ -nextTry: - EnterCriticalSection(&GLocker); - WStringMTLock srch(proxy),*found; - if (GLockDB==NULL) GLockDB=new BTree(16); - found=GLockDB->Find(srch); - if (found==NULL) - { - srch._event=NULL; - srch._owner=GetCurrentThreadId(); - srch._recursionCount=1; - GLockDB->Add(srch); - } - else - { - if (found->_owner!=GetCurrentThreadId()) - { - HANDLE w=found->_event; - if (w==0) {w=found->_event=CreateEvent(NULL,TRUE,FALSE,NULL);} - LeaveCriticalSection(&GLocker); //leave section - WaitForSingleObject(w,INFINITE); - goto nextTry; - } - else - { - found->_recursionCount++; - } - } - LeaveCriticalSection(&GLocker); //leave section -} - -void WStringMemory::UnlockProxy( WStringProxy *proxy) -{ - EnterCriticalSection(&GLocker); - WStringMTLock srch(proxy),*found; - found=GLockDB->Find(srch); - if (found) - { - if (--found->_recursionCount==0) - { - if (found->_event!=NULL) - { - SetEvent(found->_event); - CloseHandle(found->_event); - } - GLockDB->Remove(*found); - } - } - LeaveCriticalSection(&GLocker); -} - - -void WStringMemory::AddRefProxy(WStringProxy *proxy) -{ - InterlockedIncrement(reinterpret_cast(&proxy->_refCount)); -} - -bool WStringMemory::ReleaseRefProxy(WStringProxy *proxy) -{ - LONG res=InterlockedDecrement(reinterpret_cast(&proxy->_refCount)); - if (res<0) res=InterlockedIncrement(reinterpret_cast(&proxy->_refCount)); - return res==0; -} - -#else -void WStringMemory::LockProxy( WStringProxy *proxy) -{ - //not needed in single thread environment -} - -void WStringMemory::UnlockProxy( WStringProxy *proxy) -{ - //not needed in single thread environment -} - - -void WStringMemory::AddRefProxy(WStringProxy *proxy) -{ - //no special handling in single thread environment - ++proxy->_refCount; -} - -bool WStringMemory::ReleaseRefProxy(WStringProxy *proxy) -{ - //no special handling in single thread environment - if (proxy->_refCount) --proxy->_refCount; - return proxy->_refCount==0; -} - -#endif -void WStringMemory::FreeExtra() -{ -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - while (FreeList) - { - void *proxy=FreeList; - FreeList=FreeList->_baseString; - free(proxy); - } - for (int i=0;i_redirect,other._str->_redirect); - } - - bool operator==(const ShareDBItem& other) const {return Compare(other)==0;} - bool operator>=(const ShareDBItem& other) const {return Compare(other)>=0;} - bool operator<=(const ShareDBItem& other) const {return Compare(other)<=0;} - bool operator!=(const ShareDBItem& other) const {return Compare(other)!=0;} - bool operator>(const ShareDBItem& other) const {return Compare(other)>0;} - bool operator<(const ShareDBItem& other) const {return Compare(other)<0;} -}; - -static BTree *GDB=NULL; - -WStringProxy *WStringMemory::ShareString(WStringProxy *proxy) -{ - if (proxy->_operation!=WStringProxy::OpMemBlck || proxy->_blockData2==0 || proxy->_blockData2==2) return proxy; - -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - - if (GDB==NULL) GDB=new BTree; - - proxy->_blockData2=2; //block is subject of sharing - proxy->_redirect=proxy->GetStringFromMemBlock(); //setup pointer to string - ShareDBItem *found=GDB->Find(ShareDBItem(proxy)); - if (found) {proxy->_blockData2=1;proxy=found->_str;} - else GDB->Add(ShareDBItem(proxy)); -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif - return proxy; -} - -void WStringMemory::UnshareString(WStringProxy *proxy) -{ - if (proxy->_operation!=WStringProxy::OpMemBlck || proxy->_blockData2!=2) return; - if (GDB==NULL) return; -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - GDB->Remove(ShareDBItem(proxy)); - proxy->_blockData2=1; -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif -} \ No newline at end of file diff --git a/DDLReader/Projects/Skeldal/DDLReader/WStringMemory.h b/DDLReader/Projects/Skeldal/DDLReader/WStringMemory.h deleted file mode 100644 index a81b08e..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/WStringMemory.h +++ /dev/null @@ -1,61 +0,0 @@ -// WStringMemory.h: interface for the WStringMemory class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_WSTRINGMEMORY_H__79693029_4788_4099_9A97_92AF310A7AD5__INCLUDED_) -#define AFX_WSTRINGMEMORY_H__79693029_4788_4099_9A97_92AF310A7AD5__INCLUDED_ - -#include - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -class WStringProxy; - -class WStringMemory -{ -public: - - static WStringProxy * AllocString(const wchar_t *text, size_t size); - static WStringProxy * AllocProxy(const WStringProxy &templateProxy); - static void FreeProxy(WStringProxy *proxy); - static void LockProxy(WStringProxy *proxy); - static void UnlockProxy(WStringProxy *proxy); - - //Releases extra memory leaved for future fast allocations - static void FreeExtra(); - - //Support addref for proxy - Single- or Multi- thread support - static void AddRefProxy(WStringProxy *proxy); - - //Support addref for proxy - Single- or Multi- thread support - //returns true, when counter reached zero - static bool ReleaseRefProxy(WStringProxy *proxy); - - ///Gets statistics about memory manager - /** - @param details optional pointer to 32 size_t items. Array will be filled - with sizes of each string fastalloc group. - @return function returns total bytes allocated for string fast allocation. - (This number should be below 256KB) - */ - static size_t GetStatistics(size_t *details=NULL); - - ///Function allows sharing the strings - /** This function is called by WString::Share function - Function mark proxy shared. If string is same as shared, - it returns pointer to proxy with proxy of string that contains - the same text. - Read description of WString::Share for more informations - */ - static WStringProxy *ShareString(WStringProxy *proxy); - - ///Function disables sharing of the string - static void UnshareString(WStringProxy *proxy); - -}; - - - -#endif // !defined(AFX_WSTRINGMEMORY_H__79693029_4788_4099_9A97_92AF310A7AD5__INCLUDED_) diff --git a/DDLReader/Projects/Skeldal/DDLReader/WStringProxy.cpp b/DDLReader/Projects/Skeldal/DDLReader/WStringProxy.cpp deleted file mode 100644 index e98b577..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/WStringProxy.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// WStringProxy.cpp: implementation of the WStringProxy class. -// -////////////////////////////////////////////////////////////////////// - - -#include "WStringProxy.h" - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -/** Funkce vytvo�� transitivn� uz�v�r. -to znamen�, �e zru�� v�echny z�et�zen� redirecty. -*/ -WStringProxy *WStringProxy::TransitivniUzaver() -{ - if (_operation==OpSubstr && _offset==0 && _stringSize==_baseString->GetLength()) - { - WStringProxy *next=_baseString->TransitivniUzaver(); - if (next==NULL) return this; - next->AddRef(); - _baseString->Release(); - _baseString=next; - return next; - } - return NULL; -} - -/** Main render procedure -It creates allocates buffer proxy and renders tree into it -Then turns self into redirect proxy a redirect self into newly created string -Rerurns pointer to newly created proxy -*/ -WStringProxy *WStringProxy::RenderString() -{ - if (_operation==OpMemBlck) return this; - - WStringProxy *pp=TransitivniUzaver(); - if (pp!=NULL) return pp->_baseString->RenderString(); - - WStringProxy *newProxy=WStringMemory::AllocString(NULL,_stringSize); - wchar_t *renderPtr=const_cast(newProxy->GetStringFromMemBlock()); - - RenderStringToBuffer(renderPtr); - - newProxy->AddRef(); - this->~WStringProxy(); - _operation=OpSubstr; - _offset=0; - _baseString=newProxy; - - return newProxy; -} - -/** Function renders simple effect into buffer -Function needs buffer with nul terminated string -*/ -void WStringProxy::RenderSimpleEffect(wchar_t *renderPtr) -{ - assert(_operation==OpEffect); - switch (_effect) - { - case EfLower: wcslwr(renderPtr);break; - case EfUpper: wcsupr(renderPtr);break; - case EfReverse: wcsrev(renderPtr);break; - } - -} - -/** Light phase of rendering. Used to render string that is not -created from substring. This part is optimized for concat and user effects -When substring must be rendered, function call RenderStringToBufferSubstr to -render substring. -*/ -void WStringProxy::RenderStringToBuffer(wchar_t *renderPtr) -{ - WStringMemory::LockProxy(this); - switch (_operation) - { - case OpConcat: - _baseString->RenderStringToBuffer(renderPtr); - _secondString->RenderStringToBuffer(renderPtr+_baseString->GetLength()); - break; - case OpSubstr: - { - _baseString->RenderStringToBufferSubstr(renderPtr,_offset,GetLength()); - } - break; - case OpMemBlck: - { - const wchar_t *str=GetStringFromMemBlock(); - wcsncpy(renderPtr,str,_stringSize); - } - break; - case OpEffect: - { - uint32_t offset=0; - renderPtr[_stringSize]=0; //we can append zero, because right side of string is not yet rendered - //if this is end of string, one extra character for zero is also allocated. - //efect functions can rely on it. - if (_blockData2>=256) offset=_userEffect->PreRenderString(renderPtr,_baseString->GetLength()); //call prerender to prepare begin of buffer - _baseString->RenderStringToBuffer(renderPtr+offset); //render string to rest of buffer - if (_blockData2>=256) _userEffect->RenderString(renderPtr,_baseString->GetLength()); //apply effect to buffer - else RenderSimpleEffect(renderPtr); - } - break; - }; - WStringMemory::UnlockProxy(this); -} - -/** -Deep phase of rendering. Function can render substrings, or render substring of two -concated strings. Function can also perform partial effect on string. Function cannot -handle partial user effect, so this effects are converted to things strings. -*/ -void WStringProxy::RenderStringToBufferSubstr(wchar_t *renderPtr, size_t offset, size_t size) -{ - WStringMemory::LockProxy(this); - switch (_operation) - { - case OpConcat: - { - //process substring of concat - //count characters in buffer - size_t rendered; - //when string starts in left string - if (_baseString->GetLength()>offset) - { - //calculate total characters that may be rendered - rendered=_baseString->GetLength()-offset; - //but limit it to request size - if (rendered>size) rendered=size; - //render substring into buffer - _baseString->RenderStringToBufferSubstr(renderPtr,offset,rendered); - } - else - //no character has been rendered - rendered=0; - - //there is still characters remained to render. We will take it from second string - if (size-rendered>0) - { - if (offset>_baseString->GetLength()) offset-=_baseString->GetLength(); - else offset=0; - _secondString->RenderStringToBufferSubstr(renderPtr+rendered,offset,size-rendered); - } - } - break; - case OpSubstr: - { //rendering substrings is very easy - offset+=_offset; //add offset of substring - assert(offset+size<=GetLength()); //check length - //render substring - this->RenderStringToBufferSubstr(renderPtr,offset,size); - } - break; - case OpMemBlck: - { - //rendering from memory, final stop in recursion - //Get pointer string - const wchar_t *str=GetStringFromMemBlock(); - //copy substring from string into render buffer - wcsncpy(renderPtr,str+offset,size); - } - break; - case OpEffect: - if (_blockData2>=256) //interface cannot handle partial rendering - { - RenderString(); //convert proxy to simple redirect and render it - RenderStringToBufferSubstr(renderPtr,offset,size); //now we are able to cut out part - } - else - { - //all standard effects maps string 1:1 - //first get content of substring into buffer - _baseString->RenderStringToBufferSubstr(renderPtr,offset,size); - //we can append zero, because right side of string is not yet rendered - renderPtr[size]=0; - //process effect on target - RenderSimpleEffect(renderPtr); - } - break; - }; - WStringMemory::UnlockProxy(this); -} \ No newline at end of file diff --git a/DDLReader/Projects/Skeldal/DDLReader/WStringProxy.h b/DDLReader/Projects/Skeldal/DDLReader/WStringProxy.h deleted file mode 100644 index 0bf63ed..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/WStringProxy.h +++ /dev/null @@ -1,232 +0,0 @@ -// WStringProxy.h: interface for the WStringProxy class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_WSTRINGPROXY_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_) -#define AFX_WSTRINGPROXY_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "WStringMemory.h" -#include "IWStringEffect.h" -#include -#include -#include -#include - -/* -List of proxy types - -Memory_Proxy _operation=OpMemBlck - _blockData==0 and _blockData2==0 - or - _blockData!=0 and _blockData2!=0 - (_redirect - debug pointer) - (_blockData - 1) - -Proxy_Const _operation=OpMemBlck - _redirect - pointer to string - _blockData2=0 - -Proxy_Shared _operation=OpMemBlck - _redirect - pointer to string - _blockData2=2; - -Proxy_Immediate _operation=OpMemBlck - _blockData>0xFFFF - _blockData2>0xFFFF - both parameters are used by immediate memory manager - -Proxy_Concat _operation=OpConcat - _baseString and _secondString is valid - -Proxy_Link _operation=OpSubstr - _baseString is valid - _stringSize==_baseString->_stringSize - _offset==0; - NOTE: Can be used without rendering - -Proxy_RightSub _operation=OpSubstr - _baseString is valid - _offset<=_baseString->_stringSize - _stringSize==_baseString->_stringSize-_offset - NOTE: Can be used without rendering - -Proxy_SubString _operation=OpSubstr - _baseString is valid - _offset<=_baseString->_stringSize - _stringSize<=_baseString->_stringSize-_offset - -Proxy_Effect _operation=OpEffect - _baseString is valid - _stringSize=_baseString->_stringSize - _effect defining effect code < 0xFFFF - -Proxy_UserEffect _operation=OpEffect - _baseString is valid - _stringSize=_baseString->_stringSize - _effect>0xFFFF - _userEffect defining pointer to effect interface - -*/ -class WStringProxy -{ -public: - enum Operation - { - OpConcat=0, //proxy contains two links to concat it - OpSubstr=1, //proxy contains link to another proxy and specified substring - OpMemBlck=-2, //proxy contains informations about following string - OpEffect=-1, //proxy describing some efect with string - }; - - enum Effect - { - EfLower, //effect lower case - EfUpper, //effect upper case - EfReverse, //effect reverse string - }; -public: - - uint32_t _refCount; //reference count - uint32_t _stringSize:30; //string size in characters (maximum size 1073741823 characters ~ 2147483646 bytes) - Operation _operation:2; //operation with string or proxy type - - union - { - WStringProxy *_baseString; //pointer to next proxy referenced by this proxy - uint32_t _blockData; //user defined block data for OpMemBlock proxy type - const wchar_t *_redirect; //used for OpMemBlock, when _blockData2 is zero. - }; - - union - { - WStringProxy *_secondString; //pointer to second string for OpConcat - uint32_t _offset; //offset of substring for OpSubstr - Effect _effect; //effect selector for OpEffect - IWStringEffect *_userEffect; //user effect defined by IWStringEffect interface (valid when _effect is invalid) - uint32_t _blockData2; //user defined block data for OpMemBlock proxy type - exception: if this value is zero, member _redirect is valid - - }; - - - void RenderStringToBuffer(wchar_t *renderPtr); - void RenderStringToBufferSubstr(wchar_t *renderPtr, size_t offset, size_t size); - WStringProxy *TransitivniUzaver(); - void RenderSimpleEffect(wchar_t *renderPtr); - -public: - WStringProxy():_refCount(0),_operation(OpSubstr),_stringSize(0),_baseString(0),_secondString(0) {} //inicializes empty string proxy - - WStringProxy(WStringProxy *other): - _refCount(0), - _stringSize(other->GetLength()), - _baseString(other), - _operation(OpSubstr), - _offset(0) - {_baseString->AddRef();} - - WStringProxy(WStringProxy *other, uint32_t offset, uint32_t size): - _refCount(0), - _stringSize(size), - _baseString(other), - _operation(OpSubstr), - _offset(offset) - {_baseString->AddRef();} - - WStringProxy(WStringProxy *a, WStringProxy *b): - _refCount(0), - _stringSize(a->GetLength()+b->GetLength()), - _baseString(a), - _operation(OpConcat), - _secondString(b) - {_baseString->AddRef();_secondString->AddRef();} - - WStringProxy(WStringProxy *a, Effect effect): - _refCount(0), - _stringSize(a->GetLength()), - _baseString(a), - _operation(OpEffect), - _effect(effect) - {_baseString->AddRef();} - - WStringProxy(WStringProxy *a, IWStringEffect *userEffect): - _refCount(0), - _stringSize(a->GetLength()+userEffect->GetEffectExtraSize(a->GetLength())), - _baseString(a), - _operation(OpEffect), - _userEffect(userEffect) - {_baseString->AddRef();} - - WStringProxy(uint32_t size, uint32_t user1, uint32_t user2): - _refCount(0), - _stringSize(size), - _operation(OpMemBlck), - _blockData(user1), - _blockData2(user2) - {} - - WStringProxy(const wchar_t *imText): - _refCount(0), - _stringSize(wcslen(imText)), - _redirect(imText), - _blockData2(0), - _operation(OpMemBlck) - {} - - WStringProxy(const WStringProxy &other) - { - memcpy(this,&other,sizeof(*this)); - if (_operation!=OpMemBlck) _baseString->AddRef(); - if (_operation==OpConcat) _secondString->AddRef(); - } - - WStringProxy& operator=(const WStringProxy &other) - { - WStringProxy::~WStringProxy(); //call destructor to destruct current proxy - memcpy(this,&other,sizeof(*this)); //construct new proxy from template - if (_operation!=OpMemBlck) _baseString->AddRef(); - if (_operation==OpConcat) _secondString->AddRef(); - } - - WStringProxy *RenderString(); - - ~WStringProxy() - { - if (_operation!=OpMemBlck) _baseString->Release(); - if (_operation==OpConcat) _secondString->Release(); - } - - - uint32_t GetLength() {return _stringSize;} - void AddRef() {if (this) WStringMemory::AddRefProxy(this);} - void Release() {if (this) if (WStringMemory::ReleaseRefProxy(this)) WStringMemory::FreeProxy(this);} - - const wchar_t *GetString() - { - if (_operation==OpMemBlck) return (const wchar_t *)(this+1); - WStringProxy *p=RenderString(); - (*this)=*p; - return (const wchar_t *)(p+1); - } - - const wchar_t *GetStringFromMemBlock() - { - assert(_operation==OpMemBlck); - if (_blockData2==0 && _redirect!=NULL) return _redirect; - else return (const wchar_t *)(this+1); - } - - bool IsShared() {return _refCount>1;} - - void RecalcLength() - { - const wchar_t *str=GetStringFromMemBlock(); - _stringSize=wcslen(str); - } - -}; - -#endif // !defined(AFX_WSTRINGPROXY_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_) diff --git a/DDLReader/Projects/Skeldal/DDLReader/res/DDLReader.ico b/DDLReader/Projects/Skeldal/DDLReader/res/DDLReader.ico deleted file mode 100644 index 7eef0bcbe6580a6f464d688906172c2d9de44262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmc&zF>b>!3}jLb9s)T}@Kod(893@u8ajANzT`op9^o+)S?=nU(FD@%0s)Sg^oyC8{H z9myetc;MEP)59v(LMa~xK8Yu^jIR*H22uCFiq5%C{s7(PJi>o15i^bmX4(vPxWAio z9ryY#AU_jfnd047-@`)XzL?%iS$gQyFP{44kS9X)fN{{QoL~hO-&=q&20Zr*cxFAt PkaNE{wR~2C$NfnjhSXWT diff --git a/DDLReader/Projects/Skeldal/DDLReader/resource.h b/DDLReader/Projects/Skeldal/DDLReader/resource.h deleted file mode 100644 index 2625141..0000000 --- a/DDLReader/Projects/Skeldal/DDLReader/resource.h +++ /dev/null @@ -1,49 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by DDLReader.rc -// -#define IDM_ABOUTBOX 0x0010 -#define IDD_ABOUTBOX 100 -#define IDS_ABOUTBOX 101 -#define IDD_DDLREADER_DIALOG 102 -#define IDS_FILEOPENFAILED 102 -#define IDC_HEADGROUP 103 -#define IDC_HEADFNAME 104 -#define IDC_HEADSIZE 105 -#define IDC_HEADOFFSET 106 -#define IDS_DDLFILTER 107 -#define IDC_GROUP_GRAPHICS 108 -#define IDC_GROUP_SOUNDS 109 -#define IDC_GROUP_FONTS 110 -#define IDC_GROUP_BASIC 111 -#define IDC_GROUP_ITEMS 112 -#define IDC_GROUP_MONSTERS 113 -#define IDC_GROUP_DIALOGS 114 -#define IDC_GROUP_UNSPECIFIED 115 -#define IDC_GROUP_UNKNOWN 116 -#define IDS_UNABLETOCREATEFILE 117 -#define IDS_UNABLETOEXTACTDATA 118 -#define IDR_MAINFRAME 128 -#define IDD_PROGRESS 129 -#define IDD_EXPORTING 129 -#define IDC_FILELIST 1001 -#define IDC_FOLDER 1002 -#define IDC_BROWSE 1003 -#define IDC_EXPORT 1004 -#define IDC_POPISEK 1005 -#define IDC_DDLFILE 1006 -#define IDC_DDLBROWSE 1007 -#define IDC_PROGRESS 1008 -#define IDC_NAME 1009 -#define IDC_BUTTON1 1010 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 130 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1011 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/DDLReader/StdAfx.cpp b/DDLReader/StdAfx.cpp deleted file mode 100644 index 1a90873..0000000 --- a/DDLReader/StdAfx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// DDLReader.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - - - diff --git a/DDLReader/StdAfx.h b/DDLReader/StdAfx.h deleted file mode 100644 index 666c5f5..0000000 --- a/DDLReader/StdAfx.h +++ /dev/null @@ -1,27 +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__C5BDACC6_729E_4CA2_B27E_A1F209FB32A7__INCLUDED_) -#define AFX_STDAFX_H__C5BDACC6_729E_4CA2_B27E_A1F209FB32A7__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -#include // MFC core and standard components -#include // MFC extensions -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - -#include "wstring.h" - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__C5BDACC6_729E_4CA2_B27E_A1F209FB32A7__INCLUDED_) diff --git a/DDLReader/WPathname.cpp b/DDLReader/WPathname.cpp deleted file mode 100644 index fab2f57..0000000 --- a/DDLReader/WPathname.cpp +++ /dev/null @@ -1,408 +0,0 @@ -// WPathname.cpp: implementation of the WPathname class. -// -////////////////////////////////////////////////////////////////////// - -#include "WPathname.h" -#include -#include - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -WPathname::WPathname(const wchar_t *name /*=NULL*/) -{ - if (name) SetPathname(name); -} - -WPathname::WPathname(const WString &name) -{ - SetPathname(name); -} - -WPathname::WPathname(const wchar_t *relpath, const WPathname &abspath) -{ - _fullpath=WString(relpath); - int chr=_fullpath.FindLast('\\'); - if (chr!=-1) - { - _path=_fullpath.Left(chr+1); - _filetitle=_fullpath.Right(chr+1); - } - else - { - _filetitle=_fullpath; - } - chr=_filetitle.FindLast('.'); - if (chr!=-1) - { - _extension=_filetitle.Right(chr); - _filetitle=_filetitle.Left(chr); - } - - RelativeToFull(abspath); -} - - -WPathname::WPathname(const WPathname &other) -{ - _fullpath=other._fullpath; - _path=other._path; - _filetitle=other._filetitle; - _extension=other._extension; -} - -void WPathname::SetDrive(wchar_t dr) -{ - if (HasDrive()) - { - if (dr==0) _path=_path.Right(2); - else _path[0]=dr; - } - else if (dr!=0) - { - int np=IsNetworkPath(); - wchar_t buff[2]; - buff[0]=dr; - buff[1]=':'; - buff[2]=0; - if (np) - _path=WString(buff)+_path.Right(np); - else - _path=WString(buff)+_path; - - } - RebuildPath(); -} - -void WPathname::SetDirectory(const wchar_t *dir) -{ - bool copydrv; //directory doesn't contain drive, need copy from original - bool addslash; //directory doesn't ending by backslash, need add it - - int len=wcslen(dir); - copydrv=HasDrive(dir) || !HasDrive(); //copy original drive, if exists and directory doesn't contaion drive - if (wcsncmp(dir,L"\\\\",2)==0) copydrv=true; //network path, don't copy drive - addslash=len && dir[len-1]!='\\'; //add slash - if (copydrv) - _path=WString(dir); - else - _path=_path.Left(2)+WString(dir); - if (addslash) - _path+=WSC("\\"); - - RebuildPath(); -} - -void WPathname::SetFilename(const wchar_t *filename) -{ - WString wfilename=WString(filename); - int dot=wfilename.FindLast('.'); - if (dot==-1) - { - _filetitle=wfilename; - _extension=0; - } - else - { - _filetitle=wfilename.Left(dot); - _extension=wfilename.Right(dot); - } - - RebuildPath(); -} - -void WPathname::SetExtension(const wchar_t *ext) -{ - _extension=WString(ext); - RebuildPath(); -} - -void WPathname::SetFileTitle(const wchar_t *title) -{ - _filetitle=WString(title); - RebuildPath(); -} - -void WPathname::SetPathname(const wchar_t *pathname) -{ - SetPathname(WString(pathname)); -} - -void WPathname::SetPathname(const WString &pathname) -{ - if (pathname.GetLength()==0) SetNull(); - else - { - wchar_t *part; - DWORD needsz=GetFullPathNameW(pathname,0,NULL,&part); - wchar_t *fpth=(wchar_t *)alloca(needsz*sizeof(*fpth)); - GetFullPathNameW(pathname,needsz,fpth,&part); - part=wcsrchr(fpth,'\\'); - if (part) part++;else part=NULL; - if (part) - { - SetFilename(part); - *part=0; - } - else - SetFilename(WString()); - SetDirectory(fpth); - } -} - -const wchar_t *WPathname::GetNameFromPath(const wchar_t *path) -{ - const wchar_t *c=wcsrchr(path,'\\'); - if (c!=NULL) c++;else return path; - return c; -} - -const wchar_t *WPathname::GetExtensionFromPath(const wchar_t *path) -{ - const wchar_t *fname=GetNameFromPath(path); - const wchar_t *c=wcsrchr(fname,'.'); - if (c==NULL) c=wcsrchr(path,0); - return c; -} - -void WPathname::RebuildPath() -{ - _fullpath=_path+_filetitle+_extension; -} - -bool WPathname::GetDirectoryWithDriveWLBS(wchar_t *buff, size_t size) const -{ - size_t psize=wcslen(GetDirectoryWithDrive()); - if (psize>size) return false; - if (psize==0) {buff[0]=0;return true;} - wcsncpy(buff,GetDirectoryWithDrive(),psize-1); - buff[psize-1]=0; - return true; -} - -WString WPathname::GetDirectoryWithDriveWLBS() const -{ - if (_path.GetLength()) return _path.Left(_path.GetLength()-1); - return WString(); -} - -bool WPathname::IsPathValid() const -{ - if (IsNull()) return false; - wchar_t *invalidChars=L"/*?\"<>|"; - const wchar_t *path=GetFullPath(); - if (*path==0) return false; - while (*path) - { - if (wcschr(invalidChars,*path)!=NULL) return false; - path++; - } - return true; -} - -bool WPathname::SetTempDirectory() -{ - wchar_t buff[1]; - DWORD size=GetTempPathW(1,buff); - if (size==0) return false; - WString pth; - wchar_t *p=pth.CreateBuffer(size); - if (GetTempPathW(size,p)==0) return false; - pth.UnlockBuffer(); - _path=pth; - return true; -} - -bool WPathname::SetDirectorySpecial(int nSpecCode) -{ - wchar_t buff[MAX_PATH]; - if (SHGetSpecialFolderPathW(GetForegroundWindow(),buff,nSpecCode,FALSE)!=NOERROR) return false; - SetDirectory(buff); - return true; -} - -bool WPathname::SetTempFile(const wchar_t *prefix, unsigned int unique) -{ - wchar_t tempname[MAX_PATH]; - if (GetTempFileNameW(GetDirectoryWithDrive(),prefix,unique,tempname)==0) return false; - this->SetPathname(tempname); - return true; -} - -WPathname WPathname::GetExePath() -{ - wchar_t buff[MAX_PATH*4]; - GetModuleFileNameW(NULL,buff,sizeof(buff)); - return WPathname(buff); -} - -const wchar_t *WPathname::FullToRelativeProjectRoot(const wchar_t *full, const wchar_t *projectRoot) -{ - const wchar_t *a=full,*b=projectRoot; - while (*a && towlower(*a)==towlower(*b)) {a++;b++;}; - if (*b) return full; - return a; -} - -bool WPathname::FullToRelative(const WPathname &relativeto) -{ - if (relativeto.IsNull() || IsNull()) return false; - bool h1=HasDrive(); - bool h2=relativeto.HasDrive(); - if (h1!=h2) return false; //rozdilny zpusob adresace - nelze vytvorit relatvni cestu - if (h1==true && h2==true && towupper(GetDrive())!=towupper(relativeto.GetDrive())) - return false; //ruzne disky, nelze vytvorit relativni cestu - if (wcsncmp(_path,L"\\\\",2)==0) //sitova cesta - { - int slsh=0; //citac lomitek - const wchar_t *a=_path; - const wchar_t *b=relativeto._path; - while (towupper(*a)==towupper(*b) && *a && slsh<3) //zacatek sitove cesty musi byt stejny - { - if (*a=='\\') slsh++; - a++;b++; - } - if (slsh!=3) return false; //pokud neni stejny, nelze vytvorit relativni cestu - } - int sublevel=0; - const wchar_t *ps1=_path; - const wchar_t *ps2=relativeto._path; - if (h1) {ps1+=2;ps2+=2;} - const wchar_t *sls=ps2; - while (towupper(*ps1)==towupper(*ps2) && *ps1) - { - if (*ps2=='\\') sls=ps2+1; - ps1++;ps2++; - } - ps1-=ps2-sls; - if (sls) - { - while (sls=wcschr(sls,'\\')) - { - sls++; - sublevel++; - } - } - wchar_t *buff=(wchar_t *)alloca((sublevel*3+wcslen(ps1)+1)*sizeof(*buff)); - wchar_t *pos=buff; - for (int i=0;iref._path.GetString()) - { - end--; - while (end>ref._path.GetString() && end[-1]!='\\') end--; - } - beg+=3; - } - else - beg+=2; - } - int partln=end-ref._path; - wchar_t *buff=(wchar_t *)alloca((partln+wcslen(beg)+1)*sizeof(*buff)); - wcsncpy(buff,ref._path,partln); - wcscpy(buff+partln,beg); - SetDrive(0); - SetDirectory(buff); - return true; -} - -int WPathname::IsNetworkPath() const -{ - if (wcsncmp(_path,L"\\\\",2)==0) //sitova cesta - { - const wchar_t *p=_path+2; - const wchar_t *c=wcschr(p,'\\'); - if (c) return c-_path; - } - return 0; -} - -void WPathname::SetServerName(const wchar_t *server) -{ - if (HasDrive()) SetDrive(0); - else - { - int np=IsNetworkPath(); - _path=_path.Right(np); - } - - _path=WSC("\\\\")+WString(server)+WSC("\\"); - RebuildPath(); -} - -void WPathname::SetNull() -{ - _fullpath=_path=_filetitle=_extension=0; -} - -bool WPathname::GetPartFromPath(const wchar_t *path, int partnum, wchar_t *buff, int bufsize, int mode) -{ - const wchar_t *scan=path; - while (*scan=='\\') scan++; - while (partnum && *scan) - { - while (*scan!='\\' && *scan) scan++; - while (*scan=='\\') scan++; - partnum--; - } - if (*scan==0) - { - buff[0]=0; - return false; - } - int pt=0; - if (mode==-1) - { - pt=scan-path; - if (pt>bufsize) - { - buff[0]=0; - return true; - } - else - memcpy(buff,path,pt); - } - bool nlast=false; - while (*scan && (mode==1 || !nlast) && pt 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "WString.h" - -#ifndef ASSERT -#ifdef _DEBUG -#define ASSERT(x) assert(x) -#else -#define ASSERT(x) -#endif -#endif - -#define WPathnameCompare(op) bool operator op (const WPathname &other) const \ -{if (IsNull() || other.IsNull()) return false;else return wcsicmp(_fullpath,other._fullpath) op 0;}\ - bool operator op (const wchar_t *other) const \ -{ASSERT(!other || other[0]!=0);\ - if (IsNull() || other==NULL) return false;else return wcsicmp(_fullpath,other) op 0;} - -/** class WPathname simplifying manipulation with WPathnames, filenames, general paths, and -also supports convert from absolute path to relative respectively */ - - - -class WPathname -{ - ///object value and data - /**The implementation of WPathname creates only one buffer for all variables. It can - increase speed by effective memory use. Strings are stored one after another separated - by zero byte. Evry time any string changed, implementation recalculate buffer usage, and - decide, whether it should resize buffer or not. - - _fullpath also points to string contain full path with filename, - it is dominant value of the class - */ - WString _fullpath; - WString _path; /// - If name is provided, WPathname will expand it into full name with drive and folder name. - @param name optional argument to inicialize object - */ - WPathname(const wchar_t *name=NULL); - WPathname(const WString &name); - - ///Construct WPathname class - /** - @param relpath Relative path or uncomplette path or single filename with extension. - WPathname will expand this WPathname into full using absolute path provided by the second - argument. - @param abspath Absolute path used as reference to folder - the origin of relative path - provided in the first argument. - */ - WPathname(const wchar_t *relpath, const WPathname &abspath); - - ///Construct WPathname as copy of another WPathname - WPathname(const WPathname &other); - - - ///Function returns the current drive letter. - /** Before usage, ensure, that current WPathname contain drive. - In network path drive letter is missing. - In this case, result is undefined. To ensure, use HasDrive function - @return the drive letter of current path. - */ - wchar_t GetDrive() const - { - if (IsNull()) return 0; - return _path[0]; - } - - ///Static function determines, if argument contain a drive information. - /** - @param dir directory to inspect - @return true, if directory contain drive.

- This function is independed, it don't need any WPathname variable declared. - */ - static bool HasDrive(const wchar_t *dir) - {return (dir[0]>='A' && dir[0]<='Z' || dir[0]>='a' && dir[0]<='z') && dir[1]==':';} - - ///Function determines, if current WPathname contain a drive information - /** - @return true, if current WPathname contain a drive information - */ - bool HasDrive() const - { - if (IsNull()) return false; - return HasDrive(_path); - } - - - ///Function returns current folder name - /** - if current folder name contain drive, only folder name is returned (without drive). - In other cases (relative or network drives) returns full path. - @return folder name or full path. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const wchar_t *GetDirectory() const - { - if (HasDrive()) return _path.GetString()+3; - else return _path.GetString()+IsNetworkPath(); - } - - const wchar_t *GetDirectoryWithDrive() const - { - return _path; - } - - ///Function returns current filename with extension - /** - @return current filename with extension. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const wchar_t *GetFilename() const - { - if (IsNull()) return NULL; - const wchar_t *blk=wcsrchr(_fullpath,'\\'); - if (blk) blk=blk+1;else blk=_fullpath; - return blk; - } - - ///Function returns current extension (with starting dot) - /** - @return current extension. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const wchar_t *GetExtension() const - {return _extension;} - - ///Function returns current filename without extension (without dot) - /** - @return current filename without extension (without dot). Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - const wchar_t *GetTitle() const - {return _filetitle;} - - ///Function changes current drive. - /**If object contain WPathname with drive, then current drive is changed and function returns. - If object contain network path, then computer name is changed to the drive name. - If object contain relative path, then whole path is replaced by path on root on drive. - @param dr new drive letter. This parameter can be set to zero. It means, that current - driver is deleted, and path is converted to relative path from root. Note: Zero c - cannot be used with network paths and relative paths, and finnaly has no effect to the object - */ - - void SetDrive(wchar_t dr); - - ///Sets new directory for object - /** if object contain a drive letter and argument dir doesn't, then current drive is remain - and only directory part is replaced. If current path is network path or relative path, - then whole path is replaced by new one. - If argument dir contain drive letter, then whole path is replaced too. - @param dir contain new WPathname. Backslash should be the last wchar_tacter in string - */ - void SetDirectory(const wchar_t *dir); - - ///Sets new filename for object. - /** - If filename contain dot, function assumes, that filename is provided with extension. - Otherwise, current extension remains untouched. - @param filename new filename for object - */ - - void SetFilename(const wchar_t *filename); - - ///Sets new extension for object. - /** - If ext doesn't starting with dot, function adds it. - @param ext new extension for object - */ - void SetExtension(const wchar_t *ext); - - ///Sets new file title - /** Function changes file title, extension remains untouched. - if title contains extension (dot inside its name), this extension doesn't change - current extension. For example, if current extension is ".cpp" and filetitle contain - "source.h", then result is "source.h.cpp" - @param title a new title for object. - */ - - void SetFileTitle(const wchar_t *title); - - ///Function returns full WPathname. - /** - @return current WPathname. Pointer is valid until any first change in object. - Do not invoke release function at pointer! - */ - - const wchar_t *GetFullPath() const - {return _fullpath;} - - ///Sets WPathname - /** Function has same effect as constructor. But it can be used - anytime during object lifetime. It simply replaces current WPathname with newer. WPathname - in argument is expanded to full WPathname, current directory is used as reference. - @param WPathname new WPathname - */ - void SetPathname(const wchar_t *pathname); - void SetPathname(const WString &pathname); - - WPathname& operator=(const wchar_t *other) - {SetPathname(other);return *this;} - - WPathname& operator=(const WString &other) - {SetPathname(other);return *this;} - - WPathname& operator=(const WPathname& other) - { - _fullpath=other._fullpath; - _path=other._path; - _filetitle=other._filetitle; - _extension=other._extension; - return *this; - } - - ///converts object to string - operator const wchar_t *() const - {return GetFullPath();} - - ///Static function to help getting filename from WPathname - /** Function finds last backslash / and return pointer to first wchar_tacter after it. - Pointer stays valid until original path is destroyed or until original path is changed - @param path WPathname to inspect as string - @return pointer to filename - */ - static const wchar_t *GetNameFromPath(const wchar_t *path); - - ///Static function to help getting extension from WPathname - /** Function finds last dot '.' in filename return pointer to it (extension with dot). - Pointer stays valid until original path is destroyed or until original path is changed - @param path WPathname to inspect as string - @return pointer to extension - */ - static const wchar_t *GetExtensionFromPath(const wchar_t *path); - - ///Function sets server name for network path - /** If current path is network path, then changes server name to newer. Otherwise - it remove drive letter, and insert server name before remain path - @param server server name without slashes - */ - void SetServerName(const wchar_t *server); - - ///Function inspects current path and returns, whether contain server name - /**@return zero, if current path is not valid network path. Nonzero if path contain - server name. Then value returned count wchar_tacters containing server name with precedent - slashes. - */ - int IsNetworkPath() const; - - ///Function converts current relative path into absolute path - /** - If current path is not relative, function do nothing. - @param ref reference to path, against which path is relative. - @return true if path has been converted, or false, if conversion is impossible - */ - bool RelativeToFull(const WPathname &ref); - - ///Function converts current absolute path into relative path - /** - If current path is not relative, function do nothing. Both paths must be on the same - drive or network computer. - - @param ref reference to path, against which path should be relative. - @return true if path has been converted, or false, if conversion is impossible - */ - bool FullToRelative(const WPathname &relativeto); - - WPathname& operator+=(const wchar_t *relativePath) - {*this=WPathname(relativePath,*this);return *this;} - - WPathname operator+(const wchar_t *relativePath) - {WPathname out(relativePath,*this);return out;} - - bool IsNull() const {return _fullpath.GetLength()==0;} - - void SetNull(); - - WPathnameCompare(<) - WPathnameCompare(>) - WPathnameCompare(==) - WPathnameCompare(>=) - WPathnameCompare(<=) - WPathnameCompare(!=) - - - ///Function gets part of WPathname - /** - @param path subject of examine - @param partnum zero-base index of part of WPathname. Index 0 mostly contain drive or server, in case of - relative path, there is the name of the first folder or dots. - @param buff buffer for store result - @param bufsize count wchar_tacters in buffer; - @param mode mode=0, gets only name of part. - mode=1, get current part and remain parts of path. - mode=-1, gets all parts till current - @return Function returns true, if it was succesful, and it was not last part. Function returns - false, if it was succesful, and it was last part. Function returns false and sets buffer empty, - if an error occured. Function returns true and sets buffer empty, if buffer is too small to hold data - */ - static bool GetPartFromPath(const wchar_t *path, int partnum, wchar_t *buff, int bufsize, int mode=0); - - ///Function gets part of object - /** - @param partnum zero-base index of part of WPathname. Index 0 mostly contain drive or server, in case of - relative path, there is the name of the first folder or dots. - @param buff buffer for store result - @param bufsize count wchar_tacters in buffer; - @param mode mode=0, gets only name of part. - mode=1, get current part and remain parts of path. - mode=-1, gets all parts till current - @return Function returns true, if it was succesful, and it was not last part. Function returns - false, if it was succesful, and it was last part. Function returns false and sets buffer empty, - if an error occured. Function returns true and sets buffer empty, if buffer is too small to hold data - */ - bool GetPart(int partnum, wchar_t *buff, int bufsize,int mode=0) const - { - return GetPartFromPath(this->_fullpath,partnum,buff,bufsize,mode); - } - - /// Get Directory With Drive Without Last Back Slash - /** Retrieves into buffer directory with drive and removes last backslash - @param buff buffer that retrieves path - @param size size of buffer - @return true, if success, failed if buffer is too small*/ - - - bool GetDirectoryWithDriveWLBS(wchar_t *buff, size_t size) const; - - WString GetDirectoryWithDriveWLBS() const; - - - /// function checks, if path is valid and returns true, if does. - bool IsPathValid() const; - - /// Sets special directory. - /** - @param bSpecCode this value may be operation-system - depend. Windows implementation using CSIDL_XXXX constants, which is described in SHGetSpecialFolderLocation function - description - @return true, if function were successful - */ - bool SetDirectorySpecial(int nSpecCode); - - ///Sets temporaly directory. - bool SetTempDirectory(); - - ///Guess temporaly file name - /** - @param prefix prefix string for name - @param unique if unique is non-zero, it is used for new temporaly file. If unique is zero, function guess own unique - value. - @return true if function were successful - */ - bool SetTempFile(const wchar_t *prefix=L"tmp", unsigned int unique=NULL); - - ///Returns path of current executable. - /**It useful, when accessing folder, from when current module has been executed */ - static WPathname GetExePath(); - - ///Solves most used conversion from fullpath to path relative to project root - /** - @param full full WPathname with drive - @param projectRoot project root path - @return function returns pointer to full path, where starts relative part. If - fullpath doesn't contain project root path, it returns pointer to full. - @example FullToProjectRoot("x:\\project\\data\\example.txt","x:\\project"); //result is "data\\example.txt" - */ - - static const wchar_t *FullToRelativeProjectRoot(const wchar_t *full, const wchar_t *projectRoot); - - -protected: - ///Function only rebuild _fullpath string. - /** It doesn't check space for string! This function is used, when length of path is excepted - the same or smaller, then current. - */ - void RebuildPath(); - - -}; - - - -#endif // !defined(AFX_WPathname_H__158F59D5_B422_4FA6_86AC_10B5EC48C81B__INCLUDED_) diff --git a/DDLReader/WString.cpp b/DDLReader/WString.cpp deleted file mode 100644 index ea60b4e..0000000 --- a/DDLReader/WString.cpp +++ /dev/null @@ -1,194 +0,0 @@ -// WString.cpp: implementation of the WString class. -// -////////////////////////////////////////////////////////////////////// - -#include "WString.h" -#include -#include - - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -WString::WString(const char *sbstring, unsigned int codePage) -{ - if (sbstring==NULL || *sbstring==0) - { - _ref=NULL; - } - else - { - size_t reqBuff=MultiByteToWideChar(codePage,0,sbstring,-1,NULL,0); - - _ref=WStringMemory::AllocString(NULL,reqBuff); - _ref->AddRef(); - wchar_t *str=const_cast(_ref->GetStringFromMemBlock()); - - MultiByteToWideChar(codePage,0,sbstring,-1,str,reqBuff); - } -} - -int WString::FormatV(wchar_t *format, va_list lst) -{ - size_t curSize=4096; - int written; - do - { - _ref=WStringMemory::AllocString(NULL,curSize); - wchar_t *str=const_cast(_ref->GetStringFromMemBlock()); - written=_vsnwprintf(str,curSize,format,lst); - if (written<0) - { - curSize*=2; - WStringMemory::FreeProxy(_ref); - } - } - while (written<-1); - _ref->RecalcLength(); - _ref->AddRef(); - return written; -} - -int WString::Format(wchar_t *format, ...) -{ - va_list valst; - va_start(valst,format); - return FormatV(format,valst); -} - - -int WString::ScanStringV(const wchar_t *format, va_list lst) const -{ - uint32_t *ptr=(uint32_t *)lst; - return swscanf(GetString(),format,ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5],ptr[6],ptr[7],ptr[8],ptr[9], - ptr[10],ptr[11],ptr[12],ptr[13],ptr[14],ptr[15],ptr[16],ptr[17],ptr[18],ptr[19]); - -} - -int WString::ScanString(const wchar_t *format, ...) const -{ - va_list valst; - va_start(valst,format); - return ScanStringV(format,valst); -} - -bool WString::ReplaceOnce(const WString &findWhat,const WString &replaceWith) -{ - int pos=Find(findWhat); - if (pos==-1) return false; - (*this)=Left(pos)+replaceWith+Right(pos+replaceWith.GetLength()); - return true; -} - -bool WString::ReplaceAll(const WString &findWhat,const WString &replaceWith) -{ - WString process=*this; - WString result; - int pos; - bool processed=false; - while ((pos=process.Find(findWhat))!=-1) - { - result=result+process.Left(pos)+replaceWith; - process=process.Right(pos+findWhat.GetLength()); - processed=true; - } - *this=result+process; - return processed; -} - -WString WString::TrimLeft() const -{ - return TrimLeft(L" \r\n\t"); -} - -WString WString::TrimRight() const -{ - return TrimRight(L" \r\n\t"); -} - -WString WString::TrimLeft(wchar_t *trimChars) const -{ - const wchar_t *proStr=GetString(); - int p=0; - while (proStr[p] && wcschr(trimChars,proStr[p]!=NULL)) p++; - return Right(p); -} - -WString WString::TrimRight(wchar_t *trimChars) const -{ - const wchar_t *proStr=GetString(); - int p=GetLength()-1; - while (p>=0 && wcschr(trimChars,proStr[p]!=NULL)) p--; - return Left(p+1); -} - -WString WString::Upper() const -{ - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,WStringProxy::EfUpper))); -} - -WString WString::Lower() const -{ - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,WStringProxy::EfLower))); -} - -WString WString::Reverse() const -{ - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,WStringProxy::EfReverse))); -} - -WString WString::Effect(IWStringEffect *effect) const -{ - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,effect))); -} - -void WString::SetUTF7(const char *utf7) -{ - *this=WString(utf7,CP_UTF7); -} - -void WString::SetUTF8(const char *utf8) -{ - *this=WString(utf8,CP_UTF8); -} - -const char *WString::AsSBString(unsigned int codePage, WString &holder) -{ - const wchar_t *str=GetString(); - if (str[0]==0) return ""; - size_t reqsize=WideCharToMultiByte(codePage,0,str,-1,NULL,0,NULL,NULL); - WStringProxy *holderProxy=WStringMemory::AllocString(NULL,reqsize/2); //reqsize/2+(2 bytes) - char *mbstr=reinterpret_cast(const_cast(holderProxy->GetStringFromMemBlock())); - WideCharToMultiByte(codePage,0,str,-1,mbstr,reqsize,NULL,NULL); - holder=WString(holderProxy); - return mbstr; -} - -const char *WString::AsUTF7(WString &holder) -{ - return AsSBString(CP_UTF7,holder); -} - -const char *WString::AsUTF8(WString &holder) -{ - return AsSBString(CP_UTF8,holder); -} - -void WString::ReadFromStream(size_t (*streamReader)(wchar_t *buffer, size_t bufferLen, void *context),void *context) -{ - _ref->Release(); - _ref=NULL; - wchar_t buff[256]; - size_t rd; - while ((rd=streamReader(buff,sizeof(buff)/sizeof(wchar_t),context))!=0) - { - *this=*this+WString(buff,rd); - } -} - -const WString WStringConst(const wchar_t *text) -{ - return WString(WStringMemory::AllocProxy(WStringProxy(text))); -} - diff --git a/DDLReader/WString.h b/DDLReader/WString.h deleted file mode 100644 index a244adb..0000000 --- a/DDLReader/WString.h +++ /dev/null @@ -1,496 +0,0 @@ -// WString.h: interface for the WString class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_WSTRING_H__481164FB_3BB7_4824_B0E3_8B371F0AAF3A__INCLUDED_) -#define AFX_WSTRING_H__481164FB_3BB7_4824_B0E3_8B371F0AAF3A__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "WStringProxy.h" -#include - -class WString -{ - mutable WStringProxy *_ref; - - - -public: - ///constructs empty string - WString():_ref(0) {} - - ///constructs string. - explicit WString(const wchar_t *string):_ref(string==NULL?NULL:WStringMemory::AllocString(string,0)) {_ref->AddRef();}; - - ///constructs string from wide-char array with specified length - WString(const wchar_t *string, size_t sz):_ref(WStringMemory::AllocString(string,sz)) {_ref->AddRef();}; - - ///copy constructor - /**constructor doesn't copy the string, only reference. - String is shared until it is changed - */ - WString(const WString &other):_ref(other._ref) {_ref->AddRef();} - - ///constructs string from multi-byte string. codePage specified code page of string - WString(const char *sbstring, unsigned int codePage); - - ///constructs string from string-proxy. Used internally with WStringMemory::AllocXXX functions - WString(WStringProxy *proxy):_ref(proxy) {_ref->AddRef();} - - ///assignment operator - /** assignment operator doesn't copy the string only reference. - String is shared until it is changed */ - WString &operator=(const WString &other) - {other._ref->AddRef();_ref->Release();_ref=other._ref;return *this;} - - ///Destructor - releases reference - ~WString() {_ref->Release();} - - ///function converts instance of WString to wchar_t pointer - /** - Function will perform RenderString, if it is needed. - */ - const wchar_t *GetString() const - { - if (_ref==NULL) return L""; - WStringProxy *str=_ref->RenderString(); - if (_ref!=str) - { - str->AddRef();_ref->Release();_ref=str; - } - return _ref->GetStringFromMemBlock(); - } - - ///operator can convert WString to wchar_t pointer anytime - operator const wchar_t *() const {return GetString();} - - ///function returns count of characters in string - /** function doesn't need to render string, so it can be called anytime - without loosing the benefit of "pseudo-strings" boosting */ - size_t GetLength() const - { - if (_ref) return _ref->GetLength(); - else return 0; - } - - ///function creates string as sum of this and another string - /** function creates "pseudo-string" that represents sum of two string. - pseudo-string is rendered to "real-string" automatically, when it is needed */ - WString operator+(const WString other) const - { - if (_ref==NULL) return other; - if (other._ref==NULL) return *this; - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,other._ref))); - } - - WString &operator+=(const WString other) - { - *this=*this+other; - return *this; - } - - ///function creates string as substring of another string - /** function creates "pseudo-string" that represents substring of anothers string. - Pseudo-string is rendered to "real-string" automatically, when it is needed */ - WString Mid(size_t begin, size_t len) const - { - if (begin==0) return Left(len); - if (_ref==NULL || begin>GetLength()) return WString(); - if (begin+len>GetLength()) return Right(begin); - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,begin,len))); - } - - WString Left(size_t len) const - { - if (_ref==NULL) return WString(); - if (len>=GetLength()) return *this; - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,0,len))); - } - - WString Right(size_t begin) const - { - if (_ref==NULL || begin>GetLength()) return WString(); - if (begin==0) return *this; - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,begin,GetLength()-begin))); - } - - WString RightR(size_t count) const - { - if (_ref==NULL || count==0) return WString(); - if (count>=GetLength()) return *this; - return WString(WStringMemory::AllocProxy(WStringProxy(_ref,GetLength()-count,count))); - } - - WString Delete(size_t begin, size_t count) const - { - if (_ref==NULL) return WString(); - if (begin==0) return Right(count); - if (begin+count>=GetLength()) return Left(begin); - return WString(WStringMemory::AllocProxy(WStringProxy(Left(begin)._ref,Right(begin+count)._ref))); - } - - WString Insert(const WString &what, size_t index) const - { - if (_ref==NULL) return what; - if (index==0) return what+*this; - if (index>=GetLength()) return *this+what; - return Left(index)+what+Right(index); - } - - /// function allows to access any char in string - wchar_t operator[](int index) const - { - assert(index<=(int)GetLength() && index>=0); - return GetString()[index]; - } - - /// functions allows lock string for accesing it directly. - /** Function returns pointer to buffer which holds string. - Buffer size is equal to string length plus terminating zero. - Application can modify content of buffer. - If string is shared with another WString object, LockBuffer - creates copy of string - Do not forger to call UnlockBuffer, when you finish modifiing the content - */ - wchar_t *LockBuffer() - { - if (_ref==NULL) return NULL; - GetString(); - WStringMemory::LockProxy(_ref); - if (_ref->IsShared()) - { - WStringMemory::UnlockProxy(_ref); - _ref->Release(); - _ref=WStringMemory::AllocString(_ref->GetStringFromMemBlock(),0); - _ref->AddRef(); - WStringMemory::LockProxy(_ref); - } - return const_cast(_ref->GetStringFromMemBlock()); - } - - /// Function creates buffer for string and returns its address - /** Application can use buffer in functions, that cannot work with - WString objects. Size of buffer is specified by sz value, and it is in characters. - Application must call UnlockBuffer after writes all data into buffer. - - NOTE: Prevoius content of string is lost. - NOTE: sz specifies buffer size without terminating zero character - */ - wchar_t *CreateBuffer(size_t sz) - { - _ref->Release(); - _ref=WStringMemory::AllocString(NULL,sz); - _ref->AddRef(); - WStringMemory::LockProxy(_ref); - return const_cast(_ref->GetStringFromMemBlock()); - } - - /// Function creates buffer, and copies string into it. - /** Parameter sz specifies size of new buffer in characters - When sz is smaller then size of string, string is truncated - When sz is larger then size of string, string is copied unchanged, - but extra characters can be appended. - - NOTE: sz specifies buffer size without terminating zero character - */ - wchar_t *CreateBufferCopy(size_t sz) - { - WString save=*this; - wchar_t *wbuff=CreateBuffer(sz); - int minsz=__min(sz,save.GetLength()); - wcsncpy(wbuff,save.GetString(),minsz); - return wbuff; - } - - /// Function unlocks internal buffer - /** parameter sz specifies final lenght of string in buffer. Default - value -1 forces function calc size by own - */ - void UnlockBuffer(int sz=-1) - { - if (_ref==NULL) return; - wchar_t *wbuff=const_cast(_ref->GetStringFromMemBlock()); - if (sz<0) sz=wcslen(wbuff); - else wbuff[sz]=0; - if (sz!=(signed)_ref->GetLength()) - { - _ref->RecalcLength(); - WStringMemory::UnlockProxy(_ref); - } - } - - class WStringAtCharHelper - { - WString &_str; - size_t _index; - public: - WStringAtCharHelper(WString &str,size_t index):_str(str),_index(index) {} - WString &operator=(wchar_t z) - { - wchar_t *buff=_str.LockBuffer(); - assert(buff && _index<_str.GetLength()); - buff[_index]=z; - _str.UnlockBuffer(); - return _str; - } - operator wchar_t() - { - assert(_index<_str.GetLength()); - return ((const wchar_t *)_str)[_index]; - } - }; - - /// Function will return helper object, which can access single character in string - /** - Using array operator is slower than accessing characters by LockBuffer function - */ - WStringAtCharHelper operator[](int index) - { - return WStringAtCharHelper(*this,index); - } - - int Find(wchar_t z,size_t from=0) const - { - if (from>=GetLength()) return -1; - const wchar_t *res=wcschr(GetString()+from,z); - if (res) return res-GetString(); - else return -1; - } - - int FindLast(wchar_t z) const - { - const wchar_t *res=wcsrchr(GetString(),z); - if (res) return res-GetString(); - else return -1; - } - - int Find(const wchar_t *z,size_t from=0) const - { - if (z==NULL) return -1; - if (from>=GetLength()) return -1; - const wchar_t *res=wcsstr(GetString()+from,z); - if (res) return res-GetString(); - else return -1; - } - - int FormatV(wchar_t *format, va_list lst); - - int Format(wchar_t *format, ...); - - ///Scans string for format - /** function is limited, item count is limited up to 20 items */ - int ScanStringV(const wchar_t *format, va_list lst) const; - - ///Scans string for format - /** function is limited, item count is limited up to 20 items */ - int ScanString(const wchar_t *format, ...) const; - - bool ReplaceOnce(const WString &findWhat,const WString &replaceWith); - - bool ReplaceAll(const WString &findWhat,const WString &replaceWith); - - WString TrimLeft() const; - - WString TrimRight() const; - - WString TrimLeft(wchar_t *trimChars) const; - - WString TrimRight(wchar_t *trimChars) const; - - ///Function splits string into two - /** Left part of string is returned. - Right part of string is leaved in object - @param splitPos split position. - @return if splitPos==0, function returns empty string. if splitPos>=length, function - moves string from object to result*/ - WString Split(size_t splitPos) - { - WString result=Left(splitPos); - *this=Right(splitPos); - return result; - } - - bool IsEmpty() const {return _ref==NULL;} - - void Empty() const {_ref->Release();_ref=NULL;} - - int Compare(const wchar_t *other) const - { - return wcscmp(*this,other); - } - - bool operator>(const WString &other) const {return Compare(other)>0;} - bool operator<(const WString &other) const {return Compare(other)<0;} - bool operator>=(const WString &other) const {return Compare(other)>=0;} - bool operator<=(const WString &other) const {return Compare(other)<=0;} - bool operator!=(const WString &other) const {return Compare(other)<=0;} - bool operator==(const WString &other) const {return Compare(other)<=0;} - - WString Upper() const; - WString Lower() const; - WString Reverse() const; - - ///Applies user effect on string - /** pointer should be static allocated object, or must be valid during lifetime of resulting string */ - WString Effect(IWStringEffect *effect) const; - - void SetUTF7(const char *utf7); - void SetUTF8(const char *utf8); - - ///Function converts string to SingleByte string - /** - @param codePage Platform depends code page of result - @param holder Object that holds result. Result pointer is valid during lifetime of holder. Once holder - released, pointer is invalidated. You can get resulting pointer anytime from holder reintepreting - wchar_t to char - @result pointer to string - */ - const char *AsSBString(unsigned int codePage, WString &holder); - - ///Returns multibyte string in UTF7 codepage - /**See AsSBString description*/ - const char *AsUTF7(WString &holder); - - ///Returns multibyte string in UTF7 codepage - /**See AsSBString description*/ - const char *AsUTF8(WString &holder); - - - ///Function reads string from stream - /** - Function calls streamReader repeatly until function returns zero. In each call, streamReader returns - number of characters, that has been readed. - @param sreamReader pointer to function which provides reading from a stream - @param context user defined context pointer (most in cases, pointer to stream is passed) - @param buffer space allocated for data readed from stream - @param bufferLen maximum count of characters can be written to buffer - @return streamReader returns number of characters, that has been written to buffer. Function must return zero - to stop reading - */ - void ReadFromStream(size_t (*streamReader)(wchar_t *buffer, size_t bufferLen, void *context),void *context); - - WString operator() (int from) const {return from<0?RightR(-from):Right(from);} - WString operator() (int from, int to) const - { - if (from>=0) - return to<0?Mid(from,-to):Mid(from,to-from); - else - return to<0?Mid(GetLength()+from,-to):Mid(GetLength()+from,GetLength()-from-to); - } - - ///Enables global string sharing. - /** Function Share allows share strings that contains same text. It can reduce memory - usage. Function is useful when there is many objects that contains string with same text. - - Basically, two strings is shared, if one string is created as copy of another string. Strings - is sharing they content, until one of them is modified. - - Calling Share function, string is registered for global sharing. If string with same content is already - registered, then content of current string is released, and string is shared. - - To successfully share two strings, both strings must call Share() function. Sharing is provided until one - of strings is modified. After modifications are done, Share function of modified string must be called again. - - Remember: Global sharing can reduce amount of memory, if there are multiple strings that containging - the same content. But sharing of each unique string takes small piece of memory to store sharing - informations. - - To share string automatically, use WSharedString class - WSC strings cannot be shared! - */ - void Share() const - { - WStringProxy *curref=_ref; - GetString(); - _ref=WStringMemory::ShareString(curref); - _ref->AddRef(); - curref->Release(); - } - - ///Disables global string sharing - /** Function unregisters string from global sharing database. If string is shared, function doesn't break - it. But all strings that currently sharing content will not be shared with newly created strings. - */ - void Unshare() - { - WStringMemory::UnshareString(_ref); - } -}; - -///Function will create constant WString -/** function will not copy content of string. Only creates reference to string - Using WStringConst is faster for strings in code -@exmple result=a+WStringConst(L"text")+b; -*/ -const WString WStringConst(const wchar_t *text); - -///Macro to easy convert incode string to WString -/** -function also marks text wide. -@example WString text=WSC("Hello world"); -*/ -#define WSC(x) WStringConst(L##x) -///Macro to easy convert any wchar_t buffer to constant WString -/** -IMPORTANT NOTE!: Buffer must exists until string is rendered. -If you are using WSCB in function, don't forget call GetString before function exits -If you are excepting additional string operations outside function, using standard -WString conversion can be more effecient. -*/ -#define WSCB(x) WStringConst(x) - - - -class WSharedString: public WString -{ -public: - WSharedString() {} - - ///constructs string. - explicit WSharedString(const wchar_t *string):WString(string) {Share();} - - ///constructs string from wide-char array with specified length - WSharedString(const wchar_t *string, size_t sz):WString(string,sz) {Share();}; - - ///copy constructor - /**constructor doesn't copy the string, only reference. - String is shared until it is changed - */ - WSharedString(const WSharedString &other):WString(other) {} - WSharedString(const WString &other):WString(other) {Share();} - - ///constructs string from multi-byte string. codePage specified code page of string - WSharedString(const char *sbstring, unsigned int codePage):WString(sbstring,codePage) {Share();} - - ///assignment operator - /** assignment operator doesn't copy the string only reference. - String is shared until it is changed */ - WSharedString &operator=(const WString &other) - {WString::operator =(other);Share();return *this;} - - const wchar_t *GetString() const - { - const wchar_t *res=WString::GetString(); - Share(); - return res; - } - operator const wchar_t *() const {return GetString();} - wchar_t operator[](int index) const - { - assert(index<=(int)GetLength() && index>=0); - return GetString()[index]; - } - - void UnlockBuffer(int sz=-1) - { - WString::UnlockBuffer(sz); - Share(); - } - -}; - - -#endif // !defined(AFX_WSTRING_H__481164FB_3BB7_4824_B0E3_8B371F0AAF3A__INCLUDED_) diff --git a/DDLReader/WStringMemory.cpp b/DDLReader/WStringMemory.cpp deleted file mode 100644 index 947ed02..0000000 --- a/DDLReader/WStringMemory.cpp +++ /dev/null @@ -1,397 +0,0 @@ -// WStringMemorySingleThread.cpp: implementation of the WStringMemory class. -// -////////////////////////////////////////////////////////////////////// - -#include -#include -#include "WStringMemory.h" -#include "WStringProxy.h" -#include -#include -#include - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -#ifdef _MT //multithreading -#define WSTRING_MT -#endif - -#ifdef WSTRING_MT //multithreading - - -struct WStringMTLock -{ - WStringProxy *_lockProxy; - LONG _recursionCount; - DWORD _owner; - HANDLE _event; - WStringMTLock(WStringProxy *x):_lockProxy(x) {} - WStringMTLock():_lockProxy(NULL) {} - - bool operator==(const WStringMTLock &other) const {return _lockProxy==other._lockProxy;} - bool operator!=(const WStringMTLock &other) const {return _lockProxy!=other._lockProxy;} - bool operator>=(const WStringMTLock &other) const {return _lockProxy>=other._lockProxy;} - bool operator<=(const WStringMTLock &other) const {return _lockProxy<=other._lockProxy;} - bool operator>(const WStringMTLock &other) const {return _lockProxy>other._lockProxy;} - bool operator<(const WStringMTLock &other) const {return _lockProxy *GLockDB=NULL; //Lock proxy database - -static void exitMT() -{ - DeleteCriticalSection(&GLocker); -} - - -static void OnStartup() -{ - InitializeCriticalSection(&GLocker); - atexit(exitMT); -} - -#define ON_STARTUP_PRIORITY_NORMAL OnStartup -#include - -#endif - - - -#define WS_MAXFREELISTS 32 -#define WS_FREELISTSTEP 32 -#define WS_TOTALMAXFREEKBYTES 256 - -#define WS_MAXIMUMFASTALLOC (WS_MAXFREELISTS*WS_FREELISTSTEP) - -#define WS_MAXFREEBYTES PerSlotMaxAlloc - - -static size_t PerSlotMaxAlloc=(WS_TOTALMAXFREEKBYTES*1024/WS_MAXFREELISTS); -static WStringProxy *FreeList=NULL; -static void **StringFreeList[WS_MAXFREELISTS]; -static size_t StringFreeBytes[WS_MAXFREELISTS]; -static bool InitManager=true; - - -static void InitManagerPointers() -{ - memset(StringFreeList,0,sizeof(StringFreeList)); - memset(StringFreeBytes,0,sizeof(StringFreeBytes)); - InitManager=false; -} - -static void *AllocStringBlock(size_t sz) -{ - if (InitManager) InitManagerPointers(); - if (sz>WS_MAXIMUMFASTALLOC) return malloc(sz); - int pos=(sz+WS_FREELISTSTEP-1)/WS_FREELISTSTEP; - void **nxt=StringFreeList[pos]; - if (nxt==0) - { - printf("malloc %d\n",pos*WS_FREELISTSTEP); - return malloc(pos*WS_FREELISTSTEP); - } - printf("fast_alloc %d\n",pos*WS_FREELISTSTEP); - StringFreeList[pos]=(void **)(*nxt); - StringFreeBytes[pos]-=_msize(nxt); - return nxt; -} - -static void DeallocStringBlock(void *ptr) -{ - size_t sz=_msize(ptr); - if (sz>WS_MAXIMUMFASTALLOC) {free(ptr);return;} - int pos=(sz+WS_FREELISTSTEP-1)/WS_FREELISTSTEP; - if (sz+StringFreeBytes[pos]>WS_MAXFREEBYTES) - { - printf("free %d\n",sz); - free(ptr);return; - } - void **proxy=(void **)ptr; - *proxy=(void *)StringFreeList[pos]; - StringFreeList[pos]=proxy; - StringFreeBytes[pos]+=sz; - printf("fast_free %d\n",sz); -} - - -static inline void *operator new(size_t alloc,size_t sz) -{ - return AllocStringBlock(sz+alloc); -} - -static inline void operator delete(void *p,size_t alloc) -{ - DeallocStringBlock(p); -} - -static inline void *operator new(size_t sz,void *ptr) -{ - return ptr; -} - -static inline void operator delete(void *ptr,void *p) -{ -} - -WStringProxy * WStringMemory::AllocString(const wchar_t *text, size_t size) -{ -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - assert(size!=0 || text!=0); - if (size==0) size=wcslen(text); - WStringProxy *proxy=new((size+1)*sizeof(wchar_t)) WStringProxy(size,0,0); - wchar_t *alloctext=const_cast(proxy->GetStringFromMemBlock()); - if (text) wcsncpy(alloctext,text,size); - alloctext[size]=0; - if (proxy->_redirect==0) - { - proxy->_redirect=alloctext; - proxy->_blockData2=1; - } -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif - return proxy; -} - -WStringProxy * WStringMemory::AllocProxy(const WStringProxy &templateProxy) -{ - WStringProxy * res; -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - if (FreeList==NULL) res=new WStringProxy(templateProxy); - else - { - WStringProxy *alloc=FreeList; - FreeList=alloc->_baseString; - res=new((void *)alloc) WStringProxy(templateProxy); - } -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif - return res; -} - -void WStringMemory::FreeProxy(WStringProxy *proxy) -{ -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - if (proxy->_operation==proxy->OpMemBlck && !(proxy->_blockData2==0 && proxy->_redirect!=NULL)) - { - if (proxy->_blockData2==2) UnshareString(proxy); - DeallocStringBlock(proxy); - } - else - { - proxy->~WStringProxy(); - proxy->_baseString=FreeList; - FreeList=proxy; - } -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif -} - -#ifdef WSTRING_MT - -void WStringMemory::LockProxy( WStringProxy *proxy) -{ -nextTry: - EnterCriticalSection(&GLocker); - WStringMTLock srch(proxy),*found; - if (GLockDB==NULL) GLockDB=new BTree(16); - found=GLockDB->Find(srch); - if (found==NULL) - { - srch._event=NULL; - srch._owner=GetCurrentThreadId(); - srch._recursionCount=1; - GLockDB->Add(srch); - } - else - { - if (found->_owner!=GetCurrentThreadId()) - { - HANDLE w=found->_event; - if (w==0) {w=found->_event=CreateEvent(NULL,TRUE,FALSE,NULL);} - LeaveCriticalSection(&GLocker); //leave section - WaitForSingleObject(w,INFINITE); - goto nextTry; - } - else - { - found->_recursionCount++; - } - } - LeaveCriticalSection(&GLocker); //leave section -} - -void WStringMemory::UnlockProxy( WStringProxy *proxy) -{ - EnterCriticalSection(&GLocker); - WStringMTLock srch(proxy),*found; - found=GLockDB->Find(srch); - if (found) - { - if (--found->_recursionCount==0) - { - if (found->_event!=NULL) - { - SetEvent(found->_event); - CloseHandle(found->_event); - } - GLockDB->Remove(*found); - } - } - LeaveCriticalSection(&GLocker); -} - - -void WStringMemory::AddRefProxy(WStringProxy *proxy) -{ - InterlockedIncrement(reinterpret_cast(&proxy->_refCount)); -} - -bool WStringMemory::ReleaseRefProxy(WStringProxy *proxy) -{ - LONG res=InterlockedDecrement(reinterpret_cast(&proxy->_refCount)); - if (res<0) res=InterlockedIncrement(reinterpret_cast(&proxy->_refCount)); - return res==0; -} - -#else -void WStringMemory::LockProxy( WStringProxy *proxy) -{ - //not needed in single thread environment -} - -void WStringMemory::UnlockProxy( WStringProxy *proxy) -{ - //not needed in single thread environment -} - - -void WStringMemory::AddRefProxy(WStringProxy *proxy) -{ - //no special handling in single thread environment - ++proxy->_refCount; -} - -bool WStringMemory::ReleaseRefProxy(WStringProxy *proxy) -{ - //no special handling in single thread environment - if (proxy->_refCount) --proxy->_refCount; - return proxy->_refCount==0; -} - -#endif -void WStringMemory::FreeExtra() -{ -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - while (FreeList) - { - void *proxy=FreeList; - FreeList=FreeList->_baseString; - free(proxy); - } - for (int i=0;i_redirect,other._str->_redirect); - } - - bool operator==(const ShareDBItem& other) const {return Compare(other)==0;} - bool operator>=(const ShareDBItem& other) const {return Compare(other)>=0;} - bool operator<=(const ShareDBItem& other) const {return Compare(other)<=0;} - bool operator!=(const ShareDBItem& other) const {return Compare(other)!=0;} - bool operator>(const ShareDBItem& other) const {return Compare(other)>0;} - bool operator<(const ShareDBItem& other) const {return Compare(other)<0;} -}; - -static BTree *GDB=NULL; - -WStringProxy *WStringMemory::ShareString(WStringProxy *proxy) -{ - if (proxy->_operation!=WStringProxy::OpMemBlck || proxy->_blockData2==0 || proxy->_blockData2==2) return proxy; - -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - - if (GDB==NULL) GDB=new BTree; - - proxy->_blockData2=2; //block is subject of sharing - proxy->_redirect=proxy->GetStringFromMemBlock(); //setup pointer to string - ShareDBItem *found=GDB->Find(ShareDBItem(proxy)); - if (found) {proxy->_blockData2=1;proxy=found->_str;} - else GDB->Add(ShareDBItem(proxy)); -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif - return proxy; -} - -void WStringMemory::UnshareString(WStringProxy *proxy) -{ - if (proxy->_operation!=WStringProxy::OpMemBlck || proxy->_blockData2!=2) return; - if (GDB==NULL) return; -#ifdef WSTRING_MT - EnterCriticalSection(&GLocker); -#endif - GDB->Remove(ShareDBItem(proxy)); - proxy->_blockData2=1; -#ifdef WSTRING_MT - LeaveCriticalSection(&GLocker); -#endif -} \ No newline at end of file diff --git a/DDLReader/WStringMemory.h b/DDLReader/WStringMemory.h deleted file mode 100644 index a81b08e..0000000 --- a/DDLReader/WStringMemory.h +++ /dev/null @@ -1,61 +0,0 @@ -// WStringMemory.h: interface for the WStringMemory class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_WSTRINGMEMORY_H__79693029_4788_4099_9A97_92AF310A7AD5__INCLUDED_) -#define AFX_WSTRINGMEMORY_H__79693029_4788_4099_9A97_92AF310A7AD5__INCLUDED_ - -#include - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -class WStringProxy; - -class WStringMemory -{ -public: - - static WStringProxy * AllocString(const wchar_t *text, size_t size); - static WStringProxy * AllocProxy(const WStringProxy &templateProxy); - static void FreeProxy(WStringProxy *proxy); - static void LockProxy(WStringProxy *proxy); - static void UnlockProxy(WStringProxy *proxy); - - //Releases extra memory leaved for future fast allocations - static void FreeExtra(); - - //Support addref for proxy - Single- or Multi- thread support - static void AddRefProxy(WStringProxy *proxy); - - //Support addref for proxy - Single- or Multi- thread support - //returns true, when counter reached zero - static bool ReleaseRefProxy(WStringProxy *proxy); - - ///Gets statistics about memory manager - /** - @param details optional pointer to 32 size_t items. Array will be filled - with sizes of each string fastalloc group. - @return function returns total bytes allocated for string fast allocation. - (This number should be below 256KB) - */ - static size_t GetStatistics(size_t *details=NULL); - - ///Function allows sharing the strings - /** This function is called by WString::Share function - Function mark proxy shared. If string is same as shared, - it returns pointer to proxy with proxy of string that contains - the same text. - Read description of WString::Share for more informations - */ - static WStringProxy *ShareString(WStringProxy *proxy); - - ///Function disables sharing of the string - static void UnshareString(WStringProxy *proxy); - -}; - - - -#endif // !defined(AFX_WSTRINGMEMORY_H__79693029_4788_4099_9A97_92AF310A7AD5__INCLUDED_) diff --git a/DDLReader/WStringProxy.cpp b/DDLReader/WStringProxy.cpp deleted file mode 100644 index e98b577..0000000 --- a/DDLReader/WStringProxy.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// WStringProxy.cpp: implementation of the WStringProxy class. -// -////////////////////////////////////////////////////////////////////// - - -#include "WStringProxy.h" - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -/** Funkce vytvo�� transitivn� uz�v�r. -to znamen�, �e zru�� v�echny z�et�zen� redirecty. -*/ -WStringProxy *WStringProxy::TransitivniUzaver() -{ - if (_operation==OpSubstr && _offset==0 && _stringSize==_baseString->GetLength()) - { - WStringProxy *next=_baseString->TransitivniUzaver(); - if (next==NULL) return this; - next->AddRef(); - _baseString->Release(); - _baseString=next; - return next; - } - return NULL; -} - -/** Main render procedure -It creates allocates buffer proxy and renders tree into it -Then turns self into redirect proxy a redirect self into newly created string -Rerurns pointer to newly created proxy -*/ -WStringProxy *WStringProxy::RenderString() -{ - if (_operation==OpMemBlck) return this; - - WStringProxy *pp=TransitivniUzaver(); - if (pp!=NULL) return pp->_baseString->RenderString(); - - WStringProxy *newProxy=WStringMemory::AllocString(NULL,_stringSize); - wchar_t *renderPtr=const_cast(newProxy->GetStringFromMemBlock()); - - RenderStringToBuffer(renderPtr); - - newProxy->AddRef(); - this->~WStringProxy(); - _operation=OpSubstr; - _offset=0; - _baseString=newProxy; - - return newProxy; -} - -/** Function renders simple effect into buffer -Function needs buffer with nul terminated string -*/ -void WStringProxy::RenderSimpleEffect(wchar_t *renderPtr) -{ - assert(_operation==OpEffect); - switch (_effect) - { - case EfLower: wcslwr(renderPtr);break; - case EfUpper: wcsupr(renderPtr);break; - case EfReverse: wcsrev(renderPtr);break; - } - -} - -/** Light phase of rendering. Used to render string that is not -created from substring. This part is optimized for concat and user effects -When substring must be rendered, function call RenderStringToBufferSubstr to -render substring. -*/ -void WStringProxy::RenderStringToBuffer(wchar_t *renderPtr) -{ - WStringMemory::LockProxy(this); - switch (_operation) - { - case OpConcat: - _baseString->RenderStringToBuffer(renderPtr); - _secondString->RenderStringToBuffer(renderPtr+_baseString->GetLength()); - break; - case OpSubstr: - { - _baseString->RenderStringToBufferSubstr(renderPtr,_offset,GetLength()); - } - break; - case OpMemBlck: - { - const wchar_t *str=GetStringFromMemBlock(); - wcsncpy(renderPtr,str,_stringSize); - } - break; - case OpEffect: - { - uint32_t offset=0; - renderPtr[_stringSize]=0; //we can append zero, because right side of string is not yet rendered - //if this is end of string, one extra character for zero is also allocated. - //efect functions can rely on it. - if (_blockData2>=256) offset=_userEffect->PreRenderString(renderPtr,_baseString->GetLength()); //call prerender to prepare begin of buffer - _baseString->RenderStringToBuffer(renderPtr+offset); //render string to rest of buffer - if (_blockData2>=256) _userEffect->RenderString(renderPtr,_baseString->GetLength()); //apply effect to buffer - else RenderSimpleEffect(renderPtr); - } - break; - }; - WStringMemory::UnlockProxy(this); -} - -/** -Deep phase of rendering. Function can render substrings, or render substring of two -concated strings. Function can also perform partial effect on string. Function cannot -handle partial user effect, so this effects are converted to things strings. -*/ -void WStringProxy::RenderStringToBufferSubstr(wchar_t *renderPtr, size_t offset, size_t size) -{ - WStringMemory::LockProxy(this); - switch (_operation) - { - case OpConcat: - { - //process substring of concat - //count characters in buffer - size_t rendered; - //when string starts in left string - if (_baseString->GetLength()>offset) - { - //calculate total characters that may be rendered - rendered=_baseString->GetLength()-offset; - //but limit it to request size - if (rendered>size) rendered=size; - //render substring into buffer - _baseString->RenderStringToBufferSubstr(renderPtr,offset,rendered); - } - else - //no character has been rendered - rendered=0; - - //there is still characters remained to render. We will take it from second string - if (size-rendered>0) - { - if (offset>_baseString->GetLength()) offset-=_baseString->GetLength(); - else offset=0; - _secondString->RenderStringToBufferSubstr(renderPtr+rendered,offset,size-rendered); - } - } - break; - case OpSubstr: - { //rendering substrings is very easy - offset+=_offset; //add offset of substring - assert(offset+size<=GetLength()); //check length - //render substring - this->RenderStringToBufferSubstr(renderPtr,offset,size); - } - break; - case OpMemBlck: - { - //rendering from memory, final stop in recursion - //Get pointer string - const wchar_t *str=GetStringFromMemBlock(); - //copy substring from string into render buffer - wcsncpy(renderPtr,str+offset,size); - } - break; - case OpEffect: - if (_blockData2>=256) //interface cannot handle partial rendering - { - RenderString(); //convert proxy to simple redirect and render it - RenderStringToBufferSubstr(renderPtr,offset,size); //now we are able to cut out part - } - else - { - //all standard effects maps string 1:1 - //first get content of substring into buffer - _baseString->RenderStringToBufferSubstr(renderPtr,offset,size); - //we can append zero, because right side of string is not yet rendered - renderPtr[size]=0; - //process effect on target - RenderSimpleEffect(renderPtr); - } - break; - }; - WStringMemory::UnlockProxy(this); -} \ No newline at end of file diff --git a/DDLReader/WStringProxy.h b/DDLReader/WStringProxy.h deleted file mode 100644 index 0bf63ed..0000000 --- a/DDLReader/WStringProxy.h +++ /dev/null @@ -1,232 +0,0 @@ -// WStringProxy.h: interface for the WStringProxy class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_WSTRINGPROXY_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_) -#define AFX_WSTRINGPROXY_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "WStringMemory.h" -#include "IWStringEffect.h" -#include -#include -#include -#include - -/* -List of proxy types - -Memory_Proxy _operation=OpMemBlck - _blockData==0 and _blockData2==0 - or - _blockData!=0 and _blockData2!=0 - (_redirect - debug pointer) - (_blockData - 1) - -Proxy_Const _operation=OpMemBlck - _redirect - pointer to string - _blockData2=0 - -Proxy_Shared _operation=OpMemBlck - _redirect - pointer to string - _blockData2=2; - -Proxy_Immediate _operation=OpMemBlck - _blockData>0xFFFF - _blockData2>0xFFFF - both parameters are used by immediate memory manager - -Proxy_Concat _operation=OpConcat - _baseString and _secondString is valid - -Proxy_Link _operation=OpSubstr - _baseString is valid - _stringSize==_baseString->_stringSize - _offset==0; - NOTE: Can be used without rendering - -Proxy_RightSub _operation=OpSubstr - _baseString is valid - _offset<=_baseString->_stringSize - _stringSize==_baseString->_stringSize-_offset - NOTE: Can be used without rendering - -Proxy_SubString _operation=OpSubstr - _baseString is valid - _offset<=_baseString->_stringSize - _stringSize<=_baseString->_stringSize-_offset - -Proxy_Effect _operation=OpEffect - _baseString is valid - _stringSize=_baseString->_stringSize - _effect defining effect code < 0xFFFF - -Proxy_UserEffect _operation=OpEffect - _baseString is valid - _stringSize=_baseString->_stringSize - _effect>0xFFFF - _userEffect defining pointer to effect interface - -*/ -class WStringProxy -{ -public: - enum Operation - { - OpConcat=0, //proxy contains two links to concat it - OpSubstr=1, //proxy contains link to another proxy and specified substring - OpMemBlck=-2, //proxy contains informations about following string - OpEffect=-1, //proxy describing some efect with string - }; - - enum Effect - { - EfLower, //effect lower case - EfUpper, //effect upper case - EfReverse, //effect reverse string - }; -public: - - uint32_t _refCount; //reference count - uint32_t _stringSize:30; //string size in characters (maximum size 1073741823 characters ~ 2147483646 bytes) - Operation _operation:2; //operation with string or proxy type - - union - { - WStringProxy *_baseString; //pointer to next proxy referenced by this proxy - uint32_t _blockData; //user defined block data for OpMemBlock proxy type - const wchar_t *_redirect; //used for OpMemBlock, when _blockData2 is zero. - }; - - union - { - WStringProxy *_secondString; //pointer to second string for OpConcat - uint32_t _offset; //offset of substring for OpSubstr - Effect _effect; //effect selector for OpEffect - IWStringEffect *_userEffect; //user effect defined by IWStringEffect interface (valid when _effect is invalid) - uint32_t _blockData2; //user defined block data for OpMemBlock proxy type - exception: if this value is zero, member _redirect is valid - - }; - - - void RenderStringToBuffer(wchar_t *renderPtr); - void RenderStringToBufferSubstr(wchar_t *renderPtr, size_t offset, size_t size); - WStringProxy *TransitivniUzaver(); - void RenderSimpleEffect(wchar_t *renderPtr); - -public: - WStringProxy():_refCount(0),_operation(OpSubstr),_stringSize(0),_baseString(0),_secondString(0) {} //inicializes empty string proxy - - WStringProxy(WStringProxy *other): - _refCount(0), - _stringSize(other->GetLength()), - _baseString(other), - _operation(OpSubstr), - _offset(0) - {_baseString->AddRef();} - - WStringProxy(WStringProxy *other, uint32_t offset, uint32_t size): - _refCount(0), - _stringSize(size), - _baseString(other), - _operation(OpSubstr), - _offset(offset) - {_baseString->AddRef();} - - WStringProxy(WStringProxy *a, WStringProxy *b): - _refCount(0), - _stringSize(a->GetLength()+b->GetLength()), - _baseString(a), - _operation(OpConcat), - _secondString(b) - {_baseString->AddRef();_secondString->AddRef();} - - WStringProxy(WStringProxy *a, Effect effect): - _refCount(0), - _stringSize(a->GetLength()), - _baseString(a), - _operation(OpEffect), - _effect(effect) - {_baseString->AddRef();} - - WStringProxy(WStringProxy *a, IWStringEffect *userEffect): - _refCount(0), - _stringSize(a->GetLength()+userEffect->GetEffectExtraSize(a->GetLength())), - _baseString(a), - _operation(OpEffect), - _userEffect(userEffect) - {_baseString->AddRef();} - - WStringProxy(uint32_t size, uint32_t user1, uint32_t user2): - _refCount(0), - _stringSize(size), - _operation(OpMemBlck), - _blockData(user1), - _blockData2(user2) - {} - - WStringProxy(const wchar_t *imText): - _refCount(0), - _stringSize(wcslen(imText)), - _redirect(imText), - _blockData2(0), - _operation(OpMemBlck) - {} - - WStringProxy(const WStringProxy &other) - { - memcpy(this,&other,sizeof(*this)); - if (_operation!=OpMemBlck) _baseString->AddRef(); - if (_operation==OpConcat) _secondString->AddRef(); - } - - WStringProxy& operator=(const WStringProxy &other) - { - WStringProxy::~WStringProxy(); //call destructor to destruct current proxy - memcpy(this,&other,sizeof(*this)); //construct new proxy from template - if (_operation!=OpMemBlck) _baseString->AddRef(); - if (_operation==OpConcat) _secondString->AddRef(); - } - - WStringProxy *RenderString(); - - ~WStringProxy() - { - if (_operation!=OpMemBlck) _baseString->Release(); - if (_operation==OpConcat) _secondString->Release(); - } - - - uint32_t GetLength() {return _stringSize;} - void AddRef() {if (this) WStringMemory::AddRefProxy(this);} - void Release() {if (this) if (WStringMemory::ReleaseRefProxy(this)) WStringMemory::FreeProxy(this);} - - const wchar_t *GetString() - { - if (_operation==OpMemBlck) return (const wchar_t *)(this+1); - WStringProxy *p=RenderString(); - (*this)=*p; - return (const wchar_t *)(p+1); - } - - const wchar_t *GetStringFromMemBlock() - { - assert(_operation==OpMemBlck); - if (_blockData2==0 && _redirect!=NULL) return _redirect; - else return (const wchar_t *)(this+1); - } - - bool IsShared() {return _refCount>1;} - - void RecalcLength() - { - const wchar_t *str=GetStringFromMemBlock(); - _stringSize=wcslen(str); - } - -}; - -#endif // !defined(AFX_WSTRINGPROXY_H__863ADE82_7789_4E54_BE7D_B8F0740FD81B__INCLUDED_) diff --git a/DDLReader/res/DDLReader.ico b/DDLReader/res/DDLReader.ico deleted file mode 100644 index 7eef0bcbe6580a6f464d688906172c2d9de44262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmc&zF>b>!3}jLb9s)T}@Kod(893@u8ajANzT`op9^o+)S?=nU(FD@%0s)Sg^oyC8{H z9myetc;MEP)59v(LMa~xK8Yu^jIR*H22uCFiq5%C{s7(PJi>o15i^bmX4(vPxWAio z9ryY#AU_jfnd047-@`)XzL?%iS$gQyFP{44kS9X)fN{{QoL~hO-&=q&20Zr*cxFAt PkaNE{wR~2C$NfnjhSXWT diff --git a/DDLReader/res/DDLReader.rc2 b/DDLReader/res/DDLReader.rc2 deleted file mode 100644 index 35693f0..0000000 --- a/DDLReader/res/DDLReader.rc2 +++ /dev/null @@ -1,13 +0,0 @@ -// -// DDLREADER.RC2 - resources Microsoft Visual C++ does not edit directly -// - -#ifdef APSTUDIO_INVOKED - #error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/DDLReader/resource.h b/DDLReader/resource.h deleted file mode 100644 index 2625141..0000000 --- a/DDLReader/resource.h +++ /dev/null @@ -1,49 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by DDLReader.rc -// -#define IDM_ABOUTBOX 0x0010 -#define IDD_ABOUTBOX 100 -#define IDS_ABOUTBOX 101 -#define IDD_DDLREADER_DIALOG 102 -#define IDS_FILEOPENFAILED 102 -#define IDC_HEADGROUP 103 -#define IDC_HEADFNAME 104 -#define IDC_HEADSIZE 105 -#define IDC_HEADOFFSET 106 -#define IDS_DDLFILTER 107 -#define IDC_GROUP_GRAPHICS 108 -#define IDC_GROUP_SOUNDS 109 -#define IDC_GROUP_FONTS 110 -#define IDC_GROUP_BASIC 111 -#define IDC_GROUP_ITEMS 112 -#define IDC_GROUP_MONSTERS 113 -#define IDC_GROUP_DIALOGS 114 -#define IDC_GROUP_UNSPECIFIED 115 -#define IDC_GROUP_UNKNOWN 116 -#define IDS_UNABLETOCREATEFILE 117 -#define IDS_UNABLETOEXTACTDATA 118 -#define IDR_MAINFRAME 128 -#define IDD_PROGRESS 129 -#define IDD_EXPORTING 129 -#define IDC_FILELIST 1001 -#define IDC_FOLDER 1002 -#define IDC_BROWSE 1003 -#define IDC_EXPORT 1004 -#define IDC_POPISEK 1005 -#define IDC_DDLFILE 1006 -#define IDC_DDLBROWSE 1007 -#define IDC_PROGRESS 1008 -#define IDC_NAME 1009 -#define IDC_BUTTON1 1010 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 130 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1011 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/FONT/BIG.FON b/FONT/BIG.FON deleted file mode 100644 index 8034176ce49d08c2a54ffdd189e1b4665f2e4ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12309 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

_BnTbhe|Z(p>|wL0aw3g0$E@WG6w~DOyMtn8Fx$ zQMB?sdulA!RMHmTumg9aPP|nQCDGA^*gnC(ZXljvbfnxi;?@FblN2V!2uc7x<#L88L7{Gi19>d@~;i~bF(GuN3C2N%A?et zOCH&eIzJUNg%zZ;lY|B3#!{-~Xcs!E!DXYdk_b~~@0a*+XJbqdq;B11H6aR4G&MD? ztK!NGT&)MK*wSWIi1v__}LzmJ7(QA zS$8KQt_kGiiaM({|F=p7Qp+vMDc` zN4GE{Q%qM-5ZkL3dh^2h^8JX2*x9HeU8;6;u~8xO&|ox)>VZ-X0+@;_8~qXSw{VB| zEw4#gd8@FNnRUKlWql%q3OS3)ctqh-t=;W8t?Q#qhw3ci~et{OK}=N35U0%)5;I24lk$$VCO=4EQ@M##0xl+f@u zG7p{fCf>6QpIp`fjnE74dd(+<*++%BE*1_n#R?SSGu-jqX~CRLFB2QrrL56@a;u52 zK4DB`TyhP0Ra6LanIC!^=P3nF0TA-7Mv6L$`TQWAXuu3)_i_zB?8P!`S*4je3NwE7nIq!B_JW5Um}1ty}6%KX2oop;pA$%P5-` z1T(ZghjJy(oDo41UZ@@l<5D>{y)g zq$OLs2@9duiRysQ8U%YCaibzGOGI&;Fq0__>)~s+bG_iGdbzpKQ`E3dRf^3)3Uqa# zVZL}V4}fMMr!FFmKuyiGf?b)K_0+aB;T!u%VT_w*3Qm;qfrs9I!3K1-JF2dOZRofv!|R8 z!Xs`+qat+H`|U$)rg@pEMs83{E6ymFVsA8c*qQb$u(WbZKy(soDX_8c(K{*}Zbe`7 zj-K0`_eoc3XTPo32)9xxVN^+hXd*9wgX>-=yTEC}6)rd9hbj55$_G2i+fSSw85rS! z>|AdelGASnQ@U!OI5Ez>VX7>!-0VZen4=<%)mU$xVo$K^3RLFZmEx>oaK_wYS{y*A ze`HnLC)qAcallTd6MO|?sS6_HD;{R6M31;6ahp6#*B)6c_VM#3V2>3%uY5gosfEjA zm+oTioeS!8;1y7;%O{;I;S`C^-+{wn8BxAAAP4othN0P)KtPh5l9eSLC8Rto6&@OcEY~}ab=KM9HZ*;MhCWwnih8je2 zq-(F7pXS6kgS$uVd&k$@w%HTwV^b3Z)x~$lVKiSV=~r|8T?SZA*F=2)q_L2I93V(b za`3||@_`#|(E%_0c%U7`U}df=2fXji{ijLEqvq$#fbR}h9H6r_pA@^1#jMjAb+bcl z^5`873mqJ|a^6tDgfuT;8$)�ZC!^-Eu_~t#}?$aW|%+iLtr;*8oaAx~H?$ttgm+ z1lqU6pebf8JZEFbGow-L&lw7D)J&hy)sxu?Fmm3ofHDi^IJ<+C)__WP_QWfe}O z9c>65dSDC5bTy?L_MyJT98TwYY|r%q^W51RJR~F+|1m^dNGKg%Qx>M*xbcWVW7uM( z7KETL!&s6%Om>dp*Ryb8100k^)KJX^&IrE5ECVqs5JLD_+f>@pVR9guaQA4SZ_L`_ zWZ`0y(lK--LlOv#x@W6kLiSC6Pc7>T-p;9;a$8kkbIu0BL&bYp_xZ(SQRb_9aL4v?j zvQgGz)`TsgL6KNtPLCNaqy~88Ge_V$3_vbZDF6eqXQIU_l*Uq5(N_*ekas{=a^;@( z|k75MSwjG#P zdO}S&pQ_<6|4M2GHrYWay;hoczAURZyNm%CRfa8GWXT^rmh3Tut=!X0qr2>`|GDx| z?OPF*vWZURsBA+=4QVt`HeQYQxFdRG@)>%ppV51fIzOfJ18H1Z%Ie|P5YstDtNX7Y zh=N`j1|IJ5&B2QCChyYcGB1uF>4O*N{R0k6k$zjUd#evl-K#pcuI@H&?wk?Q&3@qc z16%!SjlWA-T9qjgaa9S03C1?p@Ax^mm)RN;Luo6U--PLxH)F<)=><)4H9~okJVsw< zNnAt08NBPk!9*Rr4HLiV_iw~IKOO0svj**{3BeuDLyj~>Kv*Sw@|nP%9iV7F2lam` z7Ac!`Su(K!f0wx)MgrY9t?rSXL$_(hYo()%MG1j|)c>bKXn1brrTo-9@y#x||50j3 zYB#!KZFr5@gTvUy{m~s(+4sKsEedghZoecxLQtTZZ^2}g)&TUu%R}oqGo_fTq0LEw ziyC?FbJARmjYFpbhj2OQk|CpfJWlZ=TK-F3rSw)oE}EgF1T|yu^MBu)Ty71Z602S+k;s>t9MK)E&YnN zw?tHaOvETyHX@;$nH>noE)UPg&pB*`<70vBIMY?$p0cWQ4yRBsV)ApAxU%-aOZr?p3q)F1YD3zRdthE~VLttJfxHNqvD(H}B41V{&%CqCliYS+%{f9M*b zf8FZm9n?uqL;)yGaUAIz{3GjN0R*R$zu6#enODs2zTc87uCI?)0$hBD>&ZU4O5V!6 pvR4>$ouScJ;?3&@&9q2{$JjJK#l+a diff --git a/FONT/BOLDCZ.FON b/FONT/BOLDCZ.FON deleted file mode 100644 index be5e16c7bc204cc269f8460b692ba38ff6f14220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9034 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�%Ku9Ak($R!UbWvQ_>Kw54fVA2Vtzc^TT%@>GHQDssUwIr@ zXBZHBF?KG{KC8{@p1aLFE}bkq+I`uK3z1Utg&&gprw0E=EXn6jAA6*oqxHR%nTGoK zl5FLj>HSvm_9Q8FoTK!Ga;e4;gOVx?)kCY9cl$Fq{clOIgF``99DrO6vQt|er;`Kf zeYa3+m-MesgNQraXzm&fb@s;_g^+t}{5I~L;>lh-u*JV;kYA0#UU<$uax5bWwmWPF z+jEm6siJEcN)=p5SC@>YJx;^CiX+?@>Sw4s)4@QghhPOPc{*Vlgk`-RU4iXpF`CtHNbcguQH_2{%$|xq&eYd#SnE;cX=? zj}UoKv|2r?GTTVE=B1WH;*%s(Lfh9^kK_x5J^(!8?-t@Fb9U?5)UH8u@!st)kI8Xo zlnFx;X|d-V`x@G_Q=cR$dWMTbM%96VclwX=R@u-D6>M30c;Fcf1ky+kKm z(MjnaVrisvYcg4Nw78R?;9;@GD=za|ku$5o`YgO)_5U={T_bavay7q1MlUKtONJtP z@PK~iH@!gq!3&#X&v)L1sd4;X>{8!r$1H^ylukUejnlL+F}*6Dqp0F`;i7he**|@J zY&YKehP%DXpwFT}#tNR>Oxa`?ZSmD&BdQ~!^oKv_YJLrK?pVAAUMmdQ;j4xFA@M#@!@R1@u7h01L zMyhvy;%MLmf^WX-{a zUN26O&OPT;9^kwXY|HK$)Hzdp)h|dVVZom zOVAPXv$__UWv%lqF*AOWBqz}7I!bd=oP~vXe7IjTRPeGmvo0E(af_}W2z@nkeP$(F zUE(;Z;n(%d_t;H;BIz#z3%1m-#c5}ubUJUQA0HA#DTI(;K-tmiY5PMKbwR(>WLRnx zd0l!s@eHS+L8X_)1>v3^-?L(WArWFyF=B#q!m< F`d^Q?u>$}A diff --git a/FONT/EUROMODE.FON b/FONT/EUROMODE.FON deleted file mode 100644 index 398e4db5fde92ef7fb20e129993750138df2844f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12673 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 diff --git a/FONT/FONT6X9.FON b/FONT/FONT6X9.FON deleted file mode 100644 index ddc1006824c1d914493610523dc7b6014ac50dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5593 zcmbuDJE$CG6vt;~cV}m3_H|!{Scrm1B(0!`f)Nxng@~16lR^;VqcDxw1SEo$*qB01 zp@68S>0PbRh_Cnt$wa%qX$PPMrTLg zj{Y9qQXj2v-FdnGsQ#+{vA$CGo12>3nunSfo41-TnqQjT=Faia@eAX8=Z*21@t5OY z$K~Yk3PLVNU}&3Q}FbdHsyYr@AmPhD5Orau?Yc9-iMBcdjZya zL?LBY>ZNb&M|vSqIU-W>VvKIQ?KLyhBQ!;(S5FGv>1J3@ZMQ|=euG22?!_?zb^)Fh z48wXW0b@c04dwXGz(|qLFe51o+Iu+W`rz48&H3UbZBg0&>2N(Io zpv@GBZER0OotR4rb1n5Kmwx4vO~3}u=P-0_DYGmxkm?gX1aL>*oBArx`y>oc#F04m z8`Ma66EN?QeYF)LB7 z5Hdq9L=u56g2tD@B4ke56z)PL?E*;1;ay0us-aR+Ey!IB^rI@NwKwZYA#lRik-vYn zAh@U*ilR-tWJTTxOh8)9>qS+`vt*5au_l&sZ4sSHmoovv6^8OzaBx1*xRIif zk9c(|*Uo^2a=eEq^{9_u|(UFNmaT! zma4dIlzXt*NC1noT2UKiy!5DLR&^7}02A?i->Gv@uKIXY2A85L&m$|_W?(LqX=X5Z z?gY4%l`aR?LevI_7j4w7@P=&I6Z%C1h-kM&*?sMR4ziRB6@0c~GXhtS8N>-#cZwy> zWe9)U`5;fASHtXzjD%2RV&1xMNgwN(qsNMd^?g)Qo9a&_I9D-Md4vDfU8{~zG5av(EfRStU&-Y!K~$T) zy*>!p7w~qX)aRh|bf8p6mo>%QwHIcz7ZSLuZMJ%k8CQ0JRsz)oA z+APA5lL>v^lMawh@oJ1jkdz=0l{Cxel&@haMJQea6oM5}y=?spOqR4e6Qzvbn{A*e zbWU@;R^7J!ek{YLXNG3>(1MFc@?c4Wyi3vd-i8Tw5?%IHe8~rGX~MsD71W+Peu5}t zv?3_H?Jhh_M8>h19Hion680i57=ocX?lZYbrkQTvF;FfI{37o2b@AFkUA=; z*0)P1>PzaR+_POdsa3VrfZ7;~_09p-L+OrCuV4Xl3Qg+jA{<)N=oE;IwznUI$3-Qr zT@x{O{5i0a=BhC-WMeVsDa~D2)Vf8j?x6H~BBj6kk2$LQ1uLa~>vr8UmX}J;K zBjqbH#Bo;sC9*JNW8N!@L*;&2_Z(c$4T=MlBoo>76t=COFg^u~ePX1`9UwiB>_XI~=c&uCDj_7u4hxcvbNmKYz zl|@W~0^Ot_=`pv=kR$pP)S*k;MTyc})k(Qp&acHxo;zv4Dhtq=wr}Pgt%P}oh&Ra@RhLmp3fa!sNr_0x6qn}mne~VbMyX)Oy c-@gmMy!_D$(Cz4B!=E0tzpjNJg7_uyAHTHBdjJ3c diff --git a/FONT/IKONES.FON b/FONT/IKONES.FON deleted file mode 100644 index 36a9495f0ea79027037ad40e14194c0cd83ed46a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8909 zcmeI2J&zj9UW-2?-&APMm>|u)sSBhktOw#svcx zd|Z$a#<^#Jgb*GM)|yEC1PmN#o;M=1Dyw^LPoTX8gPiTkj5i`9A|tc%tG0^YjlYh+ z>pwmJ>-l=~)y)St->-k%eAxc>$;aKR-OIW#F+Aiz5-p zU%p#af4Tk1i|?KPYWZrp9=bCaOk=V zvfdG~3|WO$ScZzf1)Kz`+QPsk>{U3Ny{uwN&&Y?kPSh@*Gj>v1#${NHboeJR@&|&-X%U1m*mEPwk{p+|0=Sk@hx3L#BnBD;b;P z20fjXpQij)45A21qFUUT{)qo*USmV%hye{ADa?kA;i?6(jV9K{(2Ed@N+K?DnIOcG zAYMen$!NwaB$aG3qY$1Yds#r9V_x&s9g z3Z(OqKUhU%R!;ZUpqeMI*#xaKwSYrIowGE;JYdE!BF!pcgH$Tt^7dI8XO1F-ymQXH z_bfbE{+#EFK=41JAczsg@V1KKE)`<94UJ_an_uLHzLJq`71$g5D#*gNQd6Sxe= zbuRGhNX=IMy(x@<%=H1Feuk;dO~8}MtRa^Z;v%~dFuDmNkm#!{fECiyMB2y+*9D~x z`@0LxpXaHUW*r~HV=(jgTuKxzI|jq$F?522tGP%x2AB*_w18dAtC<6jcz|0|3-XXO zH%FM2bJCSsrnSQxlXPksG#j!@RhEbyzb%0#p1+?*(x}|e)&u@P+&lUhOLIzwO^&6b zOj?6-n&DbU##C@@Q5hMfHe1LZ<xmO{0Wg4FS+I?_`yj=I^PgcO zPizR&49uuncArRVzVrr|Zl8CO6A~@drYTZr86Dqb8meunm`ZX|Cj;Vx{>9krQ6b)x zm5^Mxa~eZX1dyK~dl9@p)C6hp>CR6pXjcvI5g%+Rn(Wg(;8w}Bn;(jMibRTFihj|q zssAl(su0dP_D@R|0`p7=c1h^tL83|W>Cl}i)JWOS!Y=kCtj#!$;P57u17!(Gi&QCz z6fGs}?NHg9Y3fZE-NiQ*S*q{%o3hQ|GvQUY{QUO}#!w z8jeWwS`BAg4l{F57~}BBpn)2~IpLIJobT|{%R3#sRXuPD<)vg#3!C(>)DdpWAoc*Fcgj< z3v0TtnO5gkca;;NFoM-NBDiLH1Y|-SK_YAztAD~ktSYaSA<))r)&poL3kj=PM|qGw zCUV`2P$KB(${BF1e%wL?;T1>0hlg($y>Y{Ob*)9~+ICNLo2FWN^hO1I8BnUJe5IqS z6)`xz{yn_SMA8CeX;nYNdS3yjSE!SK#zsCV(@@NrS~H{TFVYf=S~S!w(pA*ORM>H- zPq|p8_FVy=|KMc2-@k}^w1yjX%ItZ3XW|z)on1!BQckJ|Dw9((Z9?fTIwpxMIi<_k zNU~swNHnrlLDG~-_HvYZZ7DmIa@SnUTq?TB$yX~Gcp3zd1$P4by?XtTr17DqAF(ue z8E1MbceVq*sgPr|T}%^mdDmtGp9lXuJT8*uT!DC=Bm%gC@|M?j~MoP-q}pf6=ECi^S=j;vZTV)r*a7;v(8RJj+M|C#3&uf zJyjSli^u&u^4=sP`QUDOo83-nBniDm#)&^EZl_+QsJul+c4f-XI`+$Kdl~iGo{Ev* zL**k4o7q&GUz^~y2+e-XyoV=G5YZksZFH$mGD7#$@VV-DD+$#xVFEg~%VE$X+jXqDJyx=v}r$#`m!?YgwVFyW2uFRZxb`kU~xpEo~< z{z$?+P2k+ybp(!&r#XWoKLsm#l?6kY6u(`)&BMbt?NQo zgXu`wG@!>)bJp?kme*K^86G&K##?62*)k2n3gpfjlOlkU?veb*|0Kv)SwzXCiJvOv Y%vNZv*JmB~gD5aI)lE0K#XTJU1xjMV;{X5v diff --git a/FONT/KNIHA.FON b/FONT/KNIHA.FON deleted file mode 100644 index 371eba44cc69f42ae326ac4d753b1d839998bf51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8880 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 diff --git a/FONT/TIMESBIT.FON b/FONT/TIMESBIT.FON deleted file mode 100644 index 4d7f635b0e379ad2b9d013866ded6b2a1a548a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31710 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 diff --git a/FONT/TIMESE.FON b/FONT/TIMESE.FON deleted file mode 100644 index 460b558cbdb9f4042c2d4f6ffcfa9ea52c8a38de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11547 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 diff --git a/FONT/TINY.FON b/FONT/TINY.FON deleted file mode 100644 index 371eba44cc69f42ae326ac4d753b1d839998bf51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8880 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 GKm83H``u6g diff --git a/INST/SETUP.C b/INST/SETUP.C deleted file mode 100644 index d27dfc8..0000000 --- a/INST/SETUP.C +++ /dev/null @@ -1,1427 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "setup.h" -#include "setvideo.h" -#include "setuplib.h" -#include "setupcpy.h" - -#define TEST_MUSIC "\\SNDTEST.MUS" -#define SETUP_BATCH "SETUP.BAT" -#define _SOURCE_ copy_source_path -#define ER_NAME "c:\\skeldal.!!!" -#define VEL_RAMECEK 8 - -#define VMODE "VMODE" -#define SOUND_DEVICE "SOUND_DEVICE" - -#define SETUP_NAME "SETUP.EXE" - -word *ramecky[VEL_RAMECEK]; - -#define SKELDAL "SKELDAL" -#define SKELDAL_INI SKELDAL".INI" -#define CONCAT(t,s1,s2) strcat(strcpy(t=alloca(strlen(s1)+strlen(s2)+1),s1),s2) -void *bbutt; - -char *copy_source_path; -char *test_sound_name; -char *program_data_path=NULL; -char setup_mode=0; - -char *pgm_name; - -TSTR_LIST setup_ini; - -typedef struct tsound - { - int device,port,irq,dma; - }TSOUND; - - -FILE *ini; -word *vga_font; -word *icones; -word icone_color[7]={0x2108,0x7fff,0x000f,0x4210,0x6f7b}; -//static char target_path[256]="E:\HRY\SKELDAL\"; -char *source_path; -char target_path[2049]; -static TSOUND sound_info={0,0,0,0}; -static int vmode=0; -static char mixer_running=0; -static char back=0; -static char install_type; -static long install_sizes[3]; -static long maxcopy=1; -TSTR_LIST handbook=NULL; -TSTR_LIST dirlist=NULL; -TSTR_LIST disklist=NULL; -int win_handbook=-1; -char rescue_mode=0; -char *inifile=NULL; - -#pragma off (stack_checking) - -static char home_path(char *source_path) - { - unsigned x,z; - _dos_setdrive(source_path[0]-'@',&x); - _dos_getdrive(&z); - if (z!=source_path[0]-'@') return 1; - chdir("\\"); - chdir(source_path); - return 0; - } -char error_device(word a,char b,char c) - { - a,b,c; - - errno=-1; - return _ERR_FAIL; - } - -int create_er_file() - { - FILE *f; - if (!access(ER_NAME,F_OK)) return 0; - - f=fopen(ER_NAME,"w"); - fprintf(f,"7925536\n"); - fprintf(f,"Toto je zachranny soubor pro instalacni program ke hre BRANY SKELDALU. Pokud se posledni instalace nezdarila, nemazte tento soubor!"); - fclose(f); - return 1; - } - -void remove_er_file() - { - FILE *f; - - f=fopen(ER_NAME,"r"); - if (f!=NULL) - { - long l=0; - fscanf(f,"%d",&l); - fclose(f); - if (l==7925536) remove(ER_NAME); - } - } - - -static conv_ramecek(word *ram) - { - int i; - word xs,ys; - char *ptr; - word *targ; - - xs=ram[0]; - ys=ram[1]/VEL_RAMECEK; - ptr=(char *)(ram+3+256); - for(i=0;i"); - } - for(i=0;i"); - set_value(0,20,""); - } - else - { - sprintf(s,"VESA %d.%02d",si.version/256,si.version%256); - set_value(0,10,s); - set_value(0,20,si.oemstr); - } - set_value(0,30,gr_mody[vmode]);do_events(); - sound_detect(&sound_info.device,&sound_info.port,&sound_info.dma,&sound_info.irq); - set_value(0,40,device_name(sound_info.device)); - if (sound_info.device==DEV_WSS || sound_info.device==DEV_ULTRA) - sprintf(s,"Port %X Dma %X",sound_info.port,sound_info.dma); - else sprintf(s,"Port %X Dma %X Irq %X",sound_info.port,sound_info.dma,sound_info.irq); - set_value(0,50,s); - set_value(0,60,get_cdrom()); - set_enable(0,6,1); - set_enable(0,5,1); - } - -static EVENT_PROC(esc_mode2) - { - GET_USER_PTR(); - WHEN_MSG(E_KEYBOARD) - { - if (GET_DATA(char)==27) - { - donegr(); - if (vmode==0)initgr_low();else initgr_spec(vmode); - zobraz_mysku(); - redraw_desktop(); - goto_control(0); - terminate_gui(); - } - } - } - -static char test_mode() - { - char i,j,c; - - if (msg_box("Test grafiky",'\x1', - "Instal�tor nyn� vyzkou�� zvolen� grafick� re�im. " - "Pokud obrazovka z�stane �ern�, nebo zobraz� nesmysly, stiskn�te " - "ESC a instal�tor obnov� p�vodn� re�im.","Start","Zru�it",NULL)==2) return 0; - send_message(E_ADD,E_KEYBOARD,esc_mode2); - donegr(); - i=initgr_spec(f_get_value(0,9)); - if (!i) - { - zobraz_mysku(); - redraw_desktop(); - } - if (!i && (j=msg_box("Test grafiky",'\x2',"Vidi� prost�ed� instal�toru spr�vn�?","Ano","Ne",NULL))==1) - { - vmode=f_get_value(0,9); - if (vmode==0) initgr_low(); - zobraz_mysku(); - c=1; - } - else - { - c_set_value(0,9,vmode); - if (j!=0) - { - donegr(); - if (vmode==0) initgr_low();else initgr_spec(vmode); - zobraz_mysku(); - redraw_desktop(); - } - c=0; - } - send_message(E_DONE,E_KEYBOARD,esc_mode2); - return c; - } - -static TSTR_LIST video_ls=NULL; - -static void create_video_ls() - { - int i; - if (video_ls==NULL) - { - video_ls=create_list(3); - for(i=0;i<3;i++) str_add(&video_ls,gr_mody[i]); - } - } - -static void select_vga() - { - default_font=&font6x9; - def_dialoge(20,300,156,156,"Kvalita grafiky",2); - define(9,0,20,156,80,0,listbox,video_ls,0x03ff,0);c_default(vmode); - property(NULL,vga_font,NULL,WINCOLOR); - define(20,38,5,80,20,3,button,"Zm�nit te�");on_control_change(test_mode); - property(bbutt,NULL,NULL,BUTTONCOLOR); - redraw_window(); - } - - -static void change_dma() - { - int i,j; - - i=f_get_value(0,30); - j=f_get_value(0,35)+3; - if (o_aktual->id==30) - { - c_set_value(0,30,i); - c_set_value(0,35,i-3); - } - else - { - c_set_value(0,30,j); - c_set_value(0,35,j-3); - } - } - -static void select_mode_win() - { - def_dialoge(224,270,192,156,"Instalovat",2); - default_font=&font6x9; - define(10,30,40,132,30,0,button,"Automaticky");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(30,30,80,132,30,0,button,"Podle p��n�");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(40,50,15,92,20,3,button,"Konec");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(stop_copy); - redraw_window(); - } - -static void select_mode_win_setup() - { - def_dialoge(224,270,192,156,"Mo�nosti:",2); - default_font=&font6x9; - define(10,30,40,132,30,0,button,"Nastaven�");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(30,30,80,132,30,0,button,"Odinstalov�n�");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(40,50,15,92,20,3,button,"Konec");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(stop_setup); - redraw_window(); - } - - - -static void device_select() - { - int i,p; - i=f_get_value(0,9); - set_enable(0,40,i!=DEV_ULTRA && i!=DEV_WSS && i!=DEV_NOSOUND && i!=DEV_DAC); - p=i==DEV_SB16 || i==DEV_ULTRA; - set_enable(0,35,p); - if (p==0) - { - c_set_value(0,30,1); - c_set_value(0,35,1-3); - } - set_enable(0,20,i!=DEV_NOSOUND); - set_enable(0,30,i!=DEV_NOSOUND && i!=DEV_DAC); - set_enable(0,50,i!=DEV_NOSOUND); - } - -static void device_select2() - { - int i; - - device_select(); - i=f_get_value(0,9); - if (i==DEV_DAC) - { - char c; - def_dialoge(270,240,100,100,device_name(i),3); - define(10,10,25,60,40,0,radio_butts,3,"LPT 1","LPT 2","PC Speaker");c_default(0); - define(20,10,5,80,20,2,button,"Ok");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - c=f_get_value(0,10); - close_current(); - if (c==0) set_value(0,20,"378");else - if (c==1)set_value(0,20,"278"); - else set_value(0,20,"042"); - } - if (i==DEV_SB16 || i==DEV_ULTRA || i==DEV_SBPRO || i==DEV_SB20 || i==DEV_SB10) - set_value(0,20,"220"); - if (i==DEV_WSS) set_value(0,20,"530"); - } - -static void select_sound(); -static void detect_sound() - { - if (msg_box("Rozpozn�n� zvukov� karty",'\x2',"Opravdu chce� nechat rozpoznat zvukovou kartu? Na n�kter�ch po��ta��ch m��e automatick� rozpozn�v�n� zp�sobit zatuhnut� po��ta�e.","Ano","Ne",NULL)==2) return; - if (mixer_running) stop_mixing(); - mixer_running=0; - set_enable(0,70,mixer_running); - sound_detect(&sound_info.device,&sound_info.port,&sound_info.dma,&sound_info.irq); - close_current(); - select_sound(); - } - -static int sound_win=-1; - -static char sound_scan() - { - char buffer[20]; - char dmas[]={0,1,3,5,6,7}; - char irqs[]={2,3,5,7}; - - sound_info.device=f_get_value(sound_win,9); - if (sound_info.device!=DEV_NOSOUND) - { - if (sound_info.device==DEV_DAC) - if (msg_box("Varov�n�!",'\x1',"Vybran� zvukov� za��zen� pou��v� nestandardn� p��stupy a vyu��v� " - "n�kter�ch skryt�ch trik� syst�mu. Na n�kter�ch po��ta��ch nemus� pracovat spr�vn�. " - "Toto za��zen� nedok��e pracovat pod WINDOWS95 nebo jin�m OS v�jma DOSu. " - "Pro zrychlen� pr�ce odinstalujte ze syst�mu jak�koliv EMM manager (EMM386, QEMM, apod.) " - "Chcete pokra�ovat?","Ano","Ne",NULL)==2) return 1; - get_value(sound_win,20,buffer); - if (sscanf(buffer,"%x",&sound_info.port)!=1) - { - msg_box("Pozor!",'\x1',"Mus�� vyplnit spr�vn� Port","Ok",NULL); - return 1; - } - } - sound_info.dma=dmas[f_get_value(sound_win,30)]; - sound_info.irq=irqs[f_get_value(sound_win,40)]; - return 0; - } - - -static void test_sound() - { - if (mixer_running) stop_mixing(); - if (sound_scan()) return; - set_mixing_device(sound_info.device,22050,sound_info.port,sound_info.dma,sound_info.irq); - start_mixing(); - change_music(test_sound_name); - mix_back_sound(2); - mix_back_sound(0); - mixer_running=1; - set_enable(0,70,mixer_running); - } - -static void stop_sound() - { - if (mixer_running) - { - stop_mixing(); - mixer_running=0; - set_enable(sound_win,70,mixer_running); - } - } - -void select_sound() - { - TSTR_LIST ls; - int i; - char buff[30]; - - ls=create_list(8); - default_font=&font6x9; - for(i=0;i<8;i++) str_add(&ls,device_name(i)); - str_replace(&ls,0,""); - sound_win=def_dialoge(200,300,300,156,"Zvukov� karta",2); - define(9,2,20,170,85,0,listbox,ls,0x03ff,0);c_default(sound_info.device);on_control_change(device_select2); - property(def_border(0,0x4210),vga_font,NULL,WINCOLOR); - define(-1,180,20,1,1,0,label,"Port:"); - define(20,10,20,30,12,1,input_line,3);property(def_border(0,0x4210),vga_font,NULL,WINCOLOR); - set_default(itoa(sound_info.port,buff,16)); - define(-1,180,40,1,1,0,label,"DMA:"); - i=sound_info.dma;i-=(i>2)+(i>4); - define(30,40,40,30,30,1,radio_butts,3,"0","1","3");c_default(i);on_control_change(change_dma); - define(35,10,40,30,30,1,radio_butts,3,"5","6","7");c_default(i-3);on_control_change(change_dma); - define(-1,180,80,1,1,0,label,"IRQ:"); - i=sound_info.irq;i-=2*(i>1)+(i>4)+(i>6); - define(40,40,80,30,40,1,radio_butts,4,"2","3","5","7");c_default(i); - define(50,10,5,80,20,2,button,"Test");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(test_sound); - define(60,100,5,80,20,2,button,"Rozpoznat");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(detect_sound); - define(70,190,5,80,20,2,button,"Stop");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(stop_sound); - redraw_window(); - set_enable(0,70,mixer_running); - device_select(); - } - -static void back_start() - { - back=1; - stop_sound(); - sound_scan(); - while (waktual!=NULL) close_current(); - terminate_gui(); - } - -static void control_window(void *forward,void *back,void *help); -static void control_next1(); - -static void control_back1() - { - close_current(); - get_value(0,60,target_path); - while (waktual!=NULL) close_current(); - exit_wait=0; - select_vga(); - select_sound(); - control_window(control_next1,back_start,open_help); - } - -static trace_chdir(char *what) - { - char *c; - char *d; - - c=alloca(strlen(what)+1); - strcpy(c,what); - d=strrchr(c,'\\'); - while (d!=NULL) - { - if (chdir(c)==0) - { - home_path(c); - return; - } - *d=0; - d=strrchr(c,'\\'); - } - strcat(c,"\\"); - home_path(c); - } - - -void static show_space(char device) - { - char buff[100]; - static long lastvalue; - static char lastdevice; - - device=toupper(device); - if (device>='A' && device<='Z') - { - if (device!=lastdevice) lastvalue=get_disk_free(device-'@')/1024; - sprintf(buff,"Na disku %c: je voln�ch %d Kb",device,lastvalue); - lastdevice=device; - set_value(0,80,buff); - } - } - -static open_load_window() - { - char c; - get_value(0,60,target_path); - trace_chdir(target_path); - getcwd(target_path,2047); - load_window(); - escape(); - home_path(source_path); - c=o_aktual->id==150; - if (c) - { - get_value(0,10,target_path); - } - close_current(); - if (c) - set_value(0,60,target_path); - else - get_value(0,60,target_path); - show_space(target_path[0]); - } - -static char create_ini(char *path,char *name) - { - - if (inifile!=NULL) - { - fclose(ini); - remove(inifile); - free(inifile); - } - inifile=NewArr(char,strlen(path)+strlen(name)+2); - sprintf(inifile,"%s\\%s",path,name); - ini=fopen(inifile,"w"); - if (ini==NULL) return 1; - add_to_list(inifile); - fprintf(ini,"vmode %d\n", vmode); - fprintf(ini,"sound_device %d %x %d %d\n",sound_info.device,sound_info.port,sound_info.dma,sound_info.irq); - fprintf(ini,"sound_mixfreq 22049\n"); - fprintf(ini,"default_map lespred.map\n"); - fprintf(ini,"preload 1\n"); - fprintf(ini,"game_speed 5\n"); - return 0; - } - /* -static char create_setup_batch(char *path,char *name) - { - char *st; - FILE *batch; - - st=alloca(strlen(path)+strlen(name)+2); - sprintf(st,"%s\\%s",path,name); - batch=fopen(st,"w"); - if (batch==NULL) return 1; - fputs( - "@Echo off\n" - ":skok\n" - "Echo Vloz CD \"Brany Skeldalu\" do mechaniky\n" - "Echo a stiskni jakoukoliv klavesu. \n" - "Echo.\n" - "Echo Kombinace CNTR+C prerusi program....\n" - "Pause > NUL\n",batch); - fprintf(batch,"if not exist %s goto skok\n",pgm_name); - fprintf(batch,"%s -s \n",pgm_name); - fclose(batch); - return 0; - } - */ -static void close_ini() - { - if (ini!=NULL) fclose(ini); - } - -static void copy_self(char alloc) - { - static char *t; - - if (alloc) - { - t=NewArr(char,strlen(target_path)+strlen(SETUP_NAME)+2); - sprintf(t,"%s\\%s",target_path,SETUP_NAME); - cpy_file(pgm_name,t); - } - else free(t); - } - -static long self_size() - { - struct find_t f; - - _dos_findfirst(pgm_name,_A_NORMAL,&f); - return f.size; - } - -static void start_install() - { - long diskfree; - 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; - 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); - return; - } - get_script(_SOURCE_,target_path); - switch (o_aktual->id) - { - case 10:install_type=INST_MIN;break; - case 20:install_type=INST_MED;break; - case 30:install_type=INST_MAX;break; - } - maxcopy=install_sizes[install_type]; - diskfree=get_disk_free(target_path[0]-'@'); - if (maxcopy>diskfree) - { - if (msg_box("Nedostatek m�sta!",'\x1',"Instal�tor vypo��tal, �e BS zaberou v�ce m�sta ne� m�te na sv�m disku. " - "Pokud v�ak pou��vate komprima�n� program jako je t�eba DRVSPACE, pak mohou b�t �daje o " - "voln�m m�stu nep�esne. I p�es to, �e nen� voln� m�sto chcete pokra�ovat?","Ano","Ne",NULL)==2) return; - } - else if (maxcopy+1024*1024>diskfree) - { - if (msg_box("M�lo m�sta",'\x2',"Po nainstalov�n� by m�lo zb�t alespo� 1MB pro b�h. Sou�asn� prostor" - "umo��uje hru nainstalovat, av�ak hru nebude mo�n� spustit. Pokra�ovat?","Ano","Ne",NULL)==2) return; - } - maxcopy=maxcopy<<1; - while (waktual!=NULL) close_current(); - cascade_mkdir(target_path); - if (create_ini(target_path,SKELDAL_INI)) - { - msg_box(PRG_HEADER,'\x1',"Nemohu vytvo�it konfigura�n� soubor. Zkontroluj spravnost z�pisu cesty","Ok",NULL); - clean_up(); - return; - } -// create_setup_batch(target_path,SETUP_BATCH); - display_progress(); - stop_sound(); - switch (install_type) - { - case INST_MIN:if (do_script(0) || do_script(-1) || do_script(-2) || do_script(-3)) error=1;break; - case INST_MED:if (do_script(0) || do_script(1) || do_script(-2) || do_script(-3)) error=1;break; - case INST_MAX:if (do_script(0) || do_script(1) || do_script(2) || do_script(3)) error=1; - break; - } - copy_self(1); - cpy_flush(); - copy_self(0); - close_ini(); - if (error) shutdown(),exit(1); - close_current(); - do_events(); - if (!autostart) msg_box("Hotovo",' ',"Hra 'Br�ny Skeldalu' je �sp��n� nainstalov�na. Spu�t�n� prove�te z p��kazov� ��dky naps�n�m 'SKELDAL'","Konec",NULL); - purge_file_list(); - shutdown(); - home_path(target_path); - if (autostart) - { - puts("Chvilicku strpeni..."); - exit(254); - } - else exit(0); - } - -static EVENT_PROC (show_space_event) - { - OBJREC *o; - - o=(OBJREC *)user_ptr; - if (msg->msg==E_KEYBOARD || msg->msg==E_CURSOR_TICK) - { - char *c; - - c=o->data; - if (c[1]==':') - show_space(c[0]); - if (msg->msg==E_KEYBOARD) - *(char *)msg->data=toupper(*(char *)msg->data); - } - } - -static show_space_exit() - { - EVENT_MSG msg; - - msg.msg=E_KEYBOARD; - show_space_event(&msg,(void **)o_aktual); - } - - - -static void rozsah_window() - { - char buff[100]; - char *text="Velikost na HD zhruba %d KB"; - - exit_wait=0; - default_font=&font6x9; - def_dialoge(146,160,348,264,"Rozsah instalace",2); - define(10,10,30,70,30,0,button,"Minim�ln�");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(start_install); - define(-1,90,30,1,1,0,label,"Instaluje jen nejd�le�it�j�� soubory na HD"); - define(-1,90,40,1,1,0,label,"V�e ostatn� se pak na��t� p��mo z CD"); - sprintf(buff,text,install_sizes[0]/1024); - define(-1,90,50,1,1,0,label,buff); - define(20,10,80,70,30,0,button,"St�edn�");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(start_install); - define(-1,90,80,1,1,0,label,"Instaluje v�echny datov� soubory na HD"); - define(-1,90,90,1,1,0,label,"Hudba a video se �tou p��mo z CD"); - sprintf(buff,text,install_sizes[1]/1024); - define(-1,90,100,1,1,0,label,buff); - define(30,10,130,70,30,0,button,"Maxim�ln�");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(start_install); - define(-1,90,130,1,1,0,label,"Instaluje v�e na v�� HD v�etn� hudby"); - define(-1,90,140,1,1,0,label,"a videa. Z CD se nena��t� v�bec nic."); - sprintf(buff,text,install_sizes[2]/1024); - define(-1,90,150,1,1,0,label,buff); - define(40,10,180,70,20,0,button,"Slo�ka");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(open_load_window); - define(60,90,185,250,11,0,input_line,2048);property(def_border(1,0x4210),&font6x9,NULL,0x7fff); - set_default(target_path); - on_event(show_space_event);on_exit(show_space_exit); - define(70,40,220,200,10,0,check_box,"Po nainstalov�n� hru automaticky spustit.");c_default(1); - define(80,10,10,250,11,2,view_line,100);set_default(""); - show_space(target_path[0]); - } - -static void automatic_window() - { - char buff[100]; - char *text="Hra zabere zhruba %d KB m�sta"; - - exit_wait=0; - default_font=&font6x9; - def_dialoge(110,200,420,80,"Instalovat kam?",2); - define(40,10,33,70,15,0,button,"Naj�t");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(open_load_window); - define(60,90,35,310,11,0,input_line,2048);property(def_border(1,0x4210),&font6x9,NULL,0x7fff); - set_default(target_path); - on_event(show_space_event);on_exit(show_space_exit); - define(10,10,10,70,20,2,button,"Start");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(start_install); - define(20,90,10,70,20,2,button,"<< Zp�t");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(back_start); - sprintf(buff,text,install_sizes[0]/1024); - define(90,180,20,200,10,2,view_line,100);set_default(buff); - define(80,180,10,200,10,2,view_line,100);set_default(""); - show_space(target_path[0]); - redraw_window(); - } - - - -static void control_next1() - { - sound_scan(); - while (waktual!=NULL) close_current(); - rozsah_window(); - control_window(NULL,control_back1,open_help); - } - -static void control_window(void *forward,void *back,void *help) - { - def_dialoge(524,300,96,156,"Mo�nosti",2); - define(10,8,30,80,20,0,button,"Dal�� >>");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(forward); - define(20,8,60,80,20,0,button,"<< Zp�t");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(back); - define(30,8,90,80,20,0,button,"? Pomoc");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(help); - define(40,8,10,80,20,3,button,"Konec");property(bbutt,&font6x9,NULL,BUTTONCOLOR); - if (setup_mode) on_control_change(stop_setup);else on_control_change(stop_copy); - set_enable(0,10,forward!=NULL); - set_enable(0,20,back!=NULL); - set_enable(0,30,help!=NULL); - redraw_window(); - } - -static void run_setup() - { - int id; - - while (waktual!=NULL) close_current(); - get_script(_SOURCE_,""); - { - int minus[3]; - minus[1]=check_size(-2)+check_size(-3); - minus[0]=minus[1]+check_size(-1); - install_sizes[0]=check_size(0)+self_size(); - install_sizes[1]=install_sizes[0]+check_size(1); - install_sizes[2]=install_sizes[1]+check_size(2)+check_size(3); - install_sizes[0]+=minus[0]; - install_sizes[1]+=minus[1]; - id; - } - if (all_finder()) - { - char *c; - getcwd(&target_path,2047); - c=strchr(target_path,0); - c--; - if (*c=='\\') *c=0; - strcat(target_path,"\\"SKELDAL); - } - else - { - target_path[0]=select_disk()+'@'; - target_path[1]=':'; - target_path[2]='\\'; - strcpy(target_path+3,SKELDAL); - } - do - { - home_path(source_path); - back=0; - select_mode_win(); - about_window(); - id=o_aktual->id; - close_current(); - close_current(); - exit_wait=0; - if (id==10) - { - autodetect(); - automatic_window(); - } - if (id==30) - { - if (msg_box("Autodetekce?",'\x1',"Chcete nejprve provest autodetekci hardware?","Ano","Ne",NULL)==1) autodetect(); - select_vga(); - select_sound(); - control_window(control_next1,back_start,open_help); - } - if (id!=40) escape(); - } - while (back); - } - -static void save_ini() - { - char c[50]; - char d; - char err=1; - - if (sound_scan()) return; - d=msg_box("Potvrzen�?",'\x2',"Chce� zapsat zm�ny do konfigura�n�ho souboru hry?","Ano","Ne","Zru�it",NULL); - if (d==3) return; - if (d==1) - { - sprintf(c,"%d %x %d %d",sound_info.device, - sound_info.port, - sound_info.dma, - sound_info.irq); - add_field_txt(&setup_ini,SOUND_DEVICE,c); - add_field_num(&setup_ini,VMODE,vmode); - home_path(target_path); - err=save_config(setup_ini,SKELDAL_INI); - } - shutdown(); - home_path(target_path); - switch (err) - { - case -1:puts("Pri ukladani se objevila neocekavana chyba. Soubor "SKELDAL_INI" nebyl ulozen");break; - case 0:puts("Nastaveni bylo ulozeno..."); break; - case 1:puts("Nastaveni nebylo zmeneno..."); break; - } - exit(0); - } - -static void deinstall() - { - char ig; - int x,y; - def_dialoge(200,200,250,156,"Odinstalovat?",2); - define(-1,10,30,200,100,0,label,"Tato volba odstran� hru z va�eho disku."); - define(-1,10,40,200,100,0,label,"Pot� ji� nebude mo�ne hru spustit"); - define(-1,10,50,200,100,0,label,"do nov�ho nainstalov�n� z CD."); - define(10,30,80,150,10,0,check_box,"Zachovat ulo�en� pozice");c_default(1); - define(20,10,10,80,30,3,button,"Ano");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(30,10,10,80,30,2,button,"Proboha NE");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - if (o_aktual->id==30) - { - close_current(); - return; - } - ig=f_get_value(0,10); - set_enable(0,30,0); - set_enable(0,20,0); - set_enable(0,10,0); - do_events(); - home_path(target_path); - cascade_delete(ig); - chdir(".."); - rmdir(target_path); - home_path(source_path); - curcolor=0; - for(x=319;x>-1;x-=2) - { - y=x*240/320;bar(x,y,639-x,479-y);showview(0,0,0,0); - } - shutdown(); - exit(0); - } - -static void run_resetup() - { - int id; - - while (waktual!=NULL) close_current(); - do - { - home_path(source_path); - back=0; - select_mode_win_setup(); - about_window(); - id=o_aktual->id; - close_current(); - close_current(); - exit_wait=0; - if (id==30) - { - deinstall(); - back=1; - } - if (id==10) - { - select_vga(); - select_sound(); - control_window(save_ini,back_start,NULL); - } - if (id!=40) escape(); - } - while (back); - } - - -#define REPEAT(i,cnt) for(i=0;i=2 && argv[1][0]=='-' && toupper(argv[1][1])=='S') || access(SKELDAL_INI,F_OK)==0) - { - char *c; - char *d; - setup_mode=1; - getcwd(target_path,PATH_MAX+1); - setup_ini=read_config(SKELDAL_INI); - if (setup_ini==NULL) - { - printf("The file %s has not been found. You must reinstall the game\n" - "Insert the CD into driver and run INSTALL.EXE\n",SKELDAL_INI); - printf("Nemohu najit soubor %s. Budes muset hru znovu nainstalovat\n" - "Z CD \"Brany Skeldalu\" spust program INSTALL.EXE\n",SKELDAL_INI); - exit(0); - } - get_num_field(setup_ini,VMODE,&vmode); - c=get_text_field(setup_ini,"CESTA_CD"); - program_data_path=NewArr(char,strlen(c)+1);strcpy(program_data_path,c); - c=strchr(program_data_path,0); - if (c>program_data_path && c[-1]=='\n') c[-1]=0,c--; - if (c>program_data_path && c[-1]=='\\') c[-1]=0; - c=get_text_field(setup_ini,SOUND_DEVICE); - sscanf(c,"%d %x %d %d",&sound_info.device, - &sound_info.port, - &sound_info.dma, - &sound_info.irq); - c=alloca(strlen(argv[0])+1); - strcpy(c,argv[0]); - d=strrchr(c,'\\'); - if (d!=NULL) - { - d[d-c<=2]=0; - home_path(c); - } - } - } - -main(int argc,char **argv) - { - char s; - char *c; - - pgm_name=argv[0]; - check_setup_mode(argc,argv); - if (argc==2 && !setup_mode) copy_source_path=argv[1];else copy_source_path=NULL; - if (!setup_mode) - { - _setvideomode(_TEXTC80); - rescue_mode=!(s=create_er_file()); - if (s && !setup_mode) warning(),getche(); - } - else - s=0; - init_setup(s); - create_video_ls(); - set_mixing_device(0,22050,0,0,0); - c=test_sound_name=NewArr(char, strlen(program_data_path)+strlen(TEST_MUSIC)+1); - sprintf(c,"%s%s",program_data_path,TEST_MUSIC); - if (access(c,F_OK)!=0) - { - shutdown(); - printf("Vloz CD \"Brany Skeldalu\" do jednotky CD-ROM a spust znova instalaci\n" - "Insert CD \"The Gates of the Skeldal\" into CD-ROM and try to run INSTALL again.\n"); - abort(); - } - konec_skladby=skladba_konec; - change_music(c); - mix_back_sound(2); - if (setup_mode) run_resetup(); - else - { - if (!rescue_mode) run_setup(); - if (rescue_mode) - { - ask_video(); - escape(); - } - } - shutdown(); - } diff --git a/INST/SETUP.H b/INST/SETUP.H deleted file mode 100644 index 14263b1..0000000 --- a/INST/SETUP.H +++ /dev/null @@ -1,18 +0,0 @@ -extern word ikones; -extern word boldcz; -extern word sipka; -extern word font6x9; -extern void *bbutt; -extern word *vga_font; -extern word *icones; -extern word icone_color[]; -extern word ramecek; -extern word *ramecky[]; - -//#define WINCOLOR 0x6318 -#define WINCOLOR (31*1024+31*32+26) -#define LABELCOLOR (11*1024+11*32+06) -#define BUTTONCOLOR (28*1024+24*32+3) -#define PRG_HEADER "Brny Skeldalu Setup v1."VERSION - -extern FILE *ini; diff --git a/INST/SETUPCPY.C b/INST/SETUPCPY.C deleted file mode 100644 index 993be65..0000000 --- a/INST/SETUPCPY.C +++ /dev/null @@ -1,165 +0,0 @@ -#include -#include -#include -#include -#include "setupcpy.h" - -#define DATASIZE 32768 -#define INFOBLOCK 1 -#define DATABLOCK 2 -#define ERRORBLOCK 3 - -typedef struct tdatablock - { - void *next; - char block_type; - unsigned short load_size; - char data[DATASIZE]; - }TDATABLOCK; - -typedef struct tinfoblock - { - void *next; - char block_type; - char pathname[2]; - }TINFOBLOCK; - -static void *start=NULL; -static void *end=NULL; -static FILE *cpyout=NULL; -static long progress=0; - -void (*cpy_error)(int,char *); -void (*mem_error_next)(long); - -void (*cpy_progress)(long); - - -static void *alloc_file(char *target_name) - { - TINFOBLOCK *p; - - p=(TINFOBLOCK *)getmem(sizeof(TINFOBLOCK)+strlen(target_name)); - strcpy(p->pathname,target_name); - p->next=NULL; - p->block_type=INFOBLOCK; - return p; - } - -static void *alloc_data() - { - TDATABLOCK *p; - - p=New(TDATABLOCK); - p->next=NULL; - p->load_size=0; - p->block_type=DATABLOCK; - return p; - } - - -static void *load_data(FILE *f) - { - TDATABLOCK *p; - int rc; - int retry=0; - void *end_line; - - p=end_line=alloc_data(); - again: - errno=0; - rc=fread(p->data,1,sizeof(p->data),f); - p->load_size=rc; - if (ferror(f) || rc!=sizeof(p->data) && errno!=0) - { - if (retry) retry--; - else cpy_error(CPERR_READ,NULL); - fseek(f,-rc,SEEK_CUR); - errno=0; - goto again; - } - progress+=p->load_size; - cpy_progress(progress); - return end_line; - } - -static error_mem(long size) - { - TDATABLOCK *p; - TINFOBLOCK *q; - int rc; - - size; - if (start==NULL) mem_error_next(size); - while (start!=NULL) - { - p=start; - q=start; - if (q->block_type==INFOBLOCK) - { - if (cpyout!=NULL) fclose(cpyout); - again: - cpyout=fopen(q->pathname,"wb"); - if (cpyout==NULL) - { - cpy_error(CPERR_OPEN,q->pathname); - goto again; - } - start=q->next; - free(q); - } - else if (p->block_type==DATABLOCK) - { - again2: - rc=fwrite(p->data,1,p->load_size,cpyout); - if (rc!=p->load_size) - { - cpy_error(CPERR_WRITE,q->pathname); - fseek(cpyout,-rc,SEEK_CUR); - goto again2; - } - progress+=p->load_size; - cpy_progress(progress); - start=p->next; - free(p); - } - } - end=NULL; - } - -void cpy_file(char *source,char *target) - { - FILE *f; - TDATABLOCK *p; - TINFOBLOCK *q; - - again: - errno=0; - f=fopen(source,"rb"); - if (f==NULL) - { - cpy_error(CPERR_OPEN,source); - goto again; - } - q=alloc_file(target); - if (start==NULL) start=end=q;else end=(((TDATABLOCK *)end)->next=q); - while (!feof(f)) - { - p=load_data(f); - if (start==NULL) start=end=p;else end=(((TDATABLOCK *)end)->next=p); - } - fclose(f); - } - -void cpy_flush() - { - if (start!=NULL)error_mem(0); - if (cpyout!=NULL)fclose(cpyout); - cpyout=NULL; - } - -void install_cpy() - { - mem_error_next=mem_error; - mem_error=error_mem; - } diff --git a/INST/SETUPCPY.H b/INST/SETUPCPY.H deleted file mode 100644 index e46a382..0000000 --- a/INST/SETUPCPY.H +++ /dev/null @@ -1,9 +0,0 @@ -#define CPERR_OPEN 1 -#define CPERR_WRITE 2 -#define CPERR_READ 3 - -extern void (*cpy_error)(int,char *); -extern void (*cpy_progress)(long); -void cpy_file(char *source,char *target); -void cpy_flush(); -void install_cpy(); diff --git a/INST/SETUPLIB.C b/INST/SETUPLIB.C deleted file mode 100644 index 658a586..0000000 --- a/INST/SETUPLIB.C +++ /dev/null @@ -1,505 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "setuplib.h" -#include "setupcpy.h" -#include "setup.h" - -#define COPY "COPY" -#define MKDIR "MKDIR" -#define INI "INI" - -#define DIR_NAMES 6 -char *dirnames[]= - { - "GAMES.*", - "GAME*.*", - "HRY.*", - "ZABAVA.*", - "SKELDAL", - "NAPOLEON", - }; - -TSTR_LIST file_list=NULL; - -static void done_bar_init(OBJREC *o,long *params) - { - o->userptr=New(long); - *(long *)o->userptr=*params; - } - -static void done_bar_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - long value,max,x3; - - value=*(long *)o->data; - max=*(long *)o->userptr; - x3=x1+(x2-x1)*value/max; - if (x3<=x1) x3=x1; - if (x3>=x2) x3=x2; - bar(x3,y1,x2,y2); - curcolor=o->f_color[1]; - bar(x1,y1,x3,y2); - } - -void done_bar(OBJREC *o) //define(...done_bar,max); - { - o->call_init=done_bar_init; - o->call_draw=done_bar_draw; - o->datasize=4; - } - - - -char select_disk() - { - char last=3; - struct diskfree_t ds; - int max=0,i; - long now; - - for(i=('C'-'@');i<('Z'-'@');i++) - { - if (_dos_getdiskfree(i,&ds)==0) - { - now=ds.avail_clusters*ds.sectors_per_cluster*ds.bytes_per_sector; - if (now>max) - { - max=now; - last=i; - } - } - } - return last; - } - -char dir_finder() - { - struct find_t ft; - int i; - int rc; - - for(i=0;imax && sz[j]datasize=(*len)+1; - } - -static void view_line_draw(int x1,int y1, int x2, int y2, OBJREC *o) - { - char *c; - - bar(x1,y1,x2,y2); - c=(char *)o->data; - if (!*c) return; - set_aligned_position(x2,y1,2,0,c); - outtext(c); - } - - -void view_line(OBJREC *o) - { - o->call_init=view_line_init; - o->call_draw=view_line_draw; - } - - -char get_max_res() - { - if (vesasupport(0x110)) return 2; - if (vesasupport(0x100)) return 1; - return 0; - } - -void add_to_list(char *name) - { - if (file_list==NULL) file_list=create_list(256); - str_add(&file_list,name); - } - -static void copy_1_file(char *init_mask,char *filename,char *target) - { - char *c,*d; - - c=alloca(strlen(init_mask)+strlen(filename)+1); - strcpy(c,init_mask); - d=strrchr(c,'\\'); - d++; - strcpy(d,filename); - d=alloca(strlen(target)+strlen(filename)+10); - strcpy(d,target); - if (d[0]==0 || d[strlen(d)-1]!='\\') strcat(d,"\\"); - strcat(d,filename); - set_value(0,20,filename); - add_to_list(d); - cpy_file(c,d); - } - -static void copy_files(char *param) - { - struct find_t ft; - char *source_mask; - char *target; - int rc; - - target=strchr(param,' '); - if (target==NULL) return; - source_mask=alloca(target-param); - source_mask[target-param]=0; - strncpy(source_mask,param,target-param); - target++; - rc=_dos_findfirst(source_mask,_A_NORMAL,&ft); - while (rc==0) - { - copy_1_file(source_mask,ft.name,target); - rc=_dos_findnext(&ft); - } - _dos_findclose(&ft); - } - -char cascade_mkdir(char *path) - { - char *c; - char d; - - if (path[0]==0||path[1]==':' && path[2]==0) return 0; - if (!access(path,F_OK)) return 0; - c=strrchr(path,'\\'); - if (c==NULL) return 0; - *c=0; - d=cascade_mkdir(path); - *c='\\'; - if (d==1) return 1; - if (mkdir(path)!=0) return 1; - add_to_list(path); - return 0; - } - - -static char add_to_ini(char *params) - { - return fprintf(ini,"%s\n",params)<0; - } - -static char *commands[]= - { - COPY, - MKDIR, - INI, - }; - -static char (*calls[])(char *params)= - { - copy_files, - cascade_mkdir, - add_to_ini, - }; - - - -static char command_match(char *cmd,char *test,char **params) - { - while (*test) if (toupper(*cmd++)!=toupper(*test++)) return 0; - if (*cmd!=' ') return 0; - *params=cmd+1; - return 1; - } - - -char do_script(int section) - { - int pos; - int num; - int str_siz=str_count(script); - char *command; - - for(pos=0;pos"); - } - return s; - } - -char validate_path(char *path) - { - unsigned disk; - unsigned cdisk,lastdrv; - char *c,ll=0,tt=0,d; - - static char valid[]="$%'_@{}~`#()&-"; - - if (path==NULL || path[0]==0 || path[1]!=':' || path[2]!='\\') return 0; - disk=toupper(path[0]); - if (disk<'A' || disk>'Z') return 0; - _dos_getdrive(&cdisk); - disk-='@';_dos_setdrive(disk,&lastdrv); - _dos_getdrive(&lastdrv); - disk=(disk==lastdrv); - _dos_setdrive(cdisk,&lastdrv); - if (!disk) return 0; - c=path+2;ll=0; - while (*c) - { - d=toupper(*c); - if (d=='\\') - if (ll) return 0;else ll=1,tt=0; - else - if (d>='A' && d<='Z' || d>='0' && d<='9' || strchr(valid,d)!=NULL || d>127) ll=0; - else if (d=='.') if (tt) return 0;else tt=1; - else return 0; - c++; - } - if (ll) return 0; - return 1; - } - -void clean_up() - { - int i,cnt; - if (file_list==NULL) return; - cnt=str_count(file_list); - for(i=cnt-1;i>=0;i--) if (file_list[i]!=NULL) - { - if (remove(file_list[i])) rmdir(file_list[i]); - } - release_list(file_list); - file_list=NULL; - } - -void purge_file_list() - { - if (file_list==NULL) return; - release_list(file_list); - file_list=NULL; - } - -char cascade_delete(char ignore_sav) - { - struct find_t f; - int rc; - - rc=_dos_findfirst("*.*",_A_SUBDIR,&f); - while (rc==0) - { - if (f.attrib & _A_SUBDIR) - { - if (f.name[0]!='.') - { - chdir(f.name); - cascade_delete(ignore_sav); - chdir(".."); - rmdir(f.name); - } - } - else - { - char *c=strchr(f.name,'.'); - - if (c!=NULL) - { - strupper(c); - if (!ignore_sav || strncmp(c,".SAV",4)) remove(f.name); - } - else remove(f.name); - } - rc=_dos_findnext(&f); - } - return 0; - } diff --git a/INST/SETUPLIB.H b/INST/SETUPLIB.H deleted file mode 100644 index 7928d30..0000000 --- a/INST/SETUPLIB.H +++ /dev/null @@ -1,22 +0,0 @@ -char all_finder(); -char select_disk(); -char read_script(char *filename,char *source_path,char *target_path); -long check_size(int gr); -long get_disk_free(char disk); -void view_line(OBJREC *o); -char *get_cdrom(); -char get_max_res(); -char do_script(int); -void done_bar(); //define(...done_bar,max); -char cascade_mkdir(char *path); -char validate_path(char *path); -char cascade_delete(char ignore_sav); //maze soubory a podadresare. Pripadne ignoruje soubory SAV - -void clean_up(); //maze zkopirovane soubory a adresare -void purge_file_list(); -void add_to_list(char *name); - - -#define INST_MIN 0 -#define INST_MED 1 -#define INST_MAX 2 diff --git a/INST/SETVIDEO.C b/INST/SETVIDEO.C deleted file mode 100644 index 3898652..0000000 --- a/INST/SETVIDEO.C +++ /dev/null @@ -1,197 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "setup.h" - -static void *xlat256=NULL; -static void *xlat16=NULL; - -static void create_xlats() - { - if (xlat256==NULL) xlat256=create_special_palette(); - if (xlat16==NULL) xlat16=create_blw_palette16(); - } - - -static void initgr_common() - { - register_ms_cursor(&sipka); - init_mysky(); - hranice_mysky(0,0,639,479); - update_mysky(); - schovej_mysku(); - bar(0,0,639,479); - showview(0,0,0,0); - } - -int initgr_auto() - { - int vmode; - create_xlats(); - vmode=2; - if (initmode32()) - { - vmode=1; - if (initmode256(xlat256)) - { - vmode=0; - initmode16(xlat16); - } - } - initgr_common(); - return vmode; - } - -int initgr_spec(int vmode) - { - int i=-1; - create_xlats(); - switch (vmode) - { - case 0:i=initmode_lo(xlat256);break; - case 1:i=initmode256(xlat256);break; - case 2:i=initmode32();break; - } - initgr_common(); - return i; - } - -void initgr_low() - { - create_xlats(); - initmode16(xlat16); - initgr_common(); - } - -void donegr() - { - closemode(); - done_mysky(); - } - -void kresli_okno(WINDOW *w) - { - int x,y; - int xs,ys,xsr,ysr; - int x1,y1,xs1,ys1; - int i,j; - - xsr=ramecky[0][0]; - ysr=ramecky[0][1]; - x1=w->x-12; - y1=w->y-12; - xs1=w->xs+24; - ys1=w->ys+24; - xs=xs1/xsr; - ys=ys1/ysr; - curcolor=w->color; - bar(w->x,w->y,w->x+w->xs,w->y+w->ys); - for(j=0,y=y1;jx; - y=waktual->y; - } - name; - highlight(&ctl,WINCOLOR); - ctl.bsize=2;ctl.ctldef=0; - x+=20;y+=20; - memcpy(fc,flat_color(0x7fe0),sizeof(FC_TABLE)); - fc[0]=0x0000; - if (x+xs>MAX_X-2) x=MAX_X-2-xs; - if (y+ys>MAX_Y-2) y=MAX_Y-2-ys; - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - q=desktop_add_window(p); - define(0,2,2,xs-5-20*(xs>=70),14,0,win_label,name); - ctl.bsize=1;ctl.ctldef=1; - o_end->autoresizex=1; - property(&ctl,vga_font,&fc,LABELCOLOR); - if (xs>=70) - { - define(1,1,1,19,16,1,button,"\x0f"); - property(NULL,icones,&icone_color,WINCOLOR);on_control_change(close_current); - } - return q; - } - -int def_dialoge(word x,word y,word xs, word ys, char *name,char modal) - { - CTL3D ctl; - FC_TABLE fc; - WINDOW *p; - int i; - - memcpy(fc,flat_color(0x7fe0),sizeof(FC_TABLE)); - if (modal & 0x2) - { - ctl.bsize=12; - xs=((xs+6)/12)*12; - ys=((ys+6)/12)*12; - } - else - memcpy(&ctl,def_border(2,WINCOLOR),sizeof(CTL3D)); - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - i=desktop_add_window(p); - if (modal & 1) set_window_modal(); - memcpy(&ctl,def_border(5,WINCOLOR),sizeof(CTL3D)); - if (name!=NULL) - { - define(0,2,2,xs-4,14,0,win_label,name); - o_end->autoresizex=1; - property(&ctl,vga_font,&fc,LABELCOLOR); - } - if (modal & 0x2) p->draw_event=kresli_okno; - return i; - } - -void def_listbox(int id,word x,word y,word xs,word ys,TSTR_LIST ls,int ofs,int color) - { - CTL3D b1,b2; - word black[]={0,0,0,0,0,0}; - - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - define(id+1,x+xs+4,y+18,15,ys-35,0,scroll_bar_v,0,10,1,0x0200); - property(&b2,NULL,NULL,WINCOLOR); - define(id+2,x+xs+4,y,14,14,0,scroll_button,-1,0,"\x4"); - property(&b1,icones,black,WINCOLOR);on_control_change(scroll_support); - define(id+3,x+xs+4,y+ys-14,14,14,0,scroll_button,1,10,"\6"); - property(&b1,icones,black,WINCOLOR);on_control_change(scroll_support); - define(id,x,y,xs,ys,0,listbox,ls,color,ofs); - property(&b2,NULL,NULL,WINCOLOR); - } - diff --git a/INST/SETVIDEO.H b/INST/SETVIDEO.H deleted file mode 100644 index dce03e5..0000000 --- a/INST/SETVIDEO.H +++ /dev/null @@ -1,6 +0,0 @@ -int initgr_auto(); -void initgr_low(); -int initgr_spec(int vmode); -void donegr(); -int def_dialoge(word x,word y,word xs, word ys, char *name,char modal); -void def_listbox(int id,word x,word y,word xs,word ys,TSTR_LIST ls,int ofs,int color); diff --git a/INST/STUB.C b/INST/STUB.C deleted file mode 100644 index c059d9b..0000000 --- a/INST/STUB.C +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include -#include -#include -#include -#define QUIET x - -/* Add environment strings to be searched here */ -char *paths_to_check[] = { - "DOS4GPATH", - "PATH"}; - -char *dos4g_path() -{ - static char fullpath[80]; - int i; - - for( i = 0; - i < sizeof( paths_to_check ) / sizeof( paths_to_check[0] ); i++ ) { - _searchenv( "dos4gw.exe", paths_to_check[i], fullpath ); - if( fullpath[0] ) return( &fullpath ); - } - for( i = 0; - i < sizeof( paths_to_check ) / sizeof( paths_to_check[0] ); i++ ) { - _searchenv( "dos4g.exe", paths_to_check[i], fullpath ); - if( fullpath[0] ) return( &fullpath ); - } - return( "dos4gw.exe" ); -} - -main( int argc, char *argv[] ) -{ - char *av[4]; - auto char cmdline[128]; - int i; - av[0] = dos4g_path(); /* Locate the DOS/4G loader */ - av[1] = argv[0]; /* name of executable to run */ - av[2] = getcmd( cmdline ); /* command line */ - av[3] = NULL; /* end of list */ -#ifdef QUIET - putenv( "DOS4G=QUIET" ); /* disables DOS/4G Copyright banner */ -#endif - printf("Instalator Brny Skeldalu (C)1997 Napoleon gameS Nahrvm... \n"); - i=spawnvp(P_WAIT, av[0], av ); - if (i==254) - execl(av[0],av[0],"SKELDAL.EXE",NULL);else exit(0); - puts( "Chyba pri nacitani extenderu:" ); - puts( av[0] ); - puts( "\nZkontrolujte zda-li je k dosazeni na aktualnim adresari\n" - "popripade specifikujte jeho v cestu v systemove promenne:\n" - "SET DOS4GPATH=disk:\\cesta\n"); - exit( 1 ); /* indicate error */ -} diff --git a/INST/TEXTLIB.ASM b/INST/TEXTLIB.ASM deleted file mode 100644 index 3ec6511..0000000 --- a/INST/TEXTLIB.ASM +++ /dev/null @@ -1,101 +0,0 @@ -.model small -.386 - -SEGB800 equ 0b8000h - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - -public load_font_ -load_font_: ;esi font - mov esi,offset fonttable - mov edx,3c4h - mov eax,0402h - out dx,ax - mov eax,0704h - out dx,ax - Mov edx,3ceh - mov eax,0204h - out dx,ax - mov eax,0005h - out dx,ax - mov eax,0406h - out dx,ax - mov edi,0xA0000h - mov edx,256 -lfOpk: mov ecx,16 - rep movsb - add edi,16 - dec edx - jne lfopk - mov edx,3c4h - mov eax,0302h - out dx,ax - mov eax,0304h - out dx,ax - Mov edx,3ceh - mov eax,0004h - out dx,ax - mov eax,1005h - out dx,ax - mov eax,0E06h - out dx,ax - ret - -public set_font_8x8_ -set_font_8x8_: - cli - mov edx,3d4h - mov eax,0100h - out dx,ax - mov edx,3c4h - mov al,1 - out dx,al - inc edx - in al,dx - or al,1 - out dx,al - mov edx,03dah - in al,dx - mov edx,03c0h - mov al,13h - out dx,al - mov al,0 - out dx,ax - mov al,32 - out dx,al - mov edx,3d4h - mov eax,0300h - out dx,ax - sti - ret - -public turn_flashing_ ;ebx - ON/OFF -turn_flashing_: - mov eax,1003h - int 10h - ret - - -public get_window_size_ ;eax,edx-velikost -get_window_size_: - imul eax,edx - shl eax,1 - add eax,4 - ret - -public save_window_ ;eax,edx-pozice - ;ecx,ebx-velikost - ;edi - buffer -save_window_ - stosb - imul eax,160 - lea eax,[eax+edx*2] - lea esi,[eax+SEGB800] - mov al,dl - stosb - mov al,bl - mov ah,cl - stosw - mov edx,ebx diff --git a/INST/TEXTLIB.C b/INST/TEXTLIB.C deleted file mode 100644 index fd40910..0000000 --- a/INST/TEXTLIB.C +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/MAPS/CDIALOGY.C b/MAPS/CDIALOGY.C deleted file mode 100644 index c20c909..0000000 --- a/MAPS/CDIALOGY.C +++ /dev/null @@ -1,585 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define P_STRING 1 -#define P_SHORT 2 -#define P_VAR 3 -#define TEMP_NAME1 "cdialogy.$$$" -#define SCRIPT "dialogy.scr" - -typedef struct t_paragraph - { - unsigned num:15; - unsigned alt:15; - unsigned visited:1; - unsigned first:1; - long position; - }T_PARAGRAPH; - - -char *pgf_name=NULL; - -T_PARAGRAPH *pgf_list=NULL; -int pgf_count=0; -char *program; -int prog_size=0; -int prog_pos=0; -int last_pgf; -int sentencs=0; -int libs=0; - -FILE *f; -FILE *mlist; - -#define newline(f) {int c;while ((c=fgetc(f))!='\n' && c!=EOF);} -#define get_cislo(f,cislo) fscanf(f,"%d",cislo);newline(f) -#define get_command(f,cislo) fscanf(f,"%c%d",cislo,cislo);newline(f) - -static int basic_num; -static int abs_num; -static int last_dialoge; -static int standard_jump; -static char sentence; -static char sub_mode,b_closed=1; - -static int open_level=0; -static int iff_mode=0; -static char was_sub=0; -#define IF_JUMP 1 -#define IF_NOT_JUMP 2 -#define IF_ELSE 3 - -typedef struct if_record - { - int level; - int pointer; - }IF_RECORD; - -int if_ptr=0; - -#define IF_LEN 32 - -static IF_RECORD if_data[IF_LEN]; - -int init(char *c) - { - prog_size=163840; - prog_pos=0; - program=malloc(prog_size); - f=fopen(c,"rt"); - if (f==NULL) return 1; - return 0; - } - -void error(char *c) - { - printf("%s v odstavci %d (Dialog %d Sentence %d).",c,last_pgf,basic_num/128,last_pgf); - exit(1); - } - -void resize(void **p,int newsize) - { - void *q; - - if (*p==NULL) q=malloc(newsize);else - { - q=malloc(newsize); - if (q!=NULL) - { - memcpy(q,*p,_msize(*p)); - free(*p); - } - } - if (q==NULL) - { - puts("Nedostatek pamti"); - exit(1); - } - *p=q; - } - -void check_prog_space(int num) - { - if (prog_pos+num>prog_size-16) - { - prog_size+=163840; - resize(&program,prog_size); - } - } - -void add_byte(char byte) - { - check_prog_space(1); - program[prog_pos++]=byte; - } - -void add_short(short i) - { - add_byte(P_SHORT); - check_prog_space(2); - *(short*)(program+prog_pos++)=i; - prog_pos++; - } - -void add_var(short i) - { - add_byte(P_VAR); - check_prog_space(2); - *(short*)(program+prog_pos++)=i; - prog_pos++; - } - -void copy_short(FILE *f) - { - int c; - int i; - c=fgetc(f); - if (c=='&') - { - get_cislo(f,&i); - add_var(i); - } - else - { - if (isdigit(c)) ungetc(c,f); - get_cislo(f,&i); - add_short(i); - } - } - -void add_string(char *c) - { - add_byte(P_STRING); - check_prog_space(strlen(c)+1); - while (*c && *c!='\n') program[prog_pos++]=*c++; - program[prog_pos++]=0; - } - -void add_pgf(T_PARAGRAPH *p) - { - resize(&pgf_list,sizeof(*p)*(pgf_count+1)); - memcpy(pgf_list+pgf_count,p,sizeof(*p)); - pgf_list[pgf_count].position=prog_pos; - pgf_list[pgf_count].visited=0; - pgf_list[pgf_count].first=0; - if (pgf_name!=NULL) - { - fprintf(mlist,"%6d %s\n",pgf_list[pgf_count].num,pgf_name); - free(pgf_name); - pgf_name=NULL; - } - pgf_count++; - } - -void decode_pgf1(char *c) //c je text bez vykricniku - { - int pn,an,i; - T_PARAGRAPH p; - char relative=0; - if (*c=='!') - { - relative=1; - c++; - } - i=sscanf(c,"%d",&pn); - if (relative) pn+=abs_num;else abs_num=pn; - if (i!=1) error("Chybn pouit znaku \"!\""); - last_pgf=pn; - c=strchr(c,','); - if (c==NULL) an=pn; - else - { - c++; - i=sscanf(c,"%d",&an); - if (i!=1) error("Oekv se slo alternativnho odstavce"); - } - p.num=pn; - p.alt=an; - add_pgf(&p); - } - -void js_dialoge(FILE *f) - { - int parm1; - T_PARAGRAPH pgf; - - if (!b_closed) error("Ocekava se '}' (close_block)"); - get_cislo(f,&parm1); - abs_num=basic_num=parm1*128; - pgf.num=basic_num; - pgf.alt=basic_num; - last_dialoge=pgf_count; - last_pgf=0; - add_pgf(&pgf); - get_command(f,&parm1); - if (parm1!=-2) error ("Ocekava se '{' (open_block)"); - sentence=0; - b_closed=0; - add_short(167); - add_short(basic_num); - } - -void js_first(FILE *f) - { - int parm1; - - - add_short(166); - add_short(last_pgf); - add_short(140); - get_cislo(f,&parm1); - add_short(parm1); - } - -void js_standard(FILE *f) - { - int parm1; - - get_cislo(f,&parm1); - if (parm1>0) standard_jump=parm1;else standard_jump=32767+parm1-basic_num; - } - -void js_close_block() - { - if (open_level) - { - if (was_sub) - if (sub_mode) - add_short(165); - else - { - add_short(139); - add_short(standard_jump); - } - sub_mode=0; - open_level--; - return; - } - if (b_closed) error("Neocekavany znak '}' (close_block)"); - if (sentence && sub_mode) add_short(165);else - { - add_short(139); - add_short(standard_jump); - } - b_closed=1; - } - -void js_sentence(FILE *f) - { - int par1,par2; - T_PARAGRAPH pgf; - - if (!b_closed || open_level) error("Ocekava se '}' (close_block)"); - b_closed=0; - get_cislo(f,&par1); - get_cislo(f,&par2); - sub_mode=par2; - pgf.num=par1+basic_num; - pgf.alt=par1+basic_num; - add_pgf(&pgf); - sentence=1; - last_pgf=par1; - get_command(f,&par1); - if (par1!=-2) error ("Ocekava se '{' (open_block)"); - sentencs++; - was_sub=0; - } - - -void js_sub(FILE *f) - { - int par1; - char *c; - int d; - - c=malloc(65536); - d=getc(f);while (d!=EOF && d!='$') d=getc(f); - fgets(c,65536,f); - if (sub_mode) - { - add_short(142); - get_cislo(f,&par1); - if (par1>0) add_short(par1);else add_short(32767+par1-basic_num); - add_string(c); - } - else - { - add_short(148); - add_string(c); - get_cislo(f,&par1); - if (par1>0) standard_jump=par1;else standard_jump=32767+par1-basic_num; - } - free(c); - } - -void js_close_sub() - { - was_sub=1; - if (sub_mode)add_short(164); else add_short(144); - } - -void save_pgf_name(FILE *f) - { - long l; - int i,s; - l=ftell(f); - for(s=0;(i=fgetc(f))!=EOF && i!='\n';s++); - if (pgf_name!=NULL) free(pgf_name); - pgf_name=(char *)malloc(s+2); - fseek(f,l,SEEK_SET); - fgets(pgf_name,s+1,f); - fgetc(f); - } - -void push_level(int level,int pos) - { - if (if_ptr==IF_LEN) error("Priliz dlouha struktura if & else"); - if_data[if_ptr].level=level; - if_data[if_ptr].pointer=pos; - if_ptr++; - } - -void pop_and_fill(int pos,int level) - { - int i; - int prog_sav; - prog_sav=prog_pos; - while (if_ptr && if_data[if_ptr-1].level==level) - { - if_ptr--; - prog_pos=if_data[if_ptr].pointer; - i=pos-if_data[if_ptr].pointer-3; - if (i>32767 || i<-32767) error("Blok if/else je priliz dlouhy (delsi nez 32767 bytu)"); - add_short(i); - } - prog_pos=prog_sav; - } - -int get_last_level() - { - if (if_ptr) return if_data[if_ptr-1].level; - else return -1; - } - -void add_if_jump() - { - char c=1; - switch(iff_mode) - { - case IF_NOT_JUMP:add_short(169);break; - case IF_JUMP:add_short(170);break; - case IF_ELSE:c=0;break; - } - if (c) - { - push_level(open_level,prog_pos); - add_short(0); - } - iff_mode=0; - was_sub=0; - } - -void add_else() - { - int psave,c; - get_command(f,&c); - if (c!=-2) error("Chybn syntaxe pkazu else. Oekv se '{'"); - was_sub=0; - if (get_last_level()!=open_level) error("Else bez if"); - add_short(171); - psave=prog_pos; - add_short(0); - pop_and_fill(prog_pos,open_level); - push_level(open_level,psave); - open_level++; - } - -void set_alternative(FILE *f) - { - int cislo; - - get_cislo(f,&cislo); - pgf_list[pgf_count-1].alt=cislo+basic_num; - } - -void decode_program(FILE *f) - { - int c; - char next_sub=0; - char *d; - - d=(char *)calloc(sizeof(char),16384); - open_level=0; - c=fgetc(f); - while (c!=EOF) - { - if (c=='!') - { - char d[256]; - - fgets(&d,256,f); - decode_pgf1(d); - } - else if (isdigit(c) || c=='-') - { - int cislo; - ungetc(c,f); - get_cislo(f,&cislo); - add_short(cislo); - } - else if (c=='*') - { - int cislo; - get_cislo(f,&cislo); - if (cislo!=517 && next_sub) - { - js_close_sub(); - next_sub=0; - } - if (cislo!=171 && !iff_mode) pop_and_fill(prog_pos,open_level); - switch (cislo) - { - case 512:js_dialoge(f);break; //Sekce DIALOG - case 513:js_first(f);break; //Prikaz FIRST - case 514:add_short(152); //Prikaz WHEN_ITEM - copy_short(f); - add_short(140); - get_cislo(f,&cislo); - if (cislo>0)add_short(cislo);else add_short(cislo+32767-basic_num); - break; - case 515:add_short(163); //prikaz WHEN_FLAG - copy_short(f); - add_short(140); - get_cislo(f,&cislo); - if (cislo>0)add_short(cislo);else add_short(cislo+32767-basic_num); - break; - case 516:js_standard(f);break; //prikaz STANDARD - case 517:js_sub(f);next_sub=1;break; //prikaz SUB - case 520:js_sentence(f);break; //Sekce SENTENCE - case -1:js_close_block();break; //znak }// - case -2: if (iff_mode) add_if_jump();else error("Neocekavany znak '{' (open_block)"); - open_level++; - break; //znak {// - case 999:save_pgf_name(f);break; - case 169:if (iff_mode) add_if_jump(); //prikaz if - iff_mode=IF_NOT_JUMP;break; - case 170:if (iff_mode!=IF_NOT_JUMP) error("NOT bez IF"); //modifikator not - iff_mode=IF_JUMP;break; - case 171:if (iff_mode) error("Chybn pouit pkazu ELSE"); //prikaz else - add_else();break; - case 173:set_alternative(f);break; - default: add_short(cislo);break; - } - } - else if (c=='$') - { - fgets(d,16384,f); - add_string(d); - } - else if (c=='&') - { - int cislo; - get_cislo(f,&cislo); - add_var(cislo); - } - c=fgetc(f); - } - free(d); - } - -void save_program() - { - FILE *tg; - int pgstart; - - tg=fopen("dialogy.dat","wb"); - pgstart=pgf_count*sizeof(*pgf_list); - fwrite(&pgf_count,1,sizeof(pgf_count),tg); - fwrite(&prog_pos,1,sizeof(prog_pos),tg); - fwrite(pgf_list,1,pgstart,tg); - fwrite(program,1,prog_pos,tg); - fclose(tg); - } - -void create_include_list(char *filename) - { - FILE *f,*g; - int i; - char s[15]; - - f=fopen(filename,"r"); - if (f==NULL) - { - printf("Soubor nenalezen: %s\n",filename); - exit(0); - } - g=fopen(TEMP_NAME1,"w"); - fputs("#include dialogy.def\n",g); - fputs("#command pgf_name *999 1\n",g); - do - { - i=fscanf(f,"%14s",s); - if (i==1) - { - fprintf(g,"pgf_name '"); - while((i=fgetc(f))!='\n' && i!=EOF) fputc(i,g);fputs("'\n",g); - fprintf(g,"#include %s\n",s); - libs++; - i=1; - } - } - while(i==1); - fclose(f); - fclose(g); - } - -const char *GetLexLibPath() -{ - static char c[MAX_PATH]; - char *z; - GetModuleFileName(0,c,MAX_PATH); - z=strrchr(c,'\\')+1; - strcpy(z,"lex_lib.exe"); - return c; -} - -main(int argc,char *argv[]) - { - if (argc<2) - { - puts("Tento program vyzaduje jmeno souboru, ve kterem se naleza\n" - "script pro popis dialogu pro hru BRANY SKELDALU v 1.0"); - exit(0); - } - puts(""); - puts("Probh kompilace:"); - puts(" Spoutm program LEX_LIB.EXE\n"); - putenv("DOS4G=QUIET"); - create_include_list(argv[1]); - if (spawnlp(P_WAIT,GetLexLibPath(),"lex_lib.exe",TEMP_NAME1,"temp.$$$",NULL)) - exit(1); - if (errno || init("temp.$$$")) - { - puts("Nemohu spustit program lex_lib.exe"); - exit(1); - } - mlist=fopen(SCRIPT,"w"); - if (mlist==NULL) - { - printf("Nemohu otevrit soubor %s pro zapis.\n",SCRIPT); - exit(0); - } - decode_program(f); - fclose(f); - remove("temp.$$$"); - remove(TEMP_NAME1); - puts("Kompilace spn..."); - printf("Vytvoreno odstavcu: %d\nCelkem knihoven: %d\nCelkem Sentenci: %d\nDlka kdu: %d\n",pgf_count,libs,sentencs,prog_pos); - save_program(); - fclose(mlist); - } - diff --git a/MAPS/DLGPRINT.C b/MAPS/DLGPRINT.C deleted file mode 100644 index 6519372..0000000 --- a/MAPS/DLGPRINT.C +++ /dev/null @@ -1,188 +0,0 @@ -#include - -#include -#include -#include - -#define DIALOGY "DIALOGY.DAT" -void *dialog; -int count; -char *pc; -char *ending; -char all_print,print_it; -char print2; - -#define SAVE_POSTS 20 -static char sn_nums[SAVE_POSTS]; -static char sn_nams[SAVE_POSTS][32]; -static char sn_rods[SAVE_POSTS]; - -static void error(char *text) - { - fputs(text,stderr); - exit(1); - } - - -typedef struct t_paragraph - { - unsigned num:15; - unsigned alt:15; - unsigned visited:1; - unsigned first:1; - long position; - }T_PARAGRAPH; - - - -void Load_dialogs() - { - FILE *f; - int size; - - f=fopen(DIALOGY,"rb"); - if (f==NULL) - { - fprintf(stderr,"Nemohu otevrit soubor %s",DIALOGY); - exit(1); - } - fseek(f,0,SEEK_END); - size=ftell(f); - fseek(f,0,SEEK_SET); - dialog=malloc(size); - fread(dialog,1,size,f); - fclose(f); - memcpy(&count,dialog,4); - ending=pc=dialog; - pc+=sizeof(T_PARAGRAPH)*count+8; - ending+=size; - } - -static char buff[65535]; - -static char *transfer_text(char *source,char *target) - { - char *orgn=source,*ot=target,c; - int num; - print2=print_it=0; - while (*source) - { - if (*source=='%') - { - source++; - switch(*source) - { - case '[':*target++='[';break; - case ']':*target++=']';break; - case 'a':*target++='\'';break; - case 'p': - case '%':*target++='%';break; - case 'n':strcpy(target,sn_nams[0]);target+=strlen(sn_nams[0]);print2=print_it=1;break; - default: num=0;while (isdigit(*source)) num=10*num+*source++-'0'; - if (*source=='l') - { - sn_nums[0]=sn_nums[num]; - strcpy(sn_nams[0],sn_nams[num]); - sn_rods[0]=sn_rods[num]; - } - break; - } - source++; - } - else if (*source=='[') - { - source++;print2=print_it=1; - num=sn_rods[0]; - while(num>0) - { - source=strchr(source,','); - num--; - if (source==NULL) - { - puts(orgn); - error("Chybn� rod nebo mal� po�et tvar� od jednoho slova"); - } - source++; - } - while (*source!=',' && *source!=']' && *source!=0) *target++=*source++; - if (*source!=']') - { - source=strchr(source,']'); - if (source==NULL) - { - puts(orgn); - error("O�ek�v� se ']'"); - } - } - source++; - } - else c=*target++=*source++; - } - *target=0; - //if (code_page==2) - // prekodovat(ot); - return target; - } - -void read_program() - { - while(pc"); - } - pc=strchr(pc,0)+1; - } - } - } - -void read_names() - { - char fm; - int i,j,k; - - do - { - fprintf(stderr,"Budes zad�vat mu�sk� jm�na, nebo �ensk�: (M/Z)");gets(buff); - fm=toupper(buff[0]); - } - while (fm!='M'&& fm!='Z') ; - fprintf(stderr,"Nyn� je t�eba zadat n�kolik jmen, posledn� odklepni ENTREM\n"); - i=0; - do - { - fprintf(stderr,"%d.jm�no:",i+1);gets(buff); - if (buff[0]) strncpy(sn_nams[i],buff,31); - i++; - } - while(i -#include -#include -#include -#include - -static int latest_version(char *wild,int numpos) - { - struct find_t ff; - int rc; - int i=0,j=-1; - char *p; - - rc=_dos_findfirst(wild,_A_NORMAL,&ff); - while (rc==0) - { - p=ff.name+numpos; - sscanf(p,"%d",&i); - if (i>j) j=i; - rc=_dos_findnext(&ff); - } - _dos_findclose(&ff); - return j; - } - -void save_dump() - { - static dump_counter=-1; - FILE *f; - int i,r,g,b,x,y; - word *a; - char c[20]; - - if (dump_counter==-1) - { - dump_counter=latest_version("DUMP*.BMP",4); - SEND_LOG("(DUMP) Dump counter sets to %d",dump_counter,0); - } - sprintf(c,"DUMP%04d.BMP",++dump_counter); - SEND_LOG("(DUMP) Saving screen shot named '%s'",c,0); - f=fopen(c,"wb"); - fputc('B',f);fputc('M',f); - i=640*480*3+0x36; - fwrite(&i,1,4,f);i=0; - fwrite(&i,1,4,f); - i=0x36; - fwrite(&i,1,4,f); - i=0x28; - fwrite(&i,1,4,f); - i=640; - fwrite(&i,1,4,f); - i=480; - fwrite(&i,1,4,f); - i=1; - fwrite(&i,1,2,f); - i=24; - fwrite(&i,1,2,f); - i=0; - fwrite(&i,1,4,f); - i=640*480*3; - fwrite(&i,1,4,f); - for(i=4,r=0;i>0;i--) fwrite(&r,1,4,f); - for(y=480;y>0;y--) - { - a=&screen[(y-1)*640]; - for(x=0;x<640;x++) - { - i=a[x]; - b=(i & 0x1f)<<3; - g=(i & 0x3e0)>>2; - r=(i & 0x7f00)>>7; - i=((r*256)+g)*256+b; - fwrite(&i,1,3,f); - } - } - fclose(f); - } - diff --git a/MAPS/DUMP.H b/MAPS/DUMP.H deleted file mode 100644 index 737ecb6..0000000 --- a/MAPS/DUMP.H +++ /dev/null @@ -1 +0,0 @@ -void save_dump(); diff --git a/MAPS/EDIT_MAP.C b/MAPS/EDIT_MAP.C deleted file mode 100644 index 83ad37e..0000000 --- a/MAPS/EDIT_MAP.C +++ /dev/null @@ -1,1179 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "mapy.h" -#include -#include -#include "globals.h" -#include "edit_map.h" -#include "steny.h" -#include "save_map.h" -#include "wiz_tool.h" -#include "resource.h" - -int temp_source; -int sektor_info=-1; -int sektor_win=-1; -int draw_win=-1; -int change_map; -char datapath[]=""; -char last_directions=0; - -char *strs(int num) - { - static char s[200]; - char **format; - int *p; - - p=(int *)(o_end->userptr); - format=(char **)p+4; - sprintf(s,*format,num); - return s; - } - -long vals(int num) - { - char s[200]; - long i; - - get_value(0,num,s); - sscanf (s,"%d", &i); - return i; - } - - -void test_int(void) - { - int *p; - char s[200]; - char **t; - int i; - - p=(int *)(o_aktual->userptr); - get_value(0,o_aktual->id,s); - sscanf (s,"%d", &i); - p=p+2; - if (i<*p || i>*(p+1)) cancel_event(); - t=(char **)p+2; - sprintf(s,*t,i); - set_value(0,o_aktual->id,s); - } - -void fill_bit_fields(int win,int id_start,int source,int count) - { - while (count) - { - c_set_value(win,id_start,source & 1); - id_start+=10; - source>>=1; - count--; - } - } - -long get_bit_fields(int win,int id_start,int count) - { - long l; - int mask; - - mask=0;l=0; - while (count) - { - l|=f_get_value(win,id_start)<id; - p=o_aktual; - v=f_get_value(0,id); - v=string_list(*(char **)(o_aktual->userptr),v); - if (v+1) c_set_value(0,id,v); - o_aktual=p; - p->on_change(); - o_aktual=o_start; - } - -void string_list_sup() - { - run_background(string_list_sup_call); - } - -void str_line_init(OBJREC *o,void **x) //source_list - { - o->userptr=(void *)getmem(16); - memcpy(o->userptr,x,sizeof(*x)); - } - -void str_line_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - char c[200]; - char **s; - int *d; - - - d=(int *)o->data; - bar(x1,y1,x2,y2); - s=*(char ***)(o->userptr); - if (*d<0 || *d>=str_count(s) || s[*d]==0) strcpy(c,"???");else strcpy(c,s[*d]); - while (text_width(c)>(x2-x1)) - { - char *t; - - t=strchr(c,'\0'); - *(--t)='\0'; - } - position(x1,y1); - outtext(c); - } - -void str_line_event(EVENT_MSG *msg,OBJREC *o) - { - if (msg->msg==E_CONTROL) - { - memcpy(o->userptr,msg->data,4); - } - } - -void str_line(OBJREC *o) - { - o->call_init=str_line_init; - o->call_draw=str_line_draw; - o->call_event=str_line_event; - o->datasize=4; - } - -static void refresh_vyk_map() - { - int i,j,s,d; - - for(i=1;i1) - selmode=msg_box("Editor st�n",'\x2',"Je ozna�eno v�ce sektor�. Chce� upravit pouze ...","Aktu�ln�","V�echny","Zm�ny","Zp�t",NULL); - else selmode=(apl!=1 && apl!=2 && apl!=4 && apl!=8 && target!=0)?3:1; - else - smer=0,apl=0xf,selmode=1; - if (selmode==4) return 0; - p->flags=get_bit_fields(0,120,20); - p->flags|=f_get_value(0,350); - p->prim_anim=vals(50)-1; - p->sec_anim=vals(60)-1; - p->xsec=vals(70)>>1; - p->ysec=vals(80)>>1; - p->lclip=vals(440); - p->sector_tag=vals(90); - p->side_tag=f_get_value(0,100); - p->action=f_get_value(0,110); - p->prim=f_get_value(0,20); - p->sec=f_get_value(0,30); - p->oblouk=f_get_value(0,40)+(f_get_value(0,450)<<5)+(f_get_value(0,470)<<7); - p->side_tag|=(f_get_value(0,480)<<7); - o=&mapa.sidedef[target][smer]; - if (selmode==3) - { - memset(&chs,0,sizeof(chs)); - if (p->flags!=o->flags) chs.flags=o->flags ^ p->flags; - if (p->prim_anim!=o->prim_anim) chs.prim_anim=0xFF; - if (p->sec_anim!=o->sec_anim) chs.sec_anim=0xFF; - if (p->xsec!=o->xsec) chs.xsec=0xFF; - if (p->ysec!=o->ysec) chs.ysec=0xFF; - if (p->lclip!=o->lclip) chs.lclip=0xFF; - if (p->sector_tag!=o->sector_tag) chs.lclip=0xFF; - if ((p->side_tag & 0x7F)!=(o->side_tag & 0x7F)) chs.side_tag|=0x7F; - if ((p->side_tag & 0x80)!=(o->side_tag & 0x80)) chs.side_tag|=0x80; - if (p->action!=o->action) chs.action=0xFF; - if (p->prim!=o->prim) chs.prim=0xFF; - if (p->sec!=o->sec) chs.sec=0xFF; - if ((p->oblouk & 0x1F)!=(o->oblouk & 0x1F)) chs.sec|=0x1F; - if ((p->oblouk & 0x60)!=(o->oblouk & 0x60)) chs.sec|=0x60; - if ((p->oblouk & 0x80)!=(o->oblouk & 0x80)) chs.sec|=0x80; - } - else - { - memset(&chs,0xff,sizeof(chs)); - } - for (i=0;i<4;(apl>>=1),i++) if (apl & 1) - { - o=&mapa.sidedef[target][i]; - move_changes(p,o,&chs,sizeof(TSTENA)); - if (selmode!=1) - for(j=1;jmsg==E_INIT) return &edit_side_predvolba_0; - if (msg->msg==E_DONE) return NULL; - c=(char *)msg->data; - strcpy(c,"Vlastnosti nastaveny jako p�edvolba..."); - c=strchr(c,'\0'); - msg->data=(void *)c; - msg->msg=-1; - return NULL; - } - -void edit_side_predvolba_1(void) - { - edit_side_save(0,-1); - send_message(E_STATUS_LINE,E_DONE,E_IDLE,edit_side_predvolba_0); - send_message(E_STATUS_LINE,E_ADD,E_IDLE,edit_side_predvolba_0); - } - -void edit_side_predvolba_2(void) - { - send_message(E_STATUS_LINE,E_DONE,E_IDLE,edit_side_predvolba_0); - } - -void value_store_init(OBJREC *o,int *bytes) - { - o->datasize=*bytes; - } - -void value_store(OBJREC *o) - { - o->call_init=value_store_init; - } - -void action_flags() - { - CTL3D b1; - long flags; - - flags=f_get_value(0,350); - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - def_dialoge(300,220,300,210,"V�ce vlajek"); - define(CANCEL_BUTT,11,5,80,20,2,button,"Zru�it");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(terminate_gui); - define(OK_BUTT,100,5,80,20,2,button,"Ok");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(terminate_gui); - define(10,10,20,250,10,0,check_box,side_flgs[24]); - define(20,10,32,250,10,0,check_box,side_flgs[25]); - define(30,10,44,250,10,0,check_box,side_flgs[26]); - define(40,10,56,250,10,0,check_box,side_flgs[27]); - define(50,10,68,250,10,0,check_box,side_flgs[28]); - define(60,10,88,250,10,0,check_box,side_flgs[29]); - define(70,10,100,250,10,0,check_box,side_flgs[30]); - define(80,10,112,250,10,0,check_box,side_flgs[31]); - define(90,10,124,250,10,0,check_box,side_flgs[20]); - define(100,10,136,250,10,0,check_box,side_flgs[21]); - define(110,10,148,250,10,0,check_box,side_flgs[22]); - define(120,10,160,250,10,0,check_box,side_flgs[23]); - fill_bit_fields(0,10,flags>>24,8); - fill_bit_fields(0,90,flags>>20,4); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - flags=get_bit_fields(0,10,8)<<24; - flags|=get_bit_fields(0,90,4)<<20; - - } - close_window(waktual); - c_set_value(0,350,flags); - } - -int find_vyklenek_id(int sector,int dir) - { - int i; - for(i=0;i<256;i++) if (vyklenky[i].sector==sector && vyklenky[i].dir==dir) return i; - return -1; - } - -int find_free_vyklenek() - { - int i; - for(i=0;i<256;i++) if (vyklenky[i].sector==0) return i; - return -1; - } - - -static void edit_vyklenek_start() - { - int smer,sector; - int id; - - smer=f_get_value(0,370); - sector=f_get_value(0,360); - id=find_vyklenek_id(sector,smer); - if (id==-1) - { - TVYKLENEK *v; - id=find_free_vyklenek(); - if (id==-1) - { - msg_box("Omezeni!",'\x1',"V map� je pou�ito ji� mnoho v�klenk� ve zdi. Maxim�ln� po�et je 256","Ok",NULL); - return; - } - v=vyklenky+id; - v->xpos=250; - v->ypos=160; - v->xs=80; - v->ys=60; - v->sector=sector; - v->dir=smer; - v->items[0]=0; - } - edit_vyklenek(id); - refresh_vyk_map(); - } - -void edit_side(int source,int smer) - { - TSTENA *p; - CTL3D b1,b2,b3; - char s[200]; - - p=&mapa.sidedef[source][smer]; - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - sprintf(s,"Vlastnosti st�n, sektor %d st�na %d",source,smer); - def_window(400,324,s); - waktual->x=125; - waktual->y=60; - waktual->modal=1; - define(CANCEL_BUTT,10,5,80,20,2,button,"Zru�it");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(close_current); - define(OK_BUTT,190,5,80,20,2,button,"Ok");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(edit_side_ok); - define(3400,100,5,80,20,2,button,"P�edvolba");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(edit_side_predvolba_1);on_control_exit(edit_side_predvolba_2); - define(10,5,20,300,35,0,label,"Prim�rn�: Sekundarn�: Oblouk:");property(&b3,NULL,NULL,WINCOLOR); - define(20,10,35,90,12,0,str_line,side_names);property(&b2,NULL,NULL,WINCOLOR);c_default(p->prim); - on_control_enter(string_list_sup); - define(30,110,35,90,12,0,str_line,side_names);property(&b2,NULL,NULL,WINCOLOR);c_default(p->sec); - on_control_enter(string_list_sup); - define(40,210,35,90,12,0,str_line,oblouky);property(&b2,NULL,NULL,WINCOLOR);c_default(p->oblouk & 0x0f); - on_control_enter(string_list_sup); - define(-1,5,60,250,12,0,label,"Animace primarn�:"); - define(-1,5,75,250,12,0,label,"Animace sekundarn�:"); - define(-1,5,90,250,12,0,label,"X pozice sek. st�ny:"); - define(-1,5,105,250,12,0,label,"Y pozice sek. st�ny:"); - define(-1,5,120,250,12,0,label,"C�lov� sektor ud�losti:"); - define(-1,5,135,250,12,0,label,"C�lov� st�na ud�losti:"); - define(-1,5,150,250,12,0,label,"Popis akce:"); - define(-1,260,60,100,12,0,label,"Aplikuj na st�nu:"); - define(50,200,60,50,10,0,input_line,10,1,16,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs((p->prim_anim & 0xf)+1));on_control_exit(test_int); - define(60,200,75,50,10,0,input_line,10,1,16,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs((p->sec_anim & 0xf)+1));on_control_exit(test_int); - define(70,200,90,50,10,0,input_line,10,0,499,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->xsec<<1));on_control_exit(test_int); - define(80,200,105,50,10,0,input_line,10,0,511,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->ysec<<1));on_control_exit(test_int); - define(90,200,120,50,10,0,input_line,10,0,65535,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->sector_tag));on_control_exit(test_int); - define(100,200,135,50,10,0,str_line,steny2);property(&b2,NULL,NULL,WINCOLOR); - c_default(p->side_tag & 0x3);on_control_enter(string_list_sup); - define(110,100,150,150,10,0,str_line,actions);property(&b2,NULL,NULL,WINCOLOR); - on_control_enter(string_list_sup); c_default(p->action); - define(120,10,175,150,10,0,check_box,side_flgs[0]); - define(130,10,187,150,10,0,check_box,side_flgs[1]); - define(140,10,199,150,10,0,check_box,side_flgs[2]); - define(150,10,211,150,10,0,check_box,side_flgs[3]); - define(160,10,223,150,10,0,check_box,side_flgs[4]); - define(170,10,235,150,10,0,check_box,side_flgs[5]); - define(180,10,247,150,10,0,check_box,side_flgs[6]); - define(190,10,259,150,10,0,check_box,side_flgs[7]); - define(200,190,175,100,10,0,check_box,side_flgs[8]); - define(210,190,187,100,10,0,check_box,side_flgs[9]); - define(220,190,199,100,10,0,check_box,side_flgs[10]); - define(230,190,211,150,10,0,check_box,side_flgs[11]); - define(240,190,223,150,10,0,check_box,side_flgs[12]); - define(250,190,235,150,10,0,check_box,side_flgs[13]); - define(260,190,247,150,10,0,check_box,side_flgs[14]); - define(270,190,259,150,10,0,check_box,side_flgs[15]); - define(280,10,271,75,10,0,check_box,side_flgs[16]); - define(290,10,283,75,10,0,check_box,side_flgs[17]); - define(300,190,271,150,10,0,check_box,side_flgs[18]); - define(310,10,295,75,11,0,check_box,side_flgs[19]); - define(400,290,80,100,10,0,check_box,"Severn�"); - define(410,290,95,100,10,0,check_box,"V�chodn�"); - define(420,290,110,100,10,0,check_box,"Ji�n�"); - define(430,290,125,100,10,0,check_box,"Z�padn�"); - define(340,290,150,100,15,0,button2,"V�ce >>");on_control_change(action_flags); - define(350,290,150,100,15,0,value_store,4);c_default(p->flags & 0xfff00000); - define(360,290,150,100,15,0,value_store,4);c_default(source); - define(370,290,150,100,15,0,value_store,4);c_default(smer); - define(-1,5,20,60,10,1,label,"Lclip:"); - define(440,30,35,30,12,1,input_line,3,0,255,"%3d"); - property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->lclip));on_control_exit(test_int); - define(450,10,220,30,30,1,radio_butts,3,"-","\x4","\x6");c_default((p->oblouk>>5) & 0x3); - property(NULL,icones,NULL,WINCOLOR); - define(460,10,175,80,12,1,button,"V�klenek");on_control_change(edit_vyklenek_start); - define(470,190,283,150,10,0,check_box,"Lze polo�it za");c_default(p->oblouk>>7); - define(480,10,307,75,10,0,check_box,"P�edsunout s.");c_default(p->side_tag>>7); - fill_bit_fields(0,120,p->flags,20); if (source) - fill_bit_fields(0,400,1<id/10-5); - } - -void edit_sector(int source) - { - TSECTOR *p; - TSTR_LIST l; - CTL3D b1,b2,b3; - - l=read_directory("c:\\windows\\system\\*.*",DIR_FULL,_A_NORMAL); - p=&mapa.sectordef[source]; - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(3,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - def_dialoge(100,100,300,200,"String list - test only"); - define(9,10,20,240,170,0,listbox,l,0x1f);c_default(0); - o_end->autoresizex=1; - o_end->autoresizey=1; - define(10,3,42,17,110,1,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(NULL,NULL,NULL,WINCOLOR); - o_end->autoresizey=1; - define(11,1,20,21,17,1,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,1,22,21,17,2,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(20,1,1,10,10,2,resizer); -/* define(OK_BUTT,100,5,80,20,2,button,"Ok");property(&b1,NULL,NULL,WINCOLOR); - on_change(terminate); - define(CANCEL_BUTT,10,5,80,20,2,button,"Zru�it");property(&b1,NULL,NULL,WINCOLOR); - on_change(terminate); - define(-1,5,20,100,12,0,label,"P�ipojen�:"); - define(10,10,35,50,12,0,input_line,20,0,MAPSIZE-1,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->step_next[0]));on_exit(test_int); - define(20,10,50,50,12,0,input_line,20,0,MAPSIZE-1,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->step_next[1]));on_exit(test_int); - define(30,10,65,50,12,0,input_line,20,0,MAPSIZE-1,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->step_next[2]));on_exit(test_int); - define(40,10,80,50,12,0,input_line,20,0,MAPSIZE-1,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->step_next[3]));on_exit(test_int); - define(50,70,35,80,12,0,button,"Sever");property(&b1,NULL,NULL,WINCOLOR);on_change(edit_side_sup); - define(60,70,50,80,12,0,button,"V�chod");property(&b1,NULL,NULL,WINCOLOR);on_change(edit_side_sup); - define(70,70,65,80,12,0,button,"Jih");property(&b1,NULL,NULL,WINCOLOR);on_change(edit_side_sup); - define(80,70,80,80,12,0,button,"Z�pad");property(&b1,NULL,NULL,WINCOLOR);on_change(edit_side_sup); - temp_source=source; - */redraw_window(); - escape(); - close_window(waktual); - release_list(l); - } - -void run_edit_side(void) - { - char s[100]; - int i; - OBJREC *o; - - get_value(0,5,s); - if (strcmp(s,"?")) - { - sscanf(s,"%d",&i); - o=o_aktual; - edit_side(i,o_aktual->id/10-10); - } - - } - - -void Apply(void) - { - int sec,i; - char s[100]; - - get_value(0,5,s); - if (!strcmp(s,"?")) return; - sscanf(s,"%d",&sec); - { - TSECTOR *p;int j; - - p=&mapa.sectordef[sec]; - for (j=0;j<4;j++) p->step_next[j]=(word)vals((j+1)*10); - } - for (i=1;imsg==E_MOUSE) - { - ms=get_mouse(msg); - if (ms->event_type & 0x8) - { - int s; - s=vals(o_aktual->id); - jdi_na_sektor(s); - } - } - } - -void chozeni2(EVENT_MSG *msg,OBJREC *o) - { - word s2,s1; - char ok=1; - - if (msg->msg==E_INIT) return ; - if (msg->msg==E_DONE) return ; - if (msg->msg==E_KEYBOARD) - { - if (o_aktual==NULL || o_aktual->on_change!=chozeni2) return; - if (waktual->id==map_win || waktual->id==tool_bar) - select_window(sektor_win); - if (waktual->id!=sektor_win) return; - s2=vals(5);s1=s2; - if (s2>maplen) return; - if (!(*(char *)msg->data)) - switch (*(int *)msg->data>>8) - { - case 'H':s1=mapa.sectordef[s2].step_next[0];break; - case 'P':s1=mapa.sectordef[s2].step_next[2];break; - case 'M':s1=mapa.sectordef[s2].step_next[1];break; - case 'K':s1=mapa.sectordef[s2].step_next[3];break; - default:ok=0; - } - else if (*(char *)msg->data!=13) ok=0; - if (ok) - { - if (s1>maplen) return; - jdi_na_sektor(s1); - while (_bios_keybrd(_KEYBRD_READY)) _bios_keybrd(_KEYBRD_READ); - msg->msg=-1; - } - } - if (msg->msg==E_GET_FOCUS) - { - memcpy(&o->f_color,flat_color(0x3e0),sizeof(FC_TABLE)); - redraw_object(o); - } - if (msg->msg==E_LOST_FOCUS) - { - memcpy(&o->f_color,flat_color(0),sizeof(FC_TABLE)); - redraw_object(o); - } - - return ; - } - -void sector_details_call(int sect_num) - { - TSECTOR *p; - CTL3D b1,b2,b3; - int start,end,i; - char s[200]; - - p=&mapa.sectordef[sect_num]; - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(3,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - sprintf(s,"Detaily sektoru %d",sect_num); - def_dialoge(100,50,440,340,s); - define(-1,30,30,100,12,0,label,"Strop:"); - define(-1,30,50,100,12,0,label,"Podlaha:"); - define(-1,30,70,100,12,0,label,"Sektor:"); - define(-1,30,90,100,12,0,label,"C�l akce:"); - define(-1,30,110,100,12,0,label,"St�na akce:"); - define(-1,30,130,100,12,0,label,"Popis akce:"); - define(10,30,28,100,13,1,str_line,ceils);property(&b2,NULL,NULL,WINCOLOR); - c_default(p->ceil); on_control_enter(string_list_sup); - define(20,30,48,100,13,1,str_line,floors);property(&b2,NULL,NULL,WINCOLOR); - c_default(p->floor); on_control_enter(string_list_sup); - define(30,30,68,100,13,1,str_line,sector_types);property(&b2,NULL,NULL,WINCOLOR); - c_default(p->sector_type); on_control_enter(string_list_sup); - define(40,30,88,50,13,1,input_line,10,0,MAPSIZE,"%6d");property(&b2,NULL,NULL,WINCOLOR); - set_default(strs(p->sector_tag));on_control_exit(test_int); - define(50,30,108,100,13,1,str_line,steny2);property(&b2,NULL,NULL,WINCOLOR); - c_default(p->side_tag & 3); on_control_enter(string_list_sup); - define(60,30,128,150,13,1,str_line,actions);property(&b2,NULL,NULL,WINCOLOR); - c_default(p->action); on_control_enter(string_list_sup); - define(70,5,150,214,80,0,radio_butts,7, - "(1) Norm�ln� podlaha", - "(2) Dva druhy podlah", - "(3) Dva sm�ry", - "(4) Dva sm�ry a druhy", - "(5) �ty�i sm�ry", - "(6) �ty�i sm�ry a dva druhy", - "(7) �achovnice");c_default(p->flags & 0x7); - define(80,5,150,214,80,1,radio_butts,7, - "(1) Norm�ln� strop", - "(2) Dva druhy strop", - "(3) Dva sm�ry", - "(4) Dva sm�ry a druhy", - "(5) �ty�i sm�ry", - "(6) �ty�i sm�ry a dva druhy", - "(7) �achovnice");c_default(p->flags >> 4 & 0x7); - define(90,5,240,214,10,0,check_box,"(?)Animace podlahy");c_default((p->flags & 0x8)!=0); - define(95,5,240,214,10,1,check_box,"(?)Animace stropu");c_default((p->flags & 0x80)!=0); - define(65,5,252,214,10,0,check_box,"Sekundarni shading");c_default((minfo[sect_num].flags & 0x100)>>8); - define(75,5,258,214,40,1,radio_butts,4,"*default*","�ipka","Schody","Bez symbolu");c_default((minfo[sect_num].flags & 0x600)>>9); - define(83,5,264,214,10,0,check_box,"!Automap (kouzlem)");c_default((minfo[sect_num].flags & 0x800)>>11); - define(85,5,276,214,10,0,check_box,"!Summon");c_default((minfo[sect_num].flags & 0x1000)>>12); - define(87,5,288,214,10,0,check_box,"Neprojde hledan�m cesty");c_default((minfo[sect_num].flags & 0x2000)>>13); - define(100,10,10,80,20,3,button,"Ok");property(&b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(110,10,10,80,20,2,button,"Zru�it");property(&b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(120,100,10,80,20,2,button,"P�edvolba");property(&b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - set_enable(0,120,sect_num!=0); - redraw_window(); - do - { - sem: - escape(); - if (o_aktual->id-110) - { - i=0; - if (o_aktual->id==120) - { - start=0;end=0;minfo[0].flags|=1; - } - else - { - if (count_of_sel()<2 || (i=msg_box("Co te�?",'\x2',"M�m vlastnosti aplikovat na jeden sektor nebo na vybranou oblast?", - "Na sektor","Na oblast","Zru�it",NULL))==1) - { - start=sect_num; - end=sect_num; - minfo[sect_num].flags |=1; - } - else - { - start=1; - end=maplen-1; - } - } - if (i==3) goto sem; - else - for (i=start;i<=end;i++) if (minfo[i].flags & 1) - { - p=&mapa.sectordef[i]; - p->ceil=f_get_value(0,10); - p->floor=f_get_value(0,20); - p->sector_type=f_get_value(0,30); - p->sector_tag=vals(40); - p->side_tag=f_get_value(0,50); - p->action=f_get_value(0,60); - p->flags=f_get_value(0,70)+16*f_get_value(0,80)+8*f_get_value(0,90)+0x80*f_get_value(0,95);; - minfo[i].flags&=~0x1f00; - minfo[i].flags|=(f_get_value(0,65)<<8)|(f_get_value(0,75)<<9)|(f_get_value(0,83)<<11)|(f_get_value(0,85)<<12)|(f_get_value(0,87)<<13); - } - } - } - while (o_aktual && o_aktual->id==120); - close_window(waktual); - minfo[0].flags &= ~1; - } - -void set_change_map(void) - { - int i; - - i=o_aktual->id / 10-5; - if (i>14) i-=11; - change_map|=1<10) break; - } - *c=0; - if (c!=err) - { - do - c--; - while (c!=err && *c==32); - if (*c!=32) c++; - *c=0; - }*/ - } - -void call_testmap(int pos) - { - char tt[250]; - HWND hWnd; - - if (save_all_map()) return; - save_items(); - - LoadString(GetModuleHandle(NULL),3,tt,250); - hWnd=FindWindow(NULL,tt); - if (hWnd==NULL) - { - msg_box("Testovani mapy",'\x1',"Pro testovani mapy, spust hru Skeldal.exe v okne s tvym dobrodruzstvim " - "Vytvor novou skupinu, popripade nahraj pozici." - "Po nahrati urovne muzes zacit hru testovat. MapEdit se propoji s hrou.","Ok",NULL); - } - else - { - const char *fname=strrchr(filename,'\\'); - ATOM atm; - LRESULT res; - - if (fname==NULL) fname=filename;else fname++; - atm=GlobalAddAtom(fname); - SendMessageTimeout(hWnd,WM_RELOADMAP,pos,(LPARAM)atm,SMTO_NORMAL,2000,&res); - GlobalDeleteAtom(atm); - BringWindowToTop(hWnd); - } - } - -void testmap(void) - { - call_testmap(vals(5)); - } - -void close_sector_win(void) - { - close_window(waktual); - send_message(E_DONE,E_KEYBOARD,chozeni2); - } - -void open_sector_win(void) - { - if (find_window(sektor_win)==NULL) - { - CTL3D b1,b2; - FC_TABLE f_sel; - - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - memcpy(&f_sel,flat_color(0x0017),sizeof(charcolors)); - sektor_win=def_window(120,325,"Vlastnosti"); - waktual->y=2;waktual->x=SCR_WIDTH_X-120-3; - on_control_change(close_sector_win); - define(100,4,19,59,14,0,button2,"Sever:");on_control_change(run_edit_side); - define(110,4,49,59,14,0,button2,"V�chod:");on_control_change(run_edit_side); - define(120,4,79,59,14,0,button2,"Jih:");on_control_change(run_edit_side); - define(130,4,109,59,14,0,button2,"Z�pad:");on_control_change(run_edit_side); - define(-1,5,140,59,10,0,label,"Strop:"); - define(-1,5,170,59,10,0,label,"Podlaha:"); - define(-1,5,200,59,10,0,label,"Typ sektoru:"); - define(10,65,20,50,12,0,input_line,20,0,MAPSIZE-1,"%5d");property(&b2,NULL,&f_sel,WINCOLOR); - set_default("0");on_control_exit(test_int);on_event(chozeni); - define(20,65,50,50,12,0,input_line,20,0,MAPSIZE-1,"%5d");property(&b2,NULL,&f_sel,WINCOLOR); - set_default("0");on_control_exit(test_int);on_event(chozeni); - define(30,65,80,50,12,0,input_line,20,0,MAPSIZE-1,"%5d");property(&b2,NULL,&f_sel,WINCOLOR); - set_default("0");on_control_exit(test_int);on_event(chozeni); - define(40,65,110,50,12,0,input_line,20,0,MAPSIZE-1,"%5d");property(&b2,NULL,&f_sel,WINCOLOR); - set_default("0");on_control_exit(test_int);on_event(chozeni); - define(50,5,35,95,12,0,str_line,side_names);property(&b2,NULL,&f_sel,WINCOLOR); - c_default(0); on_control_enter(string_list_sup);on_control_change(set_change_map); - define(60,5,65,95,12,0,str_line,side_names);property(&b2,NULL,&f_sel,WINCOLOR); - c_default(0); on_control_enter(string_list_sup);on_control_change(set_change_map); - define(70,5,95,95,12,0,str_line,side_names);property(&b2,NULL,&f_sel,WINCOLOR); - c_default(0); on_control_enter(string_list_sup);on_control_change(set_change_map); - define(80,5,125,95,12,0,str_line,side_names);property(&b2,NULL,&f_sel,WINCOLOR); - c_default(0); on_control_enter(string_list_sup);on_control_change(set_change_map); - define(140,103,35,12,12,0,check_box,"");o_end->call_event=o_end->on_change; - define(150,103,65,12,12,0,check_box,"");o_end->call_event=o_end->on_change; - define(160,103,95,12,12,0,check_box,"");o_end->call_event=o_end->on_change; - define(170,103,125,12,12,0,check_box,"");o_end->call_event=o_end->on_change; - define(200,5,155,110,12,0,str_line,ceils);property(&b2,NULL,&f_sel,WINCOLOR); - c_default(0); on_control_enter(string_list_sup);on_control_change(set_change_map); - define(210,5,185,110,12,0,str_line,floors);property(&b2,NULL,&f_sel,WINCOLOR); - c_default(0); on_control_enter(string_list_sup);on_control_change(set_change_map); - define(220,5,215,110,12,0,str_line,sector_types);property(&b2,NULL,&f_sel,WINCOLOR); - c_default(0); on_control_enter(string_list_sup);on_control_change(set_change_map); - define(-1,1,30,60,10,3,label,"Sektor:"); - define(OK_BUTT,60,67,55,17,3,button2,"Aplikuj");on_control_change(Apply); - define(300,4,67,55,17,3,button2,"Detaily");on_control_change(sector_details); - define(5,60,30,55,12,3,input_line,20,0,MAPSIZE-1,"%5d");property(&b2,NULL,NULL,WINCOLOR); - set_default("?");on_control_change(chozeni2); - define(310,4,3,112,20,3,button,"Testovat mapu");on_control_change(testmap); - define(320,4,47,55,17,2,button2,"Zoom+");on_control_change(zoomin); - define(330,4,47,55,17,3,button2,"Zoom-");on_control_change(zoomout); - send_message(E_ADD,E_KEYBOARD,chozeni2); - waktual->popup=1; - } - else - { - select_window(sektor_win); - } - redraw_window(); - } - - -void info_sector(int sector) - { - char c[100]; - WINDOW *w; - int i; - - if (!sector) return; - w=waktual; - if (waktual->id!=sektor_win) open_sector_win(); - sprintf(c,"%5d",sector); - set_value(0,5,c); - for(i=0;i<4;i++) - { - sprintf(c,"%5d",mapa.sectordef[sector].step_next[i]); - set_value(0,(i+1)*10,c); - } - c_set_value(0,50,mapa.sidedef[sector][0].prim); - c_set_value(0,60,mapa.sidedef[sector][1].prim); - c_set_value(0,70,mapa.sidedef[sector][2].prim); - c_set_value(0,80,mapa.sidedef[sector][3].prim); - c_set_value(0,140,(mapa.sidedef[sector][0].flags & 0x200)!=0); - c_set_value(0,150,(mapa.sidedef[sector][1].flags & 0x200)!=0); - c_set_value(0,160,(mapa.sidedef[sector][2].flags & 0x200)!=0); - c_set_value(0,170,(mapa.sidedef[sector][3].flags & 0x200)!=0); - c_set_value(0,200,mapa.sectordef[sector].ceil); - c_set_value(0,210,mapa.sectordef[sector].floor); - c_set_value(0,220,mapa.sectordef[sector].sector_type); - select_window(w->id); - change_map=0; - } - -void draw_win_1(void) - { - int i; - - for (i=20;i<70;i++) c_set_value(draw_win,i,0); - c_set_value(draw_win,10,1); - } - -void draw_win_2(void) - { - c_set_value(draw_win,10,get_bit_fields(draw_win,10,6)==0);; - } - - -void open_draw_win(void) - { - if (find_window(draw_win)==NULL) - { - FC_TABLE f_sel; - - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - memcpy(&f_sel,flat_color(0x0017),sizeof(charcolors)); - draw_win=def_window(120,165,"Vlajky"); - waktual->y=2;waktual->x=SCR_WIDTH_X-120-3; - define(10,5,30,100,10,0,check_box,"Rozd�lit");c_default(1); - on_control_change(draw_win_1); - define(20,5,45,100,10,0,check_box,"!Hra�");c_default(0); - on_control_change(draw_win_2); - define(30,5,60,100,10,0,check_box,"!Nestv�ra");c_default(0); - on_control_change(draw_win_2); - define(40,5,75,100,10,0,check_box,"!V�c");c_default(0); - on_control_change(draw_win_2); - define(50,5,90,100,10,0,check_box,"!Zvuk");c_default(0); - on_control_change(draw_win_2); - define(60,5,105,100,10,0,check_box,"PrimVis");c_default(0); - on_control_change(draw_win_2); - define(70,5,18,110,17,3,button2,"Zoom in");on_control_change(zoomin); - define(80,5,1,110,17,3,button2,"Zoom out");on_control_change(zoomout); - waktual->popup=1; - - } - else - { - select_window(sektor_win); - } - redraw_window(); - } - -long get_draw_flags(void) - { - long l; - if (find_window(draw_win)!=NULL) - { - l=get_bit_fields(draw_win,10,6); - if (l & 1)l=0; else - if (l & 0x20) l=(l & 0x1f)|SD_PRIM_VIS; - } - else - l=0xff91; - return l; - } - - -static void veci_ve_vyklenku(TSTR_LIST *ls,short *list) - { - int i; - if (*ls!=NULL) release_list(*ls); - *ls=create_list(8); - for(i=0;list[i]!=0;i++) - { - int it=list[i]-1; - if (it>=max_items) str_add(ls,"");else str_add(ls,item_list[it].jmeno); - } - } - -static void add_to_vyk() - { - int i,p; - TSTR_LIST ls; - TSTR_LIST ls2; - TVYKLENEK *v; - int id; - - i=f_get_value(0,9); - p=f_get_value(0,29); - id=f_get_value(0,20); - send_message(E_GUI,29,E_CONTROL,0,&ls); - send_message(E_GUI,9,E_CONTROL,0,&ls2); - if (ls2[i]==NULL) return; - sscanf(ls2[i],"%d",&i); - if (i==-1) return; - v=vyklenky+id; - if (p!=7)memmove(v->items+p+1,v->items+p,(7-p)*2); - v->items[8]=0; - v->items[p]=i+1; - veci_ve_vyklenku(&ls,&v->items); - send_message(E_GUI,29,E_CONTROL,1,ls); - } - -static void remove_from_vyk() - { - int i; - TVYKLENEK *v; - TSTR_LIST ls; - int id; - - i=f_get_value(0,29); - if (i>=8) return; - id=f_get_value(0,20); - v=vyklenky+id; - memmove(&v->items[i],&v->items[i+1],(8-i)*2); - send_message(E_GUI,29,E_CONTROL,0,&ls); - veci_ve_vyklenku(&ls,&v->items); - send_message(E_GUI,29,E_CONTROL,1,ls); - } - -static change_grep() - { - TSTR_LIST ls; - char grep_en; - int grep_type; - int grep_num; - - c_set_value(0,9,0); - send_message(E_GUI,9,E_CONTROL,2); - grep_en=f_get_value(0,90); - grep_type=f_get_value(0,80); - if (grep_en) grep_num=grep_type;else grep_num=-1; - send_message(E_GUI,9,E_CONTROL,0,&ls); - create_isort_list(&ls,grep_num); - send_message(E_GUI,9,E_CONTROL,1,ls); - redraw_desktop(); - } - -void edit_vyklenek(int idnum) - { - TVYKLENEK *v=vyklenky+idnum; - TSTR_LIST vyklist=NULL; - TSTR_LIST ls_sorts=NULL; - CTL3D b1,b2,b3; - TVYKLENEK old; - - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D)); - memcpy(&old,v,sizeof(TVYKLENEK)); - veci_ve_vyklenku(&vyklist,&v->items); - create_isort_list(&ls_sorts,-1); - def_dialoge(70,100,500,200,"Oprava v�klenk�"); - define(9,10,20,200,126,0,listbox,ls_sorts,RGB555(31,31,31),0); - property(&b3,NULL,NULL,WINCOLOR);c_default(0); - define(10,216,40,21,87,0,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(&b2,NULL,NULL,WINCOLOR); - define(11,216,20,21,17,0,scroll_button,-1,0,"\x1e"); - property(&b1,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,216,130,21,17,0,scroll_button,1,10,"\x1f"); - property(&b1,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(20,0,0,0,0,0,value_store,4);c_default(idnum); - define(29,10,20,200,120,1,listbox,vyklist,RGB555(31,31,31),0); - property(&b3,NULL,NULL,WINCOLOR);c_default(0); - define(40,242,40,40,15,0,button,">>");on_control_change(add_to_vyk); - define(50,242,60,40,15,0,button,"<<");on_control_change(remove_from_vyk); - define(80,30,150,120,12,1,str_line,typy_veci);c_default(0); - property(&b2,NULL,NULL,WINCOLOR);on_control_enter(string_list_sup);on_control_change(change_grep); - define(-1,150,150,50,10,1,label,"Filtr:"); - define(90,10,150,10,10,1,check_box,"");c_default(0);on_control_change(change_grep); - define(-1,10,30,1,10,3,label,"Xpos Ypos Xsiz Ysiz Sector Pos"); - define(100,8,12,40,12,3,input_line,10,0,500,"%4d");set_default(strs(v->xpos)); - property(&b2,NULL,NULL,WINCOLOR);on_control_exit(test_int); - define(110,53,12,40,12,3,input_line,10,0,500,"%4d");set_default(strs(v->ypos)); - property(&b2,NULL,NULL,WINCOLOR);on_control_exit(test_int); - define(120,98,12,40,12,3,input_line,10,0,500,"%4d");set_default(strs(v->xs)); - property(&b2,NULL,NULL,WINCOLOR);on_control_exit(test_int); - define(130,143,12,40,12,3,input_line,10,0,500,"%4d");set_default(strs(v->ys)); - property(&b2,NULL,NULL,WINCOLOR);on_control_exit(test_int); - define(140,188,12,40,12,3,input_line,10,0,maplen,"%4d");set_default(strs(v->sector)); - property(&b2,NULL,NULL,WINCOLOR);on_control_exit(test_int); - define(150,233,12,40,12,3,input_line,10,0,3,"%4d");set_default(strs(v->dir)); - property(&b2,NULL,NULL,WINCOLOR);on_control_exit(test_int); - define(200,5,5,60,20,2,button,"Ok");on_control_change(terminate_gui);property(&b1,NULL,NULL,WINCOLOR); - define(210,70,5,60,20,2,button,"Zru�it");on_control_change(terminate_gui);property(&b1,NULL,NULL,WINCOLOR); - define(220,135,5,60,20,2,button,"Vymazat");on_control_change(terminate_gui);property(&b1,NULL,NULL,WINCOLOR); - redraw_window(); - opp: - escape(); - if (o_aktual->id==200) - { - v->xpos=vals(100); - v->ypos=vals(110); - v->xs=vals(120); - v->ys=vals(130); - v->sector=vals(140); - v->dir=vals(150); - } - else if (o_aktual->id==220) - if (msg_box("Mapedit",'\x2',"Chce� opravdu v�klenek zbourat?","Ano","Ne",NULL)==1) - { - v->sector=0; - } - else goto opp; - else if (o_aktual->id==210) - { - memcpy(v,&old,sizeof(old)); - } - send_message(E_GUI,9,E_CONTROL,0,&ls_sorts); - release_list(vyklist); - release_list(ls_sorts); - close_current(); - } diff --git a/MAPS/EDIT_MAP.H b/MAPS/EDIT_MAP.H deleted file mode 100644 index 04ce908..0000000 --- a/MAPS/EDIT_MAP.H +++ /dev/null @@ -1,21 +0,0 @@ -void edit_sector(int source); -void open_sector_win(void); -void info_sector(int sector); -void open_draw_win(void); -long get_draw_flags(void); -void edit_side(int source,int smer); -void sector_details_call(int sect_num); -void chozeni2(EVENT_MSG *msg,OBJREC *o); -void jdi_na_sektor(int s); - - -void string_list_sup(); -void str_line(OBJREC *o); -char *strs(int num); -long vals(int num); -void test_int(void); -void fill_bit_fields(int win,int id_start,int source,int count); -long get_bit_fields(int win,int id_start,int count); -void value_store(OBJREC *o); - - diff --git a/MAPS/GLOBALS.H b/MAPS/GLOBALS.H deleted file mode 100644 index 0ca6ffb..0000000 --- a/MAPS/GLOBALS.H +++ /dev/null @@ -1,133 +0,0 @@ -#define WINCOLOR RGB555(24,24,24) -#define LABELCOLOR RGB555(0,0,15) - -#define OK_BUTT 10000 -#define CANCEL_BUTT 10001 -#define YES_BUTT 10002 -#define NO_BUTT 10003 - -#define SID ".SID" -#define CEI ".CEI" -#define FLR ".FLR" -#define OBL ".OBL" -#define TXT ".TXT" -#define TEXT_FILE "..\\popisy.txt" -#define XITEM_FILE "ITEMS.DAT" -#define XDLG_SCRIPT "dialogy.scr" -#define XWEAPONS_SCRIPT "weapons.scr" - -#define SAMPLE_PATH sample_path -#define XMUSIC_PATH "..\\music\\" - -#define XSHOP_NAME "shops.dat" -#define ITEMS_DAT ITEM_FILE -#define XMOB_FILE "enemy.dat" -#define XMOB_SOUND "SOUND.DAT" - -#define ITEM_FILE mapFiles.items_dat -#define DLG_SCRIPT mapFiles.dialogy_scr -#define WEAPONS_SCRIPT mapFiles.weapons_scr - - -#define SHOP_NAME mapFiles.shops_dat -#define MOB_FILE mapFiles.enemy -#define MOB_SOUND mapFiles.enemy_sound - -typedef struct _MapFilesTag -{ - char *items_script; - char *items_pics; - char *items_dat; - char *dialogy_scr; - char *weapons_scr; - char *shops_dat; - char *enemy; - char *enemy_sound; -}SMapFiles; - -extern SMapFiles mapFiles; - -#define concat(c,a,b) strcpy((c=alloca(strlen(a)+strlen(b)+1)),a),strcat(c,b) - -extern char *sample_path; -extern word *icones,*vga_font; -extern word icone_color[7]; -extern char **actions; -extern char **steny2; -extern char **zivly; -extern char **sector_types; -extern char **act_types; -extern char **typy_zbrani; -extern char **typy_veci; -extern char **umisteni_veci; -extern char **side_flgs; -extern word menu_win; -extern int sektor_win; -extern draw_win; -extern m_zoom; -extern long xmap_offs,ymap_offs,cur_layer; -extern char sekceid[8]; -extern char filename[MAX_PATH]; -extern int test_mode; -extern int multiaction_win; -extern int enemy_win; -extern long wiz_tool_numb; -extern int item_win; -extern int vzor_win; -extern int selected_place; -extern char **config_file; -extern char *script_name; - -#define MSB_OK "Ok",NULL -#define MSB_ANONE "Ano","Ne",NULL -#define MSB_ANONEZRUSIT "Ano","Ne","Zruit",NULL -#define MSB_OKZRUSIT "Ok","Zruit",NULL -#define SCROLLBARCOL RGB(0,20,0) - -void graph_init(char windowed); -long def_window(word xs,word ys,char *name); -void def_dialoge(word x,word y,word xs, word ys, char *name); -void zoomin(); -void zoomout(); -char *pripona(char *fname,char *prip); -void browser(const char *pathname,char *filename); -void call_testmap(int); -void editor_veci(); -void pcxviewer(); - -void shop_train_edit(); -void save_items(); -void load_items(); -void save_all_shops(); -void load_all_shops(); -void re_build_shop_list(void *,void *, int); -void mapy_init(void); -void init_multiactions(); -void update_multiactions(); -void *save_macros(); -void load_macros(void *data); -void play_wav(va_list args); -void save_sound_map(); -void load_sound_map(); -void load_background(); -void mob_test_sound(); -void check_unused_sounds(); -int add_mob_sound(char *wav); -void mob_sound_copy(); -extern TSTR_LIST enemy_sound; -void edit_vyklenek(int idnum); -void create_isort_list(TSTR_LIST *ls_sorts,int filter); -void item_sound_call(void *it); - - -void remove_items_from_sector(int sector); -void remove_mobs_from_sector(int sector); - -char ask_password(char *pass,char text); -char check_data_password(void); -char *set_data_password(char *); - -char **read_ddl_dir(char *filter); -void read_ddl_list_wav(char ***list); - - diff --git a/MAPS/ITEMS.C b/MAPS/ITEMS.C deleted file mode 100644 index d80a771..0000000 --- a/MAPS/ITEMS.C +++ /dev/null @@ -1,1012 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mapy.h" -#include "globals.h" -#include "edit_map.h" - -#define ITEM_IKON "..\\grafika\\items\\" - -//------------------------MAP EDIT ITEM SYSTEM----------------------- - -#define MARK_INSIDE 0x8101 -#define MARK_NEXT 0x8102 -#define MARK_END_GROUP 0x8100 - -TITEM *item_tree=NULL; - -TITEM *clean_item(TITEM *it) - { - memset(it,0,sizeof(*it)); - return it; - } - -TITEM *create_new_item() - { - if (item_tree==NULL) - { - item_tree=(TITEM *)getmem(sizeof(TITEM)); - item_tree->next=NULL; - item_tree->inside=NULL; - item_tree->parent=NULL; - } - else - { - TITEM *p; - - p=(TITEM *)getmem(sizeof(TITEM)); - p[0].next=item_tree; - p[0].inside=NULL; - p[0].parent=NULL; - item_tree->parent=p; - item_tree=p; - } - return item_tree; - } - -TITEM *isolate_item(TITEM *it) - { - TITEM *p; - - p=it->parent; - if (it==item_tree) - { - item_tree=it->next; - item_tree->parent=NULL; - it->next=NULL; - it->parent=NULL; - } - else - if (p!=NULL) - if (p->inside==it) - { - p->inside=it->next; - it->parent=NULL; - it->next=NULL; - if (p->inside!=NULL)(p->inside)->parent=p; - } - else - { - p->next=it->next; - it->parent=NULL; - it->next=NULL; - if (p->next!=NULL)(p->next)->parent=p; - } - return it; - } - -TITEM *isolate_item_group(TITEM *it) - { - TITEM *p; - - p=it->parent; - if (p!=NULL) - if (p->inside==it) - { - p->inside=NULL; - it->parent=NULL; - } - else - { - p->next=NULL; - it->parent=NULL; - } - return it; - } - - -TITEM *insert_inside(TITEM *it1,TITEM *it2) - { - TITEM *p; - - if (it1->parent!=NULL) return NULL; //chyba: predmet je uz nekde vlozen - je nutne ho izolovat - p=it2; - while (p!=it1 && p!=NULL) p=p->parent; - if (p==it1) return NULL; //chyba v integrite : nelze vlozit predmet do sebe; - p=it1; - while (p->next!=NULL) p=p->next; - p->next=it2->inside; - it2->inside=it1; - it1->parent=it2; - if (p->next!=NULL) (p->next)->parent=p; - return it2; - } - -TITEM *insert_isolated(TITEM *it1) //vlozi izolovany predmet na zakladni uroven - { - if (it1->parent==NULL && it1->next==NULL) - { - if ((it1->next=item_tree)!=NULL) item_tree->parent=it1; - item_tree=it1; - return item_tree; - } - else - return NULL; //predmet neni izolovan; - } - -TITEM *create_location(TITEM *it,int druh,int sector,int posit,char *level) - { - it->jmeno[0]='~'; - it->jmeno[1]=0; - switch (druh) - { - case IT_MAPLOC:sprintf(it->popis,"MAPA: %s SECT: %d POS: %d",level,sector,posit);break; - case IT_MONSTER:sprintf(it->popis,"MAPA: %s OBLUDA: %d UMISTENI %d",level,sector,posit); - } - it->druh=druh; - it->hmotnost=sector; - it->nosnost=posit; - return it; - } - -void generate_item_list(TITEM *start,TSTR_LIST *list, char first) - { - static char c[80]; - static int start_list; - - if (first) start_list=0; - while (start!=NULL) - if (start->jmeno[0]!='~') - { - sprintf(c,"%08X %s",(int)start,start->jmeno); - if (str_replace(list,start_list,c)==NULL) return; - start_list++; - if (start->inside!=NULL) generate_item_list(start->inside,list,0); - start=start->next; - } - } -void generate_item_tree(TITEM *start,TSTR_LIST *list, char first) - { - static char tree[80]; - static char c[80]; - static int start_list; - - if (first) - { - start_list=0; - tree[0]='\0'; - } - strcat(tree," "); - while (start!=NULL) - { - if (start->next==NULL) - { - char *d; - - d=strchr(tree,'\0')-3; - strcpy(d,"�� "); - } - else - { - char *d; - - d=strchr(tree,'\0')-3; - strcpy(d,"�� "); - } - if (start->jmeno[0]=='~') - sprintf(c,"%08X %s%s",(int)start,tree,start->popis); - else - sprintf(c,"%08X %s%s",(int)start,tree,start->jmeno); - if (str_replace(list,start_list,c)==NULL) return; - start_list++; - if (start->inside!=NULL) - { - if (start->next==NULL) - { - char *d; - - d=strchr(tree,'\0')-3; - strcpy(d,"\xdb\xdb "); - } - else - { - char *d; - - d=strchr(tree,'\0')-3; - strcpy(d,"�\xdb "); - } - generate_item_tree(start->inside,list,0); - } - start=start->next; - } - tree[strlen(tree)-3]='\0'; - } - -void save_item_group(TITEM *it,FILE *f); - -void save_item(TITEM *it,FILE *f) - { - fwrite(it,1,sizeof(*it),f); - if (it->inside!=NULL) - { - { - unsigned short i=MARK_INSIDE; - - fwrite(&i,1,sizeof(i),f); - } - save_item_group(it->inside,f); - } - if (it->next!=NULL) - { - unsigned short i=MARK_NEXT; - - fwrite(&i,1,sizeof(i),f); - } - else - { - unsigned short i=MARK_END_GROUP; - - fwrite(&i,1,sizeof(i),f); - } - } - -void save_item_group(TITEM *it,FILE *f) - { - while (it!=NULL) - { - save_item(it,f); - it=it->next; - } - } - -TITEM *load_group(TITEM *parent,FILE *f) - { - TITEM *p,*q=NULL; - unsigned short mark=MARK_NEXT; - - - while (mark==MARK_NEXT) - { - p=(TITEM *)getmem(sizeof(TITEM)); - fread(p,1,sizeof(*p),f); - p->next=q; - p->parent=parent; - p->inside=NULL; - if (q!=NULL) q->parent=p; - q=p; - fread(&mark,1,sizeof(mark),f); - if (mark==MARK_INSIDE) - { - p->inside=load_group(p,f); - fread(&mark,1,sizeof(mark),f); - } - } - return q; - } - -int delete_item(TITEM *it) - { - TITEM *p; - - if (it->parent!=NULL || it->next!=NULL) return -1; - p=it->inside; - while (p!=NULL) - { - TITEM *q; - - q=p->next; - insert_isolated(isolate_item(p)); - p=q; - } - free(it); - return 0; - } -TITEM *clone_item(TITEM *it,char inside) - { - TITEM *i2,*i3,*i4,*i5,*i6; - - i2=create_new_item(); - memcpy(i2,it,sizeof(TITEM)-12); - if (it->inside!=NULL) - if (inside) - { - i4=it->inside;i5=NULL;i6=NULL; - while (i4!=NULL) - { - i3=clone_item(i4,inside); - i3=isolate_item(i3); - if (i5==NULL) - { - i5=i3; - i6=i3; - i5->parent=i2; - } - else - { - i6->next=i3; - i3->parent=i6; - i6=i6->next; - } - i4=i4->next; - } - i2->inside=i5; - } - return i2; - } - -//-------------------------------------------------------------- -void workspace_draw(int x1,int y1,int x2, int y2,OBJREC *o); - -TITEM *selected_item; -int lastpos_sec; -int lastpos_sid; - - -void workspace_items(int x1,int y1,int x2, int y2, OBJREC *o) - { - int xc,yc,x,y,s,p; - int xb1,yb1,xb2,yb2; - char *c; - char cn[20],dn[20]; - int mapx,mapy; - TITEM *pt; - - workspace_draw(x1,y1,x2,y2,o); - xc=(o->xs % M_ZOOM)>>1; - yc=(o->ys % M_ZOOM)>>1; - *(long *)o->data=1; - mapx=(x2-x1)>>m_zoom; - mapy=(y2-y1)>>m_zoom; - pt=item_tree; - while (pt!=NULL) - { - if (pt->druh==IT_MAPLOC) - { - c=&pt->popis; - sscanf(c,"%s%s",dn,cn); - s=pt->hmotnost; - p=pt->nosnost; - if (minfo[s].layer==cur_layer && !strcmp(cn,filename)) - { - x=minfo[s].x;y=minfo[s].y; - x-=xmap_offs; - y-=ymap_offs; - if (x>=0 && y>=0 && xlocx+x*M_ZOOM+(M_ZOOM/2)*((p & 1)!=((p & 2)>>1)); - yb1=yc+o->locy+y*M_ZOOM+(M_ZOOM/2)*((p & 2)!=0); - xb2=xb1+M_ZOOM/2-1; - yb2=yb1+M_ZOOM/2-1; - curcolor=RGB555(31,0,31); - line(xb1,yb1,xb2,yb2); - line(xb2,yb1,xb1,yb2); - } - } - } - pt=pt->next; - } - } - -void workspace_select_item(EVENT_MSG *msg,OBJREC *o) - { - MS_EVENT *ms; - int xn,yn,xc,yc; - int x1,y1,xp,yp; - int s,l,i; - char *c; - TITEM *it; - - xc=(o->xs % M_ZOOM)>>1; - yc=(o->ys % M_ZOOM)>>1; - xn=o->locx+xc; - yn=o->locy+yc; - if (msg->msg==E_MOUSE) - if ((ms=get_mouse(msg))->event_type==0x2) - { - x1=(ms->x-xn)/(M_ZOOM/2); - y1=(ms->y-yn)/(M_ZOOM/2); - xp=x1 & 0x1;x1>>=1; - yp=y1 & 0x1;y1>>=1; - x1+=xmap_offs; - y1+=ymap_offs; - l=2*(yp!=0)+(xp!=yp); - for (i=0;idruh==IT_MAPLOC) - { - char cn[20],dn[20]; - int lc; - - c=&it->popis; - sscanf(c,"%s%s%s%d%s%d",dn,cn,dn,&s,dn,&lc); - if (s==i && lc==l && !strcmp(cn,filename)) - { - selected_item=it; - return; - } - } - it=it->next; - } - } - selected_item=NULL; - } - } - -TITEM *items_on_map() - { - OBJREC *o; - - waktual->modal=0; - create_map_win(-1); - select_window(tool_bar); - if (waktual->id==tool_bar) close_current(); - select_window(map_win); - o=find_object(waktual,10); - o->call_draw=workspace_items; - o->call_event=workspace_select_item; - set_window_modal(); - selected_item=NULL; - while (selected_item==NULL && waktual->id==map_win) do_events(); - if (waktual->id==map_win) close_current(); - waktual->modal=1; - return selected_item; - } - -void item_umisti_v_mape(TITEM *it) - { - OBJREC *o; - - waktual->modal=0; - create_map_win(-1); - select_window(tool_bar); - if (waktual->id==tool_bar) close_current(); - select_window(map_win); - o=find_object(waktual,10); - o->call_draw=workspace_items; - o->call_event=workspace_select_item; - set_window_modal(); - lastpos_sec=-1; - while (waktual->id==map_win) - { - do_events(); - if (lastpos_sec!=-1) - { - if (selected_item!=NULL) insert_inside(isolate_item(clone_item(it,0)),selected_item); - else insert_inside(isolate_item(clone_item(it,1)),create_location(create_new_item(),IT_MAPLOC,lastpos_sec,lastpos_sid,filename)); - lastpos_sec=-1; - redraw_desktop(); - } - } - waktual->modal=1; - return; - } - -void ikona_display(int x1,int y1,int x2,int y2,OBJREC *o) - { - static char *ikonlib=NULL; - static int lastikolib=-1; - int nowlib; - int ikn; - char s[200]; - - ikn=*(int *)o->data; - nowlib=ikn/18; - if (lastikolib!=nowlib) - { - FILE *f;int i; - sprintf(s,ITEM_IKON"ikony%02d.lib",nowlib); - f=fopen(s,"rb"); - if (f==NULL) - for(i=0;i<18;i++) - { - memset(&ikonlib[2+2+2+512+2475*i],0,2993); - } - else - { - if (ikonlib==NULL) ikonlib=(char *)getmem(18*2993); - fread(ikonlib,1,18*2993,f); - fclose(f); - } - lastikolib=nowlib; - } - ikn%=18; - bar(x1,y1,x2,y2); - put_picture(x1,y1,ikonlib+ikn*2993); - } - -void ikona_click(EVENT_MSG *msg,OBJREC *o) - { - MS_EVENT *ms; - - o; - if (msg->msg==E_MOUSE) - { - ms=get_mouse(msg); - if (ms->event_type==0x4) - set_change(); - } - } - -void ikona(OBJREC *o) - { - o->call_draw=ikona_display; - o->call_event=ikona_click; - o->datasize=4; - } - -int select_ikon_lib(int last) - { - int x,y,i,s; - - s=last; - def_dialoge(50,200,500,264,"Knihovna ikon - vyber jednu ikonu"); - x=5;y=20; - for (i=0;i<30;i++) - { - define(i+10,x,y,45,55,0,ikona);c_default(last+i); - property(def_border(5,WINCOLOR),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - x+=48;if (x+48>490) {y+=58;x=5;} - } - define(300,10,10,80,20,3,button,"<<"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(310,10,10,80,20,2,button,">>"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(320,175-40,10,80,20,3,button,"Zru�it"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - do - { - escape(); - if (o_aktual->id==300) - { - last-=30;if (last<0) last=0; - for(i=0;i<30;i++) c_set_value(0,10+i,last+i); - } - if (o_aktual->id==310) - { - last+=30; - for(i=0;i<30;i++) c_set_value(0,10+i,last+i); - } - } - while (o_aktual->id==310 || o_aktual->id==300); - i=o_aktual->id; - close_current(); - if (i==320) i=s; else i=i-10+last; - return i; - } - -void change_item_ikone() - { - c_set_value(0,130,select_ikon_lib(f_get_value(0,130))); - } - -char nvlast[][16]= - {"cS�la","Schopnost magie","Pohyblivost","Obratnost","Max zran�n�", - "Kondice","Max mana","Obrana(doln�)","Obrana(Horn�)","�tok(Doln�)", - "�tok(Horn�)","Ohe�","Voda","Zem�","Vzduch","Mysl","Magick� s�la(D)", - "Magick� s�la(H)","\0"}; - -void ukaz_vlastnosti(int pocet,int x,int y,int id,short *it) - { - word i,ts; - - i=0; - curfont=vga_font; - default_font=curfont; - while (nvlast[i][0] && i200) - { - x+=200; - y=20; - } - define(-1,x,y,ts,10,0,label,nvlast[i]); - define(id++,x+130,y,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(def_border(5,WINCOLOR),NULL,NULL,WINCOLOR); - set_default(strs(*it));it++; - on_exit(test_int); - y+=15; - i++; - } - } - -void oprav_vlastnosti(TITEM *it) - { - int i; - def_dialoge(120,80,410,300,"Vlastnosti"); - ukaz_vlastnosti(4,5,20,70,&it->podminky); - define(-1,5,93,190,0,0,label,"");property(def_border(2,WINCOLOR),NULL,NULL,WINCOLOR); - ukaz_vlastnosti(99,5,105,80,&it->zmeny); - define(130,5,200,100,10,0,check_box,"Na hlavu"); - define(140,5,212,100,10,0,check_box,"Na krk"); - define(150,5,224,100,10,0,check_box,"Na telo"); - define(160,5,236,100,10,0,check_box,"Na ruce"); - define(170,5,248,100,10,0,check_box,"Na lokte"); - define(180,5,260,100,10,0,check_box,"Kolem pasu"); - define(190,5,272,100,10,0,check_box,"Na nohy"); - define(200,105,200,100,10,0,check_box,"Na chodidla"); - define(210,105,212,100,10,0,check_box,"Na ramena"); - define(220,105,224,100,10,0,check_box,"Na z�da"); - define(300,10,10,80,20,2,button,"Zru�it");on_control_change(terminate_gui); - property(def_border(1,0),NULL,NULL,WINCOLOR); - define(310,10,40,80,20,2,button,"Ok");on_control_change(terminate_gui); - property(def_border(1,0),NULL,NULL,WINCOLOR); - define(-1,225,206,70,10,0,label,"Magick� �tok"); - define(250,225,218,70,70,0,radio_butts,5,"Ohe�","Voda","Zem�","Vzduch","Mysl"); - c_default(it->zmeny[VLS_MGZIVEL]); - fill_bit_fields(0,130,it->place_map,11); - redraw_window(); - escape(); - if (o_aktual->id==310) - { - for(i=0;i<4;i++) it->podminky[i]=vals(i+70); - for(i=0;i<18;i++) it->zmeny[i]=vals(i+80); - it->place_map=get_bit_fields(0,130,10); - it->zmeny[VLS_MGZIVEL]=f_get_value(0,250); - } - close_current(); - } - -void otevri_vlastnosti() - { - TITEM *it; - - get_value(0,5,&it); - oprav_vlastnosti(it); - } - -void save_edited_item() - { - TITEM *it; - - get_value(0,5,&it); - get_value(0,15,it->jmeno); - get_value(0,20,it->popis); - it->hmotnost=vals(40); - it->nosnost=vals(50); - it->keynum=vals(60); - it->user_value=vals(70); - it->use_event=vals(80); - it->druh=f_get_value(0,90); - it->spell=vals(100); - it->magie=vals(110); - it->silaspell=vals(120); - it->ikona=f_get_value(0,130); - terminate_gui(); - } - -TITEM *select_item(TITEM *it); - -void e_item_insert_inside() - { - TITEM *it,*is; - - save_edited_item(); - get_value(0,5,&it); - is=select_item(item_tree); - if (is==NULL) return; - it=isolate_item(it); - if (insert_inside(it,is)==NULL) - { - msg_box("Chyba integrity:",'\x1',"Nelze vlo�it tento p�edm�t do zvolen�ho " - "Patrn� se pokou��� vlo�it tut�� v�c samu do sebe. Nebo v�c nen� " - "izolov�na, nebo ji nelze izolovat. Je mo�n� �e se sna��� vlo�it " - "v�c do v�ci, kter� je uvnit� t�to v�ci, nebo v uvnit� v�ci, kter� " - "je uvnit� v�ci, do kter� chce� v�c um�stit atd. Mohlo by dojit k " - "zacyklen� a to nelze dopustit. Program bude v�c izolovat, jeliko� " - "ji� nelze rekonstruovat p�vodn� stav","Budu si pamatovat",NULL); - insert_isolated(it); - return; - } - terminate_gui(); - } - -void e_item_insert_map() - { - TITEM *it; - - save_edited_item(); - get_value(0,5,&it); - item_umisti_v_mape(it); - } -void item_edit(TITEM *it) - { - CTL3D *c; - - c=def_border(5,WINCOLOR); - def_dialoge(120,80,410,300,"Oprava �daj� o p�edm�tu"); - curfont=vga_font; - default_font=curfont; - define(-1,5,20,50,10,0,label,"Jm�no (31 znak�)"); - define(15,10,35,288,12,0,input_line,31);set_default(it->jmeno); - property(def_border(2,WINCOLOR),NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - define(-1,5,50,50,10,0,label,"Popis (63 znak�)"); - define(20,10,65,380,12,0,input_line,63);set_default(it->popis); - property(def_border(2,WINCOLOR),NULL,flat_color(0xF),WINCOLOR); - define(5,0,0,0,0,0,value_store,4);set_default(&it); - define(30,10,30,80,20,1,button,"Vlastnosti"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(otevri_vlastnosti); - define(-1,5,80,100,10,0,label,"Hmotnost"); - define(-1,5,95,100,10,0,label,"Nosnost"); - define(-1,5,110,100,10,0,label,"ID Kl��e"); - define(-1,5,125,100,10,0,label,"?Hodnota"); - define(-1,5,140,100,10,0,label,"�.Ud�losti"); - define(-1,5,155,100,10,0,label,"Druh"); - def_border(5,WINCOLOR); - define(40,105,80,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->hmotnost)); - define(50,105,95,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->nosnost)); - define(60,105,110,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->keynum)); - define(70,105,125,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->user_value)); - define(80,105,140,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->use_event)); - define(90,80,155,120,108,0,radio_butts,10, - "Nespecif.", - "Brn�n�", - "Ru�n� zbra�", - "Svitek/Hulka", - "St�eln� zbr.", - "Vrhac�", - "Lektvar/M�ch", - "J�dlo", - "Batoh/Truhla", - "Specialn�");c_default(it->druh); - define(-1,105,80,100,10,1,label,"Kouzlo:"); - define(-1,105,95,100,10,1,label,"Mana celk:"); - define(-1,105,110,100,10,1,label,"S�la kouzla"); - define(100,55,80,60,12,1,input_line,7,-32767,32767,"%6d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->spell)); - define(110,55,95,60,12,1,input_line,7,-32767,32767,"%6d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->magie)); - define(120,55,110,60,12,1,input_line,7,-32767,32767,"%6d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->silaspell)); - define(130,10,180,45,55,0,ikona);c_default(it->ikona); - property(c,NULL,NULL,WINCOLOR);on_control_change(change_item_ikone); - define(300,10,10,80,20,3,button,"Ulo�");property(def_border(1,0),NULL,NULL,RGB(0,24,0));on_control_change(save_edited_item); - define(310,100,10,80,20,3,button,"Vlo�it do");property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(e_item_insert_inside); - define(320,100,10,80,20,2,button,"Um�stit");property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(e_item_insert_map); - define(330,10,10,80,20,2,button,"Zru�it");property(def_border(1,0),NULL,flat_color(RGB555(31,31,31)),RGB555(16,0,0);on_control_change(terminate_gui); - redraw_window(); - escape(); - close_current(); - } - - -void select_item_edit() - { - TITEM *it; - TSTR_LIST ls; - int i; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - i=f_get_value(0,9); - if (ls[i]==NULL) return; - sscanf(ls[i],"%X",&it); - if ((unsigned short)it->druh>=256) - { - msg_box("Nelze!",'\x1',"Nelze upravovat tento druh v�ci","Beru na v�dom�",NULL); - return; - } - item_edit(it); - generate_item_tree(item_tree,&ls,1); - str_delfreelines(&ls); - send_message(E_GUI,9,E_CONTROL,1,ls); - } - -void select_item_klon() - { - TITEM *it; - TSTR_LIST ls; - int i; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - i=f_get_value(0,9); - if (ls[i]==NULL) return; - sscanf(ls[i],"%X",&it); - if ((unsigned short)it->druh>=256) - { - msg_box("Nelze!",'\x1',"Nelze klonovat tento druh v�ci","Beru na v�dom�",NULL); - return; - } - if (it->inside!=NULL) - { - i=msg_box("Klonovat",'\x2',"Klonovat i v�ci uvnit�?","Ano","Ne",NULL); - } - it=clone_item(it,i==1); - generate_item_tree(item_tree,&ls,1); - str_delfreelines(&ls); - send_message(E_GUI,9,E_CONTROL,1,ls); - } - -void select_item_isolate() - { - TITEM *it; - TSTR_LIST ls; - int i; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - i=f_get_value(0,9); - if (ls[i]==NULL) return; - sscanf(ls[i],"%X",&it); - isolate_item(it); - insert_isolated(it); - generate_item_tree(item_tree,&ls,1); - str_delfreelines(&ls); - send_message(E_GUI,9,E_CONTROL,1,ls); - } - -void check_for_empty_loc() - { - TITEM *it1,*it2; - - it1=item_tree; - while (it1!=NULL) - { - if ((it1->druh==IT_MAPLOC || it1->druh==IT_MONSTER) && it1->inside==NULL) - { - it2=it1;it1=it2->next; - isolate_item(it2); - delete_item(it2); - } - else - it1=it1->next; - } - } - -void select_item_delete() - { - TITEM *it; - TSTR_LIST ls; - int i; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - i=f_get_value(0,9); - if (ls[i]==NULL) return; - sscanf(ls[i],"%X",&it); - if (item_tree==it && it->next==NULL) - { - msg_box("Nelze!",'\x1',"Jeden p�edm�t mus� z�stat","Ok",NULL); - return; - } - if (msg_box("P�edm�ty",'\x2',"Vymazat vybranou v�c","Souhlas","Ne",NULL)==2) return; - isolate_item(it); - delete_item(it); - check_for_empty_loc(); - release_list(ls); - ls=create_list(16); - generate_item_tree(item_tree,&ls,1); - str_delfreelines(&ls); - send_message(E_GUI,9,E_CONTROL,1,ls); - set_value(0,5,item_tree); - } - -void items_on_map_show() - { - TITEM *it; - TSTR_LIST il; - int ls; - int i; - - send_message(E_GUI,9,E_CONTROL,0,&il); - i=f_get_value(0,9); - if (il[i]==NULL) return; - sscanf(il[i],"%X",&it); - unselect_map(); - if (it->druh==IT_MAPLOC) - { - char c[20],d[20]; - sscanf(it->popis,"%s%s",c,d); - if (!strcmp(d,filename)) minfo[it->hmotnost].flags|=0x1; - } - it=items_on_map(); - if (it==NULL) return; - ls=str_count(il); - for(i=0;iid==60) - { - cis=f_get_value(0,9); - send_message(E_GUI,9,E_CONTROL,0,&il); - c=il[cis]; - if (c!=NULL) sscanf(c,"%x",&it); - } - close_current(); - return it; - } - -void editor_veci() - { - if (item_tree==NULL) item_edit(clean_item(create_new_item())); - select_item(item_tree); - } - -void save_items() - { - FILE *f; - - if (item_tree==NULL) return; - f=fopen(ITEM_FILE,"wb"); - save_item_group(item_tree,f); - fclose(f); - } - -void load_items() - { - FILE *f; - - f=fopen(ITEM_FILE,"rb"); - if (f==NULL) return; - item_tree=load_group(NULL,f); - fclose(f); - } diff --git a/MAPS/ITEMS2.C b/MAPS/ITEMS2.C deleted file mode 100644 index 2cdc66e..0000000 --- a/MAPS/ITEMS2.C +++ /dev/null @@ -1,1707 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mapy.h" -#include "globals.h" -#include "edit_map.h" -#include "steny.h" -#include "save_map.h" -#include "mob_edit.h" - - -#define ITEM_BUFFER 256 -#define SV_ITLIST 0x8001 -#define SV_SNDLIST 0x8002 -#define SV_END 0x8000 -#define SV_PASSW 0x1000 - -#define ITEM_IKON "..\\graphics\\items\\" -#define ITEM_MALE "..\\graphics\\basic\\char00.pcx" - -#define DIALOG_MASK "..\\graphics\\dialogs\\*.hi" - - -#define IT_INSIDE 0x1 -#define IT_IDENTF 0x2 -#define IT_UNIKAT 0x4 -#define IT_MAGIC 0x8 - -TITEM item_list[ITEM_SORTS]; -short *item_place[MAPSIZE*4]; -short item_buffer[ITEM_BUFFER]; -short max_items; -int item_win=-1; -int vzor_win=-1; -int selected_place=-1; -int preview_win=-1; -int grep_num=-1; - -static int shop_window=-1; - -TSTR_LIST vzhled_veci; -TSTR_LIST pohledy_veci; - -TSTR_LIST ls_buffer=NULL,ls_sorts=NULL; -TSTR_LIST itm_sounds=NULL; - -TSHOP *shop_list=NULL;int max_shops=0; -TSTR_LIST shop_items=NULL;short shop_max_id=1; -TTRAINING *train_list=NULL;int max_trains=0; - -void clear_it_buffer(); - -void init_item_system(void) - { - static char again=0; - int i; - - if (again) for(i=0;idata; - nowlib=ikn/18; - if (lastikolib!=nowlib) - { - FILE *f;int i;void *z;long size; - char *c=get_text_field(config_file,"CESTA_ITEMY"); - if (c==NULL) c=""; - sprintf(n,"ikony%02d.lib",nowlib); - sprintf(s,"%s%s",c,n); - if (ikonlib==NULL) ikonlib=(char *)getmem(18*2993); - f=fopen(s,"rb"); - if (f==NULL) - if ((z=afile(n,read_group(0),&size))==NULL) - for(i=0;i<18;i++) - { - memset(ikonlib+i*2993,0,2993); - } - else - { - memcpy(ikonlib,z,18*2993); - free(z); - } - else - { - fread(ikonlib,1,18*2993,f); - fclose(f); - } - lastikolib=nowlib; - for(i=0;i<18;i++) - { - int j; - word *z=(word *)(ikonlib+i*2993+6); - for (j=0;j<256;j++) z[j]=z[j]+(z[j] & 0x7FE0); - } - - } - ikn%=18; - bar(x1,y1,x2,y2); - put_picture(x1,y1,ikonlib+ikn*2993); - } - -void ikona_click(EVENT_MSG *msg,OBJREC *o) - { - MS_EVENT *ms; - - o; - if (msg->msg==E_MOUSE) - { - ms=get_mouse(msg); - if (ms->event_type==0x4) - set_change(); - } - } - -void ikona(OBJREC *o) - { - o->call_draw=ikona_display; - o->call_event=ikona_click; - o->datasize=4; - } - -int select_ikon_lib(int last) - { - int x,y,i,s; - - s=last; - def_dialoge(50,200,500,264,"Knihovna ikon - vyber jednu ikonu"); - x=5;y=20; - for (i=0;i<30;i++) - { - define(i+10,x,y,45,55,0,ikona);c_default(last+i); - property(def_border(5,WINCOLOR),NULL,NULL,0);on_control_change(terminate_gui); - x+=48;if (x+48>490) {y+=58;x=5;} - } - define(300,10,10,80,20,3,button,"<<"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(310,10,10,80,20,2,button,">>"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(320,175-40,10,80,20,3,button,"Zru�it"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - do - { - escape(); - if (o_aktual->id==300) - { - last-=30;if (last<0) last=0; - for(i=0;i<30;i++) c_set_value(0,10+i,last+i); - } - if (o_aktual->id==310) - { - last+=30; - for(i=0;i<30;i++) c_set_value(0,10+i,last+i); - } - } - while (o_aktual->id==310 || o_aktual->id==300); - i=o_aktual->id; - close_current(); - if (i==320) i=s; else i=i-10+last; - return i; - } - -void change_item_ikone() - { - c_set_value(0,130,select_ikon_lib(f_get_value(0,130))); - } - -char nvlast[][16]= - {"S�la","Schopnost magie","Pohyblivost","Obratnost","Max zran�n�", - "Kondice","Max mana","Obrana(doln�)","Obrana(Horn�)","�tok(Doln�)", - "�tok(Horn�)","Ohe�","Voda","Zem�","Vzduch","Mysl","�ivoty Regen", - "Mana Regen","Kondice Regen","Magick� s�la(D)", "Magick� s�la(H)","","��innek z�sahu","*"}; - -void ukaz_vlastnosti(int pocet,int x,int y,int id,short *it) - { - word i,ts; - - i=0; - curfont=vga_font; - default_font=curfont; - while (nvlast[i][0]!='*' && i250) - { - x+=200; - y=20; - } - if (nvlast[i][0]) - { - define(-1,x,y,ts,10,0,label,nvlast[i]); - define(id++,x+130,y,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(def_border(5,WINCOLOR),NULL,NULL,WINCOLOR); - set_default(strs(*it)); - on_exit(test_int); - y+=15; - } - it++; - i++; - } - } - -void oprav_vlastnosti(TITEM *it) - { - int i; - def_dialoge(120,80,410,310,"Vlastnosti"); - ukaz_vlastnosti(4,5,20,70,it->podminky); - define(-1,5,93,190,0,0,label,"");property(def_border(2,WINCOLOR),NULL,NULL,WINCOLOR); - ukaz_vlastnosti(99,5,105,80,it->zmeny); - /*define(130,5,200,100,10,0,check_box,"Na hlavu"); - define(140,5,212,100,10,0,check_box,"Na krk"); - define(150,5,224,100,10,0,check_box,"Na telo"); - define(160,5,236,100,10,0,check_box,"Na ruce"); - define(170,5,248,100,10,0,check_box,"Na lokte"); - define(180,5,260,100,10,0,check_box,"Kolem pasu"); - define(190,5,272,100,10,0,check_box,"Na nohy"); - define(200,105,200,100,10,0,check_box,"Na chodidla"); - define(210,105,212,100,10,0,check_box,"Na ramena"); - define(220,105,224,100,10,0,check_box,"Na z�da"); */ - define(300,10,10,80,20,2,button,"Zru�it");on_control_change(terminate_gui); - property(def_border(1,0),NULL,NULL,WINCOLOR); - define(310,10,40,80,20,2,button,"Ok");on_control_change(terminate_gui); - property(def_border(1,0),NULL,NULL,WINCOLOR); - define(-1,225,216,70,10,0,label,"Magick� �tok"); - define(250,225,228,70,70,0,radio_butts,5,"Ohe�","Voda","Zem�","Vzduch","Mysl"); - c_default(it->zmeny[VLS_MGZIVEL]); -// fill_bit_fields(0,130,it->place_map,11); - redraw_window(); - escape(); - if (o_aktual->id==310) - { - for(i=0;i<4;i++) it->podminky[i]=vals(i+70); - for(i=0;i<23;i++) it->zmeny[i]=vals(i+80); -// it->place_map=get_bit_fields(0,130,10); - it->zmeny[VLS_MGZIVEL]=f_get_value(0,250); - } - close_current(); - } - -void otevri_vlastnosti() - { - TITEM *it; - - get_value(0,5,&it); - oprav_vlastnosti(it); - } - -void item_special(TITEM *it) - { - int i,y; - CTL3D *c; - - def_dialoge(140,100,410,320,"Special - obr�zky v letu"); - y=20;c=def_border(5,WINCOLOR); - for(i=0;i<16;i++) - { - define((i+1)*10,100,y,300,12,0,str_line,pohledy_veci);property(c,NULL,NULL,WINCOLOR); - c_default(it->v_letu[i]); on_enter(string_list_sup); - y+=15; if ((i & 3)==3) y+=5; - } - define(-1,5,20,1,1,0,label,"Zezadu"); - define(-1,5,85,1,1,0,label,"Ze strany"); - define(-1,5,150,1,1,0,label,"Zep�edu"); - define(-1,5,215,1,1,0,label,"V�buch"); - define(300,10,10,80,20,2,button,"Zru�it");on_control_change(terminate_gui); - define(310,100,10,80,20,2,button,"Ok");on_control_change(terminate_gui); - redraw_window(); - escape(); - if (o_aktual->id==310) - for(i=0;i<16;i++) it->v_letu[i]=f_get_value(0,i*10+10); - close_current(); - } - -void otevri_special() - { - TITEM *it; - - get_value(0,5,&it); - item_special(it); - } - -void items_adjusting() - { - int num; - TSTR_LIST pcxs=NULL; - char *filename; - int x1,y1,x2,y2,yy1,yy2; - word *vec = 0; - WINDOW *w; - char *c,*d; - word *male,malexs,maleys; - - w=find_window(preview_win); - c=get_text_field(config_file,"CESTA_BGRAFIKA"); if (c==NULL) c=""; - concat(d,c,"CHAR00.PCX"); - if (w!=NULL) close_window(w); - if (open_pcx(d,A_8BIT,(void *)&male)) - { - void *z;long s; - char *ss=strrchr(d,'\\'); - if (ss==NULL) ss=d;else ss=ss+1; - - if ((z=afile(ss,read_group(0),&s))==NULL) return; - load_pcx(z,s,A_8BIT,(void *)&male);free(z); - } - malexs=male[0]; - maleys=male[1]; - free(male); - read_side_list(ITEMS_SCRIPT,&pcxs,2,4); - num=f_get_value(0,190); - if (num >= str_count(pcxs)) - num = 0; - concat(c,"",pcxs[num]); - d=get_text_field(config_file,"CESTA_ITEMY");if (d==NULL) d=""; - concat(filename,d,c); - release_list(pcxs); - if (open_pcx(filename,A_8BIT,(void *)&vec)) - { - void *z;long s; - - if ((z=afile(c,read_group(0),&s))==NULL) - { - msg_box("Soubor nenalezen!",'\x1',filename,"Ok",NULL); - return; - } - load_pcx(z,s,A_8BIT,(void *)&vec);free(z); - } - x1=vals(140); - y1=vals(150); - x2=vals(160); - y2=vals(170); - yy1=350-y1-vec[1]; - yy2=350-y2-vec[1]; - if (yy1<0 || yy2<0) - { - msg_box("Chyba!",'\x1',"Nelze zobrazit, proto�e n�hled je z��sti mimo obrazovku!","Ok",NULL); - return; - } - preview_win=def_window(300,400,"View"); - define(10,150-malexs/2,350-maleys,malexs,maleys,0,pcx_view);set_default(ITEM_MALE); - define(20,150+x1-vec[0]/2,yy1,1,1,0,pcx_view);set_default(filename); - define(30,150+x2-vec[0]/2,yy2,1,1,0,pcx_view);set_default(filename); - define(40,5,5,80,20,2,button,"Ok");on_control_change(close_current); - movesize_win(waktual,0,0,300,400); - redraw_window(); - free(vec); - } - - -static add_sound_to_table(char *s) - { - int cnt; - int i; - - cnt=str_count(itm_sounds); - for(i=1;isound; y=160+15; - if (z==0) s=NULL;else s=itm_sounds[z]; - if (s==NULL) s=""; - define(-1,5,y,1,1,0,label,"Zvuk:"); - define(20,120,y,120,12,0,input_line,13);property(&b2,NULL,NULL,WINCOLOR); - set_default(s); - define(40,245,y,20,12,0,button,"<"); - property(&b1,NULL,NULL,WINCOLOR);on_control_change(mob_sound_copy); - } - define(100,5,5,80,20,2,button,"Ok");on_control_change(terminate_gui); property(&b1,NULL,NULL,WINCOLOR); - define(110,90,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui); property(&b1,NULL,NULL,WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==100) - { - char s[200]; - int z; - get_value(0,20,s); - strupper(s); - z=it->sound; - if (s[0])it->sound=add_sound_to_table(s);else it->sound=0; - delete_unused_sound(z); - } - close_current(); - check_unused_sounds(); - } - - -static void item_sound() - { - TITEM *it; - - get_value(0,5,&it); - item_sound_call(it); - } - -void save_edited_item() - { - TITEM *it; - WINDOW *w; - - get_value(0,5,&it); - get_value(0,15,it->jmeno); - get_value(0,20,it->popis); - it->hmotnost=vals(40); - it->nosnost=vals(50); - it->keynum=vals(60); - it->user_value=vals(70); - it->use_event=vals(80); - it->druh=f_get_value(0,90); - it->spell=vals(100); - it->magie=vals(110); - it->cena=vals(120); - it->ikona=f_get_value(0,130); - it->polohy[0][0]=vals(140); - it->polohy[0][1]=vals(150); - it->polohy[1][0]=vals(160); - it->polohy[1][1]=vals(170); - it->umisteni=f_get_value(0,180); - it->vzhled=f_get_value(0,190); - it->flags=get_bit_fields(0,210,2); - it->typ_zbrane=f_get_value(0,200); - it->zmeny[VLS_KOUZLA]=f_get_value(0,700); - it->animace=f_get_value(0,400); - it->hitpos=vals(410); - it->shiftup=0xff; - w=find_window(preview_win); - if (w!=NULL) close_window(w); - terminate_gui(); - } - - -void spell_affections(); - -static update_hitpos() - { - int i; - - i=f_get_value(0,400); - if (i==0) set_value(0,410,"0"); - else - if (weapons_pos[i]!=NULL) - { - set_value(0,410,weapons_pos[i]); - } - } - - - - - -void adjust_enter(EVENT_MSG *msg,OBJREC *o) - { - char update=0; - - if (msg->msg==E_KEYBOARD) - { - int s; - - char save=0; - - s=vals(o_aktual->id); - switch (*(int *)msg->data>>8) - { - case 'Q':s++;save=1;break; - case 'I':s--;save=1;break; - } - if (save) - { - char buff[256]; - set_value(0,o_aktual->id,itoa(s,buff,10)); - update=1; - } - } - - if (msg->msg==E_KEYBOARD && *(char *)(msg->data)==13) update=1; - if (update) - { - if (find_window(preview_win)!=NULL) - { - WINDOW *w; - int c; - w=waktual;c=o->id; - items_adjusting(); - select_window(w->id); - goto_control(c); - } - } - } - -void item_edit(TITEM *it) - { - CTL3D *c; - WINDOW *w; - int anm=it->animace; - - if (anm>=str_count(weapons)) anm=0; - c=def_border(5,WINCOLOR); - def_dialoge(220,80,410,350,"Oprava �daj� o p�edm�tu"); - curfont=vga_font; - default_font=curfont; - define(-1,5,20,50,10,0,label,"Jm�no (31 znak�)"); - define(15,10,35,288,12,0,input_line,31);set_default(it->jmeno); - property(def_border(2,WINCOLOR),NULL,flat_color(RGB555(16,0,0)),WINCOLOR); - define(-1,5,50,50,10,0,label,"Popis (31 znak�)"); - define(20,10,65,380,12,0,input_line,31);set_default(it->popis); - property(def_border(2,WINCOLOR),NULL,flat_color(0xF),WINCOLOR); - define(5,0,0,0,0,0,value_store,4);set_default(&it); - define(30,10,30,80,20,1,button,"Vlastnosti"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(otevri_vlastnosti); - define(-1,5,80,100,10,0,label,"Hmotnost"); - define(-1,5,95,100,10,0,label,"Nosnost"); - define(-1,5,110,100,10,0,label,"ID Kl��e"); - define(-1,5,125,100,10,0,label,"?Hodnota"); - define(-1,5,140,100,10,0,label,"�.Ud�losti"); - define(-1,5,155,100,10,0,label,"Druh"); - def_border(5,WINCOLOR); - define(40,105,80,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->hmotnost)); - define(50,105,95,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->nosnost)); - define(60,105,110,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->keynum)); - define(70,105,125,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->user_value)); - define(80,105,140,60,12,0,input_line,7,-32767,+32767,"%6d"); - property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->use_event)); - define(90,80,160,220,12,0,str_line,typy_veci);property(c,NULL,NULL,WINCOLOR); - on_enter(string_list_sup);c_default(it->druh); - define(-1,105,80,100,10,1,label,"Kouzlo:"); - define(-1,105,95,100,10,1,label,"Mana celk:"); - define(-1,105,110,100,10,1,label,"Cena v�ci"); - define(-1,105,125,100,10,1,label,"Poloha1(XY)"); - define(-1,105,140,100,10,1,label,"Poloha2(XY)"); - define(100,55,80,50,12,1,input_line,7,-32767,32767,"%6d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->spell)); - define(110,55,95,50,12,1,input_line,7,-32767,32767,"%6d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->magie)); - define(120,5,110,100,12,1,input_line,10,0,999999,"%10d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->cena)); - define(140,55,125,50,12,1,input_line,7,-32767,32767,"%5d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->polohy[0][0]));on_event(adjust_enter); - define(150,5,125,45,12,1,input_line,7,-32767,32767,"%5d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->polohy[0][1]));on_event(adjust_enter); - define(160,55,140,50,12,1,input_line,7,-32767,32767,"%5d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->polohy[1][0]));on_event(adjust_enter); - define(170,5,140,45,12,1,input_line,7,-32767,32767,"%5d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->polohy[1][1]));on_event(adjust_enter); - define(175,5,155,60,20,1,button,"Zobraz");on_control_change(items_adjusting); - define(180,80,175,220,12,0,str_line,umisteni_veci);property(c,NULL,NULL,WINCOLOR); - on_enter(string_list_sup);c_default(it->umisteni); - define(200,80,190,220,12,0,str_line,typy_zbrani);property(c,NULL,NULL,WINCOLOR); - on_enter(string_list_sup);c_default(it->typ_zbrane); - define(210,80,205,220,10,0,check_box,"P�i dopadu se zni��"); - define(220,80,217,220,10,0,check_box,"Existuje dokud je pou��v�n"); - define(130,10,180,45,55,0,ikona);c_default(it->ikona); - property(c,NULL,NULL,0);on_control_change(change_item_ikone); - define(-1,150,25,120,12,2,label,"Obr�zkov� script"); - define(190,150,10,120,12,2,str_line,vzhled_veci);property(c,NULL,NULL,WINCOLOR); - c_default(it->vzhled); on_enter(string_list_sup); - define(-1,150,60,120,12,2,label,"Animace zbran�"); - define(400,150,45,120,12,2,str_line,weapons);property(c,NULL,NULL,WINCOLOR); - c_default(anm); on_enter(string_list_sup);on_control_change(update_hitpos); - define(-1,10,45,1,12,3,label,"Hit Pos:"); - define(410,90,45,40,12,3,input_line,7,0,255,"%4d");on_exit(test_int); - property(c,NULL,NULL,WINCOLOR);set_default(strs(it->hitpos)); - define(300,10,35,80,20,2,button,"Ulo�");property(def_border(1,0),NULL,NULL,RGB555(0,20,0));on_control_change(save_edited_item); - define(320,10,70,80,20,2,button,"Zvuk");property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(item_sound); - define(330,10,10,80,20,2,button,"Zru�it");property(def_border(1,0),NULL,flat_color(RGB555(31,31,31)),RGB555(20,0,0));on_control_change(terminate_gui); - define(310,10,10,80,20,3,button,"Special");property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(otevri_special); - define(340,10,95,80,20,2,button,"Aff");property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(spell_affections); - define(700,0,0,0,0,0,value_store,4);c_default(it->zmeny[VLS_KOUZLA]); - redraw_window(); - fill_bit_fields(0,210,it->flags,2); - escape(); - w=find_window(preview_win); - if (w!=NULL) close_window(w); - close_current(); - } - -void clear_it_buffer() - { - memset(item_buffer,0,sizeof(item_buffer)); - } - -void create_ibuffer_list() - { - int i; - if (ls_buffer!=NULL) release_list(ls_buffer); - ls_buffer=create_list(32); - for (i=0;item_buffer[i];i++) - { - char c[80];TITEM *q; - int p; - p=abs(item_buffer[i])-1; - q=&item_list[p]; - if (item_buffer[i]<0) sprintf(c,"%3d ... %s",i,q->jmeno); - else sprintf(c,"%3d %s",i,q->jmeno); - if (str_replace(&ls_buffer,i,c)==NULL) return; - } - if (i==0) str_replace(&ls_buffer,0," -1 <�adn� p�edm�ty>"); - str_delfreelines(&ls_buffer); - } - -void create_isort_list(TSTR_LIST *ls_sorts,int filter) - { - int i; - char cc=0; - if (*ls_sorts!=NULL) release_list(*ls_sorts); - *ls_sorts=create_list(32); - for (i=0;ijmeno[0]!='?' && (filter==-1 || q->druh==filter)) - { - sprintf(c,"%4d %s",i,q->jmeno); - if (str_replace(ls_sorts,i,c)==NULL) return; - cc=1; - } - } - if (!cc) str_replace(ls_sorts,0," -1 <�adn� vzory>"); - str_delfreelines(ls_sorts); - } - -void save_items() - { - FILE *f;int i; - TSTR_LIST names=NULL; - char passw[50]; - - for(i=0;i"); - } - else if (sect==SV_PASSW) - { - encrypt(p); - set_data_password(p); - } - else if (sect==SV_SNDLIST) - { - int i; - char *c,*s; - - c=s=p;i=1; - while(c-s=max_items) - memset(&item_list[j],0,sizeof(TITEM)); - else - memcpy(&item_list[j],&item_list[i],sizeof(TITEM)); - item_edit(&item_list[j]); - create_isort_list(&ls_sorts,grep_num); - send_message(E_GUI,9,E_CONTROL,1,ls_sorts); - } - -void edit_selected_item() - { - int i; - - if (check_data_password()==0) return; - i=f_get_value(0,9); - sscanf(ls_sorts[i],"%d",&i); - if (i<0 || i>=max_items) clone_item(); - else - item_edit(&item_list[i]); - create_isort_list(&ls_sorts,grep_num); - send_message(E_GUI,9,E_CONTROL,1,ls_sorts); - } - -void delete_item_sort() - { - int i; - - if (check_data_password()==0) return; - i=f_get_value(0,9); - sscanf(ls_sorts[i],"%d",&i); - if (i<0 || i>=max_items) return; - if (msg_box("Dotaz?",'\x02',"Opravdu m�� v �myslu vymazat tento vzor? Je mo�n�," - " �e na tento vzor se odvol�v�j� p�edm�ty v jin� map�. MAPEDIT je " - "nem��e vymazat, a mohou se dal�� pr�c� zm�nit v p�edm�t jin�!", - "P�esto vymazat","Zru�it",NULL)==2) return; - strcpy(item_list[i].jmeno,"??? Vymaz�n"); - while (max_items && item_list[max_items-1].jmeno[0]=='?') max_items--; - create_isort_list(&ls_sorts,grep_num); - send_message(E_GUI,9,E_CONTROL,1,ls_sorts); - } - -void refresh_itm() - { - create_ibuffer_list(); - send_message(E_GUI,9,E_CONTROL,1,ls_buffer); - } - -void it_kos() - { - int i; - - i=f_get_value(0,9); - sscanf(ls_buffer[i],"%d",&i); - if (i<0 || i>=ITEM_BUFFER) return; - if (i==ITEM_BUFFER-1) - { - item_buffer[i]=-1; - return; - } - memcpy(&item_buffer[i],&item_buffer[i+1],(ITEM_BUFFER-i-1)*2); - create_ibuffer_list(); - send_message(E_GUI,9,E_CONTROL,1,ls_buffer); - } - -void open_item_win() - { - create_ibuffer_list(); - if (find_window(item_win)==NULL) - { - CTL3D b1,b2; - FC_TABLE f_sel; - - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - memcpy(&f_sel,flat_color(RGB555(0,0,24)),sizeof(charcolors)); - item_win=def_window(200,300,"P�edm�ty"); - waktual->y=2;waktual->x=SCR_WIDTH_X-20-160-3; - waktual->minsizx=120; - waktual->minsizy=100; - on_control_change(close_current); - define(9,5,20,170,240,0,listbox,ls_buffer,RGB555(31,31,0),0);c_default(0); - property(&b2,NULL,&f_sel,WINCOLOR); - o_end->autoresizex=1; - o_end->autoresizey=1; - define(10,3,41,19,198,1,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(&b2,NULL,NULL,WINCOLOR);on_control_change(scroll_support); - o_end->autoresizey=1; - define(11,3,20,19,19,1,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,3,40,19,19,2,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(20,3,1,10,10,2,resizer); - define(30,5,10,50,20,3,button,"P�ekr."); - property(&b1,NULL,NULL,WINCOLOR);on_control_change(refresh_itm); - define(30,60,10,50,20,3,button,"Vyma�"); - property(&b1,NULL,NULL,WINCOLOR);on_control_change(it_kos); - movesize_win(waktual,waktual->x,waktual->y,waktual->xs,150); - redraw_window(); - - } - else - select_window(item_win); - } - -void umisti_item() - { - int i,j; - - if (selected_place==-1) - { - msg_box("Nic nen� vybr�no",'\x01',"Nejd��ve klikni my�� na map�, na m�sto kam chce� p�edm�t um�stit","Ok",NULL); - return; - } - i=f_get_value(0,9); - sscanf(ls_sorts[i],"%d",&i); - for(j=0;jins;item_buffer[i]=item_buffer[i-1],i--); - item_buffer[ins+1]=-wht-1; - open_item_win(); - send_message(E_GUI,9,E_CONTROL,1,ls_buffer); - } - -void inv_testmap() - { - if (selected_place<0) - msg_box("Nic nen� vybr�no",'\x01',"Nejd��ve klikni my�� na map�, na m�sto kde chce� za��t","Ok",NULL); - else - call_testmap(selected_place/4); - } - -static void change_grep() - { - char grep_en; - int grep_type; - - grep_en=f_get_value(0,100); - grep_type=f_get_value(0,90); - if (grep_en) grep_num=grep_type;else grep_num=-1; - send_message(E_GUI,9,E_CONTROL,0,&ls_sorts); - create_isort_list(&ls_sorts,grep_num); - send_message(E_GUI,9,E_CONTROL,1,ls_sorts); - c_set_value(0,9,0); - send_message(E_GUI,9,E_CONTROL,2); - - } - -void editor_vzoru() - { - if (find_window(vzor_win)==NULL) - { - CTL3D b1,b2; - FC_TABLE f_sel; - - create_isort_list(&ls_sorts,grep_num); - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - memcpy(&f_sel,flat_color(RGB555(0,0,20)),sizeof(charcolors)); - vzor_win=def_window(200,370,"Vzory"); - waktual->minsizx=130; - waktual->minsizy=170; - on_control_change(close_current); - define(9,5,20,170,240,0,listbox,ls_sorts,RGB555(31,31,0),0);c_default(0); - property(&b2,NULL,&f_sel,WINCOLOR); - o_end->autoresizex=1; - o_end->autoresizey=1; - define(10,3,41,19,198,1,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(&b2,NULL,NULL,WINCOLOR);on_control_change(scroll_support); - o_end->autoresizey=1; - define(11,3,20,19,19,1,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,3,110,19,19,2,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(20,3,1,10,10,2,resizer); - define(30,5,35,50,20,3,button,"Vyma�");on_control_change(delete_item_sort); - property(&b1,NULL,NULL,WINCOLOR); - define(40,5,60,50,20,3,button,"Klonuj");on_control_change(clone_item); - property(&b1,NULL,NULL,WINCOLOR); - define(50,5,85,50,20,3,button,"Oprav");on_control_change(edit_selected_item); - property(&b1,NULL,NULL,WINCOLOR); - define(60,10,35,60,20,2,button,"Um�stit");on_control_change(umisti_item); - property(&b1,NULL,NULL,WINCOLOR); - define(70,10,60,60,20,2,button,"Vlo� do");on_control_change(vloz_do_item); - property(&b1,NULL,NULL,WINCOLOR); - define(80,10,85,60,20,2,button,"Test");on_control_change(inv_testmap); - property(&b1,NULL,NULL,WINCOLOR); - define(90,5,10,170,12,3,str_line,typy_veci);c_default(grep_num>-1?grep_num:0); - property(&b2,NULL,&f_sel,WINCOLOR);on_enter(string_list_sup);on_control_change(change_grep); - o_end->autoresizex=1; - define(100,10,10,10,10,2,check_box,"");c_default(grep_num>-1);on_control_change(change_grep); - movesize_win(waktual,waktual->x,160,waktual->xs,SCR_WIDTH_Y-20-160); - redraw_window(); - } - else - select_window(vzor_win); - } - -void select_item(int itpos) - { - if (selected_place!=-1) - { - int ps; - for(ps=0;item_buffer[ps];ps++); - if (item_place[selected_place]!=NULL) free(item_place[selected_place]); - if (ps) - { - item_place[selected_place]=getmem((ps+1)*sizeof(**item_place)); - memcpy(item_place[selected_place],item_buffer,_msize(item_place[selected_place])); - item_place[selected_place][ps]=0; - } - else item_place[selected_place]=NULL; - } - clear_it_buffer(); - if (itpos!=-1 && item_place[itpos]!=NULL) - memcpy(item_buffer,item_place[itpos],_msize(item_place[itpos])); - selected_place=itpos; - if (itpos!=-1) - { - open_item_win(); - send_message(E_GUI,9,E_CONTROL,1,ls_buffer); - } - } - -char save_item_map(FILE *f,int id) - { - int totalmem=0,i,j; - short *c,*d; - long r; - - select_item(-1); - for(i=0;i> 16; - for(j=0;j=count[0]) return; - c3=c1=*ptr; - c1+=record*sizef; - c2=c1+sizef; - siz=*count*sizef; - c3+=siz; - if (c3!=c2)memmove(c1,c2,(c3-c2)); - p=realloc(*ptr,siz-sizef); - if (siz-sizef<=0) {*ptr=NULL;p=NULL;} - if (p!=NULL) *ptr=p; - count[0]--; - } - - -void re_build_shop_list(TSTR_LIST *ls,TSHOP *p, int count) - { - if (*ls!=NULL) release_list(*ls); - *ls=create_list(count+1); - while(count--) - { - char s[100]; - - sprintf(s,"%s (%d)",p->keeper,p->products); - str_add(ls,s); - p++; - } - str_add(ls,""); - } - - -static void refresh_shop_list() - { - TSTR_LIST ls; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - re_build_shop_list(&ls,shop_list,max_shops); - send_message(E_GUI,9,E_CONTROL,1,ls); - } - -void re_build_item_list(TSTR_LIST *ls,TPRODUCT *p,int count) - { - - if (*ls!=NULL) release_list(*ls); - *ls=create_list(16); - if (!count || p==NULL) - { - str_add(ls,"<��dn� p�edm�t>"); - return; - } - while (count--) - { - char s[200]; - short d; - - d=p->item; - if (p->trade_flags & SHP_TYPE) - sprintf(s,"typ: <%s>",typy_veci[d]); - else if (d>=max_items) strcpy(s,""); - else - sprintf(s,"%c%c%c%c %s (%d)",(p->trade_flags & SHP_SELL?'P':219), - (p->trade_flags & SHP_BUY?'N':219), - (p->trade_flags & SHP_AUTOADD?'Z':219), - (p->trade_flags & SHP_SPECIAL?'S':219), - item_list[d].jmeno,p->pocet - ); - p++; - str_add(ls,s); - } - } - -TSHOP *create_shop() - { - TSHOP *p; - add_record(&shop_list,&max_shops,sizeof(TSHOP)); - p=shop_list+max_shops-1; - memset(p,0,sizeof(*p)); - p->koef=10; - p->shop_id=shop_max_id++; - return p; - } - -static char *shopstate=NULL; - -static void close_edit_shop() - { - TSHOP *p; - TSTR_LIST ls; - char s[20]; - int i; - - p=shop_list+f_get_value(0,500); - get_value(0,200,s); - get_value(0,210,p->picture); - i=f_get_value(0,500); - p->koef=vals(220); - p->spec_max=vals(230); - if (s[0]==0) - { - msg_box("Editor obchod�",'\x1',"Obchod mus� m�t sv�ho prodava�e (shopkeeppera). Obchod bude ozna�en jako smazan�.","Ok",NULL); - strcpy(s,"*vymaz�n*"); - } - if (s[0]=='<') - { - msg_box("Editor obchod�",'\x1',"Obchodn�k m� neplatn� jm�no","Ok",NULL); - return; - } - strcpy(p->keeper,s); - if (!p->products && s[0]!='*') - msg_box("Editor obchod�",'\x1',"S ni��m se neobchoduje. Nejsou definov�ny ��dn� produkty. Tato situace m��e v�st ke krachu hry!","Beru na v�dom�",NULL); - send_message(E_GUI,9,E_CONTROL,0,&ls); - release_list(ls); - close_current(); - select_window(shop_window); - refresh_shop_list(); - shopstate[i]=0; - } - -static void add_item() - { - TSHOP *p; - TSTR_LIST ls; - TPRODUCT *pr; - int i; - - p=shop_list+f_get_value(0,500); - i=f_get_value(0,9); - send_message(E_GUI,9,E_CONTROL,0,&ls); - insert_record(&p->list,&p->products,sizeof(*pr),i); - pr=p->list+i; - pr->trade_flags=get_bit_fields(0,130,4); - pr->cena=vals(110); - pr->max_pocet=pr->pocet=vals(120); - pr->item=f_get_value(0,100); - sscanf(shop_items[pr->item],"%hd",&pr->item); - re_build_item_list(&ls,p->list,p->products); - send_message(E_GUI,9,E_CONTROL,1,ls); - redraw_window(); - } - -static void rewrite_item() - { - TSHOP *p; - TSTR_LIST ls; - TPRODUCT *pr; - int i; - - p=shop_list+f_get_value(0,500); - i=f_get_value(0,9); - send_message(E_GUI,9,E_CONTROL,0,&ls); - if (i>=p->products) return; - pr=p->list+i; - if (i>=pr->max_pocet) return; - pr->trade_flags=get_bit_fields(0,130,4); - pr->cena=vals(110); - pr->max_pocet=pr->pocet=vals(120); - pr->item=f_get_value(0,100); - sscanf(shop_items[pr->item],"%hd",&pr->item); - re_build_item_list(&ls,p->list,p->products); - send_message(E_GUI,9,E_CONTROL,1,ls); - redraw_window(); - } - -static void show_selected() - { - TSHOP *p; - TPRODUCT *pr; - int i; - char c[30]; - - p=shop_list+f_get_value(0,500); - i=f_get_value(0,9); - if (i>=p->products) return; - pr=p->list+i; - if (pr->trade_flags & SHP_TYPE) return; - sprintf(c,"%7d",pr->cena); - set_value(0,110,c); - sprintf(c,"%7d",pr->max_pocet); - set_value(0,120,c); - c_set_value(0,100,pr->item); - fill_bit_fields(0,130,pr->trade_flags,4); - } - -static void add_type() - { - TSHOP *p; - TSTR_LIST ls; - TPRODUCT *pr; - - p=shop_list+f_get_value(0,500); - send_message(E_GUI,9,E_CONTROL,0,&ls); - add_record(&p->list,&p->products,sizeof(*pr)); - pr=p->list+p->products-1; - pr->trade_flags=SHP_BUY|SHP_TYPE; - pr->cena=-1; - pr->max_pocet=pr->pocet=-1; - pr->item=item_list[f_get_value(0,100)].druh; - re_build_item_list(&ls,p->list,p->products); - send_message(E_GUI,9,E_CONTROL,1,ls); - redraw_window(); - } - -static void remove_item() - { - TSTR_LIST ls; - int i; - - TSHOP *p; - p=shop_list+f_get_value(0,500); - i=f_get_value(0,9); - send_message(E_GUI,9,E_CONTROL,0,&ls); - delete_record(&p->list,&p->products,sizeof(TPRODUCT),i); - re_build_item_list(&ls,p->list,p->products); - send_message(E_GUI,9,E_CONTROL,1,ls); - redraw_window(); - } - -static void zjisti_cenu() - { - int i=f_get_value(0,100); - int j=9999999; - - sscanf(shop_items[i],"%d",&j); - if (jlist,shp->products); - memcpy(&ctl1,def_border(1,0),sizeof(ctl1)); - memcpy(&ctl2,def_border(2,WINCOLOR),sizeof(ctl2)); - def_window(400,300,"Editor obchod�"); - on_control_change(close_edit_shop); - define(500,0,0,0,0,0,value_store,4);c_default(i); - define(9,10,20,200,166,0,listbox,ls,RGB555(31,31,31),0); - property(&ctl1,NULL,NULL,WINCOLOR);c_default(0);on_control_change(show_selected); - define(10,217,40,19,127,0,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(&ctl1,NULL,NULL,WINCOLOR); - define(11,216,20,21,17,0,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,216,170,21,17,0,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(20,75,30,60,20,1,button,"Vo�it");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(add_item); - define(60,75,55,60,20,1,button,"P�epsat");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(rewrite_item); - define(30,10,30,60,20,1,button,"Typ");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(add_type); - define(40,10,55,60,20,1,button,"Odebrat");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(remove_item); - define(50,10,10,80,20,2,button,"Zav��t");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(close_edit_shop); - define(100,10,80,150,12,1,str_line,shop_items);property(&ctl2,NULL,NULL,WINCOLOR); - c_default(0); on_enter(string_list_sup);on_control_change(zjisti_cenu); - define(-1,155,100,1,1,1,label,"Cena:"); - define(110,10,100,90,12,1,input_line,10,0,9999999,"%7d");property(&ctl2,NULL,NULL,WINCOLOR); - set_default(strs(item_list[0].cena));on_exit(test_int); - define(-1,155,120,1,1,1,label,"Po�et:"); - define(120,10,120,90,12,1,input_line,10,-1,9999999,"%7d");property(&ctl2,NULL,NULL,WINCOLOR); - set_default(strs(1));on_exit(test_int); - define(130,10,135,150,10,1,check_box,"Prod�vat");c_default(1); - define(140,10,147,150,10,1,check_box,"Nakupovat");c_default(0); - define(150,10,159,150,10,1,check_box,"Zbo�� p�ib�v�");c_default(0); - define(160,10,171,150,10,1,check_box,"Nen� v�dy na sklad�");c_default(0); - define(-1,10,200,1,1,0,label,"Shopkeeper:"); - define(200,100,200,200,12,0,input_line,15);set_default(shp->keeper);property(&ctl2,NULL,NULL,WINCOLOR); - define(-1,10,220,1,1,0,label,"Obr�zek:"); - define(210,100,220,100,12,0,input_line,12);set_default(shp->picture);property(&ctl2,NULL,NULL,WINCOLOR); - define(215,220,218,80,14,0,button,"Nalistuj");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(browse_dialogs); - define(-1,10,240,1,1,0,label,"Rozptyl cen +/- [%]"); - define(220,150,240,60,12,0,input_line,6,0,100,"%5d");set_default(strs(shp->koef));on_exit(test_int);property(&ctl2,NULL,NULL,WINCOLOR); - define(-1,220,240,1,1,0,label,"Po�et spec:"); - define(230,320,240,60,12,0,input_line,6,0,100,"%5d");set_default(strs(shp->spec_max));on_exit(test_int);property(&ctl2,NULL,NULL,WINCOLOR); - { - char s[50]; - sprintf(s,"Shop ID: %d",shp->shop_id); - define(-1,10,260,1,1,0,label,s); - } - - redraw_window(); - } - -static void close_shop_list() - { - TSTR_LIST ls; - int i; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - for(i=0;i=max_shops) return; - if (ls[i]==NULL) return; - if (shopstate[i]==1) - { - msg_box("Seznam obchod�",'\x1',"Tento obchod je ji� opravov�n v jin�m okn�. Nelze jej znovu otev��t","Ok",NULL); - return; - } - shopstate[i]=1; - send_message(E_GUI,9,E_CONTROL,1,ls); - edit_shop(i); - } - } - -static void erase_shop() - { - int i; - TSTR_LIST ls; - TSHOP *p; - - if (check_data_password()==0) return; - i=f_get_value(0,9); - send_message(E_GUI,9,E_CONTROL,0,&ls); - if (i>=max_shops) return; - if (ls[i]==NULL) return; - if (ls[i][0]=='<') - { - msg_box("Seznam obchod�",'\x1',"Tento obchod je opravov�n v jin�m okn�. Nelze jej vymazat","Ok",NULL); - return; - } - if (msg_box("Vymazat obchod?",'\x2',"Opravdu chce� vymazat obchod?","Ano","Ne",NULL)==2) return; - p=shop_list+i; - strcpy(p->keeper,"*vymaz�n*"); - re_build_shop_list(&ls,shop_list,max_shops); - send_message(E_GUI,9,E_CONTROL,1,ls); - } - - -void open_shop_list() - { - TSTR_LIST ls=NULL; - CTL3D ctl1; - - - if (find_window(shop_window)==NULL) - { - create_isort_list(&ls_sorts,grep_num); - shopstate=NewArr(char,max_shops);memset(shopstate,0,max_shops); - shop_items=ls_sorts; - ls_sorts=NULL; - re_build_shop_list(&ls,shop_list,max_shops); - memcpy(&ctl1,def_border(1,0),sizeof(ctl1)); - shop_window=def_window(250,220,"Seznam obchod�"); - on_control_change(close_shop_list); - define(9,10,20,200,166,0,listbox,ls,RGB555(31,31,31),0); - property(&ctl1,NULL,NULL,WINCOLOR);c_default(0);//on_change(edit_shop_item); - define(10,217,40,19,127,0,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(&ctl1,NULL,NULL,WINCOLOR); - define(11,216,20,21,17,0,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,216,170,21,17,0,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(200,5,5,70,20,3,button,"Oprava");on_control_change(open_shop_editor);property(&ctl1,NULL,NULL,WINCOLOR); - define(210,80,5,70,20,3,button,"Vymazat");on_control_change(erase_shop);property(&ctl1,NULL,NULL,WINCOLOR); - movesize_win(waktual,10,10,250,220); - } - else select_window(shop_window); - redraw_window(); - } - -void shop_train_edit() - { - open_shop_list(); - } - - -void save_shop(TSHOP *p,FILE *f) - { - char *itm; - int i,j,typs=0,lss; - TPRODUCT *pstr,*pr,*nls,*npr; - TSHOP *shp; - - shp=p;p=New(TSHOP); - memcpy(p,shp,sizeof(*p)); - itm=getmem(max_items); - memset(itm,0,max_items); - pstr=p->list;pr=pstr; - for(i=0;iproducts;i++,pr++) - { - if (pr->trade_flags & SHP_TYPE) - { - typs++; - for(j=0;jitem) itm[j]|=1; - } - else - if (itm[pr->item]) - { - char s[300]; - - sprintf(s,"Duplicitn� p�edm�t v definici v obchodu '%s'. Soubor obchodu bude ulo�en, ale vlastn� hra m��e na tomto p�edm�tu zkrachovat!",p->keeper); - msg_box("Shop edit",'\x1',s,"Ok",NULL); - typs++; - } - else - itm[pr->item]|=2; - } - lss=0; - for(i=0;iproducts;i++,pr++) - if (!(pr->trade_flags & SHP_TYPE)) memcpy(npr++,pr,sizeof(TPRODUCT)); - for(i=0;iitem=i; - npr->cena=item_list[i].cena; - npr->trade_flags=SHP_BUY | SHP_NOEDIT | SHP_SELL; - npr->pocet=npr->max_pocet=0; - npr++; - } - pr=pstr; - for(i=0;iproducts;i++,pr++) - if (pr->trade_flags & SHP_TYPE) memcpy(npr++,pr,sizeof(TPRODUCT)); - p->products=typs+lss; - p->list_size=lss; - fwrite(p,1,sizeof(TSHOP),f); - fwrite(nls,p->products,sizeof(TPRODUCT),f); - free(nls); - free(itm); - free(p); - } - -void save_all_shops() - { - FILE *f; - int i; - int pocet=max_shops; - - f=fopen(SHOP_NAME,"wb"); - fwrite(&pocet,1,4,f); - for(i=0;ishop_id>=shop_max_id) shop_max_id=p->shop_id+1; - lss=p->products; - ols=NewArr(TPRODUCT,lss); - fread(ols,lss,sizeof(TPRODUCT),f); - el=0; - for(i=0;itrade_flags & SHP_NOEDIT)) memcpy(pr++,tr,sizeof(TPRODUCT)); - free(ols); - p->list=nls; - p->products=el; - } - - -void load_all_shops() - { - FILE *f; - int i; - int pocet=0; - - f=fopen(SHOP_NAME,"rb"); - if (f==NULL) return; - fread(&pocet,1,4,f); - if (!pocet) - { - fclose(f); - return; - } - shop_list=NewArr(TSHOP,pocet); - for(i=0;i -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "dump.h" -#include "mapy.h" -#include "edit_map.h" -#include "globals.h" -#include "steny.h" -#include "save_map.h" -#include "wiz_tool.h" -#include "mob_edit.h" -#include "../crashdump.h" -#include "../mapedit/version.h" -#include "../mapedit/editor.h" - -//#define FONTPATH "d:\\tp\\vga\\" -#define FONTPATH "..\\font\\" -extern T_EVENT_ROOT *ev_tree; - -static char newmap=0; -static char nosound=0; -TSTR_LIST config_file; - -word *icones,*vga_font; -char *sample_path; -char *script_name; -extern word ikones; -extern word boldcz; -extern word font8x5; -word icone_color[7]={RGB555(8,8,8),RGB555(31,31,31),RGB555(0,0,15),RGB555(16,16,16),RGB555(0x1b,0x1b,0x1b)}; -extern word sipka; -static char *error_texts[]= - { - "Progamov� chyba", - "Pr�v� b���c� ud�lost zp�sobila neplatnou referenci pam��i!", - "Pr�v� b���c� ud�lost zp�sobila zpracov�n� neplatn� instrukce!", - "Syst�m zachytil neo�ek�vanou chybu programu!" - }; - -static char ask_exit_status; - -word menu_win=-1; -char hicolor=1; -char sekceid[8]=""; -long pc_counter=0; -long pc_max=1; -long pc_result=0; -long pc_tick=0; -int test_mode=4; -char *background_file=NULL; -int editor_win=-1; -char color16=0; - -void close_test() - { - close_window(waktual); - } - -void logo(void) - { - CTL3D ctl; - word *p; - - ctl.light=RGB555(31,31,31); - ctl.shadow=RGB555(16,16,16); - ctl.bsize=2; - ctl.ctldef=0; - draw_border(120,120,0x18f,0x6a,&ctl); - p=(word *)LoadResourceFont("MAPEDIT.HI"); - put_picture(120,120,p); -// free(p); - showview(0,0,0,0); - } - -void about(); - -void movesize_test() - { - WINDOW *w; - - w=find_window(map_win); - if (w==NULL) return; - movesize_win(w,0,0,100,100); - redraw_desktop(); - } - -void forced_map_test() - { - int i; - - for(i=0;i>8)=='D') terminate_gui(); - if ((c & 0xff)==0 && (c>>8)==';') about(); - if ((c & 0xff)==0 && (c>>8)=='?') save_dump(); - if ((c & 0xff)==0 && (c>>8)=='<') movesize_test(); - if ((c & 0xff)=='t' || (c & 0xff)=='T' || (c & 0xff)==' ' ) forced_map_test(); - } - } - -EVENT_PROC(wait_ms_key) - { - MS_EVENT *ms; - - GET_USER_PTR(); - WHEN_MSG(E_INIT) - return; - WHEN_MSG(E_MOUSE) - { - ms=get_mouse(GET_MSG_VAR()); - if (ms->event_type & 4) terminate_gui(); - } - } - -EVENT_PROC(main_menu) - { - MS_EVENT *ms; - - GET_USER_PTR(); - WHEN_MSG(E_INIT) - return; - WHEN_MSG(E_MOUSE) - { - ms=get_mouse(GET_MSG_VAR()); - if (ms->event_type & 32) select_window(menu_win),redraw_window(); - } - } - - -void wait_mouse(void) - { - send_message(E_ADD,E_MOUSE,wait_ms_key); - escape(); - send_message(E_DONE,E_MOUSE,wait_ms_key); - } - -EVENT_PROC(all_status) - { - char *c; - char *fn; - char **p; - - GET_USER_PTR(); - WHEN_MSG(E_INIT) return; - WHEN_MSG(E_DONE) return; - c=GET_DATA_PTR(char); - c=(char *)msg->data; - fn=strrchr(filename,'\\'); - if (fn) fn++;else fn=filename; - sprintf(c,"CH:%d, N:%d, P:%d, file: %s ",maplen,0,max_items,fn); - c=strchr(c,'\0'); - if (pc_result<0) sprintf(c,"(wait)");else sprintf(c,"CPU %03d%%",pc_result); - c=strchr(c,'\0'); - p=&GET_DATA_PTR(char) - *p=c; - pc_counter++; - } - -void *pc_metter(EVENT_MSG *msg) - { - static int last1,last2; - if (msg->msg==E_INIT) return &pc_metter; - if (msg->msg==E_DONE) return NULL; - pc_tick++; - if (pc_tick>10) - { - if (pc_counter>pc_max) - if (last1>pc_max && last2>pc_max) pc_max=pc_counter; - else last2=last1;last1=pc_counter; - pc_result=100-pc_counter*100/pc_max; - pc_counter=0; - pc_tick=0; - } - return NULL; - } - -void graph_init(char windowed) -{ -/* -int c; -static word *p=NULL; - if (color16) - { - if (p==NULL)p=create_blw_palette16(); - initmode16(p); - } - else - { - if (hicolor) c=initmode32() ;else c=-1; - if (c) - { - - if (p==NULL)p=create_special_palette(); - if (initmode256(p)) - initmode_lo(p); - } - } - */ -// report_mode(1); - - const char *c=get_text_field(config_file,"MAPEDIT_WINDOW"); - int scale = 1; - if (c != 0) - { - int x,y; - if (sscanf(c,"%dx%d",&x,&y) == 2 && x>=640 && y>=480) - DxSetInitResolution(x,y); - } - ; - c=get_text_field(config_file,"MAPEDIT_SCALE"); - if (c != 0) - { - sscanf(c,"%d",&scale); - } -initmode_dx(windowed,scale,0,0); - -} - -void init_sound() - { - int a,b,c,d; - if (nosound) - { - a=DEV_NOSOUND; - } - else if (sound_detect(&a,&b,&c,&d)) - { - puts("No sound device found"); - a=DEV_NOSOUND; - } - set_mixing_device(a,22000,b,c,d); - } - -void prg_error(EVENT_MSG *msg,void **unused) - { - int *err; - char *c; - - unused; - if (msg->msg==E_PRGERROR) - { - err=(int *)(*(int **)msg->data); - switch (*err) - { - case ERR_MEMREF:c=error_texts[1];break; - case ERR_ILLEGI:c=error_texts[2];break; - default: c=error_texts[3];break; - } - zobraz_mysku(); - showview(0,0,0,0); - *err=2-msg_box(error_texts[0],' ',c,"Ignoruj","Konec","Ulo� mapu",NULL); - if (*err==-1) save_all_map(); - } - } - -void raise_error_conv(int i) - { -/* if (i==SIGILL) raise_error(ERR_ILLEGI); - else - if (i==SIGSEGV) raise_error(ERR_MEMREF); - else - raise_error(ERR_MEMREF); -*/ - } - -static void key_test(va_list args) - { - word c; - do - { - EVENT_MSG *msg = task_wait_event(E_KEYBOARD); - c=va_arg(msg->data,unsigned int); - } - while ((c & 0xff)!='!'); - puts("\x7"); - } - -void ddl_init() - { - char *c; - char *path,*temp; - - c=get_text_field(config_file,"CESTA_DATA"); - concat(path,c,"SKELDAL.DDL"); - c=get_text_field(config_file,"CESTA_TEMP"); - if (c!=NULL)concat(temp,c,"~MAPEDIT.TMP");else temp=c; - printf("Hledam soubor %s\n",path); - init_manager(path,temp); - } - -void init(void) - { - mapy_init(); - ddl_init(); - vga_font=LoadResourceFont("BOLDCZ"); - default_font=vga_font; - icones=LoadResourceFont("IKONY"); - graph_init(1); - curcolor=RGB555(24,24,24);memcpy(charcolors,flat_color(0x0000),sizeof(charcolors)); - init_events(100); - curfont=default_font; - register_ms_cursor(LoadResourceFont("SIPKA.HI")); - init_mysky(); -// hranice_mysky(0,0,639,479); - add_task(1024,key_test); - send_message(E_ADD,E_STATUS_LINE,status_line); - send_message(E_STATUS_LINE,E_ADD,E_IDLE,all_status); - send_message(E_STATUS_LINE,E_ADD,E_IDLE,status_mem_info); - send_message(E_STATUS_LINE,E_ADD,E_IDLE,show_time); - send_message(E_ADD,E_TIMER,pc_metter); - send_message(E_ADD,E_KEYBOARD,exit_key); - send_message(E_ADD,E_PRGERROR,prg_error); - signal(SIGILL,raise_error_conv); - signal(SIGSEGV,raise_error_conv); - install_gui(); - redraw_desktop();do_events(); - send_message(E_ADD,E_MOUSE,main_menu); - msg_box_font=vga_font; - msg_icn_font=icones; - ukaz_mysku(); - update_mysky(); - } -/* - w=create_window(100,100,400,200,0x6318,&x); - id=desktop_add_window(w); - define(10,20,50,30,0,sample,"Test"); - property(&x,NULL,flat_color(0x7000),0xffff); - define(10,20,70,30,3,button,"Tlacitko"); - property(NULL,NULL,flat_color(0x000f),0x01c0);on_change(close_test); - w=create_window(5,5,200,200,0x6318,&x); - id=desktop_add_window(w); - define(50,50,70,30,3,button,"Tlacitko"); - property(NULL,NULL,flat_color(0x7fff),0x000f);on_change(close_test); - w=create_window(300,150,300,200,0x6318,&x); - id=desktop_add_window(w); - define(50,50,70,30,3,button,"Tlacitko"); - property(NULL,NULL,flat_color(0x7fff),0x000f);on_change(close_test); - */ - -long def_window(word xs,word ys,char *name) - { - word x=0,y=0; - WINDOW *p; - CTL3D ctl; - FC_TABLE fc; - long q; - - if (waktual!=NULL) - { - x=waktual->x; - y=waktual->y; - } - - highlight(&ctl,WINCOLOR); - ctl.bsize=2;ctl.ctldef=0; - x+=20;y+=20; - memcpy(fc,flat_color(RGB555(31,31,0)),sizeof(FC_TABLE)); - fc[0]=0x0000; - if (x+xs>SCR_WIDTH_X-2) x=SCR_WIDTH_X-2-xs; - if (y+ys>SCR_WIDTH_Y-2) y=SCR_WIDTH_Y-2-ys; - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - q=desktop_add_window(p); - define(0,2,2,xs-5-20*(xs>=70),14,0,win_label,name); - ctl.bsize=1;ctl.ctldef=1; - o_end->autoresizex=1; - property(&ctl,vga_font,&fc,LABELCOLOR); - if (xs>=70) - { - define(1,1,1,19,16,1,button,"\x0f"); - property(NULL,icones,&icone_color,WINCOLOR);on_control_change(close_test); - } - return q; - } - -void def_dialoge(word x,word y,word xs, word ys, char *name) - { - CTL3D ctl; - FC_TABLE fc; - WINDOW *p; - - - memcpy(fc,flat_color(RGB555(31,31,0)),sizeof(FC_TABLE)); - memcpy(&ctl,def_border(2,WINCOLOR),sizeof(CTL3D)); - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - desktop_add_window(p); - set_window_modal(); - ctl.bsize=1;ctl.ctldef=1; - define(0,1,1,xs-2,14,0,win_label,name); - o_end->autoresizex=1; - property(&ctl,vga_font,&fc,LABELCOLOR); - } - -void dtext_init(OBJREC *o,char *title) - { - title=get_title(title); - o->userptr=(void *)getmem(strlen(title)+1); - strcpy((char *)o->userptr,title); - } - - -void dtext_draw(int x1,int y1,int x2, int y2,OBJREC *o) - { - x2;y2; - fontdsize=1; - position(x1,y1); - outtext((char *)o->userptr); - fontdsize=0; - } - -void dtext(OBJREC *o) - { - o->call_init=dtext_init; - o->call_draw=dtext_draw; - //o->call_event=sample_event; - //o->call_done=sample_done; - } - -void about() - { - FC_TABLE c={0,RGB555(31,31,0),RGB555(28,28,28),RGB555(24,24,24),RGB555(20,20,20)}; - FC_TABLE c2={0,RGB555(31,16,0),RGB555(28,16,0),RGB555(24,16,0),RGB555(20,16,0)}; - FC_TABLE c3={0,RGB555(0,24,0),RGB555(0,20,0),RGB555(0,16,0),RGB555(0,10,0)}; - static about_win=-1; - - if (find_window(about_win)==NULL) - { - about_win=def_window(300,200,"About"); - waktual->x=320-150; - waktual->y=140; - memcpy(f_default,flat_color(0x0),sizeof(FC_TABLE)); - waktual->modal=1; - default_font=vga_font; - define(-1,5,25,29,29,0,dtext,"\x8");property(NULL,icones,&c,WINCOLOR); - define(-1,75,25,100,29,0,dtext,"MAPEDIT");property(NULL,NULL,&c2,WINCOLOR); - define(-1,200,35,60,29,0,label,"verze 2.0");property(NULL,NULL,&c3,WINCOLOR); - define(-1,20,80,200,10,0,label,"Naps�no pro hru \"Br�ny Skeldalu\""); - define(-1,20,92,200,10,0,label,"(C) 1997 Napoleon gameS "); - define(-1,20,104,200,10,0,label,"Naprogamoval: Ond�ej Nov�k "); - define(-1,20,116,200,10,0,label,"Tento software sm� b�t pou�it jen"); - define(-1,20,128,200,10,0,label,"ve spojen� s v�vojem hry \"Br�ny"); - define(-1,20,140,200,10,0,label,"Skeldalu\" (a p��padn� dal�� verze)"); - define(-1,20,152,200,10,0,label,"a to pouze �leny v�vojov�ho t�mu."); - define(10,110,170,80,20,0,button,"Ok");on_control_change(close_test); - } - else select_window(about_win); - redraw_window(); - } - -void fog_bar_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - disable_bar(x1,y1,x2-x1,y2-y1,o->color); - } - -void fog_bar(OBJREC *o) - { - o->call_draw=fog_bar_draw; - } - -void close_app(void) - { - WINDOW *w; - CTL3D x={0,0,0,0}; - - int mx = DxGetResX() - 1; - int my = DxGetResY() - 1; - - w=create_window(0,0,1,1,0,&x); - desktop_add_window(w); - define(-1,0,0,mx,my,0,fog_bar);property(NULL,NULL,NULL,RGB555(16,0,0)); - redraw_desktop(); - if ((ask_exit_status=msg_box("Dotaz?",'\x2',"Chce� program ukon�it, nebo nahr�t jinou mapu?","Jinou mapu","Ukon�it","Ne",NULL))!=3) terminate_gui(); - close_window(w); - do_events(); - } - -void edit_basic_maze() - { - if (tool_sel>40) tool_sel=30; - create_map_win(-1); - if (newmap) - { - edit_side(0,0); - sector_details_call(0); - if (str_count(side_names)>2 || side_names[1]!=NULL) newmap=0; - } - } - -void spawn_editor(char *dosline) - { -// deinstall_mouse_handler(); - closemode(); - system(dosline); - graph_init(1); -// install_mouse_handler(); -// hranice_mysky(0,0,639,479); - redraw_desktop(); - } - -void edit_script_file() - { - char s[255]=""; - char *pr;WINDOW *w; - - - w=find_window(sektor_win); - if (w!=NULL) close_window(w); - switch (o_aktual->id) - { - case 10:strcat(s,pripona(filename,SCR));break; - case 20:strcat(s,pripona(filename,".TXT"));break; - case 30:strcat(s,ITEMS_SCRIPT);break; - case 40:strcat(s,ITEMS_PICS);break; - } - EditSkeldalFile(s); - pr=pripona(filename,SCR); - read_full_side_script(pr); - read_side_list(ITEMS_SCRIPT,&vzhled_veci,0,4); - read_side_list(ITEMS_PICS,&pohledy_veci,0,2); - read_side_list(WEAPONS_SCRIPT,&weapons,0,3); - read_side_list(WEAPONS_SCRIPT,&weapons_pos,2,3); - } - -void call_animator() - { - spawn_editor("ani"); - } - - -void open_editor_win() - { - if (find_window(editor_win)==NULL) - { - editor_win=def_window(100,150,"Editory"); - define(10,10,25,80,20,0,button,"map script");on_control_change(edit_script_file); - define(20,10,50,80,20,0,button,"map texty");on_control_change(edit_script_file); - define(30,10,75,80,20,0,button,"items.scr");on_control_change(edit_script_file); - define(40,10,100,80,20,0,button,"items.pic");on_control_change(edit_script_file); - define(50,10,125,80,20,0,button,"animator");on_control_change(call_animator); - redraw_window(); - } - else - { - select_window(editor_win); - redraw_window(); - } - } - -void create_menu(void) - { - FC_TABLE c={0,RGB555(31,31,31),RGB555(24,24,24),RGB555(16,16,16),RGB555(4,4,4)}; - menu_win=def_window(400,150,"Map Edit v2.0 for Windows - " MAPEDIT_VERSION ); - waktual->x=120; - waktual->y=250; - on_control_change(close_app); - curcolor=WINCOLOR; - default_font=icones; - define(10,5,25,29,29,0,button,"\x8");property(NULL,NULL,&c,WINCOLOR);on_control_change(edit_basic_maze); - define(20,5,55,29,29,0,button,"\x9");property(NULL,NULL,&c,WINCOLOR);on_control_change(editor_veci); - define(30,5,85,29,29,0,button,"\xA");property(NULL,NULL,&c,WINCOLOR);on_control_change(enemy_window); - c[1]=RGB555(20,0,0);c[2]=RGB555(0,0,16); - define(40,200,25,29,29,0,button,"e");property(NULL,NULL,&c,WINCOLOR);on_control_change(shop_train_edit); - c[1]=RGB555(31,31,31);c[2]=RGB555(24,24,24); - c[3]=RGB555(20,0,0);c[4]=RGB555(0,0,16); - define(50,200,55,29,29,0,button,"E");property(NULL,NULL,&c,WINCOLOR);on_control_change(open_editor_win); - define(60,200,85,29,29,0,button,"S");property(NULL,NULL,&c,WINCOLOR);on_control_change(save_all_map); - define(70,5,115,29,29,0,button,"P");property(NULL,NULL,&c,WINCOLOR);on_control_change(pcxviewer); - memcpy(c,flat_color(RGB555(0,0,15)),sizeof(FC_TABLE)); - define(-1,45,35,90,20,0,label,"Kreslen� mapy");property(NULL,vga_font,&c,WINCOLOR); - define(-1,45,65,90,20,0,label,"Pokl�d�n� p�edm�t�");property(NULL,vga_font,&c,WINCOLOR); - define(-1,45,95,90,20,0,label,"Um�s�ov�n� nestv�r");property(NULL,vga_font,&c,WINCOLOR); - define(-1,240,35,90,20,0,label,"Obchody");property(NULL,vga_font,&c,WINCOLOR); - define(-1,240,65,90,20,0,label,"Editor script�");property(NULL,vga_font,&c,WINCOLOR); - define(-1,240,95,90,20,0,label,"Ulo�en� mapy");property(NULL,vga_font,&c,WINCOLOR); - define(-1,45,125,90,20,0,label,"Prohl��e� PCX");property(NULL,vga_font,&c,WINCOLOR); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - //set_enable(0,20,0); - //set_enable(0,30,0); - } - -void help(void) - { - printf("Parametry:\n\n"); - printf("mapedit filename [/4] [/2] [/c|t|v|m] [/?] \n" - "\n" - "/2 Prosadi 256 barev\n" - "/1 Prosadi 16 barev\n" - "/c Inicializace mysi se simulaci CGA karty (default)\n" - "/t Inicializace mysi se simulaci textoveho rezimu (standard)\n" - "/v Inicializace mysi se simulaci VGA\n" - "/m Inicializace mysi se simulaci MCGA\n" - "/? Tento help\n" - "/s Bez zvuku (dobre pro WIN95)\n" - ); - exit(0); - } - -void args_support(char count, char *sw[]) - { - int i; - char c; - - for(i=1;i<=count;i++) - if (sw[i][0]=='/') - { - c=sw[i][1]; - switch (c) - { - case '?': help();break; -/* case '4': line480=1;break; - case '2': hicolor=0;break; - case '1': color16=1;break; - case 'c': - case 'C': ms_fake_mode=0x6;break; - case 't': - case 'T': ms_fake_mode=0x3;break; - case 'v': - case 'V': ms_fake_mode=0x12;break; - case 'm': - case 'M': ms_fake_mode=0x13;break; - case 'r': - case 'R': test_mode=sw[i][2]-48;if (test_mode<0 || test_mode>4) test_mode=0;break;*/ - case 's': nosound=1;break; - } - } - else - strcpy(filename,sw[i]); - } - -char *pripona(char *fname,char *prip) - { - static char name[128],*s,*t; - - strncpy(name,fname,128); - name[127]='\0'; - t=strchr(name,'.'); - s=t; - while (s!=NULL) - { - t=s; - s=strchr(t+1,'.'); - } - if (t==NULL) - { - t=strchr(name,'\0'); - } - strcpy(t,prip); - return name; - } - - -void load_background() - { - FILE *f; - long siz; - - if (gui_background!=NULL) - { - free(gui_background); - gui_background=NULL; - } - f=fopen(background_file,"rb"); - if (f==NULL) return; - fseek(f,0,SEEK_END);siz=ftell(f); - fseek(f,0,SEEK_SET); - gui_background=getmem(siz); - fread(gui_background,1,siz,f); - redraw_desktop(); - fclose(f); - } - -static void shut_down() - { -// deinstall_mouse_handler(); - closemode(); - } - -void init_maps(void); - -static ask_password_event(EVENT_MSG *msg,OBJREC *obj) - { - obj; - WHEN_MSG(E_KEYBOARD) - { - char c=GET_DATA(char); - if (c==13) {goto_control(20);terminate_gui();} - if (c==27) {goto_control(30);terminate_gui();} - } - } - -char ask_password(char *pass,char text) - { - char *c; - - switch (text) - { - case 0:c="Prov��en�";break; - case 1:c="Zm�na hesla";break; - case 2:c="Kontrola";break; - } - def_dialoge(320-100,240-50,200,90,c); - define(-1,10,20,1,1,0,label,"Vlo� heslo:"); - define(10,10,40,180,12,0,input_line,49); - property(def_border(3,WINCOLOR),NULL,flat_color(RGB555(31,31,31)),RGB555(8,8,8)); - if (text==1)set_default(pass);else set_default("");on_event(ask_password_event); - define(20,5,5,50,20,2,button,"OK"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(30,5,5,50,20,3,button,"Zru�it"); - property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - goto_control(10); - escape(); - if (o_aktual->id==30) text=0;else - { - text=1; - get_value(0,10,pass); - } - close_current(); - return text; - } - -static int data_edit_enabled=0; -static char data_password[50]=""; - -char check_data_password(void) - { - char text[50]; - - if (data_password[0]==0) data_edit_enabled=1; - if (data_edit_enabled) return 1; - if (ask_password(text,0)==0) return 0; - if (strcmp(data_password,text)) - { - msg_box("Chyba!",1,"Chybn� heslo! P��stup zam�tnut!","OK",NULL); - return 0; - } - else - { - data_edit_enabled=1; - return 1; - } - } - -char *set_data_password(char *text) - { - if (text!=NULL) - { - strncpy(data_password,text,sizeof(data_password)); - data_password[sizeof(data_password)-1]=0; - } - return data_password; - } - -/*TSTR_LIST read_ddl_dir(char *filter) - { - TSTR_LIST ls; - int i=0; - char *s; - - ls=create_list(256); - s=read_next_entry(MMR_FIRST); - while (s!=NULL) - { - char *d; - char c[13]; - - strncpy(c,s,12); - c[12]=0; - if (filter!=NULL) - { - d=strrchr(c,'.'); - if (d!=NULL && !strncmp(d+1,filter,3)) str_replace(&ls,i++,c); - } - else - str_replace(&ls,i++,c); - s=read_next_entry(MMR_NEXT); - } - if (i==0) str_add(&ls,""); - ls=sort_list(ls,-1); - return ls; - } -*/ - -SMapFiles mapFiles; - -static char *strdup2(const char *a, const char *b) -{ - char *res=malloc(strlen(a)+strlen(b)+1); - strcpy(res,a); - strcat(res,b); - return res; -} - -static void InitMapFiles(const char *path) -{ - mapFiles.items_script=strdup2(path,XITEMS_SCRIPT); - mapFiles.items_pics=strdup2(path,XITEMS_PICS); - mapFiles.items_dat=strdup2(path,XITEM_FILE); - mapFiles.dialogy_scr=strdup2(path,XDLG_SCRIPT); - mapFiles.weapons_scr=strdup2(path,XWEAPONS_SCRIPT); - mapFiles.shops_dat=strdup2(path,XSHOP_NAME); - mapFiles.enemy=strdup2(path,XMOB_FILE); - mapFiles.enemy_sound=strdup2(path,XMOB_SOUND); -} -static void ClearMapFiles() -{ - free(mapFiles.items_script); - free(mapFiles.items_pics); - free(mapFiles.items_dat); - free(mapFiles.dialogy_scr); - free(mapFiles.weapons_scr); - free(mapFiles.shops_dat); - free(mapFiles.enemy); - free(mapFiles.enemy_sound); - -} - - -static BOOL WINAPI HandlerRoutine( - DWORD dwCtrlType // control signal type -) -{ - return TRUE; -} - -int main(int argc,char *argv[]) - { - char *s; - char *pr; - char test[50]; - char *mask; - InitCrashDump(); - SetConsoleCtrlHandler(HandlerRoutine,TRUE); - filename[0]='\0'; - // strcpy(filename,"TEST.MAP"); - args_support(argc-1,argv); - printf("Hledam konfiguracni soubor\n"); - config_file=read_config("WSKELDAL.INI"); - if (config_file==NULL) - { - puts("...nemohu najit WSKELDAL.INI\n"); - return 1; - } - 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); - filename[0]=0; - } - sample_path=get_text_field(config_file,"CESTA_ZVUKY"); - if (sample_path==NULL) sample_path=""; - mob_dir=get_text_field(config_file,"CESTA_ENEMY"); - if (mob_dir==NULL) mob_dir=""; - init_sound(); - init(); - - concat(mask,get_text_field(config_file,"CESTA_MAPY"),"*.map"); - atexit(shut_down); -// signal(SIGABRT,shut_down); - init_mob_list(); - InitMapFiles(get_text_field(config_file,"CESTA_MAPY")); - do - { - ask_exit_status=2; - if (filename[0]=='\0') browser(mask,filename); - if (filename[0]!='\0') - { - char *mapy=get_text_field(config_file,"CESTA_MAPY"); - memmove(filename+strlen(mapy),filename,strlen(filename)+1); - memcpy(filename,mapy,strlen(mapy)); - s=pripona(filename,".HI"); - background_file=(char *)getmem(strlen(s)+1);strcpy(background_file,s); - load_background(); - } - do_events(); - logo(); - pr=pripona(filename,SCR); - script_name=NewArr(char,strlen(pr)+1); - strcpy(script_name,pr); - read_full_side_script(pr); - read_spec_procs(); - read_side_list(ITEMS_SCRIPT,&vzhled_veci,0,4); - read_side_list(ITEMS_PICS,&pohledy_veci,0,2); - read_dlg_list(DLG_SCRIPT,&dlg_names,&dlg_pgfs); - read_side_list(WEAPONS_SCRIPT,&weapons,0,3); - read_side_list(WEAPONS_SCRIPT,&weapons_pos,2,3); - set_defaults(); - init_multiactions(); - memset(vyklenky,0,sizeof(vyklenky)); - init_item_system(); - if (filename[0]!='\0' ) - { - int sel=1; - - init_maps(); - set_defaults(); - if (load_map(filename)) - msg_box(filename,'\01',"Tento soubor je bu� ne�iteln�, nebo po�kozen�","Pokra�ovat",NULL); - if (check_password(NULL)==0) - if (ask_password(test,0)==0 || check_password(test)==0) - { - filename[0]=0; - ask_exit_status=1; - goto preskoc; - } - if (maplen<2) - { - sel=msg_box(filename,' ',"Soubor neexistuje, bude vytvo�en nov�. Nyn� je nutn� nastavit z�kladn� st�ny" - " a jin� dal�� parametry pro tuto mapu","Pokra�ujem","Zav�it",NULL); - if (sel==1) - { - newmap=1; - } - - } - if (sel==1) - { - create_menu(); - redraw_window(); - escape(); - filename[0]=0; - close_current(); - } - } - preskoc: - free(background_file); - } - while (ask_exit_status==1); - ClearMapFiles(); - redraw_desktop(); - close_manager(); - return 0; - } - -int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) -{ - return main(__argc,__argv); -} - - - int GetExeVersion() - { - return MAPEDIT_NVERSION; - } diff --git a/MAPS/MAPY.C b/MAPS/MAPY.C deleted file mode 100644 index 5724500..0000000 --- a/MAPS/MAPY.C +++ /dev/null @@ -1,1108 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mapy.h" -#include -#include "steny.h" -#include "globals.h" -#include "edit_map.h" -#include "wiz_tool.h" -#include "mob_edit.h" - -TMAP mapa; -TMAP_EDIT minfo; -TVYKLENEK vyklenky[256]; -long map_win=-1; -long tool_bar=-1; -char tool_sel=30; -long xmap_offs=0,ymap_offs=0,cur_layer=0; -int maplen=1; -int m_zoom=3; -static char nocenter=0; - -#define ZELENA RGB555(0,31,0) -#define CERVENA RGB555(31,0,0) -#define MODRA RGB555(0,0,31) - -char _actions []= - "<��dn�>\0" - "Otev�i dve�e\0" - "Zav�i dve�e\0" - "Otev�i nebo zav�i\0" - "Spus� animaci prim\0" - "Uka� prim. st�nu\0" - "Schovej prim.st�nu\0" - "Uk/schov.pri.st�nu\0" - "Spus� animaci sek.\0" - "Uka� sek. st�nu\0" - "Schovej sek. st�nu\0" - "Uk/schov.sek.st�nu\0" - "Schovej prim.&sek.\0" - "Zobraz text\0" - "Kod.z�mek (star�-Nepou��vat!)\0" - "Otev�i teleport\0" - "Uzav�i teleport\0" - "Kodov� z�mek (log)\0" - "Konec hry\0" - "\\\0"; - -char chka[]={0,1,1,1,1,1,1,1,1,1,1,1,0}; -char _steny2 []="Severn�\0V�chodn�\0Ji�n�\0Z�padn�\0\\\0"; -char _zivly []="Ohe�\0Voda\0Zem�\0Vzduch\0Mysl\0\\\0"; - -char _sector_types[]= - "!Voln�!\0""Normaln�\0""Schody\0""Lo�ka na vod�\0""L�va\0" - "Sm�r sever\0""Sm�r v�chod\0""Sm�r jih\0""Sm�r z�pad\0""Voda\0""Sloup\0""Dira\0""Teleport\0" - "Tla��tko(norm)\0""Tla��tko(zma�k)\0" - "Fl�tna (Sever)\0""Fl�tna (V�chod)\0""Fl�tna (Jih)\0""Fl�tna (Z�pad)\0" - "Opu�t�n� mapy\0""V�r\0""Sloup&Smrt\0""Ub�ra �ivoty\0" - "\\\0"; - -char _type_multi_actions[]= - "Nop\0""Sound effekt\0""Text global\0""Text local\0""Send action\0""Fireball\0""Destroy Item\0" - "Load Level\0""Drop Item\0""Start dialog\0""Start Shop\0""Code Lock\0""Cancel Action\0" - "Lock\0""Swap Sectors\0""HIT Player\0""If Jump\0""Call SpecProc\0" - "If have item\0""Story (local)\0""If test action\0""Experience\0""Teleport_group\0""Play Anim\0" - "Create Item\0""If flag Jump\0""Change Flag\0""Drop Unique Item\0" - "Drop Money\0""Give Unique Item\0" - "If Item Holded\0""Write Book\0" - "Random Jump\0""The End\0""Send Monter To\0""Share Multiaction\0""Change Music\0""Global Event\0" - "If Sector Num\0""If Sector Type\0" - "\\\0"; - -char _typy_zbrani[]= - "Me� (t��k� ostr� rovn�)\0" - "Sekera (t��k� ostr� ost.)\0" - "Kladivo (tup�)\0" - "H�l\0" - "D�ka (Lehk� ostr�)\0" - "��p (st�eln�)\0" - "Ostatn� / Spec\0" - "\\\0"; - -char _typy_veci[]= - "Nespecifikov�no\0" - "Zbra� tv��� v tv��\0" - "Vrhac� zbra�\0" - "St�eln� zbra�\0" - "Zbroj\0" - "Svitek / H�lka\0" - "Lektvar\0" - "Voda\0" - "J�dlo\0" - "Speci�ln�\0" - "Runa\0" - "Pen�ze\0" - "Svitek s textem\0" - "Prach\0" - "Ostatn�\0" - "\\\0"; - -char _umisteni_veci[]= - "Nikam\0" - "Zavazadlo\0" - "Na t�lo (naho�e)\0" - "Na t�lo (dole)\0" - "Na hlavu\0" - "Na nohy\0" - "Kutna (na t�lo/naho�e/dole/helma)\0" - "Na krk\0" - "Do ruky\0" - "Obouru�\0" - "Prsten\0" - "��p\0" - "\\0"; - -char _side_flgs[]= - "Automap\0" - "Nepr�choz�(hr�c)\0" - "Nepr�choz�(nestv�ra)\0" - "Nepr�choz�(v�c)\0" - "Nepr�choz�(zvuk)\0" - "Poplach\0" - "Pr�choz� akce\0" - "Pr�chledn� st�na\0" - "Prim:Animace\0" - "Prim:Viditeln�\0" - "Prim:Tam a zp�t\0" - "Prim:Sm�r\0" - "Sek:Animace\0" - "Sek:Viditeln�\0" - "Sek:Tam a zp�t\0" - "Sek:Sm�r\0" - "Lev� oblouk\0" - "Prav� oblouk\0" - "Dva druhy st�n\0" - "Spec. mapovat\0" - "Kop�ruj p��choz� ud�lost\0" - "Po�li jinou ud�lost\0" - "Aplikuj i z druh� strany\0" - "Autoanimace p�ep�na��\0" - "Zm�na automapingu\0" - "Zm�na pr�chodnosti(hr��)\0" - "Zm�na pr�chodnosti(nestv�ra)\0" - "Zm�na pr�chodnosti(v�c)\0" - "Zm�na pr�chodnosti(zvuk)\0" - "Tajn� st�na\0" - "TRUESEE (iluze)\0" - "Neviditeln� na map�\0" - "Potvora je ve h�e\0" - "Potvora je v oblasti\0" - "\\\0"; - -char **side_flgs; -char **actions; -char **steny2; -char **zivly; -char **sector_types; -char **act_types; -char **typy_zbrani; -char **typy_veci; -char **umisteni_veci; -char **mob_procs=NULL; -char **wall_procs=NULL; - -char side_chscr[]= - {8,8,4,1,2,1,4,1,1,1,1,16,8,8, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 4,4,4,4,8,8,0}; - -word fgc[32]= - {0,RGB555(0,27,31),RGB555(4,27,16),RGB555(0,15,31),RGB555(16,16,16),RGB555(0,31,31),RGB555(4,23,15),RGB555(0,31,31), - RGB555(20,0,0),RGB555(20,31,31),RGB555(24,15,15),RGB555(20,15,18),RGB555(28,0,0),RGB555(28,31,31),RGB555(28,23,0),0 - ,WINCOLOR,RGB555(0,27,31),RGB555(4,27,16),RGB555(0,15,31),RGB555(16,16,16),RGB555(0,31,31),RGB555(4,23,15),RGB555(0,31,31), - RGB555(20,0,0),RGB555(20,31,31),RGB555(24,15,15),RGB555(20,15,18),RGB555(28,0,0),RGB555(28,31,31),RGB555(28,23,0),0}; - -void init_maps(void) - { - memset(&mapa,0,sizeof(mapa)); - } - -int find_free_sector(void) - { - int i=1; - - while (i=MAPSIZE) return -1; - return i; - } - -int find_sector(int x,int y,int layer) - { - int i=0; - char p; - - do - { - i++; - while (iflags|=0x80; - st->flags&=~0x021e; - mapa.sectordef[sector1].step_next[smer]=sector2; - smer=(smer+2)& 3; - st=&mapa.sidedef[sector2][smer]; - st->flags|=0x80; - st->flags&=~0x021e; - mapa.sectordef[sector2].step_next[smer]=sector1; - } - - -void wire_sector(int sector) - { - int x,y,l,s; - - x=minfo[sector].x; - y=minfo[sector].y; - l=minfo[sector].layer; - s=find_sector(x,y-1,l); - if (s+1) wire_2_sectors(sector,s,0); - s=find_sector(x+1,y,l); - if (s+1) wire_2_sectors(sector,s,1); - s=find_sector(x,y+1,l); - if (s+1) wire_2_sectors(sector,s,2); - s=find_sector(x-1,y,l); - if (s+1) wire_2_sectors(sector,s,3); - } - -int add_sector(int x,int y,int layer,int source_num) - { - int w; - - w=find_sector(x,y,layer); - if (!(w+1)) - { - TSTENA *st,*sc; - int i; - - w=find_free_sector(); - if (w>=maplen) maplen=w+1; - if (w==-1) return -1; - for (i=0;i<4;i++) - { - st=&mapa.sidedef[w][i]; - sc=&mapa.sidedef[source_num][i]; - memcpy(st,sc,sizeof(TSTENA)); - st->flags&=~0xfe; - st->flags|=0x021e; - } - memcpy(&mapa.sectordef[w],&mapa.sectordef[source_num],sizeof(TSECTOR)); - memset(&mapa.sectordef[w].step_next,0,sizeof(mapa.sectordef[w].step_next)); - if (!mapa.sectordef[w].sector_type) mapa.sectordef[w].sector_type=1; - minfo[w].x=x; - minfo[w].y=y; - minfo[w].layer=layer; - minfo[w].flags=0; - } - wire_sector(w); - return w; - } - -void unwire_2_sectors(int sector1,int sector2,int smer) - { - TSTENA *st; - - st=&mapa.sidedef[sector1][smer]; - mapa.sectordef[sector1].step_next[smer]=0; - st->flags&=~0xfe; - st->flags|=0x021e; - smer=(smer+2)& 3; - st=&mapa.sidedef[sector2][smer]; - st->flags&=~0xfe; - st->flags|=0x021e; - mapa.sectordef[sector2].step_next[smer]=0; - } - -void flags_2_sectors(int sector1,int sector2,int smer,long flags) - { - TSTENA *st; - - st=&mapa.sidedef[sector1][smer]; - st->flags|=flags; - smer=(smer+2)& 3; - st=&mapa.sidedef[sector2][smer]; - st->flags|=flags; - } - - -void tenka_stena(int x,int y,int layer,int smer,int flags) - { - int s1,s2; - - s1=find_sector(x,y,layer); - if (s1+1) - { - if (mapa.sectordef[s1].step_next[smer]) - { - s2=mapa.sectordef[s1].step_next[smer]; - if (s2>=0 && s2>1),y,x,y+(M_ZOOM>>1)); - line(x+(M_ZOOM>>1),y,x+M_ZOOM,y+(M_ZOOM>>1)); - line(x+(M_ZOOM>>1),y,x+(M_ZOOM>>1),y+M_ZOOM); - } - -void sipka_dolu(int x,int y) - { -line(x+(M_ZOOM>>1),y+M_ZOOM,x,y+(M_ZOOM>>1)); -line(x+(M_ZOOM>>1),y+M_ZOOM,x+M_ZOOM,y+(M_ZOOM>>1)); -line(x+(M_ZOOM>>1),y,x+(M_ZOOM>>1),y+M_ZOOM); - } - -void sipka(int x,int y,int q,int color) - { - char c[2]=" \0"; - - if (m_zoom<3) return; - c[0]=q; - charcolors[0]=RGB555(16,9,0); - charcolors[1]=color; - curfont=icones; - if (m_zoom>3) fontdsize=1; - set_aligned_position(x+(M_ZOOM>>1),y+(M_ZOOM>>1),1,1,c); - outtext(c); - fontdsize=0; - } - -void prepinac(int x,int y,int q,TSTENA *p,char tma) - { - curcolor=0; - if (p->sector_tag) curcolor=RGB555(31,16,0); - if (tma) curcolor|=RGB555(0,0,31); - if (p->oblouk & 0x10) curcolor|=RGB555(0,31,0); - if (curcolor) - { - if (curcolor==RGB555(31,31,31)) curcolor=0; - switch (q) - { - case 0: bar(x+(M_ZOOM>>1)-1,y,x+(M_ZOOM>>1)+1,y+2);break; - case 2: bar(x+(M_ZOOM>>1)-1,y+M_ZOOM,x+(M_ZOOM>>1)+1,y+M_ZOOM-2);break; - case 1: bar(x+M_ZOOM,y+(M_ZOOM>>1)-1,x+M_ZOOM-2,y+(M_ZOOM>>1)+1);break; - case 3: bar(x,y+(M_ZOOM>>1)-1,x+2,y+(M_ZOOM>>1)+1);break; - } - } - } - -void norm_rectangle(int x1,int y1,int x2,int y2) - { - ver_line(x1,y1,y2); - ver_line(x2,y1,y2); - hor_line(x1,y1,x2); - hor_line(x1,y2,x2); -} - -void autocenter_map() - { - int i; - int xmax; - int xmin; - int ymax; - int ymin; - char sett=0; - char chnged=0; - - if (nocenter) - { - nocenter=0; - return; - } - for(i=1;ixmax) xmax=x; - if (yymax) ymax=y; - } - else - { - xmin=xmax=x;ymin=ymax=y;sett=1; - } - } - if (chnged) - { - xmap_offs=(xmax+xmin)>>1; - ymap_offs=(ymax+ymin)>>1; - c_set_value(map_win,20,xmap_offs); - c_set_value(map_win,30,ymap_offs); - } - } - -void workspace_draw(int x1,int y1,int x2, int y2,OBJREC *o) - { - int x,y,i,j,xc,yc; - int mapx,mapy; - int mmz=M_ZOOM; - int mmz1=mmz/4; - int mmz3=mmz*3/4; - int yoff,xoff; - char q; - - mmz=M_ZOOM; - xc=(o->xs % M_ZOOM)>>1; - yc=(o->ys % M_ZOOM)>>1; - *(long *)o->data=1; - bar(x1,y1,x2,y2); - if (m_zoom>1) - for (y=y1+yc;y>m_zoom; - mapy=(y2-y1)>>m_zoom; - xoff=xmap_offs-mapx/2; - yoff=ymap_offs-mapy/2; - for (j=0;j<2;j++) - for (i=1;i=0 && x=0 && ylocx+xc; - y=(y<locy+yc; - - switch (q) - { - case 1:curcolor=RGB555(31,31,31);break; - case 4:curcolor=RGB555(31,15,0);break; - case 3: - case 20: - case 9:curcolor=RGB555(0,15,31);break; - case 22:curcolor=RGB555(0,31,0);break; - default: curcolor=RGB555(31,31,31); - } - - if (minfo[i].flags & 1) curcolor=RGB555(31,31,0); - if (!j) bar(x,y,x+M_ZOOM-1,y+M_ZOOM-1); - else - { - TSTENA *p; - long flg; - char sd; - - //if (tool_sel==50) - { - int p; - p=i*4; - ikris(p,x,y,x+(M_ZOOM>>1),y+(M_ZOOM>>1)); - ikris(p+1,x+(M_ZOOM>>1),y,x+M_ZOOM,y+(M_ZOOM>>1)); - ikris(p+2,x+(M_ZOOM>>1),y+(M_ZOOM>>1),x+M_ZOOM,y+M_ZOOM); - ikris(p+3,x,y+(M_ZOOM>>1),x+(M_ZOOM>>1),y+M_ZOOM); - } - p=&(mapa.sidedef[i][0]); - curcolor=RGB555(31,31,31); - flg=p->flags; - sd=p->side_tag; - if (flg & 0x21e) - {curcolor=fgc[((flg>>1)&0xf) | ((flg>>5)&0x10)];hor_line(x,y,x+mmz);} - if (flg & 0x10000) {curcolor=0x1f;hor_line(x,y,x+mmz1);} - if (flg & 0x20000) {curcolor=0x1f;hor_line(x+mmz3,y,x+mmz);} - if (sd & 0x80) {curcolor=RGB555(19,0,0);hor_line(x,y+mmz-1,x+mmz);} - p++;flg=p->flags; - sd=p->side_tag; - if (flg & 0x21e) - {curcolor=fgc[((flg>>1)&0xf) | ((flg>>5)&0x10)];ver_line(x+M_ZOOM,y,y+M_ZOOM);} - if (flg & 0x10000) {curcolor=0x1f;ver_line(x+mmz,y,y+mmz1);} - if (flg & 0x20000) {curcolor=0x1f;ver_line(x+mmz,y+mmz3,y+mmz);} - if (sd & 0x80) {curcolor=RGB555(19,0,0);ver_line(x+1,y,y+mmz);} - - p++;flg=p->flags; - sd=p->side_tag; - if (flg & 0x21e) - {curcolor=fgc[((flg>>1)&0xf) | ((flg>>5)&0x10)];hor_line(x,y+M_ZOOM,x+M_ZOOM);} - if (flg & 0x10000) {curcolor=0x1f;hor_line(x+mmz3,y+mmz,x+mmz);} - if (flg & 0x20000) {curcolor=0x1f;hor_line(x,y+mmz,x+mmz1);} - if (sd & 0x80) {curcolor=RGB555(19,0,0);hor_line(x,y+1,x+mmz);} - p++;flg=p->flags; - sd=p->side_tag; - if (flg & 0x21e) - {curcolor=fgc[((flg>>1)&0xf) | ((flg>>3)&0x10)];ver_line(x,y,y+M_ZOOM);} - if (flg & 0x10000) {curcolor=0x1f;ver_line(x,y+mmz3,y+mmz);} - if (flg & 0x20000) {curcolor=0x1f;ver_line(x,y,y+mmz1);} - if (sd & 0x80) {curcolor=RGB555(19,0,0);ver_line(x+mmz-1,y,y+mmz);} - curcolor=0; - switch (q) - { - case 1:break; - case 2:sipka(x,y,'s',ZELENA);break; - case 3:sipka(x,y,'l',ZELENA);break; - //case 4:curcolor=0x0;norm_rectangle(x+(M_ZOOM>>2),y+(M_ZOOM>>2),x+M_ZOOM-(M_ZOOM>>2)-1,y+M_ZOOM-(M_ZOOM>>2)-1);break; - case 5: - case 6: - case 7: - case 8:sipka(x,y,q-1,ZELENA);break; - case 10:if (M_ZOOM>=4) curcolor=0x1f;bar(x+(M_ZOOM>>1)-2,y+(M_ZOOM>>1)-2,x+(M_ZOOM>>1)+1,y+(M_ZOOM>>1)+1);break; - case 11:curcolor=0x0;bar(x+(M_ZOOM>>2),y+(M_ZOOM>>2),x+M_ZOOM-(M_ZOOM>>2)-1,y+M_ZOOM-(M_ZOOM>>2)-1);break; - case 12:sipka(x,y,'T',ZELENA);break; - case 13:curcolor=0x0;norm_rectangle(x+(M_ZOOM>>2),y+(M_ZOOM>>2),x+M_ZOOM-(M_ZOOM>>2)-1,y+M_ZOOM-(M_ZOOM>>2)-1);break; - case 14:curcolor=RGB555(31,0,0);bar(x+(M_ZOOM>>2),y+(M_ZOOM>>2),x+M_ZOOM-(M_ZOOM>>2)-1,y+M_ZOOM-(M_ZOOM>>2)-1); - case 15: - case 16: - case 17: - case 18:sipka(x,y,q-15+4,MODRA);break; - case 19:sipka(x,y,'.',RGB555(31,31,0));break; - case 20:sipka(x,y,'!',ZELENA);break; - case 21:sipka(x,y,'M',0x8000);break; - } - if (mob_map[i]!=-1) sipka(x,y,((mob_map[i]>>14) & 3)+4,CERVENA); - for (q=0;q<4;q++) prepinac(x,y,q,&(mapa.sidedef[i][q]),(multi_actions[(i<<2)+q]!=NULL)); - } - } - } - } - -void swaps(int *x1,int *y1,int *x2,int *y2) - { - if (*x1>*x2) - { - *x1+=*x2; - *x2=*x1-*x2; - *x1=*x1-*x2; - } - if (*y1>*y2) - { - *y1+=*y2; - *y2=*y1-*y2; - *y1=*y1-*y2; - } - } - - -void draw_rectangle(int x1,int y1,int x2,int y2) - { - swaps(&x1,&y1,&x2,&y2); - xor_rectangle(x1,y1,x2-x1,y2-y1); - } - -void *working(EVENT_MSG *msg) - { - static work_counter=0; - int i; - char *c; - - if (msg->msg==E_INIT) return &working; - if (msg->msg==E_DONE) return NULL; - c=(char *)msg->data; - strcpy(c," Pracuji "); - c=strchr(c,'\0'); - for (i=0;idata=(void *)c; - work_counter=(work_counter+1) & 7; - return NULL; - } - -void *print_layer(EVENT_MSG *msg) - { - char *c; - - if (msg->msg==E_INIT) return &print_layer; - if (msg->msg==E_DONE) return NULL; - c=(char *)msg->data; - sprintf(c,"%d. patro",cur_layer); - c=strchr(c,'\0'); - msg->data=(void *)c; - msg->msg=-1; - return NULL; - } - - -void add_map_bar(va_list args) - { - int x,y; - long f; - int x1=va_arg(args,int); - int y1=va_arg(args,int); - int x2=va_arg(args,int); - int y2=va_arg(args,int); - - f=get_draw_flags(); - swaps(&x1,&y1,&x2,&y2); - if (y1==y2) - for(x=x1;xflags|=(mf->x>=x1 && mf->xy>=y1 && mf->ylayer==cur_layer && mapa.sectordef[y].sector_type!=0); - } - if (tool_sel==40 && c==0) close_wiz_tool(); - } - - -void workspace_event(EVENT_MSG *msg,OBJREC *o) - { - static char draw=0; - static int xf,yf,xo,yo; - int xn,yn,xc,yc; - int mapx,mapy,xoff,yoff; - int msx,msy; - - xc=(o->xs % M_ZOOM)>>1; - yc=(o->ys % M_ZOOM)>>1; - xn=o->locx+xc; - yn=o->locy+yc; - mapx=(o->xs)>>m_zoom; - mapy=(o->ys)>>m_zoom; - xoff=xmap_offs-mapx/2; - yoff=ymap_offs-mapy/2; - switch (msg->msg) - { - case E_MOUSE: - { - MS_EVENT *ms; - - ms=get_mouse(msg); - msx=ms->x-xn; - msy=ms->y-yn; - if (tool_sel==50) - { - if (ms->event_type & 0xA) - { - int i,j; - xo=(msx>>m_zoom)+xoff; - yo=(msy>>m_zoom)+yoff; - for(i=0;i(M_ZOOM>>1)) j++; - if (yo>(M_ZOOM>>1)) j=3-j; - select_item(i*4+j); - return; - } - return; - } - if (ms->event_type & 0xA) - { - xf=(msx+(M_ZOOM>>1)) & ~(M_ZOOM-1); - yf=(msy+(M_ZOOM>>1)) & ~(M_ZOOM-1); - xo=xf;yo=yf; - draw=ms->event_type & 0xA; - return; - } - if (draw && (ms->tl1 || ms->tl2)) - { - draw_rectangle(xn+xf,yn+yf,xn+xo,yn+yo); - xo=(msx+(M_ZOOM>>1)) & ~(M_ZOOM-1); - yo=(msy+(M_ZOOM>>1)) & ~(M_ZOOM-1); - draw_rectangle(xn+xf,yn+yf,xn+xo,yn+yo); - return; - } - if (ms->event_type & 0x14 && draw) - { - int i; - - i=tool_sel; - if (tool_sel==10 && !(draw & 2)) i=20; - if (tool_sel==20 && !(draw & 2)) i=10; - draw=0; - xf=(xf>>m_zoom)+xoff; - xo=(xo>>m_zoom)+xoff; - yf=(yf>>m_zoom)+yoff; - yo=(yo>>m_zoom)+yoff; - switch (i) - { - case 10:add_task(8196,add_map_bar,xf,yf,xo,yo);break; - case 20:add_task(8196,del_map_bar,xf,yf,xo,yo);break; - case 30: - case 40: - if (xf==xo) xo=1+(xf=msx/M_ZOOM+xoff); - if (yf==yo) yo=1+(yf=msy/M_ZOOM+yoff); - edit_map_bar(xf,yf,xo,yo); - redraw_object(o); - break; - } - - } - } - break; - case E_GET_FOCUS: break; - case E_LOST_FOCUS: if (draw) redraw_object(o);draw=0;break; - } - } -void workspace(OBJREC *o) - { -//o->call_init=workspace_init; - o->call_draw=workspace_draw; - o->call_event=workspace_event; - o->datasize=4; - } - -void close_with_tool(void) - { - WINDOW *w; - close_window(waktual); - if ((w=find_window(tool_bar))!=NULL) close_window(w); - if ((w=find_window(multiaction_win))!=NULL) close_window(w); - if ((w=find_window(enemy_win))!=NULL) close_window(w); - if ((w=find_window(wiz_tool_numb))!=NULL) close_window(w); - if ((w=find_window(sektor_win))!=NULL) close_window(w); - if ((w=find_window(item_win))!=NULL) close_window(w); - if ((w=find_window(vzor_win))!=NULL) close_window(w); - } - -void change_tools() - { - int i; - WINDOW *w; - - if (find_window(tool_bar)==NULL) return; - for (i=10;i<50;i+=10)c_set_value(tool_bar,i,i==tool_sel); - if (tool_sel!=30) if (find_window(sektor_win)!=NULL) - { - close_window(find_window(sektor_win)); - if (tool_sel!=40) unselect_map(); else open_wiz_tool(); - send_message(E_DONE,E_KEYBOARD,chozeni2); - } - if (tool_sel!=40) - { - if ((w=find_window(wiz_tool_numb))!=NULL) close_window(w); - if ((w=find_window(multiaction_win))!=NULL) close_window(w); - if (tool_sel!=30) unselect_map(); - else - for(i=0;iid; - change_tools(); - } - - -void scroll_workspace() - { - ymap_offs=f_get_value(0,20); - xmap_offs=f_get_value(0,30); - c_set_value(0,10,0); - } - - -void layer_show() - { - send_message(E_STATUS_LINE,E_ADD,E_IDLE,print_layer); - } -void layer_hide() - { - send_message(E_STATUS_LINE,E_DONE,E_IDLE,print_layer); - } - -void layer_plus() - { - cur_layer++; - if (cur_layer>MAX_DEPTH) cur_layer=MAX_DEPTH; - autocenter_map(); - c_set_value(0,10,0); - } - -void layer_minus() - { - cur_layer--; - if (cur_layerx=7;waktual->y=2; - on_control_change(close_with_tool); - define(10,2,20,473,408,0,workspace); - property(def_border(1,0),NULL,NULL,WINCOLOR); - o_end->autoresizex=1;o_end->autoresizey=1; - ctl=def_border(3,WINCOLOR); - waktual->minsizx=140; - waktual->minsizy=90; - define(20,3,42,17,365,1,scroll_bar_v,-100,100,(59*8)/M_ZOOM,SCROLLBARCOL); - property(ctl,NULL,NULL,WINCOLOR);c_default(ymap_offs);on_control_change(scroll_workspace); - o_end->autoresizey=1; - define(21,1,20,21,17,1,scroll_button,-2,-100,"\x1e"); - property(NULL,icones,&cl,WINCOLOR);on_control_change(scroll_support); - define(22,1,22,21,17,2,scroll_button,2,100,"\x1f"); - property(NULL,icones,&cl,WINCOLOR);on_control_change(scroll_support); - define(30,26,3,352,15,3,scroll_bar_h,-100,100,(59*8)/M_ZOOM,SCROLLBARCOL); - property(ctl,NULL,NULL,WINCOLOR);c_default(xmap_offs);on_control_change(scroll_workspace); - o_end->autoresizex=1; - define(31,96,1,21,19,2,scroll_button,2,100,"\x1c"); - property(NULL,icones,&cl,WINCOLOR);on_control_change(scroll_support); - define(32,1,1,21,19,3,scroll_button,-2,-100,"\x1d"); - property(NULL,icones,&cl,WINCOLOR);on_control_change(scroll_support); - define(40,60,1,30,19,2,button,"/");property(NULL,icones,&cl,WINCOLOR); - on_control_enter(layer_show);on_control_exit(layer_hide);on_control_change(layer_plus); - define(50,28,1,30,19,2,button,"\\");property(NULL,icones,&cl,WINCOLOR); - on_control_enter(layer_show);on_control_exit(layer_hide);on_control_change(layer_minus); - define(60,1,1,19,19,2,resizer); - xpp=&xp; - xpp++; - if (xp>=0) movesize_win(waktual,xp,*xpp,*(xpp+1),*(xpp+2)); - else movesize_win(waktual,3,3,SCR_WIDTH_X-130,SCR_WIDTH_Y-10); - } - else - { - select_window(map_win); - } - if (find_window(tool_bar)==NULL) - { - redraw_window(); - tool_bar=def_window(90,90,"Tools"); - waktual->x=SCR_WIDTH_X-1-94;waktual->y=desktop_y_size-90-3; - define(20,1,55,40,34,0,toggle_button,"\xC");property(NULL,icones,&icone_color,WINCOLOR); - on_control_change(tool_select);c_default(tool_sel==20); - define(30,42,20,40,34,0,toggle_button,"\xD");property(NULL,icones,&icone_color,WINCOLOR); - on_control_change(tool_select);c_default(tool_sel==30); - define(40,42,55,40,34,0,toggle_button,"\xE");property(NULL,icones,&icone_color,WINCOLOR); - on_control_change(tool_select);c_default(tool_sel==40); - define(10,1,20,40,34,0,toggle_button,"\xB");property(NULL,icones,&icone_color,WINCOLOR); - on_control_change(tool_select);c_default(tool_sel==10); - } -if (tool_sel==10)open_draw_win(); -if (tool_sel==40)open_wiz_tool(); -redraw_desktop(); - } - -void zoomin() - { - WINDOW *w,s; - if (m_zoom<5) - { - m_zoom++; - w=find_window(map_win); - if (w!=NULL) - { - s=*w; - nocenter=1; - close_window(w); - create_map_win(s.x,s.y,s.xs,s.ys); - } - - } - } -void zoomout() - { - WINDOW *w,s; - if (m_zoom>0) - { - m_zoom--; - w=find_window(map_win); - if (w!=NULL) - { - s=*w; - nocenter=1; - close_window(w); - create_map_win(s.x,s.y,s.xs,s.ys); - } - } - } -void set_defaults(void) - { - mapa.sidedef[0][0].flags=0x1fc42201; - mapa.sidedef[0][0].xsec=250/2; - mapa.sidedef[0][0].ysec=160/2; - mapa.sectordef[0].flags=0x11; - } - -void mapy_init(void) - { - actions=(char **)build_static_list(_actions); - steny2=(char **)build_static_list(_steny2); - zivly=(char **)build_static_list(_zivly); - sector_types=(char **)build_static_list(_sector_types); - act_types=(char **)build_static_list(_type_multi_actions); - typy_veci=(char **)build_static_list(_typy_veci); - typy_zbrani=(char **)build_static_list(_typy_zbrani); - umisteni_veci=(char **)build_static_list(_umisteni_veci); - side_flgs=(char **)build_static_list(_side_flgs); - } - -static __inline long output_code(void *target,long bitepos,int bitsize,int data) - { - *((long *)target+bitepos/8)|=data<<(bitepos & 0x7); - return bitepos+bitsize; - } - -static __inline long input_code(void *source,long *bitepos,int bitsize,int mask) - { - long res=*((long *)source+(*bitepos>>8)); - res>>=(*bitepos & 0x7); - bitepos[0]+=bitsize; - return res; - } - -/*long output_code(void *target,long bitepos,int bitsize,int data); -#pragma aux output_code parm [edi][edx][ebx][eax]=\ - "mov ecx,edx"\ - "shr ecx,3"\ - "add edi,ecx"\ - "mov ecx,edx"\ - "and cl,7h"\ - "shl eax,cl"\ - "or [edi],eax"\ - "add edx,ebx"\ - value[edx] modify [ecx]; - - -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]; -*/ - - - -void calc_changes_mem(void *orgn,void *new, void *maskreg, char *scr) - { - long bitepos1=0; - long bitepos2=0; - long bitepos3=0; - int mask; - int v1,v2; - - while (*scr) - { - mask=(1< -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mapy.h" -#include -#include "globals.h" -#include "edit_map.h" -#include "save_map.h" -#include "steny.h" -#include "mob_edit.h" -#include - - - -char *mob_dir; -TSTR_LIST enemy_list=NULL; -TSTR_LIST enemy_sound=NULL; -TMOB moblist[TOTAL_MOBS]; -short mob_map[MAPSIZE]; -int enemy_win=-1; - -void edit_mob(int i); - -static void mirror_pcx(word *pcx) - { - int xs; - int ys; - int i,j,k,l; - char *c,*d,*e; - - xs=pcx[0]; - ys=pcx[1]; - pcx+=3+256; - l=xs/2; - c=(char *)pcx; - for(i=0;iuserptr=getmem(129+4); - memset(o->userptr,0,129+4); - } - -void pcx_view_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - char *oldname; - char *newname; - void *picture; - char mirror=0; - - - picture=*(void **)(oldname=o->userptr); - oldname+=4; - newname=o->data; - if (newname[0]=='*') - newname++,mirror=1; - if (strcmp(oldname,newname)) - { - free(picture); - picture=NULL; - } - if (picture==NULL) - { - open_pcx(newname,A_8BIT,&picture); - if (mirror && picture!=NULL) mirror_pcx(picture); - } - if (picture==NULL) - { - char *d=strrchr(newname,'\\'); - void *z;long s; - if (d!=NULL) d++;else d=newname; - z=afile(d,read_group(0),&s); - if (z!=NULL) load_pcx(z,s,A_8BIT,&picture);free(z); - if (mirror) mirror_pcx(picture); - } - bar(x1,y1,x2,y2); - if (picture!=NULL) put_picture(x1,y1,picture); - *(void **)(o->userptr)=picture; - strcpy(oldname,newname); - } - -void pcx_view_done(OBJREC *o) - { - void *picture; - picture=*(void **)(o->userptr); - free(picture); - } - -void pcx_view(OBJREC *o) - { - o->call_init=pcx_view_init; - o->call_draw=pcx_view_draw; - o->call_done=pcx_view_done; - o->datasize=129; - } - -void symetry_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - x2; - curcolor=RGB555(31,31,31); - x1+=*(int *)o->data; - ver_line_xor(x1,y1,y2); - } - -void symetry_event(EVENT_MSG *msg,OBJREC *o) - { - MS_EVENT *ms; - - if (msg->msg==E_MOUSE) - { - int x1,x2; - ms=get_mouse(msg); - if (ms->tl1) - { - x1=*(int *)o->data+o->locx; - curcolor=RGB555(31,31,31); - schovej_mysku(); - ver_line_xor(x1,o->locy,o->locy+o->ys); - x2=ms->x; - ver_line_xor(x2,o->locy,o->locy+o->ys); - ukaz_mysku(); - if (x1locy,x2+1,o->locy+o->ys); - else showview(x2,o->locy,x1+1,o->locy+o->ys); - *(int *)o->data=x2-o->locx; - } - } - } - -void symetry(OBJREC *o) - { - o->call_draw=symetry_draw; - o->call_event=symetry_event; - o->datasize=4; - } - -#define delete_mob(i) memset(&moblist[i],0,sizeof(TMOB);moblist[i].cislo_vzoru=-1;create_enemy_list() -#define clear_mob_map() memset(mob_map,0xff,sizeof(mob_map)) -#define clear_map_place(i) (mob_map[i]=-1) -#define place_mob(i,j) (mob_map[i]=(j)) - -void purge_mob_map() - { - clear_mob_map(); - } - - -int add_mob_sound(char *wav) - { - int i,c; - if (enemy_sound==NULL) - { - enemy_sound=create_list(4); - return str_add(&enemy_sound,wav); - } - else - { - c=str_count(enemy_sound); - for(i=0;i"); - } - - -void new_mob() - { - int i,j; - char c; - - - if (!mglob.local_monsters && check_data_password()==0) return; - i=f_get_value(0,29); - c=enemy_list[i]!=NULL && moblist[i].cislo_vzoru!=-1; - j=create_mob(); - if (c) - { - sscanf(enemy_list[i],"%d",&i); - if (i!=-1) moblist[j]=moblist[i]; - } - else - { - memset(moblist+i,0,sizeof(TMOB)); - moblist[i].cislo_vzoru=-1; - } - edit_mob(j); - create_enemy_list(); - send_message(E_GUI,29,E_CONTROL,1,enemy_list); - } - -static char nvlast[][16]= - {"S�la","UM(%kouzlen�)","Pohyblivost","Obratnost","Max zran�n�", - "","","Obrana(doln�)","Obrana(Horn�)","�tok(Doln�)", - "�tok(Horn�)","Ohe�","Voda","Zem�","Vzduch","Mysl","�ivoty Regen", - "","","Magick� s�la(D)", "Magick� s�la(H)","","��innek z�sahu","*"}; - - -char smery_anim[][7]= - {"Vp�ed","Vlevo","Vzad","Vpravo","�tok","Z�sah"}; -char smery_znaky[]="FLBRCH"; - -char sekvence[]="0123456789ABCDEF"; - -char load_ddl_seq(char *name,char otoceni) - { - char *z,*c; - long size; - - c=z=afile(name,9,&size); - if (z!=NULL) - { - while (otoceni--) if (z!=NULL) z=strchr(z+1,'\n'); - if (z==NULL) - { - free(c); - return 0; - } - while (*z<32) z++; - memcpy(sekvence,z,sizeof(sekvence)); - } - free(c); - return 1; - } - -char load_sequence(char *mobname,int otoceni) - { - char s[128]; - char st[13]; - FILE *f; - int i,c; - - sprintf(s,"%s%s.SEQ",MOB_DIR,mobname); - sprintf(st,"%s.SEQ",mobname); - f=fopen(s,"r"); - if (f==NULL) - { - char text[256]; - - if (load_ddl_seq(st,otoceni)) return 0; - sprintf(text,"Nemohu nalezt soubor %s jen� ma obsahovat sekvence animac� pro tuto potvoru...",s); - msg_box("Upozorn�n�!",'\x1',text,"Beru na v�dom�",NULL); - return 1; - } - while(otoceni--) - while (fgetc(f)!='\n'); - c=fgetc(f); i=0; - while (c!=EOF && c!='\n' && imsg) - { - case E_INIT:phase=-1; - turn=f_get_value(0,185); - break; - case E_TIMER:if (delay) delay--; - else - { - char name[129],c[10]; - word *picture; - int x,y,xs,ys; - - delay=2; - get_value(0,100,c); - sprintf(name,"%s%s%c%c.PCX",MOB_DIR,c,smery_znaky[turn]=='R'?'L':smery_znaky[turn],sekvence[phase+1]); - x=320;y=0;xs=1;ys=1; - ch=open_pcx(name,A_8BIT,(void **)&picture); - if (ch) - { - void *z;long s;char *c; - c=strrchr(name,'\\');if (c==NULL) c=name;else c++; - z=afile(c,9,&s); - if (z!=NULL) load_pcx(z,s,A_8BIT,(void **)&picture),free(z),ch=0;else ch=1,picture=NULL; - } - if (!ch) - { - if (turn==3) - mirror_pcx(picture); - x-=f_get_value(0,300+turn*16+phase+1); - xs=picture[0]; - ys=picture[1]; - y=460-ys; - if (x<0) x=0; - put_picture(x,y,picture); - free(picture); - } - phase=(phase+1)%vals(120+turn); - showview(0,0,0,0); - curcolor=0; - bar(x,y,x+xs,y+ys); - } - break; - case E_KEYBOARD:exit_wait=1;break; - case E_MOUSE: - { - MS_EVENT *ms; - - ms=get_mouse(msg); - if (ms->event_type & 0x4) exit_wait=1; - msg->msg=-1; - } - } - } - -void play_mob() - { - int i; - char s[12]; - - int mx = DxGetResX() - 1; - int my = DxGetResY() - 1; - - get_value(0,100,s); - i=f_get_value(0,185); - if (load_sequence(s,i)) return; - update_mysky(); - schovej_mysku(); - curcolor=0; - bar(0,0,mx,my); - send_message(E_ADD,E_TIMER,pohyb_moba); - send_message(E_ADD,E_KEYBOARD,pohyb_moba); - send_message(E_ADD,E_MOUSE,pohyb_moba); - escape(); - send_message(E_DONE,E_TIMER,pohyb_moba); - send_message(E_DONE,E_KEYBOARD,pohyb_moba); - send_message(E_DONE,E_MOUSE,pohyb_moba); - redraw_desktop(); - ukaz_mysku(); - } - - -void build_mobs_name() - { - int i,j,k; - char c,path[129],name[10]; - char *d; - char m; - - i=f_get_value(0,180); - j=f_get_value(0,185); - get_value(0,100,name); - c=smery_znaky[j]; - if (c=='R') c='L',m=1;else m=0; - sprintf(path,"%s%s%s%c%c.PCX",m?"*":"",MOB_DIR,name,c,sekvence[i]); - k=f_get_value(0,205); - c_set_value(0,205,300); - c_set_value(0,205,k); - c_set_value(0,205,300); - set_value(0,200,path); - c_set_value(0,205,f_get_value(0,300+i+16*j)); - d=strrchr(path,'\\');if (d!=NULL) d++;else d=path; - set_value(0,207,d); - } - -void check_mobs_name() - { - char s[10]; - int i; - - get_value(0,100,s); - for(i=0;i<6 && s[i];i++) if (s[i]==32) s[i]='_'; - for(;i<6;i++) s[i]='_'; - s[i]=0; - strupper(s); - set_value(0,100,s); - c_set_value(0,180,0); - c_set_value(0,185,0); - build_mobs_name(); - } - -void mob_next() - { - int i,j,max; - char s[12]; - i=f_get_value(0,180); - j=f_get_value(0,185); - get_value(0,100,s); - load_sequence(s,j); - c_set_value(0,300+i+16*j,f_get_value(0,205)); - max=vals(120+j); - i=(i+1)%(max+1); - c_set_value(0,180,i); - build_mobs_name(); - redraw_desktop(); - } - -void mob_turn() - { - int i,j; - char s[12]; - i=f_get_value(0,180); - j=f_get_value(0,185); - c_set_value(0,300+i+16*j,f_get_value(0,205)); - do - j=(j+1)%+6; - while (!vals(120+j)); - c_set_value(0,185,j); - c_set_value(0,180,0); - get_value(0,100,s); - load_sequence(s,j); - build_mobs_name(); - redraw_desktop(); - } - -void mob_ask_delete() - { - - if (msg_box("Dotaz?",'\x2',"Opravdu chce� potovoru vymazat ze seznam� vzor�? Ujisti se, �e tuto potvoru nepou��v�� v ��dn� jin� map�","Ano","Ne",NULL)==1) - terminate_gui(); - o_aktual=find_object(waktual,260); - } - -char *sound_ev[]= - {"P�i ch�zi","�tok","Z�sah","Reserved"}; - -void mob_test_sound() - { - char *c; - TSTR_LIST ls; - int d; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - d=f_get_value(0,9); - if (ls[d]==NULL) return; - concat(c,"",ls[d]); - name_conv(c); - add_task(16384,play_wav,c,0); - do_events(); - do_events(); - } - -void mob_sound_copy() - { - int id=o_aktual->id; - TSTR_LIST ls; - int d; - char c[20]; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - d=f_get_value(0,9); - if (ls[d]==NULL) return; - strncpy(c,ls[d],20);name_conv(c); - id-=20; - set_value(0,id,c); - } - - -void mob_inv() - { - int m,i; - CTL3D b1; - TSTR_LIST ls_sorts=NULL; - - create_isort_list(&ls_sorts,-1); - m=f_get_value(0,190); - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - def_dialoge(100,50,400,390,"Invent�� potvory"); - str_insline(&ls_sorts,0,""); - for(i=0;iid==300) - for(i=0;i", - "< volno >", - "< volno >", - "Vyhrazeno pro d�mona" - }; - -void spell_affections() - { - int m,i; - CTL3D b1; - - - m=f_get_value(0,700); - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - def_dialoge(100,50,400,390,"Affections"); - for(i=0;i<16;i++) - { - define(i+10,10,20+i*12,250,10,0,check_box,aff_list[i]);c_default((m & (1<id==300) - { - for(i=0,m=0;i<16;i++) m|=f_get_value(0,i+10)<id==100) - { - char s[20]; - for(j=0;jid)) - { - moblist[i].dialog=-1; - return; - } - j=moblist[i].dialog; - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - def_dialoge(100,250,250,180,"P�i�a� dialog"); - define(9,10,20,200,126,0,listbox,dlg_names,RGB555(31,31,31),0); - property(&b3,NULL,NULL,WINCOLOR);c_default(pgf2name(j)); - define(10,217,40,19,87,0,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(&b2,NULL,NULL,WINCOLOR); - define(11,216,20,21,17,0,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,216,130,21,17,0,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(100,5,5,80,20,2,button,"Ok");on_control_change(terminate_gui); property(&b1,NULL,NULL,WINCOLOR); - define(110,90,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui); property(&b1,NULL,NULL,WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==100) - { - moblist[i].dialog=dlg_pgfs[f_get_value(0,9)]; - } - close_current(); - c_set_value(0,k,moblist[i].dialog>=0); - } - -/*static void ask_dialog(EVENT_MSG *msg,OBJREC *obj) - { - if (msg->msg==E_MOUSE) - { - MS_EVENT *ms; - - ms=get_mouse(msg); - if ((ms->event_type & 0xA && *(char *)obj->data)) - open_dialog_edit_box(); - } - }*/ - -void edit_mob(int i) - { - int y,z; - CTL3D *b1; - - if (!mglob.local_monsters && check_data_password()==0) return; - i; - if (!moblist[i].anim_counts[0]) moblist[i].anim_counts[0]=1; - def_dialoge(50,20,550,415,"Definice potvory"); - define(200,310,35,290,1,0,pcx_view);set_default("_"); - define(205,310,35,290,370,0,symetry);c_default(moblist[i].adjusting[0]); - define(207,5,20,120,20,1,input_line,20);set_default(""); - define(-1,190,20,100,12,0,label,"Jm�no potvory"); - define(10,300,20,200,12,0,input_line,31);set_default(moblist[i].name);property(def_border(2,WINCOLOR),NULL,NULL,WINCOLOR); - z=0;b1=def_border(5,WINCOLOR); - for(y=20;y<380;) - { - if (nvlast[z][0]) - { - define(-1,5,y,140,12,0,label,nvlast[z]); - define(z+20,120,y,60,12,0,input_line,8,-32767,32767,"%6d");set_default(strs(moblist[i].vlastnosti[z]));on_control_exit(test_int); - property(b1,NULL,NULL,WINCOLOR); - y+=15; - } - z+=1; - if (nvlast[z][0]=='*') break; - } - y+=15; - define(-1,5,y,140,12,0,label,"�ivel:"); - define(102,120,y,60,12,0,str_line,zivly);c_default(moblist[i].vlastnosti[VLS_MGZIVEL]);on_enter(string_list_sup);property(b1,NULL,NULL,WINCOLOR);y+=15; - define(-1,5,y,140,12,0,label,"Jm�no grafiky"); - define(100,120,y,60,12,0,input_line,6);set_default(moblist[i].mobs_name);property(b1,NULL,NULL,WINCOLOR);on_control_exit(check_mobs_name);y+=15; - define(-1,5,y,140,12,0,label,"Rychlost"); - define(101,130,y,30,12,0,input_line,3,0,128,"%3d");set_default(strs(moblist[i].speed));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR);y+=15; - define(-1,5,y,140,12,0,label,"�ance �t�ku"); - define(103,130,y,30,12,0,input_line,3,0,255,"%3d");set_default(strs(moblist[i].flee_num));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR);y+=15; - define(-1,5,y,140,12,0,label,"Kouzlo"); - define(104,130,y,30,12,0,input_line,3,0,255,"%3d");set_default(strs(moblist[i].casting));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR);y+=15; - define(-1,5,y,140,12,0,label,"Specproc"); - define(105,120,y,60,12,0,str_line,mob_procs);c_default(moblist[i].specproc);on_enter(string_list_sup);property(b1,NULL,NULL,WINCOLOR);y+=15; - y=260;define(-1,220,248,140,12,0,label,"Po�et anim."); - for(z=0;z<6;z++) - { - define(-1,190,y,50,12,0,label,smery_anim[z]); - define(z+120,260,y,20,12,0,input_line,2,!z*2,15,"%2d");set_default(strs(moblist[i].anim_counts[z]));on_control_exit(test_int); - property(b1,NULL,NULL,WINCOLOR); - y+=15; - } - define(127,285,320,20,12,0,input_line,2,1,15,"%2d");set_default(strs(moblist[i].hit_pos));on_control_exit(test_int); - property(b1,NULL,NULL,WINCOLOR); - define(430,190,350,50,10,0,check_box,"Chod�"); - define(440,190,362,50,10,0,check_box,"�to��"); - define(450,190,374,50,10,0,check_box,"Sly��"); - define(460,250,350,100,10,0,check_box,"Jeden na pol��ku"); - define(470,250,362,60,10,0,check_box,"Str��ce"); - define(480,250,374,40,10,0,check_box,"Sebere"); - define(490,250,386,40,10,0,check_box,"Sb�r�"); - define(500,190,386,50,10,0,check_box,"St��l�"); - define(510,20,438,50,10,0,check_box,"Dialog.");c_default(moblist[i].dialog>=0);on_control_change(open_dialog_edit_box); - define(-1,190,50,50,12,0,label,"Dohled"); - define(-1,190,65,50,12,0,label,"Dosah"); - define(-1,190,80,50,12,0,label,"Expy:"); - define(-1,190,95,50,12,0,label,"Bonus:"); - define(-1,190,110,50,12,0,label,"Pen�ze:"); - define(160,260,50,30,12,0,input_line,3,0,255,"%3d");set_default(strs(moblist[i].dohled));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR); - define(170,260,65,30,12,0,input_line,3,0,255,"%3d");set_default(strs(moblist[i].dosah));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR); - define(175,250,80,55,12,0,input_line,6,0,999999,"%6d");set_default(strs(moblist[i].experience));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR); - define(176,250,95,55,12,0,input_line,6,0,65535,"%6d");set_default(strs(moblist[i].bonus));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR); - define(177,255,110,50,12,0,input_line,6,0,65535,"%5d");set_default(strs(moblist[i].money));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR); - define(180,0,0,0,0,0,value_store,4);c_default(0);//cislo_animace - define(185,0,0,0,0,0,value_store,4);c_default(0);//cislo_pozice - define(190,0,0,0,0,0,value_store,4);c_default(i);//cislo_i - b1=def_border(1,0); - define(210,190,144,80,20,0,button,"Dal�� >>");property(b1,NULL,NULL,WINCOLOR);on_control_change(mob_next); - define(220,190,166,80,20,0,button,"Oto�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(mob_turn); - define(230,190,188,80,20,0,button,"Test");property(b1,NULL,NULL,WINCOLOR);on_control_change(play_mob); - define(240,84,2,80,20,2,button,"Zru�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(250,2,2,80,20,2,button,"Ok");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(260,166,2,80,20,2,button,"Vymazat");property(b1,NULL,NULL,WINCOLOR);on_control_change(mob_ask_delete); - define(270,2,24,80,20,2,button,"Zvuky");property(b1,NULL,NULL,WINCOLOR);on_control_change(mob_sound); - define(280,84,24,80,20,2,button,"Invent��");property(b1,NULL,NULL,WINCOLOR);on_control_change(mob_inv); - define(290,166,24,80,20,2,button,"Aff");property(b1,NULL,NULL,WINCOLOR);on_control_change(spell_affections); - define(-1,190,220,1,1,0,label,"Pals:"); - define(520,230,220,30,12,0,input_line,3,-127,127,"%3d");set_default(strs(moblist[i].paletts_count));on_control_exit(test_int);property(b1,NULL,NULL,WINCOLOR); - for(y=0;y<6*16;y++) {define(300+y,0,0,0,0,0,value_store,4);c_default(moblist[i].adjusting[y]);} - define(630,0,0,0,0,0,value_store,1);c_default(0);//IN_BATTLE; - define(640,190,400,50,10,0,check_box,"Pr�choz�"); - define(650,190,412,50,10,0,check_box,"C�t�"); - define(660,190,424,100,10,0,check_box,"Astral (wind)"); - define(670,300,400,100,10,0,check_box,"Reload mob"); - define(680,300,412,100,10,0,check_box,"Kouzl�"); - define(700,0,0,0,0,0,value_store,4);c_default(moblist[i].vlastnosti[VLS_KOUZLA]); - movesize_win(waktual,0,0,DxGetResX(),DxGetResY()); - check_mobs_name(); - fill_bit_fields(0,430,moblist[i].stay_strategy,8); - fill_bit_fields(0,630,moblist[i].vlajky,6); - redraw_desktop(); - escape(); - if (o_aktual->id==250) - { - TMOB *p; - p=&moblist[i]; - get_value(0,10,p->name); - for(z=0;z<24;z++) - if (nvlast[z][0]) p->vlastnosti[z]=vals(20+z);else p->vlastnosti[z]=0; - get_value(0,100,p->mobs_name); - p->speed=vals(101); - p->vlastnosti[VLS_MGZIVEL]=f_get_value(0,102); - p->flee_num=vals(103); - p->casting=vals(104); - p->specproc=f_get_value(0,105); - for(z=0;z<6;z++) p->anim_counts[z]=vals(120+z); - p->hit_pos=vals(127); - p->stay_strategy=get_bit_fields(0,430,8); - p->vlajky=get_bit_fields(0,630,6) | (p->vlajky & 0x40); - p->dohled=vals(160); - p->dosah=vals(170); - p->experience=vals(175); - p->bonus=vals(176); - p->money=vals(177); - p->vlastnosti[VLS_KOUZLA]=f_get_value(0,700); - for(z=0;z<6*16;z++) p->adjusting[z]=f_get_value(0,300+z); - if (p->name[0]=='\0') - { - msg_box("Doporu�en�",' ',"Bylo by dobr� potvoru nazvat, kvuli snadn� manipulaci","Ok",NULL); - strcpy(p->name,p->mobs_name); - } - p->lives=p->vlastnosti[VLS_MAXHIT]; - p->cislo_vzoru=i; - p->locx=128; - p->headx=128; - p->locy=128; - p->heady=128; - for(y=0;y<6;y++) - for(z=0;z<16;z++) - if (moblist[i].anim_counts[y]==0) moblist[i].adjusting[z+y*16]=moblist[i].adjusting[z]; - p->paletts_count=vals(520); - } - z=o_aktual->id; - close_current(); - if (z==260) - { - int j; - char redraw=0; - for(j=0;j=0 && iminsizx=140; - waktual->minsizy=150; - define(-1,3,1,10,10,2,resizer); - define(29,5,20,170,190,0,listbox,enemy_list,RGB555(31,31,0),4);c_default(0); - o_end->autoresizex=1; - o_end->autoresizey=1; - b1=def_border(3,WINCOLOR); - define(30,5,38,15,156,1,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(b1,NULL,NULL,WINCOLOR); - o_end->autoresizey=1; - define(31,3,20,19,15,1,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(32,3,68,19,15,2,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(40,5,5,60,20,3,button,"Vymazat");property(b1,NULL,NULL,WINCOLOR);on_control_change(vymazat_moba); - define(50,5,30,60,20,3,button,"Um�stit");property(b1,NULL,NULL,WINCOLOR);on_control_change(umistit_moba); - define(60,70,5,60,20,3,button,"Novou");property(b1,NULL,NULL,WINCOLOR);on_control_change(new_mob); - define(70,70,30,60,20,3,button,"Opravit");property(b1,NULL,NULL,WINCOLOR);on_control_change(edit_mob_event); - movesize_win(waktual,SCR_WIDTH_X,0,170,SCR_WIDTH_Y-20); - redraw_window(); - } - else - select_window(enemy_win); - } - -void select_enemy(int at_sector) - { - int i,num,pos; - - num=mob_map[at_sector]; - if (num==-1) return; - num&=0x3fff; - pos=0; - for(i=0;icislo_vzoru]=*x; - free(x); - fclose(f); - } - -void *save_mobs_to_map(long *size) - { - int i,cnt; - TMOB *m,*c; - - for(i=0,cnt=0;icislo_vzoru]=*m; - } - -void *save_mob_map(long *size) - { - int i,c; - short *data,*p; - - for(i=0,c=0;i255) msg_box("Omezen�",'\x1',"Nelze m�t v jedn� map� v�c potvor ne� 255. MAPEDIT n�kter� nenahraje.","Ok",NULL); - p=data=getmem(*size=c*4); - for(i=0;ic || enemy_sound[z-1]==NULL)) - { - moblist[i].sounds[j]=0; - err=1; - } - } - if (err) - { - char text[200]; - sprintf(text,"Nestv�ra \"%s\" m� �patnou referenci zvuku! Polo�ka bude vynulov�na!",moblist[i].name); - if (msg_box("Chybn� reference",'\x1',text,"Pokra�ovat","Opravit",NULL)==2) mob_sound_call(i); - } - } - } - -void save_sound_map() - { - FILE *f; - int i,c; - - if (enemy_sound==NULL) - { - remove(MOB_SOUND); - return; - } - check_correct_sounds(); - f=fopen(MOB_SOUND,"wb"); - c=str_count(enemy_sound); - while (c>0 && enemy_sound[c-1]==NULL) c--; - fwrite(&c,1,4,f); - for(i=0;i -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mapy.h" -#include "globals.h" -#include "edit_map.h" -#include "steny.h" -#include "save_map.h" -#include "mob_edit.h" - -int pcxview_win=-1; -static char swap=1; -static char in_ddl=0; - -static void *last_pcx=NULL; -static char *basic_path; - -#define BASIC_PATH "..\\graphics\\" - - -TSTR_LIST read_ddl_dir(char *filter) - { - TSTR_LIST ls; - int i=0; - char *s; - - ls=create_list(256); - s=read_next_entry(MMR_FIRST); - while (s!=NULL) - { - char *d; - char c[13]; - - strncpy(c,s,12); - c[12]=0; - if (filter!=NULL) - { - d=strrchr(c,'.'); - if (d!=NULL && !strncmp(d+1,filter,3)) str_replace(&ls,i++,c); - } - else - str_replace(&ls,i++,c); - s=read_next_entry(MMR_NEXT); - } - if (i==0) str_add(&ls,""); - ls=sort_list(ls,-1); - return ls; - } - -static void get_directory() - { - TSTR_LIST ls; - char pathname[256]; - char file=0; - - c_set_value(0,9,0); - send_message(E_GUI,9,E_CONTROL,2); - get_value(0,20,pathname); - file=f_get_value(0,45); - if (pathname[0]==0) strcpy(pathname,".\\"); - else - if (pathname[strlen(pathname)-1]!='\\') strcat(pathname,"\\"); - set_value(0,20,pathname); - send_message(E_GUI,9,E_CONTROL,0,&ls); - if (ls!=NULL) release_list(ls); - if (file) - ls=read_ddl_dir("PCX"); - else - { - strcat(pathname,"*.pcx"); - ls=read_directory(pathname,DIR_BREIF,_A_NORMAL); - } - if (ls==NULL) - { - ls=create_list(2); - str_add(&ls,""); - } - send_message(E_GUI,9,E_CONTROL,1,ls); - in_ddl=file; - redraw_desktop(); - } - -static void close_pcx_window() - { - TSTR_LIST ls; - send_message(E_GUI,9,E_CONTROL,0,&ls); - if (ls!=NULL) release_list(ls); - if (last_pcx!=NULL)free(last_pcx);last_pcx=NULL; - close_current(); - } - -static void picture2_display(int x1,int y1,int x2,int y2,OBJREC *o) - { - word *paleta; - word *data; - int xs,ys,xo; - word *w; - char *d,*e; - - data=*(void **)o->data;x2,y2; - if (data==NULL) return; - paleta=data+3; - xs=data[0]; - ys=data[1]; - if (swap) y1=y1+ys/2; - data=paleta+256; - e=(char *)data; - do - { - w=GetScreenAdr()+x1+scr_linelen2*y1; - xo=xs/2; - d=e; - do - { - word col=paleta[*d]; - *w++=col/*+(col & ~0x1F)*/;d+=2; - } - while (--xo); - e+=xs*2; - if (swap) y1--;else y1++; - ys-=2; - } - while(ys>0 && y1<460); - } - -static void picture2(OBJREC *o) - { - o->call_draw=picture2_display; - o->datasize=4; - } - -static char *get_pcx(char *filename) - { - char *c; - if (in_ddl) - { - long s; - void *z; - char *name; - - name=strrchr(filename,'\\');if(name!=NULL) name++;else name=filename; - if (test_file_exist(read_group(0),name)) - { - z=afile(name,read_group(0),&s); - load_pcx(z,s,A_8BIT,&c); - free(z); - } - else - c=NULL; - } - else - if (open_pcx(filename,A_8BIT,&c)) - { - in_ddl=!in_ddl;c=get_pcx(filename);in_ddl=!in_ddl; - return c; - } - return c; - } - -static void read_pcx() - { - char pathname[256]; - char name[30]; - TSTR_LIST ls; - int i; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - get_value(0,20,pathname); - if (last_pcx!=NULL) free(last_pcx); - i=f_get_value(0,9); - strcpy(name,ls[i]);name_conv(name); - strcat(pathname,name); - last_pcx=get_pcx(pathname); - c_set_value(0,30,(int)last_pcx); - redraw_window(); - } - -static void change_swap() - { - swap=f_get_value(0,40); - redraw_window(); - } - -static char clr_sw=1; - -static void refresh_scrs() - { - WINDOW *w; - int i; - set_value(0,100,""); - set_value(0,110," 1"); - switch(i=f_get_value(0,130)) - { - case 0:send_message(E_GUI,140,E_CONTROL,side_names);break; - case 1:send_message(E_GUI,140,E_CONTROL,floors);break; - case 2:send_message(E_GUI,140,E_CONTROL,ceils);break; - case 3:send_message(E_GUI,140,E_CONTROL,oblouky);break; - } - if (o_aktual && o_aktual->id==130) - { - if (i==3) fill_bit_fields(0,160,2+4,3);else fill_bit_fields(0,160,1,3); - set_enable(0,160,i!=3); - set_enable(0,170,i!=2 && i!=1); - set_enable(0,180,i!=2 && i!=1); - } - c_set_value(0,140,0); - set_value(0,150," 1"); - Beep(1000,10); - w=find_window(sektor_win); - if (w!=NULL) close_window(w); - clr_sw=1; - } - -static void clear_switchs() - { - if (clr_sw) - { - c_set_value(0,160,0); - c_set_value(0,170,0); - c_set_value(0,180,0); - c_set_value(0,o_aktual->id,1); - clr_sw=0; - } - } - - -#define ZMENIT "Zm�nit grafiku" -static void zmenit() - { - int i,c,f; - char *name; - TSTR_LIST ls; - - i=f_get_value(0,9); - send_message(E_GUI,9,E_CONTROL,0,&ls); - if (i>=str_count(ls))return; - if (ls[i]==NULL) return; - name=alloca(strlen(ls[i])+1);strcpy(name,ls[i]); - name_conv(name); - c=f_get_value(0,140); - if (c==0) - { - msg_box(ZMENIT,1,"Mus�� vybrat n�jakou grafiku. Klepni tam, jak je naps�no ",MSB_OK); - return; - } - load_side_script(script_name); - f=vals(150); - i=change_side(f_get_value(0,130),c-1,get_bit_fields(0,160,3),f-1,name); - if (i<-1) - { - msg_box(ZMENIT,1,"Program odm�tl (z n�jak�ch d�vod�) akci prov�st. Zkontrolujte v�echny �daje",MSB_OK); - discharge_side_script(); - return; - } - if (i==-1) - { - msg_box(ZMENIT,1,"Nepovolen� kombinace pol� \"Hlavn�\", \"Lev�\" a \"Prav�\"",MSB_OK); - discharge_side_script(); - return; - } - save_side_script(script_name); - refresh_scrs(); - c_set_value(0,140,c); - if (i>0) - { - char c[20]; - - set_value(0,150,itoa(f+1,c,10)); - } - } - -#define VYMAZAT "Vymazat" -static void vymazat() - { - int pos=f_get_value(0,140); - - if (pos==0) - { - msg_box(VYMAZAT,1,"Mus�� vybrat n�jakou grafiku. Klepni tam, jak je naps�no ",MSB_OK); - return; - } - if (msg_box(VYMAZAT,1,"Vymazat grafiku v�etn� p��padn�ch animac�?",MSB_ANONE)==2) return; - load_side_script(script_name); - if (delete_side(f_get_value(0,130),pos-1)) - { - msg_box(VYMAZAT,1,"Program odm�tl vymazat grafiky ze scriptu, nastala n�jak� chyba.",MSB_OK); - discharge_side_script(); - return; - } - save_side_script(script_name); - refresh_scrs(); - } - -#define ZALOZIT "Zalo�it grafiku" -static void add_graphics() - { - char name[200]; - int c,d; - - get_value(0,100,name); - if (name[0]==0) {msg_box(ZALOZIT,1,"Mus�� vepsat n�jak� jm�no!",MSB_OK);return;} - load_side_script(script_name); - if ((c=add_side(f_get_value(0,130),name,vals(110)))==-1) - { - msg_box(ZALOZIT,1,"Nelze zalo�it novou grafiku! P��li� mnoho grafik, nebo nastala jin� chyba.",MSB_OK); - discharge_side_script(); - } - else save_side_script(script_name); - d=vals(110); - refresh_scrs(); - c_set_value(0,140,c+1-d+1); - } - -static char *def_nahled(int id,int x,int y,char *name) - { - char *fpath,*p; - char ind=in_ddl; - - if (name==NULL) return NULL; - concat(fpath,basic_path,name); - in_ddl=0; - p=get_pcx(fpath); - in_ddl=ind; - define(id,x,y,10,10,0,picture2);c_default((int)p); - return p; - } - -static void nahled() - { - int list; - int pos,i; - char *p1=NULL,*p2=NULL,*p3=NULL,*p4; - char swps=swap; - - list=f_get_value(0,130);pos=f_get_value(0,140)-1+vals(150)-1; - if (pos<0) - { - msg_box("N�hled",1,"Nen� co zobrazit!",MSB_OK); - return; - } - load_side_script(script_name); - tady: - def_dialoge(2,2,630,440,"N�hled grafiky"); - switch (list) - { - case 0: p1=def_nahled(10,5,25,get_side_name(list,pos,1)); - p2=def_nahled(10,255,25,get_side_name(list,pos,2)); - p3=def_nahled(10,380,25,get_side_name(list,pos,3)); - swap=1; - break; - case 1: - case 2: p1=def_nahled(10,5,25,get_side_name(list,pos,1)); - swap=0; - break; - case 3: p1=def_nahled(10,5,25,get_side_name(list,pos,1)); - p2=def_nahled(10,255,25,get_side_name(list,pos,2)); - swap=1; - break; - } - define(-1,5,5,80,20,2,button,"Ok");on_control_change(terminate_gui); - define(110,100,5,80,20,2,button,">>");on_control_change(terminate_gui); - define(120,190,5,80,20,2,button,"<<");on_control_change(terminate_gui); - redraw_window(); - p4=get_side_name(list,pos,0); - if (p4!=NULL) set_enable(0,120,p4[0]=='*' && pos>0); - p4=get_side_name(list,pos+1,0); - set_enable(0,110,p4!=NULL && p4[0]=='*'); - escape(); - i=o_aktual->id; - close_current(); - free(p1);free(p2);free(p3); - if (i==110){pos++;goto tady;} - if (i==120){pos--;goto tady;} - discharge_side_script(); - swap=swps; - } - -void pcxviewer() - { - TSTR_LIST ls; - - basic_path=get_text_field(config_file,"CESTA_GRAFIKA"); - if (basic_path==NULL)basic_path=""; - if (find_window(pcxview_win)==NULL) - { - CTL3D b1,b2,b3; - - ls=create_list(2);str_add(&ls,""); - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D)); - pcxview_win=def_window(635,440,"Prohl��e� obrazk� PCX"); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - on_control_change(close_pcx_window); - - define(9,10,20,110,376,0,listbox,ls,0x7fff,0);on_control_change(read_pcx); - property(&b3,NULL,NULL,WINCOLOR);c_default(0); - define(10,126,40,21,337,0,scroll_bar_v,0,10,1,0x0200); - property(&b2,NULL,NULL,WINCOLOR); - define(11,126,20,21,17,0,scroll_button,-1,0,"\x1e"); - property(&b1,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,126,380,21,17,0,scroll_button,1,10,"\x1f"); - property(&b1,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(-1,175,20,1,1,0,label,"Cesta:"); - define(20,175,32,320,12,0,input_line,240);set_default(basic_path); - property(&b3,NULL,NULL,WINCOLOR);on_control_exit(get_directory); - define(30,175,50,2,2,0,picture2);c_default(0); - define(40,10,10,80,10,3,check_box,"Oto�it");c_default(swap);on_control_change(change_swap); - define(45,10,25,160,10,3,check_box,"Grafika Skeldalu");c_default(0);on_control_change(get_directory); - define(-1,5,80,110,75,1,label,"");property(&b2,NULL,NULL,WINCOLOR); - define(-1,10,80,100,70,1,label,"Nov� grafika"); - define(100,10,100,100,10,1,input_line,50);set_default("");property(&b3,NULL,NULL,WINCOLOR); - define(-1,10,115,100,12,1,label,"Sn�mk�"); - define(110,10,115,30,10,1,input_line,20,1,15,"%2d");set_default(strs(1));property(&b3,NULL,NULL,WINCOLOR); - on_control_exit(test_int); - define(120,10,130,60,20,1,button,"Zalo�it");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(add_graphics); - define(130,10,160,110,50,1,radio_butts,4,"St�na","Podlaha","Strop","Oblouk");c_default(0);on_control_change(refresh_scrs); - - define(-1,5,230,110,110,1,label,"");property(&b2,NULL,NULL,WINCOLOR); - define(-1,10,230,100,10,1,label,"Vyber grafiku:"); - define(140,10,255,100,10,1,str_line,side_names);on_enter(string_list_sup);c_default(0);property(&b2,NULL,NULL,WINCOLOR); - define(-1,10,270,100,12,1,label,"Sn�mek"); - define(150,10,270,30,12,1,input_line,20,1,15,"%2d");set_default(strs(1));property(&b3,NULL,NULL,WINCOLOR); - on_control_exit(test_int); - define(160,10,300,100,10,1,check_box,"Hlavn�");c_default(0);on_control_change(clear_switchs); - define(170,10,312,100,10,1,check_box,"Lev�");c_default(0);on_control_change(clear_switchs); - define(180,10,324,100,10,1,check_box,"Prav�");c_default(0);on_control_change(clear_switchs); - define(190,20,345,80,20,1,button,"P�i�adit");property(&b1,NULL,NULL,WINCOLOR);on_control_change(zmenit); - define(200,20,370,80,20,1,button,"Vymazat");property(&b1,NULL,NULL,WINCOLOR);on_control_change(vymazat); - define(200,20,395,80,20,1,button,"N�hled");property(&b1,NULL,NULL,WINCOLOR);on_control_change(nahled); - define(-1,130,20,1,400,1,label,"");property(def_border(4,WINCOLOR),NULL,NULL,WINCOLOR); - define(-1,100,30,1,1,1,label,"Tv�rce"); - define(-1,100,45,1,1,1,label,"grafick�ch"); - define(-1,100,60,1,1,1,label,"script�"); - } - else - { - select_window(pcxview_win); - } - redraw_window(); - get_directory(); - } diff --git a/MAPS/SAVE_MAP.C b/MAPS/SAVE_MAP.C deleted file mode 100644 index da54ee3..0000000 --- a/MAPS/SAVE_MAP.C +++ /dev/null @@ -1,694 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mapy.h" -#include "edit_map.h" -#include "globals.h" -#include "steny.h" -#include "mob_edit.h" -#include "save_map.h" -#include - -#define A_SIDEMAP 0x8001 -#define A_SECTMAP 0x8002 -#define A_STRTAB1 0x8003 //stena main -#define A_STRTAB2 0x8004 //stena leva -#define A_STRTAB3 0x8005 //stena prava -#define A_STRTAB4 0x8006 //strop -#define A_STRTAB5 0x8007 //podlaha -#define A_STRTAB6 0x8008 //oblouk levy -#define A_MAPINFO 0x8009 -#define A_MAPGLOB 0x800A -#define A_STRTAB7 0x800B //oblouk pravy -#define A_MAPITEM 0x800C //itemy -#define A_MAPMACR 0x800D //Makra multiakce -#define A_MAPFLY 0x800E //Letajici predmety -#define A_MAPMOBS 0x800F //Potvory v bludi�ti -#define A_MAPVYK 0x8010 //Vyklenky -#define A_MOBS 0x8011 //Potvory definice -#define A_MOBSND 0x8012 //Potvory zvuky -#define A_PASSW 0x8013 //Heslo 1 -#define A_PASSW2 0x8014 //Heslo 2 -#define A_MAPEND 0x8000 - -#define BACKUP_ADR "backup" - -char filename[MAX_PATH]; - static char backup=0; - -static char password[50]; -static char passpass; - -void encrypt(char *password) - { - char *p=password; - - p=password; - while(*p) *p=~*p,p++; - } - -void encrypt2(char *in,char *out,int size) - { - int c=clock(),i; - char z; - for(i=0;inext; - *size=i*sizeof(TSMP_STAMP); - z=(TSMP_STAMP *)getmem(*size); - i=0; - q=smplist; - while(q!=NULL) - memcpy(&z[i++],q->data,sizeof(TSMP_STAMP)),q=q->next; - return z; - } - -void build_sample_tree(TSMP_STAMP *z,long size) - { - int i; - - smplist=NULL; - for (i=0;isizeof(mglob)) size=sizeof(mglob); - memcpy(&mglob,temp,size); -/* if (size>sizeof(mglob)-sizeof(mglob.mappassw)) - { - decrypt2(mglob.mappassw,password); - passpass=2; - if (password[0]) newcode=1; - }*/ - break; - case A_MAPINFO: - memcpy(&minfo,temp,size); - maplen=size / sizeof(TMAP_EDIT_INFO); - sect=0; - for (i=0;i20) Shift_map_sectors_down(); - break; - case A_MAPMACR: - load_macros(temp); - break; - case A_MAPEND: - nmapend=0; - break; - case A_MAPITEM: - load_item_map(temp,size); - break; - case A_MAPMOBS: - load_mob_map(temp,size); - break; - case A_MOBS: - load_mobs_to_map(temp,size); - mglob.local_monsters=1; - break; - case A_MOBSND: - load_sound_dat(temp,size); - break; - case A_MAPVYK: - memcpy(vyklenky,temp,size); - break; - case A_PASSW: -/* if (passpass<2) - { - memcpy(password,temp,size); - encrypt(password); - passpass=2; - }*/ - break; - } - else - { - if (temp!=NULL)free(temp); - fclose(f); - return -1; - } - free(temp); - } - while (nmapend); - fclose(f); - for(r=1;r0 && names[cn-1]==NULL) cn--; - while (jmsg==E_INIT) return ; - if (msg->msg==E_DONE) return ; - if (msg->msg==E_MOUSE) - { - MS_EVENT *ms; - - ms=get_mouse(msg); - if (ms->tl1) - { - send_message(E_STATUS_LINE,E_DONE,E_IDLE,backup_info); - send_message(E_DONE,E_MOUSE,backup_info); - return; - } - return; - } - c=(char *)msg->data; - strcpy(c,"Star� soubor byl ulo�en v adres��i backup\\..."); - c=strchr(c,'\0'); - msg->data=(void *)c; - msg->msg=-1; - return; - } - - -void create_backup(char *old_filename) - { - char *c; - FILE *fl; - void *d; - long siz; - - mkdir(BACKUP_ADR); - c=alloca(strlen(BACKUP_ADR)+1+strlen(old_filename)+1); - sprintf(c,"%s\\%s",BACKUP_ADR,old_filename); - fl=fopen(old_filename,"rb");if (fl==NULL) return; - fseek(fl,0,SEEK_END);siz=ftell(fl); - fseek(fl,0,SEEK_SET); - d=getmem(siz); - fread(d,1,siz,fl); - fclose(fl); - fl=fopen(c,"wb"); - if (fl!=NULL) - { - fwrite(d,1,siz,fl); - fclose(fl); - send_message(E_STATUS_LINE,E_ADD,E_IDLE,backup_info); - send_message(E_ADD,E_MOUSE,backup_info); - } - free(d); - } - - - - -int save_map(char *filename) - { - long bytesize; - FILE *f; - char nerr=1;char *pr; - int i,j; - TSTR_LIST names=NULL; - void *temp; - char enpass[58]; - - f=fopen(filename,"wb"); - if (f==NULL) return -1; - - for (i=1;iflags & 0x40000) - if ((minfo[i].x+minfo[i].y+j)& 1) - w->prim+=(w->prim_anim & 0xf)+1; - } - - bytesize=sizeof(mglob); - encrypt2(password,mglob.mappassw,sizeof(mglob.mappassw)); - if (nerr) - nerr&=(bytesize==save_section(f,&mglob,A_MAPGLOB,bytesize)); - - bytesize=maplen*sizeof(TSTENA)*4; - if (nerr) - nerr&=(bytesize==save_section(f,&mapa.sidedef,A_SIDEMAP,bytesize)); - - bytesize=maplen*sizeof(TSECTOR); - if (nerr) - nerr&=(bytesize==save_section(f,&mapa.sectordef,A_SECTMAP,bytesize)); - - if (password[0]) Shift_map_sectors_up(); - bytesize=maplen*sizeof(TMAP_EDIT_INFO); - if (nerr) - nerr&=(bytesize==save_section(f,&minfo,A_MAPINFO,bytesize)); - if (password[0]) Shift_map_sectors_down(); - pr=pripona(filename,SCR); - for (i=1;i<8;i++) - { - - switch (i) - { - case 1: - case 2: - case 3:read_side_script_one(pr,NSID,&names,i,4);break; - case 4:read_side_script_one(pr,NCEI,&names,1,2);break; - case 5:read_side_script_one(pr,NFLR,&names,1,2);break; - case 6:read_side_script_one(pr,NOBL,&names,1,3);break; - case 7:read_side_script_one(pr,NOBL,&names,2,3);break; - } - if (nerr) - nerr&=save_scr_list(f,names,i==7?A_STRTAB7:A_STRTAB1+i-1); - } - - strcpy(enpass,"Heslo \x8 je heslo"); - bytesize=strlen(enpass)+1; - if (nerr && bytesize>1) - { - encrypt(enpass); - memcpy(enpass+bytesize,"\0\x13\x80",12);bytesize+=24; - nerr&=(bytesize==save_section(f,enpass,A_PASSW,bytesize)); - } - temp=save_macros(&bytesize); - if (temp!=NULL) - { - if (nerr) - nerr&=(bytesize==save_section(f,temp,A_MAPMACR,bytesize)); - free(temp); - } - - if (nerr) - nerr&=save_item_map(f,A_MAPITEM); - - if (mglob.local_monsters) - { - temp=save_mobs_to_map(&bytesize); - if (nerr && temp!=NULL) - nerr&=(bytesize==save_section(f,temp,A_MOBS,bytesize)); - free(temp); - nerr&=save_sound_dat(f,A_MOBSND); - } - - temp=save_mob_map(&bytesize); - if (temp!=NULL) - { - if (nerr) - nerr&=(bytesize==save_section(f,temp,A_MAPMOBS,bytesize)); - free(temp); - } - for(i=255;i>1;i--) if (vyklenky[i].sector!=0) break; - bytesize=sizeof(TVYKLENEK)*(i+1); - if (nerr) - nerr&=(bytesize==save_section(f,vyklenky,A_MAPVYK,bytesize)); - strcpy(enpass,"To bys \x8 chtel vedet co? \x8 "); - bytesize=strlen(enpass)+1; - if (nerr && bytesize>1) - { - encrypt(enpass); - memcpy(enpass+bytesize,"\0\x13\x80",12);bytesize+=12; - nerr&=(bytesize==save_section(f,enpass,A_PASSW,bytesize)); - } - bytesize=sizeof(bytesize); - if (nerr) - nerr&=(bytesize==save_section(f,&bytesize,A_MAPEND,bytesize)); - strcpy(enpass,"Ty si \x8 ale nedas pokoj! \x8"); - bytesize=strlen(enpass)+1; - if (nerr && bytesize>1) - { - encrypt(enpass); - memcpy(enpass+bytesize,"\0\x13\x80",12);bytesize+=12; - nerr&=(bytesize==save_section(f,enpass,A_PASSW,bytesize)); - } - bytesize=sizeof(bytesize); - if (nerr) - nerr&=(bytesize==save_section(f,&bytesize,A_MAPEND,bytesize)); - fclose(f); - if (names!=NULL) release_list(names); - { - int x,y; - for(x=1;xprim_anim&=0xf; - w->sec_anim&=0xf; - if (!s->step_next[j]) - { - w->flags|=0x1e; - w->flags&=~0x080; - } - if (!w->sector_tag) - { - w->action=0; - w->side_tag&=~3; - } - if (w->flags & 0x100) - { - w->prim_anim|=(rand()*(w->prim_anim)/32768)<<4; - } - if (w->prim>=maxp) w->prim=1; -/* if (!(w->flags & 0x80) && w->prim==0) - { - *objnumber=i; - *objsub=j; - return -1; // Wall definition missing - } */ - if (s->step_next[j] && !(mapa.sectordef[s->step_next[j]].sector_type)) - { - *objnumber=i; - *objsub=j; - return -2; // Wall leades to unexisting sector - } -/* if (s->sector_type==3) - if (w->flags & 1) - if (mapa.sidedef[i][(j+1)&3].flags & 1 || mapa.sidedef[i][(j-1)&3].flags & 1 || - (!(mapa.sidedef[i][(j^2)].flags & 1))) - { - *objnumber=i; - *objsub=-1; - return -3; // Stairs wire error. - } */ - if (chka[w->action] && !(mapa.sectordef[w->sector_tag].sector_type)) - { - *objnumber=i; - *objsub=j; - return -4; // Event leades to unexisting sector. - } - } - return 0; - } - -static char set_date_time(char *filename, unsigned long date, unsigned long time) - { - HANDLE h=CreateFile(filename,0,0,NULL,OPEN_EXISTING,0,NULL); - FILETIME WriteTime; - char err=0; - if (h==NULL) return 1; - WriteTime.dwHighDateTime=date; - WriteTime.dwLowDateTime=time; - err=SetFileTime(h,NULL,NULL,&WriteTime)==1; - CloseHandle(h); - return err; - } - -static char get_date_time(char *filename, unsigned long *date, unsigned long *time) - { - HANDLE h=CreateFile(filename,0,0,NULL,OPEN_EXISTING,0,NULL); - FILETIME WriteTime; - char err=0; - if (h==NULL) return 1; - err=GetFileTime(h,NULL,NULL,&WriteTime)!=1; - *date=WriteTime.dwHighDateTime; - *time=WriteTime.dwLowDateTime; - CloseHandle(h); - return err; - } - -void validate_sound_map() - { - unsigned short date,time; - - if (get_date_time(MOB_SOUND,&date,&time)) return; - set_date_time(MOB_FILE,date,time); - set_date_time(ITEM_FILE,date,time); - } - -char check_sound_map() - { - unsigned long date,time; - unsigned long cdate,ctime; - - if (get_date_time(MOB_SOUND,&date,&time)) return 0; - get_date_time(MOB_FILE,&cdate,&ctime); - if (date!=cdate || time!=ctime) return 1; - get_date_time(ITEM_FILE,&cdate,&ctime); - if (date!=cdate || time!=ctime) return 1; - return 0; - } - - -int save_all_map(void) - { - int x,y,z; - char info[160]; - char *txt; - if ((z=check_map(&x,&y))!=0) - { - WINDOW *w; - unselect_map(); - if ((w=find_window(tool_bar))!=NULL) close_window(w); - tool_sel=30; - create_map_win(-1); - open_sector_win(); - jdi_na_sektor(x); - } - sprintf(info,"Chyba %02d na pozici %d:%d",-z,x,y); - switch (z) - { - case -1:msg_box(info,'\01',"Chyb� definice st�ny!","OK",NULL);break; - case -2:msg_box(info,'\01',"Chodba vede do neexistuj�c�ho sektoru!","OK",NULL);break; - case -3:msg_box(info,'\01',"Schody jsou �patn� spojen� se sousedn�m� sektory!","OK",NULL);break; - case -4:msg_box(info,'\01',"Ud�lost v neexistuj�c�m sektoru!","OK",NULL);break; - } - if (!backup) - { - create_backup(filename); - create_backup(SHOP_NAME); - create_backup(ITEMS_DAT); - create_backup(MOB_FILE); - create_backup(MOB_SOUND); - backup=1; - } - if (save_map(filename)) - { - sprintf(info,"Nedok��u ulo�it soubor %s.",filename); - msg_box("Chyba I/O",'\01',info,"!Panika!",NULL); - } - else txt=pripona(filename,TXT); - save_items(); - if (_access(txt,0)!=0) - { - FILE *f; - - f=fopen(txt,"w"); - if (f) { - fputs("-1\n",f); - fclose(f); - } - } - if (!mglob.local_monsters) - { - save_mobs(); - save_sound_map(); - } - save_all_shops(); - validate_sound_map(); - return z; - } - -char *set_password(char *text) - { - if (text!=NULL) - { - strncpy(password,text,sizeof(password)); - password[sizeof(password)-1]=0; - } - return password; - } - -char check_password(char *text) - { - if (password[0]==0) return 1; - if (text==NULL) return 0; - return !strcmp(text,password); - } - - diff --git a/MAPS/SAVE_MAP.H b/MAPS/SAVE_MAP.H deleted file mode 100644 index 313bd45..0000000 --- a/MAPS/SAVE_MAP.H +++ /dev/null @@ -1,14 +0,0 @@ -extern char filename[MAX_PATH]; - -int load_map(char *filename); -int save_map(char *filename); -int save_all_map(void); - -long save_section(FILE *f,void *section, int sct_type,long sect_size); -long load_section(FILE *f,void **section, int *sct_type,long *sect_size); -int save_scr_list(FILE *f,TSTR_LIST names,int scr_id); -char check_sound_map(); -char *set_password(char *text); -char check_password(char *text); -void encrypt(char *password); - diff --git a/MAPS/STENY.C b/MAPS/STENY.C deleted file mode 100644 index 429cefe..0000000 --- a/MAPS/STENY.C +++ /dev/null @@ -1,542 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "steny.h" -#include "globals.h" - -#define WLISTX 200 -#define WLISTY 200 - -#define DELETED "*(deleted)" -#define EMPTY "EMPTY.PCX" -#define ANIM "*frame" - -TSTR_LIST side_names=NULL; -TSTR_LIST floors=NULL; -TSTR_LIST ceils=NULL; -TSTR_LIST oblouky=NULL; -TSTR_LIST dlg_names=NULL; -TSTR_LIST weapons=NULL; -TSTR_LIST weapons_pos=NULL; - -int *dlg_pgfs=NULL; - -void read_side_list(char *filename,TSTR_LIST *outpt,int relative,int structlen) - { - char i,j; - FILE *f; - char s[200]; - - - if (*outpt!=NULL) release_list(*outpt); - *outpt=create_list(1); - str_replace(outpt,0,""); - f=fopen(filename,"r"); - if (f==NULL) return; - i=1;j=0; - while (relative) - { - fscanf(f,"%s",&s);relative--; - } - do - { - if (fscanf(f,"%s",&s)==1 && (!j)) str_replace(outpt,i++,s); - j++; - if (j==structlen) j=0; - } - while (!feof(f)); - fclose(f); - str_delfreelines(outpt); - j=str_count(*outpt); - for(i=0;iuserptr=(void *)getmem(16); - memcpy(o->userptr,strtable,4); - } - - -void read_dlg_list(char *filename,TSTR_LIST *outpt,int **nums) - { - FILE *f; - char s[200]; - int i,j,k; - - f=fopen(filename,"r"); - i=0; - if (*outpt!=NULL) release_list(*outpt); - *outpt=create_list(1); - str_replace(outpt,0," "); - if (f==NULL) return; - do - { - if (fgets(s,199,f)==NULL) break; - str_replace(outpt,i++,s); - } - while (!feof(f)); - fclose(f); - if (*nums!=NULL) free(*nums); - k=str_count(*outpt); - *nums=(int *)getmem(sizeof(int)*k); - for(j=0;jdata; - t=(t_side_names **)o->userptr; - table=*t; - bar(x1,y1,x2,y2); - for (i=0;i<*d;i++) - if (!strcmp((*table)[i],"\\")) return; - i=*d; - while (y1+text_height((*table)[i])o->xs) - { - char *t; - - t=strchr(s,'\0'); - *(--t)='\0'; - } - position(x1,y1); - outtext(s); - y1+=text_height(*table); - i++; - } - } -void strlist_event(EVENT_MSG *msg,OBJREC *o) - { - t_side_names *table,**t; - int *d,i; - - d=(int *)o->data; - t=(t_side_names **)o->userptr; - table=*t; - if (msg->msg==E_MOUSE) - { - MS_EVENT *ms; - - ms=get_mouse(msg); - if (ms->event_type & 4) - { - int y1=0; - - i=*d; - while (y1+text_height((*table)[i])<(ms->y-o->locy)) - { - if (!strcmp((*table)[i],"\\")) return; - y1+=text_height(*table); - i++; - } - *d=i; - terminate_gui(); - } - } - if (msg->msg==E_CONTROL) - { - memcpy(o->userptr,msg->data,4); - redraw_object(o); - } - } - - -void strlist(OBJREC *o) - { - o->call_init=strlist_init; - o->call_draw=strlist_draw; - o->call_event=strlist_event; - o->datasize=4; - - } - -void strlist_scroll() - { - c_set_value(0,10,f_get_value(0,20)); - } - -int strlist_count(char *s) - { - int i; - - i=0; - while (strcmp(s,"\\")) i++,s+=T_LIST_SIZE; - return i; - } - -TSTR_LIST build_static_list(char *c) - { - TSTR_LIST e; - int i=0; - - e=create_list(10); - while (c[0]!='\\') - { - str_replace(&e,i,c); - c=strchr(c,0); - c++;i++; - } - str_delfreelines(&e); - return e; - } - - -int string_list(char *c,int akt) - { - int oldid; - int x1,y1; - CTL3D *ctl; - FC_TABLE cl; - int vysl; - - cl[0]=0;cl[1]=0x610; - ctl=def_border(3,WINCOLOR); - oldid=o_aktual->id; - x1=o_aktual->locx; - y1=o_aktual->locy+o_aktual->ys; - if (y1+WLISTY>desktop_y_size) y1=desktop_y_size-WLISTY; - if (x1+WLISTX+4>SCR_WIDTH_X) x1=SCR_WIDTH_X-WLISTX-4; - def_window(WLISTX,WLISTY,"Vyber"); - waktual->x=x1; - waktual->y=y1; - on_control_change(terminate_gui); - set_window_modal(); - define(19,5,20,WLISTX-30,WLISTY-20,0,listbox,c,RGB555(31,31,31),0);c_default(akt); - on_control_change(terminate_gui); - define(20,3,42,17,WLISTY-64,1,scroll_bar_v,0,1,18,SCROLLBARCOL); - property(ctl,NULL,NULL,WINCOLOR);c_default(0); - define(21,1,20,21,17,1,scroll_button,-1,0,"\x1e"); - property(NULL,icones,&cl,WINCOLOR);on_control_change(scroll_support); - define(22,1,1,21,17,2,scroll_button,1,1,"\x1f"); - property(NULL,icones,&cl,WINCOLOR);on_control_change(scroll_support); - redraw_window(); - send_message(E_GUI,19,E_CONTROL,2); - redraw_window(); - goto_control(19); - escape(); - if (o_aktual->id==19) vysl=f_get_value(0,19); else vysl=-1; - close_window(waktual); - return vysl; - } - -char find_nick(FILE *f,char *nick) - { - char rn[5]; - int i; - - do - { - i=fscanf(f,"%3s",rn); - if (i==EOF) return 1; - while (i!=EOF && i!='{') i=fgetc(f); - if (!strcmp(rn,nick)) return 0; - do - { - while (i!=EOF && i>=' ') i=fgetc(f); - while (i!=EOF && i<=' ') i=fgetc(f); - } - while (i!=EOF && i!='}'); - } - while (i!=EOF); - return 1; - } - -void read_side_script_one(char *filename,char *nick,TSTR_LIST *outpt,int relative,int structlen) - { - char i,j; - FILE *f; - char s[200],end=0; - - if (*outpt!=NULL) release_list(*outpt); - *outpt=create_list(1); - str_replace(outpt,0,""); - f=fopen(filename,"r"); - if (f==NULL) return; - if (find_nick(f,nick)) - { - fclose(f); - return; - } - i=1;j=0; - while (relative && !end) - { - fscanf(f,"%s",s);relative--; - if (s[0]=='}') end=1; - } - if (!end) - do - { - if (fscanf(f,"%s",s)==1 && (!j) && s[0]!='}') str_replace(outpt,i++,s); - if (s[0]=='}') end=1; - j++; - if (j==structlen) j=0; - } - while (!feof(f) && !end); - fclose(f); - str_delfreelines(outpt); - j=str_count(*outpt); - for(i=0;i=count) i=0,j++; - } - while(1); - } - - -void load_side_script(char *filename) - { - FILE *f; - int i; - - if (sid[0]!=NULL) for(i=0;i<4;i++) release_list(sid[i]); - if (flr[0]!=NULL) for(i=0;i<2;i++) release_list(flr[i]); - if (cei[0]!=NULL) for(i=0;i<2;i++) release_list(cei[i]); - if (obl[0]!=NULL) for(i=0;i<3;i++) release_list(obl[i]); - f=script_name==NULL?NULL:fopen(filename,"r"); - if (f!=NULL) - { - fseek(f,0,SEEK_SET);if (!find_nick(f,NSID)) scan_section_script(f,4,sid); - fseek(f,0,SEEK_SET);if (!find_nick(f,NFLR)) scan_section_script(f,2,flr); - fseek(f,0,SEEK_SET);if (!find_nick(f,NCEI)) scan_section_script(f,2,cei); - fseek(f,0,SEEK_SET);if (!find_nick(f,NOBL)) scan_section_script(f,3,obl); - fclose(f); - } - } - -static int add_to_script(TSTR_LIST *ls,char *name,int frames,int count,int max) - { - int cnt; - int i,a,f,j; - char *c,*d; - - if (ls[0]==NULL) - { - for(i=0;i=cnt || ls[0][i]==NULL || !strcmp(ls[0][i],DELETED)) a++,f=i; - else a=0; - i++; - } - } - if (f+frames>max) return -1; - c=alloca(strlen(name)+20); - if (frames>1) sprintf(c,"%s(%d)",name,frames);else strcpy(c,name); - for (d=c;*d;d++) if (*d<=' ') *d='_'; - str_replace(ls,f,c);for(i=1;i=str_count(ls) || ls[side]==NULL || strcmp(ls[side],ANIM)) return 0; - return 1; - } - -static int delete_side_st(TSTR_LIST *ls,int pos,int count) - { - int cnt,i; - - if (ls[0]==NULL) return -1; - cnt=str_count(ls[0]); - do - { - for(i=0;i0 && (ls[0][cnt-1]==NULL || !strcmp(ls[0][cnt-1],DELETED))) - { - cnt--; - str_replace(ls,cnt,NULL); - } - return 0; - } - -int delete_side(int list,int pos) - { - switch (list) - { - case 0: return delete_side_st(sid,pos,4);break; - case 1: return delete_side_st(flr,pos,2);break; - case 2: return delete_side_st(cei,pos,2);break; - case 3: return delete_side_st(obl,pos,3);break; - default: return -1; - } - } - -int add_side(int list,char *name,int frames) - { - switch (list) - { - case 0: return add_to_script(sid,name,frames,4,256);break; - case 1: return add_to_script(flr,name,frames,2,256);break; - case 2: return add_to_script(cei,name,frames,2,256);break; - case 3: return add_to_script(obl,name,frames,3,16);break; - default: return -1; - } - } - -char *get_side_name(int list,int pos,int field) - { - char **res=NULL; - switch (list) - { - case 0: res=sid[field];break; - case 1: res=flr[field];break; - case 2: res=cei[field];break; - case 3: res=obl[field];break; - default: return NULL; - } - if (res==NULL) return NULL; - return res[pos]; - } - - - -void save_section_script(FILE *f,TSTR_LIST *ls,int count) - { - int i,j,cnt; - - cnt=str_count(ls[0]); - for (j=0;j -#include -#include -#include "..\types.h" -#include "..\memman.h" -#include "..\devices.h" -#include "..\event.h" -#include "..\bmouse.h" -#include "..\bgraph.h" -#include "..\gui.h" -#include "..\basicobj.h" -#define WINCOLOR RGB555(24,24,24) -#define LABELCOLOR RGB555(0,0,15) -word *icones; -word icone_color[7]={0x2108,0x7fff,0x000f,0x4210,0x6f7b}; - -void close_test() - { - close_window(waktual); - } - -void logo(void) - { - CTL3D ctl; - word *p; - - ctl.light=0x7fff; - ctl.shadow=0x4210; - ctl.bsize=2; - ctl.ctldef=0; - draw_border(120,90,0x18f,0x6a,&ctl); - p=(word *)load_file("..\\konvert\\mapedit.hi"); - put_picture(120,90,p); - free(p); - showview(0,0,0,0); - } - -void *wait_ms_key(EVENT_MSG *msg) - { - MS_EVENT *ms; - if (msg->msg==E_INIT) return &wait_ms_key; - if (msg->msg==E_MOUSE) - { - ms=get_mouse(msg); - if (ms->event_type & 4) terminate(); - } - return NULL; - } - - -void wait_mouse(void) - { - send_message(E_ADD,E_MOUSE,wait_ms_key); - escape(); - send_message(E_DONE,E_MOUSE,wait_ms_key); - } - - -void init(void) - { - default_font=load_file("d:\\tp\\vga\\boldcz.fon"); - icones=load_file("d:\\tp\\vga\\ikones.fon"); - if (initmode32()) - { - word *p; - - p=load_file("..\\xlat256.pal"); - if (initmode256(p)) - initmode_lo(p); - } - curcolor=0x6318;memcpy(charcolors,flat_color(0x0000),sizeof(charcolors)); - init_events(100); - curfont=default_font; - register_ms_cursor(load_file("..\\konvert\\sipka.HI")); - init_mysky(); - send_message(E_ADD,E_STATUS_LINE,status_line,16); - send_message(E_STATUS_LINE,E_ADD,E_IDLE,show_time); - send_message(E_STATUS_LINE,E_ADD,E_IDLE,status_mem_info); - send_message(E_STATUS_LINE,E_ADD,E_IDLE,mouse_xy); - ukaz_mysku(); - redraw_desktop();logo();wait_mouse(); - install_gui(); - } -/* - w=create_window(100,100,400,200,0x6318,&x); - id=desktop_add_window(w); - define(10,20,50,30,0,sample,"Test"); - property(&x,NULL,flat_color(0x7000),0xffff); - define(10,20,70,30,3,button,"Tlacitko"); - property(NULL,NULL,flat_color(0x000f),0x01c0);on_change(close_test); - w=create_window(5,5,200,200,0x6318,&x); - id=desktop_add_window(w); - define(50,50,70,30,3,button,"Tlacitko"); - property(NULL,NULL,flat_color(0x7fff),0x000f);on_change(close_test); - w=create_window(300,150,300,200,0x6318,&x); - id=desktop_add_window(w); - define(50,50,70,30,3,button,"Tlacitko"); - property(NULL,NULL,flat_color(0x7fff),0x000f);on_change(close_test); - */ - -void def_window(word xs,word ys,char *name) - { - word x=0,y=0; - WINDOW *p; - CTL3D ctl; - - if (waktual!=NULL) - { - x=waktual->x; - y=waktual->y; - } - - highlight(&ctl,WINCOLOR); - ctl.bsize=2;ctl.ctldef=0; - x+=20;y+=20; - if (x+xs>MAX_X-2) x=MAX_X-2-xs; - if (y+ys>MAX_Y-2) y=MAX_Y-2-ys; - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - desktop_add_window(p); - define(0,2,2,xs-25,14,0,win_label,name); - ctl.bsize=1;ctl.ctldef=1; - property(&ctl,default_font,flat_color(0x7fe0),LABELCOLOR); - define(1,xs-20,1,19,16,0,button,"\x1f"); - property(NULL,icones,&icone_color,WINCOLOR);on_change(close_test); - - } - -void Simple_window(void); - -void open_next(void) - { - def_window(300,200,"Dal okno"); - Simple_window(); - redraw_window(); - } - -void Simple_window(void) - { - CTL3D ctl; - highlight(&ctl,WINCOLOR); - ctl.bsize=2;ctl.ctldef=0; - - define(10,30,30,80,20,0,button,"Nov okno"); - property(NULL,default_font,flat_color(0000),WINCOLOR); - on_change(open_next); - define(20,120,30,80,20,0,button,"Konec"); - property(NULL,default_font,flat_color(0000),WINCOLOR); - on_change(terminate); - define(30,60,60,90,12,0,check_box,"Check box"); - property(NULL,default_font,flat_color(0),WINCOLOR);c_default(0); - define(40,60,80,4*15,4*15,0,radio_butts,4,"Test 1","Test 2","Test 3","Test 4"); - property(NULL,default_font,flat_color(0),WINCOLOR);c_default(1); - define(50,170,80,80,20,0,toggle_button,"Toggle");c_default(1); - property(NULL,default_font,flat_color(0),WINCOLOR); - define(60,20,25,180,10,3,input_line,255); - property(&ctl,default_font,flat_color(0),WINCOLOR);set_default("Vstupn linka"); - - - } - - -void main() - { - init(); - def_window(300,200,"Prvn okno"); - Simple_window(); - redraw_desktop(); - escape(); -// deinstall_mouse_handler(); - closemode(); - } - - - - diff --git a/MAPS/WIZ_TOOL.C b/MAPS/WIZ_TOOL.C deleted file mode 100644 index d3b0646..0000000 --- a/MAPS/WIZ_TOOL.C +++ /dev/null @@ -1,3010 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mapy.h" -#include -#include -#include "globals.h" -#include "edit_map.h" -#include "steny.h" -#include "mob_edit.h" -#include "save_map.h" - -long wiz_tool_numb=-1; -MAPGLOBAL mglob={"","","","",0,0,0,1}; - -PTRMAP *smplist=NULL; - -TMULTI_ACTION **multi_actions[MAPSIZE*4]; -int multiaction_win=-1; -void open_multiaction_window(); -static TSTR_LIST mul_list=NULL; - -void create_isort_list(); - - -int action_sizes[MAX_ACTIONS]= - {sizeof(TMA_GEN),sizeof(TMA_SOUND),sizeof(TMA_TEXT),sizeof(TMA_TEXT), - sizeof(TMA_SEND_ACTION),sizeof(TMA_FIREBALL),sizeof(TMA_GEN),sizeof(TMA_LOADLEV), - sizeof(TMA_DROPITM),sizeof(TMA_TEXT),sizeof(TMA_TEXT),sizeof(TMA_CODELOCK), - sizeof(TMA_CACTN),sizeof(TMA_LOCK),sizeof(TMA_SWAPSC),sizeof(TMA_WOUND), - sizeof(TMA_TWOP),sizeof(TMA_TWOP),sizeof(TMA_TWOP),sizeof(TMA_TEXT),sizeof(TMA_TWOP), - sizeof(TMA_TWOP),sizeof(TMA_TWOP),sizeof(TMA_LOADLEV),sizeof(TMA_DROPITM), - sizeof(TMA_TWOP),sizeof(TMA_TWOP),sizeof(TMA_UNIQ),sizeof(TMA_TWOP),sizeof(TMA_UNIQ), - sizeof(TMA_TWOP),sizeof(TMA_LOADLEV),sizeof(TMA_TWOP),sizeof(TMA_LOADLEV), - sizeof(TMA_TWOP),sizeof(TMA_TWOP),sizeof(TMA_TEXT),sizeof(TMA_GLOBE),sizeof(TMA_IFSEC),sizeof(TMA_TWOP)}; - -void close_wiz_tool(void) - { - WINDOW *p; - p=find_window(wiz_tool_numb); - if (p!=NULL) close_window(p); - } - -int count_of_sel(void) - { - int i=0,j=1; - - for(;jflags &=~(0x40F1F | SD_LEFT_ARC | SD_RIGHT_ARC); - sd2->flags &=~(0x40F1F | SD_LEFT_ARC | SD_RIGHT_ARC); - sd1->lclip=lclip; - sd2->lclip=lclip; - if (swp) - { - sd1->flags|=flags2 | 0x800; - sd2->flags|=flags2 | 0x800; - if (anim1!=0) - { - sd1->flags|=0x0200; - sd2->flags|=0x0200; - } - } - else - { - sd1->flags|=flags1; - sd2->flags|=flags1; - sd1->flags|=0x0200; - sd2->flags|=0x0200; - } - sd1->prim=side1;sd2->prim=side2; - sd1->prim_anim=anim1;sd2->prim_anim=anim2; - if (!remote) - { - sd1->flags&=~0xfff00000; - sd1->flags|=((flags1^flags2)<<24)| 0x00400000; - sd1->action=1+mode+4*(anim1==0); - sd1->sector_tag=sector1; - sd1->side_tag=dir; - sd2->flags&=~0xfff00000; - sd2->flags|=((flags1^flags2)<<24)| 0x00400000; - sd2->action=1+mode+4*(anim1==0); - sd2->sector_tag=sector1; - sd2->side_tag=dir; - } - } - else - { - word *w,i,k,d; - TSTENA *sd; - - w=mapa.sectordef[sector1].step_next; - if (!w[0] && !w[1] && !w[2] && !w[3]) - { - msg_box("Nejsou ��dn� v�chody:",'\x1',"Zde nelze vytvo�it tento druh st�ny","Ok",NULL); - return; - } - d=65535; - for(i=0;i<4;i++) - if (w[i]) - { - sd=&mapa.sidedef[sector1][i]; - sd->flags&=~0xFFF00f1f; - if (d!=65535) sd->flags|=0x00100000; - sd->flags|=flags1|(((flags1^flags2)<<24))|0x00400800; - sd->prim=side1; - sd->action=0; - if (d!=65535) - { - sd->side_tag=d; - sd->sector_tag=sector1; - } - d=i; - } - for(k=0;k<4;k++) - if (w[k]) - { - sd=&mapa.sidedef[w[k]][(k+2)&3]; - sd->flags&=~0xFFF00f1f; - sd->flags|=flags1|(((flags1^flags2)<<24)|0x200); - sd->prim=side1; - sd->action=mode+5; - sd->side_tag=d; - sd->sector_tag=sector1; - } - } - terminate_gui(); - } - -void create_door(void) - { - int i; - CTL3D b1,b2,b3; - if (count_of_sel()!=1) - { - msg_box("Door Wizard:",'\x1',"Mus�� ozna�it pouze jeden sektor!","Ok",NULL); - return; - } - for (i=0;iid==30) - { - int obl,i,j; - - obl=f_get_value(0,10); - v_rozich=f_get_value(0,20); - for(i=1;i>");on_control_change(zabezpecit); - define(100,10,10,200,11,3,input_line,29);set_default(mglob.mapname); - property(&b3,NULL,NULL,WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - char c; - for(i=0;i<4;i++) - get_value(0,i*10+10,mglob.back_fnames[i]); - mglob.fade_r=vals(50); - mglob.fade_g=vals(60); - mglob.fade_b=vals(70); - mglob.start_sector=vals(80); - mglob.direction=f_get_value(0,90); - mglob.map_effector=f_get_value(0,95); - c=mglob.local_monsters; - mglob.local_monsters=f_get_value(0,96); - mglob.map_autofadefc=f_get_value(0,97); - if (c!=mglob.local_monsters && c==1) - { - load_mobs(); - load_sound_map(); - } - get_value(0,100,mglob.mapname); - mglob.map_effector=f_get_value(0,95); - } - close_window(waktual); - } - -void set_side_flag(int sector,int side,int what,int set) - { - int value=1; - - value<<=what; - if (set) mapa.sidedef[sector][side].flags|=value; - else mapa.sidedef[sector][side].flags&=~value; - } - -void set_side_flags(int sector,int side,int on_flags,int off_flags,int depth) - { - if (on_flags & 1) set_side_flag(sector,side,7,1); - if (on_flags & 2) set_side_flag(sector,side,18,1); - if (on_flags & 4) set_side_flag(sector,side,29,1); - if (on_flags & 8) set_side_flag(sector,side,9,1); - if (on_flags & 0x10) set_side_flag(sector,side,8,1); - if (off_flags & 1) set_side_flag(sector,side,7,0); - if (off_flags & 2) set_side_flag(sector,side,18,0); - if (off_flags & 4) set_side_flag(sector,side,29,0); - if (off_flags & 8) set_side_flag(sector,side,9,0); - if (off_flags & 0x10) set_side_flag(sector,side,8,0); - if (on_flags & 0x20) - { - mapa.sidedef[sector][side].oblouk&=0x1f; - mapa.sidedef[sector][side].oblouk|=depth<<5; - } - } - -void set_flags_inside(int on_flags,int off_flags,int depth,int where) - { - int x1=+30000,y1=+30000,x2=-30000,y2=-30000; - int i; - - for(i=0;ix2) x2=minfo[i].x; - if (minfo[i].y>y2) y2=minfo[i].y; - } - for(i=0;ix2) x2=minfo[i].x; - if (minfo[i].y>y2) y2=minfo[i].y; - } - for(i=0;i0) - { - txtp2=target; - if (!(txtp2=mapa.sectordef[target].step_next[dir1])) - if ((txtp2=add_sector(x+smery[dir1][0],y+smery[dir1][1],tlayer,0))<1) error="Nen� m�sto pro sektor!"; - else wire_sector(txtp2); - wire_sector(target); - mapa.sectordef[sect].sector_tag=txtp2; - mapa.sectordef[sect].sector_type=2; - mapa.sectordef[target].sector_tag=txtp1; - mapa.sectordef[target].sector_type=2; - } - else error="Nen� m�sto pro sektor!"; - } - else error="V c�lov�m pat�e nen� m�sto pro sektor"; - } - else error="Z toho sektoru nelze t�mto sm�rem vytvo�it schody"; - else - if ((txtp1=mapa.sectordef[sect].step_next[dir2])) - if ((txtp2=mapa.sectordef[target].step_next[dir1])) - { - mapa.sectordef[sect].sector_tag=txtp2; - mapa.sectordef[sect].sector_type=2; - mapa.sectordef[target].sector_tag=txtp1; - mapa.sectordef[target].sector_type=2; - } - else error="Cilov� sektor m� chybn� orientovan� v�chody"; - else error="Nelze vytvo�it schody po�adovan�m sm�rem"; - if (error!=NULL) - { - msg_box("Stairs Wizard:",'\x1',error,"Ok",NULL); - return; - } - if (!mode) - { - int i; - for(i=0;i<4;i++) - { - mapa.sidedef[sect][i].flags=(i==dir2?SD_INVIS:0); - mapa.sidedef[target][i].flags=(i==dir1?SD_INVIS:0); - } - mapa.sectordef[sect].floor=0; - mapa.sectordef[sect].ceil=0; - } - mapa.sidedef[txtp1][dir1].prim=prim1; - mapa.sidedef[txtp2][dir2].prim=prim2; - mapa.sidedef[txtp1][dir1].prim_anim=anim1-1; - mapa.sidedef[txtp2][dir2].prim_anim=anim2-1; - mapa.sidedef[txtp1][dir1].flags|=0x280 | SD_INVIS; - mapa.sidedef[txtp2][dir2].flags|=0x280 | SD_INVIS; - mapa.sidedef[txtp1][dir1].flags&=~SD_DOUBLE_SIDE; - mapa.sidedef[txtp2][dir2].flags&=~SD_DOUBLE_SIDE; - if (anim1) mapa.sidedef[txtp1][dir1].flags|=0x100; - if (anim2) mapa.sidedef[txtp2][dir2].flags|=0x100; - terminate_gui(); - } - -static void schody(void) - { - int i; - CTL3D b1,b2,b3; - if (count_of_sel()!=1) - { - msg_box("Stairs Wizard:",'\x1',"Mus�� ozna�it pouze jeden sektor!","Ok",NULL); - return; - } - for (i=0;iid==OK_BUTT) - { - long smer=get_bit_fields(0,400,4); - int prim_side=f_get_value(0,20); - int sec_side=f_get_value(0,30); - long pro_prim=get_bit_fields(0,440,1); - long pro_sec=get_bit_fields(0,450,1); - int i; - for(i=1;iy=2;waktual->x=SCR_WIDTH_X-120-3; - on_control_change(close_wiz_tool); - define(10,10,25,100,19,0,button2,"Dve�e");on_control_change(create_door); - define(10,10,45,100,19,0,button2,"Oblouky");on_control_change(crt_oblouky); - define(10,10,65,100,19,0,button2,"Schody");on_control_change(schody); - define(10,10,85,100,19,0,button2,"Globaln�");on_control_change(preference); - define(10,10,105,100,19,0,button2,"Bloky");on_control_change(open_blok_window); - define(10,10,125,100,19,0,button2,"Multiakce");on_control_change(open_multiaction_window); - define(10,10,145,100,19,0,button2,"P�edvolba");on_control_change(predvolba); - define(10,10,165,100,19,0,button2,"V�b�r");on_control_change(vyber); - } - else - { - select_window(wiz_tool_numb); - } - redraw_window(); - select_window(w->id); - } - -static BOOL WINAPI SetCurrentAppWindow(HWND hWnd, LPARAM lParam) -{ - HWND *hPtr=(HWND *)lParam; - *hPtr=hWnd; - return FALSE; -} - -typedef struct __BrowserDlgDesc -{ - char *path; - char *filename; - int baselen; - int level; -} BrowserDlgDesc; - -#include "../mapedit/resource.h" -#include - -static void DirListbox(const char *mask, HWND listBox, int dots) -{ - WIN32_FIND_DATA w32fnd; - HANDLE h; - - if (strrchr(mask,'\\') == 0) - { - char *dirmask=(char *)alloca(strlen(mask)+5); - strcpy(dirmask,".\\"); - strcat(dirmask,mask); - DirListbox(dirmask,listBox,dots); - return; - } - h=FindFirstFile(mask,&w32fnd); - ComboBox_ResetContent(listBox); - if (h!=INVALID_HANDLE_VALUE) do - { - char *name=w32fnd.cFileName; - if (~w32fnd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - int p=ComboBox_AddString(listBox,name); - ComboBox_SetItemData(listBox,p,0); - } - } while (FindNextFile(h,&w32fnd)); - FindClose(h); - { - char *dirmask=(char *)alloca(strlen(mask)+5); - char *c=strrchr(mask,'\\'); - HANDLE h; - if (c==0) c=dirmask;else c++; - strcpy(dirmask,mask); - strcpy(dirmask+(c-mask),"*.*"); - h=FindFirstFile(dirmask,&w32fnd); - if (h!=INVALID_HANDLE_VALUE) do - { - char *name=w32fnd.cFileName; - if (w32fnd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (strcmp(name,".")) - { - if (dots||strcmp(name,"..")) - { - int p; - name=(char *)alloca(strlen(name)+3); - sprintf(name,"[%s]",w32fnd.cFileName); - p=ComboBox_AddString(listBox,name); - ComboBox_SetItemData(listBox,p,1); - } - } - } - } while (FindNextFile(h,&w32fnd)); - FindClose(h); - } - } - - -LRESULT WINAPI BrowserDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - BrowserDlgDesc *dlgnfo=(BrowserDlgDesc *)GetWindowLong(hDlg,DWL_USER); - switch (msg) - { - case WM_INITDIALOG: - dlgnfo=(BrowserDlgDesc *)lParam; - DirListbox(dlgnfo->path,GetDlgItem(hDlg,IDC_LIST),0); - SetWindowLong(hDlg,DWL_USER,lParam); - dlgnfo->baselen=strrchr(dlgnfo->path,'\\')-dlgnfo->path+1; - dlgnfo->level=0; - { - HWND parent=GetParent(hDlg); - RECT rc1,rc2; - GetWindowRect(parent,&rc1); - GetWindowRect(hDlg,&rc2); - rc2.left=((rc1.right+rc1.left)>>1)-((rc2.right-rc2.left)>>1); - rc2.top=((rc1.top+rc1.bottom)>>1)-((rc2.bottom-rc2.top)>>1); - SetWindowPos(hDlg,0,rc2.left,rc2.top,0,0,SWP_NOZORDER|SWP_NOSIZE); - SetDlgItemText(hDlg,IDC_PATH,dlgnfo->path); - } - break; - case WM_COMMAND: - { - switch (LOWORD(wParam)) - { - case IDOK: - { - HWND list=GetDlgItem(hDlg,IDC_LIST); - int len=GetWindowTextLength(list)+1; - char *name=(char *)alloca(len+10); - int sel; - int mode=0; - char *c; - - GetWindowText(list,name,len); - if (name[0]==0) break; - sel=ComboBox_FindStringExact(list,-1,name); - if (sel!=-1) mode=ComboBox_GetItemData(list,sel); - if (mode==0) - { - if (strlen(name)<5 || istrcmp(name+strlen(name)-4,".map")!=0) strcat(name,".map"); - if (strlen(name)>12) - { - MessageBox(hDlg,"Jmeno mapy je prilis dlouhe (max 8 znaku bez pripony nebo 12 znaku s priponou)",0,MB_OK|MB_ICONEXCLAMATION); - break; - } - strcpy(dlgnfo->filename,dlgnfo->path+dlgnfo->baselen); - c=strrchr(dlgnfo->filename,'\\'); - if (strlen(name)+strlen(dlgnfo->filename)>=MAX_PATH) break; - if (c==0) c=dlgnfo->filename;else c++; - strcpy(c,name); - EndDialog(hDlg, IDOK); - } - else - { - strcpy(name,name+1); - name[strlen(name)-1]=0; - if (strcmp(name,"..")==0) - { - char *a=strrchr(dlgnfo->path,'\\'); - char *b; - if (a==0) break; - *a=0; - b=strrchr(dlgnfo->path,'\\'); - if (b==0) b=dlgnfo->path;else b++; - strcpy(b,a+1); - dlgnfo->level--; - } - else - { - char *c=(char *)malloc(strlen(dlgnfo->path)+strlen(name)+5); - char *a; - char *b; - strcpy(c,dlgnfo->path); - a=strrchr(c,'\\'); - if (a == 0) a = c; else a++; - b=a+strlen(name)+1; - memmove(b,a,strlen(a)+1); - a[strlen(name)] = '\\'; - memcpy(a,name,strlen(name)); - dlgnfo->level++; - free(dlgnfo->path); - dlgnfo->path=c; - } - DirListbox(dlgnfo->path,list,dlgnfo->level); - SetDlgItemText(hDlg,IDC_PATH,dlgnfo->path); - } - } - break; - case IDCANCEL: - EndDialog(hDlg,IDCANCEL); - break; - case IDC_LIST: if (HIWORD(wParam)==LBN_DBLCLK) - PostMessage(hDlg,WM_COMMAND,IDOK,0); - break; - default: return 0; - } - } - break; - default: return 0; - } - return 1; -} - -void browser(const char *path, char *filename) -{ - BrowserDlgDesc dlg; - HWND hWnd; - dlg.path=strdup(path); - dlg.filename=filename; - EnumThreadWindows(GetCurrentThreadId(),SetCurrentAppWindow,(LPARAM)&hWnd); - if (DialogBoxParam(GetModuleHandle(0),MAKEINTRESOURCE(IDD_OPENDIALOG),hWnd,BrowserDlgProc,(LPARAM)&dlg)==IDCANCEL) - filename[0]=0; - free(dlg.path); -} -/* -void browser(char *pathname,char *filename) - { - OPENFILENAME ofn; - char *mask=(char *)alloca(strlen(pathname)*2+10); - char *c; - char tempfile[MAX_PATH]; - char *cwd=getcwd(NULL,0); - char *basePath=strcat(strcat(strcpy((char *)alloca(strlen(cwd)+strlen(pathname)+3),cwd),"\\"),pathname); - char *z=strrchr(basePath,'\\'); - z[0]=0; - - c=strrchr(pathname,'\\'); - if (c!=0) c++;else c=pathname; - - ZeroMemory(&ofn,sizeof(ofn)); - ofn.lStructSize=sizeof(ofn); - sprintf(mask,"%s%c%s%c",c,0,c,0); - - EnumThreadWindows(GetCurrentThreadId(),SetCurrentAppWindow,(LPARAM)&(ofn.hwndOwner)); - ofn.Flags=OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - ofn.lpstrDefExt=strrchr(pathname,'.')+1; - ofn.lpstrFile=tempfile; - ofn.lpstrFilter=mask; - ofn.nMaxFile=MAX_PATH; - ofn.lpstrInitialDir=basePath; -opakuj: - tempfile[0]=0; - if (GetOpenFileName(&ofn)) - { - - if (strnicmp(basePath,tempfile,strlen(basePath))!=0) - { - msg_box("Browser",'\x1',"Nelze vybirat soubory nad aktualni slozkou.","Ok",NULL); - goto opakuj; - } - strcpy(filename,tempfile+strlen(basePath)+1); - } - else - filename[0]=0; - free(cwd); -} - /* - TSTR_LIST l; - - filename; - l=read_directory(pathname,DIR_BREIF,_A_NORMAL); - if (l==NULL && default_ext) - { - msg_box("Browser",'\x1',"Funkce read_directory() vratila chybu. Adres�� je pr�zdn� nebo je nedostatek pam�ti","Ok",NULL); - return; - } - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - def_window(160,450,"Nalistovat"); - set_window_modal(); - on_change(terminate); - define(9,10,20,120,420,0,listbox,l,RGB555(31,31,0),0);c_default(0); - on_change(terminate); - o_end->autoresizex=1; - o_end->autoresizey=1; - define(10,3,42,21,360,1,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(NULL,NULL,NULL,WINCOLOR); - o_end->autoresizey=1; - define(11,3,20,21,17,1,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_change(scroll_support); - define(12,3,22,21,17,2,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_change(scroll_support); - define(20,3,1,10,10,2,resizer); - redraw_window(); - escape(); - if (o_aktual->id==9) - { - char *a,*b; - strcpy(filename,l[f_get_value(0,9)]); - a=filename;b=a; - while (*b || b-filename>12) - { - *a=*b++; - if (*a!=32) a++; - } - *a='\0'; - } - - close_window(waktual); - release_list(l); - */ - -void add_ma_flags(int start,int x,int y,TMULTI_ACTION *p) - { - define(-1,x,y,1,1,0,label,"Podm�nky"); - define(start+0,x+25,y+15,140,10,0,check_box,"Cancel program");c_default(p->general.cancel); - define(start+1,x+25,y+27,140,10,0,check_box,"Jedenkr�t");c_default(p->general.once); - define(start+2,x+25,y+39,140,10,0,check_box,"�sp��n� pr�chod");c_default(p->general.ps); - define(start+3,x+25,y+51,140,10,0,check_box,"Ne�sp��n� pr�chod");c_default(p->general.pf); - define(start+4,x+25,y+63,140,10,0,check_box,"�sp��n� dotyk");c_default(p->general.ts); - define(start+5,x+25,y+75,140,10,0,check_box,"Ne�sp��n� dotyk");c_default(p->general.tf); - define(start+6,x+25,y+87,140,10,0,check_box,"Informace o z�mku");c_default(p->general.li); - define(start+7,x+25,y+99,140,10,0,check_box,"P�ed odchodem");c_default(p->general.ul); - define(start+8,x+25,y+111,140,10,0,check_box,"P�i p��chodu akce");c_default(p->general.ia); - define(start+9,x+25,y+123,140,10,0,check_box,"P�i startu levelu");c_default(p->general.sp); - define(start+10,x+25,y+135,140,10,0,check_box,"P�i uzav�en� dve��");c_default(p->general.as); - define(start+11,x+25,y+147,140,10,0,check_box,"Ka�de anim.pol��ko");c_default(p->general.am); - define(start+12,x+25,y+159,140,10,0,check_box,"Ka�de druh� a.p.");c_default(p->general.a2); - define(start+13,x+25,y+171,140,10,0,check_box,"P�i proveden� akce");c_default(p->general.pa); - define(start+14,x+25,y+183,140,10,0,check_box,"�sp��n� SpecProc");c_default(p->general.us); - define(start+15,x+25,y+195,140,10,0,check_box,"P�i otev�en� dve��");c_default(p->general.od); - define(start+16,x+25,y+207,140,10,0,check_box,"Ud�lost v�klenku");c_default(p->general.vy); - } - -void read_ma_flags(int start,TMULTI_ACTION *p) - { - p->general.cancel=f_get_value(0,start+0); - p->general.once=f_get_value(0,start+1); - p->general.ps=f_get_value(0,start+2); - p->general.pf=f_get_value(0,start+3); - p->general.ts=f_get_value(0,start+4); - p->general.tf=f_get_value(0,start+5); - p->general.li=f_get_value(0,start+6); - p->general.ul=f_get_value(0,start+7); - p->general.ia=f_get_value(0,start+8); - p->general.sp=f_get_value(0,start+9); - p->general.as=f_get_value(0,start+10); - p->general.am=f_get_value(0,start+11); - p->general.a2=f_get_value(0,start+12); - p->general.pa=f_get_value(0,start+13); - p->general.us=f_get_value(0,start+14); - p->general.od=f_get_value(0,start+15); - p->general.vy=f_get_value(0,start+16); - } - - -void *load_wav_sample(char *filename,long *size) - { - FILE *f; - char *c; - void *d; - - concat(c,sample_path,filename); - f=fopen(c,"rb"); - if (f==NULL) - { - return afile(filename,read_group(0),size); - } - fseek(f,0,SEEK_END); - d=malloc(*size=ftell(f)); - fseek(f,0,SEEK_SET); - fread(d,1,*size,f); - fclose(f); - return d; - } - - -void tma_sound_update() - { - int select; - TSTR_LIST ls; - char *riff,*rff,*rff2; - char fmt_buff[256]; - T_WAVE fmt; - long size; - char *c; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - select=f_get_value(0,9); - concat(c,"",ls[select]); - if (c==NULL) return; - name_conv(c); - riff=load_wav_sample(c,&size); - if (riff==NULL) return; - if ((rff=find_chunk(riff,WAV_FMT))!=NULL && (rff2=find_chunk(riff,WAV_DATA))!=NULL) - { - read_chunk(rff,&fmt_buff); - size=get_chunk_size(rff2); - memcpy(&fmt,fmt_buff,sizeof(fmt)); - if (fmt.wav_mode==1 && fmt.chans==1) - { - strcpy(c,ls[select]); - name_conv(c); - set_value(0,20,c); - sprintf(c,"%6d",fmt.freq);set_value(0,30,c); - sprintf(c,"%6d",size);set_value(0,40,c); - sprintf(c,"%6d",size);set_value(0,50,c); - sprintf(c,"%6d",0);set_value(0,60,c); - c_set_value(0,100,fmt.freq!=fmt.bps); - } - else msg_box("Nespr�vn� WAV",'\x1',"Do hry lze vlo�it jen WAV ve formatu PCM mono!","Ok",NULL); - } - else msg_box("Chybn� soubor WAV",'\x1',"Tento soubor neobsahuje platn� format pro WAV","Ok",NULL); - free(riff); - } - - - -void play_wav(va_list args) - { - char *filename=va_arg(args,char *); - int ffreq=va_arg(args,int); - char fmt_buff[256]; - T_WAVE fmt; - char *riff,*rff; - static load_another=2; - static char *sample=NULL; - int freq,mode,samplesize; - int startloop,endloop,ofs; - long size; - char argsSave[16]; - memcpy(argsSave,args,16); - - riff=load_wav_sample(filename,&size); - if (riff==NULL) return; - if ((rff=find_chunk(riff,WAV_FMT))==NULL) return; - { - read_chunk(rff,&fmt_buff); - memcpy(&fmt,fmt_buff,sizeof(fmt)); - if (fmt.wav_mode==1 && fmt.chans==1) - { - freq=fmt.freq; - mode=fmt.bps/freq; - if (load_another==2) start_mixing(); - load_another=1; - task_sleep(NULL); - task_sleep(NULL); - load_another=0; - if ((rff=find_chunk(riff,WAV_DATA))!=NULL) - { - samplesize=get_chunk_size(rff); - if (sample!=NULL) free(sample); - sample=(char *)getmem(samplesize); - read_chunk(rff,sample); - { - int *z; - set_channel_volume(0,32767,32767); -/* if (mode==1) - for(i=0;i0) - { - freq=ffreq; - startloop=z[0]; - endloop=z[1]; - ofs=z[2]; - if (endloop>samplesize) - { - msg_box("Pozor",'\x1',"Konec opakov�n� le�� za koncem souboru!","Ok",NULL); - endloop=samplesize; - } - if (startloop>endloop) - { - msg_box("Pozor",'\x1',"Za��tek opakov�n� le�� ZA jeho koncem!","Ok",NULL); - startloop=endloop; - } - } - else - { - startloop=samplesize; - endloop=samplesize; - ofs=0; - } - play_sample(0,sample+ofs,endloop-ofs,startloop-ofs,freq,mode); - while (!load_another && get_channel_state(0)) task_sleep(NULL); - mute_channel(0); - } - free(sample);sample=NULL; - } - } - } - free(riff); - if (load_another==0) - { - stop_mixing(); - load_another=2; - } - } - -void tma_sound_preview() - { - char ok; - char au; - int select; - TSTR_LIST ls; - char *c; - - ok=f_get_value(0,290); - au=f_get_value(0,295); - if (au) tma_sound_update(); - if (!ok) return; - send_message(E_GUI,9,E_CONTROL,0,&ls); - select=f_get_value(0,9); - if (ls[select]==NULL) return; - concat(c,"",ls[select]); - name_conv(c); - add_task(16384,play_wav,c,-1); - do_events(); - do_events(); - } - -void tma_sound_autoupdate() - { - char c; - - c=f_get_value(0,295); - set_enable(0,320,!c); - } - -void tma_sound_test() - { - char *c; - char d[15]; - - get_value(0,20,d); - concat(c,"",d); - name_conv(c); - add_task(16384,play_wav,c,vals(30),vals(40),vals(50),vals(60)); - do_events(); - do_events(); - } - -void read_ddl_list_wav(char ***list) - { - TSTR_LIST ddld; - int i,c; - - ddld=read_ddl_dir("WAV"); - if (ddld==NULL) return; - if (*list==NULL) - { - *list=ddld; - return; - } - c=str_count(ddld); - str_add(list,"--- SKELDAL ---"); - for(i=0;isound.freq==0) - { - q->sound.freq=11025; - q->sound.volume=100; - } - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - def_dialoge(100,50,350,390,"Editor zvukov�ch efekt�"); - concat(c,sample_path,"*.wav"); - list=read_directory(c,DIR_BREIF,_A_NORMAL); - read_ddl_list_wav(&list); - define(9,10,20,200,126,0,listbox,list,RGB555(31,31,31),0); - property(&b3,NULL,NULL,WINCOLOR);c_default(0);on_control_change(tma_sound_preview); - define(10,217,40,19,87,0,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(&b2,NULL,NULL,WINCOLOR); - define(11,216,20,21,17,0,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,216,130,21,17,0,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(-1,10,160,100,11,0,label,"Jm�no:"); - define(-1,10,175,100,11,0,label,"freq[Hz]:"); - define(-1,10,190,100,11,0,label,"StartLoop:"); - define(-1,10,205,100,11,0,label,"EndLoop:"); - define(-1,10,220,100,11,0,label,"SmpOffset:"); - define(-1,10,235,100,11,0,label,"Hlasitost:"); - define(-1,10,250,100,11,0,label,"Stopa:"); - define(20,90,160,110,11,0,input_line,12); - property(&b3,NULL,NULL,WINCOLOR);set_default(q->sound.filename); - define(30,90,175,70,11,0,input_line,7,4000,88000,"%6d");on_exit(test_int); - property(&b2,NULL,NULL,WINCOLOR);set_default(strs(q->sound.freq)); - define(40,90,190,70,11,0,input_line,7,0,0x7fffffff,"%6d");on_exit(test_int); - property(&b2,NULL,NULL,WINCOLOR);set_default(strs(q->sound.start_loop)); - define(50,90,205,70,11,0,input_line,7,0,0x7fffffff,"%6d");on_exit(test_int); - property(&b2,NULL,NULL,WINCOLOR);set_default(strs(q->sound.end_loop)); - define(60,90,220,70,11,0,input_line,7,0,0x7fffffff,"%6d");on_exit(test_int); - property(&b2,NULL,NULL,WINCOLOR);set_default(strs(q->sound.offset)); - define(70,90,235,70,11,0,input_line,7,0,100,"%6d");on_exit(test_int); - property(&b2,NULL,NULL,WINCOLOR);set_default(strs(q->sound.volume)); - define(80,90,250,70,11,0,input_line,7,0,100,"%6d");on_exit(test_int); - property(&b2,NULL,NULL,WINCOLOR);set_default(strs(q->sound.soundid)); - define(100,20,265,100,11,0,check_box,"16Bit");c_default(q->sound.bit16 & 1); - define(110,20,277,100,11,0,check_box,"Zaka� p�i otev�r�n�");c_default((q->sound.bit16 & 2)>>1); - define(120,20,290,100,11,0,check_box,"Zaka� p�i zav�r�n�");c_default((q->sound.bit16 & 4)>>2); - define(130,20,302,100,11,0,check_box,"N�hodn� stereo");c_default((q->sound.bit16 & 8)>>3); - define(290,5,80,100,11,1,check_box,"Preview");c_default(preview); - define(295,5,92,100,11,1,check_box,"AutoUpdate");c_default(autoupdate);on_control_change(tma_sound_autoupdate); - define(300,5,20,100,20,1,button,"Ok");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(terminate_gui); - define(310,5,45,100,20,1,button,"Zrusit");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(terminate_gui); - define(320,5,160,100,20,1,button,"<< Update");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(tma_sound_update); - define(330,5,135,45,20,1,button,"");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(tma_sound_test); - define(340,60,135,45,20,1,button,"");property(&b1,NULL,NULL,WINCOLOR); - on_control_change(tma_sound_stop); - add_ma_flags(400,165,175,q); - redraw_desktop(); - set_enable(0,320,!autoupdate); - escape(); - preview=f_get_value(0,290); - autoupdate=f_get_value(0,295); - if (o_aktual->id==300) - { - char c[15]; - read_ma_flags(400,q); - q->sound.volume=vals(70); - q->sound.start_loop=vals(40); - q->sound.end_loop=vals(50); - q->sound.freq=vals(30); - q->sound.offset=vals(60); - q->sound.soundid=vals(80); - q->sound.bit16=get_bit_fields(0,100,4); - get_value(0,20,c); - strncpy(q->sound.filename,c,12); - } - close_current(); - mute_channel(0); - } - -//----------------------- WIZARD MULTIACTIONS ------------------------- - -TMULTI_ACTION *add_multiaction(int sector,int side,int before, TMULTI_ACTION *typa) - { - TMULTI_ACTION **p; - int type; - - type=typa->general.action; - p=multi_actions[sector*4+side]; - if (p==NULL) - { - p=(TMULTI_ACTION **)getmem(sizeof(TMULTI_ACTION *)); - memset(p,0,_msize(p)); - *p=(TMULTI_ACTION *)getmem(action_sizes[type]); - memset(*p,0,action_sizes[type]); - multi_actions[sector*4+side]=p; - memcpy(*p,typa,action_sizes[type]); - return *p; - } - else - { - TSTR_LIST z; - char *zs; - TMULTI_ACTION *c; - - z=(TSTR_LIST)p; - zs=(char *)getmem(action_sizes[type]); - memset(zs,1,action_sizes[type]); - zs[action_sizes[type]-1]=0; - c=(TMULTI_ACTION *)str_insline(&z,before,zs); - multi_actions[sector*4+side]=(TMULTI_ACTION **)z; - memset(c,0,action_sizes[type]); - memcpy(c,typa,action_sizes[type]); - free(zs); - return c; - } - } - -void delete_multiaction(int sector,int side,int pos) - { - TSTR_LIST p; - - p=(TSTR_LIST)multi_actions[sector*4+side]; - if (p==NULL) return; - str_remove(&p,pos); - str_delfreelines(&p); - if (*p==NULL) - { - release_list(p); - p=NULL; - } - multi_actions[sector*4+side]=(TMULTI_ACTION **)p; - - } - -void prefer_multiaction(int sector,int side,int pos) - { - TSTR_LIST p; - int i; - char *c; - - p=(TSTR_LIST)multi_actions[sector*4+side]; - if (p==NULL) return; - i=pos; - while (i>1) - { - c=p[i]; - p[i]=p[i-1]; - p[i+1]=c; - i--; - } - } - -void create_multiaction_list(TSTR_LIST *list,int sector,int side) - { - TMULTI_ACTION **p; - int count,i,j; - int list_count; - char s[200]; - - p=multi_actions[sector*4+side]; - if (*list==NULL) *list=create_list(10); - list_count=str_count(*list); - for(i=0;igeneral.cancel?'X':'_',p[i]->general.once?'1':'_',act_types[p[i]->general.action],p[i]->sound.flags+p[i]->sound.eflags*256); - str_add(list,s); - } - sprintf(s,""); - str_add(list,s); - str_delfreelines(list); - } - -void init_multiactions() - { - static char again=0; - int i,s,j; - TMULTI_ACTION **p; - - if (again) for(i=0;icall_draw=show_3dbox_draw; - } - -void tma_fireball(TMULTI_ACTION *p) - { - CTL3D *b1; - static int item=1,xpos=-32,ypos=250,zpos=160,speed=16; - char new; - TSTR_LIST ls_sorts=NULL; - - create_isort_list(&ls_sorts,-1); - def_dialoge(220,60,400,300,"Macro: Fireball"); - b1=def_border(5,WINCOLOR); - new=0; - if (p->fireball.item==0) - { - p->fireball.item=item; - p->fireball.xpos=xpos; - p->fireball.ypos=ypos; - p->fireball.zpos=zpos; - p->fireball.speed=speed; - new=1; - } - define(-1,5,20,1,1,0,label,"Vyst�elen� v�c:"); - define(-1,5,35,1,1,0,label,"Xpoz <-63,63>:"); - define(-1,5,50,1,1,0,label,"Ypoz <0,499>:"); - define(-1,5,65,1,1,0,label,"Zpoz <0,319>:"); - define(-1,5,80,1,1,0,label,"Rychlost:<1,128>"); - define(-1,5,100,120,120,1,show_3dbox); - add_ma_flags(100,5,100,p); - define(10,150,20,200,12,0,str_line,ls_sorts);property(b1,NULL,NULL,WINCOLOR); - c_default (p->fireball.item-1);on_enter(string_list_sup); - define(20,150,35,60,12,0,input_line,3,-63,63,"%3d");property(b1,NULL,NULL,WINCOLOR); - set_default(strs(p->fireball.xpos));on_exit(test_int); - define(30,150,50,60,12,0,input_line,3,0,499,"%3d");property(b1,NULL,NULL,WINCOLOR); - set_default(strs(p->fireball.ypos));on_exit(test_int); - define(40,150,65,60,12,0,input_line,3,0,319,"%3d");property(b1,NULL,NULL,WINCOLOR); - set_default(strs(p->fireball.zpos));on_exit(test_int); - define(50,150,80,60,12,0,input_line,3,0,319,"%3d");property(b1,NULL,NULL,WINCOLOR); - set_default(strs(p->fireball.speed));on_exit(test_int); - b1=def_border(1,0); - define(60,10,10,80,20,2,button,"Zru�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(70,10,35,80,20,2,button,"Ok");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - if (o_aktual->id==70) - { - p->fireball.xpos=vals(20); - p->fireball.ypos=vals(30); - p->fireball.zpos=vals(40); - p->fireball.speed=vals(50); - p->fireball.item=f_get_value(0,10)+1; - if (new) - { - xpos=vals(20); - ypos=vals(30); - zpos=vals(40); - speed=vals(50); - item=f_get_value(0,10)+1; - } - read_ma_flags(100,p); - } - close_current(); - release_list(ls_sorts); - } - -void tma_send(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Send Action"); - define(-1,5,22,1,1,0,label,"Sektor:"); - b1=def_border(5,WINCOLOR); - define(10,80,20,60,12,0,input_line,5,0,maplen,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->send_a.sector)); - define(-1,5,37,1,1,0,label,"St�na:"); - define(20,80,35,100,12,0,str_line,steny2);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->send_a.side); - define(-1,5,52,1,1,0,label,"Akce:"); - define(30,80,50,150,12,0,str_line,actions);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->send_a.s_action); - define(-1,5,67,1,1,0,label,"Zpo�d�n�:"); - define(40,80,65,60,12,0,input_line,5,0,255,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->send_a.delay)); - define(110,10,90,200,10,0,check_box,"Zm�na automapingu"); - define(120,10,102,200,10,0,check_box,"Zm�na pr�chodnosti(hr��)"); - define(130,10,114,200,10,0,check_box,"Zm�na pr�chodnosti(nestv�ra)"); - define(140,10,126,200,10,0,check_box,"Zm�na pr�chodnosti(v�c)"); - define(150,10,138,200,10,0,check_box,"Zm�na pr�chodnosti(zvuk)"); - add_ma_flags(200,220,20,q); - fill_bit_fields(0,110,q->send_a.change_bits,5); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->send_a.sector=vals(10); - q->send_a.side=f_get_value(0,20); - q->send_a.s_action=f_get_value(0,30); - q->send_a.delay=vals(40); - q->send_a.change_bits=get_bit_fields(0,110,5); - read_ma_flags(200,q); - } - close_current(); - } - -void tma_loadlev(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Load Level"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Sektor:"); - define(20,80,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->loadlev.start_pos)); - define(-1,5,37,1,1,0,label,"Sm�r:"); - define(30,80,35,100,12,0,str_line,steny2);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->loadlev.dir); - define(-1,5,52,1,1,0,label,"Jm�no:"); - define(10,80,50,100,12,0,input_line,12);property(b1,NULL,NULL,WINCOLOR);set_default(q->loadlev.name); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->loadlev.start_pos=vals(20); - q->loadlev.dir=f_get_value(0,30); - get_value(0,10,q->loadlev.name); - read_ma_flags(200,q); - } - close_current(); - } - -void tma_play_anim(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Play animation"); - b1=def_border(5,WINCOLOR); - define(-1,5,20,1,1,0,label,"Jm�no:"); - define(10,80,22,100,12,0,input_line,12);property(b1,NULL,NULL,WINCOLOR);set_default(q->loadlev.name); - define(20,20,40,100,10,0,check_box,"cls");c_default(q->loadlev.dir); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->loadlev.dir=f_get_value(0,20); - get_value(0,10,q->loadlev.name); - read_ma_flags(200,q); - } - close_current(); - } - -void tma_write_book(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - if (q->loadlev.name[0]==0) strcpy(q->loadlev.name,"KNIHA.TXT"); - def_dialoge(220,60,410,300,"Macro: Write to book"); - b1=def_border(5,WINCOLOR); - define(-1,5,20,1,1,0,label,"Kniha:"); - define(10,80,35,100,12,0,input_line,12);property(b1,NULL,NULL,WINCOLOR);set_default(q->loadlev.name); - define(-1,5,50,1,1,0,label,"��slo odstavce:"); - define(20,80,65,65,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->loadlev.start_pos)); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->loadlev.start_pos=vals(20); - get_value(0,10,q->loadlev.name); - read_ma_flags(200,q); - } - close_current(); - } - - -void tma_swapsectors(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Swap Sectors"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Sektor1:"); - define(20,80,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->swaps.sector1)); - define(-1,5,37,1,1,0,label,"Sektor2:"); - define(30,80,35,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->swaps.sector2)); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->swaps.sector1=vals(20); - q->swaps.sector2=vals(30); - read_ma_flags(200,q); - } - close_current(); - } - -void tma_experience(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Send Experience"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Zku�enost:"); - define(20,100,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm1)); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->twop.parm1=vals(20); - read_ma_flags(200,q); - } - close_current(); - } - - - -void tma_cancel_action(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Cancel Action"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Sektor:"); - define(20,80,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->cactn.sector)); - define(-1,5,37,1,1,0,label,"Sm�r:"); - define(30,80,35,100,12,0,str_line,steny2);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->cactn.dir); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->cactn.sector=vals(20); - q->cactn.dir=f_get_value(0,30); - read_ma_flags(200,q); - } - close_current(); - } - -void tma_sharema(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Share Multiaction"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Sektor:"); - define(20,80,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm1)); - define(-1,5,37,1,1,0,label,"Sm�r:"); - define(30,80,35,100,12,0,str_line,steny2);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->twop.parm2); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - define(-1,5,100,10,10,0,label,"Spust� MA program na jin�m"); - define(-1,5,110,10,10,0,label,"m�st�, tak jako by byl"); - define(-1,5,120,10,10,0,label,"definov�n zde."); - define(-1,5,140,10,10,0,label,"Vyu�it�:"); - define(-1,5,150,10,10,0,label,"Sd�len� jednoho program"); - define(-1,5,160,10,10,0,label,"Zm�na v m�st� sd�leni se pak"); - define(-1,5,170,10,10,0,label,"projev� na v�ech m�stech, kter�"); - define(-1,5,180,10,10,0,label,"program sd�lej�."); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->twop.parm1=vals(20); - q->twop.parm2=f_get_value(0,30); - read_ma_flags(200,q); - } - close_current(); - } - - -void tma_teleport_group(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Teleport Group"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Sektor:"); - define(20,80,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm1)); - define(-1,5,37,1,1,0,label,"Sm�r:"); - define(30,80,35,100,12,0,str_line,steny2);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->twop.parm2 & 3); - define(40,80,59,100,10,0,check_box,"Povol efekt");c_default(q->twop.parm2>>7); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->twop.parm1=vals(20); - q->twop.parm2=f_get_value(0,30)+(f_get_value(0,40)<<7); - read_ma_flags(200,q); - } - close_current(); - } - - -void tma_lock(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Lock"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"��slo kl��e:"); - define(10,120,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->lock.key_id)); - define(-1,5,37,1,1,0,label,"Urove�:"); - define(20,120,35,60,12,0,input_line,5,-1,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->lock.thieflevel)); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->lock.key_id=vals(10); - q->lock.thieflevel=vals(20); - read_ma_flags(200,q); - } - close_current(); - } - -void tma_specproc(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Call Specproc"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Jm�no spec:"); - define(10,120,20,95,12,0,str_line,wall_procs);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->lock.key_id); - define(-1,5,37,1,1,0,label,"Parametr:"); - define(20,120,35,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->lock.thieflevel)); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->twop.parm1=f_get_value(0,10); - q->twop.parm2=vals(20); - read_ma_flags(200,q); - } - close_current(); - } - -void tma_ifjump(TMULTI_ACTION *q,int linenum,TSTR_LIST ls) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: If Jump"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Podm�nka:"); - define(10,10,35,200,12,0,str_line,ls);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(abs(q->twop.parm1)-1); - define(-1,5,52,1,1,0,label,"��slo ��dku:"); - define(20,120,50,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm2+linenum)); - define(30,5,75,100,30,0,radio_butts,2,"Skok kdy� podm�nka plat�","Skok kdy� podm�nka neplat�"); - c_default(q->twop.parm1<0); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->twop.parm1=f_get_value(0,10)+1; - q->twop.parm2=vals(20)-linenum; - if (f_get_value(0,30)) q->twop.parm1=-q->twop.parm1; - read_ma_flags(200,q); - } - close_current(); - } - -void tma_randjmp(TMULTI_ACTION *q,int linenum) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: If Jump"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Pravd�podobnost: [%]"); - define(10,120,35,60,12,0,input_line,5,0,100,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm1)); - define(-1,5,52,1,1,0,label,"��slo ��dku:"); - define(20,120,50,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm2+linenum)); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->twop.parm1=vals(10); - q->twop.parm2=vals(20)-linenum; - read_ma_flags(200,q); - } - close_current(); - } - - -void tma_ifflagjump(TMULTI_ACTION *q,int linenum) - { - CTL3D *b1=NULL; - - if (q->twop.parm1==0) q->twop.parm1=1; - def_dialoge(220,60,410,300,"Macro: If flag Jump"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"��slo vlajky:"); - define(10,120,20,60,12,0,input_line,5,0,255,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(abs(q->twop.parm1)-1)); - define(-1,5,52,1,1,0,label,"��slo ��dku:"); - define(20,120,50,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm2+linenum)); - define(30,5,75,100,30,0,radio_butts,2,"Skok kdy� vlajka nastavena","Skok kdy� vlajka vynulov�na"); - c_default(q->twop.parm1<0); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->twop.parm1=vals(10)+1; - q->twop.parm2=vals(20)-linenum; - if (f_get_value(0,30)) q->twop.parm1=-q->twop.parm1; - read_ma_flags(200,q); - } - close_current(); - } - -void tma_setflag(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Change Flag"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"��slo vlajky:"); - define(10,120,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm1)); - define(-1,5,37,1,1,0,label,"Akce:"); - define(20,60,37,80,40,0,radio_butts,3,"Nulovat","Nastavit","Negovat");c_default(q->twop.parm2); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->twop.parm1=vals(10); - q->twop.parm2=f_get_value(0,20); - read_ma_flags(200,q); - } - close_current(); - } - - -void tma_wound(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: HIT Player"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Min:"); - define(10,120,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->wound.minor)); - define(-1,5,37,1,1,0,label,"Max:"); - define(20,120,35,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->wound.major)); - define(30,120,50,100,10,0,check_box,"Ohroz� skupinu");c_default(q->wound.pflags & 1); - define(40,120,70,60,80,0,radio_butts,7,"P��m� zran�n�","Hod na obranu","Ohe�","Voda","Zem�","Vzduch","Mysl"); - c_default(q->wound.pflags>>1); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->wound.minor=vals(10); - q->wound.major=vals(20); - q->wound.pflags=f_get_value(0,30)+(f_get_value(0,40)<<1); - read_ma_flags(200,q); - } - close_current(); - } - -void tma_cmoney(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Create Money"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Min:"); - define(10,120,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm1)); - define(-1,5,37,1,1,0,label,"Max:"); - define(20,120,35,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm2)); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - tady: - escape(); - if (o_aktual->id==OK_BUTT) - { - int a=vals(10),b=vals(20); - if (a>b) - { msg_box("Create Money",1,"Min mus� b�t men�� ne� Max","OK",NULL);goto tady;} - q->twop.parm1=a; - q->twop.parm2=b; - read_ma_flags(200,q); - } - close_current(); - } - -static void tma_gomonster(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: Send Monster To"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Odkud:"); - define(10,120,20,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm1)); - define(-1,5,37,1,1,0,label,"Kam:"); - define(20,120,35,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->twop.parm2)); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - tady: - escape(); - if (o_aktual->id==OK_BUTT) - { - int a=vals(10),b=vals(20); - if (a==b) - { msg_box("Send Monster To",1,"Ale tohle nesmysl!","OK",NULL);goto tady;} - q->twop.parm1=a; - q->twop.parm2=b; - read_ma_flags(200,q); - } - close_current(); - } - - -void tma_clock(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - char s[20]; - - def_dialoge(220,60,410,300,"Macro: Code Lock"); - b1=def_border(5,WINCOLOR); - define(-1,5,22,1,1,0,label,"Character:"); - define(10,100,20,10,12,0,input_line,2); - property(b1,NULL,NULL,WINCOLOR);s[0]=q->clock.znak;s[1]=0;set_default(s); - define(-1,5,37,1,1,0,label,"String:"); - define(20,80,35,100,12,0,input_line,8);strncpy(s,q->clock.string,8);s[8]=0;set_default(s); - property(b1,NULL,NULL,WINCOLOR); - define(-1,5,52,1,1,0,label,"��slo:"); - define(30,80,50,30,12,0,input_line,8,0,15," %02d");set_default(strs(q->clock.codenum)); - on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - get_value(0,10,s);q->clock.znak=s[0]; - get_value(0,20,s);strncpy(q->clock.string,s,8); - q->clock.codenum=vals(30); - read_ma_flags(200,q); - } - close_current(); - } - - - - -void tma_text(TMULTI_ACTION *q,char *filename) - { - CTL3D *b1; - int id; - TSTR_LIST ls; - int lcount; - - - ls=create_list(10); - if (id=load_string_list(&ls,filename)) - { - char s[300]; - if (id<0) sprintf(s,"Soubour %s chyb� nebo je po�kozen. Nelze editovat texty",filename); - else sprintf(s,"Chyba v souboru %s na ��dce %d",filename,id); - msg_box("Chyba!",'\x1',s,"Ok",NULL); - return; - } - lcount=str_count(ls); - if (q->text.textindex>=lcount) q->text.textindex=0; - while (q->text.textindextext.textindex]==NULL) - (q->text.textindex)++; - if (q->text.textindex>=lcount) - { - msg_box("Ozn�men�",'\x1',"��dn� texty nejsou k dispozici","Ok",NULL); - return; - } - b1=def_border(5,WINCOLOR); - def_dialoge(420,120,250,290,"Oprav akci"); - define(-1,5,20,1,1,0,label,"Text:"); - define(10,5,19,170,12,1,str_line,ls); - c_default(q->text.textindex); - on_enter(string_list_sup); - property(b1,NULL,flat_color(0x1f),WINCOLOR); - add_ma_flags(20,5,35,q); - b1=def_border(1,0); - define(OK_BUTT,5,5,60,20,3,button,"Ok");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(CANCEL_BUTT,5,5,60,20,2,button,"Zru�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - id=o_aktual->id; - if (id==CANCEL_BUTT) - { - release_list(ls); - close_current(); - return; - } - read_ma_flags(20,q); - q->text.textindex=f_get_value(0,10); - release_list(ls); - close_current(); - } - -void tma_dialog(TMULTI_ACTION *q) - { - CTL3D *b1; - int id; - int i; - - - i=pgf2name(q->text.textindex); - b1=def_border(5,WINCOLOR); - def_dialoge(420,120,250,290,"Oprav akci"); - define(-1,5,20,1,1,0,label,"Dialog:"); - define(10,5,19,170,12,1,str_line,dlg_names); - c_default(i); - on_enter(string_list_sup); - property(b1,NULL,flat_color(0x1f),WINCOLOR); - add_ma_flags(20,5,35,q); - b1=def_border(1,0); - define(OK_BUTT,5,5,60,20,3,button,"Ok");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(CANCEL_BUTT,5,5,60,20,2,button,"Zru�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - id=o_aktual->id; - if (id==CANCEL_BUTT) - { - close_current(); - return; - } - read_ma_flags(20,q); - q->text.textindex=dlg_pgfs[f_get_value(0,10)]; - close_current(); - } - -void tma_shop(TMULTI_ACTION *q) - { - CTL3D *b1; - int id; - int i; - TSTR_LIST ls=NULL; - - - re_build_shop_list(&ls,shop_list,max_shops); - for(i=0;itext.textindex) break; - b1=def_border(5,WINCOLOR); - def_dialoge(420,120,250,290,"Oprav akci"); - define(-1,5,20,1,1,0,label,"Obchod:"); - define(10,5,19,170,12,1,str_line,ls); - c_default(i); - on_enter(string_list_sup); - property(b1,NULL,flat_color(0x1f),WINCOLOR); - add_ma_flags(20,5,35,q); - b1=def_border(1,0); - define(OK_BUTT,5,5,60,20,3,button,"Ok");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(CANCEL_BUTT,5,5,60,20,2,button,"Zru�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - release_list(ls); - id=o_aktual->id; - if (id==CANCEL_BUTT) - { - close_current(); - return; - } - read_ma_flags(20,q); - q->text.textindex=shop_list[f_get_value(0,10)].shop_id; - close_current(); - } - - -void tma_create_dropi(TMULTI_ACTION *q,char *name) - { - CTL3D *b1; - int id; - TSTR_LIST ls=NULL; - int lcount; - int it; - - - create_isort_list(&ls,-1); - lcount=str_count(ls); - it=q->dropi.item; - if (it>=lcount) it=0; - b1=def_border(5,WINCOLOR); - def_dialoge(420,120,250,290,name); - define(-1,5,20,1,1,0,label,"V�c:"); - define(10,5,19,170,12,1,str_line,ls); - c_default(it); - on_enter(string_list_sup); - property(b1,NULL,flat_color(0x1f),WINCOLOR); - add_ma_flags(20,5,35,q); - b1=def_border(1,0); - define(OK_BUTT,5,5,60,20,3,button,"Ok");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(CANCEL_BUTT,5,5,60,20,2,button,"Zru�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - id=o_aktual->id; - release_list(ls); - if (id==CANCEL_BUTT) - { - close_current(); - return; - } - read_ma_flags(20,q); - q->dropi.item=f_get_value(0,10); - close_current(); - } - - -void tma_gen(TMULTI_ACTION *q,char *name) - { - CTL3D *b1; - int id; - - - b1=def_border(5,WINCOLOR); - def_dialoge(420,120,250,290,name); - add_ma_flags(20,5,35,q); - b1=def_border(1,0); - define(OK_BUTT,5,5,60,20,3,button,"Ok");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(CANCEL_BUTT,5,5,60,20,2,button,"Zru�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - id=o_aktual->id; - if (id==CANCEL_BUTT) - { - close_current(); - return; - } - read_ma_flags(20,q); - close_current(); - } - - -static void tma_unique_edit() - { - TITEM *it; - - it=(TITEM *)f_get_value(0,20); - item_edit(it); - } - -void tma_unique(TMULTI_ACTION *q,char edit) - { - CTL3D *b1; - - - if (!edit) - { - int i; - tma_create_dropi(q,"Zvol p�edlohu"); - i=q->dropi.item; - memcpy(&q->uniq.item,item_list+i,sizeof(q->uniq.item)); - } - def_dialoge(420,120,250,290,"Create Unique"); - b1=def_border(1,0); - define(10,10,19,230,15,1,button,"Oprav vlastnosti predmetu"); - on_control_change(tma_unique_edit); - property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(20,0,0,0,0,0,value_store,4);c_default((int)&q->uniq.item); - add_ma_flags(30,5,40,q); - define(OK_BUTT,5,5,60,20,3,button,"Zav��t");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - if (edit)escape();else tma_unique_edit(); - read_ma_flags(30,q); - close_current(); - } - -static char *global_events[MAGLOB_NEXTID]= -{ - "Pred opustenim mapy", - "Pred usnutim", - "Po probuzeni", - "Pred ulozenim", - "Po ulozeni", - "Pred carovanim", - "Po carovani", - "Otevreni mapy", - "Uzavreni mapy", - "Pred bitvou", - "Po bitve", - "Otevreni knihy", - "Zavreni knihy", - "Kazde kolo", - "Smrt postavy muze", - "Smrt postavy zeny", - "Smrt vsech postav", - "Zraneni muze", - "Zraneni zeny", - "Sebrani runy", - "Sebrani predmetu", - "Krok", - "Otoceni", - "Alarm", - "Magie ohne", - "Magie vody", - "Magie zeme", - "Magie vzduchu", - "Magie mysli", - "Pri kouzle 1 ", - "Pri kouzle 2 ", - "Pri kouzle 3 ", - "Pri kouzle 4 ", - "Pri kouzle 5 ", - "Pri kouzle 6 ", - "Pri kouzle 7 ", - "Pri kouzle 8 ", - "Pri kouzle 9 ", - "Casovac 1 ", - "Casovac 2 ", - "Casovac 3 ", - "Casovac 4 ", - "Melodie fletny 1 ", - "Melodie fletny 2 ", - "Melodie fletny 3 ", - "Melodie fletny 4 ", - "Melodie fletny 5 ", - "Melodie fletny 6 ", - "Melodie fletny 7 ", - "Melodie fletny 8 ", -}; - -void tma_globe(TMULTI_ACTION *q) - { - CTL3D *b1=NULL; - - int i,cnt=sizeof(global_events)/sizeof(global_events[0]); - TSTR_LIST lst=create_list(cnt); - for (i=0;iglobe.event); - define(6,290,20,60,12,0,input_line,10,-0x7FFFFFFF,0x7FFFFFFF,"%d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->globe.param)); - define(-1,5,52,1,1,0,label,"Sektor:"); - define(10,80,50,60,12,0,input_line,10,0,maplen,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->globe.sector)); - define(-1,5,37,1,1,0,label,"Pri vzniku udalosti poslat akci na:"); - define(-1,5,67,1,1,0,label,"St�na:"); - define(20,80,65,100,12,0,str_line,steny2);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->globe.side); - define(-1,5,80,100,10,0,label,"P�i volbe sektor 0 severni"); - define(-1,5,90,100,10,0,label,"se akce neposila"); - define(30,20,110,100,10,0,check_box,"Zakaz puvodni chovani");c_default(q->globe.cancel); - add_ma_flags(200,200,50,q); - fill_bit_fields(0,110,q->send_a.change_bits,5); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->globe.event=f_get_value(0,5); - q->globe.param=vals(6); - q->globe.sector=vals(10); - q->globe.side=f_get_value(0,20); - q->globe.cancel=get_bit_fields(0,30,1); - read_ma_flags(200,q); - } - close_current(); - release_list(lst); - } - -static char create_mode=0; - -void tma_sectnumjmp(TMULTI_ACTION *q,int linenum) - { - CTL3D *b1=NULL; - - def_dialoge(220,60,410,300,"Macro: If Jump"); - b1=def_border(5,WINCOLOR); - define(-1,5,52,1,1,0,label,"Sektor:"); - define(10,80,50,60,12,0,input_line,6,0,maplen,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->ifsec.sector)); - define(-1,5,67,1,1,0,label,"St�na:"); - define(20,80,65,100,12,0,str_line,steny2);on_enter(string_list_sup); - property(b1,NULL,NULL,WINCOLOR);c_default(q->ifsec.side); - define(-1,5,82,1,1,0,label,"��slo ��dku:"); - define(30,120,80,60,12,0,input_line,5,0,32767,"%5d");on_exit(test_int); - property(b1,NULL,NULL,WINCOLOR);set_default(strs(q->ifsec.line+linenum)); - define(40,5,120,120,30,0,radio_butts,2,"Skok kdy� podm�nka plat�","Skok kdy� podm�nka neplat�"); - c_default(q->ifsec.invert); - add_ma_flags(200,220,20,q); - b1=def_border(1,0); - define(OK_BUTT,5,30,80,20,2,button,"Ok");on_control_change(terminate_gui);property(b1,NULL,flat_color(0x1f),WINCOLOR); - define(CANCEL_BUTT,5,5,80,20,2,button,"Zru�it");on_control_change(terminate_gui);property(b1,NULL,flat_color(RGB555(15,0,0)),WINCOLOR); - redraw_window(); - escape(); - if (o_aktual->id==OK_BUTT) - { - q->ifsec.sector=vals(10); - q->ifsec.side=f_get_value(0,20); - q->ifsec.line=vals(30)-linenum; - q->ifsec.invert=f_get_value(0,40); - read_ma_flags(200,q); - } - close_current(); - } - -void edit_multiaction() - { - int sect,side,num; - TMULTI_ACTION *q; - TMULTI_ACTION **z; - TSTR_LIST ls=NULL; - - sect=vals(10); - side=f_get_value(0,20); - num=f_get_value(0,29); - z=multi_actions[sect*4+side];if (z==NULL) return; - if (num>=str_count((TSTR_LIST)(z))) return; - q=z[num];if (q==NULL) return; - switch (q->general.action) - { - case MA_GEN:return; - case MA_SOUND:tma_sound(q);break; - case MA_TEXTG:tma_text(q,TEXT_FILE);break; - case MA_TEXTL:tma_text(q,pripona(filename,TXT));break; - case MA_SENDA:tma_send(q);break; - case MA_FIREB:tma_fireball(q);break; - case MA_LOADL:tma_loadlev(q);break; - case MA_DROPI:tma_create_dropi(q,"Macro: Drop item");break; - case MA_DIALG:tma_dialog(q);break; - case MA_SSHOP:tma_shop(q);break; - case MA_CLOCK:tma_clock(q);break; - case MA_CACTN:tma_cancel_action(q);break; - case MA_LOCK:tma_lock(q);break; - case MA_SWAPS:tma_swapsectors(q);break; - case MA_WOUND:tma_wound(q);break; - case MA_IFJMP:tma_ifjump(q,num,side_flgs);break; - case MA_CALLS:tma_specproc(q);break; - case MA_PICKI: - case MA_HAVIT:create_isort_list(&ls,-1);tma_ifjump(q,num,ls);release_list(ls);break; - case MA_STORY:tma_text(q,pripona(filename,TXT));break; - case MA_IFACT:tma_ifjump(q,num,actions);break; - case MA_SNDEX:tma_experience(q);break; - case MA_TELEP:tma_teleport_group(q);break; - case MA_PLAYA:tma_play_anim(q);break; - case MA_CREAT:tma_create_dropi(q,"Macro: Create item");break; - case MA_ISFLG:tma_ifflagjump(q,num);break; - case MA_CHFLG:tma_setflag(q);break; - case MA_GUNIQ: - case MA_CUNIQ:tma_unique(q,q->uniq.item.jmeno[0]!=0);break; - case MA_MONEY:tma_cmoney(q);break; - case MA_WBOOK:tma_write_book(q);break; - case MA_RANDJ:tma_randjmp(q,num);break; - case MA_GOMOB:tma_gomonster(q);break; - case MA_SHRMA:if (create_mode) q->sound.flags=q->sound.eflags=0xFF;tma_sharema(q);break; - case MA_MUSIC:tma_text(q,pripona(filename,TXT));break; - case MA_GLOBE:tma_globe(q);break; - case MA_IFSEC:tma_sectnumjmp(q,num);break; - case MA_IFSTP:tma_ifjump(q,num,sector_types);break; - default:if (!create_mode) tma_gen(q,act_types[q->general.action]);break; - } - create_multiaction_list(&mul_list,sect,side); - send_message(E_GUI,29,E_CONTROL,1,mul_list); - create_mode=0; - } -void create_multiaction_invalid() - { - int i; - - i=f_get_value(0,10); - set_enable(0,OK_BUTT,i<(sizeof(action_sizes)/sizeof(int))); - } - - - -void create_multiaction_dialoge() - { - CTL3D *b1; - int id,i; - static TMULTI_ACTION x={0,0,0,0}; - int sect,side,before; - char s[30]; - static int act_default=1; - TSTR_LIST ls;char *c; - - sect=vals(10); - ls=(TSTR_LIST)getmem(_msize(act_types)); - memcpy(ls,act_types,_msize(act_types)); - sort_list(ls,-1); - c=act_types[act_default];id=str_count(act_types); - for(i=0;iid; - if (id==CANCEL_BUTT) - { - close_current(); - return; - } - read_ma_flags(20,&x); - c=ls[f_get_value(0,9)];id=str_count(act_types); - for(i=0;i0) c_set_value(0,29,num-1); - create_multiaction_list(&mul_list,sect,side); - send_message(E_GUI,29,E_CONTROL,1,mul_list); - } - -void mult_change_dir() - { - int i,s; - - - i=vals(10); - s=f_get_value(0,20); - create_multiaction_list(&mul_list,i,s); - send_message(E_GUI,29,E_CONTROL,1,mul_list); - } - -static TMULTI_ACTION **pamet=0; - -static void copy_and_paste() -{ - CTL3D *b1=NULL; - int id; - - int sect=vals(10); - int side=f_get_value(0,20); - - def_dialoge(400,100,200,320,"Pr�ce s pam�t�"); - b1=def_border(5,WINCOLOR); - define(10,10,20,180,20,0,button,"Kop�rovat do pam�ti");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(400,10,70,100,10,0,check_box,"Severn�");c_default(side==0); - define(410,10,85,100,10,0,check_box,"V�chodn�");c_default(side==1); - define(420,10,100,100,10,0,check_box,"Ji�n�");c_default(side==2); - define(430,10,115,100,10,0,check_box,"Z�padn�");c_default(side==3); - define(440,10,130,180,10,0,check_box,"Tam kde je prim. st�na");c_default(0); - define(445,10,150,180,12,0,str_line,side_names);property(b1,NULL,NULL,WINCOLOR);c_default(0); - on_enter(string_list_sup); - define(450,10,170,180,10,0,check_box,"Tam kde je sec. st�na");c_default(0); - define(455,10,190,180,12,0,str_line,side_names);property(b1,NULL,NULL,WINCOLOR);c_default(0); - on_enter(string_list_sup); - define(-1,10,210,180,12,0,label,"Jak vlo�it?"); - define(460,10,225,180,30,0,radio_butts,3, - "P�epsat v�e", - "P�epsat pou�it� ud�l.", - "P�idat na konec");c_default(1); - define(20,10,260,180,20,0,button,"Vlo�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - define(30,10,285,180,20,0,button,"Zru�it");property(b1,NULL,NULL,WINCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - id=o_aktual->id; - if (id==10) - { - TMULTI_ACTION **z=multi_actions[sect*4+side]; - int cnt=str_count((TSTR_LIST)z); - int i; - - if (pamet) release_list((TSTR_LIST) pamet); - pamet=(TMULTI_ACTION **)malloc(sizeof(*pamet)*cnt); - memset(pamet,0,sizeof(*pamet)*cnt); - for (i=0;isound.flags; - eflags|=pamet[i]->sound.eflags; - } - for (i=0;isound.flags&=~flags; - m->sound.eflags&=~eflags; - if (m->sound.flags==0 && m->sound.eflags==0) - { - free(m); - memcpy(z+i,z+i+1,sizeof(m)*(str_count((TSTR_LIST)z)-i-1)); - z[str_count((TSTR_LIST)z)-1]=0; - --i; - } - } - } - } - } - { - int sect=i; - TMULTI_ACTION **z=multi_actions[sect*4+j]; - int i,k=0; - int cnt=str_count((TSTR_LIST) z); - for (i=0;iminsizx=120; - waktual->minsizy=150; - define(-1,5,20,1,1,0,label,"Sektor"); - define(-1,5,32,1,1,0,label,"St�na"); - define(-1,5,44,1,1,0,label,"Program:"); - define(-1,3,1,10,10,2,resizer); - define(10,5,20,60,10,1,input_line,5,0,maplen-1,"%5d");set_default(strs(i));on_exit(test_int); - property(NULL,NULL,flat_color(0x1f),WINCOLOR); - define(20,5,32,60,10,1,str_line,steny2);c_default(0);on_enter(string_list_sup); - property(NULL,NULL,flat_color(0x1f),WINCOLOR);on_control_change(mult_change_dir); - create_multiaction_list(&mul_list,i,0); - define(29,5,55,95,180,0,listbox,mul_list,RGB555(31,31,0),0);c_default(0); - o_end->autoresizex=1; - o_end->autoresizey=1; - define(30,3,66,15,157,1,scroll_bar_v,0,10,1,SCROLLBARCOL); - property(NULL,NULL,NULL,WINCOLOR); - o_end->autoresizey=1; - define(31,3,50,15,15,1,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(32,3,60,15,15,2,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(40,5,5,50,20,3,button,"Vyma�");property(b1,NULL,NULL,WINCOLOR);on_control_change(delete_multiaction_ask); - define(50,60,5,50,20,3,button,"Edit");property(b1,NULL,NULL,WINCOLOR);on_control_change(edit_multiaction); - define(60,5,30,50,20,3,button,"Vlo�");property(b1,NULL,NULL,WINCOLOR);on_control_change(create_multiaction_dialoge); - define(70,60,30,50,20,3,button,"Pam�t");property(b1,NULL,NULL,WINCOLOR);on_control_change(copy_and_paste); - //define(70,60,30,50,20,3,button,"Po�ad�");property(b1,NULL,NULL,WINCOLOR); - redraw_window(); - } - select_window(wiz_tool_numb);close_current(); - } - -void update_multiactions() - { - void *wsave; - WINDOW *f; - char c[20]; - int i,s; - - wsave=waktual; - f=find_window(multiaction_win); - if (f==NULL) - { - open_multiaction_window(); - return; - } - for (i=1;igeneral.action]; - maxsize+=4; - } - } - maxsize+=4; - c=data=(char *)getmem(maxsize); - for(i=1;igeneral.action]; - memcpy(c,&siz,4);c+=4; - memcpy(c,*q,siz);c+=siz; - } - m=0; - memcpy(c,&m,4);c+=4; - } - } - memcpy(c,&m,4); - *blocksize=maxsize; - return (void *)data; - - } - -void load_macros(void *data) - { - long *c; - int sect,sid; - - c=data; - while (*c) - { - int i,siz,csiz; - TMULTI_ACTION a; - sect=*c>>2; - sid=*c & 3; - c++;i=0; - while (*c) - { - siz=*c++; - if (siz>sizeof(a)) csiz=sizeof(a);else csiz=siz; - memcpy(&a,c,csiz); - c=(long *)((char *)c+siz); - add_multiaction(sect,sid,i++,&a); - } - c++; - } - } diff --git a/MAPS/WIZ_TOOL.H b/MAPS/WIZ_TOOL.H deleted file mode 100644 index afeb736..0000000 --- a/MAPS/WIZ_TOOL.H +++ /dev/null @@ -1,5 +0,0 @@ -void open_wiz_tool(void); -void close_wiz_tool(void); -extern long wiz_tool_numb; -int count_of_sel(void); -void sample_editor(int sector,int side); diff --git a/PCX/3DMAN.C b/PCX/3DMAN.C deleted file mode 100644 index c7d0c84..0000000 --- a/PCX/3DMAN.C +++ /dev/null @@ -1,102 +0,0 @@ -#include "..\types.h" -#include "..\bgraph.h"; -#include "pcx.h" -#include -#include -#include -typedef char bitmap[640*480+512+6+16]; - -#define DATASTART (512+6) -#define DATASIZE (640*480) - -bitmap out; -bitmap in1; - -void clear_bm(bitmap *c) -{ -memset(((char *)c+DATASTART),0,DATASIZE); -} - -void adjust_point(int *x,int *y) - { - while (*x>=640) (*x)-=640; - while (*x<0) (*x)+=640; - while (*y>=480) (*y)-=480; - while (*y<0) (*y)+=480; - } - -void set_point(int x,int y,int c) - { - adjust_point(&x,&y); - out[DATASTART+x+y*640]=c; - } - -int get_point(int x,int y) - { - x=x*640/500;y=y*480/2000; - adjust_point(&x,&y); - return in1[DATASTART+x+y*640]; - } - -#define TXT_Y 480 -#define TXT_X 640 -#define OKO_Y 103 -#define OKO_X 250 -#define OKO_Z (-1100) -#define OSA_Y 1000 -#define OSA_X 500 - -int vypocet_z(int y) - { - return(OSA_Y-y)*(-OKO_Z)/(y-OKO_Y); - } - -int vypocet_x(int x,int z) - { - return(x-OKO_X)*z/(-OKO_Z)+x; - } - -void smycka() - { - int x1,y1,z1; - int x2; - - for(y1=351;y1>178;y1--) - { - z1=vypocet_z(y1); - for(x1=0;x1<639;x1++) - { - x2=vypocet_x(x1-70,z1); - set_point(x1,y1+9+16,get_point(x2,z1+350)); - } - /*if (!(y1 & 7))*/{put_picture(0,0,out);showview(0,0,0,0);} - - } - } - -initmode32b(); - - -void init() - { - initmode32b(); - memcpy(&out,&in1,sizeof(in1)); - clear_bm(out); - } - -main() - { - void *buffer; - - open_pcx("TEXTURA.PCX",A_8BIT,&buffer); - memcpy(&in1,buffer,sizeof(in1)); - free(buffer); - open_pcx("sit.PCX",A_8BIT,&buffer); - init(); - memcpy(&out,buffer,sizeof(out)); - put_picture(0,0,&out); - showview(0,0,0,0); - smycka(); - getchar(); - return 0; - } diff --git a/PCX/BOLDCZ.FON b/PCX/BOLDCZ.FON deleted file mode 100644 index 7a767fa819b672e6c3bed8e90cd5fe07be33e32c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8730 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 diff --git a/PCX/PCX.C b/PCX/PCX.C deleted file mode 100644 index 13c38b0..0000000 --- a/PCX/PCX.C +++ /dev/null @@ -1,180 +0,0 @@ -#include -#include -#include -#include -/*#include "..\types.h"*/ -#include "pcx.h" -#include -/*#include "..\bgraph.h"*/ - - -void decomprimate_line_256(char *src,char *trg,int linelen,int *srcstep) - { - char *srcsave; - - srcsave=src; - while (linelen--) - { - if (*src>=0xc0) - { - int i; - i=*src++ & 0x3f;memset(trg,*src++,i); - trg+=i;linelen-=i-1; - } - else - *trg++=*src++; - } - *srcstep=src-srcsave; - } -void decomprimate_line_hi(char *src,unsigned short *trg,unsigned short *paleta,int linelen,int *srcstep) - { - char *srcsave; - - srcsave=src; - while (linelen--) - { - if (*src>=0xc0) - { - int i,j; - i=(*src++) & 0x3f; - for (j=0;j>3; - g=(tg+(*(bt++)-tg)*(5-j)/5)>>3; - b=(tb+(*(bt++)-tb)*(5-j)/5)>>3; - hi=(r<<10)+(g<<5)+b; - pal2[j][i]=hi; - } - while (++i & 0xff); - } - } - - -int load_pcx(char *pcx,long fsize,int conv_type,char **buffer, ... ) - //dale nasleduji int hodnoty poctu prechodu a R,G,B barvy - { - char *paleta1; - unsigned short paleta2[256]; - char *ptr1;unsigned short *ptr2; - char *ptr3; - int i; - PCXHEADER pcxdata; - int xsize,ysize; - - - paleta1=pcx+fsize-768; - ptr1=paleta1;ptr2=paleta2; - for (i=0;i<256;i++) - { - *ptr2=*(ptr1++)>>3; - *ptr2=(*ptr2<<5)+(*(ptr1++)>>3); - *ptr2=(*ptr2<<6)+(*(ptr1++)>>3); - ptr2++; - } - - memcpy(&pcxdata,pcx,sizeof(pcxdata)); - xsize=pcxdata.xmax-pcxdata.xmin+1; - ysize=pcxdata.ymax-pcxdata.ymin+1; - switch (conv_type) - { - case A_8BIT: *buffer=(char *)getmem(xsize*ysize+512+6+16);break; - case A_15BIT: *buffer=(char *)getmem(xsize*ysize*2+6+16);break; - case A_FADE_PAL: *buffer=(char *)getmem(xsize*ysize+512*5+6+16);break; - default: return -2; //invalid type specificied - } - ptr1=*buffer; - *(unsigned short *)ptr1++=xsize;ptr1++; - *(unsigned short *)ptr1++=ysize;ptr1++; - *(unsigned short *)ptr1++=conv_type;ptr1++; - pcx+=sizeof(pcxdata);ptr3=pcx; - if (conv_type==A_8BIT) - { - memcpy(ptr1,paleta2,512); - ptr1+=512; - } - if (conv_type==A_FADE_PAL) - { - int *i,tr,tg,tb; - - i=(int *)&buffer;i++; - tr=*i++;tg=*i++;tb=*i++; - - palette_shadow(paleta1,(unsigned short *)ptr1,tr,tg,tb); - ptr1+=5*512; - } - ysize++; - while (--ysize) - { - int step; - if (conv_type==15) - { - decomprimate_line_hi(ptr3,(unsigned short *)ptr1,paleta2,pcxdata.bytesperline,&step); - ptr1+=2*xsize; - } - else - { - decomprimate_line_256(ptr3,ptr1,pcxdata.bytesperline,&step); - ptr1+=xsize; - } - ptr3+=step; - } - return 0; - } - -int open_pcx(char *filename,int type,char **buffer,...) - { - FILE *pcx; - char *src; - long fsize; - - pcx=fopen(filename,"rb"); - if (pcx==NULL) return -1; - fseek(pcx,0,SEEK_END); - fsize=ftell(pcx); - fseek(pcx,0,SEEK_SET); - src=(char *)getmem(fsize); - fread(src,1,fsize,pcx); - fsize=load_pcx(src,fsize,type,buffer,*((int *)&buffer+1),*((int *)&buffer+2),*((int *)&buffer+3)); - fclose(pcx); - free(src); - return fsize; - } - -/*void initmode32b(); - -main() - { - char *buf; - - initmode32b(); - open_pcx("DESK.pcx",A_8BIT,&buf,0,0,0); - put_picture(0,480-102,buf); - showview(0,0,0,0); - getchar(); - return 0; - } - - -*/ - diff --git a/PCX/PCX.H b/PCX/PCX.H deleted file mode 100644 index 7000c99..0000000 --- a/PCX/PCX.H +++ /dev/null @@ -1,25 +0,0 @@ -#define A_8BIT 8 -#define A_15BIT 15 -#define A_FADE_PAL 256*8 - -typedef struct pcxrecord - { - unsigned short id; - char encoding; - char bitperpixel; - unsigned short xmin,ymin,xmax,ymax; - unsigned short hdpi,vdpi; - char colormap[48]; - char reserved; - char mplanes; - unsigned short bytesperline; - unsigned short paleteinfo; - unsigned short hscreen,vscreen; - char filler[54]; - }PCXHEADER; - - - -int load_pcx(char *pcx,long fsize,int conv_type,char **buffer, ... ); -int open_pcx(char *filename,int type,char **buffer,...); - diff --git a/PCX/PCXTST.C b/PCX/PCXTST.C deleted file mode 100644 index eb06b23..0000000 --- a/PCX/PCXTST.C +++ /dev/null @@ -1,173 +0,0 @@ -#include "..\types.h" -#include -#include -#include -#include "..\bgraph.h" -#define A_8BIT 8 -#define A_15BIT 15 -#define A_FADE_PAL 256*8 - -typedef struct pcxrecord - { - unsigned short id; - char encoding; - char bitperpixel; - unsigned short xmin,ymin,xmax,ymax; - unsigned short hdpi,vdpi; - char colormap[48]; - char reserved; - char mplanes; - unsigned short bytesperline; - unsigned short paleteinfo; - unsigned short hscreen,vscreen; - char filler[54]; - }PCXHEADER; - - - -void decomprimate_line_256(char *src,char *trg,int linelen,int *srcstep) - { - char *srcsave; - - srcsave=src; - while (linelen--) - { - if (*src>=0xc0) - { - int i; - i=*src++ & 0x3f;memset(trg,*src++,i); - trg+=i;linelen-=i-1; - } - else - *trg++=*src++; - } - *srcstep=src-srcsave; - } -void decomprimate_line_hi(char *src,unsigned short *trg,unsigned short *paleta,int linelen,int *srcstep) - { - char *srcsave; - - srcsave=src; - while (linelen--) - { - if (*src>=0xc0) - { - int i,j; - i=(*src++) & 0x3f; - for (j=0;j>3; - *ptr2=(*ptr2<<5)+(*(ptr1++)>>3); - *ptr2=(*ptr2<<5)+(*(ptr1++)>>3); - ptr2++; - } - - fseek(pcx,curptr,SEEK_SET); - fread(&pcxdata,sizeof(pcxdata),1,pcx); - xsize=pcxdata.xmax-pcxdata.xmin+1; - ysize=pcxdata.ymax-pcxdata.ymin+1; - switch (conv_type) - { - case A_8BIT: *buffer=(char *)malloc(xsize*ysize+512+6+16);break; - case A_15BIT: *buffer=(char *)malloc(xsize*ysize*2+6+16);break; - case A_FADE_PAL: *buffer=(char *)malloc(xsize*ysize+512*5+6+16);break; - default: return -2; //invalid type specificied - } - ptr1=*buffer; - *(word *)ptr1++=xsize;ptr1++; - *(word *)ptr1++=ysize;ptr1++; - *(word *)ptr1++=conv_type;ptr1++; - src_buff=(char *)malloc(fsize);ptr3=src_buff; - fread(src_buff,fsize-768-sizeof(pcxdata),1,pcx); - if (conv_type==A_8BIT) - { - memcpy(ptr1,paleta2,512); - ptr1+=512; - } - while (--ysize) - { - int step; - if (conv_type==15) - { - decomprimate_line_hi(ptr3,(word *)ptr1,paleta2,pcxdata.bytesperline,&step); - ptr1+=2*xsize; - } - else - { - decomprimate_line_256(ptr3,ptr1,pcxdata.bytesperline,&step); - ptr1+=xsize; - } - ptr3+=step; - } - free(src_buff); - return 0; - } - -int open_pcx(char *filename,int type,char **buffer) - { - FILE *pcx; - long fsize; - - pcx=fopen(filename,"rb"); - if (pcx==NULL) return -1; - fseek(pcx,0,SEEK_END); - fsize=ftell(pcx); - fseek(pcx,0,SEEK_SET); - fsize=load_pcx(pcx,fsize,type,buffer); - fclose(pcx); - return fsize; - } - -void initmode32b(); - -main() - { - char *buf; - - initmode32b(); - getchar(); - //open_pcx("d:\\tycoon2\\scr2.pcx",A_8BIT,&buf); - //put_picture(0,0,buf);free(buf); - open_pcx("desk.pcx",A_15BIT,&buf); - put_picture(0,480-101,buf);free(buf); - open_pcx("topbar.pcx",A_15BIT,&buf); - put_picture(0,0,buf);free(buf); - - showview(0,0,0,0); - getchar(); - return 0; - } - - - - - diff --git a/PCX/PODLAHY.C b/PCX/PODLAHY.C deleted file mode 100644 index a7321b5..0000000 --- a/PCX/PODLAHY.C +++ /dev/null @@ -1,330 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "..\game\engine1.h" -#include "pcx.h" - -void calc_points(); -void create_tables(); - -char filename1[128]; -char filename2[128]; - -char buffer[640*480+6+512]; - -char *obr1,*obr2; - -typedef struct tbarva - { - char r,g,b; - }TBARVA; - -TBARVA shadow; -int shadow_max; - -struct tbarva palette[256]; - - -char datapath[]=""; -extern struct all_view showtabs; -extern t_points viewport_geometry; - -void do_events() - { - - } - -int get_shd_color(char src,int cur) - { - struct tbarva what; - int c,d,m,p,i,ml; - - m=256*256*256; - c=0;d=0; - what=palette[src]; - cur=shadow_max-cur; - cur=(int)(shadow_max*sqrt((float)cur/(float)shadow_max)); - what.r=(shadow.r+(what.r-shadow.r)*cur/shadow_max); - what.g=(shadow.g+(what.g-shadow.g)*cur/shadow_max); - what.b=(shadow.b+(what.b-shadow.b)*cur/shadow_max); - for(i=0;i<256;i++) - { - p=(what.r-palette[i].r)*(what.r-palette[i].r)+ - (what.g-palette[i].g)*(what.g-palette[i].g)+ - (what.b-palette[i].b)*(what.b-palette[i].b); - if (p=1000) xp-=1000; - while (xp<0) xp+=1000; - if ((xp>=500)^(swap)) srcp=srcadr2+(xp % 500); else srcp=srcadr1+(xp%500); - if (table[*srcp]==0xffff) table[*srcp]=get_shd_color(*srcp,yline); - *point=table[*srcp]&0xff; - } - return showtabs.f_table[2][yline].counter; - } - -void draw_it_all_f() - { - int i,m,y,m2,s; - - y=0;s=0; - m2=(360-MIDDLE_Y)-viewport_geometry[0][0][VIEW3D_Z].y; - shadow_max=m2; - for (i=0;i=1000) xp-=1000; - while (xp<0) xp+=1000; - if ((xp>=500)^(swap)) srcp=srcadr2+(xp % 500); else srcp=srcadr1+(xp % 500); - if (table[*srcp]==0xffff) table[*srcp]=get_shd_color(*srcp,yline); - *point=(table[*srcp]&0xff); - } - return showtabs.c_table[2][yline].counter; - } - -void draw_it_all_c() - { - int i,m,y,m2,s; - - y=0;s=0; - m2=MIDDLE_Y+viewport_geometry[0][1][VIEW3D_Z].y; - shadow_max=m2; - for (i=0;i \n" - "\n" - " \n" - " soubory s texturami ve formatu pcx. Textura musi mit velikost 500x320\n\n" - " \n" - " Cisla predstavujici slozky barvy, jenz se pouzije ke generovani mlhy,\n" - " nebo ke stmavovani. Jednotlive hodnoty jsou v rozsahu <0-255>\n" - "\n" - "Vysledne soubory se ulozi do aktualniho adresare pod jmeny:\n" - " PODLAHA.PCX - soubor s podlahou\n" - " STROP.PCX - soubor se stropem\n" - "\n" - "Pozn.: Prestoze se jedna o korektni format PCX, doporucuji oba soubory \n" - " natahnout do Autodesk Animatora a znovu v tomto formatu ulozit\n" - " Stavalo se mi, ze se muj PCX dekomprimator s timto vygenerovanym souborem\n" - " hroutil.\n" - ); - exit(0); - } - - -main(int argv,char *argc[]) - { - int r,g,b,i; - char rv[10],gv[10],bv[10]; - if (argv!=6) help(); - strass(filename1,argc[1],128); - strass(filename2,argc[2],128); - strass(rv,argc[3],10); - strass(gv,argc[4],10); - strass(bv,argc[5],10); - sscanf(rv,"%d",&r); - sscanf(gv,"%d",&g); - sscanf(bv,"%d",&b); - if (r<0 || r>255 || g<0 || g>255 || b<0 || b>255 ) - { - printf("Hodnoty by mely byt rozsahu <0-255> \n"); - abort(); - } - shadow.r=r;shadow.g=g;shadow.b=b; - calc_points(); - create_tables(); - read_palette(filename1,&palette); - shadow_max=100; - memset(buffer,get_shd_color(0,100),640*480+6+512); - *(word *)buffer=640; - *((word *)buffer+1)=480; - *((word *)buffer+2)=8; - if (open_pcx(filename1,A_8BIT,&obr1) ) - { - printf("Nemohu najit %s.\n",filename1); - abort(); - } - if (open_pcx(filename2,A_8BIT,&obr2) ) - { - printf("Nemohu najit %s.\n",filename2); - abort(); - } - memcpy(buffer+6,obr1+6,512); - draw_it_all_f(); - draw_it_all_c(); - initmode32(); - for(i=0;i>3)<<10)+((g>>3)<<5)+(b>>3); - put_picture(0,0,buffer); - showview(0,0,0,0); - getchar(); - closemode(); - save_pcx("STROP.PCX",0,0,639,92); - save_pcx("PODLAHA.PCX",0,360-198,639,360); - printf("Vytvoreny soubory STROP.PCX a PODLAHA.PCX\n"); - - } - diff --git a/UTILS/ITEMLIST.C b/UTILS/ITEMLIST.C deleted file mode 100644 index c06e6b0..0000000 --- a/UTILS/ITEMLIST.C +++ /dev/null @@ -1,328 +0,0 @@ -#include -#include -#include -#include -#include - -#define SV_ITLIST 0x8001 -#define SV_SNDLIST 0x8002 -#define SV_END 0x8000 - - -typedef struct titem - { - char jmeno[32]; //32 Jmeno predmetu - char popis[32]; //64 - short zmeny[24]; //112 Tabulka, jakych zmen ma na hracovy vlastnosti - short podminky[4];//120 Tabulka, jake vlastnosti musi mit hrac k pouziti predmetu - short hmotnost,nosnost,druh; //126 druh = Typ predmetu - short umisteni; //128 Kam se predmet umisti? - word flags; //130 ruzne vlajky - short spell,magie,sound_handle;//136 specialni kouzla / rukojet zvuku - short use_event; //140 specialni udalost - unsigned short ikona,vzhled; //144 ikony a vzhled - short user_value; //146 uzivatelska hodnota - short keynum; //148 cislo klice - short polohy[2][2]; //156 souradnice poloh pro zobrazeni v inv - char typ_zbrane; //160 Typ zbrane - char unused; - short sound; //cislo zvuku - short v_letu[16]; //192 - int cena; - char weapon_attack; //relativni handle k souboru s animaci utok - char hitpos; //pozice zasahu animace - short rezerva[13]; //224 rezervovane - }TITEM; - -#define isweapon(p) ((p)>=1 && (p)<=3) - -char sekceid[]=""; -TITEM *itlist; -int item_count; -char *sound; -char listsize; -int pagelen; - -char pr_name=0,pr_type=0,pr_sound=0,pr_umist=0,pr_zbran=0,pr_hmotn=0,pr_popis=0; -char grp_sort=0,pr_number=0,pr_cena=0; - -char _typy_zbrani[]= - "Me�\0" - "Sekera\0" - "Kladivo\0" - "H�l\0" - "D�ka\0" - "St�eln�\0" - "Ostatn�\0"; - -char _typy_veci[]= - "Nespecifikov�no\0" - "Zbra� tv��� v tv��\0" - "Vrhac� zbra�\0" - "St�eln� zbra�\0" - "Zbroj\0" - "Svitek / H�lka\0" - "Lektvar\0" - "Voda\0" - "J�dlo\0" - "Speci�ln�\0" - "Runa\0" - "Pen�ze\0" - "Svitek s textem\0" - "Prach\0" - "Ostatn�\0"; - -char _umisteni_veci[]= - "Nikam\0" - "Zavazadlo\0" - "Na t�lo (naho�e)\0" - "Na t�lo (dole)\0" - "Na hlavu\0" - "Na nohy\0" - "Kutna\0" - "Na krk\0" - "Do ruky\0" - "Obouru�\0" - "Prsten\0" - "��p\0"; - - -long load_section(FILE *f,void **section, int *sct_type,long *sect_size) -// - { - long s; - char c[20]; - - *section=NULL; - fread(c,1,sizeof(sekceid),f); - if (strcmp(c,sekceid)) return -1; - fread(sct_type,1,sizeof(*sct_type),f); - fread(sect_size,1,sizeof(*sect_size),f); - fread(&s,1,sizeof(s),f); - *section=malloc(*sect_size); - s=fread(*section,1,*sect_size,f); - return s; - } - -void load_items_dat(char *name) - { - FILE *f; - void *temp; - int type; - long size; - - f=fopen(name,"rb"); - if (f==NULL) - { - printf("Nemohu otevrit soubor %s\n",name); - exit(1); - } - do - { - load_section(f,&temp,&type,&size); - switch (type) - { - case SV_ITLIST:itlist=temp;item_count=size/sizeof(TITEM);break; - case SV_SNDLIST:sound=temp;listsize=size;break; - - case SV_END: - default: free(temp);break; - } - } - while (type!=SV_END); - fclose(f); - } - -char *find_str(char *sound,int number,long listsize) - { - char *c; - static char none[]=""; - static char unknown[]=""; - - c=sound; - if (!number) return none; - number--; - while (c-soundjmeno); - if (pr_type) printf("%-20s�",find_str(_typy_veci,t->druh+1,sizeof(_typy_veci))); - if (pr_umist) printf("%-20s�",find_str(_umisteni_veci,t->umisteni+1,sizeof(_umisteni_veci))); - if (pr_zbran) printf("%-10s�",isweapon(t->druh)?find_str(_typy_zbrani,t->typ_zbrane+1,sizeof(_typy_zbrani)):" "); - if (pr_hmotn) printf("%6d�",t->hmotnost); - if (pr_cena) printf("%6d�",t->cena); - if (pr_sound) printf("%-12s�",find_str(sound,t->sound,listsize)); - if (pr_popis) printf("%s",t->popis); - puts(""); - } - -void print_head() - { - int lines=0; - if (pr_number) printf("ID "),lines+=4; - if (pr_name) printf("%-32s ","Jmeno veci"),lines+=33; - if (pr_type) printf("%-20s ","Typ veci"),lines+=21; - if (pr_umist) printf("%-20s ","Umisteni"),lines+=21; - if (pr_zbran) printf("%-10s ","Zbran"),lines+=11; - if (pr_hmotn) printf("%-6s ","Vaha"),lines+=7; - if (pr_cena) printf("%-6s ","Cena"),lines+=7; - if (pr_sound) printf("%-12s ","Zvuk"),lines+=13; - if (pr_popis) printf("%s","Popis"),lines+=6; - puts(""); - if (lines) while (lines--) putc(196,stdout); - puts(""); - } - -void endpage(int i) - { - if (pagelen && i%pagelen==0) - { - if (i) putc(12,stdout); - print_head(); - } - } - -void counting_sort(TITEM *sr,TITEM *tg,int count,int *idnums) - { - int tridy[30][20]; - int i,j,c; - TITEM *s; - - memset(tridy,0,sizeof(tridy)); - for(i=0,s=sr;idruh][isweapon(s->druh)?s->typ_zbrane:0]++; - c=0; - for(i=0;i<30;i++) - for(j=0;j<20;j++) - { - register int d; - d=tridy[i][j]; - tridy[i][j]=c; - c+=d; - } - for(i=0,s=sr;idruh][isweapon(s->druh)?s->typ_zbrane:0]++; - tg[c]=*s; - idnums[c]=i; - } - } - -void print_list() - { - int i; - TITEM *t; - - if (!pagelen) print_head(); - if (!grp_sort) - { - for(i=0,t=itlist;i" - VALUE "FileDescription", "TODO: " - VALUE "FileVersion", "1.0.0.1" - VALUE "InternalName", "Podlahar.exe" - VALUE "LegalCopyright", "TODO: (c) . All rights reserved." - VALUE "OriginalFilename","Podlahar.exe" - VALUE "ProductName", "TODO: " - VALUE "ProductVersion", "1.0.0.1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0409, 1252 - END -END - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END - IDD_PODLAHAR_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 193 - END -END -#endif // APSTUDIO_INVOKED - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_ABOUTBOX "&About Podlahar..." -END - - -#endif -#ifdef _UNICODE -IDR_MANIFEST RT_MANIFEST "res\\Podlahar.manifest" -#endif - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE 9, 1 -#pragma code_page(1252) -#include "res\\Podlahar.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/UTILS/Podlahar/Podlahar.vcproj b/UTILS/Podlahar/Podlahar.vcproj deleted file mode 100644 index c69a540..0000000 --- a/UTILS/Podlahar/Podlahar.vcproj +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/UTILS/Podlahar/PodlaharDlg.cpp b/UTILS/Podlahar/PodlaharDlg.cpp deleted file mode 100644 index 3190b1f..0000000 --- a/UTILS/Podlahar/PodlaharDlg.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// PodlaharDlg.cpp : implementation file -// - -#include "stdafx.h" -#include "Podlahar.h" -#include "PodlaharDlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#endif - - -// CAboutDlg dialog used for App About - -class CAboutDlg : public CDialog -{ -public: - CAboutDlg(); - -// Dialog Data - enum { IDD = IDD_ABOUTBOX }; - - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - -// Implementation -protected: - DECLARE_MESSAGE_MAP() -}; - -CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) -{ -} - -void CAboutDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); -} - -BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) -END_MESSAGE_MAP() - - -// CPodlaharDlg dialog - -BEGIN_DHTML_EVENT_MAP(CPodlaharDlg) - DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnButtonOK) - DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnButtonCancel) -END_DHTML_EVENT_MAP() - - -CPodlaharDlg::CPodlaharDlg(CWnd* pParent /*=NULL*/) - : CDHtmlDialog(CPodlaharDlg::IDD, CPodlaharDlg::IDH, pParent) -{ - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); -} - -void CPodlaharDlg::DoDataExchange(CDataExchange* pDX) -{ - CDHtmlDialog::DoDataExchange(pDX); -} - -BEGIN_MESSAGE_MAP(CPodlaharDlg, CDHtmlDialog) - ON_WM_SYSCOMMAND() - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - - -// CPodlaharDlg message handlers - -BOOL CPodlaharDlg::OnInitDialog() -{ - CDHtmlDialog::OnInitDialog(); - - // Add "About..." menu item to system menu. - - // IDM_ABOUTBOX must be in the system command range. - ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); - ASSERT(IDM_ABOUTBOX < 0xF000); - - CMenu* pSysMenu = GetSystemMenu(FALSE); - if (pSysMenu != NULL) - { - CString strAboutMenu; - strAboutMenu.LoadString(IDS_ABOUTBOX); - if (!strAboutMenu.IsEmpty()) - { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); - } - } - - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon - - // TODO: Add extra initialization here - - return TRUE; // return TRUE unless you set the focus to a control -} - -void CPodlaharDlg::OnSysCommand(UINT nID, LPARAM lParam) -{ - if ((nID & 0xFFF0) == IDM_ABOUTBOX) - { - CAboutDlg dlgAbout; - dlgAbout.DoModal(); - } - else - { - CDHtmlDialog::OnSysCommand(nID, lParam); - } -} - -// If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. - -void CPodlaharDlg::OnPaint() -{ - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDHtmlDialog::OnPaint(); - } -} - -// The system calls this function to obtain the cursor to display while the user drags -// the minimized window. -HCURSOR CPodlaharDlg::OnQueryDragIcon() -{ - return static_cast(m_hIcon); -} -HRESULT CPodlaharDlg::OnButtonOK(IHTMLElement* /*pElement*/) -{ - OnOK(); - return S_OK; -} - -HRESULT CPodlaharDlg::OnButtonCancel(IHTMLElement* /*pElement*/) -{ - OnCancel(); - return S_OK; -} diff --git a/UTILS/Podlahar/PodlaharDlg.h b/UTILS/Podlahar/PodlaharDlg.h deleted file mode 100644 index c2dd19c..0000000 --- a/UTILS/Podlahar/PodlaharDlg.h +++ /dev/null @@ -1,34 +0,0 @@ -// PodlaharDlg.h : header file -// - -#pragma once - - -// CPodlaharDlg dialog -class CPodlaharDlg : public CDHtmlDialog -{ -// Construction -public: - CPodlaharDlg(CWnd* pParent = NULL); // standard constructor - -// Dialog Data - enum { IDD = IDD_PODLAHAR_DIALOG, IDH = IDR_HTML_PODLAHAR_DIALOG }; - - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - HRESULT OnButtonOK(IHTMLElement *pElement); - HRESULT OnButtonCancel(IHTMLElement *pElement); - -// Implementation -protected: - HICON m_hIcon; - - // Generated message map functions - virtual BOOL OnInitDialog(); - afx_msg void OnSysCommand(UINT nID, LPARAM lParam); - afx_msg void OnPaint(); - afx_msg HCURSOR OnQueryDragIcon(); - DECLARE_MESSAGE_MAP() - DECLARE_DHTML_EVENT_MAP() -}; diff --git a/UTILS/Podlahar/Resource.h b/UTILS/Podlahar/Resource.h deleted file mode 100644 index fe47f49..0000000 --- a/UTILS/Podlahar/Resource.h +++ /dev/null @@ -1,23 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Podlahar.RC -// -#define IDR_MAINFRAME 128 -#define IDM_ABOUTBOX 0x0010 -#define IDD_ABOUTBOX 100 -#define IDS_ABOUTBOX 101 -#define IDD_PODLAHAR_DIALOG 102 -#define IDR_HTML_PODLAHAR_DIALOG 104 -#define IDR_MANIFEST CREATEPROCESS_MANIFEST_RESOURCE_ID - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS - -#define _APS_NEXT_RESOURCE_VALUE 129 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 32771 -#endif -#endif diff --git a/UTILS/Podlahar/res/Podlahar.ico b/UTILS/Podlahar/res/Podlahar.ico deleted file mode 100644 index 8a84ca3d34597ada57e4c79ef62b28cf07b5ed9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21630 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 V7_3;)FxY%t!w{8u!r68W{|isv(C`2N diff --git a/UTILS/Podlahar/res/Podlahar.rc2 b/UTILS/Podlahar/res/Podlahar.rc2 deleted file mode 100644 index 426f164..0000000 --- a/UTILS/Podlahar/res/Podlahar.rc2 +++ /dev/null @@ -1,13 +0,0 @@ -// -// Podlahar.RC2 - resources Microsoft Visual C++ does not edit directly -// - -#ifdef APSTUDIO_INVOKED -#error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/UTILS/Podlahar/stdafx.cpp b/UTILS/Podlahar/stdafx.cpp deleted file mode 100644 index 58f9651..0000000 --- a/UTILS/Podlahar/stdafx.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// Podlahar.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - - diff --git a/UTILS/Podlahar/stdafx.h b/UTILS/Podlahar/stdafx.h deleted file mode 100644 index eabf8b7..0000000 --- a/UTILS/Podlahar/stdafx.h +++ /dev/null @@ -1,43 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#pragma once - -#ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif - -// Modify the following defines if you have to target a platform prior to the ones specified below. -// Refer to MSDN for the latest info on corresponding values for different platforms. -#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later. -#define WINVER 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. -#endif - -#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later. -#define _WIN32_WINNT 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. -#endif - -#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. -#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. -#endif - -#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later. -#define _WIN32_IE 0x0400 // Change this to the appropriate value to target IE 5.0 or later. -#endif - -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit - -// turns off MFC's hiding of some common and often safely ignored warning messages -#define _AFX_ALL_WARNINGS - -#include // MFC core and standard components -#include // MFC extensions -#include // MFC Automation classes - -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - -#include // HTML Dialogs diff --git a/VIDEO/ANIPACK.ASM b/VIDEO/ANIPACK.ASM deleted file mode 100644 index bc41e1f..0000000 --- a/VIDEO/ANIPACK.ASM +++ /dev/null @@ -1,318 +0,0 @@ -.model small -.386 -;16 bit line (de)comprimator -; -DGROUP group _DATA - -extern _anim_line_len:dword - - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - - - -save_line1 macro reg1,reg2 - shr reg1,8 - rcr reg2,1 - shr reg1,8 - rcr reg2,1 - shr reg1,8 - rcr reg2,1 - shr reg1,8 - rcr reg2,1 -endm - -save_linex macro reg1,reg2,rols - shrd reg2,reg1,rols - shr reg1,8 - shrd reg2,reg1,rols - shr reg1,8 - shrd reg2,reg1,rols - shr reg1,8 - shrd reg2,reg1,rols -endm - - -public save_1bit_ ;ESI source - ;EDI target - ;vraci EDI ukazatel na konce; -save_1bit_: - mov cl,8 -s1b1: lodsd - save_linex eax,ebx,1 - dec cl - jnz s1b1 - mov eax,ebx - stosd - mov cl,8 -s1b2: lodsd - save_linex eax,ebx,1 - dec cl - jnz s1b2 - mov eax,ebx - stosd - ret - -public save_2bit_ -save_2bit_: - mov ch,4 -c2b11: mov cl,4 -c2b12: lodsd - save_linex eax,ebx,2 - dec cl - jnz c2b12 - mov eax,ebx - stosd - dec ch - jnz c2b11 - ret - -public save_3bit_ -save_3bit_: - mov ch,8 -c3b11: mov cl,2 -c3b12: lodsd - save_linex eax,ebx,3 - dec cl - jnz c3b12 - mov eax,ebx - shr eax,8 - stosd - dec edi - dec ch - jnz c3b11 - ret - -public save_4bit_ -save_4bit_: - mov ch,8 -c4b11: mov cl,2 -c4b12: lodsd - save_linex eax,ebx,4 - dec cl - jnz c4b12 - mov eax,ebx - stosd - dec ch - jnz c4b11 - ret - - -public load_1bit_ ;ESI - Source - ;EDI - Target - ;EBX - Palette - ;anim_line_len - delka radky -load_1bit_ : - mov ch,8 -l1b1: mov dl,[esi] - inc esi - mov cl,8 -l1b2: movzx eax,dl - and eax,1 - mov eax,[ebx+eax*2] - test eax,8000h - jnz short l1b1s - mov [edi],ax -l1b1s: add edi,2 - shr dl,1 - dec cl - jnz l1b2 - mov eax,_anim_line_len - sub eax,16 - add edi,eax - dec ch - jnz l1b1 - ret - -public load_2bit_ ;ESI - Source - ;EDI - Target - ;EBX - Palette - ;anim_line_len - delka radky -load_2bit_: - mov ch,8 -l2b1: mov dx,[esi] - add esi,2 - mov cl,8 -l2b2: mov eax,edx - and eax,3 - mov eax,[ebx+eax*2] - test eax,8000h - jnz short l2b1s - mov [edi],ax -l2b1s: add edi,2 - shr edx,2 - dec cl - jnz l2b2 - mov eax,_anim_line_len - sub eax,16 - add edi,eax - dec ch - jnz l2b1 - ret - -public load_3bit_ ;ESI - Source - ;EDI - Target - ;EBX - Palette - ;anim_line_len - delka radky -load_3bit_: - mov ch,8 -l3b1: mov edx,[esi] - add esi,3 - mov cl,8 -l3b2: mov eax,edx - and eax,7 - mov eax,[ebx+eax*2] - test eax,8000h - jnz short l3b1s - mov [edi],ax -l3b1s: add edi,2 - shr edx,3 - dec cl - jnz l3b2 - mov eax,_anim_line_len - sub eax,16 - add edi,eax - dec ch - jnz l3b1 - ret - -public load_4bit_ ;ESI - Source - ;EDI - Target - ;EBX - Palette - ;anim_line_len - delka radky -load_4bit_: - mov ch,8 -l4b1: mov edx,[esi] - add esi,4 - mov cl,8 -l4b2: mov eax,edx - and eax,15 - mov eax,[ebx+eax*2] - test eax,8000h - jnz short l4b1s - mov [edi],ax -l4b1s: add edi,2 - shr edx,4 - dec cl - jnz l4b2 - mov eax,_anim_line_len - sub eax,16 - add edi,eax - dec ch - jnz l4b1 - ret - -public load_8bit_ ;ESI - Source - ;EDI - Target - ;EBX - Palette - ;anim_line_len - delka radky -load_8bit_: - mov ch,8 -l8b1: mov cl,8 -l8b2: lodsb - movzx eax,al - mov eax,[ebx+eax*2] - test eax,8000h - jnz short l8b1s - mov [edi],ax -l8b1s: add edi,2 - dec cl - jnz l8b2 - mov eax,_anim_line_len - sub eax,16 - add edi,eax - dec ch - jnz l8b1 - ret - -public load_0bit_ ;EDI - Target - ;EBX - Palette - ;anim_line_len - delka radky -load_0bit_: - movzx eax,word ptr[ebx] - test eax,8000h - jnz l0b1s - mov ebx,eax - shl ebx,16 - or eax,ebx - mov ch,8 -l0b1: mov cl,4 -l0b2: stosd - dec cl - jnz l0b2 - mov edx,_anim_line_len - sub edx,16 - add edi,edx - dec ch - jnz l0b1 -l0b1s: ret - - -public display_interlaced_fused_lfb_ - ;ESI buffer1 - ;EBX buffer2 - ;EDI screen - -;vezme buffer 1 a sfuzuje s bufferem 2, predtim ovsem prepise buffer2 bufferem 1 -;pracuje s lfb -display_interlaced_fused_lfb_: - mov ecx,180 -dif_lp1:push ecx - mov ecx,320 -dif_lp2:lodsd - mov edx,eax - xchg edx,[ebx] - and eax,7bde7bdeh - and edx,7bde7bdeh - add eax,edx - shr eax,1 - stosd - add ebx,4 - dec ecx - jnz dif_lp2 - pop ecx - add edi,1280 - dec ecx - jnz dif_lp1 - ret - -extern mapvesaadr_:near - -public display_interlaced_fused_bank_ - ;ESI buffer1 - ;EBX buffer2 - ;EDI screen - -;vezme buffer 1 a sfuzuje s bufferem 2, predtim ovsem prepise buffer2 bufferem 1 -;pracuje s lfb -display_interlaced_fused_bank_: - mov ecx,180 -difblp1:push ecx - push edi - call mapvesaadr_ - mov ecx,320 -difblp2:lodsd - mov edx,eax - xchg edx,[ebx] - and eax,7bde7bdeh - and edx,7bde7bdeh - add eax,edx - shr eax,1 - stosd - add ebx,4 - dec ecx - jnz difblp2 - pop edi - pop ecx - add edi,4096 - dec ecx - jnz difblp1 - ret - - - - -_TEXT ends -end diff --git a/VIDEO/ANIPACK.H b/VIDEO/ANIPACK.H deleted file mode 100644 index 5d4649c..0000000 --- a/VIDEO/ANIPACK.H +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __ANIPACK_H - -#define __ANIPACK_H - -int anim_line_len=1280; - -void load_0bit(void *target,void *palette); -void *load_1bit(void *source,void *target,void *palette); -void *load_2bit(void *source,void *target,void *palette); -void *load_3bit(void *source,void *target,void *palette); -void *load_4bit(void *source,void *target,void *palette); -void *load_8bit(void *source,void *target,void *palette); -#pragma aux load_0bit parm [EDI][EBX] modify [EAX ECX EDX] -#pragma aux load_1bit parm [ESI][EDI][EBX] modify [EAX ECX EDX] value [esi] -#pragma aux load_2bit parm [ESI][EDI][EBX] modify [EAX ECX EDX] value [esi] -#pragma aux load_3bit parm [ESI][EDI][EBX] modify [EAX ECX EDX] value [esi] -#pragma aux load_4bit parm [ESI][EDI][EBX] modify [EAX ECX EDX] value [esi] -#pragma aux load_8bit parm [ESI][EDI][EBX] modify [EAX ECX] value [esi] - -void *save_1bit(void *source,void *target); -#pragma aux save_1bit parm[esi][edi] modify [eax ebx] value[edi]; - -void *save_2bit(void *source,void *target); -#pragma aux save_2bit parm[esi][edi] modify [eax ebx] value[edi]; - -void *save_3bit(void *source,void *target); -#pragma aux save_3bit parm[esi][edi] modify [eax ebx] value[edi]; - -void *save_4bit(void *source,void *target); -#pragma aux save_4bit parm[esi][edi] modify [eax ebx] value[edi]; - - -void display_interlaced_fused_lfb(void *buff1,void *buff2,void *lfb); -#pragma aux display_interlaced_fused_lfb parm [esi][ebx][edi]modify [ecx edx eax] - -void display_interlaced_fused_bank(void *buff1,void *buff2,void *scr); -#pragma aux display_interlaced_fused_bank parm [esi][ebx][edi]modify [ecx edx eax] - -#endif diff --git a/VIDEO/BITLINE.ASM b/VIDEO/BITLINE.ASM deleted file mode 100644 index c3dfe76..0000000 --- a/VIDEO/BITLINE.ASM +++ /dev/null @@ -1,342 +0,0 @@ -.model small -.386 -;16 bit line (de)comprimator -; -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - - - -cwrite macro REG,BIT ;zapise al do [di] pouze BIT bitu ze zadu - local cwrit2 - shl edx,BIT ;posun EDX o pripraveny pocet bitu - and REG,0ffh shr (8-BIT) ;odmaskuj pripadne bity v REG - or dl,REG ;pridej REG do dl - add ch,BIT ;pripocti pridany pocet bitu - cmp ch,8 ;jestli to preteklo - jc cwrit2 ;ne, vse je OK - sub ch,8 ;ano pak odecti 8 bitu - mov cl,8 ;cl=8-ch; - sub cl,ch ; - shl edx,cl ;tj kolik zbejva posunout. - mov [edi],dh ;zapis osmice - shr dl,cl ;vrat dl do puvodniho stavu - inc edi ;dalsi adresa -cwrit2: -endm - -cwrit8 macro REG ;zapise 8 bitu do [EDI] - shl edx,8 ;posun 8 bitu - or dl,REG ;sfuzuj - mov cl,8 ;kolik urcite preteklo - sub cl,ch ;a o kolik teda posunout - shl edx,cl ;posun na dorovnani na bajt - mov [edi],dh ;zapis bajt - shr dl,cl ;spodek vrat do puvodniho stavu. - inc edi ;dalsi adresa -endm - -write_ax: ;zapisuje AX do [edi] v komprimovanem tvaru - ;hodnoty - ; 0 ... 000 - ; 1 ... 001 - ; 2 ... 010 - ; 3 ... 011 - ; 4 ... 100 - ; 5 ... 101 - ; 6 ... 110 - ; 7 ... 11100000 - ; 8 ... 11100001 - ; 9 ... 11100010 - ;10 ... - ;... - ;37 ... 11111110 - ;38 ... 1111111100000000 - ;39 ... 1111111100000001 - ; - ;291 .. 1111111111111101 - ;292 .. 1111111111111110 - ;>293 .. 1111111111111111 Lo Hi - - cmp eax,293 ;eax>293 (7+31+255) - jnc wr_16 ;zapis 16 bitove hodnoty - cmp al,38 ;eax>38 (7+31) - jnc wr_8 ;zapis 8 bitove hodnoty - cmp al,7 ;eax>7 - jnc wr_5 ;zapis 5 bitove hodnoty - cwrite al,3 ;pro cisla eax<7 (0..6) staci 3 bity - ret ;konec -wr_16: sub eax,293 ;odecti to co je zname - mov cl,0ffh ;zapis dvou hodnot 255 jako znacka ze nasleduje - cwrit8 cl ;16 bitova hodnota - mov cl,0ffh - cwrit8 cl - cwrit8 al ;zapis nizsi - mov al,ah - cwrit8 ah ;zapis vyssi - ret -wr_5: sub al,7 ;odecti co zname - or al,0E0h ;tri bity na 1 znaci 5 bitovou hodnotu - cwrit8 al ;zapis to - ret -wr_8: sub al,38 ;odecti to co je uz zname. - mov cl,0ffh ;zapis jedne hodnoty 255 znaci 8 bitovou hodnotu - cwrit8 cl ;zapis ji - cwrit8 al ;zapis al - ret - - -;vsechny mody - -; vstup: ESI - data -; EDI - buffer -; ECX - delka dat (max 65535) -; EBX - bitova rovina (bit na pozici roviny = 1) - -flush macro - local fjmp - shr ecx,16 - or ch,ch - jz fjmp - mov eax,7 - call write_ax -fjmp: -endm - -public cmode0_ -cmode0_: ;komprimuje pro mod 11110000 (uvazuji se retezce 00001 nebo 11110 pricemz - ; 0000111110 se pocita vcetne rozdilu ( - ; \---/\---/ - ; 4 4 tj 100100 - - - push ebp - xor edx,edx - xor ebp,ebp - xor eax,eax -cmode0b: lodsw - and ax,bx - cmp ax,bp - jnz cmode0a - add eax,10000h - dec cx - jnz cmode0b - shr eax,16 - shr ecx,16 - call write_ax - flush - pop ebp - ret -cmode0a: xor ebp,ebx - shr eax,16 - rol ecx,16 - call write_ax - rol ecx,16 - dec cx - jnz cmode0b - flush - pop ebp - ret - -public cmode1_ - -cmode1_: ;komprimuje pro mod 00010001 - ;komprimuje se vcetne jednicky tj - ; - ;000100001 - ;\--/\---/ - ; 3 4 tj 011100 - xor edx,edx - xor eax,eax -cmode1b: lodsw - and ax,bx - jnz cmode1a - add eax,10000h - dec cx - jnz cmode1b - shr eax,16 - shr ecx,16 - call write_ax - flush - ret -cmode1a: shr eax,16 - rol ecx,16 - call write_ax - rol ecx,16 - dec cx - jnz cmode1b - flush - ret - -public cmode2_ - -cmode2_: ;komprimuje pro mod 11101110 - ;komprimuje se vcetne 0 tj - ; - ;111101011110111110 - ;\---/\/\---/\----/ - ; 4 1 4 4 tj 100001100100 - xor edx,edx - xor eax,eax -cmode2b: lodsw - and ax,bx - jz cmode2a - add eax,10000h - dec cx - jnz cmode2b - shr eax,16 - shr ecx,16 - call write_ax - flush - ret -cmode2a: shr eax,16 - rol ecx,16 - call write_ax - rol ecx,16 - dec cx - jnz cmode2b - flush - ret - -public cmode3_ -cmode3_: ;kopiruje rovinu - mov edx,8 ;8 bitu -cmode3b: lodsw ;cti slovo - and ax,bx ;kontroluj rovinu - cmp ax,bx ;nastav carry podle vysledku - cmc ;ale spravne - rcl dh,1 ;soupni ho do dh - dec dl ;dalsi pozice - jnz cmode3a ;kdyz to neni vse pokracuj - mov [edi],dl ;je to vse - inc edi ;dalsi bajt - mov edx,8 ;dalsich 8 bitu -cmode3a: dec ecx ;dalsi slovo - jnz cmode3b ;dokud to neni vse. - cmp dl,8 - jz cmode3c - mov cl,dl - shl dh,cl - mov [edi],dh - inc edi -cmode3c: ret - - -; DEKOMPRIMACE - -cread macro REG,BIT - local crd1 - mov cl,BIT - cmp ch,cl ;zjisti zda pocet zbylych bitu - jnc crd1 ;neni nahodou min nez potrebnych - mov cl,ch ;ano, tj posun ty zbyle do dh - shl edx,cl - mov dl,[esi] ;do dl vloz dalsi bajt - inc esi ;a zvys adresu - sub cl,BIT ;odecti pocet pozadovanych bitu - mov ch,8 ;to je aktualizovana hodnota noveho ch - neg cl ;v cl je nyni mnozstvi chybejicich bitu -crd1: shl edx,cl ;prisun je do dh - sub ch,cl - mov REG,dh ;vem je do REG - and REG,0xff shr (8-BIT) ;odmaskuj horejsek -endm - -;vsechny mody - -; vstup: ESI - data -; EDI - vysledek -; ECX - delka dat (max 65535) -; EBX - bitova rovina (bit na pozici roviny = 1) - -cread_ax macro - local crd_ok - rol ecx,16 ;nejdriv schovej cx v horni pulce - xor eax,eax ;vynuluj eax - cread al,3 ;nacti 3 bity - cmp al,7 ;pokud to da hodnotu 7 pak pokracuj - jnz crd_ok ;jinak jsem hotov - cread al,5 ;nacti dalsi 5 bitu - add al,7 ;pricti ztracenych 7 - cmp al,38 ;pokracuj kdyz to da dohromady 38 - jnz crd_ok - cread al,8 ;nacti 8 bitu - add eax,38 ;a pricti 38 - cmp eax,293 ;pokracuj kdyz to da 293 - jnz crd_ok - cread al,8 ;precti dalsi 8 bitu - cread ah,8 ;Nejdriv dolni a pak horni - add eax,293 -crd_ok: rol ecx,16 ;obnov cx - -endm - -public cread0_ -cread0_: and ecx,0ffffh ;vynuluj horni pulku ecx - xor edx,edx ;vynuluj pamet bitu - cread_ax ;precti prvni zaznam - or eax,eax ;je li 0 zaciname jednickami - jnz cread0a -cread0c: cread_ax ;precti zaznam - inc eax ;+1 -cread0b: xor [edi],bx ;invertuj rovinu - add edi,2 - dec ecx ;odecitej ecx - dec eax ;odecti citac - jnz cread0b ;dokud neni ax=0 - or cx,cx ;kontrola zda nejsme na konci - jz cread0e ;kdyz ne - cread_ax ;precti dalsi zaznam - inc eax ;+1 -cread0a: sub cx,ax ;ted se jenom preskoci - jz cread0e ;ale kdyz jsme na konci tak nic nedelej - shl eax,1 ;preskoci 2*eax bajtu - add edi,eax ;skok! - jmp cread0c ;a jedem znova. -cread0e: ret - -public cread1_ -cread1_: and ecx,0ffffh - xor edx,edx -cread1a: cread_ax ;cti zaznam - add edi,eax ;preskoc EAX bajtu a zapis 1 - xor [edi],ebx - add edi,2 - dec ecx ;jedna za jeden bod - sub cx,ax ;a jeste ax bajtu - jnz cread1a ;jeste to neni vse? - ret - -public cread2_ -cread2_: and ecx,0ffffh - xor edx,edx -cread2a: cread_ax ;cti zaznam - add edi,eax ;zapis EAX bajtu a preskoc 1 -cread2b: xor [edi],ebx - add edi,2 - dec ecx ;jedna za jeden bod - dec eax - jnz cread2b - add edi,2 - dec ecx - jnz cread2a - ret - -public cread3_ -cread3_: mov dh,8 ;dh - citac bitu - mov dl,[esi] ;vezmi prvni osmici - inc esi ;zvys adresu -cread3b: shl dl,1 ;nacti bit do cf - sbb eax,eax ;je-li nastaven je vysledek 0xffffffff - and eax,ebx ;nastav prislusnou rovinu - xor [edi],ax ;proved XOR - add edi,2 ;dalsi bod - dec ecx ;odecti si ho - jz cread3a ;kdyz uz jsme na konci skok na cread3a - dec dh ;odecti citac bitu - jz cread3_ ;jakmile klesne na nulu zacni od zacatku - jmp cread3b ;jinak opakuj. -cread3a: ret - -_TEXT ends - -END diff --git a/VIDEO/BITLINE.H b/VIDEO/BITLINE.H deleted file mode 100644 index c0b8c4b..0000000 --- a/VIDEO/BITLINE.H +++ /dev/null @@ -1,16 +0,0 @@ -void *cmode0(void *source,void *target,int count,int rovina); -#pragma aux cmode0 parm [ESI][EDI][ECX][EBX] modify [EAX EDX] value [EDI]; -void *cmode1(void *source,void *target,int count,int rovina); -#pragma aux cmode1 parm [ESI][EDI][ECX][EBX] modify [EAX EDX] value [EDI]; -void *cmode2(void *source,void *target,int count,int rovina); -#pragma aux cmode2 parm [ESI][EDI][ECX][EBX] modify [EAX EDX] value [EDI]; -void *cmode3(void *source,void *target,int count,int rovina); -#pragma aux cmode3 parm [ESI][EDI][ECX][EBX] modify [EAX EDX] value [EDI]; -void *cread0(void *source,void *target,int count,int rovina); -#pragma aux cread0 parm [ESI][EDI][ECX][EBX] modify [EAX EDX] value [EDI]; -void *cread1(void *source,void *target,int count,int rovina); -#pragma aux cread1 parm [ESI][EDI][ECX][EBX] modify [EAX EDX] value [EDI]; -void *cread2(void *source,void *target,int count,int rovina); -#pragma aux cread2 parm [ESI][EDI][ECX][EBX] modify [EAX EDX] value [EDI]; -void *cread3(void *source,void *target,int count,int rovina); -#pragma aux cread3 parm [ESI][EDI][ECX][EBX] modify [EAX EDX] value [EDI]; diff --git a/VIDEO/BOLDCZ.FON b/VIDEO/BOLDCZ.FON deleted file mode 100644 index be5e16c7bc204cc269f8460b692ba38ff6f14220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9034 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 -#include -#include -#include -#include -#include -#include -#include "flc.h" -#include "anipack.h" -#include -#include "cinema.h" - -#define BOX_X 8 -#define BOX_Y 8 - -typedef int T_BOX[BOX_X*BOX_Y]; - -typedef char PALETA[256][3]; - -PALETA cur_pal; -int box_end; -T_BOX cur_box; -T_BOX sort_box; -char box_data[BOX_X*BOX_Y],conv_data[BOX_X*BOX_Y]; -char last_boxes[80][23][BOX_X*BOX_Y]; -char preview=1; -char pack_repeat=0; - -char *flc_name; - -char vystup[120000]; -char differs[120000]; -char *ip; -char bit_mode; -char same; -FILE *anim; -char *anim_name; - -word new_paleta[256],old_paleta[256]; -word play_screen[240000]; - -int per_frame=60000; -int old_per_box; -char rastry=1; -int rastry_rozliseni=100; -int per_box; -int now_calc_size; -int hranice_velikosti[][2]={ - {2,0}, - {11,1}, - {20,2}, - {21,2}, - {30,3}, - {31,3}, - {32,3}, - {33,3}, - {42,4}, - {43,4}, - {44,4}, - {45,4}, - {46,4}, - {47,4}, - {48,4}, - {49,4}, - }; - - -char compress_table[]={0,0,1,2,2,3,3,3,3,4,4,4,4,4,4,4}; -//char compress_table[]={0,0,1,2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,}; -//char compress_table[]={0,0,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,}; -int hranice=0; - - -int get_distance(int col1,int col2) - { - return abs(cur_pal[col1][0]-cur_pal[col2][0])+ - abs(cur_pal[col1][1]-cur_pal[col2][1])+ - abs(cur_pal[col1][2]-cur_pal[col2][2]); - } - - - -void create_differs() - { - word *c; - char *d,*e; - int i; - int j,k,x; - - j=0;k=0x7fffffff; - for(i=1;i<256;i++) - if ((x=get_distance(0,i))<= - k) - { - k=x;j=i; - } - c=play_screen; - d=frame_buffer; - e=differs; - for(i=0;i<120000;i++,c++,d++,e++) - { - if (!*d) *d=j; - if (*c!=new_paleta[*d]) - *e=*d; - else - *e=0; - } - } - -void box_read(int xbox,int ybox) - { - int x,y,k; - char *a,*bd; - - same=1; - box_end=0; - bd=box_data; - a=differs; - memset(cur_box,0xff,sizeof(cur_box)); - xbox=BOX_X*xbox; - ybox=BOX_Y*ybox; - a+=640*ybox+xbox; - for(y=ybox;y>3); - g=(flc_paleta[i][1]>>3); - b=(flc_paleta[i][2]>>3); - new_paleta[i]=(r<<10)+(g<<5)+b; - } - memcpy(cur_pal,flc_paleta,sizeof(flc_paleta)); - new_paleta[0]=0x8000; - } - -/* -void set_vga_palette() - { - int x; - char *c; - - c=cur_pal; - outp (0x3c8 - , 0); - for (x=0; x<768; x++,c++) - { - while (inp(0x3da) & 1); - while (!(inp(0x3da) & 1)); - outp (0x3c9,*c); - } - } - - -void get_vga_palette() - { - int x; - char *c; - - c=cur_pal; - outp (0x3c7, 0); - for (x=0; x<768; x++,c++) - { - while (inp(0x3da) & 1); - while (!(inp(0x3da) & 1)); - *c=inp (0x3c9); - } - cur_pal[0][0]=0; - cur_pal[0][1]=0; - cur_pal[0][2]=0;} - */ - - - - -/*void box_analize() - { - int i,c; - int r,g,b; - - for(i=0;i=0 && (ds=get_distance(c,cur_box[i]))>max) - { - j=i;max=ds; - } - } - if (j>=0) - { - c=cur_box[j]; - sort_box[d++]=c; - cur_box[j]=-1; - a=j; - } - if (max>hranice) - { - z=d; - } - } - while (j!=-1); - if (box_end>1) box_end=z; - } - -int zvol_metodu() - { - int i=0; - - for(;hranice_velikosti[i][0]>1) & 1) ^ ((i>>3) & 1)) && indx2!=-1) indx=subst[c]; - if (sort_box[0]==0 && c && last_boxes[x][y][i]!=0 && get_distance(c,last_boxes[x][y][i])=sizeof(compress_table)) - { - int i; - - *ip++=64; - memcpy(ip,box_data,sizeof(box_data)); - memcpy(conv_data,box_data,sizeof(box_data)); - for(i=0;i(i=zvol_metodu())) box_end=i; - save_box(x,y); - } - -void conv_pict() - { - int i,j,count=0; - - pack_repeat=0; - now_calc_size=0; - conv_pal_hicolor(); - create_differs(); - ip=vystup; - old_per_box=-1; - for(i=0;i<23;i++) - for(j=0;j<80;j++) - { - per_box=(per_frame-(ip-vystup))/(80*23-count); - if (old_per_box==-1) old_per_box=per_box;else if (per_box>old_per_box)per_box+=(per_box-old_per_box); - count++; - conv_complette(j,i); - } - } - - -/* -void decompr_box(word *adr) - { - char mode; - word palxlat[16]; - int i; - - mode=*ip++; - if (mode==255) return; - if (mode<64) - { - for(i=0;i>1; - c+=2; - d+=2; - } - c+=640; - } - - } - -void save_palette() - { - int i,il,ip,ps; - for(i=0;i<256 && old_paleta[i]==new_paleta[i];i++); - il=i; - if (il==256) ip=il; - else - { - for(i=255;i>0 && old_paleta[i]==new_paleta[i];i--); - ip=i+1; - } - ps=ip-il; - if (ps) - { - i=TRACK_PALETTE; - fwrite(&i,1,1,anim); - fwrite(&il,1,2,anim); - fwrite(&ps,1,2,anim); - fwrite(&new_paleta[il],sizeof(word),ps,anim); - } - } - -void save_frame(int size) - { - int i; - - i=TRACK_VIDEO; - fwrite(&i,1,1,anim); - fwrite(&size,1,sizeof(size),anim); - fwrite(vystup,1,size,anim); - } - -void save_mark(int i) - { - fwrite(&i,1,1,anim); - } - -void int10_3(); -#pragma aux int10_3=\ - "mov eax,3"\ - "int 10h"\ - modify [eax]; - -void int10_13(); -#pragma aux int10_13=\ - "mov eax,13h"\ - "int 10h"\ - modify [eax]; - -void pack_anim() - { - int x;int size; - - Open_FLC(flc_name); - Get_first_frame(); - Decompress_frame(); - conv_pict(); - adjust_pict(); - if (preview) show_play_screen(); - size=ip-vystup;printf("Frame 1: %d \n",size); - save_palette(); - save_frame(size); - for (x=2; x<=h_flc.frames+10; x++) - { - if (x<=h_flc.frames) - { - Get_next_frame (); - Decompress_frame (); - if (preview) show_play_screen(); - } - conv_pict(); - adjust_pict(); - size=ip-vystup;printf("Frame %d: %d \n",x,size); - save_palette(); - save_frame(size); - save_mark(TRACK_DELAY); - } - save_mark(TRACK_END); - } - /* - decompr_pict(); - show_play_screen(); - getch(); - decompr_pict(); - show_play_screen(); - */ - -void load_frame() - { - int size; - fread(&size,1,sizeof(size),anim); - fread(vystup,1,size,anim); - } - -void load_palette() - { - word i; - word size; - fread(&i,1,2,anim); - fread(&size,1,2,anim); - fread(&new_paleta[i],2,size,anim); - } -/* -char play_track(FILE *anim) - { - char i; - - fread(&i,1,1,anim); - switch (i) - { - case TRACK_VIDEO: - load_frame(); - decompr_pict(); - break; - case TRACK_PALETTE: - load_palette(); - break; - case TRACK_MUSIC:break; - case TRACK_END:return 0; - case TRACK_DELAY: - show_play_screen(); - // delay(7); - break; - } - return 1; - } - - -void play_anim(FILE *anim) - { - while(play_track(anim)); - } -*/ -main(int argc,char *argv[]) - { - if (argc<3) - { - puts(""); - puts("Poziti: cnmbuild filename.flc filename.cnm [perframe] [rastry]"); - puts(""); - puts("perframe - omezeni velikosti na jeden frame"); - puts("rastry - cislo udavajici hranici pro rastrovani (0 - bez rastru)"); - return 1; - } - memset(play_screen,0xff,sizeof(play_screen)); - memset(frame_buffer,0xff,sizeof(frame_buffer)); - memset(new_paleta,0xff,sizeof(new_paleta)); - memset(last_boxes,0,sizeof(last_boxes)); - - flc_name=argv[1]; - anim_name=argv[2]; - if (argc>=4) sscanf(argv[3],"%d",&per_frame); - if (argc>=5) sscanf(argv[4],"%d",&rastry_rozliseni); - if (initmode32(NULL)) preview=0; - if (banking) - { - closemode();preview=0; - } - anim=fopen(anim_name,"wb"); - pack_anim(); - fclose(anim); - closemode(); - return 0; - } diff --git a/VIDEO/CNMCONTR.C b/VIDEO/CNMCONTR.C deleted file mode 100644 index 479fac1..0000000 --- a/VIDEO/CNMCONTR.C +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include -#include -#include - -#define ERR_PARM 1 -#define ERR_STR 2 -#define ERR_NUMB 3 - - -typedef struct command_table - { - char command[20]; - void (*proc)(int frame); - }COMMAND_TABLE - -int total_commands=0; - -char paramstr[200]; -int cur_line; -char command[50]; -char errors[]="Ok.,Nespravny pocet parametru.,Chybi konec retezce.,Chybna hodnota."; - - -void extract_text(char *what,int num,char *s) - { - char *c; - char ii=0; - - c=what; - while (num && *c) - { - if (!*c) call_error(ERR_PARM); - if (*c=='\"') ii=!ii; - else if (*c==',' && !ii) num--; - c++ - } - while((*c!=',' && *c) || ii) - { - if (!*c) call_error(ERR_STR); - if (*c=='\"') ii=!ii; - *s++=*c++ - } - } - -void odstran_uvozovky(char *s) - { - char *c; - char iif=0; - - c=s; - while (*s) - { - if (*s!='\"' || iif) - { - *c++=*s; - iif=0; - } - else - iif=1; - } - } - - -int conv_to_int(char *s) - { - int i; - - if (sscanf(s,"%d",&i)!=1) return i; - call_error(ERR_NUMB) - } - - - diff --git a/VIDEO/FLC.C b/VIDEO/FLC.C deleted file mode 100644 index 420c54e..0000000 --- a/VIDEO/FLC.C +++ /dev/null @@ -1,202 +0,0 @@ -// -// Knihovna pro dekompresi FLC souboru -// - -#include -#include -#include -#include -#include -#include "flc.h" - -FILE *flc; -flcheader h_flc; -frameheader h_frame; -actionheader h_action; -char flc_paleta[256][3]; -char frame_buffer [307205]; -char *flc_buffer; -char test=1; - -void Open_FLC (char *filename) -{ - flc = fopen (filename, "rb"); - fread (&h_flc, sizeof(flcheader), 1, flc); -} - -void Close_FLC (void) -{ - fclose (flc); - free (flc_buffer); -} - -void Get_first_frame (void) -{ - fseek (flc, h_flc.offset1, SEEK_SET); - fread (&h_frame, sizeof(frameheader), 1, flc); - flc_buffer = (char*)malloc((h_frame.size-sizeof(frameheader))); - fread (flc_buffer, (h_frame.size-sizeof(frameheader)), 1, flc); -} - -void Get_next_frame (void) -{ - free (flc_buffer); - fread (&h_frame, sizeof(frameheader), 1, flc); - flc_buffer = (char*)malloc((h_frame.size-sizeof(frameheader))); - fread (flc_buffer, (h_frame.size-sizeof(frameheader)), 1, flc); -} - -void Decompress_frame (void) -{ - unsigned short x,y,z,w; - unsigned short changes, nfo_word, packets, offset, row; - int frame_pos=0,tst; - unsigned int scr_pos; - char c1, c2, c3, a; - char hi, lo; - - packets=0; - for (z=1; z<=h_frame.actions; z++) - { - memmove ( &h_action, (flc_buffer+frame_pos), sizeof(actionheader) ); - switch (h_action.code) - { - case 16: - frame_pos+=6; - memcpy(frame_buffer,flc_buffer+ - frame_pos,h_flc.width*h_flc.height); - frame_pos+=h_flc.width*h_flc.height; - break; - case 4: - { - short bc; - int barv,poc; - int fp; - - fp=frame_pos+6; - bc=*(short *)(flc_buffer+fp);fp+=2; - barv=0; - while(bc--) - { - barv+=(flc_buffer[fp++]); - poc=(char)(flc_buffer[fp++]-1)+1; - memcpy(&flc_paleta[barv][0],flc_buffer+fp,poc*3); - fp+=poc*3;barv+=poc; - } - frame_pos+=h_action.size; - } - break; - case 7: - case 12: - frame_pos+=6; - lo=flc_buffer[frame_pos]; frame_pos++; - hi=flc_buffer[frame_pos++]; - changes=hi*256+lo; - row=0;tst=frame_pos+h_action.size; - - for (y=0; frame_pos=0x8000) // preskakovane radky - { - nfo_word=(short)(-nfo_word); //0xFFFF-nfo_word+1; - row+=nfo_word; - } - - else - { - for (z=0; z=tst) break; - if (c1>128) - { - c1=0xFF-c1+1; - c2=flc_buffer[frame_pos]; - frame_pos++; - c3=flc_buffer[frame_pos]; - frame_pos++; - - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=c2; - scr_pos++; - frame_buffer[scr_pos]=c3; - scr_pos++; } - } - else - { -// c3=0xFF-c3+1; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=flc_buffer[frame_pos]; - frame_pos++; - scr_pos++; - frame_buffer[scr_pos]=flc_buffer[frame_pos]; - frame_pos++; - scr_pos++; } - } - -// if (x>=640) a=1; -// } - - } - row++; - } - } - -// frame_pos+=h_action.size; - break; - case 15: - frame_pos+=6; - for (y=0; y<=(h_flc.height-1); y++) - { - frame_pos++; x=1; //a=0; - scr_pos=y*h_flc.width; - - while (x<=h_flc.width) - { - c1 = flc_buffer[frame_pos]; - frame_pos++; - - if (c1<128) - { - c2=flc_buffer[frame_pos]; - frame_pos++; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=c2; - scr_pos++; - x++; } - } - else - { - c1=0xFF-c1+1; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=flc_buffer[frame_pos]; - scr_pos++; - frame_pos++; - x++; } - } - } - } - break; - default: frame_pos+=h_action.size; - break; - }; - - } - -} diff --git a/VIDEO/FLC.H b/VIDEO/FLC.H deleted file mode 100644 index 8eb1d16..0000000 --- a/VIDEO/FLC.H +++ /dev/null @@ -1,62 +0,0 @@ -// -// Hlavickovy soubor ke knihovne FLC.C slouzici k dekompresi FLC -// - -#ifndef _FLC_H -#define _FLC_H - -typedef struct FLCHEADER { - unsigned int size; // delka souboru vcetne hlavicky - unsigned short idflc; // ID FLC=0AF12h - unsigned short frames; // pocet frejmu - unsigned short width; // sirka vsech obrazku - unsigned short height; // vyska vsech obrazku - unsigned short color; // hloubka barvy (bpp) - unsigned short flag1; - unsigned int speed; // rychlost prehravani (v 1/1000 s) - unsigned short reserv1; // rezervovany - unsigned int date1; // datum a cas vytvoreni - unsigned int serial; // seriove cislo programu - unsigned int date2; // datum a cas posledni zmeny - unsigned short XA; - unsigned short YA; - char reserv2 [42]; // rezervovano - unsigned int offset1; // offset prvniho frame - unsigned int offset2; // offset druheho frame - char reserv3 [40]; // rezervovano - } flcheader; - -typedef struct FRAMEHEADER { - unsigned int size; // velikost frame v bytech - unsigned short sign; // znacka frame OFAF1h - unsigned short actions; // pocet akci v tomto frame - char reserv [8]; // rezervovano - } frameheader; - -typedef struct ACTIONHEADER { - unsigned int size; // velikost akce v bytech - unsigned short code; // kod akce - // 04h - predani casti nebo cele palety - // 07h - predavani zmenenych casti obrazu - // 0Dh - vymaze obrazovku - // 0Fh - cela obrazovka v RLE - // 10h - nekomprimovana kopie cele obrazovky - // nasleduji data akce - } actionheader; - -extern FILE *flc; -extern flcheader h_flc; -extern frameheader h_frame; -extern actionheader h_action; -extern char frame_buffer [307205]; -extern char *flc_buffer; -extern char flc_paleta[256][3]; -//unsigned int ladici; - -void Open_FLC (char *filename); -void Close_FLC (void); -void Get_first_frame (void); -void Get_next_frame (void); -void Decompress_frame (void); - -#endif diff --git a/VIDEO/FLC/ANALYSE/DOSMEM.C b/VIDEO/FLC/ANALYSE/DOSMEM.C deleted file mode 100644 index 752670a..0000000 --- a/VIDEO/FLC/ANALYSE/DOSMEM.C +++ /dev/null @@ -1,71 +0,0 @@ -/*********************************************/ -/*** DOS memory allocation - DOSMEM.C ***/ -/*** vykostena verze chlumakova memalloc.c ***/ -/*********************************************/ - -#include -#include -#include -#include -#include "dosmem.h" - - -/*** Alokace pole v dolni pameti ***/ - -void *mem_alloc(int size) -{ - static union REGS r; - MEMREC memrec; - - r.x.eax=0x0100; - r.x.ebx=(size>>4)+1; - size=r.x.ebx<<4; - int386(0x31,&r,&r); - if (r.x.cflag) - { - printf ("No fucking DOS memory left!!!"); - exit(1); - } - memrec.ptr=(void *)((r.x.eax&0xFFFF)<<4); - Selector=memrec.selector=(short int)r.x.edx; - - return memrec.ptr; -} - - -/*** Uvolneni dolni pameti ***/ - -void mem_free(void *ptr) -{ - union REGS r; - - if(ptr!=NULL) - { - r.x.eax=0x0101; - r.x.edx=Selector; - int386(0x31,&r,&r); - if(r.x.cflag) - printf("Cannot free DOS memory!!!!"); - } - -} - - -/*** Vyvolani preruseni pomoci protected modu ***/ - -void WtNs386(int IntNum, DPMIREGS *dpmiregs) -{ - union REGS r; - struct SREGS sr; - - r.w.ax=0x300; - r.h.bl=(char)IntNum; - r.h.bh=0; - r.w.cx=0; - segread(&sr); - sr.es=FP_SEG(dpmiregs); - r.x.edi=FP_OFF(dpmiregs); - - int386x(0x31,&r,&r,&sr); -} - diff --git a/VIDEO/FLC/ANALYSE/DOSMEM.H b/VIDEO/FLC/ANALYSE/DOSMEM.H deleted file mode 100644 index b33588d..0000000 --- a/VIDEO/FLC/ANALYSE/DOSMEM.H +++ /dev/null @@ -1,46 +0,0 @@ -/************************************/ -/*** Hlavickovt soubor k DOSMEM.H ***/ -/************************************/ - - -typedef enum -{ DOS_MEMORY, - NEW, -} MEMORY_ITEMS; - -typedef struct -{ int EDI; - int ESI; - int EBP; - int reserved; - int EBX; - int EDX; - int ECX; - int EAX; - short int Flags; - short int ES; - short int DS; - short int GS; - short int IP; - short int CS; - short int SP; - short int SS; - } DPMIREGS; - -typedef struct -{ void *ptr; - int size; - int selector; //smysl jen u DOS_MEMORY - } MEMREC; - -#define D32RealSeg(P) ((((unsigned int)(P))>>4)&0xFFFF) -#define D32RealOff(P) (((unsigned int)(P))&0xF) - -int Selector; -DPMIREGS dpmiregs; - -void *mem_alloc(int size); -void mem_free(void *ptr); -void WtNs386(int IntNum, DPMIREGS *dpmiregs); - - diff --git a/VIDEO/FLC/ANALYSE/FLC.C b/VIDEO/FLC/ANALYSE/FLC.C deleted file mode 100644 index 5994eb7..0000000 --- a/VIDEO/FLC/ANALYSE/FLC.C +++ /dev/null @@ -1,5 +0,0 @@ -// -// Knihovna pro dekompresi FLC souboru -// - -#include "flc.h" diff --git a/VIDEO/FLC/ANALYSE/FLC.H b/VIDEO/FLC/ANALYSE/FLC.H deleted file mode 100644 index 15f903a..0000000 --- a/VIDEO/FLC/ANALYSE/FLC.H +++ /dev/null @@ -1,54 +0,0 @@ -// -// Hlavickovy soubor ke knihovne FLC.C slouzici k dekompresi FLC -// - -#ifndef _FLC_H -#define _FLC_H - -typedef struct FLCHEADER { - unsigned int size; // delka souboru vcetne hlavicky - unsigned short idflc; // ID FLC=0AF12h - unsigned short frames; // pocet frejmu - unsigned short width; // sirka vsech obrazku - unsigned short height; // vyska vsech obrazku - unsigned short color; // hloubka barvy (bpp) - unsigned short flag1; - unsigned int speed; // rychlost prehravani (v 1/1000 s) - unsigned short reserv1; // rezervovany - unsigned int date1; // datum a cas vytvoreni - unsigned int serial; // seriove cislo programu - unsigned int date2; // datum a cas posledni zmeny - unsigned short XA; - unsigned short YA; - char reserv2 [42]; // rezervovano - unsigned int offset1; // offset prvniho frame - unsigned int offset2; // offset druheho frame - char reserv3 [40]; // rezervovano - } flcheader; - -typedef struct FRAMEHEADER { - unsigned int size; // velikost frame v bytech - unsigned short sign; // znacka frame OFAF1h - unsigned short actions; // pocet akci v tomto frame - char reserv [8]; // rezervovano - } frameheader; - -typedef struct ACTIONHEADER { - unsigned int size; // velikost akce v bytech - unsigned short code; // kod akce - // 04h - predani casti nebo cele palety - // 07h - predavani zmenenych casti obrazu - // 0Dh - vymaze obrazovku - // 0Fh - cela obrazovka v RLE - // 10h - nekomprimovana kopie cele obrazovky - // nasleduji data akce - } actionheader; - -char frame_buffer [307200]; -char *flc_buffer; - -void Get_first_frame (void); -void Get_next_frame (void); -void Decompress_frame (void); - -#endif diff --git a/VIDEO/FLC/ANALYSE/PLAY.C b/VIDEO/FLC/ANALYSE/PLAY.C deleted file mode 100644 index d5aaca9..0000000 --- a/VIDEO/FLC/ANALYSE/PLAY.C +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include "flc.h" - -flcheader h_flc; -frameheader h_frame; -actionheader h_action; - - -void main (int argc, char *argv[]) -{ - FILE *flc; - long pozice; - int frames, actions, x, y; - - flc = fopen (argv[1], "rb"); - fread (&h_flc, sizeof(flcheader), 1, flc); - frames=h_flc.frames; - - printf ("\nHlavicka FLC souboru %s:\n", argv[1]); - printf ("Delka celeho souboru: %d\n", h_flc.size); - printf ("Pocet frame: %d\n", h_flc.frames); - printf ("Velikost filmu: %dx%d\n", h_flc.width, h_flc.height); - printf ("Hloubka barvy: %d\n", h_flc.color); - printf ("Rychlost prehravani: %d fps\n", 1000/h_flc.speed); - printf ("Offset prvniho frame: %d\n", h_flc.offset1); - - fseek (flc, h_flc.offset1, SEEK_SET); - for (x=0; x<=(frames-1); x++) - { - fread (&h_frame, sizeof(frameheader), 1, flc); - actions=h_frame.actions; - printf ("\nHlavicka %d framu:\n", x+1); - printf ("Velikost framu: %d\n", h_frame.size); - printf ("Pocet akci ve framu: %d\n", h_frame.actions); - - for (y=0; y<=(actions-1); y++) - { - pozice = ftell (flc); - fread (&h_action, sizeof(actionheader), 1, flc); - fseek (flc, (pozice+h_action.size), SEEK_SET); - printf ("\nHlavicka %d akce:\n", y+1); - printf ("Velikost dat pro tuto akci: %d\n", h_action.size); - printf ("Kod akce: %x\n", h_action.code); - } - getch (); - _clearscreen (_GCLEARSCREEN); - } - - fclose (flc); -} - - diff --git a/VIDEO/FLC/ANALYSE/VESA.C b/VIDEO/FLC/ANALYSE/VESA.C deleted file mode 100644 index a59e4d4..0000000 --- a/VIDEO/FLC/ANALYSE/VESA.C +++ /dev/null @@ -1,296 +0,0 @@ -/********************************/ -/* Prace se SVGA VESA adapterem */ -/********************************/ - -#include -#include -#include -#include -#include "vesa.h" -#include "dosmem.h" - - extern void wm_ChangeBank_(int bank); - #pragma aux (ASM) wm_ChangeBank_; - - -void Set_VESA_mode (int mode) -{ - union REGS r; - - r.w.ax=0x4f02; - r.w.bx=mode; - int386 (0x10, &r, &r); -} - - -void Show_screen (char *display) -{ - wm_ChangeBank_ (0); - memmove (0xa0000, display, 65536); - wm_ChangeBank_ (1); - memmove (0xa0000, (display+65536), 65536); - wm_ChangeBank_ (2); - memmove (0xa0000, (display+131072), 65536); - wm_ChangeBank_ (3); - memmove (0xa0000, (display+196608), 65536); - wm_ChangeBank_ (4); - memmove (0xa0000, (display+262144), 45056); -} - -void Put_image (int x, int y, int xlen, int ylen, char *image) -{ - int a,b,c,d; - long int posunuti=0; - int banka; - - if (y<103) {wm_ChangeBank_ (0); banka=0;} - if (y>103 && y<205) {wm_ChangeBank_ (1); banka=1;} - if (y>205 && y<308) {wm_ChangeBank_ (2); banka=2;} - if (y>308 && y<410) {wm_ChangeBank_ (3); banka=3;} - if (y>410) {wm_ChangeBank_ (4); banka=4;} - - for (a=0; a<=ylen; a++) - { - - d=y+a; - switch (d) - { - case 102: - if ((x+xlen)<256){ - posunuti=(y+a)*640+x; - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (1); banka=1;} - if (x>=256){ - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - } - if (x<256 && (x+xlen)>256){ - posunuti=(y+a)*640+x; b=x; c=0; - while (b!=256) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - case 204: - if ((x+xlen)<512){ - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (2); banka=2;} - if (x>=512){ - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<512 && (x+xlen)>512){ - posunuti=(((y+a)*640+x)-65536); b=x; c=0; - while (b!=512) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - case 307: - if ((x+xlen)<128){ - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (3); banka=3;} - if (x>=128){ - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<128 && (x+xlen)>128){ - posunuti=(((y+a)*640+x)-131072); b=x; c=0; - while (b!=128) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - case 409: - if ((x+xlen)<384){ - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (4); banka=4;} - if (x>=384){ - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<384 && (x+xlen)>384){ - posunuti=(((y+a)*640+x)-196608); b=x; c=0; - while (b!=384) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - default: - posunuti=(y+a)*640+x-banka*65536; - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - break; - }; - } -} - -void Get_image (int x, int y, int xlen, int ylen, char *image) -{ - int a,b,c,d; - long int posunuti=0; - int banka; - - if (y<103) {wm_ChangeBank_ (0); banka=0;} - if (y>103 && y<205) {wm_ChangeBank_ (1); banka=1;} - if (y>205 && y<308) {wm_ChangeBank_ (2); banka=2;} - if (y>308 && y<410) {wm_ChangeBank_ (3); banka=3;} - if (y>410) {wm_ChangeBank_ (4); banka=4;} - - for (a=0; a<=ylen; a++) - { - - d=y+a; - switch (d) - { - case 102: - if ((x+xlen)<256){ - posunuti=(y+a)*640+x; - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (1); banka=1;} - if (x>=256){ - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - } - if (x<256 && (x+xlen)>256){ - posunuti=(y+a)*640+x; b=x; c=0; - while (b!=256) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - case 204: - if ((x+xlen)<512){ - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (2); banka=2;} - if (x>=512){ - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<512 && (x+xlen)>512){ - posunuti=(((y+a)*640+x)-65536); b=x; c=0; - while (b!=512) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - case 307: - if ((x+xlen)<128){ - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (3); banka=3;} - if (x>=128){ - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<128 && (x+xlen)>128){ - posunuti=(((y+a)*640+x)-131072); b=x; c=0; - while (b!=128) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - case 409: - if ((x+xlen)<384){ - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (4); banka=4;} - if (x>=384){ - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<384 && (x+xlen)>384){ - posunuti=(((y+a)*640+x)-196608); b=x; c=0; - while (b!=384) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - default: - posunuti=(y+a)*640+x-banka*65536; - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - break; - }; - } - -} - - -void Get_VESA_info (void) -{ - char far *str; - VESA_INFO_BLOCK *p; - - p=(VESA_INFO_BLOCK *)mem_alloc(sizeof(VESA_INFO_BLOCK)); - - memset(&dpmiregs,0,sizeof(DPMIREGS)); - dpmiregs.EAX=0x00004f00; - dpmiregs.DS=D32RealSeg(p); - dpmiregs.ES=D32RealSeg(p); - dpmiregs.EDI=D32RealOff(p); - - WtNs386(0x10,&dpmiregs); - - str=(char far *)MK_FP(Selector,0); - _fmemcpy(&VesaInfoBlock,str,sizeof(VESA_INFO_BLOCK)); - - mem_free(p); - if(dpmiregs.EAX!=0x4f) - { - printf ("VESA Bios extension not found!!!!"); - exit (1); - } -} - - -void Get_mode_info (int mode) -{ - char far *str; - VESA_MODE_INFO_BLOCK *p; - - p=(VESA_MODE_INFO_BLOCK *)mem_alloc(sizeof(VESA_MODE_INFO_BLOCK)); - - memset(&dpmiregs,0,sizeof(DPMIREGS)); //nuluje registry - dpmiregs.EAX=0x00004f01; - dpmiregs.DS=D32RealSeg(p); - dpmiregs.ES=D32RealSeg(p); - dpmiregs.EDI=D32RealOff(p); - dpmiregs.ECX=mode; - - WtNs386(0x10,&dpmiregs); - - str=(char far *)MK_FP(Selector,0); - _fmemcpy(&VesaModeInfoBlock,str,sizeof(VESA_INFO_BLOCK)); - - _VGAGran=VesaModeInfoBlock.WinGranularity; - - mem_free(p); -} - diff --git a/VIDEO/FLC/ANALYSE/VESA.H b/VIDEO/FLC/ANALYSE/VESA.H deleted file mode 100644 index a0f12a2..0000000 --- a/VIDEO/FLC/ANALYSE/VESA.H +++ /dev/null @@ -1,70 +0,0 @@ -/********************************/ -/* Prace se SVGA VESA adapterem */ -/********************************/ - -#ifndef __VESA_H -#define __VESA_H - - -typedef struct -{ char VESASignature[4]; - short VESAversion; - unsigned OEMStringPtr; - char capabilities[4]; - short int *videomodeptr; - short int TotalMemory; - char dummy[236]; - } VESA_INFO_BLOCK; - -typedef struct -{ short unsigned ModeAttributes; - char WinAAttributes; - char WinBAttributes; - short unsigned WinGranularity; - short unsigned WinSize; - short unsigned WinASegment; - short unsigned WinBSegment; - short unsigned WinFuncPtroff; - short unsigned WinFuncPtrseg; - short unsigned BytesPerScanLine; - - short unsigned XResolution; - short unsigned YResolution; - char Xcharsize; - char Ycharsize; - char NumberOfPlanes; - char BitsPerPixel; - char NumberOfBanks; - char MemoryModel; - char BankSize; - char NumberOfImagePages; - char Reserved; - - char RedMaskSize; - char RedFieldPosition; - char GreenMaskSize; - char GreenFieldPosition; - char BlueMaskSize; - char BlueFieldPosition; - char RsvdMaskSize; - char DirectColorModeInfo; - char Dummy[216]; - } VESA_MODE_INFO_BLOCK; - - -VESA_MODE_INFO_BLOCK VesaModeInfoBlock; -VESA_INFO_BLOCK VesaInfoBlock; - -extern unsigned char _VGAPage=0; -extern unsigned char _VGAGran=0; - -void Set_VESA_mode (int mode); -void Show_screen (char *display); -void Get_VESA_info (void); -void Get_mode_info (int mode); - -void Put_image (int x, int y, int xlen, int ylen, char *image); -void Get_image (int x, int y, int xlen, int ylen, char *image); - -#endif - diff --git a/VIDEO/FLC/ANALYSE/VESA_.ASM b/VIDEO/FLC/ANALYSE/VESA_.ASM deleted file mode 100644 index d11920c..0000000 --- a/VIDEO/FLC/ANALYSE/VESA_.ASM +++ /dev/null @@ -1,63 +0,0 @@ -;EAX EDX EBX ECX -.386p -jumps -;############################################################################ -; Constanty -;############################################################################ - -dlt_x equ 640 -dlt_y equ 480 - -;############################################################################ -; Datovy segment -;############################################################################ -_DATA SEGMENT PARA PUBLIC USE32 'DATA' -align 4 - - -EXTRN __VGAPage:BYTE -EXTRN __VGAGran:BYTE - - -_DATA ENDS - -DGROUP GROUP _DATA - -;############################################################################ -; Kodovy segment -;############################################################################ -_TEXT SEGMENT PARA PUBLIC USE32 'CODE' - ASSUME cs:_TEXT, ds:_DATA - - - -public wm_ChangeBank__ -wm_ChangeBank__ PROC - - push es - pushad - - push eax - mov edx, eax - mov ebx, 0000h - mov eax, 4f05h - int 10h - - pop eax - mov edx, eax - mov ebx, 0001h - mov eax, 4f05h - int 10h - - popad - pop es - ret - -wm_ChangeBank__ endp -;---------------------------------------------------------------------------- - -_TEXT ENDS - -END - - diff --git a/VIDEO/FLC/DOSMEM.C b/VIDEO/FLC/DOSMEM.C deleted file mode 100644 index 752670a..0000000 --- a/VIDEO/FLC/DOSMEM.C +++ /dev/null @@ -1,71 +0,0 @@ -/*********************************************/ -/*** DOS memory allocation - DOSMEM.C ***/ -/*** vykostena verze chlumakova memalloc.c ***/ -/*********************************************/ - -#include -#include -#include -#include -#include "dosmem.h" - - -/*** Alokace pole v dolni pameti ***/ - -void *mem_alloc(int size) -{ - static union REGS r; - MEMREC memrec; - - r.x.eax=0x0100; - r.x.ebx=(size>>4)+1; - size=r.x.ebx<<4; - int386(0x31,&r,&r); - if (r.x.cflag) - { - printf ("No fucking DOS memory left!!!"); - exit(1); - } - memrec.ptr=(void *)((r.x.eax&0xFFFF)<<4); - Selector=memrec.selector=(short int)r.x.edx; - - return memrec.ptr; -} - - -/*** Uvolneni dolni pameti ***/ - -void mem_free(void *ptr) -{ - union REGS r; - - if(ptr!=NULL) - { - r.x.eax=0x0101; - r.x.edx=Selector; - int386(0x31,&r,&r); - if(r.x.cflag) - printf("Cannot free DOS memory!!!!"); - } - -} - - -/*** Vyvolani preruseni pomoci protected modu ***/ - -void WtNs386(int IntNum, DPMIREGS *dpmiregs) -{ - union REGS r; - struct SREGS sr; - - r.w.ax=0x300; - r.h.bl=(char)IntNum; - r.h.bh=0; - r.w.cx=0; - segread(&sr); - sr.es=FP_SEG(dpmiregs); - r.x.edi=FP_OFF(dpmiregs); - - int386x(0x31,&r,&r,&sr); -} - diff --git a/VIDEO/FLC/DOSMEM.H b/VIDEO/FLC/DOSMEM.H deleted file mode 100644 index b33588d..0000000 --- a/VIDEO/FLC/DOSMEM.H +++ /dev/null @@ -1,46 +0,0 @@ -/************************************/ -/*** Hlavickovt soubor k DOSMEM.H ***/ -/************************************/ - - -typedef enum -{ DOS_MEMORY, - NEW, -} MEMORY_ITEMS; - -typedef struct -{ int EDI; - int ESI; - int EBP; - int reserved; - int EBX; - int EDX; - int ECX; - int EAX; - short int Flags; - short int ES; - short int DS; - short int GS; - short int IP; - short int CS; - short int SP; - short int SS; - } DPMIREGS; - -typedef struct -{ void *ptr; - int size; - int selector; //smysl jen u DOS_MEMORY - } MEMREC; - -#define D32RealSeg(P) ((((unsigned int)(P))>>4)&0xFFFF) -#define D32RealOff(P) (((unsigned int)(P))&0xF) - -int Selector; -DPMIREGS dpmiregs; - -void *mem_alloc(int size); -void mem_free(void *ptr); -void WtNs386(int IntNum, DPMIREGS *dpmiregs); - - diff --git a/VIDEO/FLC/FLC.C b/VIDEO/FLC/FLC.C deleted file mode 100644 index 62e38b3..0000000 --- a/VIDEO/FLC/FLC.C +++ /dev/null @@ -1,176 +0,0 @@ -// -// Knihovna pro dekompresi FLC souboru -// - -#include -#include -#include -#include -#include -#include "flc.h" - - -void Open_FLC (char *filename) -{ - flc = fopen (filename, "rb"); - fread (&h_flc, sizeof(flcheader), 1, flc); -} - -void Close_FLC (void) -{ - fclose (flc); - free (flc_buffer); -} - -void Get_first_frame (void) -{ - fseek (flc, h_flc.offset1, SEEK_SET); - fread (&h_frame, sizeof(frameheader), 1, flc); - flc_buffer = (char*)malloc((h_frame.size-sizeof(frameheader))); - fread (flc_buffer, (h_frame.size-sizeof(frameheader)), 1, flc); -} - -void Get_next_frame (void) -{ - free (flc_buffer); - fread (&h_frame, sizeof(frameheader), 1, flc); - flc_buffer = (char*)malloc((h_frame.size-sizeof(frameheader))); - fread (flc_buffer, (h_frame.size-sizeof(frameheader)), 1, flc); -} - -void Decompress_frame (void) -{ - unsigned short x,y,z,w; - unsigned short changes, nfo_word, packets, offset, row; - int frame_pos=0; - unsigned int scr_pos; - char c1, c2, c3, a; - char hi, lo; - - for (z=1; z<=h_frame.actions; z++) - { - memmove ( &h_action, (flc_buffer+frame_pos), sizeof(actionheader) ); - switch (h_action.code) - { - case 4: - a=1;//fcl_buffer[frame_pos]; -// b=0;//flc_buffer[frame_pos]; -// c=256; //0=256 - - frame_pos+=10; - outp (0x3c8, 0); - for (x=0; x<=768; x++) outp (0x3c9, (flc_buffer[(x+frame_pos)]/=4) ); - frame_pos+=768; - break; - case 7: - frame_pos+=6; - lo=flc_buffer[frame_pos]; frame_pos++; - hi=flc_buffer[frame_pos]; frame_pos++; - changes=hi*256+lo; - row=0; - - for (y=0; y<=(changes-1); y++) // pocet menenych radek - { - lo=flc_buffer[frame_pos]; frame_pos++; - hi=flc_buffer[frame_pos]; frame_pos++; - nfo_word=hi*256+lo; - - scr_pos=row*h_flc.width; - - if (nfo_word>=0xC000) // preskakovane radky - { - nfo_word=0xFFFF-nfo_word+1; - row+=nfo_word; - } - - else - { - for (z=1; z<=nfo_word; z++) // pocet menenych bloku - { - x=1; a=0; - - offset = flc_buffer[frame_pos]; // rel. offset bloku - frame_pos++; - scr_pos+=offset; - -// while (!a) // zmena bloku -// { - c1 = flc_buffer[frame_pos]; - frame_pos++; - - if (c1>128) - { - c1=0xFF-c1+1; - c2=flc_buffer[frame_pos]; - frame_pos++; - c3=flc_buffer[frame_pos]; - frame_pos++; - - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=c2; - scr_pos++; - frame_buffer[scr_pos]=c3; - scr_pos++; } - } - else - { -// c3=0xFF-c3+1; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=flc_buffer[frame_pos]; - frame_pos++; - scr_pos++; - frame_buffer[scr_pos]=flc_buffer[frame_pos]; - frame_pos++; - scr_pos++; } - } - -// if (x>=640) a=1; -// } - - } - row++; - } - } - -// frame_pos+=h_action.size; - break; - case 15: - frame_pos+=6; - for (y=0; y<=(h_flc.height-1); y++) - { - frame_pos++; x=1; //a=0; - scr_pos=y*h_flc.width; - - while (x<=h_flc.width) - { - c1 = flc_buffer[frame_pos]; - frame_pos++; - - if (c1<128) - { - c2=flc_buffer[frame_pos]; - frame_pos++; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=c2; - scr_pos++; - x++; } - } - else - { - c1=0xFF-c1+1; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=flc_buffer[frame_pos]; - scr_pos++; - frame_pos++; - x++; } - } - } - } - break; - default: frame_pos+=h_action.size; - break; - }; - - } - -} diff --git a/VIDEO/FLC/FLC.H b/VIDEO/FLC/FLC.H deleted file mode 100644 index 012a222..0000000 --- a/VIDEO/FLC/FLC.H +++ /dev/null @@ -1,61 +0,0 @@ -// -// Hlavickovy soubor ke knihovne FLC.C slouzici k dekompresi FLC -// - -#ifndef _FLC_H -#define _FLC_H - -typedef struct FLCHEADER { - unsigned int size; // delka souboru vcetne hlavicky - unsigned short idflc; // ID FLC=0AF12h - unsigned short frames; // pocet frejmu - unsigned short width; // sirka vsech obrazku - unsigned short height; // vyska vsech obrazku - unsigned short color; // hloubka barvy (bpp) - unsigned short flag1; - unsigned int speed; // rychlost prehravani (v 1/1000 s) - unsigned short reserv1; // rezervovany - unsigned int date1; // datum a cas vytvoreni - unsigned int serial; // seriove cislo programu - unsigned int date2; // datum a cas posledni zmeny - unsigned short XA; - unsigned short YA; - char reserv2 [42]; // rezervovano - unsigned int offset1; // offset prvniho frame - unsigned int offset2; // offset druheho frame - char reserv3 [40]; // rezervovano - } flcheader; - -typedef struct FRAMEHEADER { - unsigned int size; // velikost frame v bytech - unsigned short sign; // znacka frame OFAF1h - unsigned short actions; // pocet akci v tomto frame - char reserv [8]; // rezervovano - } frameheader; - -typedef struct ACTIONHEADER { - unsigned int size; // velikost akce v bytech - unsigned short code; // kod akce - // 04h - predani casti nebo cele palety - // 07h - predavani zmenenych casti obrazu - // 0Dh - vymaze obrazovku - // 0Fh - cela obrazovka v RLE - // 10h - nekomprimovana kopie cele obrazovky - // nasleduji data akce - } actionheader; - -FILE *flc; -flcheader h_flc; -frameheader h_frame; -actionheader h_action; -char frame_buffer [307205]; -char *flc_buffer; -//unsigned int ladici; - -void Open_FLC (char *filename); -void Close_FLC (void); -void Get_first_frame (void); -void Get_next_frame (void); -void Decompress_frame (void); - -#endif diff --git a/VIDEO/FLC/PLAY.C b/VIDEO/FLC/PLAY.C deleted file mode 100644 index 3138bf2..0000000 --- a/VIDEO/FLC/PLAY.C +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include -#include "flc.h" -#include "vesa.h" - -void Set_TEXT_mode (void); - -void main (int argc, char *argv[]) -{ - int x; - - Open_FLC (argv[1]); - - printf ("\nHlavicka FLC souboru %s:\n", argv[1]); - printf ("Delka celeho souboru: %d\n", h_flc.size); - printf ("Pocet frame: %d\n", h_flc.frames); - printf ("Velikost filmu: %dx%d\n", h_flc.width, h_flc.height); - printf ("Hloubka barvy: %d\n", h_flc.color); -// printf ("Rychlost prehravani: %d fps\n", 1000/h_flc.speed); - printf ("Offset prvniho frame: %d\n", h_flc.offset1); - getch (); - - Set_VESA_mode (0x101); - delay (1000); - - Get_first_frame (); - Decompress_frame (); - Show_screen (frame_buffer); - - for (x=2; x<=h_flc.frames; x++) - { - Get_next_frame (); - Decompress_frame (); - Show_screen (frame_buffer); - delay (7); - } - getch (); - - Set_TEXT_mode (); - Close_FLC (); -} - -void Set_TEXT_mode (void) -{ - union REGS inr, outr; - - inr.h.ah = 0x00; - inr.h.al = 03; - int386 (0x10, &inr, &outr); -} - - diff --git a/VIDEO/FLC/VESA.C b/VIDEO/FLC/VESA.C deleted file mode 100644 index a59e4d4..0000000 --- a/VIDEO/FLC/VESA.C +++ /dev/null @@ -1,296 +0,0 @@ -/********************************/ -/* Prace se SVGA VESA adapterem */ -/********************************/ - -#include -#include -#include -#include -#include "vesa.h" -#include "dosmem.h" - - extern void wm_ChangeBank_(int bank); - #pragma aux (ASM) wm_ChangeBank_; - - -void Set_VESA_mode (int mode) -{ - union REGS r; - - r.w.ax=0x4f02; - r.w.bx=mode; - int386 (0x10, &r, &r); -} - - -void Show_screen (char *display) -{ - wm_ChangeBank_ (0); - memmove (0xa0000, display, 65536); - wm_ChangeBank_ (1); - memmove (0xa0000, (display+65536), 65536); - wm_ChangeBank_ (2); - memmove (0xa0000, (display+131072), 65536); - wm_ChangeBank_ (3); - memmove (0xa0000, (display+196608), 65536); - wm_ChangeBank_ (4); - memmove (0xa0000, (display+262144), 45056); -} - -void Put_image (int x, int y, int xlen, int ylen, char *image) -{ - int a,b,c,d; - long int posunuti=0; - int banka; - - if (y<103) {wm_ChangeBank_ (0); banka=0;} - if (y>103 && y<205) {wm_ChangeBank_ (1); banka=1;} - if (y>205 && y<308) {wm_ChangeBank_ (2); banka=2;} - if (y>308 && y<410) {wm_ChangeBank_ (3); banka=3;} - if (y>410) {wm_ChangeBank_ (4); banka=4;} - - for (a=0; a<=ylen; a++) - { - - d=y+a; - switch (d) - { - case 102: - if ((x+xlen)<256){ - posunuti=(y+a)*640+x; - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (1); banka=1;} - if (x>=256){ - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - } - if (x<256 && (x+xlen)>256){ - posunuti=(y+a)*640+x; b=x; c=0; - while (b!=256) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - case 204: - if ((x+xlen)<512){ - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (2); banka=2;} - if (x>=512){ - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<512 && (x+xlen)>512){ - posunuti=(((y+a)*640+x)-65536); b=x; c=0; - while (b!=512) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - case 307: - if ((x+xlen)<128){ - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (3); banka=3;} - if (x>=128){ - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<128 && (x+xlen)>128){ - posunuti=(((y+a)*640+x)-131072); b=x; c=0; - while (b!=128) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - case 409: - if ((x+xlen)<384){ - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (4); banka=4;} - if (x>=384){ - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<384 && (x+xlen)>384){ - posunuti=(((y+a)*640+x)-196608); b=x; c=0; - while (b!=384) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - default: - posunuti=(y+a)*640+x-banka*65536; - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - break; - }; - } -} - -void Get_image (int x, int y, int xlen, int ylen, char *image) -{ - int a,b,c,d; - long int posunuti=0; - int banka; - - if (y<103) {wm_ChangeBank_ (0); banka=0;} - if (y>103 && y<205) {wm_ChangeBank_ (1); banka=1;} - if (y>205 && y<308) {wm_ChangeBank_ (2); banka=2;} - if (y>308 && y<410) {wm_ChangeBank_ (3); banka=3;} - if (y>410) {wm_ChangeBank_ (4); banka=4;} - - for (a=0; a<=ylen; a++) - { - - d=y+a; - switch (d) - { - case 102: - if ((x+xlen)<256){ - posunuti=(y+a)*640+x; - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (1); banka=1;} - if (x>=256){ - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - } - if (x<256 && (x+xlen)>256){ - posunuti=(y+a)*640+x; b=x; c=0; - while (b!=256) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - case 204: - if ((x+xlen)<512){ - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (2); banka=2;} - if (x>=512){ - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<512 && (x+xlen)>512){ - posunuti=(((y+a)*640+x)-65536); b=x; c=0; - while (b!=512) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - case 307: - if ((x+xlen)<128){ - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (3); banka=3;} - if (x>=128){ - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<128 && (x+xlen)>128){ - posunuti=(((y+a)*640+x)-131072); b=x; c=0; - while (b!=128) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - case 409: - if ((x+xlen)<384){ - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (4); banka=4;} - if (x>=384){ - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<384 && (x+xlen)>384){ - posunuti=(((y+a)*640+x)-196608); b=x; c=0; - while (b!=384) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - default: - posunuti=(y+a)*640+x-banka*65536; - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - break; - }; - } - -} - - -void Get_VESA_info (void) -{ - char far *str; - VESA_INFO_BLOCK *p; - - p=(VESA_INFO_BLOCK *)mem_alloc(sizeof(VESA_INFO_BLOCK)); - - memset(&dpmiregs,0,sizeof(DPMIREGS)); - dpmiregs.EAX=0x00004f00; - dpmiregs.DS=D32RealSeg(p); - dpmiregs.ES=D32RealSeg(p); - dpmiregs.EDI=D32RealOff(p); - - WtNs386(0x10,&dpmiregs); - - str=(char far *)MK_FP(Selector,0); - _fmemcpy(&VesaInfoBlock,str,sizeof(VESA_INFO_BLOCK)); - - mem_free(p); - if(dpmiregs.EAX!=0x4f) - { - printf ("VESA Bios extension not found!!!!"); - exit (1); - } -} - - -void Get_mode_info (int mode) -{ - char far *str; - VESA_MODE_INFO_BLOCK *p; - - p=(VESA_MODE_INFO_BLOCK *)mem_alloc(sizeof(VESA_MODE_INFO_BLOCK)); - - memset(&dpmiregs,0,sizeof(DPMIREGS)); //nuluje registry - dpmiregs.EAX=0x00004f01; - dpmiregs.DS=D32RealSeg(p); - dpmiregs.ES=D32RealSeg(p); - dpmiregs.EDI=D32RealOff(p); - dpmiregs.ECX=mode; - - WtNs386(0x10,&dpmiregs); - - str=(char far *)MK_FP(Selector,0); - _fmemcpy(&VesaModeInfoBlock,str,sizeof(VESA_INFO_BLOCK)); - - _VGAGran=VesaModeInfoBlock.WinGranularity; - - mem_free(p); -} - diff --git a/VIDEO/FLC/VESA.H b/VIDEO/FLC/VESA.H deleted file mode 100644 index a0f12a2..0000000 --- a/VIDEO/FLC/VESA.H +++ /dev/null @@ -1,70 +0,0 @@ -/********************************/ -/* Prace se SVGA VESA adapterem */ -/********************************/ - -#ifndef __VESA_H -#define __VESA_H - - -typedef struct -{ char VESASignature[4]; - short VESAversion; - unsigned OEMStringPtr; - char capabilities[4]; - short int *videomodeptr; - short int TotalMemory; - char dummy[236]; - } VESA_INFO_BLOCK; - -typedef struct -{ short unsigned ModeAttributes; - char WinAAttributes; - char WinBAttributes; - short unsigned WinGranularity; - short unsigned WinSize; - short unsigned WinASegment; - short unsigned WinBSegment; - short unsigned WinFuncPtroff; - short unsigned WinFuncPtrseg; - short unsigned BytesPerScanLine; - - short unsigned XResolution; - short unsigned YResolution; - char Xcharsize; - char Ycharsize; - char NumberOfPlanes; - char BitsPerPixel; - char NumberOfBanks; - char MemoryModel; - char BankSize; - char NumberOfImagePages; - char Reserved; - - char RedMaskSize; - char RedFieldPosition; - char GreenMaskSize; - char GreenFieldPosition; - char BlueMaskSize; - char BlueFieldPosition; - char RsvdMaskSize; - char DirectColorModeInfo; - char Dummy[216]; - } VESA_MODE_INFO_BLOCK; - - -VESA_MODE_INFO_BLOCK VesaModeInfoBlock; -VESA_INFO_BLOCK VesaInfoBlock; - -extern unsigned char _VGAPage=0; -extern unsigned char _VGAGran=0; - -void Set_VESA_mode (int mode); -void Show_screen (char *display); -void Get_VESA_info (void); -void Get_mode_info (int mode); - -void Put_image (int x, int y, int xlen, int ylen, char *image); -void Get_image (int x, int y, int xlen, int ylen, char *image); - -#endif - diff --git a/VIDEO/FLC/VESA_.ASM b/VIDEO/FLC/VESA_.ASM deleted file mode 100644 index d11920c..0000000 --- a/VIDEO/FLC/VESA_.ASM +++ /dev/null @@ -1,63 +0,0 @@ -;EAX EDX EBX ECX -.386p -jumps -;############################################################################ -; Constanty -;############################################################################ - -dlt_x equ 640 -dlt_y equ 480 - -;############################################################################ -; Datovy segment -;############################################################################ -_DATA SEGMENT PARA PUBLIC USE32 'DATA' -align 4 - - -EXTRN __VGAPage:BYTE -EXTRN __VGAGran:BYTE - - -_DATA ENDS - -DGROUP GROUP _DATA - -;############################################################################ -; Kodovy segment -;############################################################################ -_TEXT SEGMENT PARA PUBLIC USE32 'CODE' - ASSUME cs:_TEXT, ds:_DATA - - - -public wm_ChangeBank__ -wm_ChangeBank__ PROC - - push es - pushad - - push eax - mov edx, eax - mov ebx, 0000h - mov eax, 4f05h - int 10h - - pop eax - mov edx, eax - mov ebx, 0001h - mov eax, 4f05h - int 10h - - popad - pop es - ret - -wm_ChangeBank__ endp -;---------------------------------------------------------------------------- - -_TEXT ENDS - -END - - diff --git a/VIDEO/FLC2MGIF.C b/VIDEO/FLC2MGIF.C deleted file mode 100644 index 1bdc571..0000000 --- a/VIDEO/FLC2MGIF.C +++ /dev/null @@ -1,620 +0,0 @@ -// MOTION GIF - LZW komprimovana animace v rozliseni 320x180 256 barev avsak -// upravena pro prehravani v HICOLOR pro konkretni rezim (32768 barev) - - -// Format - /* - - [ FRAME ] - [CHUNK] !pozor delka je 3 bajtova (tj 16MB) - 0 - PRADNY CHUNK - 1 - LZW FULL SCREEN - 2 - MGIF DELTA - 3 - HICOLOR PALETE - 4 - SOUND TRACK - 5 - TEXT TRACK - 6 - MGIF COPY - 7 - SOUND INIT - - Popis Chunku: - PRAZDNY_CHUNK - muze obsahovat soukrome informace - - LZW_FULL_SCREEN - - ihned za hlavickou nasleduje LZW komprimovany obrazek - v rozliseni 320x180 256 barev - - MGIF_DELTA - - cely blok je LZW komprimovany. Po dekomprimace blok obsahuje - dva druhy informaci. Prvni DWORD je ofset od pocatku dat - ktery ukazuje na zacatek graficke informace. Po tomto - DWORDU jsou ulozeny data o umisteni grafickych bodu v obrazu - Prvni byte znaci, kolik je nutne preskocit slov. (tj *2 byte) - Dalsi byte znaci, kolik je nutne zapsat slov (tj *2 byte) - Po tomto bytu je nutne prenest presne tolik slov z - grafickeho bloku na obrazovku. Dvojice bajtu se opakuji - dokud ani jeden z nich nema nejvyssi 2 bity nastavene. - Pak tento byte znaci ze uz na radce nic vic neni. Dolni cast - byte (tj 6 bitu) pak udava pocet radku, ktere je treba pre- - skocit. (nula=zadny). - - HICOLOR PALETTE - - Prvni byte znamena pocet aktivnich barev. Pak nasleduje - paleta ve formatu xRRRRRGGGGGBBBBB. Rozdil oproti vsem - beznym paletam je v tom ze neni treba v palete udrzovat - barvy, ktere uz na obrazovce jsou, protoze zmena palety - se neprojevi na jiz zobrazenem obrazku. - - SOUND_TRACK - - Kazdy frame obsahuje zvukovou stopu. Je to RAW format. - Pro verzi MGIF97 zde je zvukova informace ulozena ve - zvukove kvalite 16-bit stereo 22000Khz, ovsem komprimovana - na 50% jako MUS. - TEXT_TRACK - - Navic je ve mozne ve frame umistit textovou zpravu (titulek) - Prvni WORD udava dobu zobrazeni (pocet frame). - Pote nasleduje text zakoncen znakem 0; - - MGIF_COPY - Za timto CHUNKEM je ulozen blok dat v nezakomprimovanem - tvaru(tj 57600byte); - - - - */ - -#include -#include -#include -#include -#include -#include -#include "flc.h" -#include "lzw.h" -#include - -#define MGIF "MGIF" -#define MGIF_Y "97" -#define VER 0x100 - -#define MGIF_EMPTY 0 -#define MGIF_LZW 1 -#define MGIF_DELTA 2 -#define MGIF_PAL 3 -#define MGIF_SOUND 4 -#define MGIF_TEXT 5 -#define MGIF_COPY 6 -#define MGIF_SINIT 7 - -#define FRAME_X 320 -#define FRAME_Y 180 -#define FRAME_LEN (FRAME_X*FRAME_Y) -#define DELTA_LEN (3*FRAME_LEN) -#define LZW_LEN (2*FRAME_LEN) - -#define SOUND_SPEED 44100 -#define PRE_SOUND ((256*1024)/2) - -#define ZTRATA lowq -#define BZTRATA colorq -#define MAX_FRAME max_fr -#define MIN_FRAME min_fr - -short mult_table[64]; -short square_table[4096]; - -typedef struct mgif_header - { - char sign[4]; - char year[2]; - char eof; - word ver; - long frames; - word snd_chans; - int snd_freq; - short ampl_table[256]; - short reserved[32]; - }; - -word last_frame[FRAME_Y][FRAME_X]; -char frame_delta[FRAME_LEN]; -char delta_data[DELTA_LEN]; -word color_state[32*32+32*32+32*32]; -char calc_data[FRAME_LEN]; -int delta_data_size; -int frame_delta_size; -int speed=20; - -int last_frame_size; -int total_frames; - -int lowq=0; -int colorq=0; -int max_fr=999999; -int min_fr=0; - -int hranice; -int hdiff=0; - -struct mgif_header gh; - -char lzw_buffer[LZW_LEN]; - -char pal_use[256],color_map[256]; -word hipal[256],max_colors; - - -FILE *mgf; - -long of_pos; -int of_chunks; - -void open_frame() - { - of_chunks=0; - of_pos=ftell(mgf); - fwrite(&of_pos,1,4,mgf); - } - -void close_frame() - { - long fsize,p; - - last_frame_size=fsize=(p=ftell(mgf))-of_pos-4; - fseek(mgf,of_pos,SEEK_SET); - fwrite(&of_chunks,1,1,mgf); - fwrite(&fsize,1,3,mgf); - fseek(mgf,p,SEEK_SET); - total_frames++; - } - - -void write_chunk(char action,long size,void *data) - { - fwrite(&action,1,1,mgf); - fwrite(&size,1,3,mgf); - fwrite(data,1,size,mgf); - of_chunks++; - } - - -void conv_2_hicolor() - { - int i,r,g,b; - for(i=0;i<256;i++) - { - r=(flc_paleta[i][0]>>3); - g=(flc_paleta[i][1]>>3); - b=(flc_paleta[i][2]>>3); - hipal[i]=((r<<10)+(g<<5)+b); - } - } - -char find_color(word c); //najde barvu v palete a vraci byte -#pragma aux find_color parm [eax]=\ - "mov edi,offset hipal"\ - "mov ecx,256"\ - "repne scasw"\ - "mov eax,edi"\ - "sub eax,offset hipal"\ - "shr eax,1"\ - "dec eax"\ - value [al] modify[edi ecx]; - - -void init_palmap() - { - int i; - memset(pal_use,0,sizeof(pal_use)); // nuluj pristupy k barvam - for(i=0;i<256;i++) color_map[i]=find_color(hipal[i]); //redukuj paletu; - max_colors=256; // pocet barev zatim 256; - } - -char test_transp(char c,word w) - { - int r1,g1,b1; - int r2,g2,b2; - int diff; - - r1=flc_paleta[c][0]>>3; - g1=flc_paleta[c][1]>>3; - b1=flc_paleta[c][2]>>3; - w&=0x7fff; - b2=w;g2=b2>>5;r2=g2>>5;b2&=0x1f;g2&=0x1f; - r1-=r2;g1-=g2;b1-=b2; - diff=abs(r1)+abs(g1<<1)+abs(b1); - return diff<=hranice; - } - -void create_delta(char *frame_buffer) - { - char *delta; - char *data; - long colors2; - int x,y; - word *p; - char skip,skc,cpc; - char c1,c2,*a,d; - - delta=delta_data; - data=frame_delta; - a=frame_buffer; - for(y=0;y<180;y++) - { - p=&last_frame[y]; - skip=1; - skc=0; - cpc=0; - for(x=0;x<160;x++) - { - c1=*a++;c2=*a++; - c1=color_map[c1]; - c2=color_map[c2]; - d=test_transp(c1,p[0]) && test_transp(c2,p[1]); - if (d!=skip) - { - if (skip) *delta++=skc;else *delta++=cpc; - skip=!skip;skc=0;cpc=0; - } - if (!skip) - { - *data++=c1; - *data++=c2; - colors2=hipal[c1]+(hipal[c2]<<16); - *(long *)p=colors2; - cpc++; - } - else skc++; - p+=2; - pal_use[c1]=1; - pal_use[c2]=1; - } - if (!skip) *delta++=cpc; - if (skc==160 && *(delta-1)!=0xff && delta!=delta_data) delta[-1]++; //preskoc n radek - else *delta++=0xc0; //oznac konec radky - } - delta_data_size=delta-delta_data; - frame_delta_size=data-frame_delta; - } - - -void reduce_palette() //redukuje paletu na nejmensi nutny pocet barev - { - int i,j; - for(i=0,j=0;i<256;i++) - { - if (pal_use[i]) - { - hipal[j]=hipal[i]; - color_map[i]=j++; - } - } - max_colors=j; - } - -void filter_colors(void *block,int size,void *colormap); //prefiltruje blok dat podle color_map -#pragma aux filter_colors parm [edi][ecx][ebx]=\ - "lp1: mov al,[edi]"\ - " xlatb"\ - " stosb"\ - " loop lp1"\ - modify [eax]; - - -void *join_two_blocks(void *d1,void *d2,int siz1,int siz2,long *celk) - { - long siz; - char *d; - void *x; - - siz=siz1+siz2+4; - d=(char *)getmem(siz); - x=d; - memcpy(d,&siz1,4);d+=4; - memcpy(d,d1,siz1);d+=siz1; - memcpy(d,d2,siz2); - *celk=siz; - return x; - } - -void create_last_frame(void *source,void *target,void *pal,int size); -#pragma aux create_last_frame parm [esi][edi][ebx][ecx]=\ - "lp1: lodsb"\ - " movzx eax,al"\ - " mov eax,[eax*2+ebx]"\ - " stosw"\ - " loop lp1"\ - modify[eax] - - -void create_mgif_pal() - { - write_chunk(MGIF_PAL,max_colors*2,hipal); - } - - -void create_mgif_lzw() - { - int siz; - - conv_2_hicolor(); - init_palmap(); - create_mgif_pal(); - filter_colors(frame_buffer,FRAME_LEN,color_map); - create_last_frame(frame_buffer,last_frame,hipal,FRAME_LEN); - init_lzw_compressor(8); - memset(lzw_buffer,0,sizeof(lzw_buffer)); - siz=lzw_encode(frame_buffer,lzw_buffer,FRAME_LEN); - if (siz>FRAME_LEN) write_chunk(MGIF_COPY,FRAME_LEN,frame_buffer); - else write_chunk(MGIF_LZW,siz,lzw_buffer); - done_lzw_compressor(8); - } - - -void create_color_state() - { - int i; - int r1,g1,b1; - int r2,g2,b2; - int diff; - char *c; - word *w; - - memset(color_state,0,sizeof(color_state)); - c=frame_buffer; - w=last_frame; - for(i=0;i>3; - g1=flc_paleta[*c][1]>>3; - b1=flc_paleta[*c][2]>>3; - b2=*w;g2=b2>>5;r2=g2>>5;b2&=0x1f;g2&=0x1f; - r1-=r2;g1-=g2;b1-=b2; - diff=abs(r1)+abs(g1<<1)+abs(b1); - color_state[diff]++; - c++;w++; - } - } - -void set_max_color_change(int cchange) - { - int i,s; - - s=0;cchange=57600-cchange; - for(i=sizeof(color_state)/sizeof(word)-1;s0;i--) s+=color_state[i]; - if (s>=cchange) i++; - hranice=i+hdiff;if (hranice<0) hranice=0; - } - -int rozptyl(int v1,int v2) - { - int c1,c2,x,s; - x=v1+v2>>1; - c1=(x-v1); - c2=(x-v2); - s=c1*c1+c2*c2; - return s; - } - -void create_low_quality() - { - void *snd;int l; - char *sn,*sr,c1,c2; - int rs,bs,gs; - - l=FRAME_LEN; - sr=frame_buffer; - snd=calc_data; - sn=(char *)snd; - l--; - while (l--) - { - c1=*sr++; - c2=*sr; - rs=rozptyl(flc_paleta[c1][0],flc_paleta[c2][0]); - gs=rozptyl(flc_paleta[c1][1],flc_paleta[c2][1]); - bs=rozptyl(flc_paleta[c1][2],flc_paleta[c2][2]); - if (rs+gs+bsFRAME_LEN) - { - create_mgif_lzw(); - return; - } - if (!frame_delta_size) return; - reduce_palette(); - filter_colors(frame_delta,frame_delta_size,color_map); - d=join_two_blocks(delta_data,frame_delta,delta_data_size,frame_delta_size,&siz); - init_lzw_compressor(8); - memset(lzw_buffer,0,sizeof(lzw_buffer)); - siz=lzw_encode(d,lzw_buffer,siz); - done_lzw_compressor(); - free(d); - if (siz>FRAME_LEN) - { - create_mgif_lzw(); - return; - } - create_mgif_pal(); - write_chunk(MGIF_DELTA,siz,lzw_buffer); - } - -void create_sound_track(int size) - { - void *p; - - p=getmem(size); - memset(p,0,size); - write_chunk(MGIF_SOUND,size,p); - free(p); - } - -void reserve_track() - { - int size; - - size=SOUND_SPEED/speed; - size&=~1; - create_sound_track(size); - } - -void prereserve_tracks() - { - int size; - int celk; - - size=SOUND_SPEED/speed; - size&=~1; - celk=PRE_SOUND; - while (celk-size>0) - { - open_frame(); - create_sound_track(size); - close_frame(); - celk-=size; - } - if (celk) - { - open_frame(); - create_sound_track(celk); - close_frame(); - } - } - -void fill_header(int frames) - { - memset(&gh,0,sizeof(gh)); - strncpy(gh.sign,MGIF,4); - strncpy(gh.year,MGIF_Y,2); - gh.eof=26; - gh.ver=VER; - gh.frames=frames; - } - - - -void show_screen() - { - word *c; - int i,j; - word *w; - - c=last_frame; - w=screen; - for(i=0;i<180;i++) - { - for(j=0;j<320;j++) - { - *w++=*c; - *w++=*c; - c++; - } - w+=640; - } - showview(0,0,640,360); - showview(0,400,200,20); - } - - -void write_frame_size(int i,int col) - { - char s[20]; - curcolor=0;bar(0,400,200,420); - sprintf(s,"%d %d %d",i,col,hranice);position(0,400);outtext(s); - } - -compress_flc(char *name) - { - int x; - - Open_FLC (name); - charcolors[0]=0; - charcolors[1]=0x7fff; - Get_first_frame (); - Decompress_frame (); - curcolor=0;bar(0,0,639,479); - open_frame(); - create_mgif_lzw(); - close_frame();write_frame_size(last_frame_size,max_colors); - show_screen(); - for (x=2; x<=h_flc.frames; x++) - { - Get_next_frame (); - Decompress_frame (); - open_frame(); - create_mgif_delta(); - close_frame(); - write_frame_size(last_frame_size,max_colors); - if (last_frame_size>MAX_FRAME) hdiff++; - else if (last_frame_size0) hdiff--; - else if (hdiff>0) hdiff--;else if(hdiff<0) hdiff++; - show_screen (); - } - Close_FLC(); - } - -void create_mgf_file(char *name) - { - mgf=fopen(name,"wb+"); - fwrite(&gh,1,sizeof(gh),mgf); - total_frames=0; - } - - -void close_mgf_file() - { - fseek(mgf,0,SEEK_SET); - fill_header(total_frames); - fwrite(&gh,1,sizeof(gh),mgf); - fclose(mgf); - } - - -void create_mult_and_square() - { - int i; - - puts("Creating tables..."); - for(i=0;i<64;i++) mult_table[i]=(short)((i-32)*(i-32)); - for(i=0;i<4096;i++) square_table[i]=(short)sqrt(i); - } - -extern int sada7; - - -main(int argc,char *argv[]) - { - puts("\n(C)1997 Komprimator Motion GIF v0.9 by Ondrej Novak"); - if (argc<3) - { - puts("Pouziti:");putchar('\n');; - puts("FLCMGIF source.flc target.mgf");putchar('\n'); - puts("Tento program generuje soubor MGF z originalniho FLC bez vkladani\n" - "prazdne zvukove stopy a bez ztratove kompresse (pouze convertor)"); - exit(0); - } - create_mgf_file(argv[2]); - initmode32(); - curfont=(void *)&sada7; - compress_flc(argv[1]); - closemode(); - puts("Zaviram Motion GIF..."); - close_mgf_file(); - } diff --git a/VIDEO/JPEGMGFA.ASM b/VIDEO/JPEGMGFA.ASM deleted file mode 100644 index 3982494..0000000 --- a/VIDEO/JPEGMGFA.ASM +++ /dev/null @@ -1,119 +0,0 @@ -.model small -.386 -;16 bit line (de)comprimator -; -DGROUP group _DATA - -extrn _cos_tab:word; - -extrn _line_skip:dword -extrn _xlat_table:dword - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - -ADDC macro REG1,REG2,CLIP - local addc1 - add REG1,REG2 - jno addc1 - shl REG2,1 - Mov REG2,CLIP - adc REG2,0 - mov REG1,REG2 -addc1: - endm - -;cos_tab maji format: - -; adresa = pqii (hex) -; p=pozice bodu (0-15 rozdeleno na yyxx) -; q=pozice harmonicke (0-15 je rozdeleno podle code_tabs) -; i=amplituda harmonicke(0-255); -; -; hodnoty jsou FIXED real (reprezentovane v short) -; vysledek je nutne podelit 32; - - -unpack_quant macro - local upqlp1 - ;ah - point - ;vraci dh - bod - ;cl - block_size - ;esi - quant_list - lea ebx,_cos_tab;vem adresu _cos_tab - shl ah,4 ;presun pozici bodu do mista p - and eax,0xf000h ;odmaskuj zbytek - xor ebp,ebp ;vynuluj akumulator (ebp) -upqlp1: lodsb ;vem hodnotu harmonicke na pozici ii - add ebp,[ebx+eax*4];pricti k bp obsah v cos_tab - add eax,0100h ;zvys q - dec cl ;kontrola konce retezce - jnz upqlp1 - sar ebp,9 ;vysledek podel 128 (32*4) - mov eax,ebp ;vysledek je v al -endm - -public unpack_block_ -unpack_block_: ;esi - data - ;edi - out - ;ecx - size - push ebp ;uchovej ebp - mov ch,cl ;uchovej velikost retezce v ch - mov dl,0 ;dl je pozice bodu - mov dh,16 ;dh je pocet bodu -upblck1:push esi ;uchovej esi - mov ah,dl ;napln ah pozici bodu - mov cl,ch ;napln cl delko - unpack_quant ;volej makro pro vypocet bodu - pop esi ;obnov esi - add [edi],al;zapis vysledny bod (vysetruj jako rozdil od predchoziho) - inc edi - inc dl ;presun se na dalsi pozici - dec dh ;sniz citac - jnz upblck1 ;opakuj - pop ebp ;obnov ebp - ret - -public konv_iyg_hicolor_ ;esi - block i - ;edx - block r+b - ;ebx - block g+b - ;edi - out(screen) (hicolor xRRRRRGGGGGBBBBB -konv_iyg_hicolor_: - push ebp - mov ebp,ebx - lea ebx,_xlat_table - mov cl,16 ;celkem ctverec 4x4 -kiyglp1:mov ch,[esi] ;ch obsahuje intenzitu - mov al,ch ;zkopiruj ch do registru pro R G (ch je B) - mov ah,ch - sub ah,[edx] ;vypocet R (I-(R+B)) R+B=[ebp] - sub ch,[ds:ebp] ;vypocet G - sub al,ah ;vypocet B (I-R-G) - sub al,ch - xlatb - xchg ch,al - xlatb - xchg al,ah - xlatb - xchg al,ah - shl al,3 ;al<<3 000RRRRRGGGGG000 eax - shl eax,2 ;ax<<2 0RRRRRGGGGG00000 eax - or al,ch ;or ch 0RRRRRGGGGGBBBBB eax - stosw ;zapis dva body - stosw - inc esi ;zvys indexy do bufferu - inc edx - inc ebp - dec cl ;sniz citac - test cl,3 ;test na dolni 2 bity, pri 0 jdeme na dalsi radek - jnz kiyglp1 - mov eax,_line_skip ;delka obrazovky - sub eax,16 ;odecti celkem 4*2*2=16 byte - add edi,eax ;pricti k ukazateli na obrazovku - or cl,cl ;test na cl==0 - jnz kiyglp1 ;kdyz je pozitivni tak konec - pop ebp - ret -_TEXT ends -end diff --git a/VIDEO/JPEGMGIF.C b/VIDEO/JPEGMGIF.C deleted file mode 100644 index dc2590e..0000000 --- a/VIDEO/JPEGMGIF.C +++ /dev/null @@ -1,172 +0,0 @@ -#include -#include -#include -#include "jpegmgif.h" - -typedef short C_MATICE[4][4]; -typedef float R_MATICE[4][4]; -/* -C_MATICE quant= - { - {16,10,24,51}, - {14,16,40,69}, - {18,37,68,103}, - {49,78,103,120}, - }; -*/ -C_MATICE quant= - { - {2,2,4,24}, - {2,4,8,26}, - {4,8,50,80}, - {8,30,80,88}, - }; - -char xlat_table[256]; - -char code_tab[][2]= - { - {0,0},{1,0},{0,1},{0,2},{1,1},{2,0},{3,0},{2,1},{1,2},{0,3},{1,3},{2,2},{3,1}, - {3,2},{2,3},{3,3} - }; - -int cos_tab[16][16][256]; -short cuv_tab[16]; - -TBOX *rbbox; -TBOX *gbbox; -TBOX *ibox; - -#define CUV (1/1.414) -#define PI 3.14159265 -#define C(u) (u==0?CUV:1) -#define FIXED 512 -#define SCAN_LINE 640 - -int line_skip=4*640; - -void unpack_block(void *source,void *target,int size); -#pragma aux unpack_block parm [esi][edi][ecx] modify [ebx edx eax] -void konv_iyg_hicolor(void *ii,void *rb,void *gb,void *screen); -#pragma aux konv_iyg_hicolor parm[esi][edx][ebx][edi] modify [eax ecx] - -void create_cos_tab() - { - char u,v,i,k,x,y; - int j,tst; - signed char cc,*c; - - for(j=0;j<256;j++) - for(i=0;i<16;i++) - for(k=0;k<16;k++) - { - u=code_tab[i][0]; - v=code_tab[i][1]; - x=k & 3; - y=k >> 2; - cc=j & 0xff; - tst=cos_tab[k][i][j]=(int)(quant[u][v]*cc*C(u)*C(v)*cos((2*x+1)*u*PI/8.0)*cos((2*y+1)*v*PI/8.0)*FIXED); - } - for(i=0;i<16;i++) - { - u=code_tab[i][0]; - v=code_tab[i][1]; - cuv_tab[i]=(u==0)+(v==0); - } - c=xlat_table; - for(j=0;j<256;j++) if (j>127) *c++=0;else if(j>31) *c++=31;else *c++=j; - } - -short zaokrouhlit(float f) - { - if (f>0) return (short)(f+0.5); - if (f<0) return (short)(f-0.5); - return 0; - } - -void Dopredna_transformace(C_MATICE data,C_MATICE koef) - { - char u,v,x,y; - float msum; - - for(u=0;u<4;u++) - for(v=0;v<4;v++) - { - msum=0; - for(x=0;x<4;x++) - for(y=0;y<4;y++) - msum+=data[x][y]*cos((2*x+1)*u*PI/8.0)*cos((2*y+1)*v*PI/8.0); - msum*=C(u)*C(v)/4.0; - koef[u][v]=zaokrouhlit(msum/quant[u][v]); - } - } - -void Kodovani(C_MATICE data,char *out) - { - int i; - for(i=0;i<16;i++) - { - *out++=(char)(data[code_tab[i][0]][code_tab[i][1]]); - } - } - -int string_size(char *data) - { - int i; - i=16; - do - i--; - while (i && !data[i]); - return i+1; - } - -int transformace(void *screen_data,signed char *trans_data,int nextline,int box_place) - { - C_MATICE icm,rbcm,gbcm; - C_MATICE irm,rbrm,gbrm; - short i,r,g,a=0; - signed char *p; - signed char *ii,*rb,*gb; - int x,y; - char *tr=trans_data; - - ii=ibox[box_place]; - rb=rbbox[box_place]; - gb=gbbox[box_place]; - - for(y=0;y<4;y++) - { - p=(char *)screen_data+nextline*3*y; - for(x=0;x<4;x++,a++) - { - i=(p[2]+p[1]+p[0]); - r=(i-p[0]); - g=(i-p[1]); - icm[x][y]=i-ii[a]; - rbcm[x][y]=r-rb[a]; - gbcm[x][y]=g-gb[a]; - p+=3; - } - } - Dopredna_transformace(icm,irm); - Dopredna_transformace(rbcm,rbrm); - Dopredna_transformace(gbcm,gbrm); - Kodovani(irm,trans_data+1);trans_data+=1+(*trans_data=string_size(trans_data+1)); - Kodovani(rbrm,trans_data+1);trans_data+=1+(*trans_data=string_size(trans_data+1)); - Kodovani(gbrm,trans_data+1);trans_data+=1+(*trans_data=string_size(trans_data+1)); - return trans_data-tr; - } - -void zpetna_transformace(char **data,void *screen,int box_place) - { - TBOX *ii,*rb,*gb; - char *dd=*data; - unpack_block(dd+1,ii=ibox+box_place,*dd);dd+=dd[0]+1; - unpack_block(dd+1,rb=gbbox+box_place,*dd);dd+=dd[0]+1; - unpack_block(dd+1,gb=rbbox+box_place,*dd);dd+=dd[0]+1; - *data=dd; - konv_iyg_hicolor(ii,rb,gb,screen); - } - - - diff --git a/VIDEO/JPEGMGIF.H b/VIDEO/JPEGMGIF.H deleted file mode 100644 index 6e9c98c..0000000 --- a/VIDEO/JPEGMGIF.H +++ /dev/null @@ -1,10 +0,0 @@ -void create_cos_tab(); -int transformace(void *screen_data,char *trans_data,int nextline,int box_place0); -void zpetna_transformace(char **data,void *screen,int box_place); - -typedef signed char TBOX[4][4]; - -extern TBOX *rbbox; -extern TBOX *gbbox; -extern TBOX *ibox; - diff --git a/VIDEO/JPEG_SIM.C b/VIDEO/JPEG_SIM.C deleted file mode 100644 index ecf4178..0000000 --- a/VIDEO/JPEG_SIM.C +++ /dev/null @@ -1,252 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "flc.h" - -typedef short C_MATICE[8][8]; -typedef float R_MATICE[8][8]; - -C_MATICE quant= - { - {16,11,10,16,24,40,51,61}, - {12,12,14,19,26,58,60,55}, - {14,13,16,24,40,57,69,56}, - {14,17,22,29,51,87,80,61}, - {18,22,37,56,68,109,103,77}, - {24,35,55,64,81,104,113,92}, - {49,64,78,87,103,121,120,101}, - {72,92,95,98,112,100,103,99} - }; - -/*C_MATICE test= - { - {139,144,149,153,155,155,155,155}, - {144,151,153,156,159,156,156,156}, - {150,155,160,163,158,156,156,156}, - {159,161,162,160,160,159,159,159}, - {159,160,161,162,162,155,155,155}, - {161,161,161,161,160,157,157,157}, - {162,162,161,163,162,157,157,157}, - {162,162,161,161,163,158,158,158} - }; - -*/ -char code_tab[][2]= - { - {0,0},{1,0},{0,1},{0,2},{1,1},{2,0},{3,0},{2,1},{1,2},{0,3},{0,4},{1,3},{2,2}, - {3,1},{4,0},{5,0},{4,1},{3,2},{2,3},{1,4},{0,5},{0,6},{1,5},{2,4},{3,3},{4,2}, - {5,1},{6,0},{7,0},{6,1},{5,2},{4,3},{3,4},{2,5},{1,6},{0,7},{1,7},{2,6},{3,5}, - {4,4},{5,3},{6,2},{7,1},{7,2},{6,3},{5,4},{4,5},{3,6},{2,7},{3,7},{4,6},{5,5}, - {6,4},{7,3},{7,4},{6,5},{5,6},{4,7},{5,7},{6,6},{7,5},{7,6},{6,7},{7,7} - }; - - -short cos_tab[64][64][256]; -short cuv_tab[64]; - -#define CUV (1/1.414) -#define PI 3.14159265 -#define C(u) (u==0?CUV:1) -#define FIXED 128 -#define SCAN_LINE 640 - -char vystup[120000]; -char frame[120000]; -char *ip; - -void create_cos_tab() - { - char u,v,i,k,x,y; - int j; - - for(j=0;j<256;j++) - for(i=0;i<64;i++) - for(k=0;k<64;k++) - { - u=code_tab[i][0]; - v=code_tab[i][1]; - x=k & 0x7; - y=k>>3; - cos_tab[k][i][j]=(short)(quant[u][v]/2*(j-128)*cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16)*FIXED/4); - } - for(i=0;i<64;i++) - { - u=code_tab[i][0]; - v=code_tab[i][1]; - cuv_tab[i]=(u==0)+(v==0); - } - } - -void Dopredna_transformace(C_MATICE data,R_MATICE koef) - { - char u,v,x,y; - float msum; - - for(u=0;u<8;u++) - for(v=0;v<8;v++) - { - msum=0; - for(x=0;x<8;x++) - for(y=0;y<8;y++) - msum+=data[x][y]*cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16); - msum*=0.25*C(u)*C(v); - koef[u][v]=msum; - } - } - -short zaokrouhlit(float f) - { - if (f>0) return (short)(f+0.5); - if (f<0) return (short)(f-0.5); - return 0; - } - -void Kvantifikace(R_MATICE data,C_MATICE out) - { - char u,v; - - for(u=0;u<8;u++) - for(v=0;v<8;v++) - out[u][v]=zaokrouhlit(data[u][v]*2/quant[u][v]); - } - -void Kodovani(C_MATICE data,char *out) - { - int i; - for(i=0;i<64;i++) - { - *out++=(char)(data[code_tab[i][0]][code_tab[i][1]]); - } - } - -void Zpetna_rychla_transformace(char *data,int delka,char *vystup) - { - char *hodn; - char *p; - char i,j; - int s; - - p=vystup; - for(j=0;j<64;j++) - { - s=0;hodn=data; - for(i=0;i>1;break; - } - } - *p++=(char)(s/FIXED); - } - } - -void read_bar_8x8(char *data,C_MATICE vystup) - { - int i,j; - for(i=0;i<8;i++) - { - for(j=0;j<8;j++) - vystup[j][i]=*data++; - data+=SCAN_LINE-j; - } - } - -void write_jpg_info(char *block,char *vystup,int *size) - { - for(*size=64;*size>0;(*size)--) - if (block[*size-1]!=0) break; - memcpy(vystup,size,1); - memcpy(vystup+1,block,*size); - } - - - -void konvert_color_Y() - { - int i; - char *c,*d; - c=frame_buffer; - d=frame; - for(i=0;i>2; - } - -void compress_layer(char *from,char *to) - { - R_MATICE r; - C_MATICE c; - char out[64]; - int s,x,y; - - for(y=0;y<24;y++) - for(x=0;x<80;x++) - { - read_bar_8x8(&from[(y*SCAN_LINE+x)*8],c); - Dopredna_transformace(c,r); - Kvantifikace(r,c); - Kodovani(c,out); - write_jpg_info(out,to,&s); - to+=s+1; - } - } - -void decompress_layer(char *from,char *to) - { - char size; - int x,y,z; - char out[64]; - char *a; - - for(y=0;y<24;y++) - for(x=0;x<80;x++) - { - a=to+((SCAN_LINE*y+x)*8); - size=*from++; - Zpetna_rychla_transformace(from,size,out); - from+=size; - for(z=0;z<8;z++) memcpy(a+=640,out+z*8,8); - } - } - -void display() - { - word *c; - char *z; - char d; - int i; - - c=lbuffer; - z=frame; - for(i=0;i<640*180;i++) - { - d=*z++;d>>=3; - *c++=d+(d<<5)+(d<<10); - } - } - -void main() - { - - printf("creating %d Kb table\n",sizeof(cos_tab)/1024); - create_cos_tab(); - Open_FLC("trava.flc"); - Get_first_frame(); - Decompress_frame(); - Close_FLC(); - konvert_color_Y(); - puts("compress"); - compress_layer(frame,vystup); - puts("decompress"); - decompress_layer(vystup,frame); - initmode32(NULL); - display(); - getche(); - closemode(); - } - - diff --git a/VIDEO/LZW.C b/VIDEO/LZW.C deleted file mode 100644 index 05fe405..0000000 --- a/VIDEO/LZW.C +++ /dev/null @@ -1,225 +0,0 @@ -#include -#include -#include -#include - - -#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; -char old_value=0; - -void do_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(); - } - -void init_lzw_compressor(int dic_size) - { - compress_dic=(CODE_TABLE *)getmem(sizeof(CODE_TABLE)); - clear_code=1<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) - { - 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(char *source,void *target,int size) - { - long bitpos=0; - DOUBLE_S p; - int f; - - clear: - old_value=p.group=*source++;size--; - while (size-->0) - { - p.chr=(int)((char)(*source++-old_value));old_value+=p.chr; - f=find_code(&p); - if (f<0) - { - bitpos=output_code(target,bitpos,bitsize,p.group); - add_code(&p); - if (nextgroup==(1<=LZW_MAX_CODES) - { - bitpos=output_code(target,bitpos,bitsize,p.group); - bitpos=output_code(target,bitpos,bitsize,clear_code); - do_clear_code(); - goto clear; - } - } - else - p.group=f; - } - bitpos=output_code(target,bitpos,bitsize,p.group); - bitpos=output_code(target,bitpos,bitsize,end_code); - 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,char **target) - { - static int first; - - if (code>end_code) - { - expand_code(compress_dic[code].group,target); - **target=old_value=compress_dic[code].chr+old_value; - (*target)++; - } - else - { - **target=old_value=code+old_value; - (*target)++; - first=code; - } - return first; - } - -char fast_expand_code(int code,char **target); -#pragma aux fast_expand_code parm[eax][edi] modify [esi ecx] value [bl] - -void lzw_decode(void *source,char *target) - { - long bitpos=0; - int code,old,i; - DOUBLE_S p; - int old_first; - int mask=0xff; - - - for(i=0;i -#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; -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(); - } - -void init_lzw_compressor(int dic_size) - //dic size je velikost slovniku(bitova) - //pro 8 bitove hodnoty zde vloz 8. - { - compress_dic=(CODE_TABLE *)getmem(sizeof(CODE_TABLE)); - 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; - DOUBLE_S p; - int f; - - clear: - old_value=p.group=*source++;size--; - while (size-->0) - { - 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); - 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].group - -#define MAX_BUFF 65536 - -#define INPUT "testx" -#define OUTPUT "testx.l" -#define ARCH "e:\\SYSLOG.LZW" - -char input_buffer[MAX_BUFF*2]; -char output_buffer[MAX_BUFF*2]; - -FILE *in,*out; - -int datasize; -int compsize; - -void open_files(char *sr,char *tg) - { - in=fopen(sr,"rb"); - out=fopen(tg,"wb"); - if (in==NULL || out==NULL) abort(); - } - -void close_files() - { - fclose(in); - fclose(out); - } - - -void read_normal() - { - - datasize=fread(input_buffer,1,MAX_BUFF,in); - } - -void save_normal() - { - - fwrite(output_buffer,1,datasize,out); - } - - -int read_comp() - { - fread(&datasize,1,sizeof(datasize),in); - fread(&compsize,1,sizeof(datasize),in); - return fread(input_buffer,1,compsize,in); - } - -void save_comp() - { - fwrite(&datasize,1,sizeof(datasize),out); - fwrite(&compsize,1,sizeof(datasize),out); - fwrite(output_buffer,1,compsize,out); - } - - -main() - { - puts(""); - - init_lzw_compressor(8); - open_files(INPUT,ARCH); - read_normal(); - while (datasize!=0) - { - memset(output_buffer,0,sizeof(output_buffer)); - compsize=lzw_encode(input_buffer,output_buffer,datasize); - printf("Origin: %d Packed: %d Ratio %d%%\n",datasize,compsize,compsize*100/datasize); - save_comp(); - read_normal(); - reinit_lzw(); - } - close_files(); - done_lzw_compressor(); - init_lzw_compressor(8); - open_files(ARCH,OUTPUT); - while (read_comp()) - { - lzw_decode(input_buffer,output_buffer); - save_normal(); - reinit_lzw(); - } - done_lzw_compressor(); - printf("Compressed file has been extracted back\n"); - close_files(); - printf("and saved as %s.\n",OUTPUT); - } - diff --git a/VIDEO/MGFPLAYA.ASM b/VIDEO/MGFPLAYA.ASM deleted file mode 100644 index a1406b0..0000000 --- a/VIDEO/MGFPLAYA.ASM +++ /dev/null @@ -1,500 +0,0 @@ -.model small -.386 -;16 bit line (de)comprimator -; -DGROUP group _DATA - -extrn _lbuffer:dword -extrn _backsndbuff:word -extrn _vals_save:dword -extrn _backsnd:dword -extrn _lastbank:dword -extrn _gr_page_end:word -extrn _gr_end_screen:dword - - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - -extrn mapvesaadr_:proc -extrn switchmap_:proc -extrn switchvesabank_:proc - - - -public show_full_interl_lfb_ - -show_full_interl_lfb_: - ;edi - target - ;esi - source - ;ebx - palette - push ebp - mov dl,180 -shfif2: mov ecx,320 -shfif1: lodsb - movzx eax,al - movzx eax,word ptr [eax*2+ebx] - mov ebp,eax - shl eax,16 - or eax,ebp - stosd - dec ecx - jnz shfif1 - add edi,1280 - dec dl - jnz shfif2 - pop ebp - ret - - -public show_delta_interl_lfb_ -show_delta_interl_lfb_: - ;edi - target - ;esi - source - ;ebx - palette - push ebp ;uchovej ebp - mov cl,180 ;cl pocet zbyvajicich radek - add esi,4 ;preskoc ukazatel - mov edx,esi ;edx - zacatek delta mapy - add esi,[esi-4] ;esi - zacatek dat -shdif6: push edi ;uloz adresu radku -shdif2: mov ch,[edx] ;cti _skip_ hodnotu - mov al,ch - inc edx - or al,03fh ;test zda jsou 2 nejvyssi bity nastaveny - inc al - jz shdif3 ;ano - preskakovani radku - movzx eax,ch ;expanduj _skip_ hodnotu do eax - lea edi,[eax*8+edi] ;vypocti novou pozici na obrazovce - mov ch,[edx] ;cti _copy_ hodnotu - inc edx -shdif1: lodsb ;vem bajt z datove oblasti - movzx eax,al ;expanduj do eax - movzx eax,word ptr[eax*2+ebx] ;expanduj hicolor barvu - mov ebp,eax ;rozdvoj barvy - shl ebp,16 - or eax,ebp - stosd ;zapis dva body - lodsb ;opakuj pro dalsi bod jeste jednou - movzx eax,al - movzx eax,word ptr[eax*2+ebx] - mov ebp,eax - shl ebp,16 - or eax,ebp - stosd - dec ch ;odecti _copy_ hodnotu - jnz shdif1 ;dokud neni 0 - jmp shdif2 ;pokracuj _skip_ hodnotou -shdif3: and ch,3fh ;odmaskuj hodni 2 bity - pop edi ;obnov edi - jnz shdif4 ;pokud je ch=0 preskoc jen jeden radek; - add edi,1280*2 ;preskoc radek - dec cl ;odecti citac radku - jnz shdif6 ;skok pokud neni konec - pop ebp - ret ;navrat -shdif4: inc ch ;pocet radek je ch+1 - sub cl,ch ;odecti ch od zbyvajicich radek - jz shdif5 ;je-li nula tak konec -shdif7: add edi,1280*2 ;preskoc radek - dec ch ;odecti ch - jnz shdif7 ;preskakuj dokud neni 0 - jmp shdif6 ;cti dalsi _skip_ -shdif5: pop ebp - ret ;konec - - -public show_full_interl_lfb130_ - -show_full_interl_lfb130_: - ;edi - target - ;esi - source - ;ebx - palette - push ebp - mov dl,180 -shfil2: mov ecx,160 -shfil1: lodsw - movzx ebp,al - movzx ebp,word ptr ds:[ebp*2+ebx] - movzx eax,ah - movzx eax,word ptr ds:[eax*2+ebx] - shl eax,16 - or eax,ebp - stosd - dec ecx - jnz shfil1 - add edi,640 - dec dl - jnz shfil2 - pop ebp - ret - - -public show_delta_interl_lfb130_ -show_delta_interl_lfb130_: - ;edi - target - ;esi - source - ;ebx - palette - push ebp ;uchovej ebp - mov cl,180 ;cl pocet zbyvajicich radek - add esi,4 ;preskoc ukazatel - mov edx,esi ;edx - zacatek delta mapy - add esi,[esi-4] ;esi - zacatek dat -shdil6: push edi ;uloz adresu radku -shdil2: mov ch,[edx] ;cti _skip_ hodnotu - mov al,ch - inc edx - or al,03fh ;test zda jsou 2 nejvyssi bity nastaveny - inc al - jz shdil3 ;ano - preskakovani radku - movzx eax,ch ;expanduj _skip_ hodnotu do eax - lea edi,[eax*4+edi] ;vypocti novou pozici na obrazovce - mov ch,[edx] ;cti _copy_ hodnotu - inc edx -shdil1: lodsw - movzx ebp,al - movzx ebp,word ptr ds:[ebp*2+ebx] - movzx eax,ah - movzx eax,word ptr ds:[eax*2+ebx] - shl eax,16 - or eax,ebp - stosd - dec ch ;odecti _copy_ hodnotu - jnz shdil1 ;dokud neni 0 - jmp shdil2 ;pokracuj _skip_ hodnotou -shdil3: and ch,3fh ;odmaskuj hodni 2 bity - pop edi ;obnov edi - jnz shdil4 ;pokud je ch=0 preskoc jen jeden radek; - add edi,1280 ;preskoc radek - dec cl ;odecti citac radku - jnz shdil6 ;skok pokud neni konec - pop ebp - ret ;navrat -shdil4: inc ch ;pocet radek je ch+1 - sub cl,ch ;odecti ch od zbyvajicich radek - jz shdil5 ;je-li nula tak konec -shdil7: add edi,1280 ;preskoc radek - dec ch ;odecti ch - jnz shdil7 ;preskakuj dokud neni 0 - jmp shdil6 ;cti dalsi _skip_ -shdil5: pop ebp - ret ;konec - - -public show_full_lfb12e_ - -show_full_lfb12e_: - ;edi - target - ;esi - source - ;ebx - palette - push ebp - mov dl,180 -shfl2: mov ecx,160 -shfl1: lodsw - movzx ebp,al - movzx ebp,word ptr ds:[ebp*2+ebx] - movzx eax,ah - movzx eax,word ptr ds:[eax*2+ebx] - shl eax,16 - or eax,ebp - stosd - dec ecx - jnz shfl1 - dec dl - jnz shfl2 - pop ebp - ret - - -public show_delta_lfb12e_ -show_delta_lfb12e_: - ;edi - target - ;esi - source - ;ebx - palette - push ebp ;uchovej ebp - mov cl,180 ;cl pocet zbyvajicich radek - add esi,4 ;preskoc ukazatel - mov edx,esi ;edx - zacatek delta mapy - add esi,[esi-4] ;esi - zacatek dat -shdl6: push edi ;uloz adresu radku -shdl2: mov ch,[edx] ;cti _skip_ hodnotu - mov al,ch - inc edx - or al,03fh ;test zda jsou 2 nejvyssi bity nastaveny - inc al - jz shdl3 ;ano - preskakovani radku - movzx eax,ch ;expanduj _skip_ hodnotu do eax - lea edi,[eax*4+edi] ;vypocti novou pozici na obrazovce - mov ch,[edx] ;cti _copy_ hodnotu - inc edx -shdl1: lodsw - movzx ebp,al - movzx ebp,word ptr ds:[ebp*2+ebx] - movzx eax,ah - movzx eax,word ptr ds:[eax*2+ebx] - shl eax,16 - or eax,ebp - stosd - dec ch ;odecti _copy_ hodnotu - jnz shdl1 ;dokud neni 0 - jmp shdl2 ;pokracuj _skip_ hodnotou -shdl3: and ch,3fh ;odmaskuj hodni 2 bity - pop edi ;obnov edi - jnz shdl4 ;pokud je ch=0 preskoc jen jeden radek; - add edi,640 ;preskoc radek - dec cl ;odecti citac radku - jnz shdl6 ;skok pokud neni konec - pop ebp - ret ;navrat -shdl4: inc ch ;pocet radek je ch+1 - sub cl,ch ;odecti ch od zbyvajicich radek - jz shdl5 ;je-li nula tak konec -shdl7: add edi,640 ;preskoc radek - dec ch ;odecti ch - jnz shdl7 ;preskakuj dokud neni 0 - jmp shdl6 ;cti dalsi _skip_ -shdl5: pop ebp - ret ;konec - - - -nextbank macro - mov eax,_lastbank ;ano, pak vem cislo banky - inc eax ;pricti 1 - mov _lastbank,eax ;zapis jako nove cislo banky - pushad ;uchovej vse - call switchvesabank_ ;prepni banku - popad ;obnov vse - movzx edi,di - add edi,0a0000h ;vynuluj dolni cast di -endm - -skipm macro reg - local skp1 - - mov ax,_gr_page_end - movzx edi,di - dec ax - add edi,reg - inc eax - cmp edi,eax - jc skp1 - mov eax,_lastbank ;ano, pak vem cislo banky - inc eax ;pricti 1 - mov _lastbank,eax ;zapis jako nove cislo banky - pushad ;uchovej vse - call switchvesabank_ ;prepni banku - popad ;obnov vse - movzx edi,di -skp1: or edi,0a0000h -endm - - - -public show_full_interl_bank_ -show_full_interl_bank_: - ;edi - target - ;esi - source - ;ebx - palette - call mapvesaadr_ - mov dl,180 -shfib2: mov ecx,320 - push ebp -shfib1: cmp edi,_gr_end_screen - jc shfib3 - nextbank -shfib3: lodsb - movzx eax,al - movzx eax,word ptr [eax*2+ebx] - mov ebp,eax - shl eax,16 - or eax,ebp - stosd - dec ecx - jnz shfib1 - pop ebp - add edi,1280 - dec dl - jnz shfib2 - ret - - -public show_delta_interl_bank_ -show_delta_interl_bank_: - ;edi - target - ;esi - source - ;ebx - palette - mov cl,180 ;cl pocet zbyvajicich radek - add esi,4 ;preskoc ukazatel - mov edx,esi ;edx - zacatek delta mapy - add esi,[esi-4] ;esi - zacatek dat -shdib6: push ebp ;uchovej ebp - push edi - call mapvesaadr_ -shdib2: mov ch,[edx] ;cti _skip_ hodnotu - mov al,ch - inc edx - or al,03fh ;test zda jsou 2 nejvyssi bity nastaveny - inc al - jz shdib3 ;ano - preskakovani radku - movzx eax,ch ;expanduj _skip_ hodnotu do eax - lea edi,[eax*8+edi] ;vypocti novou pozici na obrazovce - mov ch,[edx] ;cti _copy_ hodnotu - inc edx - cmp edi,_gr_end_screen - jc shdib1 - nextbank -shdib1: lodsb ;vem bajt z datove oblasti - movzx eax,al ;expanduj do eax - movzx eax,word ptr[eax*2+ebx] ;expanduj hicolor barvu - mov ebp,eax ;rozdvoj barvy - shl ebp,16 - or eax,ebp - stosd ;zapis dva body - cmp edi,_gr_end_screen - jc shdib8 - nextbank -shdib8: lodsb ;opakuj pro dalsi bod jeste jednou - movzx eax,al - movzx eax,word ptr[eax*2+ebx] - mov ebp,eax - shl ebp,16 - or eax,ebp - stosd - dec ch ;odecti _copy_ hodnotu - jnz shdib1 ;dokud neni 0 - jmp shdib2 ;pokracuj _skip_ hodnotou -shdib3: pop edi - pop ebp - and ch,3fh ;odmaskuj hodni 2 bity - jnz shdib4 ;pokud je ch=0 preskoc jen jeden radek; - add edi,2*1280 - dec cl ;odecti citac radku - jnz shdib6 ;skok pokud neni konec - ret ;navrat -shdib4: inc ch ;pocet radek je ch+1 - sub cl,ch ;odecti ch od zbyvajicich radek - jz shdib5 ;je-li nula tak konec -shdib7: add edi,2*1280 ;preskoc radek - dec ch ;odecti ch - jnz shdib7 ;preskakuj dokud neni 0 - jmp shdib6 ;cti dalsi _skip_ -shdib5: ret ;konec - - - -public sound_decompress_ ;dekompresuje hudbu - -sound_decompress_: ;esi - source - ;edi - target pos in backsndbuff - ;ecx - datasize - ;ebx - ampl_table - ;(vraci edi - pozici v backsndbuff) - mov edx,_vals_save -snddec1:lodsb - movzx eax,al - movzx eax,word ptr [eax*2+ebx] - add dx,ax - mov _backsndbuff[edi],dx - add edi,2 - and edi,3ffffh - rol edx,16 - dec ecx - jnz snddec1 - mov _vals_save,edx - ret - -public test_next_frame_ ;testuje zda je volno pro dalsi zvukovy blok - -test_next_frame_: ;edi - pozice - ;ecx - delka bloku - mov ebx,_backsnd - shl ecx,1 - shl ebx,2 - xor ecx,3ffffh - sub edi,ebx - jnc tnf1 - add edi,40000h -tnf1: cmp ecx,edi - rcl al,1 - and al,1 - ret - - - -public show_full_interl_lfb_256_ - -show_full_interl_lfb_256_: - ;edi - target - ;esi - source - ;ebx - palette - mov dl,180 -s2fif2: mov ecx,320 -s2fif1: lodsb - movzx eax,al - movzx eax,word ptr [eax*2+ebx] - stosw - dec ecx - jnz s2fif1 - add edi,640 - dec dl - jnz s2fif2 - ret - - -public show_delta_interl_lfb_256_ -show_delta_interl_lfb_256_: - ;edi - target - ;esi - source - ;ebx - palette - push ebp ;uchovej ebp - mov cl,180 ;cl pocet zbyvajicich radek - add esi,4 ;preskoc ukazatel - mov edx,esi ;edx - zacatek delta mapy - add esi,[esi-4] ;esi - zacatek dat -s2dif6: push edi ;uloz adresu radku -s2dif2: mov ch,[edx] ;cti _skip_ hodnotu - mov al,ch - inc edx - or al,03fh ;test zda jsou 2 nejvyssi bity nastaveny - inc al - jz s2dif3 ;ano - preskakovani radku - movzx eax,ch ;expanduj _skip_ hodnotu do eax - lea edi,[eax*4+edi] ;vypocti novou pozici na obrazovce - mov ch,[edx] ;cti _copy_ hodnotu - inc edx -s2dif1: lodsb ;vem bajt z datove oblasti - movzx eax,al ;expanduj do eax - movzx eax,word ptr[eax*2+ebx] ;expanduj hicolor barvu - mov ebp,eax ;rozdvoj barvy - lodsb ;opakuj pro dalsi bod jeste jednou - movzx eax,al - movzx eax,word ptr[eax*2+ebx] - shl eax,16 - or eax,ebp - stosd ;zapis 4 body - dec ch ;odecti _copy_ hodnotu - jnz s2dif1 ;dokud neni 0 - jmp s2dif2 ;pokracuj _skip_ hodnotou -s2dif3: and ch,3fh ;odmaskuj hodni 2 bity - pop edi ;obnov edi - jnz s2dif4 ;pokud je ch=0 preskoc jen jeden radek; - add edi,640*2 ;preskoc radek - dec cl ;odecti citac radku - jnz s2dif6 ;skok pokud neni konec - pop ebp - ret ;navrat -s2dif4: inc ch ;pocet radek je ch+1 - sub cl,ch ;odecti ch od zbyvajicich radek - jz s2dif5 ;je-li nula tak konec -s2dif7: add edi,640*2 ;preskoc radek - dec ch ;odecti ch - jnz s2dif7 ;preskakuj dokud neni 0 - jmp s2dif6 ;cti dalsi _skip_ -s2dif5: pop ebp - ret ;konec - -_TEXT ends - -end diff --git a/VIDEO/MGFSOUND.C b/VIDEO/MGFSOUND.C deleted file mode 100644 index 851b3be..0000000 --- a/VIDEO/MGFSOUND.C +++ /dev/null @@ -1,558 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BLK_SIZE 100000 -#define CHANNELS 256 -#define SND_NAME ".SNF" - -typedef struct volstruc - { - int volslow,volsmax; - int volume; - int volume_end; - int vls; - - }TVOLSTRUC; - -typedef struct tchaninfo - { - FILE *snd; - char chans; - char bit8; - long repstart; - long id ; - long size; - TVOLSTRUC left,right; - }TCHANINFO; - -TCHANINFO chaninfo[CHANNELS]; - -typedef struct mgif_header - { - char sign[4]; - char year[2]; - char eof; - word ver; - long frames; - word snd_chans; - int snd_freq; - short ampl_table[256]; - short reserved[32]; - }; - -struct mgif_header gh; - -short ampl_table[256]; -signed short source[BLK_SIZE]; -char target[BLK_SIZE]; -int glob_volume=256; - -long sfreq; -unsigned short chans; -FILE *sf; -int tf; - -char *nsource; -char *ntarget; -long ssize; -long rsize,blck; -char difftype=4; - -int last_channel; - -long next_frame; - -int find_free_channel() - { - int i; - for(i=0;i<256;i++) if (chaninfo[i].snd==NULL) return i; - printf("Nemohu pridat zvuk. Jiz je zaplneno vsech %d kanal�\n",CHANNELS); - return -1; - } - -void Create_table_16() - { - int a,c,d,e; - float b; - - d=-1;e=0; - for(a=0;a<128;a++) - { - b=(a/128.0); - switch (difftype) - { - case 1:b=(b*32768.0);break; - case 2:b=(b*b*32768.0);break; - case 3:b=(b*b*b*32768.0);break; - case 4:b=(b*b*b*b*32768.0);break; - case 5:b=(b*b*b*b*b*32768.0);break; - } - c=(int)b; - if (c==d) e++; - d=c;c+=e; - ampl_table[128+a]=c; - ampl_table[128-a]=-c; - } - } - -int find_index(int value) - { - int i; - - if (value==0) return 128; - if (value>0) - { - for(i=128;i<256;i++) - if (ampl_table[i]>value) return i-1; - return 255; - } - else - { - for(i=128;i>=0;i--) - if (ampl_table[i]32768 || last1<-32768) abort(); - target[i]=indx; - } - else - { - val=source[i]; - indx=find_index(val-last2); - last2+=ampl_table[indx]; - if (last2>32768 || last2<-32768) abort(); - target[i]=indx; - } - } - } - -void find_data() - { - char w[5]="data"; - int i,d; - - i=0; - do - { - d=fgetc(sf); - if (d==w[i]) i++;else i=0; - if (d==EOF) abort(); - } - while (i<4); - } - -void open_wav(char *wav) - { - TCHANINFO *inf; - int i; - struct t_wave *wavinf; - FILE *snd; - - i=find_free_channel(); - if (i==-1) return; - last_channel=i; - inf=chaninfo+i; - snd=fopen(wav,"rb"); - if (snd==NULL) - { - printf("Soubor %s neexistuje.\n",wav); - return; - } - if (find_chunk(snd,WAV_FMT)==-1) - { - printf("Soubor %s ma poskozenou hlavicku\n",wav); - fclose(snd); - return; - } - wavinf=(struct t_wave *)malloc(get_chunk_size(snd)); - if (wavinf==NULL) - { - puts("Nedostatek pam�ti."); - return; - } - read_chunk(snd,wavinf); - if (wavinf->wav_mode!=1) - { - printf("Tento program podporuje pouze WAVy typu 1 (%s)\n",wav); - free(wavinf); - fclose(snd); - return; - } - inf->chans=wavinf->chans; - inf->bit8=wavinf->freq*wavinf->chans==wavinf->bps; - inf->repstart=-1; - inf->id=-1; - inf->left.volume=32768; - inf->right.volume=32768; - inf->left.vls=0; - inf->right.vls=0; - free(wavinf); - if (find_chunk(snd,WAV_DATA)==0) - { - printf("Soubor %s je poskozen\n",wav); - fclose(snd); - return; - } - inf->size=get_chunk_size(snd); - fseek(snd,4,SEEK_CUR); - inf->snd=snd; - } - -void calc_vls(TVOLSTRUC *vls) - { - vls->volslow--; - if (vls->volslow<=0) - { - vls->volslow+=vls->volsmax; - vls->volume+=vls->vls; - if ((vls->vls>0 && vls->volume>=vls->volume_end)|| - (vls->vls<0 && vls->volume<=vls->volume_end)) - { - vls->volume=vls->volume_end; - vls->vls=0; - } - } - } - -void mix_buffer(int size) - { - int chan,i; - memset(source,0,size*2); - for(chan=0;chanbit8) - { - fread(&left,1,1,inf->snd);left=(short)(left*256); - left^=0xffff8000; - inf->size--; - } - else - { - fread(&left,1,2,inf->snd);left=(short)left; - inf->size-=2; - } - if (inf->chans==1) right=left; - else - if (inf->bit8) - { - fread(&right,1,1,inf->snd);right=(short)(right*256); - right^=0xffff8000; - inf->size--; - } - else - { - fread(&right,1,2,inf->snd);right=(short)right; - inf->size-=2; - } - left=(int)left*inf->left.volume/(32768); - right=(int)right*inf->right.volume/(32768); - left=left*glob_volume/256; - right=right*glob_volume/256; - calc_vls(&inf->left); - calc_vls(&inf->right); - left+=source[i]; - right+=source[i+1]; - if (left>32767) left=32767; - if (left<-32767) left=-32767; - if (right>32767) right=32767; - if (right<-32767) right=-32767; - source[i]=left; - source[i+1]=right; - if (inf->size<=0) - { - if (inf->repstart!=-1) - { - fseek(inf->snd,0,SEEK_SET); - find_chunk(inf->snd,WAV_DATA); - inf->size=get_chunk_size(inf->snd); - fseek(inf->snd,4,SEEK_CUR); - fseek(inf->snd,inf->repstart,SEEK_CUR); - inf->size-=inf->repstart; - } - else - { - fclose(inf->snd); - inf->snd=NULL; - break; - } - } - } - } - } - } - - -void open_files(char *ntarget) - { - tf=open(ntarget,O_BINARY | O_RDWR); - if (!tf) abort(); - lseek(tf,0,SEEK_SET); - read(tf,&gh,sizeof(gh)); - memcpy(gh.ampl_table,ampl_table,sizeof(ampl_table)); - gh.snd_freq=22050; - } - - -void read_frame() - { - long x; - read(tf,&x,4); - x>>=8; - next_frame=tell(tf)+x; - } - -long find_sound_action() - { - long x;char c; - - do - { - read(tf,&x,4); - c=x;x>>=8; - if (c==4) return x; - lseek(tf,x,SEEK_CUR); - } - while (1); - } - - -void press_sound_chunk() - { - int siz; - - - siz=find_sound_action(); - mix_buffer(siz); - compress_buffer_stereo(siz); - write(tf,&target,siz); - } - -void close_files() - { - int i; - lseek(tf,0,SEEK_SET); - write(tf,&gh,sizeof(gh)); - fclose(sf); - close(tf); - for(i=0;ileft; - else if (!strcmp(command,"L")) v=&inf->right; - else if (!strcmp(command,"VOL")) - { - get_num(c,num); - v->volume=num*128; - } - else if (!strcmp(command,"VOLEND")) - { - get_num(c,num); - v->volume_end=num*128; - v->vls=0; - } - else if (!strcmp(command,"SPEED")) - { - get_num(c,v->vls);v->volsmax=1;v->volslow=1; - if (v->volume>v->volume_end) v->vls=-v->vls; - } - else if (!strcmp(command,"SLOW")) - { - get_num(c,v->volsmax);v->vls=1;v->volslow=1; - if (v->volume>v->volume_end) v->vls=-v->vls; - } - else if (!strcmp(command,"REPSTART")){ get_num(c,inf->repstart);} - else if (!strcmp(command,"GLOBVOL")) {get_num(c,glob_volume);} - } - else - { - char filename[128]; - sscanf(c,"%127s",filename); - c=strchr(c,32); - open_wav(filename); - inf=chaninfo+last_channel; - fcid=1; - } - } - } - -void call_script(char *script_name) - { - FILE *scr,*snf; - char name[256]; - char snd_name[256],*c; - int i,fr,lfr=0,wfr=-1; - - scr=fopen(script_name,"r"); - strcpy(snd_name,script_name); - c=strrchr(snd_name,'.'); - if (c==NULL) strcat(snd_name,SND_NAME); - else strcpy(c,SND_NAME); - if (scr==NULL) - { - printf("Nemohu otev��t script: %s\n",script_name); - exit(1); - } - snf=fopen(snd_name,"r"); - i=fscanf(scr,"%255s",name); - open_files(name); - if (i!=1) - { - printf("Chyba ve script souboru: %s. Prvni mus� b�t jm�no c�lov�ho souboru.\n",scr); - exit(1); - } - while ((i=fgetc(scr))!=EOF && i!='\n'); - for(fr=1;fr3) - { - sscanf(argv[3],"%d",&difftype); - } - Create_table_16(); - if (argc==2) - call_script(argv[1]); - else - { - open_wav(argv[2]); - open_files(argv[1]); - ozvuceni(); - } - close_files(); - } - diff --git a/VIDEO/MGIF.C b/VIDEO/MGIF.C deleted file mode 100644 index 4ffa318..0000000 --- a/VIDEO/MGIF.C +++ /dev/null @@ -1,646 +0,0 @@ -// MOTION GIF - LZW komprimovana animace v rozliseni 320x180 256 barev avsak -// upravena pro prehravani v HICOLOR pro konkretni rezim (32768 barev) - - -// Format - /* - - [ FRAME ] - [CHUNK] !pozor delka je 3 bajtova (tj 16MB) - 0 - PRADNY CHUNK - 1 - LZW FULL SCREEN - 2 - MGIF DELTA - 3 - HICOLOR PALETE - 4 - SOUND TRACK - 5 - TEXT TRACK - 6 - MGIF COPY - 7 - SOUND INIT - - Popis Chunku: - PRAZDNY_CHUNK - muze obsahovat soukrome informace - - LZW_FULL_SCREEN - - ihned za hlavickou nasleduje LZW komprimovany obrazek - v rozliseni 320x180 256 barev - - MGIF_DELTA - - cely blok je LZW komprimovany. Po dekomprimace blok obsahuje - dva druhy informaci. Prvni DWORD je ofset od pocatku dat - ktery ukazuje na zacatek graficke informace. Po tomto - DWORDU jsou ulozeny data o umisteni grafickych bodu v obrazu - Prvni byte znaci, kolik je nutne preskocit slov. (tj *2 byte) - Dalsi byte znaci, kolik je nutne zapsat slov (tj *2 byte) - Po tomto bytu je nutne prenest presne tolik slov z - grafickeho bloku na obrazovku. Dvojice bajtu se opakuji - dokud ani jeden z nich nema nejvyssi 2 bity nastavene. - Pak tento byte znaci ze uz na radce nic vic neni. Dolni cast - byte (tj 6 bitu) pak udava pocet radku, ktere je treba pre- - skocit. (nula=zadny). - - HICOLOR PALETTE - - Prvni byte znamena pocet aktivnich barev. Pak nasleduje - paleta ve formatu xRRRRRGGGGGBBBBB. Rozdil oproti vsem - beznym paletam je v tom ze neni treba v palete udrzovat - barvy, ktere uz na obrazovce jsou, protoze zmena palety - se neprojevi na jiz zobrazenem obrazku. - - SOUND_TRACK - - Kazdy frame obsahuje zvukovou stopu. Je to RAW format. - Pro verzi MGIF97 zde je zvukova informace ulozena ve - zvukove kvalite 16-bit stereo 22000Khz, ovsem komprimovana - na 50% jako MUS. - TEXT_TRACK - - Navic je ve mozne ve frame umistit textovou zpravu (titulek) - Prvni WORD udava dobu zobrazeni (pocet frame). - Pote nasleduje text zakoncen znakem 0; - - MGIF_COPY - Za timto CHUNKEM je ulozen blok dat v nezakomprimovanem - tvaru(tj 57600byte); - - - - */ - -#include -#include -#include -#include -#include -#include -#include "flc.h" -#include "lzw.h" -#include - -#define MGIF "MGIF" -#define MGIF_Y "97" -#define VER 0x100 - -#define MGIF_EMPTY 0 -#define MGIF_LZW 1 -#define MGIF_DELTA 2 -#define MGIF_PAL 3 -#define MGIF_SOUND 4 -#define MGIF_TEXT 5 -#define MGIF_COPY 6 -#define MGIF_SINIT 7 - -#define FRAME_X 320 -#define FRAME_Y 180 -#define FRAME_LEN (FRAME_X*FRAME_Y) -#define DELTA_LEN (3*FRAME_LEN) -#define LZW_LEN (2*FRAME_LEN) - -#define SOUND_SPEED 44100 -#define PRE_SOUND ((256*1024)/2) - -#define ZTRATA lowq -#define BZTRATA colorq -#define MAX_FRAME max_fr -#define MIN_FRAME min_fr - -short mult_table[64]; -short square_table[4096]; - -typedef struct mgif_header - { - char sign[4]; - char year[2]; - char eof; - word ver; - long frames; - word snd_chans; - int snd_freq; - short ampl_table[256]; - short reserved[32]; - }; - -word last_frame[FRAME_Y][FRAME_X]; -char frame_delta[FRAME_LEN]; -char delta_data[DELTA_LEN]; -word color_state[32*32+32*32+32*32]; -char calc_data[FRAME_LEN]; -int delta_data_size; -int frame_delta_size; -int speed=20; - -int last_frame_size; -int total_frames; - -int lowq=0; -int colorq=0; -int max_fr=30000; -int min_fr=0; - -int hranice; -int hdiff=0; - -struct mgif_header gh; - -char lzw_buffer[LZW_LEN]; - -char pal_use[256],color_map[256]; -word hipal[256],max_colors; - - -FILE *mgf; - -long of_pos; -int of_chunks; - -void open_frame() - { - of_chunks=0; - of_pos=ftell(mgf); - fwrite(&of_pos,1,4,mgf); - } - -void close_frame() - { - long fsize,p; - - last_frame_size=fsize=(p=ftell(mgf))-of_pos-4; - fseek(mgf,of_pos,SEEK_SET); - fwrite(&of_chunks,1,1,mgf); - fwrite(&fsize,1,3,mgf); - fseek(mgf,p,SEEK_SET); - total_frames++; - } - - -void write_chunk(char action,long size,void *data) - { - fwrite(&action,1,1,mgf); - fwrite(&size,1,3,mgf); - fwrite(data,1,size,mgf); - of_chunks++; - } - - -void conv_2_hicolor() - { - int i,r,g,b; - for(i=0;i<256;i++) - { - r=(flc_paleta[i][0]>>3); - g=(flc_paleta[i][1]>>3); - b=(flc_paleta[i][2]>>3); - hipal[i]=((r<<10)+(g<<5)+b); - } - } - -char find_color(word c); //najde barvu v palete a vraci byte -#pragma aux find_color parm [eax]=\ - "mov edi,offset hipal"\ - "mov ecx,256"\ - "repne scasw"\ - "mov eax,edi"\ - "sub eax,offset hipal"\ - "shr eax,1"\ - "dec eax"\ - value [al] modify[edi ecx]; - - -void init_palmap() - { - int i; - memset(pal_use,0,sizeof(pal_use)); // nuluj pristupy k barvam - for(i=0;i<256;i++) color_map[i]=find_color(hipal[i]); //redukuj paletu; - max_colors=256; // pocet barev zatim 256; - } - -char test_transp(char c,word w) - { - int r1,g1,b1; - int r2,g2,b2; - int diff; - - r1=flc_paleta[c][0]>>3; - g1=flc_paleta[c][1]>>3; - b1=flc_paleta[c][2]>>3; - w&=0x7fff; - b2=w;g2=b2>>5;r2=g2>>5;b2&=0x1f;g2&=0x1f; - r1-=r2;g1-=g2;b1-=b2; - diff=abs(r1)+abs(g1<<1)+abs(b1); - return diff<=hranice; - } - -void create_delta(char *frame_buffer) - { - char *delta; - char *data; - long colors2; - int x,y; - word *p; - char skip,skc,cpc; - char c1,c2,*a,d; - - delta=delta_data; - data=frame_delta; - a=frame_buffer; - for(y=0;y<180;y++) - { - p=&last_frame[y]; - skip=1; - skc=0; - cpc=0; - for(x=0;x<160;x++) - { - c1=*a++;c2=*a++; - c1=color_map[c1]; - c2=color_map[c2]; - d=test_transp(c1,p[0]) && test_transp(c2,p[1]); - if (d!=skip) - { - if (skip) *delta++=skc;else *delta++=cpc; - skip=!skip;skc=0;cpc=0; - } - if (!skip) - { - *data++=c1; - *data++=c2; - colors2=hipal[c1]+(hipal[c2]<<16); - *(long *)p=colors2; - cpc++; - } - else skc++; - p+=2; - pal_use[c1]=1; - pal_use[c2]=1; - } - if (!skip) *delta++=cpc; - if (skc==160 && *(delta-1)!=0xff && delta!=delta_data) delta[-1]++; //preskoc n radek - else *delta++=0xc0; //oznac konec radky - } - delta_data_size=delta-delta_data; - frame_delta_size=data-frame_delta; - } - - -void reduce_palette() //redukuje paletu na nejmensi nutny pocet barev - { - int i,j; - for(i=0,j=0;i<256;i++) - { - if (pal_use[i]) - { - hipal[j]=hipal[i]; - color_map[i]=j++; - } - } - max_colors=j; - } - -void filter_colors(void *block,int size,void *colormap); //prefiltruje blok dat podle color_map -#pragma aux filter_colors parm [edi][ecx][ebx]=\ - "lp1: mov al,[edi]"\ - " xlatb"\ - " stosb"\ - " loop lp1"\ - modify [eax]; - - -void *join_two_blocks(void *d1,void *d2,int siz1,int siz2,long *celk) - { - long siz; - char *d; - void *x; - - siz=siz1+siz2+4; - d=(char *)getmem(siz); - x=d; - memcpy(d,&siz1,4);d+=4; - memcpy(d,d1,siz1);d+=siz1; - memcpy(d,d2,siz2); - *celk=siz; - return x; - } - -void create_last_frame(void *source,void *target,void *pal,int size); -#pragma aux create_last_frame parm [esi][edi][ebx][ecx]=\ - "lp1: lodsb"\ - " movzx eax,al"\ - " mov eax,[eax*2+ebx]"\ - " stosw"\ - " loop lp1"\ - modify[eax] - - -void create_mgif_pal() - { - write_chunk(MGIF_PAL,max_colors*2,hipal); - } - - -void create_mgif_lzw() - { - int siz; - - conv_2_hicolor(); - init_palmap(); - create_mgif_pal(); - filter_colors(frame_buffer,FRAME_LEN,color_map); - create_last_frame(frame_buffer,last_frame,hipal,FRAME_LEN); - init_lzw_compressor(8); - memset(lzw_buffer,0,sizeof(lzw_buffer)); - siz=lzw_encode(frame_buffer,lzw_buffer,FRAME_LEN); - if (siz>FRAME_LEN) write_chunk(MGIF_COPY,FRAME_LEN,frame_buffer); - else write_chunk(MGIF_LZW,siz,lzw_buffer); - done_lzw_compressor(8); - } - - -void create_color_state() - { - int i; - int r1,g1,b1; - int r2,g2,b2; - int diff; - char *c; - word *w; - - memset(color_state,0,sizeof(color_state)); - c=frame_buffer; - w=last_frame; - for(i=0;i>3; - g1=flc_paleta[*c][1]>>3; - b1=flc_paleta[*c][2]>>3; - b2=*w;g2=b2>>5;r2=g2>>5;b2&=0x1f;g2&=0x1f; - r1-=r2;g1-=g2;b1-=b2; - diff=abs(r1)+abs(g1<<1)+abs(b1); - color_state[diff]++; - c++;w++; - } - } - -void set_max_color_change(int cchange) - { - int i,s; - - s=0;cchange=57600-cchange; - for(i=sizeof(color_state)/sizeof(word)-1;s0;i--) s+=color_state[i]; - if (s>=cchange) i++; - hranice=i+hdiff;if (hranice<0) hranice=0; - } - -int rozptyl(int v1,int v2) - { - int c1,c2,x,s; - x=v1+v2>>1; - c1=(x-v1); - c2=(x-v2); - s=c1*c1+c2*c2; - return s; - } - -void create_low_quality() - { - void *snd;int l; - char *sn,*sr,c1,c2; - int rs,bs,gs; - - l=FRAME_LEN; - sr=frame_buffer; - snd=calc_data; - sn=(char *)snd; - l--; - while (l--) - { - c1=*sr++; - c2=*sr; - rs=rozptyl(flc_paleta[c1][0],flc_paleta[c2][0]); - gs=rozptyl(flc_paleta[c1][1],flc_paleta[c2][1]); - bs=rozptyl(flc_paleta[c1][2],flc_paleta[c2][2]); - if (rs+gs+bsFRAME_LEN) - { - create_mgif_lzw(); - return; - } - if (!frame_delta_size) return; - reduce_palette(); - filter_colors(frame_delta,frame_delta_size,color_map); - d=join_two_blocks(delta_data,frame_delta,delta_data_size,frame_delta_size,&siz); - init_lzw_compressor(8); - memset(lzw_buffer,0,sizeof(lzw_buffer)); - siz=lzw_encode(d,lzw_buffer,siz); - done_lzw_compressor(); - free(d); - if (siz>FRAME_LEN) - { - create_mgif_lzw(); - return; - } - write_chunk(MGIF_DELTA,siz,lzw_buffer); - create_mgif_pal(); - } - -void create_sound_track(int size) - { - void *p; - - p=getmem(size); - memset(p,0,size); - write_chunk(MGIF_SOUND,size,p); - free(p); - } - -void reserve_track() - { - int size; - - size=SOUND_SPEED/speed; - size&=~1; - create_sound_track(size); - } - -void prereserve_tracks() - { - int size; - int celk; - - size=SOUND_SPEED/speed; - size&=~1; - celk=PRE_SOUND; - while (celk-size>0) - { - open_frame(); - create_sound_track(size); - close_frame(); - celk-=size; - } - if (celk) - { - open_frame(); - create_sound_track(celk); - close_frame(); - } - } - -void fill_header(int frames) - { - memset(&gh,0,sizeof(gh)); - strncpy(gh.sign,MGIF,4); - strncpy(gh.year,MGIF_Y,2); - gh.eof=26; - gh.ver=VER; - gh.frames=frames; - } - - - -void show_screen() - { - word *c; - int i,j; - word *w; - - c=last_frame; - w=screen; - for(i=0;i<180;i++) - { - for(j=0;j<320;j++) - { - *w++=*c; - *w++=*c; - c++; - } - w+=640; - } - showview(0,0,640,360); - showview(0,400,200,20); - } - - -void write_frame_size(int i,int col) - { - char s[20]; - curcolor=0;bar(0,400,200,420); - sprintf(s,"%d %d %d",i,col,hranice);position(0,400);outtext(s); - } - -compress_flc(char *name) - { - int x; - - Open_FLC (name); - charcolors[0]=0; - charcolors[1]=0x7fff; - Get_first_frame (); - Decompress_frame (); - curcolor=0;bar(0,0,639,479); - open_frame(); - create_mgif_lzw(); - reserve_track(); - close_frame();write_frame_size(last_frame_size,max_colors); - show_screen(); - for (x=2; x<=h_flc.frames; x++) - { - Get_next_frame (); - Decompress_frame (); - open_frame(); - create_mgif_delta(); - reserve_track(); - close_frame(); - write_frame_size(last_frame_size,max_colors); - if (last_frame_size>MAX_FRAME) hdiff++; - else if (last_frame_size0) hdiff--; - else if (hdiff>0) hdiff--;else if(hdiff<0) hdiff++; - show_screen (); - } - Close_FLC(); - } - -void create_mgf_file(char *name) - { - mgf=fopen(name,"wb+"); - fwrite(&gh,1,sizeof(gh),mgf); - total_frames=0; - prereserve_tracks(); - } - - -void close_mgf_file() - { - fseek(mgf,0,SEEK_SET); - fill_header(total_frames); - fwrite(&gh,1,sizeof(gh),mgf); - fclose(mgf); - } - - -void create_mult_and_square() - { - int i; - - puts("Creating tables..."); - for(i=0;i<64;i++) mult_table[i]=(short)((i-32)*(i-32)); - for(i=0;i<4096;i++) square_table[i]=(short)sqrt(i); - } - -extern int sada7; - - -main(int argc,char *argv[]) - { - puts("\n(C)1997 Komprimator Motion GIF v0.9 by Ondrej Novak"); - if (argc<3) - { - puts("Pouziti:");putchar('\n');; - puts("MGIF source.flc target.mgf [speed] [lowq] [min_fr] [max_fr] [colorq]");putchar('\n'); - puts("speed - Prehravaci rychlost ve snimkach za sekundu (pro 22050kHz)\n" - "lowq - Nejnizsi mozny rozptyl barev sousednich bodu (snizuje kvalitu\n" - " obrazu) (default: 0)\n" - "min_fr - Pozadavek na nejmensi velikost frame. Pod touto hranici v \n" - " nasledujicim frame snizi velikost ztraty (default: 0)\n" - "max_fr - Pozadavek na nejvetsi velikost frame. Pri prekroceni teto \n" - " hranice se zvysi ztrata o jeden bod. (default 30000)\n" - "colorq - Tato hodnota slouzi k predvidani velikosti ztraty. Udava\n" - " kolik bodu z celkoveho poctu zmen ve frame se menit nebude\n" - " Program pak vybere ty nejmensi rozdily a ty do rozdilove \n" - " mapy nezahrne. (default: 0)\n" - "Velikost nejmensiho rozdilu je zobrazen pri komprimaci jako treti cislo\n" - "Nula udava ze se nezapisuji jen ty body, ktere se nemeni.\n\n" - "Pozn: Bezne neni nutne uvadet parametr colorq protoze stupen ztraty se \n" - "voli podle vysledku predchoziho frame. Je dobre ho uvest pri velkych\n" - "vykyvech velikosti frame. Tak zhruba pri �10KB. Hodnoty parametru se \n" - "voli od 25000-35000, cim vyssi, tim vyssi stupen ztraty"); - exit(0); - } - switch (argc) - { - case 8:sscanf(argv[7],"%d",&colorq); - case 7:sscanf(argv[6],"%d",&max_fr); - case 6:sscanf(argv[5],"%d",&min_fr); - case 5:sscanf(argv[4],"%d",&lowq); - case 4:sscanf(argv[3],"%d",&speed); - } - create_mgf_file(argv[2]); - initmode32(); - curfont=(void *)&sada7; - compress_flc(argv[1]); - closemode(); - puts("Zaviram Motion GIF..."); - close_mgf_file(); - } diff --git a/VIDEO/MGIF98.C b/VIDEO/MGIF98.C deleted file mode 100644 index ee41077..0000000 --- a/VIDEO/MGIF98.C +++ /dev/null @@ -1,376 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - - -#define PIC_XS 320 -#define PIC_YS 184 -#define HICOLOR 32768 -#define PICTURE "TEST1.PCX" -#define PI 3.141592654 -#define C(x) ((x)==0?0.5:1.0) -#define QUALITY 4 - -typedef signed char t_y_buffer[PIC_YS*PIC_XS]; -typedef signed char t_cb_buffer[PIC_YS*PIC_XS/2]; -typedef signed char t_cr_buffer[PIC_YS*PIC_XS/2]; - -typedef signed char T_COLORT[HICOLOR][3]; -typedef short T_COLORIT[64][64][64]; - -t_y_buffer y_buff,y_buff_new; -t_cb_buffer cb_buff,cb_buff_new; -t_cr_buffer cr_buff,cr_buff_new; -T_COLORT colort; -T_COLORIT colorit; - -/*char y_iquant[64]= - { - 16,11,10,16,24,40,51,61, - 12,12,14,19,26,58,60,55, - 14,13,16,24,40,57,69,56, - 14,17,22,29,51,87,80,61, - 18,22,37,56,68,109,103,77, - 24,35,55,64,81,104,113,92, - 49,64,78,87,103,121,120,101, - 72,92,95,98,112,100,103,99 - }; -*/ -signed char y_iquant[64]= - { - 4, 8, 9, 10,15,20,22,30, - 8,8,9,11,16,21,24,30, - 9,9,10,12,20,25,30,36, - 9,10,11,13,25,30,35,38, - 10,12,15,20,25,35,40,45, - 11,14,20,27,41,50,55,60, - 20,30,40,45,50,61,60,50, - 32,48,49,51,50,51,50,49, - }; - - -char test[]= - { - 139,144,149,153,155,155,155,155, - 144,151,153,156,159,156,156,156, - 150,155,160,163,158,156,156,156, - 159,161,162,160,160,159,159,159, - 159,160,161,162,162,155,155,155, - 161,161,161,161,160,157,157,157, - 162,162,161,163,162,157,157,157, - 162,162,161,161,163,158,158,158 - }; - -signed char c_iquant[64]= - { - 2,4,5,5,6,10,11,15, - 4,4,5,5,8,10,12,15, - 4,4,6,6,10,12,15,18, - 4,5,5,6,12,15,17,18, - 5,6,7,10,12,16,20,22, - 6,7,10,13,20,25,26,30, - 10,15,20,22,25,30,30,25, - 16,24,25,26,25,26,25,25, - }; - - - -signed char koef_table[PIC_YS*PIC_XS]; - -short *picture; - -char code_tab[][2]= - { - {0,0},{1,0},{0,1},{0,2},{1,1},{2,0},{3,0},{2,1},{1,2},{0,3},{0,4},{1,3},{2,2}, - {3,1},{4,0},{5,0},{4,1},{3,2},{2,3},{1,4},{0,5},{0,6},{1,5},{2,4},{3,3},{4,2}, - {5,1},{6,0},{7,0},{6,1},{5,2},{4,3},{3,4},{2,5},{1,6},{0,7},{1,7},{2,6},{3,5}, - {4,4},{5,3},{6,2},{7,1},{7,2},{6,3},{5,4},{4,5},{3,6},{2,7},{3,7},{4,6},{5,5}, - {6,4},{7,3},{7,4},{6,5},{5,6},{4,7},{5,7},{6,6},{7,5},{7,6},{6,7},{7,7} - }; - -signed char dct[64][64]; //v poradi [koef;x,y] - koef dle tabulky -signed char ict[64][64]; //v poradi [x,y;koef];koef dle tabulky - -signed short mlt[256][256]; //[i,j]=i*j -signed char mlt2[256][256]; //[i,j]=i*j (s oriznutim) - - -void create_color_table(void) - { - int r,g,b; - int y,cb,cr,i; - - - puts("Creating SECAM CT table"); - for(i=0;i>10; - g=(i>>5) & 0x1f; - b=i & 0x1f; - r<<=3; - g<<=3; - b<<=3; - y=(r*299+g*587+b*114)/1000; - cb=564*(b-y)/1000; - cr=713*(r-y)/1000; - colort[i][0]=y-128; - colort[i][1]=cb; - colort[i][2]=cr; - } - for(y=0;y<64;y++) - for(cb=-32;cb<31;cb++) - for(cr=-32;cr<31;cr++) - { - int y2=y<<2,cr2=cr<<3,cb2=cb<<3; - r=y2+cr2*1402/1000; - g=y2-(cb2*344+cr2*714)/1000; - b=y2+cb2*1772/1000; - r>>=3; - g>>=3; - b>>=3; - if (r>31) r=31; - if (g>31) g=31; - if (b>31) b=31; - if (r<0) r=0; - if (g<0) g=0; - if (b<0) b=0; - i=(r<<10)+(g<<5)+b; - colorit[(y-32)&63][cb&63][cr&63]=i; - } - } - -#define NORMALIZE(i) if (i>127) i=127;else if (i<-128) i=-128;else; - -void rozklad_obrazku(void) - { - int i; - - for(i=0;i>1,k; - k=colort[picture[i+3]][0]-y_buff_new[i]; - NORMALIZE(k); - y_buff[i]=k; - if (i & 1) - { - cb_buff[j]+=colort[picture[i+3]][1]>>2; - cr_buff[j]+=colort[picture[i+3]][2]>>2; - k=cb_buff[j]-cb_buff_new[j];NORMALIZE(k); - cb_buff[j]=k; - k=cr_buff[j]-cr_buff_new[j];NORMALIZE(k); - cr_buff[j]=k; - } - else - { - cb_buff[j]=colort[picture[i+3]][1]>>2; - cr_buff[j]=colort[picture[i+3]][2]>>2; - } - } - } - -void slozeni_obrazku(void) - { - int i,x,y; - int yy,cb,cr,w; - unsigned short *ww; - - i=0; - for(y=0;y<184;y++) - for(x=0;x<320;x++) - { - yy=y_buff_new[i]>>2; - cb=(cb_buff_new[i>>1]>>2); - cr=(cr_buff_new[i>>1]>>2); - w=colorit[yy&63][cb&63][cr&63];w=w+(w<<16); - ww=screen+x*2+y*1280; - ww[0]=w;ww[1]=w; - ww[640]=w;ww[641]=w; - //screen[x+y*640]=colorit[y_buff[i]>>2][16][16]; - i++; - } - showview(0,0,0,0); - } - -void create_dct(void) - { - int j,k,u,v,x,y; - - puts("Creating DCT table:"); - for(k=0;k<64;k++) - for(j=0;j<64;j++) - { - float res; - - u=code_tab[j][0]; - v=code_tab[j][1]; - x=k & 7;y=k>>3; - res=127*cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16); - dct[j][k]=(signed char)res; - } - - } - -void create_ict(void) - { - int j,k,u,v,x,y; - - - puts("Creating ICT table:"); - for(j=0;j<64;j++) - for(k=0;k<64;k++) - { - float res; - - u=code_tab[j][0]; - v=code_tab[j][1]; - x=k & 7;y=k>>3; - res=127*cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16); - ict[k][j]=(signed char)res; - } - } - -void create_mult() - { - int i,j,k; - - puts("Creating MULT table:"); - for(i=-128;i<128;i++) - for(j=-128;j<128;j++) - { - mlt[i & 0xff][j & 0xff]=i*j; - k=i*j;NORMALIZE(k); - mlt2[i & 0xff][j & 0xff]=k; - } - } - -#define GET_DCT(i,k,p) (mlt[i][dct[k][p]]) -#define GET_ICT(i,k,p) (mlt[i][ict[k][p]]) - -void dct_buffer(void *buffer,int box_x,int box_y,int linelen,char *quant) - { - int nextline=7*linelen; - int row,col,kn,pp; - char *c,*p; - signed char *ktab; - quant; - - c=buffer; - ktab=koef_table; - - for(row=0;row>=2; - suma*=C(u)*C(v);NORMALIZE(suma); - //suma/=quant[kn]; - *ktab++=(signed char)(suma); - } - c+=8; - } - c+=nextline; - } - } - -void ict_buffer(void *buffer,int box_x,int box_y,int linelen,char *quant) - { - int nextline=7*linelen; - int row,col,kn,pp; - signed char *c,*p; - signed char *ktab; - char kofs[64],ko=0; - quant; - - c=buffer; - ktab=koef_table; - - for(row=0;row>=7; - suma>>=2; - suma+=p[0]; - NORMALIZE(suma); - p[0]=suma;p++; - pp++;if (!(pp & 7)) p+=linelen-8; - } - ktab+=64; - c+=8; - } - c+=nextline; - } - } - - -main() - { - char pcn[100]; - int i; - create_color_table(); - create_dct(); - create_ict(); - create_mult(); - memset(y_buff_new,0,sizeof(y_buff_new)); - memset(cr_buff_new,0,sizeof(cr_buff_new)); - memset(cb_buff_new,0,sizeof(cb_buff_new)); - //dct_buffer(test,1,1,8,y_iquant); - //ict_buffer(y_buff_new,40,23,320,y_iquant); - - initmode32(); - - for(i=0;i<100;i++) - { - sprintf(pcn,"TEST%02d.PCX",i); - open_pcx(pcn,A_15BIT,(void **)&picture); - rozklad_obrazku(); - free(picture); - dct_buffer(y_buff,40,23,320,y_iquant); - ict_buffer(y_buff_new,40,23,320,y_iquant); - dct_buffer(cr_buff,20,23,160,c_iquant); - ict_buffer(cr_buff_new,20,23,160,c_iquant); - dct_buffer(cb_buff,20,23,160,c_iquant); - ict_buffer(cb_buff_new,20,23,160,c_iquant); - - - //memcpy(y_buff_new,y_buff,sizeof(y_buff)); -// memcpy(cr_buff_new,cr_buff,sizeof(cr_buff)); -// memcpy(cb_buff_new,cb_buff,sizeof(cb_buff)); - - slozeni_obrazku(); - } - getchar(); - } diff --git a/VIDEO/MGIFCAT.C b/VIDEO/MGIFCAT.C deleted file mode 100644 index 70ac756..0000000 --- a/VIDEO/MGIFCAT.C +++ /dev/null @@ -1,216 +0,0 @@ -#include -#include -#include -#include -#include -#include - -MGIF_HEADER_T mhead; -char nohead=1; - -char turns[8]="||//--\\\\"; -char turncnt; - -void show_progress() - { - turncnt=(turncnt+1) & 0x7; - cprintf("> %c <\x8\x8\x8\x8\x8",turns[turncnt]); - } - -void *load_frame(FILE *f,long *size,char *chunks) - { - long l; - int siz; - void *c; - - if (!fread(&l,4,1,f)) return NULL; - siz=l>>8; - *chunks=l & 0xff; - *size=siz; - c=malloc(siz); - if (c==NULL) return NULL; - if (!fread(c,siz,1,f)) - { - free(c); - return NULL; - } - return c; - } - -char save_frame(FILE *f,char chunks,void *data,long size) - { - long l; - - l=(size<<8)|chunks; - if (!fwrite(&l,4,1,f)) return 1; - if (!fwrite(data,size,1,f)) return 1; - return 0; - } - -void *trans_frame(void *src,int size,char chunks,int soundtrk,long *outlen) - { - char *s,*t; - long l; - void *tg; - - tg=malloc(size+soundtrk); - t=tg;s=src; - if (tg==NULL) return NULL; - while (chunks--) - { - l=*(long *)s;s+=sizeof(l); - if ((l & 0xff) !=MGIF_SOUND) - { - int size=l>>8; - memcpy(t,&l,sizeof(l)); - t+=4; - memcpy(t,s,size); - t+=size; - s+=size; - } - else - { - long w; - w=(soundtrk<<8)|MGIF_SOUND; - *(long *)t=w;t+=4; - memset(t,0,soundtrk); - s+=l>>8;t+=soundtrk; - } - } - *outlen=t-(char *)tg; - return tg; - } - -void *create_sound(int soundtrk, long *outlen) - { - void *tg; - char *t; - - tg=malloc(soundtrk+4); - t=tg; - if (tg==NULL) return NULL; - *(long *)t=MGIF_SOUND|(soundtrk<<8); - t+=4; - memset(t,0,soundtrk);t+=soundtrk; - *outlen=t-(char *)tg; - return tg; - } - -#define PRE_SOUND ((256*1024)/2) - -int leading_track(FILE *f,int soundtrk) - { - int celk,siz; - void *p;long s; - char res; - int frames=0; - - celk=PRE_SOUND; - while (celk) - { - if (celk>soundtrk) siz=soundtrk;else siz=celk; - p=create_sound(siz,&s); - celk-=siz; - res=save_frame(f,1,p,s);frames++; - free(p); - if (res) return 0; - } - return frames; - } - -char copy_mgif(FILE *tg,FILE *src,int speed) - { - MGIF_HEADER_T sh; - int soundtrk=44100/speed; - void *p;char chunks;long size; - void *q;long qsize; - char skip_lead=0; - - if (!fread(&sh,sizeof(sh),1,src)) return 2; - if (nohead) - { - int res; - mhead=sh,nohead=0; - fwrite(&mhead,sizeof(mhead),1,tg); - res=leading_track(tg,soundtrk); - if (!res) return 1; - mhead.frames=res; - } - while(sh.frames--) - { - p=load_frame(src,&size,&chunks); - if (p==NULL)return 1; - if (chunks!=1 || skip_lead) - { - q=trans_frame(p,size,chunks,soundtrk,&qsize); - if (q==NULL) {free(p);return 1;} - if (save_frame(tg,chunks,q,qsize)) {free(p);free(q);return 1;} - mhead.frames+=1; - free(q); - show_progress(); - skip_lead=1; - } - free(p); - } - return 0; - } - -char add_mgif(FILE *tg,char *filename,int speed) - { - FILE *src; - char res; - - src=fopen(filename,"rb"); - if (src==NULL) return 255; - res=copy_mgif(tg,src,speed); - close(src); - return res; - } - -int main(int argc,char *argv[]) - { - int ac; - int speed; - FILE *f; - - if (argc<4) - { - puts("Malo parametru. Pouziti:\n" - "\n" - "MGIFCAT [zdroj2.mgf [zdroj3.mgf [...]]]\n" - "\n" - "Rychlost je ve frames za sekundu\n" - "POZOR! Cilovy soubor bude prepsan! Neprenasi zvukove stopy!"); - return 1; - } - ac=3; - if (sscanf(argv[1],"%d",&speed)!=1) - { - printf("Neplatna rychlost: %s\n",argv[1]); - return 1; - } - f=fopen(argv[2],"wb"); - if (f==NULL) - { - printf("Nemohu otevrit vystupni soubor: %s\n",argv[2]); - return 1; - } - nohead=1; - while (ac -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lzw.h" -#include "mgifeobj.h" -#include "mgifedit.h" -#include "mgifeact.h" -#include "mgifebld.h" - - -#define PRJ ".PRJ" - -FRAME_DEFS_T *mgf_frames=NULL; -MGIF_HEADER_T mgf_header; -char *mgif_filename; - -word preview_frame[320*180+3]; -word check1; -word work_frame[320*180]; -word check2; -word frame_shift; - -TRACK_INFO_T *smp_prg=NULL; -int samples_total=0; -int last_unchanged_frame=0; - - -long total_frames=0; - -void set_mgif(char *filename) - { - mgif_filename=NewArr(char,strlen(filename)+1); - strcpy(mgif_filename,filename); - } - -#define error_exit(f,n) {fclose(f);return (n);} - -int examine_mgif_file(char (*progress)(int perc)) - { - FILE *f; - MGIF_HEADER_T head; - int r; - int frame_size=0; - char chunks; - int chunk_size=0; - char chunk_type; - int frame,chunk; - int track_size=-1; - FRAME_DEFS_T *fd; - FRAME_DEFS_T *fg; - char fgp=0; - - frame_shift=0; - f=fopen(mgif_filename,"rb"); - if (f==NULL) return EX_NOT_FOUND; - r=fread(&head,1,sizeof(head),f); - if (r!=sizeof(head)) error_exit(f,EX_READ_ERROR); - memcpy(&mgf_header,&head,sizeof(head)); - total_frames=head.frames; - mgf_frames=NewArr(FRAME_DEFS_T,total_frames); - memset(mgf_frames,0,sizeof(FRAME_DEFS_T)*total_frames); - fg=fd=mgf_frames; - for(frame=0;frameframe_start=ftell(f); - if (fread(&chunks,1,1,f)!=1) error_exit(f,EX_READ_ERROR); - if (fread(&frame_size,1,3,f)!=3) error_exit(f,EX_READ_ERROR); - for(chunk=0;chunkdisplay_start=ftell(f); - fg->displ_type=chunk_type; - fg->display_size=chunk_size; - fgp=1; - break; - case MGIF_SOUND:fd->sound_start=ftell(f); - track_size=chunk_size; - sound=1; - fd->track_size=track_size; - break; - case MGIF_PAL: fg->pal_start=ftell(f); - break; - - } - fseek(f,chunk_size,SEEK_CUR); - } - - fd->changed=1;fd->vol_save=0; - if (!sound) error_exit(f,EX_NO_SOUND); - if (progress(frame*100/total_frames)) break; - } - fclose(f); - return EX_NO_ERROR; - } - -int add_sample(char *sample) - { - char *d; - - d=NewArr(char,strlen(sample)+1); - strcpy(d,sample); - samples_total++; - smp_prg=grealloc(smp_prg,samples_total*sizeof(TRACK_INFO_T)); - smp_prg[samples_total-1].sample_name=d; - smp_prg[samples_total-1].loop_start=-1; - smp_prg[samples_total-1].loop_end=-1; - smp_prg[samples_total-1].user_name=NULL; - smp_prg[samples_total-1].levy=NULL; - smp_prg[samples_total-1].pravy=NULL; - smp_prg[samples_total-1].starts=NULL; - smp_prg[samples_total-1].starts_count=0; - return samples_total-1; - } - -void remove_sample(int id) - { - TRACK_DATA_T *p,*q; - if (id>=samples_total) return; - p=smp_prg[id].levy; - while(p!=NULL) - { - q=p->next;free(p);p=q; - } - p=smp_prg[id].pravy; - while(p!=NULL) - { - q=p->next;free(p);p=q; - } - free(smp_prg[id].starts); - free(smp_prg[id].sample_name); - free(smp_prg[id].user_name); - samples_total--; - if (id!=samples_total)memcpy(smp_prg+id,smp_prg+id+1,(samples_total-id)*sizeof(TRACK_INFO_T)); - smp_prg=grealloc(smp_prg,samples_total*sizeof(TRACK_INFO_T)); - } - -void build_sample_list(void *list) - { - TSTR_LIST ls; - int id; - - memcpy(&ls,list,sizeof(void **)); - if (ls!=NULL) release_list(ls); - ls=create_list(samples_total+1); - for(id=0;id"); - memcpy(list,&ls,sizeof(void **)); - } - - -char get_vpoint(TRACK_DATA_T *track,int frame,TRACK_DATA_T *vp) - { - int fr; - TRACK_DATA_T *p,*q; - if (track==NULL) - { - vp->vpoint1=0; - vp->vpoint2=0; - vp->time=total_frames-frame; - vp->next=NULL; - return 1; - } - fr=0; - q=p=track; - while (p!=NULL && p->time+fr<=frame) - { - fr+=p->time; - q=p; - p=p->next; - } - if (p!=NULL) - if (fr==frame) - { - memcpy(vp,p,sizeof(*vp)); - return 0; - } - else - { - int dif; - int half; - - fr=frame-fr; - half=p->time/2; - dif=(p->vpoint2-p->vpoint1); - vp->vpoint1=p->vpoint1+(dif*fr+half)/p->time; - vp->vpoint2=p->vpoint2; - vp->time=p->time-fr; - vp->next=p->next; - } - else - { - vp->vpoint1=vp->vpoint2=q->vpoint2; - vp->time=total_frames-frame; - vp->next=NULL; - } - return 1; - } - -void add_vpoint(TRACK_DATA_T **track,int frame) - { - TRACK_DATA_T *p,*z; - int fr,alltime; - - p=*track; - if (p==NULL) - { - z=New(TRACK_DATA_T); - get_vpoint(p,0,z); - *track=z; - z->next=NULL; - add_vpoint(track,frame); - return; - } - fr=0; - while (p!=NULL && fr+p->time<=frame) - { - fr+=p->time; - p=p->next; - } - if (p==NULL) crash("Frame out of range!"); - if (fr==frame) return; - alltime=p->time; - p->time=frame-fr; - z=New(TRACK_DATA_T); - z->vpoint1=p->vpoint1+((p->vpoint2-p->vpoint1)*p->time+alltime/2)/alltime; - z->vpoint2=p->vpoint2; - z->changed=1;p->changed=1; - p->vpoint2=z->vpoint1; - z->next=p->next; - p->next=z; - z->time=alltime-p->time; - } - -void change_vpoint_spacing(TRACK_DATA_T *track,int frame,int value) - { - TRACK_DATA_T *p,*q; - int fr; - - p=track; - if (track==NULL) return; - while (p->next!=NULL) p=p->next; - if (p->time<=value) value=p->time-1; - if (!value) return; - q=track;fr=0; - while (q!=NULL && q->time+fr<=frame) - { - fr+=q->time; - q=q->next; - } - if (q==NULL) return; - if (fr+q->time+value<=frame) return; - if (q->time+value<1) return; - if (frtime+=value; - p->time-=value; - } - -void set_vpoint(TRACK_DATA_T **track,int frame,int vp1,int vp2) - { - int fr=0; - TRACK_DATA_T *p,*q; - - add_vpoint(track,frame); - p=*track;q=NULL; - while (p!=NULL && fr!=frame) - { - fr+=p->time; - q=p; - p=p->next; - } - p->changed=1; - p->vpoint1=vp2; - if (q!=NULL) - { - q->vpoint2=vp1; - q->changed=1; - } - } - -void add_restart(TRACK_INFO_T *ti,int frame) - { - int *p=ti->starts; - int sc=ti->starts_count; - int i; - - for(i=0;iframe) break; - p=grealloc(p,sizeof(int)*(sc+1)); - p[sc]=frame; - for(i=sc-1;i>=0;i--) - { - if (p[i]>p[i+1]) - { - p[i]^=p[i+1]; - p[i+1]^=p[i]; - p[i]^=p[i+1]; - } - } - ti->starts=p; - ti->starts_count++; - } - -void delete_restart(TRACK_INFO_T *ti,int frame) - { - int i; - int *p=ti->starts; - int sc=ti->starts_count; - - for(i=0;iframe) return;else if (p[i]==frame) break; - if (i==sc) return; - memcpy(p+i,p+i+1,sizeof(int)*(sc-i-1)); - p=grealloc(p,sizeof(int)*(sc-1)); - ti->starts=p; - ti->starts_count--; - } - -void delete_vpoint(TRACK_DATA_T **track,int frame) - { - int fr; - TRACK_DATA_T *p,*q; - - fr=0; - p=*track; - if (p==NULL) return; - q=NULL; - while (p!=NULL && fr!=frame) - { - fr+=p->time; - q=p;p=p->next; - } - if (p==NULL) return; - if (q==NULL) - { - if (p->next!=NULL) - { - *track=p->next; - p->next->vpoint1=p->vpoint1; - p->next->time+=p->time; - } - else - { - *track=NULL; - } - free(p); - } - else - { - q->next=p->next; - q->vpoint2=p->vpoint2; - q->time+=p->time; - free(p); - } - return; - } - - -char join_two_frames(void *source,void *target); -#pragma aux join_two_frames parm[esi][edi]=\ - "mov ecx,57600"\ - "xor bl,bl"\ -"lp1: lodsw"\ -" test [edi],0x8000"\ -" jz sk1"\ -" mov [edi],ax"\ -" or bl,ah"\ -"sk1: add edi,2"\ -" dec ecx"\ -" jnz lp1"\ -modify[ecx eax] value[bl]; - -void build_frame(int frame_num,int *exit) - { - void *data_buff; - void *delta_buff; - void *p; - word palette[256]; - FILE *f; - FRAME_DEFS_T *fd=mgf_frames+frame_num; - char full=0; - int counter=0; - static last_frame=-1; - char fast,flash; - static zavora=0; - - if (last_frame==frame_num) - { - *exit=0; - return; - } - if (frame_num>=total_frames) crash("frame_num>=total_frames"); - if (frame_num-last_frame!=1) - { - memset(preview_frame,0x80,sizeof(preview_frame)); - memset(work_frame,0x80,sizeof(work_frame)); - p=work_frame;fast=0; - } - else - { - p=preview_frame+3; - last_frame=frame_num; - fast=1; - } - preview_frame[0]=320; - preview_frame[1]=180; - preview_frame[2]=15; - while (zavora==1) task_sleep(NULL); - zavora=1; - f=fopen(mgif_filename,"rb"); - data_buff=getmem(100000); - delta_buff=getmem(100000); - init_lzw_compressor(8); - do - { - reinit_lzw(); - if (fd->pal_start) - { - fseek(f,fd->pal_start,SEEK_SET); - fread(palette,1,sizeof(palette),f); - } - if (fd->display_start) - { - fseek(f,fd->display_start,SEEK_SET); - fread(data_buff,1,fd->display_size,f); - switch (fd->displ_type) - { - case MGIF_LZW:lzw_decode(data_buff,delta_buff); - show_full_lfb12e(delta_buff,p,palette); - break; - case MGIF_DELTA:lzw_decode(data_buff,delta_buff); - show_delta_lfb12e(delta_buff,p,palette); - break; - case MGIF_COPY:show_full_lfb12e(data_buff,p,palette); - break; - } - if (!fast) full=!(join_two_frames(work_frame,preview_frame+3) & 0x80); - if (!((counter++) & 0xf) || full) - { - c_set_value(win_preview,10,0); - c_set_value(win_preview,10,(int)&preview_frame); - c_set_value(win_preview,5,(full||fast)?LABELCOLOR:(flash?0x7c00:0x3e0)); - flash=!flash; - if (waktual->id!=win_preview)redraw_desktop(); - } - if (!fast) task_sleep(NULL); - if (task_info[curtask]) break; - } - fd--; - } - while (fd>=mgf_frames && !full && !fast); - done_lzw_compressor(); - free(data_buff); - free(delta_buff); - fclose(f); - if (full) last_frame=frame_num; - zavora=0; - *exit=0; - } - -extern char backsndbuff[BACK_BUFF_SIZE]; -extern volatile long backsnd; -extern volatile long backstep; -extern volatile int backfine; -extern long vals_save; - -static stop_preview_flag=0; -static void *bufpos; - - -void preview_block(int start_frame,int x, int y) - { - word *scr; - void *data_buff; - char *dt; - void *delta_buff; - word *palette; - FILE *f; - FRAME_DEFS_T *fd=mgf_frames+start_frame; - int i; - char chunks; - int fsize,shift; - char chunk_type; - int chunk_size; - - schovej_mysku(); - zobraz_mysku(); - stop_preview_flag=0; - if (banking)scr=screen+640*y+x;else scr=(word *)lbuffer+640*y+x; - memset(backsndbuff,0,sizeof(backsndbuff)); - i=total_frames-start_frame; - bufpos=NULL; - if (!i) return; - start_mixing(); - f=fopen(mgif_filename,"rb"); - data_buff=getmem(100000); - delta_buff=getmem(100000); - shift=frame_shift; - fseek(f,fd->frame_start,SEEK_SET); - init_lzw_compressor(8); - backsnd=0;backstep=0x10000;vals_save=fd->vol_save; - do - { - char *gr,*s;char grtype; - long ssize; - fread(&fsize,1,4,f);chunks=fsize & 0xff;fsize>>=8; - fread(data_buff,1,fsize,f); - dt=data_buff; - grtype=0xff; - while (chunks--) - { - chunk_size=*(int *)dt;dt+=4; - chunk_type=chunk_size&0xff;chunk_size>>=8; - switch(chunk_type) - { - case MGIF_PAL:palette=(word *)dt;break; - case MGIF_LZW: - case MGIF_DELTA:reinit_lzw();lzw_decode(dt,delta_buff);grtype=chunk_type;break; - case MGIF_COPY:gr=dt;grtype=chunk_type;break; - case MGIF_SOUND:s=dt;ssize=chunk_size;break; - } - dt+=chunk_size; - } - do_events(); - while (test_next_frame(bufpos,ssize)) do_events(); - bufpos=sound_decompress(s,bufpos,ssize,&mgf_header.ampl_table); - if (!shift) - { - switch(grtype) - { - case MGIF_LZW: show_full_interl_lfb130(delta_buff,scr,palette);break; - case MGIF_DELTA:show_delta_interl_lfb130(delta_buff,scr,palette);break; - case MGIF_COPY:show_full_interl_lfb130(gr,scr,palette);break; - } - if (banking) showview(x,y,320,180); - } - else shift--; - fd++; - } - while (--i && !stop_preview_flag && !exit_wait); - done_lzw_compressor(); - free(data_buff); - free(delta_buff); - fclose(f); - stop_mixing(); - exit_wait=0; - } - -void stop_preview() - { - stop_preview_flag=1; - } - - -void save_track(FILE *f,TRACK_DATA_T *t,char *id) - { - fprintf(f,"%s ",id); - while (t!=NULL) - { - fprintf(f,"%d %d %d ",t->vpoint1,t->vpoint2,t->time); - t=t->next; - } - fprintf(f,"\n"); - } - -void save_starts(FILE *f,int *p,int pocet) - { - int i; - - fprintf(f,"%s %d ","START",pocet); - for(i=0;isample_name,ti->user_name==NULL?"":ti->user_name, - ti->loop_start,ti->loop_end,ti->starts_count); - save_track(f,smp_prg[i].levy,"LEFT"); - save_track(f,smp_prg[i].pravy,"RIGHT"); - save_starts(f,smp_prg[i].starts,smp_prg[i].starts_count); - if (smp_prg[i].muted) fputs("MUTED\n",f); - } - fclose(f); - } - -void *get_project_name(char *name) - { - char *c,*d; - - c=NewArr(char,strlen(name)+7); - strcpy(c,name); - d=strrchr(c,'\\');if (d==NULL) d=c; - d=strchr(d,'.');if (d!=NULL) *d=0; - strcat(c,PRJ); - return c; - } - -static void skip_space(FILE *f) - { - int c; - while ((c=getc(f))==32); - ungetc(c,f); - } - -static void skip_nline(FILE *f) - { - int c; - while ((c=getc(f))!='\n' && c!=EOF); - } - -static void *load_track(FILE *f) - { - TRACK_DATA_T *p,*st; - int vp1,vp2,tim,i; - - st=NULL; - i=fscanf(f,"%d %d %d",&vp1,&vp2,&tim); - while (i==3) - { - if (st==NULL) p=st=New(TRACK_DATA_T); - else p=(p->next=New(TRACK_DATA_T)); - p->next=NULL; - p->vpoint1=vp1; - p->vpoint2=vp2; - p->time=tim; - p->changed=0; - i=fscanf(f,"%d %d %d",&vp1,&vp2,&tim); - } - return st; - } - -static void load_starts(FILE *f,int **pole,int *pocet) - { - int i; - fscanf(f,"%d",pocet); - *pole=NewArr(int,*pocet); - for(i=0;i<*pocet;i++) fscanf(f,"%d",*pole+i); - } - - -int load_project(char *prj_name) - { - FILE *f; - int p,i,j; - TRACK_INFO_T *ti; - - f=fopen(prj_name,"r"); - if (f==NULL) return 0; - fscanf(f,"%d %d",&p,&lifikace);skip_nline(f); - smp_prg=NewArr(TRACK_INFO_T,p); - for(i=0;ilevy=NULL;ti->pravy=NULL;ti->starts=NULL; - do - { - skip_space(f); - j=getc(f);ungetc(j,f); - if (j=='#') break; - if (j=='\n') - { - skip_nline(f); - continue; - } - if (j==EOF) break; - fscanf(f,"%s",s);skip_space(f); - if (!strcmp(s,"TRACK")) - { - char s[256]; - ti->muted=0; - fscanf(f,"%[^]",s); - ti->sample_name=NewArr(char,strlen(s)+1);strcpy(ti->sample_name,s); - getc(f);s[0]=0; - fscanf(f,"%[^]",s); - if (s[0]) - { - ti->user_name=NewArr(char,strlen(s)+1);strcpy(ti->user_name,s); - } - else - ti->user_name=NULL; - getc(f); - fscanf(f,"%d %d %d",&ti->loop_start,&ti->loop_end,&ti->starts_count); - } - else if (!strcmp(s,"LEFT")) ti->levy=load_track(f); - else if (!strcmp(s,"RIGHT")) ti->pravy=load_track(f); - else if (!strcmp(s,"START")) load_starts(f,&ti->starts,&ti->starts_count); - else if (!strcmp(s,"MUTED")) ti->muted=1; - else {fclose(f);return -1;} - if (feof(f)) - { - fclose(f);return -2; - } - skip_nline(f); - } - while (1); - } - samples_total=p; - return 0; - } - -void set_changed_full_track(TRACK_INFO_T *tr) - { - set_changed_range(last_unchanged_frame,total_frames-1); - set_changed_track(tr->levy); - set_changed_track(tr->pravy); - last_unchanged_frame=total_frames; - } - -static void do_vol_table_track(TRACK_DATA_T *tr,int indx,char action) - { - int i; - int fr; - int p; - TRACK_DATA_T v; - FRAME_DEFS_T *d; - - for(i=0,fr=0,d=mgf_frames;ichanged|=(d->last_vol[indx]!=p); - d->last_vol[indx]=p; - if (v.time==1) - { - fr+=tr->time; - tr=tr->next; - } - } - } - -void read_vol_table(TRACK_INFO_T *tr) - { - do_vol_table_track(tr->levy,0,0); - do_vol_table_track(tr->pravy,1,0); - } - -void compare_vol_table(TRACK_INFO_T *tr) - { - do_vol_table_track(tr->levy,0,1); - do_vol_table_track(tr->pravy,1,1); - } - -void set_vol_table_nul(void) - { - int i; - FRAME_DEFS_T *d; - - for(i=0,d=mgf_frames;ilast_vol[0]=0; - d->last_vol[1]=0; - } - } - -static long get_track_size(TRACK_INFO_T *tr) - { - long size1=0,size2=0; - TRACK_DATA_T *l,*r; - - l=tr->levy; - r=tr->pravy; - while (l!=NULL) size1+=l->time,l=l->next; - while (r!=NULL) size2+=r->time,r=r->next; - if (size2>size1) return size2;else return size1; - } - -static void track_dopln_na_konci(TRACK_INFO_T *tr) - { - long size1=0,size2=0; - TRACK_DATA_T *l,*r; - - l=tr->levy; - r=tr->pravy; - while (l->next!=NULL) size1+=l->time,l=l->next; - while (r->next!=NULL) size2+=r->time,r=r->next; - l->time=total_frames-size1; - r->time=total_frames-size2; - } - -void warn_size_mistmach(void) - { - int size=total_frames; - int sizeh=size; - int i; - - for(i=0;isizeh) sizeh=s; - } - if (sizetotal_frames) - { - msg_box(PRG_HEADER,'\x1',"MGIFEDIT zjistil,�e film je krat��, ne� stopy " - "ulo�en� v souboru PRJ. Ke spr�vn�mu um�st�n� pou�ij funkci GDelete","Ok",NULL); - } - } - - -int get_inserted_frames(int frame) - { - int s; - - frame+=1; - s=1; - while (framesizeh) sizeh=s; - } - return sizeh-total_frames; - } - -void insert_global(int frame,int count) - { - int i; - for(i=0;i0) - { - delete_vpoint(&smp_prg[i].levy,frame+j); - delete_vpoint(&smp_prg[i].pravy,frame+j); - } - change_vpoint_spacing(smp_prg[i].levy,frame,-count); - change_vpoint_spacing(smp_prg[i].pravy,frame,-count); - track_dopln_na_konci(smp_prg+i); - set_vpoint(&smp_prg[i].levy,frame,vl.vpoint1,vl.vpoint1); - set_vpoint(&smp_prg[i].pravy,frame,vp.vpoint1,vp.vpoint1); - } - } diff --git a/VIDEO/MGIFEACT.H b/VIDEO/MGIFEACT.H deleted file mode 100644 index 05bd62e..0000000 --- a/VIDEO/MGIFEACT.H +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef _MGIFEACT_H -#include - -#define _MGIFEACT_H - -#define EX_NO_ERROR 0 -#define EX_NOT_FOUND -1 -#define EX_NO_SOUND -2 -#define EX_READ_ERROR -3 -#define EX_SOUND_ERROR -4 - -typedef struct frame_defs - { - long frame_start; - long display_start; - long pal_start; - long sound_start; - word displ_type; - long display_size; - long track_size; - char changed; - char last_vol[2]; - long vol_save; - }FRAME_DEFS_T; - -extern FRAME_DEFS_T *mgf_frames; -extern MGIF_HEADER_T mgf_header; -extern char *mgif_filename; -extern long total_frames; -extern int samples_total; -extern word frame_shift; - -int examine_mgif_file(char (*progress)(int perc)); -void set_mgif(char *filename); - -typedef struct track_data_t - { - char vpoint1; - char vpoint2; - char changed; - int time; //0 odpovida restartu. Pak vpointy neplati - struct track_data_t *next; - }TRACK_DATA_T; - -typedef struct track_info_t - { - char *sample_name; - char *user_name; - int loop_start; - int loop_end; - TRACK_DATA_T *levy,*pravy; - int *starts; - int starts_count; - char muted; - }TRACK_INFO_T; - -extern TRACK_INFO_T *smp_prg; - -int add_sample(char *sample_name); -void remove_sample(int id); -void build_sample_list(void *list); -char get_vpoint(TRACK_DATA_T *track,int frame,TRACK_DATA_T *vp); //neexistuje-li spocita se (return 1) -void set_vpoint(TRACK_DATA_T **track,int frame,int vp1,int vp2); //pokud neexistuje tak se vytvori -void add_vpoint(TRACK_DATA_T **track,int frame); -void add_restart(TRACK_INFO_T *ti,int frame); -void delete_restart(TRACK_INFO_T *ti,int frame); -void delete_vpoint(TRACK_DATA_T **track,int frame); -void change_vpoint_spacing(TRACK_DATA_T *track,int frame,int value); - -void lzw_decode(void *source,char *target); -void init_lzw_compressor(int dic_size); -void reinit_lzw(); -void done_lzw_compressor(); - -void preview_block(int start_frame,int x, int y); -void stop_preview(); -void build_frame(int frame_num,int *exit);//TASK! -#pragma aux build_frame parm[] - -void save_project(char *project_name); -int load_project(char *prj_name); -void *get_project_name(char *name); - -void read_vol_table(TRACK_INFO_T *tr); -void compare_vol_table(TRACK_INFO_T *tr); -void set_vol_table_nul(void); - -void set_changed_full_track(TRACK_INFO_T *tr); -void warn_size_mistmach(void); - -int get_inserted_frames(int frame); //tracuje film a odhaduje kolik framu bylo pridano -int get_deleted_frames(void); -void insert_global(int frame,int count); //prida count framu od framu frame. -void delete_global(int frame,int count); //prida count framu od framu frame. - - - -#endif diff --git a/VIDEO/MGIFEBLD.C b/VIDEO/MGIFEBLD.C deleted file mode 100644 index ddfafba..0000000 --- a/VIDEO/MGIFEBLD.C +++ /dev/null @@ -1,426 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lzw.h" -#include "mgifeobj.h" -#include "mgifedit.h" -#include "mgifeact.h" -#include "mgifebld.h" -#include -#include - - -static short **frame_table; -static char work_buff[100000]; -static int last1=0; -static int last2=0; -static int last_time=0; - -int frames_build=0; -int amplifikace=0; - -typedef struct tsample - { - FILE *fs; - int start_data; - int length; - int pos; - long loop_start; - long loop_end; - char running; - char bit16; - char stereo; - }TSAMPLE; - -static TSAMPLE sample; - -static void Create_table_16(short *ampl_table,int difftype) - { - int a,c,d,e; - float b; - - d=-1;e=0; - for(a=0;a<128;a++) - { - b=(a/128.0); - switch (difftype) - { - case 1:b=(b*32768.0);break; - case 2:b=(b*b*32768.0);break; - case 3:b=(b*b*b*32768.0);break; - case 4:b=(b*b*b*b*32768.0);break; - case 5:b=(b*b*b*b*b*32768.0);break; - } - c=(int)b; - if (c==d) e++; - d=c;c+=e; - ampl_table[128+a]=c; - ampl_table[128-a]=-c; - } - } - -static int find_index(short *ampl_table,int value) - { - int i; - - if (value==0) return 128; - if (value>0) - { - for(i=128;i<256;i++) - if (ampl_table[i]>value) return i-1; - return 255; - } - else - { - for(i=128;i>=0;i--) - if (ampl_table[i]32768 || l1<-32768) crash("Building error (owerflow)"); - work_buff[i]=indx; - } - else - { - val=source[i]; - indx=find_index(ampl_table,val-l2); - l2+=ampl_table[indx]; - if (l2>32768 || l2<-32768) crash("Building error (owerflow)"); - work_buff[i]=indx; - } - } - last1=l1;last2=l2; - } - -static char save_buffer(FILE *f,int seekp,short *buffer,int size) - { - compress_buffer_stereo(mgf_header.ampl_table,buffer,size); - fseek(f,seekp,SEEK_SET); - return fwrite(work_buff,1,size,f)!=size; - } - -static char save_all() - { - int i,c=0; - FRAME_DEFS_T *fd; - FILE *f; - - f=fopen(mgif_filename,"rb+"); - if (f==NULL) return 1; - fwrite(&mgf_header,1,sizeof(mgf_header),f); - for(i=0,fd=mgf_frames;ivol_save & 0xffff); - last2=(short)(fd->vol_save>>16); - if (save_buffer(f,fd->sound_start,frame_table[i],fd->track_size)) - { - fclose(f); - return 1; - } - c_set_value(0,10,(c++)*100/frames_build); - do_events();if (exit_wait) break; - fd->changed=0; - free(frame_table[i]);frame_table[i]=NULL; - if (ibps/head->freq)/head->chans)==2; - sample.stereo=(head->chans==2); - sample.pos=0; - if (loop_start==-1) loop_start=loop_end=sample.length; - sample.loop_start=loop_start; - sample.loop_end=loop_end; - free(head); - return 0; - } - free(head); - } - fclose(f); - return 1; - } - - -static void skip_frame(int frm_len) //v puvodni velikosti (16-bit stereo) - { - if (!sample.bit16) frm_len/=2; - if (!sample.stereo) frm_len/=2; - sample.pos+=frm_len; - if (sample.loop_start=sample.loop_end) sample.pos-=sample.loop_end-sample.loop_start; - if (sample.pos>=sample.length) sample.running=0; - } - - -static char build_sound(int frm_len,short *buffer,word vol1,word vol2) - { - short val1,val2; - int rozsah,pos; - char vol1l,vol2l,vol1r,vol2r; - int ipos=ftell(sample.fs)-sample.start_data; - - vol1l=vol1 & 0xff;vol2l=vol2 & 0xff; - vol1r=vol1>>8;vol2r=vol2>>8; - rozsah=frm_len/4; - pos=0; - fseek(sample.fs,sample.pos+sample.start_data,SEEK_SET); - while (frm_len>0) - { - short i,*j=&val1; - - if (ipos>sample.pos) fseek(sample.fs,sample.pos+sample.start_data,SEEK_SET); - ipos=sample.pos; - for(i=0;i<2;i++) - { - if (sample.bit16) fread(j,1,2,sample.fs); - else - { - fread(j,1,1,sample.fs);*j<<=8; - *j^=0x8000; - } - if (!sample.stereo) - { - val2=val1;break; - } - else - j=&val2; - } - if (ferror(sample.fs)) return 1; - val1=val1*(vol1l+(vol2l-vol1l)*pos/rozsah)/256; - val1>>=amplifikace; - val2=val2*(vol1r+(vol2r-vol1r)*pos/rozsah)/256; - val2>>=amplifikace; - skip_frame(4); - if (*buffer+val1>32767) *buffer++=32767; - else if (*buffer+val1<-32768) *buffer++=-32768; - else *buffer+++=val1; - if (*buffer+val2>32767) *buffer++=32767; - else if (*buffer+val2<-32768) *buffer++=-32768; - else *buffer+++=val2; - pos++; - frm_len-=4; - if (!sample.running) break; - } - return 0; - } - - -static char build_frame_sound(int frame,int sample) - { - TRACK_DATA_T z1l,z1r,z2l,z2r; - - if (frame_table[frame]==NULL) - { - skip_frame(mgf_frames[frame].track_size*2); - } - else - { - get_vpoint(smp_prg[sample].levy,frame,&z1l); - get_vpoint(smp_prg[sample].pravy,frame,&z1r); - get_vpoint(smp_prg[sample].levy,frame+1,&z2l); - get_vpoint(smp_prg[sample].pravy,frame+1,&z2r); - if (z1l.vpoint1 || z2l.vpoint1 || z1r.vpoint1 || z2r.vpoint1) - return build_sound(mgf_frames[frame].track_size*2, - frame_table[frame], - (z1r.vpoint1<<8)+z1l.vpoint1, - (z2r.vpoint1<<8)+z2l.vpoint1); - else - skip_frame(mgf_frames[frame].track_size*2); - } - return 0; - } - -char build_one_sample(int smp) - { - int d=0; - int i; - int p,c,*pl; - - if (smp_prg[smp].muted) return 0; - if (register_sample(smp_prg[smp].sample_name, - smp_prg[smp].loop_start, - smp_prg[smp].loop_end)) return 1; - pl=smp_prg[smp].starts; - c=smp_prg[smp].starts_count; - for(i=0;ii) break; - - if (sample.running) - { - build_frame_sound(i,smp); - do_events(); - } - } - fclose(sample.fs); - return 0; - } - - -static void destroy_all() - { - int i; - - for(i=0;i=total_frames) fr2=total_frames-1; - for(;fr1<=fr2;fr1++) mgf_frames[fr1].changed=1; - } - -void set_changed_track(TRACK_DATA_T *ti) - { - int fr=0; - while (ti!=NULL) - { - if (ti->changed) set_changed_range(fr,fr+ti->time); - fr+=ti->time; - ti->changed=0; - ti=ti->next; - } - } - -int get_building_time() - { - return last_time; - } diff --git a/VIDEO/MGIFEBLD.H b/VIDEO/MGIFEBLD.H deleted file mode 100644 index 892e382..0000000 --- a/VIDEO/MGIFEBLD.H +++ /dev/null @@ -1,9 +0,0 @@ -extern int amplifikace; -extern int frames_build; - -char build_solo(int smp); -char build_all_samples(); -void set_changed_range(int fr1,int fr2); -void set_changed_track(TRACK_DATA_T *ti); -int get_building_time(); - diff --git a/VIDEO/MGIFEDIT.C b/VIDEO/MGIFEDIT.C deleted file mode 100644 index 9314a74..0000000 --- a/VIDEO/MGIFEDIT.C +++ /dev/null @@ -1,905 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lzw.h" -#include "mgifeobj.h" -#include "mgifeact.h" -#include "mgifedit.h" -#include "mgifebld.h" -#include -#include -#include -#include -#include - -void *vga_font=&boldcz; -void *icones=&ikones; -void *ms_cur=&sipka; -word icone_color[7]={0x2108,0x7fff,0x000f,0x4210,0x6f7b}; -int win_preview; -int win_program=-1; -int cur_track=-1; -int win_control; -TSTR_LIST smp_list; -char last_path[256]=""; -char *prj_name; - -static void grinit(void) - { - initmode32(); - register_ms_cursor(ms_cur); - init_mysky(); -// hranice_mysky(0,0,639,479); - update_mysky(); - schovej_mysku(); - bar(0,0,639,479); - showview(0,0,0,0); - } - - -void init_sound() - { - int a,b,c,d; - if (sound_detect(&a,&b,&c,&d)) - { - puts("No sound device found"); - a=DEV_NOSOUND; - } - set_mixing_device(a,22000,b,c,d); - } - -static void f10exit() - { - int c; - do - { - c=*(int*)task_wait_event(E_KEYBOARD); - if ((c & 0xff)==0 && (c>>8)=='D') terminate_gui(); - if ((c & 0xff)==0 && (c>>8)=='C') - { - done_mysky(); - closemode(); - grinit(); - redraw_desktop(); - schovej_mysku(); - zobraz_mysku(); - } - } - while (1); - } - -void initialization(void) - { - init_sound(); - grinit(); - init_events(); - install_gui(); - zobraz_mysku(); - update_mysky(); - add_task(1024,f10exit); - redraw_desktop();do_events(); - msg_box_font=vga_font; - msg_icn_font=icones; - getcwd(last_path,255); - } - -long def_window(word xs,word ys,char *name) - { - word x=0,y=0; - WINDOW *p; - CTL3D ctl; - FC_TABLE fc; - long q; - - if (waktual!=NULL) - { - x=waktual->x; - y=waktual->y; - } - - highlight(&ctl,WINCOLOR); - ctl.bsize=2;ctl.ctldef=0; - x+=20;y+=20; - memcpy(fc,flat_color(0x7fe0),sizeof(FC_TABLE)); - fc[0]=0x0000; - if (x+xs>MAX_X-2) x=MAX_X-2-xs; - if (y+ys>MAX_Y-2) y=MAX_Y-2-ys; - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - q=desktop_add_window(p); - define(0,2,2,xs-5-20*(xs>=70),14,0,win_label,name); - ctl.bsize=1;ctl.ctldef=1; - o_end->autoresizex=1; - property(&ctl,vga_font,&fc,LABELCOLOR); - if (xs>=70) - { - define(1,1,1,19,16,1,button,"\x0f"); - property(NULL,icones,&icone_color,WINCOLOR);on_control_change(close_current); - } - return q; - } - -int def_dialoge(word x,word y,word xs, word ys, char *name,char modal) - { - CTL3D ctl; - FC_TABLE fc; - WINDOW *p; - int i; - - memcpy(fc,flat_color(0x7fe0),sizeof(FC_TABLE)); - memcpy(&ctl,def_border(2,WINCOLOR),sizeof(CTL3D)); - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - i=desktop_add_window(p); - if (modal) set_window_modal(); - ctl.bsize=1;ctl.ctldef=1; - define(0,1,1,xs-2,14,0,win_label,name); - o_end->autoresizex=1; - property(&ctl,vga_font,&fc,LABELCOLOR); - return i; - } - - -static void display_progress(void) - { - def_dialoge(10,300,620,80,"Na��t�m informace o filmu...",1); - define(10,10,20,600,30,0,done_bar,100); - property(def_border(3,WINCOLOR),NULL,flat_color(0x2e0),WINCOLOR); - define(30,5,5,80,20,2,button,"Konec");on_control_change(terminate_gui); - property(def_border(1,0),vga_font,flat_color(0),BUTTONCOLOR); - c_default(0); - redraw_window(); - exit_wait=0; - } - -static char show_progress(int perc) - { - c_set_value(0,10,perc); - do_events(); - return exit_wait; - } - -static void done_progress(void) - { - if (exit_wait) - { - shutdown(); - puts("Program aborted by user..."); - exit(0); - } - exit_wait=0; - close_current(); - redraw_desktop(); - } - -void show_frame(int frame) - { - static int last_task=0; - - if (last_task) term_task(last_task); - while (last_task!=0) task_sleep(NULL); - if (frame>=0) last_task=add_task(32768,build_frame,frame,&last_task); - } - -int delay_task=0; -int delay_task_counter=0; - -void delayed_redraw() //task! - { - for(delay_task_counter=0;delay_task_counter<5;delay_task_counter++) task_wait_event(E_TIMER); - delay_task=0; - redraw_desktop(); - } - -static void change_frame_pos() - { - int frame; - frame=f_get_value(win_preview,20); - if (find_window(win_program)!=NULL) - { - set_value(win_program,10,&frame); - set_value(win_program,20,&frame); - set_value(win_program,30,&frame); - if (!delay_task) delay_task=add_task(1024,delayed_redraw); - else delay_task_counter=0; - } - show_frame(frame); - } - -void init_desktop(void) - { - FC_TABLE cl; - - cl[0]=0;cl[1]=0x610; - win_preview=def_dialoge(10,10,324,228,"Preview",0); - define(5,1,1,14,14,1,color_box);c_default(LABELCOLOR); - define(10,2,20,320,180,0,pic_viewer);c_default(0); - define(20,26,4,271,17,3,scroll_bar_h,0,total_frames-1,total_frames/16,0x0200); - property(def_border(3,WINCOLOR),NULL,NULL,WINCOLOR);c_default(0);on_control_change(change_frame_pos); - define(21,2,4,21,19,2,scroll_button,1,100,"\x1c"); - property(NULL,icones,&cl,WINCOLOR);on_control_change(scroll_support); - define(22,2,4,21,19,3,scroll_button,-1,-100,"\x1d"); - property(NULL,icones,&cl,WINCOLOR);on_control_change(scroll_support); - redraw_desktop(); - show_frame(0); - } - - -void shutdown() - { - done_mysky(); - closemode(); - } - - -static void init_editor() - { - char *chyba; - display_progress(); - switch(examine_mgif_file(show_progress)) - { - case EX_NOT_FOUND:chyba="MGIF soubor nenalezen!";break; - case EX_NO_SOUND:chyba="Film nem� zvukovou stopu. Sestav jej se zvukem.";break; - case EX_READ_ERROR:chyba="Chyba p�i �ten�. Film je mo�n� po�kozen";break; - case EX_SOUND_ERROR:chyba="Nekonzistentn� zvukov� stopa!";break; - default:chyba=NULL; - } - if (chyba!=NULL) - { - msg_box(PRG_HEADER,'\x1',chyba,"Stop",NULL); - shutdown(); - abort(); - } - done_progress(); - } - -static int step_vpoint=1; - -static void change_vpoint() - { - TRACK_DATA_T **p,z; - int id=o_aktual->id; - int frame; - int m; - - if (id>100) - { - p=&smp_prg[cur_track].pravy; - id-=100; - } - else - p=&smp_prg[cur_track].levy; - frame=f_get_value(win_preview,20); - get_vpoint(*p,frame,&z); - m=z.vpoint1; - switch(id) - { - case 50:m-=step_vpoint>>3;if (m<0) m=0; set_vpoint(p,frame,m,m);step_vpoint++;break; - case 40:m+=step_vpoint>>3;if (m>255) m=255; set_vpoint(p,frame,m,m);step_vpoint++;break; - case 60:delete_vpoint(p,frame);break; - case 70:if (z.next!=NULL) set_vpoint(p,frame,z.next->vpoint1,z.next->vpoint1);break; - case 80:change_vpoint_spacing(*p,frame,step_vpoint>>3);step_vpoint++;break; - case 90:change_vpoint_spacing(*p,frame,-(step_vpoint>>3));step_vpoint++;break; - } - redraw_window(); - } - -static void step_clear(EVENT_MSG *msg) - { - if (msg->msg==E_LOST_FOCUS) - { - step_vpoint=8; - return; - } - if (msg->msg==E_MOUSE) - { - MS_EVENT *ms; - - ms=get_mouse(msg); - if (ms->event_type & (0x4|0x8)) step_vpoint=8; - } - } - -static void toggle_restart() - { - int *p; - int i,c; - int frame; - - frame=f_get_value(win_preview,20); - c=smp_prg[cur_track].starts_count; - p=smp_prg[cur_track].starts; - for(i=0;iid) - { - case 210:vol=max(vol1,vol2);break; - case 220:vol=min(vol1,vol2);break; - case 230:vol=(vol1+vol2)/2;break; - case 240:vol=vol2;break; - case 250:vol=vol1;break; - } - set_vpoint(p1,frame,vol,vol); - set_vpoint(p2,frame,vol,vol); - redraw_window(); - } - -static void change_frame_clk1() - { - int fr; - - fr=f_get_value(0,o_aktual->id); - c_set_value(win_preview,20,fr); - c_set_value(win_program,10,fr); - c_set_value(win_program,20,fr); - c_set_value(win_program,30,fr); - show_frame(fr); - } - - -static void mute_channel() - { - char c; - int i; - - c=f_get_value(0,260); - for(i=10;i<260;i++)set_enable(0,i,!c); - if (smp_prg[cur_track].muted!=c) - { - compare_vol_table(smp_prg+cur_track); - set_vol_table_nul(); - compare_vol_table(smp_prg+cur_track); - smp_prg[cur_track].muted=c; - } - } - -void open_program_window(int track) - { - FC_TABLE cl1,cl2; - CTL3D *cl; - int i; - int frame; - - frame=f_get_value(win_preview,20); - if (track>=samples_total) track=-1; - if (cur_track!=track) - { - WINDOW *w; - w=find_window(win_program);if (w!=NULL) close_window(w); - if (cur_track>=0 && cur_track=0 && cur_track"); - } - send_message(E_GUI,9,E_CONTROL,1,ls); - } - -static void dopln_jmeno_samplu() - { - char *name,*c; - TSTR_LIST ls; - int i; - FILE *f; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - i=f_get_value(0,9); - if (ls[i]==NULL) return; - c=ls[i]; - if (!strcmp(c,"")) return; - concat(name,last_path,c); - set_value(0,30,name); - f=fopen(name,"rb"); - if (f!=NULL) - { - if (find_chunk(f,WAV_DATA)!=-1) - { - char d[50]; - - set_value(0,60,itoa(get_chunk_size(f),d,10)); - } - fclose(f); - } - } - -void new_edit_sample(int track) - { - TSTR_LIST dir; - CTL3D b1,b2,b3; - char *c,empty[]=""; - char num[200]; - - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D)); - def_dialoge(20,140,600,200,"Vlo� nov� zvuk",1); - dir=create_list(2);str_add(&dir,""); - define(9,10,20,120,166,0,listbox,dir,0x7fff,0);on_control_change(dopln_jmeno_samplu); - property(&b3,NULL,NULL,WINCOLOR);c_default(0); - define(10,137,40,19,127,0,scroll_bar_v,0,10,1,0x0200); - property(&b2,NULL,NULL,WINCOLOR); - define(11,136,20,21,17,0,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,136,170,21,17,0,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(20,170,20,420,12,0,input_line,255);set_default(last_path);on_control_exit(change_dir); - property(&b3,vga_font,NULL,WINCOLOR); - define(-1,170,35,1,1,0,label,"Cesta a jm�no zvuku"); - define(-1,170,65,1,1,0,label,"Jm�no stopy (voliteln�)"); - define(-1,170,95,1,1,0,label,"Za��tek opakov�n� (-1 vyp)"); - define(-1,170,125,1,1,0,label,"Konec opakov�n�"); - c=(smp_prg[track].sample_name);if (c==NULL) c=empty; - define(30,170,50,420,12,0,input_line,255);set_default(c); - property(&b3,vga_font,NULL,WINCOLOR); - c=(smp_prg[track].user_name);if (c==NULL) c=empty; - define(40,170,80,220,12,0,input_line,255);set_default(c); - property(&b3,vga_font,NULL,WINCOLOR); - define(50,290,110,100,12,0,input_line,199);set_default(itoa(smp_prg[track].loop_start,num,10)); - property(&b3,vga_font,NULL,WINCOLOR); - define(60,290,140,100,12,0,input_line,199);set_default(itoa(smp_prg[track].loop_end,num,10)); - property(&b3,vga_font,NULL,WINCOLOR); - define(100,10,10,80,20,2,button,"Storno");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(110,10,35,80,20,2,button,"Ok");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(120,10,70,38,20,2,button,"");property(&b1,vga_font,NULL,BUTTONCOLOR); - define(130,52,70,38,20,2,button,"");property(&b1,vga_font,NULL,BUTTONCOLOR); - redraw_window(); - change_dir(); - escape(); - if (o_aktual->id==110) - { - char s[256]; - TRACK_INFO_T *t=smp_prg+track; - - get_value(0,30,s);free(t->sample_name);t->sample_name=NewArr(char,strlen(s)+1); - strcpy(t->sample_name,s); - get_value(0,40,s);free(t->user_name); - if (s[0]!=0) - { - t->user_name=NewArr(char,strlen(s)+1); - strcpy(t->user_name,s); - } - else t->user_name=NULL; - get_value(0,50,s);t->loop_start=atoi(s); - get_value(0,60,s);t->loop_end=atoi(s); - } - close_current(); - } - -static void select_sample() - { - int i; - i=f_get_value(0,9); - open_program_window(i); - } - -static void update_sample_list() - { - TSTR_LIST ls; - int i; - char p; - - send_message(E_GUI,9,E_CONTROL,0,&ls); - build_sample_list(&ls); - send_message(E_GUI,9,E_CONTROL,1,ls); - i=f_get_value(0,9); - if (i>=samples_total) i=samples_total-1; - if (i<0) i=0; - c_set_value(0,9,i); - p=samples_total!=0; - set_enable(0,30,p);set_enable(0,40,p);set_enable(0,50,p); - run_background(select_sample); - } - - -static void new_sample() - { - int track; - track=add_sample(""); - open_program_window(-1); - select_sample(); - new_edit_sample(track); - select_window(win_control); - if (smp_prg[track].sample_name[0]==0) remove_sample(track); - else - { - c_set_value(0,9,track); - set_vol_table_nul(); - compare_vol_table(smp_prg+track); - } - update_sample_list(); - } - -static void edit_sample() - { - int i; - i=f_get_value(0,9); - if (i>=samples_total || i<0) return; - new_edit_sample(i); - compare_vol_table(smp_prg+cur_track); - set_vol_table_nul(); - compare_vol_table(smp_prg+cur_track); - open_program_window(-1); - update_sample_list(); - } - -static void delete_sample() - { - int i; - i=f_get_value(0,9); - if (i>=samples_total || i<0) return; - if (msg_box("Ot�zka?",'\x2',"Odstranit zvuk?","Ano","Ne",NULL)==2) return; - open_program_window(-1); - remove_sample(i); - update_sample_list(); - } - -static void duplic_sample() - { - int track; - int i; - TRACK_INFO_T *t1,*t2; - i=f_get_value(0,9); - if (i>=samples_total || i<0) return; - t1=smp_prg+i; - track=add_sample(t1->sample_name); - open_program_window(-1); - t1=smp_prg+i; - t2=smp_prg+track; - if (t1->user_name!=NULL) - { - t2->user_name=NewArr(char,strlen(t1->user_name)+1); - strcpy(t2->user_name,t1->user_name); - } - else t2->user_name=NULL; - t1->loop_start=t2->loop_start; - t1->loop_end=t2->loop_end; - c_set_value(0,9,track); - send_message(E_GUI,9,E_CONTROL,2); - update_sample_list(); - } - -static void prehrat_cele() - { - show_frame(-1); - def_dialoge(2,42,635,378,"P�ehr�t cel�",1); - redraw_window(); - curcolor=0; - start_mixing(); - play_animation(mgif_filename,SMD_HICOLOR,60,1); - stop_mixing(); - close_current(); - } - -static void stop_preview_clk() - { - stop_preview(); - } - -static void prehrat_preview() - { - OBJREC *o; - WINDOW *w; - int x,y; - - w=find_window(win_preview); - o=find_object(w,10); - show_frame(-1); - x=o->locx+320+4; - y=o->locy+180+4; - if (x>500) x=2;if (y>400) y=2; - def_dialoge(x,y,100,80,"N�hled",1); - define(10,10,25,80,30,0,button,"STOP"); - property(def_border(1,0),vga_font,NULL,BUTTONCOLOR);on_control_change(stop_preview_clk); - redraw_window(); - preview_block(f_get_value(win_preview,20),o->locx,o->locy); - close_current(); - } - -static void make() - { - if (cur_track>=0 && cur_trackid==30) - { - get_value(0,20,buffer); - if (sscanf(buffer,"%d",value)!=1) - { - msg_box(PRG_HEADER,'\x1',"To mus� b�t ��slo!","Ok",NULL); - goto chyba; - } - close_current(); - return 1; - } - close_current(); - return 0; - } - -static void ginsert() - { - int v; - int frame; - - frame=f_get_value(win_preview,20); - v=get_inserted_frames(frame); - if (how_frames("Kolik bylo vlo�eno?",&v)==0) return; - insert_global(frame,v); - redraw_desktop(); - } - -static void gdelete() - { - int v; - int frame; - - frame=f_get_value(win_preview,20); - v=get_deleted_frames(); - if (how_frames("Kolik bylo vymaz�no?",&v)==0) return; - delete_global(frame,v); - redraw_desktop(); - } - - - -void control_window() - { - CTL3D b1,b2,b3; - char p; - - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D)); - default_font=vga_font; - memcpy(f_default,flat_color(0x0000),sizeof(charcolors)); - win_control=def_dialoge(350,10,280,228,PRG_HEADER,0); - build_sample_list(&smp_list); - define(9,10,20,100,196,0,listbox,smp_list,0x7fff,0);on_control_change(select_sample); - property(&b3,NULL,NULL,WINCOLOR);c_default(-1); - define(10,117,40,19,157,0,scroll_bar_v,0,10,1,0x0200); - property(&b2,NULL,NULL,WINCOLOR); - define(11,116,20,21,17,0,scroll_button,-1,0,"\x1e"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(12,116,200,21,17,0,scroll_button,1,10,"\x1f"); - property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support); - define(20,140,20,65,20,0,button,"Nov�");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(new_sample); - define(30,210,20,65,20,0,button,"Odstra�");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(delete_sample); - define(40,140,45,65,20,0,button,"Oprav");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(edit_sample); - define(50,210,45,65,20,0,button,"Duplikuj");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(duplic_sample); - define(60,140,120,65,20,0,button,"P�ehr�t");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(prehrat_cele); - define(70,210,120,65,20,0,button,"N�hled");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(prehrat_preview); - define(80,140,145,65,20,0,button,"Make");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(make); - define(90,210,145,65,20,0,button,"Build");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(build); - define(100,210,10,65,20,3,button,"Exit");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(exit_prog); - define(110,140,10,65,20,3,button,"Info");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(info); - define(120,140,170,65,20,0,button,"GInsert");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(ginsert); - define(130,210,170,65,20,0,button,"GDelete");property(&b1,vga_font,NULL,BUTTONCOLOR);on_control_change(gdelete); - p=samples_total!=0; - set_enable(0,30,p);set_enable(0,40,p);set_enable(0,50,p); - redraw_window(); - } - -void main(int argc,char **argv) - { - - if (argc!=2) - { - puts("MGF SoundTrack Editor ... (C) 1998 Ond�ej Nov�k\n"); - puts("Usage: MGIFEDIT "); - exit(1); - } - initialization(); - set_mgif(argv[1]); - prj_name=get_project_name(mgif_filename); - switch (load_project(prj_name)) - { - case -1:msg_box(PRG_HEADER,'\x1',"Chyba form�tu v projektu!","Zav��t",NULL);shutdown();exit(1); - case -2:msg_box(PRG_HEADER,'\x1',"Neo�ek�van� eof souboru!","Zav��t",NULL);shutdown();exit(1); - } - init_editor(); - warn_size_mistmach(); - init_desktop(); - control_window(); - escape(); - shutdown(); - } diff --git a/VIDEO/MGIFEDIT.H b/VIDEO/MGIFEDIT.H deleted file mode 100644 index 462890d..0000000 --- a/VIDEO/MGIFEDIT.H +++ /dev/null @@ -1,40 +0,0 @@ -#define concat(c,s1,s2) \ - c=alloca(strlen(s1)+strlen(s2)+1);\ - strcpy(c,s1);\ - strcat(c,s2) - -extern word boldcz; -extern word ikones; -extern void *icones; -extern void *vga_font; -extern word sipka; - -extern int win_preview; - -void shutdown(); - -#define crash(msg) \ - {\ - shutdown();\ - printf("Module: %s\nLine: %d\nMessage: %s\n",__FILE__,__LINE__,msg);\ - abort();\ - }\ - -#define WINCOLOR 0x631f -#define LABELCOLOR 0x0f -#define BUTTONCOLOR (28*1024+24*32+3) -#define PRG_HEADER "MGIF Sound editor v1."VERSION - - -void show_full_lfb12e(void *source,void *target,void *palette); -#pragma aux show_full_lfb12e parm[esi][edi][ebx] modify [eax ecx edx] -void show_delta_lfb12e(void *source,void *target,void *palette); -#pragma aux show_delta_lfb12e parm[esi][edi][ebx] modify [eax ecx edx] -void show_full_interl_lfb130(void *source,void *target,void *palette); -#pragma aux show_full_interl_lfb130 parm[esi][edi][ebx] modify [eax ecx edx] -void show_delta_interl_lfb130(void *source,void *target,void *palette); -#pragma aux show_delta_interl_lfb130 parm[esi][edi][ebx] modify [eax ecx edx] -char test_next_frame(void *bufpos,int size); -#pragma aux test_next_frame parm [edi][ecx] modify [ebx] value [al] -void *sound_decompress(void *source,void *bufpos,int size,void *ampl_tab); -#pragma aux sound_decompress parm [esi][edi][ecx][ebx] modify [eax edx] value [edi] diff --git a/VIDEO/MGIFEOBJ.C b/VIDEO/MGIFEOBJ.C deleted file mode 100644 index 90de54f..0000000 --- a/VIDEO/MGIFEOBJ.C +++ /dev/null @@ -1,275 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mgifeobj.h" -#include "mgifedit.h" -#include "mgifeact.h" - - -static void done_bar_init(OBJREC *o,long *params) - { - o->userptr=New(long); - *(long *)o->userptr=*params; - } - -static void done_bar_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - long value,max,x3; - - value=*(long *)o->data; - max=*(long *)o->userptr; - x3=x1+(x2-x1)*value/max; - if (x3<=x1) x3=x1; - if (x3>=x2) x3=x2; - bar(x3,y1,x2,y2); - curcolor=o->f_color[1]; - bar(x1,y1,x3,y2); - } - -void done_bar(OBJREC *o) //define(...done_bar,max); - { - o->call_init=done_bar_init; - o->call_draw=done_bar_draw; - o->datasize=4; - } - - -static void pic_view_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - void *pic; - - x2,y2; - pic=*(void **)o->data; - if (pic!=NULL) - put_picture(x1,y1,pic); - } - -void pic_viewer(OBJREC *o) //define(...pic_view);set_value(ptr) - { - o->call_draw=pic_view_draw; - o->datasize=4; - } - -//---------------------------------------- - -#define FRAME_SIZE 2 - -static void track_view_init(OBJREC *o,void **params) - { - o->userptr=New(void *); - memcpy(o->userptr,params,sizeof(void *)); - } - -static void track_view_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - int start; - int fstart; - int pos; - int midl=x1+x2>>1; - TRACK_DATA_T z,u,*p; - - pos=*(int *)o->data; - start=(midl-pos*FRAME_SIZE); - if (startuserptr,fstart,&z); - curcolor=0; - while(p!=NULL && start+p->time*FRAME_SIZE<=x2) - { - int ys1,ys2; - - ys1=y2-(y2-y1)*p->vpoint1/256; - ys2=y2-(y2-y1)*p->vpoint2/256; - curcolor=0; - bar(start-1,ys1-1,start+1,ys1+1); - curcolor=p->vpoint1==p->vpoint2?0:0x7c00; - line(start,ys1,start+p->time*FRAME_SIZE,ys2); - start+=p->time*FRAME_SIZE; - fstart+=p->time; - p=p->next; - } - if (p!=NULL) - { - int ys1,ys2; - - get_vpoint(**(TRACK_DATA_T ***)o->userptr,fstart+(x2-start)/FRAME_SIZE,&u); - ys1=y2-(y2-y1)*p->vpoint1/256; - ys2=y2-(y2-y1)*u.vpoint1/256; - curcolor=0; - bar(start-1,ys1-1,start+1,ys1+1); - curcolor=p->vpoint1==p->vpoint2?0:0x7c00; - line(start,ys1,x2,ys2); - } - } - -static int find_near_vpoint(TRACK_DATA_T *t,int frame,int yy,int nrf,int nrs) - { - int fr=0; - int nfr=frame,rz=nrf; - int p,q; - while (t!=NULL) - { - p=abs(fr-frame); - q=abs(t->vpoint1-yy); - if (ptime; - t=t->next; - } - return nfr; - } - -static void track_view_click(EVENT_MSG *msg,OBJREC *o) - { - MS_EVENT *ms; - static int last_fr=-1; - - if (msg->msg==E_MOUSE) - { - int x,y,*data; - int frel; - int frst; - int fr,nr; - int yy; - - data=(int *)o->data; - ms=get_mouse(msg); - x=ms->x-o->locx; - y=ms->y-o->locy; - frel=x/2; - frst=o->xs/4-*data; - fr=frel-frst; - if (fr<0) fr=0; - if (fr>=total_frames) fr=total_frames-1; - yy=255-(y*256/o->ys); - if (yy<0) yy=0; - nr=find_near_vpoint(**(TRACK_DATA_T ***)o->userptr,fr,yy,5,10*256/o->ys); - if (ms->event_type & 0x8 && !ms->tl1) - { - *data=nr; - redraw_object(o); - set_change(); - } - if (ms->event_type & 0x2) last_fr=nr; - else - if (ms->event_type & 0x4) last_fr=-1; - else - if (ms->tl1 && last_fr!=-1) - if (ms->event_type & 0x8) - { - delete_vpoint(*(TRACK_DATA_T ***)o->userptr,last_fr); - redraw_object(o); - last_fr=-1; - } - else - { - set_vpoint(*(TRACK_DATA_T ***)o->userptr,last_fr,yy,yy); - redraw_object(o); - } - } - if (msg->msg==E_LOST_FOCUS) last_fr=-1; - } - -void track_view(OBJREC *o) //track_view(void *track);set_value(pos); - { - o->call_init=track_view_init; - o->call_draw=track_view_draw; - o->call_event=track_view_click; - o->datasize=4; - } - - -#define FRAME_SIZE 2 - -static void starts_view_init(OBJREC *o,void **params) - { - o->userptr=New(void *); - memcpy(o->userptr,params,sizeof(void *)); - } - -static void starts_view_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - int start; - int fstart; - int pos; - int midl=x1+x2>>1; - int count; - TRACK_INFO_T *d; - int *list; - int i; - - d=*(TRACK_INFO_T **)o->userptr; - list=d->starts;count=d->starts_count; - pos=*(int *)o->data; - start=(midl-pos*FRAME_SIZE); - if (start=0 && y<(x2-x1)/FRAME_SIZE) - { - y*=FRAME_SIZE; - y+=start; - curcolor=0; - bar(y,y1,y+1,y2); - } - } - } - -void starts_view(OBJREC *o) //track_view(void *track);set_value(pos); - { - o->call_init=starts_view_init; - o->call_draw=starts_view_draw; - o->datasize=4; - } - -static void color_box_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - curcolor=*(int *)o->data; - bar(x1,y1,x2,y2); - } - -void color_box(OBJREC *o) - { - o->call_draw=color_box_draw; - o->datasize=4; - } - diff --git a/VIDEO/MGIFEOBJ.H b/VIDEO/MGIFEOBJ.H deleted file mode 100644 index fd5be3e..0000000 --- a/VIDEO/MGIFEOBJ.H +++ /dev/null @@ -1,6 +0,0 @@ - -void done_bar(); -void pic_viewer(); -void track_view(); //track_view(void *track);set_value(pos); -void starts_view(); //track_view(TRACK_INFO_T *x);set_value(pos); -void color_box(OBJREC *o); //color_box();set_value(color) diff --git a/VIDEO/MGIFPLAY.C b/VIDEO/MGIFPLAY.C deleted file mode 100644 index f10f3d9..0000000 --- a/VIDEO/MGIFPLAY.C +++ /dev/null @@ -1,331 +0,0 @@ -// MOTION GIF - LZW komprimovana animace v rozliseni 320x180 256 barev avsak -// upravena pro prehravani v HICOLOR pro konkretni rezim (32768 barev) - - -// Format - /* - - [ FRAME ] - [CHUNK] !pozor delka je 3 bajtova (tj 16MB) - 0 - PRADNY CHUNK - 1 - LZW FULL SCREEN - 2 - MGIF DELTA - 3 - HICOLOR PALETE - 4 - SOUND TRACK - 5 - TEXT TRACK - 6 - MGIF COPY - 7 - SOUND INIT - - Popis Chunku: - PRAZDNY_CHUNK - muze obsahovat soukrome informace - - LZW_FULL_SCREEN - - ihned za hlavickou nasleduje LZW komprimovany obrazek - v rozliseni 320x180 256 barev - - MGIF_DELTA - - cely blok je LZW komprimovany. Po dekomprimace blok obsahuje - dva druhy informaci. Prvni DWORD je ofset od pocatku dat - ktery ukazuje na zacatek graficke informace. Po tomto - DWORDU jsou ulozeny data o umisteni grafickych bodu v obrazu - Prvni byte znaci, kolik je nutne preskocit slov. (tj *2 byte) - Dalsi byte znaci, kolik je nutne zapsat slov (tj *2 byte) - Po tomto bytu je nutne prenest presne tolik slov z - grafickeho bloku na obrazovku. Dvojice bajtu se opakuji - dokud ani jeden z nich nema nejvyssi 2 bity nastavene. - Pak tento byte znaci ze uz na radce nic vic neni. Dolni cast - byte (tj 6 bitu) pak udava pocet radku, ktere je treba pre- - skocit. (nula=zadny). - - HICOLOR PALETTE - - Prvni byte znamena pocet aktivnich barev. Pak nasleduje - paleta ve formatu xRRRRRGGGGGBBBBB. Rozdil oproti vsem - beznym paletam je v tom ze neni treba v palete udrzovat - barvy, ktere uz na obrazovce jsou, protoze zmena palety - se neprojevi na jiz zobrazenem obrazku. - - SOUND_TRACK - - Kazdy frame obsahuje zvukovou stopu. Je to RAW format. - Pro verzi MGIF97 zde je zvukova informace ulozena ve - zvukove kvalite 16-bit stereo 22000Khz, ovsem komprimovana - na 50% jako MUS. - TEXT_TRACK - - Navic je ve mozne ve frame umistit textovou zpravu (titulek) - Prvni WORD udava dobu zobrazeni (pocet frame). - Pote nasleduje text zakoncen znakem 0; - - MGIF_COPY - Za timto CHUNKEM je ulozen blok dat v nezakomprimovanem - tvaru(tj 57600byte); - - - - */ - - -#include -#include -#include -#include -#include -#include -#include "lzw.h" -#include - -#include -#include -#include -//#include -//#include -#include - -#define MGIF "MGIF" -#define MGIF_Y "97" -#define VER 0x100 -#define MGIF_EMPTY 0 -#define MGIF_LZW 1 -#define MGIF_DELTA 2 -#define MGIF_PAL 3 -#define MGIF_SOUND 4 -#define MGIF_TEXT 5 -#define MGIF_COPY 6 -#define MGIF_SINIT 7 - -char konec=0; - -void *bufpos; -long vals_save=0x80008000; - - -typedef struct mgif_header - { - char sign[4]; - char year[2]; - char eof; - word ver; - long frames; - word snd_chans; - int snd_freq; - short ampl_table[256]; - short reserved[32]; - }; - -struct mgif_header gh; - -int mgf; - -int chunks; -word hipal[256]; - -char open_mgf_file(char *filename) - { - mgf=open(filename,O_BINARY | O_RDONLY); - if (mgf==-1) return 1; - read(mgf,&gh,sizeof(gh)); - vals_save=0; - bufpos=NULL; - return 0; - } - -void close_mgf_file() - { - close(mgf); - } - -void load_frame(void *f) - { - long frame_head; - long frame_size; - - read(mgf,&frame_head,4); - chunks=frame_head & 0xff; - frame_size=frame_head>>8; - read(mgf,f,frame_size); - } - - -void load_lzw_frame(void *p,void *temp) - { - reinit_lzw(); - lzw_decode(p,temp); - } - -void display_copy(char *temp) - { - char *c; - int i,j; - word *w,ww; - - c=temp; - w=lbuffer+60*640; - for(i=0;i<180;i++) - { - for(j=0;j<320;j++) - { - ww=hipal[*c]; -// w[640]=ww; - *w++=ww; -// w[640]=ww; - *w++=ww; - c++; - } - w+=640; - } - //showview(0,0,640,360); - } - -void display_delta(char *temp) - { - char *graph,*contr,sk; - int i,j,k; - word *w,ww; - - contr=temp; - graph=contr+*(long *)contr; - contr+=4;graph+=4; - for(i=0;i<180;i++) - { - w=lbuffer+1280*(i+30);sk=1; - while ((*contr & 0xc0)!=0xc0) - if (sk) - { - w+=(*contr++)*4;sk=!sk; - } - else - { - k=*contr++*2; - for(j=0;j>8;p+=4; - switch(a) - { - case MGIF_LZW: - case MGIF_DELTA:load_lzw_frame(p,temp);frmode=a;break; - case MGIF_PAL:memcpy(hipal,p,siz);break; - case MGIF_COPY:temp=p;frmode=a;break; - case MGIF_SOUND:sound=p;ssize=siz;break; - } - p+=siz; - } - if (sound!=NULL) - { - while (test_next_frame(bufpos,ssize)); - bufpos=sound_decompress(sound,bufpos,ssize,&gh.ampl_table); - } - else delay(50); - if (banking) - switch (frmode) - { - case MGIF_LZW: - case MGIF_COPY:show_full_interl_bank(temp,(word *)(60*2048),hipal);break; - case MGIF_DELTA:show_delta_interl_bank(temp,(word *)(60*2048),hipal);break; - } - else - switch (frmode) - { - case MGIF_LZW: - case MGIF_COPY:show_full_interl_lfb(temp,lbuffer+60*640,hipal);break; - case MGIF_DELTA:show_delta_interl_lfb(temp,lbuffer+(60)*640,hipal);break; - } - } - -extern int test_counter; - - -void play_frames() - { - int x; - void *f,*temp; - f=getmem(65536); - temp=getmem(65536); - for(x=0;x2) - { - sscanf(argv[2],"%d",&a); - sscanf(argv[3],"%x",&b); - sscanf(argv[4],"%d",&c); - sscanf(argv[5],"%d",&d); - } - else sound_detect(&a,&b,&c,&d); - set_mixing_device(a,22050,b,c,d); - start_mixing();delay(10); - init_lzw_compressor(8); - curcolor=0x0; - bar(0,0,639,479);showview(0,0,0,0); - do - if (open_mgf_file(argv[1])) konec=1; - else - { - play_frames(); - close_mgf_file(); - } - while (!konec); - done_lzw_compressor(); - stop_mixing(); - closemode(); - } - diff --git a/VIDEO/OLD/MGIFMEM.C b/VIDEO/OLD/MGIFMEM.C deleted file mode 100644 index 919c974..0000000 --- a/VIDEO/OLD/MGIFMEM.C +++ /dev/null @@ -1,209 +0,0 @@ -#include -#include -#include - -#define MGIF "MGIF" -#define LZW_MAX_CODES 4096 -#define LZW_BUFFER 64000 - - -MGIF_PROC show_proc; -int mgif_frames;int cur_frame; - -typedef struct mgif_header - { - char sign[4]; - char year[2]; - char eof; - word ver; - long frames; - word snd_chans; - int snd_freq; - short ampl_table[256]; - short reserved[32]; - }; - - -typedef struct double_s - { - short group,chr,first,next; - }DOUBLE_S; - -typedef DOUBLE_S CODE_TABLE[LZW_MAX_CODES]; - -DOUBLE_S *compress_dic=NULL; -void *lzw_buffer=NULL; -int clear_code; -int end_code; -int free_code; -int nextgroup; -int bitsize,init_bitsize; -char old_value=0; - -void do_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(); - } - -void init_lzw_compressor(int dic_size) - { - - if (compress_dic!=NULL)compress_dic=(CODE_TABLE *)getmem(sizeof(CODE_TABLE)); - clear_code=1<frames; - cur_frame=0; - c+=sizeof(*mgh); - init_lzw_compressor(8); - if (lzw_buffer==NULL) lzw_buffer=getmem(LZW_BUFFER); - return c; - } - -void close_mgif() //dealokuje buffery pro prehravani - { - done_lzw_compressor(); - free(lzw_buffer); - lzw_buffer=NULL; - } - - -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]; - - -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++; - } - } - - -char fast_expand_code(int code,char **target); -#pragma aux fast_expand_code parm[eax][edi] modify [esi ecx] value [bl] - -void lzw_decode(void *source,char *target) - { - long bitpos=0; - int code,old,i; - DOUBLE_S p; - int old_first; - int mask=0xff; - - - for(i=0;i - [CHUNK] !pozor delka je 3 bajtova (tj 16MB) - 0 - PRADNY CHUNK - 1 - LZW FULL SCREEN - 2 - MGIF DELTA - 3 - HICOLOR PALETE - 4 - SOUND TRACK - 5 - TEXT TRACK - 6 - MGIF COPY - 7 - SOUND INIT - - Popis Chunku: - PRAZDNY_CHUNK - muze obsahovat soukrome informace - - LZW_FULL_SCREEN - - ihned za hlavickou nasleduje LZW komprimovany obrazek - v rozliseni 320x180 256 barev - - MGIF_DELTA - - cely blok je LZW komprimovany. Po dekomprimace blok obsahuje - dva druhy informaci. Prvni DWORD je ofset od pocatku dat - ktery ukazuje na zacatek graficke informace. Po tomto - DWORDU jsou ulozeny data o umisteni grafickych bodu v obrazu - Prvni byte znaci, kolik je nutne preskocit slov. (tj *2 byte) - Dalsi byte znaci, kolik je nutne zapsat slov (tj *2 byte) - Po tomto bytu je nutne prenest presne tolik slov z - grafickeho bloku na obrazovku. Dvojice bajtu se opakuji - dokud ani jeden z nich nema nejvyssi 2 bity nastavene. - Pak tento byte znaci ze uz na radce nic vic neni. Dolni cast - byte (tj 6 bitu) pak udava pocet radku, ktere je treba pre- - skocit. (nula=zadny). - - HICOLOR PALETTE - - Prvni byte znamena pocet aktivnich barev. Pak nasleduje - paleta ve formatu xRRRRRGGGGGBBBBB. Rozdil oproti vsem - beznym paletam je v tom ze neni treba v palete udrzovat - barvy, ktere uz na obrazovce jsou, protoze zmena palety - se neprojevi na jiz zobrazenem obrazku. - - SOUND_TRACK - - Kazdy frame obsahuje zvukovou stopu. Je to RAW format. - Pro verzi MGIF97 zde je zvukova informace ulozena ve - zvukove kvalite 16-bit stereo 22000Khz, ovsem komprimovana - na 50% jako MUS. - TEXT_TRACK - - Navic je ve mozne ve frame umistit textovou zpravu (titulek) - Prvni WORD udava dobu zobrazeni (pocet frame). - Pote nasleduje text zakoncen znakem 0; - - MGIF_COPY - Za timto CHUNKEM je ulozen blok dat v nezakomprimovanem - tvaru(tj 57600byte); - - - - */ - -#include -#include -#include -#include -#include -#include -#include -#include "lzw.h" -#include -#include -#include "jpegmgif.h" - -#define MGIF "MGIF" -#define MGIF_Y "97" -#define VER 0x100 - -#define MGIF_EMPTY 0 -#define MGIF_LZW 1 -#define MGIF_DELTA 2 -#define MGIF_PAL 3 -#define MGIF_SOUND 4 -#define MGIF_TEXT 5 -#define MGIF_COPY 6 -#define MGIF_SINIT 7 - -#define FRAME_X 320 -#define FRAME_Y 180 -#define FRAME_LEN (FRAME_X*FRAME_Y) -#define DELTA_LEN (3*FRAME_LEN) -#define LZW_LEN (2*FRAME_LEN) - -#define SOUND_SPEED 44100 -#define PRE_SOUND ((256*1024)/2) - -#define ZTRATA lowq -#define BZTRATA colorq -#define MAX_FRAME max_fr -#define MIN_FRAME min_fr - -#define BOXES_X 80 -#define BOXES_Y 45 -#define BOXES_ALL (BOXES_X*BOXES_Y) - -#define SND_NAME ".SNF" - -short mult_table[64]; -short square_table[4096]; -int statpic=0; - -typedef struct mgif_header - { - char sign[4]; - char year[2]; - char eof; - word ver; - long frames; - word snd_chans; - int snd_freq; - short ampl_table[256]; - short reserved[32]; - }; - -word last_frame[FRAME_Y][FRAME_X]; -char frame_delta[FRAME_LEN]; -char delta_data[DELTA_LEN]; -char frame_buffer[FRAME_LEN]; -word color_state[32*32+32*32+32*32]; -char calc_data[FRAME_LEN]; -char flc_paleta[256][3]; -int delta_data_size; -int frame_delta_size; -int speed=0; -int global_frame_counter=0; -int last_frame_size; -int total_frames; - -int lowq=0; -int colorq=0; -int max_fr=99999; -int min_fr=0; - -int hranice; -int hdiff=0; -int difdif=0; - -TBOX *iib; -TBOX *rbb; -TBOX *gbb; -char *rgb_mem; -char frame_step=1; - -struct mgif_header gh; - -char lzw_buffer[LZW_LEN]; - -char pal_use[256],color_map[256]; -word hipal[256],max_colors; - - -FILE *mgf; - -long of_pos; -int of_chunks; - -void open_frame() - { - of_chunks=0; - of_pos=ftell(mgf); - fwrite(&of_pos,1,4,mgf); - } - -void close_frame() - { - long fsize,p; - - last_frame_size=fsize=(p=ftell(mgf))-of_pos-4; - fseek(mgf,of_pos,SEEK_SET); - fwrite(&of_chunks,1,1,mgf); - fwrite(&fsize,1,3,mgf); - fseek(mgf,p,SEEK_SET); - total_frames++; - } - - -void write_chunk(char action,long size,void *data) - { - fwrite(&action,1,1,mgf); - fwrite(&size,1,3,mgf); - fwrite(data,1,size,mgf); - of_chunks++; - } - -/* -void conv_2_hicolor() - { - int i,r,g,b; - for(i=0;i<256;i++) - { - r=(flc_paleta[i][0]>>3); - g=(flc_paleta[i][1]>>3); - b=(flc_paleta[i][2]>>3); - hipal[i]=((r<<10)+(g<<5)+b); - } - } - */ - -void conv_2_rgb() - { - int i; - for(i=0;i<256;i++) - { - flc_paleta[i][0]=(hipal[i]>>10) & 0x1f; - flc_paleta[i][1]=(hipal[i]>>5)& 0x1f; - flc_paleta[i][2]=hipal[i]& 0x1f; - } - } - -char find_color(word c); //najde barvu v palete a vraci byte -#pragma aux find_color parm [eax]=\ - "mov edi,offset hipal"\ - "mov ecx,256"\ - "repne scasw"\ - "mov eax,edi"\ - "sub eax,offset hipal"\ - "shr eax,1"\ - "dec eax"\ - value [al] modify[edi ecx]; - - -void init_palmap() - { - int i; - memset(pal_use,0,sizeof(pal_use)); // nuluj pristupy k barvam - for(i=0;i<256;i++) color_map[i]=find_color(hipal[i]); //redukuj paletu; - max_colors=256; // pocet barev zatim 256; - } - -int test_transp(char c,word w) - { - int r1,g1,b1; - int r2,g2,b2; - int diff; - - r1=flc_paleta[c][0]>>3; - g1=flc_paleta[c][1]>>3; - b1=flc_paleta[c][2]>>3; - w&=0x7fff; - b2=w;g2=b2>>5;r2=g2>>5;b2&=0x1f;g2&=0x1f; - r1-=r2;g1-=g2;b1-=b2; - diff=r1*r1+g1*g1+b1*b1; - return diff<=hranice?diff:-1; - } - -int change_color(char c1,char c2,int diff1) - { - int r1,g1,b1; - int r3,g3,b3; - int r4,g4,b4; - int diff2; - - if (!diff1) return -1; - r1=flc_paleta[c1][0]>>3; - g1=flc_paleta[c1][1]>>3; - b1=flc_paleta[c1][2]>>3; - r3=flc_paleta[c2][0]>>3; - g3=flc_paleta[c2][1]>>3; - b3=flc_paleta[c2][2]>>3; - r4=r3-r1;g4=g3-g1;b4=b3-b1; - diff2=r4*r4+g4*g4+b4*b4; - if (diff2*2=0) - {/*if ((i=change_color(c1,c2old,d2))>=0) c1=i,d=0;else */d=1;} - else d=0; - c2old=c1; - if (d && (d2=test_transp(c2,p[1]))>=0) - {/*if (!d && (i=change_color(c2,c2old,d2))>=0) c2=i,d=0;else */d=1;} - else d=0; - c2old=c2; - if (d!=skip) - { - if (skip) *delta++=skc;else *delta++=cpc; - skip=!skip;skc=0;cpc=0; - } - if (!skip) - { - *data++=c1; - *data++=c2; - colors2=hipal[c1]+(hipal[c2]<<16); - *(long *)p=colors2; - cpc++; - } - else skc++; - p+=2; - pal_use[c1]=1; - pal_use[c2]=1; - } - if (!skip) *delta++=cpc; - if (skc==160 && *(delta-1)!=0xff && delta!=delta_data) delta[-1]++; //preskoc n radek - else *delta++=0xc0; //oznac konec radky - } - delta_data_size=delta-delta_data; - frame_delta_size=data-frame_delta; - } - - -void reduce_palette() //redukuje paletu na nejmensi nutny pocet barev - { - int i,j; - - if (!speed) pal_use[0]=1; - for(i=0,j=0;i<256;i++) - { - if (pal_use[i]) - { - hipal[j]=hipal[i]; - color_map[i]=j++; - } - } - max_colors=j; - } - -void filter_colors(void *block,int size,void *colormap); //prefiltruje blok dat podle color_map -#pragma aux filter_colors parm [edi][ecx][ebx]=\ - "lp1: mov al,[edi]"\ - " xlatb"\ - " stosb"\ - " loop lp1"\ - modify [eax]; - - -void *join_two_blocks(void *d1,void *d2,int siz1,int siz2,long *celk) - { - long siz; - char *d; - void *x; - - siz=siz1+siz2+4; - d=(char *)getmem(siz); - x=d; - memcpy(d,&siz1,4);d+=4; - memcpy(d,d1,siz1);d+=siz1; - memcpy(d,d2,siz2); - *celk=siz; - return x; - } - -void create_last_frame(void *source,void *target,void *pal,int size); -#pragma aux create_last_frame parm [esi][edi][ebx][ecx]=\ - "lp1: lodsb"\ - " movzx eax,al"\ - " mov eax,[eax*2+ebx]"\ - " stosw"\ - " loop lp1"\ - modify[eax] - - -void create_mgif_pal() - { - write_chunk(MGIF_PAL,max_colors*2,hipal); - } - - -void create_mgif_lzw() - { - int siz; - - //conv_2_rgb(); - init_palmap(); - create_mgif_pal(); - filter_colors(frame_buffer,FRAME_LEN,color_map); - create_last_frame(frame_buffer,last_frame,hipal,FRAME_LEN); - init_lzw_compressor(8); - memset(lzw_buffer,0,sizeof(lzw_buffer)); - siz=lzw_encode(frame_buffer,lzw_buffer,FRAME_LEN); - if (siz>FRAME_LEN) write_chunk(MGIF_COPY,FRAME_LEN,frame_buffer); - else write_chunk(MGIF_LZW,siz,lzw_buffer); - done_lzw_compressor(8); - } - - -void create_color_state() - { - int i; - int r1,g1,b1; - int r2,g2,b2; - int diff; - char *c; - word *w; - - memset(color_state,0,sizeof(color_state)); - c=frame_buffer; - w=last_frame; - for(i=0;i>3; - g1=flc_paleta[*c][1]>>3; - b1=flc_paleta[*c][2]>>3; - b2=*w;g2=b2>>5;r2=g2>>5;b2&=0x1f;g2&=0x1f; - r1-=r2;g1-=g2;b1-=b2; - diff=abs(r1)+abs(g1<<1)+abs(b1); - color_state[diff]++; - c++;w++; - } - } - -void set_max_color_change(int cchange) - { - int i,s; - - s=0;cchange=57600-cchange; - for(i=sizeof(color_state)/sizeof(word)-1;s0;i--) s+=color_state[i]; - if (s>=cchange) i++; - hranice=i+hdiff;if (hranice<0) hranice=0; - } - -int rozptyl(int v1,int v2) - { - int c1,c2,x,s; - x=v1+v2>>1; - c1=(x-v1); - c2=(x-v2); - s=c1*c1+c2*c2; - return s; - } - -void create_low_quality() - { - void *snd;int l; - char *sn,*sr,c1,c2; - int rs,bs,gs; - - l=FRAME_LEN; - sr=frame_buffer; - snd=calc_data; - sn=(char *)snd; - l--; - while (l--) - { - c1=*sr++; - c2=*sr; - rs=rozptyl(flc_paleta[c1][0],flc_paleta[c2][0]); - gs=rozptyl(flc_paleta[c1][1],flc_paleta[c2][1]); - bs=rozptyl(flc_paleta[c1][2],flc_paleta[c2][2]); - if (rs+gs+bsFRAME_LEN) - { - create_mgif_lzw(); - return; - } - if (!frame_delta_size) return; - reduce_palette(); - filter_colors(frame_delta,frame_delta_size,color_map); - d=join_two_blocks(delta_data,frame_delta,delta_data_size,frame_delta_size,&siz); - init_lzw_compressor(8); - memset(lzw_buffer,0,sizeof(lzw_buffer)); - siz=lzw_encode(d,lzw_buffer,siz); - done_lzw_compressor(); - free(d); - if (siz>FRAME_LEN) - { - create_mgif_lzw(); - return; - } - write_chunk(MGIF_DELTA,siz,lzw_buffer); - create_mgif_pal(); - } - -void prepare_for_mjpg() - { - iib=getmem(sizeof(TBOX)*BOXES_ALL); - rbb=getmem(sizeof(TBOX)*BOXES_ALL); - gbb=getmem(sizeof(TBOX)*BOXES_ALL); - memset(iib,0,sizeof(TBOX)*BOXES_ALL); - memset(rbb,0,sizeof(TBOX)*BOXES_ALL); - memset(gbb,0,sizeof(TBOX)*BOXES_ALL); - ibox=iib; - rbbox=rbb; - gbbox=gbb; - rgb_mem=getmem(FRAME_LEN*3); - create_cos_tab(); - } - -void create_jpg_frame() - { - int i,x,y,a; - char *dl=delta_data; - char *r=rgb_mem; - char *p=frame_buffer; - - conv_2_rgb(); - for(i=0;i0) - { - open_frame(); - create_sound_track(size); - close_frame(); - celk-=size; - } - if (celk) - { - open_frame(); - create_sound_track(celk); - close_frame(); - } - } - -void fill_header(int frames) - { - memset(&gh,0,sizeof(gh)); - strncpy(gh.sign,MGIF,4); - strncpy(gh.year,MGIF_Y,2); - gh.eof=26; - gh.ver=VER; - gh.frames=frames; - } - - - -void show_screen() - { - word *c; - int i,j; - word *w; - - c=last_frame; - w=screen; - for(i=0;i<180;i++) - { - for(j=0;j<320;j++) - { - *w++=*c; - *w++=*c; - c++; - } - w+=640; - } - showview(0,0,640,360); - showview(0,400,639,30); - } - - -void write_frame_size(int i,int col) - { - char s[200]; - sprintf(s,"SIZE: %05d COLORS: %03d COMP.LEVEL %03d",i,col,hranice);position(0,400);outtext(s); - } - -char *get_pcx_name(char *name,int x) - { - static char s[256]; - char c[10],e[20],*z; - int d; - - z=strchr(name,'#'); - if (z==NULL) - { - memset(s,0,sizeof(s)); - strncpy(s,name,240); - d=strlen(s); - if (x>9999) - { - s[d-1]=0; - sprintf(s,"%s%05d.pcx",s,x); - } - else sprintf(s,"%s%04d.pcx",s,x); - strupper(s); - } - else - { - int pocet,i; - pocet=0; - while(*z) if (*z++=='#') pocet++; - sprintf(c,"%%0%dd",pocet); - sprintf(e,c,x); - strcpy(s,name); - z=strchr(s,'#'); - for(i=0;iMAX_FRAME) {difdif=difdif<=0?1:difdif+1;hdiff+=difdif;} - else if (last_frame_size0) {difdif=difdif>=0?-1:difdif-1;hdiff+=difdif;} - else if (hdiff>0) {difdif=difdif>=0?-1:difdif-1;hdiff+=difdif;}else if(hdiff<0) hdiff=0; - show_screen (); - if (statpic) statpic--;else x+=frame_step; - global_frame_counter++; - } - } - - -void create_mgf_file(char *name) - { - mgf=fopen(name,"wb+"); - fwrite(&gh,1,sizeof(gh),mgf); - total_frames=0; - prereserve_tracks(); - } - - -void close_mgf_file() - { - fseek(mgf,0,SEEK_SET); - fill_header(total_frames); - fwrite(&gh,1,sizeof(gh),mgf); - fclose(mgf); - } - - -void create_mult_and_square() - { - int i; - - puts("Creating tables..."); - for(i=0;i<64;i++) mult_table[i]=(short)((i-32)*(i-32)); - for(i=0;i<4096;i++) square_table[i]=(short)sqrt(i); - } - -extern int boldcz; - - -void script_compress(char *script_name) - { - FILE *scr,*snf; - char s[256],name[256]; - char snd_name[256],*c; - int i; - - scr=fopen(script_name,"r"); - strcpy(snd_name,script_name); - c=strrchr(snd_name,'.'); - if (c==NULL) strcat(snd_name,SND_NAME); - else strcpy(c,SND_NAME); - if (scr==NULL) - { - printf("Nemohu otev��t script: %s\n",script_name); - exit(1); - } - snf=fopen(snd_name,"w"); - i=fscanf(scr,"%255s",name); - if (i!=1) - { - printf("Chyba ve script souboru: %s. Prvni mus� b�t jm�no c�lov�ho souboru.\n",scr); - exit(1); - } - i=fscanf(scr,"%d",&speed); - create_mgf_file(name); - while ((i=fgetc(scr))!=EOF && i!='\n'); - i=fgetc(scr); - initmode32(); - while (i!=EOF) - { - while (i<33 && i!=EOF) i=fgetc(scr); - if (i!='#') - { - int j=lowq; - ungetc(i,scr); - i=fscanf(scr,"%s %d %d %d %d",s,&j,&min_fr,&max_fr,&colorq); - strupper(s); - if (!strcmp(s,"FRAMESTEP")) frame_step=j; - else - if (!strcmp(s,"STATIC")) statpic=j; - else - if (i>=1) - { - lowq=j; - if (snf!=NULL) fprintf(snf,"%d ",global_frame_counter); - compress_pcx(s); - } - } - else - while ((i=fgetc(scr))!=EOF && i!='\n'); - i=fgetc(scr); - } - closemode(); - fclose(scr); - if (snf!=NULL) fclose(snf); - close_mgf_file(); - } - -main(int argc,char *argv[]) - { - puts("\n(C)1997 Komprimator Motion GIF v0.9 by Ondrej Novak"); - if (argc<2) - { - puts("Pouziti:");putchar('\n');; - puts("PCX2MGIF [d:\\path\\]source target.mgf [speed] [lowq] [min_fr] [max_fr] [colorq]");putchar('\n'); - puts("source - Jsou 4 znaky kterymi zacina jmeno kazdeho frame (prvni 0). Takto je\n" - " mozne vytvorit animaci az o 9999 frames. Pokud je potreba delsi,pak\n" - " je ctvrty znak zmenen na cislo a je mozne vytvorit animaci dlouhou\n" - " az 99999 frames. Priklad:\n\n" - " PCX2MGIF logo logo.mgf \n\n" - " Tento zapis vytvori animaci logo.mgf, jenz bude slozena z mnoha\n" - " obrazku ve formatu PCX, jejichz jmena budou znit LOGO0000.PCX az\n" - " LOGO9999.PCX a dale bude pokracovat LOG10000.PCX az LOG99999.PCX\n\n" - "speed - Prehravaci rychlost ve snimkach za sekundu (pro 22050kHz)\n" - " Pokud je dosazeno 0 pak neni do animace vkladana zvukova stopa\n" - " (Default: 0)\n" - "lowq - Nejnizsi mozny rozptyl barev sousednich bodu (snizuje kvalitu\n" - " obrazu) (default: 0)\n" - "min_fr - Pozadavek na nejmensi velikost frame. Pod touto hranici v \n" - " nasledujicim frame snizi velikost ztraty (default: 0)"); - cprintf("--- klavesu ---\r");getche(); - puts("max_fr - Pozadavek na nejvetsi velikost frame. Pri prekroceni teto \n" - " hranice se zvysi ztrata o jeden bod. (default 99999)\n" - "colorq - Tato hodnota slouzi k predvidani velikosti ztraty. Udava\n" - " kolik bodu z celkoveho poctu zmen ve frame se menit nebude\n" - " Program pak vybere ty nejmensi rozdily a ty do rozdilove \n" - " mapy nezahrne. (default: 0)\n\n" - "Velikost nejmensiho rozdilu je zobrazen pri komprimaci jako treti cislo\n" - "Nula udava ze se nezapisuji jen ty body, ktere se nemeni.\n\n" - "Pozn1: Bezne neni nutne uvadet parametr colorq protoze stupen ztraty se \n" - "voli podle vysledku predchoziho frame. Je dobre ho uvest pri velkych\n" - "vykyvech velikosti frame. Tak zhruba pri �10KB. Hodnoty parametru se \n" - "voli od 25000-35000, cim vyssi, tim vyssi stupen ztraty\n\n" - "Pozn2: Pokud nektere parametry vynechas (treba znakem '-', nebo je na konci\n" - "neuvedes, dosadi se default hodnoty. Ty jsou zvoleny tak, aby program\n" - "nevypocitaval ztratu.\n"); - exit(0); - } - curfont=(void *)&boldcz; - if (argc>2) - { - switch (argc) - { - case 8:sscanf(argv[7],"%d",&colorq); - case 7:sscanf(argv[6],"%d",&max_fr); - case 6:sscanf(argv[5],"%d",&min_fr); - case 5:sscanf(argv[4],"%d",&lowq); - case 4:sscanf(argv[3],"%d",&speed); - } - create_mgf_file(argv[2]); - initmode32(); - compress_pcx(argv[1]); - closemode(); - } - else - { - script_compress(argv[1]); - } - puts("Zaviram Motion GIF..."); - close_mgf_file(); - } diff --git a/VIDEO/PLAY.C b/VIDEO/PLAY.C deleted file mode 100644 index 3138bf2..0000000 --- a/VIDEO/PLAY.C +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include -#include "flc.h" -#include "vesa.h" - -void Set_TEXT_mode (void); - -void main (int argc, char *argv[]) -{ - int x; - - Open_FLC (argv[1]); - - printf ("\nHlavicka FLC souboru %s:\n", argv[1]); - printf ("Delka celeho souboru: %d\n", h_flc.size); - printf ("Pocet frame: %d\n", h_flc.frames); - printf ("Velikost filmu: %dx%d\n", h_flc.width, h_flc.height); - printf ("Hloubka barvy: %d\n", h_flc.color); -// printf ("Rychlost prehravani: %d fps\n", 1000/h_flc.speed); - printf ("Offset prvniho frame: %d\n", h_flc.offset1); - getch (); - - Set_VESA_mode (0x101); - delay (1000); - - Get_first_frame (); - Decompress_frame (); - Show_screen (frame_buffer); - - for (x=2; x<=h_flc.frames; x++) - { - Get_next_frame (); - Decompress_frame (); - Show_screen (frame_buffer); - delay (7); - } - getch (); - - Set_TEXT_mode (); - Close_FLC (); -} - -void Set_TEXT_mode (void) -{ - union REGS inr, outr; - - inr.h.ah = 0x00; - inr.h.al = 03; - int386 (0x10, &inr, &outr); -} - - diff --git a/VIDEO/PLAYCNM.C b/VIDEO/PLAYCNM.C deleted file mode 100644 index 591be36..0000000 --- a/VIDEO/PLAYCNM.C +++ /dev/null @@ -1,356 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "anipack.h" -#include "cinema.h" -#include - - -#define CINEMA ".cnm" -#define PLATNO_X 640 -#define PLATNO_Y 184 - -#define PLATNO_S (PLATNO_X*PLATNO_Y) -#define POZICE (60) - -#define DECOMP_BUFF 150000 - -FILE *anim; -word *playscreen; -word *playscreen2; -word *paleta; -word *show_place; -char *decomp_buff; -char *ip; -word direct_line_len=640*8; -char direct=0; -char fusing=1; -char ifuse=0; -char interlaced=0; -char sdiff=0; - -char test_frame[120000]; - -void priponu(char *source,char *target,int n) - { - char *c,*d; - - c=strrchr(source,'.'); - d=strrchr(source,'\\'); - strncpy(target,source,n); - if (c==NULL || c16 && mode<64) || mode>64) exit(0); - if (mode<64) - { - for(i=0;i>1; - q++;p++;i--; - } - while (i); - } - -void copy_frames() - { - memcpy(playscreen2,playscreen,PLATNO_S*2); - } - -void display_interlaced(word *playscreen2,int ofs) - { - word *p,*q; - int i=180; - p=show_place+ofs; - q=playscreen2; - do - { - if (banking) memcpy(mapvesaadr1(p),q,1280);else memcpy(p,q,1280); - q+=640; - p+=banking?2048:1280;i--; - } - while (i); - } - -void display_full_lfb(word *playscreen2) - { - word *p,*q; - int i=180; - p=show_place; - q=playscreen2; - do - { - int j=320; - memcpy(p,q,1280); - p+=640; - do - { - *(long *)p=(*(long *)q & 0x7bde7bde)+(*(long *)(q+640) & 0x7bde7bde)>>1;q+=2;p+=2;j--; - } - while(j); - i--; - } - while (i); - } - -void display_full_bank(word *playscreen2) - { - word *p,*q; - long *z; - int i=180; - p=show_place; - q=playscreen2; - do - { - int j=320; - memcpy(mapvesaadr1(p),q,1280); - p+=1024; - z=(long *)mapvesaadr1(p); - do - { - *z=(*(long *)q & 0x7bde7bde)+(*(long *)(q+640) & 0x7bde7bde)>>1;q+=2;z++;j--; - } - while(j); - p+=1024; - i--; - } - while (i); - } - - -void show_play_screen() - { - if (interlaced) - { - if (fusing) - { - if (ifuse) display_interlaced(playscreen,(banking?1024:640)); - else - { - if (!banking) display_interlaced_fused_lfb(playscreen,playscreen2,show_place); - else display_interlaced_fused_bank(playscreen,playscreen2,show_place); - } - delay(30); - } - display_interlaced(playscreen,0); - } - else - { - if (fusing) - { - fuse_frames(); - if (banking) display_full_bank(playscreen2);else display_full_lfb(playscreen2); - delay(30); - copy_frames(); - } - if (banking) display_full_bank(playscreen);else display_full_lfb(playscreen); - } - } - -void set_direct_mode() - { - fusing=0; - if (!banking) - { - direct=1; - playscreen=show_place; - anim_line_len=1280*2; - direct_line_len=640*16; - } - - } - -void play_cinema(FILE *anim) - { - char i; - - do - { - fread(&i,1,1,anim); - switch (i) - { - case TRACK_VIDEO: - load_frame(anim); - decompr_pict(); - break; - case TRACK_PALETTE: - load_palette(anim); - break; - case TRACK_MUSIC:break; - case TRACK_END:return; - case TRACK_DELAY: - if (!direct) - show_play_screen(); - break; - default: return; - } - if (_bios_keybrd(_KEYBRD_READY)) return; - } - while (1); - } - -void analyze_params(char *c) - { - while (*c) - switch (*c++) - { - case 'i': - case 'I':interlaced=1;break; - case 's': - case 'S':fusing=0;break; - case 'd': - case 'D':direct=1;break; - case 'v': - case 'V':sdiff=1;break; - case 'f': - case 'F':ifuse=1;interlaced=1;fusing=1;break; - } - - } - -void main(int argc,char **argv) - { - char filename[129]; - - if (argc<2) - { - puts("Pouziti: PLAYCNM film[.cnm] [I][D][S]"); - puts(" I - Interlaced, prokladane"); - puts(" S -Skip,vypina dvojnasobny pocet Framu"); - puts(" D - Direct, prima dekomprese do LFB (totez jako IS, ale rychle)"); - puts(" V - View differences, zobrazuje pouze rozdily (jen ty dulezite)"); - puts(" F - Zapina specialni prokladaci rezim + I, ignoruje pri D"); - return; - } - if (argc>=3) analyze_params(argv[2]); - priponu(argv[1],filename,124); - anim=fopen(filename,"rb"); - if (anim==NULL) - { - printf("Nemohu otevrit soubor %s.\n",filename); - return; - } - if (initmode32(NULL)) - { - puts("Tento program vyzaduje grafickou kartu, ktera podporuje HICOLOR 32768 barev") ; - return; - } - delay(1000); - init_cinema(); - if (direct) set_direct_mode(); - do - { - play_cinema(anim); - fseek(anim,0,SEEK_SET); - } - while (!_bios_keybrd(_KEYBRD_READY)); - done_cinema(); - closemode(); - fclose(anim); - } diff --git a/VIDEO/SADA7.FON b/VIDEO/SADA7.FON deleted file mode 100644 index cbc9f801083d72b1e91bb28f2854299cba36196f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8815 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 diff --git a/VIDEO/VIDEO.C b/VIDEO/VIDEO.C deleted file mode 100644 index d74a6a4..0000000 --- a/VIDEO/VIDEO.C +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "bitline.h" - -int komprimuj_rovinu(void *vstup, int velikost,int rovina,void *buffer,int *vysledek) - { - int i; - int m[4]={0,0,0,0},min,j; - char c[4][1930]; - char *d; - - buffer;vysledek; - rovina=1<=m[1] && m[1]<=m[2]) j=1; - else j=2; - if (m[j]>=m[3]) j=3; - min=m[j]; - printf("%5d %5d %5d %5d - %5d\n",m[0],m[1],m[2],m[3],min); - *vysledek=min; - memcpy(buffer,c[j],min); - return j; - } - - -void *decomprimuj_rovinu(void *vstup,void *vystup,int velikost,int rovina,int mode) - { - char *d; - mode>>=rovina*2; - mode&=0x3; - rovina=1<>3)]|=m<<((j & 0x7)*2); - suma+=vel; - d=(char *)d+vel; - } - suma+=6; - c+=160*2; - } - printf("%d / %d / %d \n",180*20*15*4, suma, suma*100/(180*20*15*4)); - c=pcx+2+2+2; - memset(c,0,640*480*2); - d=compr; - for (i=0;i<180*4;i++) - { - blckdata=d; - d=(char *)d+6; - for(j=0;j<15;j++) - d=decomprimuj_rovinu(d,&c[160*2*blckdata[0]],160,j,(int)blckdata[1]); - } - } - -main() - { - test(); - } - - - diff --git a/Windows/BGraph2Dx.cpp b/Windows/BGraph2Dx.cpp deleted file mode 100644 index 4a45726..0000000 --- a/Windows/BGraph2Dx.cpp +++ /dev/null @@ -1,684 +0,0 @@ -#include -#define DWORD_PTR DWORD * -#include -#include -#include "Skeldal_win.h" -#include "resource.h" - -#define SKELDALCLASSNAME "BranySkeldalDXWindow" - -#define INWINDOW runinwindow - -static int dxWindowZoom=1; - -static HWND hMainWnd; -static IDirect3D9 *DxHandle; -static IDirect3DDevice9 *DxDevice; -static IDirect3DSurface9 *DxBackBuffer; -static D3DPRESENT_PARAMETERS pparm; - -static int initSizeX = 640; -static int initSizeY = 480; - -static unsigned short *mainBuffer=NULL; -static unsigned short *secondBuffer=NULL; -static unsigned short *curBuffer=NULL; -static uint32_t main_linelen; - -#ifdef _DX_REF -#define DXDEVICE_TYPE D3DDEVTYPE_REF -#else -#define DXDEVICE_TYPE D3DDEVTYPE_HAL -#endif - -static bool dialogs=false; -static bool runinwindow=false; -static int shiftscrx=0,shiftscry=0; - -void DXMouseTransform(unsigned short *x, unsigned short *y) -{ - *x=*x*2/dxWindowZoom; - *y=*y*2/dxWindowZoom; -} - -static const char *GetDXResult(HRESULT res) -{ - const char *text; - switch (res) - { - case D3DOK_NOAUTOGEN:text="D3DOK_NOAUTOGEN\r\n\r\nThis is a success code. However, the autogeneration of mipmaps is not supported for this format. This means that resource creation will succeed but the mipmap levels will not be automatically generated.";break; - case D3DERR_CONFLICTINGRENDERSTATE:text="D3DERR_CONFLICTINGRENDERSTATE\r\n\r\nThe currently set render states cannot be used together.";break; - case D3DERR_CONFLICTINGTEXTUREFILTER:text="D3DERR_CONFLICTINGTEXTUREFILTER\r\n\r\nThe current texture filters cannot be used together.";break; - case D3DERR_CONFLICTINGTEXTUREPALETTE:text="D3DERR_CONFLICTINGTEXTUREPALETTE\r\n\r\nThe current textures cannot be used simultaneously.";break; - case D3DERR_DEVICELOST:text="D3DERR_DEVICELOST\r\n\r\nThe device has been lost but cannot be reset at this time. Therefore, rendering is not possible.";break; - case D3DERR_DEVICENOTRESET:text="D3DERR_DEVICENOTRESET\r\n\r\nThe device has been lost but can be reset at this time.";break; - case D3DERR_DRIVERINTERNALERROR:text="D3DERR_DRIVERINTERNALERROR\r\n\r\nInternal driver error. Applications should destroy and recreate the device when receiving this error. For hints on debugging this error, see Driver Internal Errors.";break; - case D3DERR_DRIVERINVALIDCALL:text="D3DERR_DRIVERINVALIDCALL\r\n\r\nNot used.";break; - case D3DERR_INVALIDCALL:text="D3DERR_INVALIDCALL\r\n\r\nThe method call is invalid. For example, a method's parameter may not be a valid pointer.";break; - case D3DERR_INVALIDDEVICE:text="D3DERR_INVALIDDEVICE\r\n\r\nThe requested device type is not valid.";break; - case D3DERR_MOREDATA:text="D3DERR_MOREDATA\r\n\r\nThere is more data available than the specified buffer size can hold.";break; - case D3DERR_NOTAVAILABLE:text="D3DERR_NOTAVAILABLE\r\n\r\nZarizeni neni podporovano. Tato chyba vetsinou vznika pri problemu graficke karty a ovladacu. Prosim preinstalujte ovladace ke graficke karte. (\"This device does not support the queried technique.\")";break; - case D3DERR_NOTFOUND:text="D3DERR_NOTFOUND\r\n\r\nThe requested item was not found.";break; - case D3DERR_OUTOFVIDEOMEMORY:text="D3DERR_OUTOFVIDEOMEMORY\r\n\r\nDirect3D does not have enough display memory to perform the operation.";break; - case D3DERR_TOOMANYOPERATIONS:text="D3DERR_TOOMANYOPERATIONS\r\n\r\nThe application is requesting more texture-filtering operations than the device supports.";break; - case D3DERR_UNSUPPORTEDALPHAARG:text="D3DERR_UNSUPPORTEDALPHAARG\r\n\r\nThe device does not support a specified texture-blending argument for the alpha channel.";break; - case D3DERR_UNSUPPORTEDALPHAOPERATION:text="D3DERR_UNSUPPORTEDALPHAOPERATION\r\n\r\nThe device does not support a specified texture-blending operation for the alpha channel.";break; - case D3DERR_UNSUPPORTEDCOLORARG:text="D3DERR_UNSUPPORTEDCOLORARG\r\n\r\nThe device does not support a specified texture-blending argument for color values.";break; - case D3DERR_UNSUPPORTEDCOLOROPERATION:text="D3DERR_UNSUPPORTEDCOLOROPERATION\r\n\r\nThe device does not support a specified texture-blending operation for color values.";break; - case D3DERR_UNSUPPORTEDFACTORVALUE:text="D3DERR_UNSUPPORTEDFACTORVALUE\r\n\r\nThe device does not support the specified texture factor value. Not used; provided only to support older drivers.";break; - case D3DERR_UNSUPPORTEDTEXTUREFILTER:text="D3DERR_UNSUPPORTEDTEXTUREFILTER\r\n\r\nThe device does not support the specified texture filter.";break; - case D3DERR_WASSTILLDRAWING:text="D3DERR_WASSTILLDRAWING\r\n\r\nThe previous blit operation that is transferring information to or from this surface is incomplete.";break; - case D3DERR_WRONGTEXTUREFORMAT:text="D3DERR_WRONGTEXTUREFORMAT\r\n\r\nThe pixel format of the texture surface is not valid.";break; - case E_FAIL:text="E_FAIL\r\n\r\nAn undetermined error occurred inside the Direct3D subsystem.";break; - case E_INVALIDARG:text="E_INVALIDARG\r\n\r\nAn invalid parameter was passed to the returning function.";break; -// case E_INVALIDCALL:text="E_INVALIDCALL\r\n\r\nThe method call is invalid. For example, a method's parameter may have an invalid value.";break; - case E_NOINTERFACE:text="E_NOINTERFACE\r\n\r\nNo object interface is available.";break; - case E_NOTIMPL:text="E_NOTIMPL\r\n\r\nNot implemented.";break; - case E_OUTOFMEMORY:text="E_OUTOFMEMORY\r\n\r\nDirect3D could not allocate sufficient memory to complete the call.";break; - default: text="Neznama chyba DX";break; - } - return text; -} - -static inline void CheckResult(HRESULT res) - { - if (res==0) return; - char buff[512]; - sprintf(buff,"Chyba pri praci s DirectX: %s\r\nDxResult failed %8X (%d)",GetDXResult(res),res,res&0xFFFF); - MessageBox(NULL,buff,NULL,MB_OK); - ExitProcess(res); - } - -extern "C" - { - -void setvesa_displaystart(int x,int y) - { - WINDOWPLACEMENT wp; - wp.length=sizeof(wp); - GetWindowPlacement(hMainWnd,&wp); - wp.ptMaxPosition.x+=x-shiftscrx; - wp.ptMaxPosition.y+=y-shiftscry; - wp.rcNormalPosition.left+=x-shiftscrx; - wp.rcNormalPosition.top+=y-shiftscry; - wp.rcNormalPosition.right+=x-shiftscrx; - wp.rcNormalPosition.bottom+=y-shiftscry; - shiftscrx=x; - shiftscry=y; - SetWindowPlacement(hMainWnd,&wp); - } - - -#ifndef WINDOWCLASSFLAGS -#define WINDOWCLASSFLAGS 0 -#endif - -static void RegisterWindowClass() - { - WNDCLASSEX cls; - cls.cbSize=sizeof(cls); - cls.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC|WINDOWCLASSFLAGS ; - cls.lpfnWndProc=(WNDPROC)GameMainWindowWindowProc; - cls.cbClsExtra=0; - cls.cbWndExtra=0; - cls.hInstance=GetModuleHandle(NULL); - cls.hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_MAINICON));; - cls.hCursor=NULL; - cls.hbrBackground=NULL; - cls.lpszMenuName=NULL; - cls.lpszClassName=SKELDALCLASSNAME; - cls.hIconSm=NULL; - if (RegisterClassEx(&cls)==NULL) - { - MessageBox(NULL,"RegisterClassFailed",NULL,MB_OK); - exit(0); - } - } - -static void ColCalc() - { - do - { - int32_t val; - printf("number:"); - scanf("%X",&val); - printf("RGB555(%d,%d,%d)\n",(val>>10),(val>>5) & 0x1F, val & 0x1F); - } - while (1); - } - -static void CreateSkeldalWindow() - { - //ColCalc(); - char buff[256]; - - LoadString(GetModuleHandle(NULL),IDS_WINTITLE,buff,sizeof(buff)); - - - RECT rc={0,0,initSizeX*dxWindowZoom/2,initSizeY*dxWindowZoom/2}; - DWORD flags=(INWINDOW?(WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX|WS_CAPTION|WS_BORDER):(WS_POPUP|WS_SYSMENU))|WS_VISIBLE; - AdjustWindowRect(&rc,flags,FALSE); - hMainWnd=CreateWindow(SKELDALCLASSNAME,buff,flags,100,100,rc.right-rc.left,rc.bottom-rc.top,NULL,NULL,GetModuleHandle(NULL),NULL); - if (hMainWnd==NULL) - { - MessageBox(NULL,"WindowCreationFailed",NULL,MB_OK); - exit(0); - } - UpdateWindow(hMainWnd); - } - - -static void DisplayMode(char init) - { - DEVMODE mode; - int res; - - if (init) - { - EnumDisplaySettings(NULL,ENUM_REGISTRY_SETTINGS,&mode); - - mode.dmSize=sizeof(mode); - mode.dmBitsPerPel=16; - mode.dmFields=DM_BITSPERPEL|DM_DISPLAYFREQUENCY|DM_DISPLAYFLAGS|DM_PELSWIDTH|DM_PELSHEIGHT; - - res=ChangeDisplaySettings(&mode,0); - } - else - res=ChangeDisplaySettings(NULL,0); - } - -static bool ShowLogo() - { - HBITMAP logo=(HBITMAP)LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_INITLOGO),IMAGE_BITMAP,0,0,0); - if (logo==NULL) return false; - HDC hDC; - CheckResult(DxBackBuffer->GetDC(&hDC)); - HDC hBitmap=CreateCompatibleDC(hDC); - HBITMAP old=(HBITMAP)SelectObject(hBitmap,logo); - BitBlt(hDC,0,0,initSizeX,initSizeY,hBitmap,0,0,SRCCOPY); - SelectObject(hBitmap,old); - DeleteDC(hBitmap); - DxBackBuffer->ReleaseDC(hDC); - DeleteObject(logo); - return true; - } - -void CheckMessageQueue(); - -char DXInit64(char inwindow, int zoom, int monitor, int refresh) - { - runinwindow=inwindow!=0; - dxWindowZoom=inwindow?zoom+1:2; - - RegisterWindowClass(); - CreateSkeldalWindow(); - - DxHandle=Direct3DCreate9(D3D_SDK_VERSION); - if (DxHandle==NULL) - { - MessageBox(hMainWnd,"Nepodarilo se inicializovat DirectX. " - "Preinstalujte prosim DirectX ze stranek www.microsoft.com/directx. " - "Ke spusteni je potreba mit aspon verzi DirectX 9.0c",NULL,MB_OK|MB_ICONEXCLAMATION); - return 0; - } - - HMONITOR mon=DxHandle->GetAdapterMonitor(monitor); - if (mon!=NULL) - { - MONITORINFO moninfo; - moninfo.cbSize=sizeof(moninfo); - GetMonitorInfo(mon,&moninfo); - SetWindowPos(hMainWnd,NULL,moninfo.rcWork.left,moninfo.rcWork.top,0,0,SWP_NOZORDER|SWP_NOSIZE); - } - - pparm.BackBufferWidth=initSizeX; - pparm. BackBufferHeight=initSizeY; - pparm.BackBufferFormat=D3DFMT_R5G6B5; - pparm.BackBufferCount=1; - pparm.MultiSampleType=D3DMULTISAMPLE_NONE; - pparm.SwapEffect=D3DSWAPEFFECT_COPY; - pparm.hDeviceWindow=hMainWnd; - pparm.Windowed=INWINDOW; - pparm.EnableAutoDepthStencil=FALSE; - pparm.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; - pparm.FullScreen_RefreshRateInHz=INWINDOW?0:refresh; - pparm.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE ; - pparm.MultiSampleQuality=0; - - HRESULT res; - - res=DxHandle->CreateDevice(monitor,DXDEVICE_TYPE,hMainWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&pparm,&DxDevice); - if (res!=0 && inwindow) - { - DisplayMode(1); - res=DxHandle->CreateDevice(monitor,DXDEVICE_TYPE,hMainWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&pparm,&DxDevice); - } - if (res!=0) - { - res=DxHandle->CreateDevice(monitor,D3DDEVTYPE_REF,hMainWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&pparm,&DxDevice); - } - if (res!=0) - { - CheckResult(res); - return 0; - } - - res=DxDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&DxBackBuffer); - CheckResult(res); - - bool logo; - logo=ShowLogo(); - - D3DLOCKED_RECT lrc; - - res=DxBackBuffer->LockRect(&lrc,NULL,0); - CheckResult(res); - - main_linelen=dx_linelen=scr_linelen=lrc.Pitch; - scr_linelen2=scr_linelen/2; - curBuffer=mainBuffer=(unsigned short *)lrc.pBits; - - secondBuffer=(unsigned short *)malloc(lrc.Pitch*initSizeY); - - if (logo) - { - InvalidateRect(hMainWnd,NULL,TRUE); - DWORD tm=GetTickCount()+5000; - while (tm>GetTickCount()) {Sleep(100);CheckMessageQueue();} - } - - return 1; - } - -void DXCloseMode() - { - if (DxDevice) - { - if (DxBackBuffer) DxBackBuffer->Release(); - DxDevice->Release(); - DxHandle->Release(); - DestroyWindow(hMainWnd); - UnregisterClass(SKELDALCLASSNAME,GetModuleHandle(NULL)); - free(secondBuffer); - if (runinwindow) DisplayMode(0); - DxDevice=NULL; - DxBackBuffer = NULL; - } - } - - -static void HandleDeviceLost() - { - HRESULT res=D3DERR_DEVICELOST; - DxBackBuffer->Release(); - DxBackBuffer=NULL; - while (res==D3DERR_DEVICELOST) - { - while (DxDevice->TestCooperativeLevel()!=D3DERR_DEVICENOTRESET) - { - MSG msg; - GetMessage(&msg,0,0,0); - DispatchMessage(&msg); - } - res=DxDevice->Reset(&pparm); - } - res=DxDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&DxBackBuffer); - CheckResult(res); - res=DxDevice->Present(NULL,NULL,hMainWnd,NULL); - } - -static void GlobalPresent(RECT *prc) -{ - RECT rc=*prc; - RECT winrc=rc; - int z=dxWindowZoom/2; - if (dxWindowZoom!=2) - { - rc.left-=z; - rc.top-=z; - rc.right+=z; - rc.bottom+=z; - if (rc.left<0) rc.left=0; - if (rc.top<0) rc.top=0; - if (rc.right>=winrc.right) rc.right=winrc.right; - if (rc.bottom>=winrc.bottom) rc.bottom=winrc.bottom; - rc.left&=~1; - rc.top&=~1; - rc.right&=~1; - rc.bottom&=~1; - winrc=rc; - winrc.left=winrc.left*dxWindowZoom/2; - winrc.top=winrc.top*dxWindowZoom/2; - winrc.right=winrc.right*dxWindowZoom/2; - winrc.bottom=winrc.bottom*dxWindowZoom/2; - } - if (!dialogs) - { - LRESULT res=DxDevice->Present(&rc,&winrc,hMainWnd,NULL); - if (res==D3DERR_DEVICELOST) HandleDeviceLost(); - } -} - - -static bool UnLockBuffers() - { - if (DxBackBuffer==NULL) return false; - HRESULT res; - res=DxBackBuffer->UnlockRect(); - CheckResult(res); - return true; - } - -static void LockBuffers() - { - D3DLOCKED_RECT lrc; - HRESULT res; - res=DxBackBuffer->LockRect(&lrc,NULL,0); - CheckResult(res); - - curBuffer=mainBuffer=(unsigned short *)lrc.pBits; - if (dx_linelen!=lrc.Pitch) - { - free(secondBuffer); - main_linelen=dx_linelen=scr_linelen=lrc.Pitch; - scr_linelen2=scr_linelen/2; - curBuffer=mainBuffer=(unsigned short *)lrc.pBits; - secondBuffer=(unsigned short *)malloc(lrc.Pitch*initSizeY); - } - } - -void DXCopyRects64(unsigned short x,unsigned short y,unsigned short xs,unsigned short ys) - { - if (UnLockBuffers()==false) return; - - RECT rc; - rc.left=x; - rc.top=y; - rc.right=x+xs; - rc.bottom=y+ys; - GlobalPresent(&rc); - LockBuffers(); - - } - -unsigned short *GetScreenAdr() - { - return curBuffer; - } - -unsigned short *GetBuffer2nd() - { - return secondBuffer; - } - -void RedirectScreen(unsigned short *newaddr) - { - curBuffer=newaddr; - } - -void RestoreScreen() - { - curBuffer=mainBuffer; - scr_linelen=main_linelen; - scr_linelen2=main_linelen>>1; - - } - - -void RedirectScreenBufferSecond() - { - curBuffer=secondBuffer; - } - - -void DXCopyRects64zoom2(unsigned short x,unsigned short y,unsigned short xs,unsigned short ys) - { - HRESULT res; - if (UnLockBuffers()==false) return; - - - RECT rc; - rc.left=x; - rc.top=y; - rc.right=x+xs; - rc.bottom=y+ys; - RECT zoom; - zoom.left=x; - zoom.top=y; - zoom.right=x+2*xs; - zoom.bottom=y+2*ys; - - res=DxDevice->Present(&rc,&zoom,hMainWnd,NULL); - if (res==D3DERR_DEVICELOST) HandleDeviceLost(); - - - LockBuffers(); - } - - -void *DxPrepareWalk(int ypos) - { - HRESULT res; - - - IDirect3DSurface9 *tempbuff; - res=DxDevice->CreateRenderTarget(640,360,D3DFMT_R5G6B5,D3DMULTISAMPLE_NONE,0,TRUE,&tempbuff,NULL); - CheckResult(res); - UnLockBuffers(); - RECT src;src.left=0;src.top=ypos;src.right=640;src.bottom=ypos+360; - RECT trg;trg.left=0;trg.top=0;trg.right=640;trg.bottom=360; - res=DxDevice->StretchRect(DxBackBuffer,&src,tempbuff,&trg,D3DTEXF_NONE); - CheckResult(res); - LockBuffers(); - - return (void *)tempbuff; - } - -void DxZoomWalk(void *handle, int ypos, int *points,float phase, void *lodka) - { - if (phase>1.0) phase=1.0f; - if (phase<0.0) phase=0.0f; - UnLockBuffers(); - IDirect3DSurface9 *surf=(IDirect3DSurface9 *)handle; - RECT rc1;rc1.left=0;rc1.top=0;rc1.right=640;rc1.bottom=360; - RECT rc2;rc2.left=points[0];rc2.top=points[1];rc2.right=points[2];rc2.bottom=points[3]; - RECT rcx; - rcx.left=(int)(rc1.left+(rc2.left-rc1.left)*phase); - rcx.top=(int)(rc1.top+(rc2.top-rc1.top)*phase); - rcx.right=(int)(rc1.right+(rc2.right-rc1.right)*phase); - rcx.bottom=(int)(rc1.bottom+(rc2.bottom-rc1.bottom)*phase); - rc1.top+=ypos; - rc1.bottom+=ypos; - -/* HDC srcdc; - HDC trgdc; - HRESULT res; - res=surf->GetDC(&srcdc);CheckResult(res); - res=DxBackBuffer->GetDC(&trgdc);CheckResult(res); - StretchBlt( - trgdc,rc1.left,rc1.top,rc1.right-rc1.left,rc1.bottom-rc1.top, - srcdc,rcx.left,rcx.top,rcx.right-rcx.left,rcx.bottom-rcx.top,SRCCOPY); - surf->ReleaseDC(srcdc); - DxBackBuffer->ReleaseDC(trgdc); -*/ - - - HRESULT res; - res=DxDevice->StretchRect(surf,&rcx,DxBackBuffer,&rc1,D3DTEXF_NONE); - CheckResult(res); - - GlobalPresent(&rc1); - LockBuffers(); - } - -void DxDoneWalk(void *handle) - { - IDirect3DSurface9 *surf=(IDirect3DSurface9 *)handle; - if (surf) surf->Release(); - } - - - -void DxTurnLeftRight(char right, float phase, int border, int ypos, int *last) - { - if (phase>1.0) phase=1.0f; - if (phase<0.0) phase=0.0f; - if (phase<0.05f) return; - int space=640-2*border; - - unsigned short *scr=GetScreenAdr()+scr_linelen2*ypos; - unsigned short *buf=GetBuffer2nd()+scr_linelen2*ypos; - - int turnout=(float)(space*phase)+border; - int difto=turnout-*last; - if (!right) - { - buf+=border; - for (int y=0;y<360;y++) - { - memcpy(scr,scr+difto,(640-turnout)*2); - memcpy(scr+(640-turnout),buf,(turnout)*2); - scr+=scr_linelen2; - buf+=scr_linelen2; - } - *last=turnout; - } - else - { - for (int y=0;y<360;y++) - { - memmove(scr+*last+difto-border,scr+*last-border,(640-turnout+border)*2); - memcpy(scr,buf+(640-turnout)-border,turnout*2); - scr+=scr_linelen2; - buf+=scr_linelen2; - } - *last=turnout; - } - DXCopyRects64(0,ypos,640,360+ypos); - } - -void *DxPrepareTurn(int ypos) - { - IDirect3DSurface9 **handle=new IDirect3DSurface9 *[2]; - HRESULT res; - - - res=DxDevice->CreateRenderTarget(640,360,D3DFMT_R5G6B5,D3DMULTISAMPLE_NONE,0,TRUE,handle,NULL); - CheckResult(res); - UnLockBuffers(); - RECT src;src.left=0;src.top=ypos;src.right=640;src.bottom=ypos+360; - RECT trg;trg.left=0;trg.top=0;trg.right=640;trg.bottom=360; - res=DxDevice->StretchRect(DxBackBuffer,&src,handle[0],&trg,D3DTEXF_NONE); - CheckResult(res); - - res=DxDevice->CreateRenderTarget(640,360,D3DFMT_R5G6B5,D3DMULTISAMPLE_NONE,0,TRUE,handle+1,NULL); - CheckResult(res); - D3DLOCKED_RECT lrect; - res=handle[1]->LockRect(&lrect,NULL,0); - CheckResult(res); - - unsigned short *trgptr=(unsigned short *)lrect.pBits; - unsigned short *srcptr=secondBuffer+scr_linelen2*ypos; - for (int i=0;i<360;i++,trgptr=(unsigned short *)((char *)trgptr+lrect.Pitch),srcptr+=scr_linelen2) - memcpy(trgptr,srcptr,640*2); - handle[1]->UnlockRect(); - - LockBuffers(); - - return (void *)handle; - } - - -static inline void CopySurfaceAtPos(IDirect3DSurface9 *src, int width, int height, int xpos,int ypos, int border) - { - RECT trc; - trc.left=xpos; - trc.top=ypos; - trc.right=xpos+width; - trc.bottom=ypos+height; - RECT s_rc; - s_rc.left=0; - s_rc.top=0; - s_rc.right=width; - s_rc.bottom=height; - if (border<0) - { - trc.left-=border; - s_rc.left-=border; - } - else - { - trc.right-=border; - s_rc.right-=border; - } - if (trc.left<0) {s_rc.left-=trc.left*0.7;trc.left=0;} - if (trc.right>=640) {s_rc.right-=(trc.right-640)*0.7;trc.right=640;} - CheckResult(DxDevice->StretchRect(src,&s_rc,DxBackBuffer,&trc,D3DTEXF_NONE)); - } - -void DxTurn(void *handle, char right, int ypos,int border, float phase, void *lodka) - { - right=!right; - if (phase>1.0) phase=1.0f; - if (phase<0.0) phase=0.0f; - UnLockBuffers(); - IDirect3DSurface9 **ihandle=(IDirect3DSurface9 **)handle; - IDirect3DSurface9 *sleft=ihandle[right?0:1]; - IDirect3DSurface9 *sright=ihandle[right?1:0]; - int width=640-border*2; - int xpos=(int)border+width*phase; - if (right) xpos=640-xpos; - CopySurfaceAtPos(sleft,640,360,xpos-640+border,ypos,border); - CopySurfaceAtPos(sright,640,360,xpos-border,ypos,-border); - - - RECT rc={0,ypos,640,ypos+360}; - - GlobalPresent(&rc); - LockBuffers(); - } - - -void DxDoneTurn(void *handle) - { - IDirect3DSurface9 **ihandle=(IDirect3DSurface9 **)handle; - ihandle[0]->Release(); - ihandle[1]->Release(); - delete [] ihandle; - } - -void DxDialogs(char enable) - { - dialogs=enable!=0; - } - -} -HWND GetGameWindow() - {return hMainWnd;} - -void DxLockBuffers(BOOL lock) -{ - if (lock) LockBuffers(); - else UnLockBuffers(); -} - -void StripBlt(void *data, unsigned int startline, uint32_t width) -{ - unsigned short *start=startline*scr_linelen2+GetScreenAdr(); - while (width--) - { - memcpy(start,data,640*2); - data=(void *)((char *)data+scr_linelen); - start=start+scr_linelen2; - } -} - -void DxSetInitResolution(int x, int y) -{ - initSizeX = x; - initSizeY = y; - -} - -int DxGetResX() {return initSizeX;} -int DxGetResY() {return initSizeY;} diff --git a/Windows/BGraph2Dx.h b/Windows/BGraph2Dx.h deleted file mode 100644 index eedf6dd..0000000 --- a/Windows/BGraph2Dx.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef __BGRAPH_DX_WRAPPER_ -#define __BGRAPH_DX_WRAPPER_ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int32_t scr_linelen; -extern int32_t scr_linelen2; -extern int32_t dx_linelen; - - -//inicializuje a otevira rezim 640x480x16b v DX - otevre okno, pripravi vse pro beh hry -//Vraci 1 pri uspechu -char DXInit64(char inwindow,int zoom,int monitor, int refresh); - -//uzavre rezim grafiky -void DXCloseMode(); - -//void DXCopyRects32(unsigned short x,unsigned short y,unsigned short xs,unsigned short ys); -void DXCopyRects64(unsigned short x,unsigned short y,unsigned short xs,unsigned short ys); -void DXCopyRects64zoom2(unsigned short x,unsigned short y,unsigned short xs,unsigned short ys); - -void *DxPrepareWalk(int ypos); -void DxZoomWalk(void *handle, int ypos, int *points,float phase, void *lodka); -void DxDoneWalk(void *handle); - -void *DxPrepareTurn(int ypos); -void DxTurn(void *handle, char right, int ypos,int border, float phase, void *lodka); -void DxDoneTurn(void *handle); -void DxTurnLeftRight(char right, float phase, int border, int ypos, int *last); - - -void DxDialogs(char enable); - -void setvesa_displaystart(int x,int y); - -extern int32_t scr_linelen; -extern int32_t scr_linelen2; - -void DxSetInitResolution(int x, int y); -int DxGetResX(); -int DxGetResY(); - -void DXMouseTransform(unsigned short *x, unsigned short *y); - -HWND GetGameWindow(); -void DxLockBuffers(BOOL lock); - -void StripBlt(void *data, unsigned int startline, uint32_t width); - - -#ifdef __cplusplus - } -#endif - - -#endif \ No newline at end of file diff --git a/Windows/BOLDCZ.FON b/Windows/BOLDCZ.FON deleted file mode 100644 index be5e16c7bc204cc269f8460b692ba38ff6f14220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9034 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 -#include -#include "types.h" -#include "event.h" -#include -#include "FCS_Tasker.h" -#include - - -#define MAX_FIBERS 32 - -typedef struct _fcs_taskerstruct - { - void *fiberHandle; - int wait_event; - char waiting:1; - char exitFiber:1; - char usedSlot:1; - } FCS_TASKERSTRUCT; - -#define THREADDECL __declspec (thread) - -static THREADDECL FCS_TASKERSTRUCT fiberList[MAX_FIBERS]; -static THREADDECL int fiberNextSlot=-1; -static THREADDECL void *mainFiber=NULL; -static THREADDECL void *cleaningFiber=NULL; -static THREADDECL int currentFiber=-1; -static THREADDECL int lastTask=-1; -static THREADDECL void *switchData=NULL; -static THREADDECL int task_count=0; - -static void CALLBACK CleaningFiber(void *lpParameter) - { - do - { - SEND_LOG("(TASKER) Cleaning task %d",currentFiber,0); - assert(currentFiber>=0); - DeleteFiber(fiberList[currentFiber].fiberHandle); - fiberList[currentFiber].usedSlot=0; - currentFiber=-1; - switchData=NULL; - task_count--; - SwitchToFiber(mainFiber); - } - while (1); - } - -static void InitFibers() - { - mainFiber=ConvertThreadToFiber(NULL); - cleaningFiber=CreateFiber(0,CleaningFiber,NULL); - currentFiber=-1; - fiberNextSlot=0; - memset(fiberList,0,sizeof(fiberList)); - SEND_LOG("(TASKER) Fibers inicialized",0,0); - } - -static int GetFreeFiberSlot() - { - int save=fiberNextSlot; - do - { - if (fiberNextSlot<0) fiberNextSlot+=MAX_FIBERS; - if (fiberList[fiberNextSlot].usedSlot==0) return fiberNextSlot--; - fiberNextSlot--; - } - while (fiberNextSlot!=save); - STOP(); - return 0; - } - -static void CALLBACK RunUserFiber(void *params) - { - va_list p=(va_list)switchData; - TaskerFunctionName fcname=(TaskerFunctionName)params; - fcname(p); - SwitchToFiber(cleaningFiber); - } - -int add_task(int stack,TaskerFunctionName fcname,...) - { - if (mainFiber==NULL) InitFibers(); - { - int fib=GetFreeFiberSlot(); - va_list args; - - fiberList[fib].usedSlot=1; - fiberList[fib].waiting=0; - fiberList[fib].exitFiber=0; - fiberList[fib].fiberHandle=CreateFiber(0,RunUserFiber,fcname); - va_start(args,fcname); - switchData=args; - currentFiber=fib; - task_count++; - SEND_LOG("(TASKER) Adding task %d",fib,0); - SwitchToFiber(fiberList[fib].fiberHandle); - return fib; - } - } - -void term_task(int id_num) - { - fiberList[id_num].exitFiber=1; - } - -char is_running(int id_num) - { - return fiberList[id_num].usedSlot; - } - -void suspend_task(int id_num,int msg) - { - fiberList[id_num].waiting=1; - fiberList[id_num].wait_event=msg; - } - -void shut_down_task(int id_num) - { - if (fiberList[id_num].usedSlot) - { - SEND_LOG("(TASKER) Killing task %d",id_num,0); - DeleteFiber(fiberList[id_num].fiberHandle); - task_count--; - fiberList[id_num].usedSlot=0; - } - } - -static void *FCSTaskSleep(void *data,int fiber) - { - if (mainFiber==NULL) return data; - if (fiber==-1) - { - currentFiber=fiber; - if (GetCurrentFiber()==mainFiber) return data; - switchData=data; - SwitchToFiber(mainFiber); - return switchData; - } - if (fiberList[fiber].usedSlot) - { - currentFiber=fiber; - if (GetCurrentFiber()==fiberList[fiber].fiberHandle) return data; - switchData=data; - SwitchToFiber(fiberList[fiber].fiberHandle); - return switchData; - } - return data; - } - - -void unsuspend_task(EVENT_MSG *msg) - { - int id_num; - for (id_num=0;id_nummsg) - { - FCSTaskSleep(msg,id_num); - } - } - -void *task_sleep(void *data) - { - int i,p=lastTask+1; - if (currentFiber!=-1) return FCSTaskSleep(data,-1); - for (i=0;i=MAX_FIBERS) p-=MAX_FIBERS; - if (fiberList[p].usedSlot && !fiberList[p].waiting) - { - lastTask=p; - return FCSTaskSleep(data,p); - } - } - return data; - } - -void *task_wait_event(int32_t event_number) - { - void *p; - suspend_task(currentFiber,event_number); - p=task_sleep((void *)event_number); - fiberList[currentFiber].waiting=0; - if (p==NULL) return NULL; - return ((EVENT_MSG *)p)->data; - } - -int q_any_task() - { - return task_count; - } - -char task_quitmsg() - { - return task_quitmsg_by_id(currentFiber); - } - -char task_quitmsg_by_id(int id) - { - return fiberList[id].exitFiber; - } - -char q_is_mastertask() - { - return currentFiber==-1; - } - -int q_current_task() - { - return currentFiber; - } diff --git a/Windows/FCS_Tasker.h b/Windows/FCS_Tasker.h deleted file mode 100644 index a6e15ca..0000000 --- a/Windows/FCS_Tasker.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _FCS_TASKER_H_ -#define _FCS_TASKER_H_ - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef void (*TaskerFunctionName)(va_list); - -void tasker(EVENT_MSG *msg,void **data); -int create_task(); -int add_task(int stack,TaskerFunctionName fcname,...); -void term_task(int id_num); -char is_running(int id_num); -void suspend_task(int id_num,int msg); -void shut_down_task(int id_num); -void unsuspend_task(EVENT_MSG *msg); -void *task_sleep(void *data); -void *task_wait_event(int32_t event_number); -int q_any_task(); -char task_quitmsg(); -char task_quitmsg_by_id(int id); -char q_is_mastertask(); -int q_current_task(); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/Windows/Music.cpp b/Windows/Music.cpp deleted file mode 100644 index b144364..0000000 --- a/Windows/Music.cpp +++ /dev/null @@ -1,507 +0,0 @@ -#include "skeldal_win.h" -#include -#include -#include -#define DWORD_PTR DWORD * -#include -#include "types.h" -#include "zvuk.h" -#include -#include -extern "C" { -#include - } -#include "Music.h" - - -#define BUFFER_SIZE (512*1024) -#define LOCK_GRANUALITY 16384 - -MusicPlayer::MusicPlayer() -{ - _ds8Buffer=0; - _volume=255; - InitializeCriticalSection(&_lock); -} - -MusicPlayer::~MusicPlayer() -{ - Done(); - DeleteCriticalSection(&_lock); -} - -HRESULT MusicPlayer::InitBuffer(IDirectSound8 *ds8, int *linvoltable) -{ - HRESULT hres; - - WAVEFORMATEX wfex; - wfex.cbSize=sizeof(wfex); - wfex.wBitsPerSample=16; - wfex.nBlockAlign=4; - wfex.nSamplesPerSec=44100; - wfex.nAvgBytesPerSec=wfex.nSamplesPerSec*wfex.nBlockAlign; - wfex.wFormatTag=WAVE_FORMAT_PCM; - wfex.nChannels=2; - - DSBUFFERDESC desc; - desc.dwSize=sizeof(desc); - desc.dwBufferBytes=BUFFER_SIZE; - desc.dwReserved=0; - desc.dwFlags=DSBCAPS_CTRLVOLUME ; - desc.lpwfxFormat=&wfex; - - IDirectSoundBuffer *dsbf; - - hres=ds8->CreateSoundBuffer(&desc,&dsbf,NULL); - hres=dsbf->QueryInterface(IID_IDirectSoundBuffer8,(void **)&_ds8Buffer); - dsbf->Release(); - - _linvoltable=linvoltable; - return hres; -} - -HRESULT MusicPlayer::Play() -{ - _lastWritePos=0; - DWORD size; - void *ptr; - - _ds8Buffer->Lock(0,0,&ptr,&size,NULL,NULL,DSBLOCK_ENTIREBUFFER); - memset(ptr,0,size); - _ds8Buffer->Unlock(ptr,size,NULL,NULL); - _ds8Buffer->SetVolume(_linvoltable[_volume]); - HRESULT res=_ds8Buffer->Play(0,0,DSBPLAY_LOOPING); - _crossfadebytes=0; - _minorpos=0; - return res; -} - -class AutoCloseCriticalSection -{ - LPCRITICAL_SECTION lcrit; -public: - AutoCloseCriticalSection(LPCRITICAL_SECTION l):lcrit(l) - { - EnterCriticalSection(lcrit); - } - ~AutoCloseCriticalSection() - { - LeaveCriticalSection(lcrit); - } -}; - -int MusicPlayer::Open(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms) -{ - AutoCloseCriticalSection lsect(&_lock); - if (numchannels<1 || numchannels>2) return -1; - if (bitspersamp!=8 && bitspersamp!=16) return -1; - _stereo=numchannels==2; - _bit16=bitspersamp==16; - _speed=samplerate*1024/44100; - if (_speed<128) return -1; - _opened=true; - return 0; -} - -HRESULT MusicPlayer::Done() -{ - if (_ds8Buffer) _ds8Buffer->Release(); - _ds8Buffer=0; - return 0; - -} - -DWORD MusicPlayer::GetSafeXFadePos() -{ - DWORD curPos; - _ds8Buffer->GetCurrentPosition(0,&curPos); - int curpos=curPos; - if (curpos>(int)_lastWritePos) curpos-=BUFFER_SIZE; - curpos+=BUFFER_SIZE/4; - if (curpos>(int)_lastWritePos) curpos=_lastWritePos; - if (curpos<0) curpos+=BUFFER_SIZE; - if (curpos>=BUFFER_SIZE) curpos-=BUFFER_SIZE; - return curpos; -} - -static const float Inv2=0.5; -static const float Snapper=3<<22; - -static inline short toInt( float fval ) -{ - fval += Snapper; - return (short)( (*(int *)&fval)&0x007fffff ) - 0x00400000; -} - -void MusicPlayer::Close() -{ - if (TryEnterCriticalSection(&_lock)==FALSE) - { - DWORD status; - _ds8Buffer->GetStatus(&status); - _ds8Buffer->Play(0,0,DSBPLAY_LOOPING); - EnterCriticalSection(&_lock); - if ((status & DSBSTATUS_PLAYING)==0) - _ds8Buffer->Stop(); - } - - if (_crossfadebytes==0) - { - DWORD xfadepos=GetSafeXFadePos(); - DWORD xfadesz=xfadepos>_lastWritePos?(_lastWritePos+BUFFER_SIZE-xfadepos):(_lastWritePos-xfadepos); - void *ptr[2]; - DWORD sz[2]; - float ffadesz=(float)xfadesz*0.5f; - float ffadecnt=0; - if (xfadesz && _ds8Buffer->Lock(xfadepos,xfadesz,ptr+0,sz+0,ptr+1,sz+1,0)==0) - { - for (int i=0;i<2;i++) if (ptr[i]) - { - for (DWORD j=0;jffadesz) ffadecnt=ffadesz; - } - } - _ds8Buffer->Unlock(ptr[0],sz[0],ptr[1],sz[1]); - } - _crossfadebytes=xfadesz; - _lastWritePos=xfadepos; - } - _opened=false; - LeaveCriticalSection(&_lock); -} - -int MusicPlayer::Write(const char *buf, int len) -{ - EnterCriticalSection(&_lock); - if (!_opened) - { - LeaveCriticalSection(&_lock); - return 1; - } - DWORD step=(_stereo?2:1) * (_bit16?2:1); - void *lockptr[2]={0,0}; - DWORD locksz[2]={0,0}; - void *wrtptr=0; - DWORD remainspace=0; - int stage=0; - - while (len>0) - { - short sample[2]; - - if (_bit16) - if (_stereo) - { - sample[0]=*((short *)buf); - sample[1]=*((short *)buf+1); - } - else - { - sample[0]=*((short *)buf); - sample[1]=*((short *)buf); - } - else - if (_stereo) - { - sample[0]=(*buf)*256; - sample[1]=(*(buf+1))*256; - } - else - { - sample[0]=(*buf)*256; - sample[1]=(*buf)*256; - } - while (remainspace<4) - { - if (stage<1) - { - stage++; - remainspace=locksz[stage]; - wrtptr=lockptr[stage]; - } - else - { - if (lockptr[0]) - { - _ds8Buffer->Unlock(lockptr[0],locksz[0],lockptr[1],locksz[1]); - _lastWritePos+=LOCK_GRANUALITY; - while (_lastWritePos>=BUFFER_SIZE) _lastWritePos-=BUFFER_SIZE; - } - DWORD playCursor; - _ds8Buffer->GetCurrentPosition(&playCursor,0); - if (playCursor<_lastWritePos) playCursor+=BUFFER_SIZE; - while (playCursor-_lastWritePosGetCurrentPosition(&playCursor,0); - if (playCursor<_lastWritePos) playCursor+=BUFFER_SIZE; - } - HRESULT res=_ds8Buffer->Lock(_lastWritePos,LOCK_GRANUALITY,lockptr+0,locksz+0,lockptr+1,locksz+1,0); - assert(res==0); - stage=0; - remainspace=locksz[stage]; - wrtptr=lockptr[stage]; - } - } - if (_crossfadebytes) - { - short *data=(short *)wrtptr; - int32_t a=data[0]+sample[0]; - if (a<-32767) a=-32767; - if (a>32767) a=32767; - data[0]=(short)a; - a=data[1]+sample[1]; - if (a<-32767) a=-32767; - if (a>32767) a=32767; - data[1]=(short)a; - if (_crossfadebytes<4) _crossfadebytes=0;else _crossfadebytes-=4; - } - else - wrtptr = sample; - wrtptr=(void *)((char *)wrtptr+4); - remainspace-=4; - _minorpos+=_speed; - while (_minorpos>=1024) - { - buf+=step; - len-=step; - _minorpos-=1024; - } - } - if (stage==0) {locksz[1]=0;locksz[0]-=remainspace;} - else {locksz[1]-=remainspace;} - _ds8Buffer->Unlock(lockptr[0],locksz[0],lockptr[1],locksz[1]); - _lastWritePos+=locksz[0]+locksz[1]; - while (_lastWritePos>=BUFFER_SIZE) _lastWritePos-=BUFFER_SIZE; - LeaveCriticalSection(&_lock); - return 0; -} - -int MusicPlayer::CanWrite() -{ - return LOCK_GRANUALITY; -} -int MusicPlayer::IsPlaying() -{ - return 0; -} - -int MusicPlayer::Pause(int pause) -{ - int lastState=_paused?1:0; - if (pause) - {if (!_paused) {_ds8Buffer->Stop();_paused=true;}} - else - {if (_paused) {_ds8Buffer->Play(0,0,DSBPLAY_LOOPING);_paused=false;}} - return lastState; -} - - -void MusicPlayer::SetVolume(int volume) -{ - if (volume<0) return; - _ds8Buffer->SetVolume(_linvoltable[volume]); - if (volume==0) - Pause(1); - else - Pause(0); -} - -MusDecoder::MusDecoder() -{ - _playing=false; - _thread=0; - _stop=0; -} - -MusDecoder::~MusDecoder() -{ - Stop(); -} - -void MusDecoder::AttachOutput(IWAOutput *o) -{ - if (o) o->AddRef(); - if (_output) _output->Release(); - _output=o; -} - -bool MusDecoder::Play(const char *filename) -{ - DWORD res=0; - if (filename[0]=='?') - { - if (_output->Open(44100,1,8,-1,-1)<0) - { - return false; - } - _stop=false; - _playing=true; - _thread=CreateThread(0,0,MusDecoder::StartSilentWritter,this,0,&res); - return true; - } - _file=CreateFile(filename,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); - if (_file==0) return false; - ReadFile(_file,&_header,sizeof(_header),&res,0); - if (res!=sizeof(_header)) {CloseHandle(_file);return false;} - if (_output->Open(_header.freq,_header.channels,16,-1,-1)<0) - { - CloseHandle(_file);return false; - } - _stop=false; - _playing=true; - _thread=CreateThread(0,0,MusDecoder::StartMusDecoder,this,0,&res); - return true; -} - -void MusDecoder::Stop() -{ - if (_thread) - { - _stop=true; - _output->Pause(0); - WaitForSingleObject(_thread,INFINITE); - CloseHandle(_thread); - CloseHandle(_file); - _output->Close(); - _file=0; - _thread=0; - } -} - -DWORD WINAPI MusDecoder::StartMusDecoder(LPVOID data) -{ - MusDecoder *self=reinterpret_cast(data); - return self->MusDecodingThread(); -} - - - -UINT MusDecoder::MusDecodingThread() -{ - int32_t blocksRemain=_header.blocks; - char *packbuf=0; - short *unpackbuf=0; - int32_t packbufsz=0; - int32_t unpackbufsz=0; - for (int i=0;i=_header.channels) channel=0; - unpackbuf[i]=val; - } - _output->Write(reinterpret_cast(unpackbuf),unpackedSize); - } - _playing=false; - return 0; -} - -DWORD WINAPI MusDecoder::StartSilentWritter(LPVOID data) -{ - MusDecoder *self=reinterpret_cast(data); - return self->SilentWritterThread(); -} - -UINT MusDecoder::SilentWritterThread() -{ - char empty[1024]; - memset(empty,0,sizeof(empty)); - for (int i=0;i<1024;i++) - { - if (_stop) break; - _output->Write(empty,1024); - } - _playing=false; - return 0; - -} - -WinAmpDecoder::WinAmpDecoder() -{ - _currPlugin=0; -} - -WinAmpDecoder::~WinAmpDecoder() -{ - Stop(); -} - -void WinAmpDecoder::AttachOutput(IWAOutput *o) -{ - if (o) o->AddRef(); - if (_output) _output->Release(); - _output=o; -} - -bool WinAmpDecoder::Play(const char *filename) -{ - Stop(); - _currPlugin=SelectBestPlugin(filename); - if (_currPlugin==0) return false; - _currPlugin->AttachOutput(_output); - if (_currPlugin->Play(filename)!=_currPlugin->errOk) - { - _currPlugin=0; - return false; - } - int playtm=_currPlugin->GetOutputTime(); - int nexttm=playtm; - int c=0; - MusicPlayer *q=static_cast(_output); - while (!q->IsOpenned() && playtm==nexttm && c<2000) {Sleep(1);c++;nexttm=_currPlugin->GetOutputTime();} - _nooutput=!q->IsOpenned(); - return true; -} - -void WinAmpDecoder::Stop() -{ - if (_currPlugin==0) return; - _currPlugin->Stop(); - _currPlugin->AttachOutput(0); - _currPlugin=0; -} - -bool WinAmpDecoder::IsPlaying() -{ - if (_currPlugin==0) return false; - return !_currPlugin->IsFinished(); -} - -void WinAmpDecoder::SetVolume(int volume, int main) -{ - _currPlugin->SetVolume(volume); -} diff --git a/Windows/Music.h b/Windows/Music.h deleted file mode 100644 index 6b84d09..0000000 --- a/Windows/Music.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef __SKELDAL_MUSIC_ -#define __SKELDAL_MUSIC_ - -#include "WAPlayer.h" - -#define DWORD_PTR DWORD * -#include - - -class MusicPlayer: public IWAOutput -{ - DWORD _speed; //speed relative to sampling frequence; - bool _stereo; //true, if stereo - bool _bit16; //true, if 16 bits - bool _opened; - IDirectSoundBuffer8 *_ds8Buffer; - DWORD _lastWritePos; //last write pos; - DWORD _minorpos; - int *_linvoltable; - DWORD _crossfadebytes; - unsigned char _volume; - CRITICAL_SECTION _lock; - bool _paused; - - DWORD GetSafeXFadePos(); - -public: - MusicPlayer(); - ~MusicPlayer(); - - HRESULT InitBuffer(IDirectSound8 *ds8, int *linvoltable); - HRESULT Play(); - HRESULT Done(); - int Open(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms); - void Close(); - int Write(const char *buf, int len); - int CanWrite(); - int IsPlaying(); - void SetVolume(int volume); - void SetPan(int pan) {} - void Flush(int t) {} - int GetOutputTime() {return 1;} - int GetWrittenTime() {return 1;} - uint32_t AddRef() {return 1;} - uint32_t Release() {return 1;} - int Pause(int pause); - bool IsOpenned() {return _opened;} -}; - -#pragma pack (1) -struct MusFileHeader - { - short channels; - int32_t freq; - int32_t ssize; - int32_t blocks; - int32_t reserved1; - int32_t reserved2; - short ampltable[256]; - }; - #pragma pack() - - -class IDecoder -{ -public: - virtual void AttachOutput(IWAOutput *o)=0; - virtual bool Play(const char *filename)=0; - virtual bool IsPlaying()=0; - virtual void Stop()=0; - virtual void SetVolume(int volume, int main)=0; - virtual bool NotUsingOutput()=0; - virtual ~IDecoder() {} -}; - -class MusDecoder: public IDecoder -{ - MusFileHeader _header; - bool _playing; - HANDLE _thread; - IWAOutput *_output; - HANDLE _file; - bool _stop; - - - static DWORD WINAPI StartMusDecoder(LPVOID data); - static DWORD WINAPI StartSilentWritter(LPVOID data); - UINT MusDecodingThread(); - UINT SilentWritterThread(); -public: - MusDecoder(); - ~MusDecoder(); - - void AttachOutput(IWAOutput *o); - - bool Play(const char *filename); - void Stop(); - bool IsPlaying() {return _playing;} - void SetVolume(int volume, int main) {if (_output) _output->SetVolume(volume);} - bool NotUsingOutput() {return false;} -}; - -class WinAmpDecoder: public IDecoder, public WAPlayer -{ - IWAOutput *_output; - WAInputPlugin *_currPlugin; - bool _nooutput; -public: - WinAmpDecoder(); - ~WinAmpDecoder(); - - void AttachOutput(IWAOutput *o); - bool Play(const char *filename); - void Stop(); - bool IsPlaying(); - void SetVolume(int volume, int main); - bool NotUsingOutput() {return _nooutput;} -}; - - -#endif \ No newline at end of file diff --git a/Windows/Skeldal.rc b/Windows/Skeldal.rc deleted file mode 100644 index 3a2908c..0000000 --- a/Windows/Skeldal.rc +++ /dev/null @@ -1,499 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Czech resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) -#ifdef _WIN32 -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -#pragma code_page(1250) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "#include \0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// SKELDAL_FONT -// - -IDR_BOLDCZ SKELDAL_FONT "..\\font\\BOLDCZ.FON" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LADICIOKNO DIALOG 0, 0, 387, 221 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ladic okno" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_OUTPUT,52,0,335,219,ES_MULTILINE | ES_AUTOVSCROLL | - ES_AUTOHSCROLL | WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "&Nesmrtelnost",IDC_IMMORTAL,0,0,50,12 - PUSHBUTTON "Ne&tenost",IDC_NETECNOST,0,13,50,12 - PUSHBUTTON "Jt na &sektor",IDC_GOTO,0,26,50,12 - PUSHBUTTON "Jin &mapa",IDC_LOADMAP,0,39,50,12 - PUSHBUTTON "&Pedmt",IDC_LOADITEM,0,52,50,12 - PUSHBUTTON "&Dej Penze",IDC_TAKEMONEY,0,65,50,12 - PUSHBUTTON "Post&up",IDC_ADVENCE,0,78,50,12 - PUSHBUTTON "&Bonus zbran",IDC_WEAPONSKILL,0,91,50,12 - PUSHBUTTON "Oi&vit nestv.",IDC_RAISEMONSTER,0,104,50,12 - PUSHBUTTON "O&ivit postavu",IDC_RAISEDEATH,0,117,50,12 - PUSHBUTTON "Lit postavu",IDC_HEAL,0,130,50,12 - PUSHBUTTON "&Otevt dvee",IDC_OPENDOOR,0,143,50,12 - PUSHBUTTON "istit m&apu",IDC_CLEARMAP,0,156,50,12 - PUSHBUTTON "&Zru magii",IDC_UNAFFECT,0,169,50,12 - PUSHBUTTON "Nati n&estv.",IDC_RELOADMOBILES,0,182,50,12 - PUSHBUTTON "Pur&ge",IDC_PURGE,0,195,50,12 - PUSHBUTTON "&Refresh",IDC_REFRESH,0,208,50,12 -END - -IDD_INPUTWINDOW DIALOG 0, 0, 264, 30 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Vztupn okno" -FONT 7, "Small Fonts" -BEGIN - LTEXT "Prompt",IDC_PROMPT,0,0,211,15 - EDITTEXT IDC_VALUE,0,16,213,14,ES_AUTOHSCROLL - PUSHBUTTON "OK",IDOK,214,0,50,14 - PUSHBUTTON "Storno",IDCANCEL,214,16,50,14 -END - -IDD_CFGTABDIALOG DIALOG 0, 0, 243, 255 -STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Nastaven" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,7,7,229,224 - LTEXT "Tomuto zobrazen\nodpovd dn poloka", - IDC_CLIENTDESK,14,26,213,195 - DEFPUSHBUTTON "OK",IDOK,122,234,50,14 - PUSHBUTTON "Cancel",IDCANCEL,179,234,50,14 -END - -IDD_CFGGENERAL DIALOGEX 0, 0, 200, 190 -STYLE DS_SETFONT | DS_CONTROL | WS_CHILD -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - CONTROL "Spoutt hru v okn",IDC_WINDOWED,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,25,13,80,10 - CONTROL "640x480",IDC_ZOOM1,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,41,25,43,10 - CONTROL "960x720",IDC_ZOOM2,"Button",BS_AUTORADIOBUTTON,41,36,43, - 10 - CONTROL "1280x960",IDC_ZOOM3,"Button",BS_AUTORADIOBUTTON,41,47, - 47,10 - CONTROL "Vchoz monitor",IDC_MON1,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,119,25,66,10 - CONTROL "Druh monitor",IDC_MON2,"Button",BS_AUTORADIOBUTTON,119, - 36,59,10 - CONTROL "Tet monitor",IDC_MON3,"Button",BS_AUTORADIOBUTTON,119, - 47,56,10 - CONTROL "Vdy nast celou rove do pamti",IDC_PRELOAD,"Button", - BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,26,62,129,10 - CONTROL "Povolit automatick ukldn na posledn pozici", - IDC_AUTOSAVE,"Button",BS_AUTOCHECKBOX | WS_GROUP | - WS_TABSTOP,25,74,166,10 - LTEXT "Rychlost hry:",IDC_STATIC,21,102,42,8 - CTEXT "??",IDC_GAMESPEEDINFO,67,102,40,8 - CONTROL "Slider1",IDC_GAMESPEED,"msctls_trackbar32", - TBS_AUTOTICKS | WS_TABSTOP,20,115,159,18 - LTEXT "Pomalu",IDC_STATIC,18,133,24,8 - LTEXT "Rychle",IDC_STATIC,162,133,23,8 - LTEXT "Urychlit bitvy:",IDC_STATIC,20,146,43,18,SS_CENTERIMAGE - CONTROL "Slider1",IDC_BATTLEACC,"msctls_trackbar32", - TBS_AUTOTICKS | WS_TABSTOP,70,146,109,18 - PUSHBUTTON "Vchoz",IDC_GAMESPEEDDEFAULT,143,168,50,14 -END - -IDD_CFGSOUND DIALOGEX 0, 0, 214, 195 -STYLE DS_SETFONT | DS_CONTROL | WS_CHILD -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - LTEXT "&Mixovac frekvence:",IDC_STATIC,20,15,66,12, - SS_CENTERIMAGE - EDITTEXT IDC_MIXFREQ,88,15,51,12,ES_CENTER | ES_AUTOHSCROLL | - ES_NUMBER - LTEXT "Hz",IDC_STATIC,140,15,10,12,SS_CENTERIMAGE - GROUPBOX "",IDC_STATIC,7,30,200,72 - LTEXT "Pozor: Nastaven hlasitost se ukld do hernch pozic. Nastaven me bt zmnno, pi naten hry z pozice. Zmnu nastaven pro pozici provete ve he:", - IDC_STATIC,19,38,173,27 - LTEXT "&Hudba:",IDC_STATIC,19,67,29,15,SS_CENTERIMAGE - CONTROL "Slider1",IDC_SNDMUSIC,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,55,67,130,15 - LTEXT "&Skeky",IDC_STATIC,19,83,29,15,SS_CENTERIMAGE - CONTROL "Slider1",IDC_SNDFX,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,55,83,130,15 - LTEXT "Pluginy",IDC_STATIC,7,111,24,12,SS_CENTERIMAGE - PUSHBUTTON "Cesta na pluginy",IDC_CESTANAPLUGINY,36,111,171,12, - BS_FLAT - LISTBOX IDC_PLUGLIST,7,130,200,45,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Vlastnosti",IDC_PLUGVLASTNOSTI,168,177,39,11 -/* PUSHBUTTON "Npovda",IDC_PLUGINYNAPOVEDA,168,177,39,11*/ - LTEXT "Pozor: Vyaduje pluginy z WinAmp 2.95 !!!\r\nLze zskat na http://skeldal.jinak.cz", - IDC_STATIC,7,176,158,16 -END - -IDD_CFGVIDEO DIALOG 0, 0, 152, 76 -STYLE DS_SETFONT | DS_CONTROL | WS_CHILD -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Nepehrvej intro pi startu",IDC_SKIPINTRO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,25,100,10 - CONTROL "Nezobrazuj video prokldan",IDC_FULLRESVIDEO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,23,44,108,10 -END - -IDD_CFGEXTRAS DIALOG 0, 0, 203, 198 -STYLE DS_SETFONT | DS_CONTROL | WS_CHILD -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Nhodn backfire (pi kouzlen)",IDC_EXRANDOMBACKFIRES, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,115,10 - CONTROL "Recykluj nestvry (zabit nestvry se asem obnov)", - IDC_EXRESPAWNMONSTERS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,7,20,189,10 - CONTROL "Alternativni bojov systm",IDC_EXALTERNATEFIGHT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,33,97,10 - CONTROL "Vracej do hry znien nebo utopen pedmty", - IDC_EXRECORVERITEMS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,7,46,161,10 - CONTROL "Vlo pedmty ze zem do batohu pomoc CTRL", - IDC_EXBAGEXTENDED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 7,59,189,10 - CONTROL "Lep vhody tt pi soubojch",IDC_EXSHIELDBLOCKING, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,72,116,10 - CONTROL "Rychlej obchodovn pi pouit CTRL",IDC_EXFASTTRADE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,85,142,10 - CONTROL "Zobrazuj minimapu i mimo boj",IDC_EXALWAYSMINIMAP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,98,107,10 - CONTROL "Hromadn tk z boje",IDC_EXGROUPFLEE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,111,85,10 - CONTROL "Vdy otevi knihu pi jejho zmn obsahu", - IDC_EXAUTOOPENBOOK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 7,124,147,10 - CONTROL "Vdy zobraz sebranou runu",IDC_EXAUTOSHOWRUNE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,137,101,10 - PUSHBUTTON "Npovda",IDC_EXTRASHELP,129,177,67,14 - CONTROL "Mal nestvry chod tak diagonln",IDC_EXMOBDIAGONAL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,150,133,10 -END - -IDD_CFGCHEATS DIALOG 0, 0, 169, 139 -STYLE DS_SETFONT | DS_CONTROL | WS_CHILD -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Vypni hladovn a ze",IDC_NOHUNGRY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,43,22,91,10 - CONTROL "Povol ladc okno",IDC_DEBUGCONSOLE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,43,43,71,10 - CTEXT "Ladc okno funguje jen u map, kter nejsou zabezpeen heslem\n\nToto omezen lze zruit zadnm univerzlnho cheatovacho hesla", - IDC_STATIC,7,70,155,43 - EDITTEXT IDC_CHEATPASSWORD,7,118,155,14,ES_CENTER | ES_PASSWORD | - ES_AUTOHSCROLL | ES_NUMBER -END - -IDD_RTFVIEWER DIALOG 0, 0, 311, 313 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Brny Skeldalu " -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,254,292,50,14 - CONTROL "",IDC_RICHEDIT,"RichEdit20A",ES_MULTILINE | - ES_AUTOVSCROLL | ES_NOHIDESEL | ES_READONLY | WS_BORDER | - WS_VSCROLL | WS_TABSTOP,7,7,297,276 -END - -IDD_SELADV DIALOG 0, 0, 106, 149 -STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "SKELDAL - Vyber dobrodrustv" -FONT 10, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "START!",IDOK,3,120,47,14 - PUSHBUTTON "Storno",IDCANCEL,56,120,47,14 - LISTBOX IDC_LIST,3,69,100,49,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - CONTROL "Vytvoit zstupce na ploe",IDC_CREATELINK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,3,136,100,10 - CONTROL 130,IDC_STATIC,"Static",SS_BITMAP,3,3,100,60 -END - -IDD_LISTDIALOG DIALOGEX 0, 0, 208, 191 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Vyber" -FONT 8, "Courier", 400, 0, 0xEE -BEGIN - DEFPUSHBUTTON "OK",IDOK,7,170,194,14 - LISTBOX IDC_LIST,7,7,194,146,LBS_NOINTEGRALHEIGHT | - LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP - LTEXT "Hodnota",IDC_STATIC,7,154,31,12,SS_CENTERIMAGE - EDITTEXT IDC_HODNOTA,41,154,160,12,ES_AUTOHSCROLL | WS_DISABLED -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_LADICIOKNO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 380 - TOPMARGIN, 7 - BOTTOMMARGIN, 214 - END - - IDD_CFGTABDIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 236 - TOPMARGIN, 7 - BOTTOMMARGIN, 248 - END - - IDD_CFGGENERAL, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 193 - TOPMARGIN, 7 - BOTTOMMARGIN, 183 - END - - IDD_CFGSOUND, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 207 - TOPMARGIN, 7 - BOTTOMMARGIN, 188 - END - - IDD_CFGVIDEO, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 145 - TOPMARGIN, 7 - BOTTOMMARGIN, 69 - END - - IDD_CFGEXTRAS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 196 - TOPMARGIN, 7 - BOTTOMMARGIN, 191 - END - - IDD_CFGCHEATS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 162 - TOPMARGIN, 7 - BOTTOMMARGIN, 132 - END - - IDD_RTFVIEWER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 304 - TOPMARGIN, 7 - BOTTOMMARGIN, 306 - END - - IDD_SELADV, DIALOG - BEGIN - LEFTMARGIN, 3 - RIGHTMARGIN, 103 - TOPMARGIN, 3 - BOTTOMMARGIN, 146 - END - - IDD_LISTDIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 201 - TOPMARGIN, 7 - BOTTOMMARGIN, 184 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_INITLOGO BITMAP "logo.bmp" -IDB_UVODNIPOZADI BITMAP "uvodni.bmp" -IDB_UVODNISELECT BITMAP "uvodni_sel.bmp" -IDB_SELADVDLG BITMAP "seladv_male.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAINICON ICON "icon.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// RTF -// - -IDR_EXTRAS RTF "extras.rtf" -IDR_WINAMPPLUGS RTF "plugins.rtf" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#include "..\game\version.h" - -VS_VERSION_INFO VERSIONINFO - VERSIONWINRES(FILEVERSION) - VERSIONWINRES(PRODUCTVERSION) - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040504b0" - BEGIN - VALUE "Comments", "Brny Skeldalu pro Windows" - VALUE "CompanyName", "Bredysoft" - VALUE "FileDescription", "Brny Skeldalu pro Windows" - VALUE "FileVersion", "1" - VALUE "InternalName", "Skeldal" - VALUE "LegalCopyright", "Copyright Bredysoft (C) 2005" - VALUE "LegalTrademarks", "Bredysoft" - VALUE "OriginalFilename", "Skeldal.exe" - VALUE "ProductName", " Skeldal" - VALUE "ProductVersion", "1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x405, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_CFGGENERAL "Obecn" - IDS_CFGSOUND "Zvuk" - IDS_CFGVIDEO "Video" - IDS_CFGEXTRAS "Rozen" - IDS_CFGCHEATS "Cheaty" - IDS_NICVYBRANO "Mus nco vybrat v seznamu." -END - -STRINGTABLE -BEGIN - IDS_WINTITLE "Brny Skeldalu Windows verze" -END - -STRINGTABLE -BEGIN - IDS_CHEATWARNING1 "Upozornn: Zapnn cheat me zkazit celkov dojem hry, a me zpsobit, e hra nebude bez pouit cheat dohrateln. Chcete opravdu povolit cheaty?" - IDS_CHEATWARNING2 "Bylo vm oznmeno, e cheaty vm opravdu mohou pi hran zkazit zbavu. Berete-li toto na vdom, stisknte OK" - IDS_CHEATWARNING3 "Pedchoz zprvu jste nevzal na vdom. Pesto si prosm uvdomte, e zapnn cheatu vede ke snen hratelnosti a tm pdem zbavy ze hran. Rozhodn toto provdte na vlastn riziko. Chcete pesto opakovat sv stanovisko?" - IDS_CHEATWARNING4 "Zcela evidentn ignorujete varovn, e cheaty mohou velice snit zbavu z hran. Budete v tom pokraovat i nadle?" - IDS_CHEATWARNING5 "Byl jste varovn!" - IDS_RICHEDMISSING "Chyb propojovac knihovna RICHED20.DLL. Selhalo zobrazen okna" - IDS_MIXFREQINVALID "Mixovaci frekvence je mimo povoleny rozsah (8000-44100). Hodnota nebude uloena." - IDS_SCREENBPPWARNING "Plocha nepracuje v reimu 16bpp (65536 barev). Pro sputn hry je nutn pracovn plochu pepnout do tohoto reimu. Pepnut se provede automaticky a po ukonen hry se provede obnova nastaven plochy. Pokud by sputn hry v okn zpsobovalo obte, napklad by obrazovka zernala, nebo by se obraz rozpadl, zkuste stisknou Alt+F4. Pak bude nutn ped sputnm hry v okn provst zmnu nastaven plochy run, nebo hru spoutt na celou obrazovku." -END - -STRINGTABLE -BEGIN - IDS_INSTALLFILTER "Sloky|vyberslozky.$$$slozky$$$||" - IDS_INSTALLTITLE "Vyber lokaci, kam chce hru nainstalovat" - IDS_INSTALLPRENAME "Brny Skeldalu" - IDS_INSTALLCDFILE "INSTALL.INF" - IDS_INSTALLCDTITLE "Kde se nachz instalan CD?" - IDS_INSTALLCDFILTER "Instalan CD Brny Skeldalu|install.inf||" - IDS_CREATEDIR "Sloka %s neexistuje. Chcete j vytvoit?" - IDS_NELZEVYTVORITSLOZKU "Nelze vytvoit sloku %s" - IDS_INSTALLEDGAME "Hra je nainstalovan. Byl vytvoen zstupce na ploe. Nyn me hru spustit." - IDS_INSTALLHDD "Peje si instalovat hru na pevn disk?\r\n\r\n* Odpov ANO zkopruje vechny potebn soubory na pevn disk (asi 300MB)\r\n* Odpov NE umon hrt hru z CD (et msto na pevnm disku)" - IDS_INSTALLCHYBISOUBOR "Chybi soubor(y): %s" - IDS_INSTALLTEXT1 "Instalace hry Brny Skeldalu krok 1.\r\n\r\nPed zapoetm instalace vlote do jednotky originln CD hry a v okn, jen se objev po odklepnut tlatka OK,vyhledejte vyjmenovan soubor, kter se na CD nalz." - IDS_INSTALLTEXT2 "Instalace hry Brny Skeldalu krok 2.\r\n\r\nNyn je teba urit lokaci, kam se hra nainstaluje. V nsledujcm okn vyberte nejvhodnj umstn. Jmno sloky mete pozmnit v doln sti okna" - IDS_DEFAULTADV "Rovenland - Brny Skeldalu" -END - -#endif // Czech resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/Windows/StdAfx.cpp b/Windows/StdAfx.cpp deleted file mode 100644 index 64a584f..0000000 --- a/Windows/StdAfx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// WinAmpInterface.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/Windows/StdAfx.h b/Windows/StdAfx.h deleted file mode 100644 index 91aa19f..0000000 --- a/Windows/StdAfx.h +++ /dev/null @@ -1,26 +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__C6160DCF_A5D8_42D0_8EAB_F594D354BFCB__INCLUDED_) -#define AFX_STDAFX_H__C6160DCF_A5D8_42D0_8EAB_F594D354BFCB__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include -#define WIN32_LEAN_AND_MEAN -#include -#include -#include - -// 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__C6160DCF_A5D8_42D0_8EAB_F594D354BFCB__INCLUDED_) diff --git a/Windows/WAInputPlugin.cpp b/Windows/WAInputPlugin.cpp deleted file mode 100644 index fc12224..0000000 --- a/Windows/WAInputPlugin.cpp +++ /dev/null @@ -1,632 +0,0 @@ -// WAInputPlugin.cpp: implementation of the WAInputPlugin class. -// -////////////////////////////////////////////////////////////////////// - -#include "stdafx.h" -#include "WAInputPlugin.h" -#include -#include -#include "wa_ipc.h" - - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -#define MAX_PLUGINS_AT_TIME 16 - -#define DECLARE_TEMPLATES(x) \ - x(0)\ - x(1)\ - x(2)\ - x(3)\ - x(4)\ - x(5)\ - x(6)\ - x(7)\ - x(8)\ - x(9)\ - x(10)\ - x(11)\ - x(12)\ - x(13)\ - x(14)\ - x(15)\ -/* x(16)\ - x(17)\ - x(18)\ - x(19)\ - x(20)\ - x(21)\ - x(22)\ - x(23)\ - x(24)\ - x(25)\ - x(26)\ - x(27)\ - x(28)\ - x(29)\ - x(30)\ - x(31)\*/ - - -#define JOIN(x,y) &x##y - -#define DECLARE_TEMPLATE_ARRAYS(x) \ -static void *p_##x[]={JOIN(x,_0),JOIN(x,_1),JOIN(x,_2),JOIN(x,_3),JOIN(x,_4),JOIN(x,_5),JOIN(x,_6),JOIN(x,_7),\ -JOIN(x,_8),JOIN(x,_9),JOIN(x,_10),JOIN(x,_11),JOIN(x,_12),JOIN(x,_13),JOIN(x,_14),JOIN(x,_15)/*,\ -JOIN(x,_16),JOIN(x,_17),JOIN(x,_18),JOIN(x,_19),JOIN(x,_20),JOIN(x,_21),JOIN(x,_22),JOIN(x,_23),\ -JOIN(x,_24),JOIN(x,_25),JOIN(x,_26),JOIN(x,_27),JOIN(x,_28),JOIN(x,_29),JOIN(x,_30),JOIN(x,_31)*/\ -}; - - -WAInputPlugin::WAInputPlugin() -{ -_inPlugin=0; -_mod=0; -_ioutput=0; -_finished=false; -_hNotify=0; -} - -WAInputPlugin::~WAInputPlugin() -{ -UnloadPlugin(); -} - -typedef In_Module * (*type_winampGetInModule2)(); - -static void empty_SAVSAInit(int maxlatency_in_ms, int srate) -{ - -} - -static void empty_SAVSADeInit() -{ - -} - -static void empty_SAAddPCMData(void *PCMData, int nch, int bps, int timestamp) -{ - -} - -static int empty_SAGetMode() -{ -return 1; -} - -static void empty_SAAdd(void *data, int timestamp, int csa) -{ - -} - -static void empty_VSAAddPCMData(void *PCMData, int nch, int bps, int timestamp) -{ - -} - -static void empty_VSAAdd(void *data, int timestamp) -{ - -} - -static int empty_VSAGetMode(int *specNch, int *waveNch) -{ - return 0; -} - -static void empty_VSASetInfo(int nch, int srate) -{ - -} - -static int empty_dsp_isactive() -{ - return 0; -} - -static int empty_dsp_dosamples(short int *samples, int numsamples, int bps, int nch, int srate) -{ - return numsamples; -} - -static void empty_SetInfo(int bitrate, int srate, int stereo, int synched) -{ - -} - -static void empty_About(HWND hWnd) -{ - -} - -static void empty_Config(HWND hWnd) -{ - -} - -static void empty_Init() -{ - -} -static void empty_Quit() -{ - -} - - -class RegistredPlugsArray -{ - WAInputPlugin *_arr[MAX_PLUGINS_AT_TIME]; -public: - RegistredPlugsArray() {memset(_arr,0,sizeof(_arr));} - int Register(WAInputPlugin *plug); - void Unregister(WAInputPlugin *plug); - WAInputPlugin *operator[] (int index) {return _arr[index];} -}; - -int RegistredPlugsArray::Register(WAInputPlugin *plug) -{ - for (int i=0;iGetAttachedOutputNoAddRef();\ - if (o) return o->Open(samplerate, numchannels, bitspersamp, bufferlenms, prebufferms);\ - return -1;\ -} - -#define m_Close(index)\ -static void output_Close_##index()\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) o->Close();\ -} - -#define m_Write(index)\ -static int output_Write_##index(char *buff, int len)\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) return o->Write(buff,len);\ - return 1;\ -} - -#define m_CanWrite(index)\ -static int output_CanWrite_##index()\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) return o->CanWrite();\ - return 0;\ -} - -#define m_IsPlaying(index)\ -static int output_IsPlaying_##index()\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - int p=o->IsPlaying();\ - return p;\ -} - -#define m_Pause(index)\ -static int output_Pause_##index(int pause)\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) return o->Pause(pause);\ - return 0;\ -} - -#define m_SetVolume(index)\ -static void output_SetVolume_##index(int volume)\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) o->SetVolume(volume);\ -} - -#define m_SetPan(index)\ -static void output_SetPan_##index(int pan)\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) o->SetPan(pan);\ -} - -#define m_Flush(index)\ -static void output_Flush_##index(int t)\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) o->Flush(t);\ -} - -#define m_GetOutputTime(index)\ -static int output_GetOutputTime_##index()\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) return o->GetOutputTime();\ - return 0;\ -} - -#define m_GetWrittenTime(index)\ -static int output_GetWrittenTime_##index()\ -{\ - IWAOutput *o=GRegistredPlugsArray[index]->GetAttachedOutputNoAddRef();\ - if (o) return o->GetWrittenTime();\ - return 0;\ -} - -DECLARE_TEMPLATES(m_Open); -DECLARE_TEMPLATES(m_Close); -DECLARE_TEMPLATES(m_Write); -DECLARE_TEMPLATES(m_CanWrite); -DECLARE_TEMPLATES(m_IsPlaying); -DECLARE_TEMPLATES(m_Pause); -DECLARE_TEMPLATES(m_SetVolume); -DECLARE_TEMPLATES(m_SetPan); -DECLARE_TEMPLATES(m_Flush); -DECLARE_TEMPLATES(m_GetOutputTime); -DECLARE_TEMPLATES(m_GetWrittenTime); - -DECLARE_TEMPLATE_ARRAYS(output_Open); -DECLARE_TEMPLATE_ARRAYS(output_Close); -DECLARE_TEMPLATE_ARRAYS(output_Write); -DECLARE_TEMPLATE_ARRAYS(output_CanWrite); -DECLARE_TEMPLATE_ARRAYS(output_IsPlaying); -DECLARE_TEMPLATE_ARRAYS(output_Pause); -DECLARE_TEMPLATE_ARRAYS(output_SetVolume); -DECLARE_TEMPLATE_ARRAYS(output_SetPan); -DECLARE_TEMPLATE_ARRAYS(output_Flush); -DECLARE_TEMPLATE_ARRAYS(output_GetOutputTime); -DECLARE_TEMPLATE_ARRAYS(output_GetWrittenTime); - - -WAInputPlugin::PluginError WAInputPlugin::UIConfig(HWND parentHwnd) -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->Config(parentHwnd); - return errOk; -} - -WAInputPlugin::PluginError WAInputPlugin::UIAbout(HWND parentHwnd) -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->About(parentHwnd); - return errOk; -} - -WAInputPlugin::PluginError WAInputPlugin::UnloadPlugin() -{ - if (_inPlugin!=0) - { - __try - { - _inPlugin->Quit(); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - _mod=0; //prevent calling FreeLibrary.... plugin cannot be unloaded.... - } - _inPlugin=0; - } - if (_hNotify) - { - DestroyWindow(_hNotify); - _hNotify=0; - } - if (_mod) - { - FreeLibrary(_mod); - _mod=0; - } - return errOk; -} - -WAInputPlugin::PluginError WAInputPlugin::IsLoaded() -{ - if (_inPlugin==0) return errNotLoaded; - return errOk; -} - -const char *WAInputPlugin::GetDescription() -{ - if (_inPlugin==0) return 0; - return _inPlugin->description; -} - -WAInputPlugin::PluginError WAInputPlugin::GetFileInfo(const char *filename, char *title, int title_size, int *len_in_ms) -{ - if (_inPlugin==0) return errNotLoaded; - char *buff=new char[4096]; - DWORD r=GetTickCount(); - memcpy(buff+4092,&r,4); - _inPlugin->GetFileInfo(const_cast(filename),buff,len_in_ms); - if (memcmp(buff+4092,&r,4)==0) - { - return errPluginBufferOverrun; - } - int len=strlen(buff); - if (len>=title_size) - { - strncpy(title,buff,title_size); - return errBufferTooSmall; - } - else - { - strcpy(title,buff); - return errOk; - } -} - -WAInputPlugin::PluginError WAInputPlugin::UIFileInfo(const char *filename, HWND parentHwnd) -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->InfoBox(const_cast(filename),parentHwnd); - return errOk; -} - -WAInputPlugin::PluginError WAInputPlugin::CanPlayFile(const char *filename) -{ - if (_inPlugin==0) return errNotLoaded; - if (_inPlugin->IsOurFile(const_cast(filename))) return errOk; - char *fext=_inPlugin->FileExtensions; - const char *bslash=strrchr(filename,'\\'); - if (bslash==0) bslash=filename; - const char *ext=strrchr(bslash,'.'); - if (ext==0) ext=strchr(bslash,0); - else ext++; - int extlen=strlen(ext); - while (*fext) - { - if (strnicmp(fext,ext,extlen)==0 && (fext[extlen]==';' || fext[extlen]==0)) - return errOk; - char *c=strchr(fext,';'); - if (c==0) - { - c=strchr(fext,0); - c++; - if (*c) c=strchr(c,0)+1; - fext=c; - } - else - fext=c+1; - } - return errUnknownFileFormat; -} - -WAInputPlugin::PluginError WAInputPlugin::AttachOutput(IWAOutput *o) -{ - if (_ioutput==o) return errOk; - if ((_ioutput!=0)!=(o!=0)) - { - if (o==0) GRegistredPlugsArray.Unregister(this); - else - { - int plugid=GRegistredPlugsArray.Register(this); - if (plugid==-1) return errTooManyPlugins; - - _output.About=empty_About; - _output.Config=empty_Config; - _output.Init=empty_Init; - _output.Quit=empty_Quit; - *(void **)&_output.CanWrite=p_output_CanWrite[plugid]; - *(void **)&_output.Close=p_output_Close[plugid]; - *(void **)&_output.Flush=p_output_Flush[plugid]; - *(void **)&_output.GetOutputTime=p_output_GetOutputTime[plugid]; - *(void **)&_output.GetWrittenTime=p_output_GetWrittenTime[plugid]; - *(void **)&_output.IsPlaying=p_output_IsPlaying[plugid]; - *(void **)&_output.Open=p_output_Open[plugid]; - *(void **)&_output.Pause=p_output_Pause[plugid]; - *(void **)&_output.SetPan=p_output_SetPan[plugid]; - *(void **)&_output.SetVolume=p_output_SetVolume[plugid]; - *(void **)&_output.Write=p_output_Write[plugid]; - _output.hDllInstance=GetModuleHandle(0); - _output.hMainWindow=0; - _output.description="Emulated output device"; - _output.version=0x100; - _output.id=999999999; - } - } - if (_ioutput!=0) _ioutput->Release(); - _ioutput=o; - if (o) o->AddRef(); - return errOk; -} - -#define WM_WA_MPEG_EOF WM_USER+2 -#define IPC_GET_API_SERVICE 3025 - - -static LRESULT NotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_WA_MPEG_EOF: - { - WAInputPlugin *o=(WAInputPlugin *)GetWindowLong(hWnd,GWL_USERDATA); - if (o) o->MarkFinished(); - return 0; - } - case WM_USER: - { - switch (lParam) - { - case IPC_GETINIFILE: - { - return (LRESULT)("skeldalmusic.ini"); - } - case IPC_GETINIDIRECTORY: - { - return (LRESULT)(".\\"); - } - case IPC_GET_API_SERVICE: return 0; - case IPC_GET_RANDFUNC: return (LRESULT)&rand; - } - } - default: return DefWindowProc(hWnd,msg,wParam,lParam); - } -} - -static const char *RegisterWAPluginWnd() -{ - const char *name="WAPluginWnd"; - WNDCLASS cls; - if (GetClassInfo(GetModuleHandle(0),name,&cls)==FALSE) - { - memset(&cls,0,sizeof(cls)); - cls.lpszClassName=name; - cls.hInstance=GetModuleHandle(0); - cls.lpfnWndProc=(WNDPROC)NotifyWndProc; - RegisterClass(&cls); - } - return name; -} - -WAInputPlugin::PluginError WAInputPlugin::LoadPlugin(const char *name) -{ - UnloadPlugin(); - char *cwd=_getcwd(0,0); - char *setcwd=strcpy((char *)alloca(strlen(name)+1),name); - char *bs=const_cast(strrchr(setcwd,'\\')); - if (bs) - { - *bs=0; - bs=const_cast(strrchr(setcwd,'\\')); - if (bs) *bs=0; - } - _chdir(setcwd); - SetErrorMode(SEM_FAILCRITICALERRORS); - _mod=LoadLibrary(name); - _chdir(cwd); - free(cwd); - if (_mod==0) return errNotFound; - type_winampGetInModule2 winampGetInModule2=(type_winampGetInModule2)GetProcAddress(_mod,"winampGetInModule2"); - if (winampGetInModule2==0) return errNotValidPlugin; - _inPlugin=winampGetInModule2(); - if (_inPlugin==0) return errCantInit; - _hNotify=CreateWindow(RegisterWAPluginWnd(),"",0,0,0,0,0,0,0,GetModuleHandle(0),0); - SetWindowLong(_hNotify,GWL_USERDATA,(LONG)this); - _inPlugin->hMainWindow=_hNotify; - _inPlugin->hDllInstance=_mod; - _inPlugin->SAVSAInit=empty_SAVSAInit; - _inPlugin->SAVSADeInit=empty_SAVSADeInit; - _inPlugin->SAAddPCMData=empty_SAAddPCMData; - _inPlugin->SAGetMode=empty_SAGetMode; - _inPlugin->SAAdd=empty_SAAdd; - _inPlugin->VSAAddPCMData=empty_VSAAddPCMData; - _inPlugin->VSAGetMode=empty_VSAGetMode; - _inPlugin->VSAAdd=empty_VSAAdd; - _inPlugin->VSASetInfo=empty_VSASetInfo; - _inPlugin->dsp_isactive=empty_dsp_isactive; - _inPlugin->dsp_dosamples=empty_dsp_dosamples; - _inPlugin->SetInfo=empty_SetInfo; - _inPlugin->outMod=0; - __try - { - _inPlugin->Init(); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - __try - { - _inPlugin->Quit(); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - _mod=0; //Free library cannot be called, because plugin cannot be terminated... memory and resource leak - } - _inPlugin=0; - return errGPF; - } - _inPlugin->outMod=&_output; - return errOk; -} - -WAInputPlugin::PluginError WAInputPlugin::Play(const char *name) -{ - if (_inPlugin==0) return errNotLoaded; - _finished=false; - int i=_inPlugin->Play(const_cast(name)); - if (i==0) return errOk; - if (i==-1) return errFileNotFound; - return errCantPlay; -} - -WAInputPlugin::PluginError WAInputPlugin::Pause() -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->Pause(); - return errOk; -} -WAInputPlugin::PluginError WAInputPlugin::UnPause() -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->UnPause(); - return errOk; - -} - -WAInputPlugin::PluginError WAInputPlugin::IsPaused() -{ - if (_inPlugin==0) return errNotLoaded; - if (_inPlugin->IsPaused()) return errOk; - return errFalse; -} - -WAInputPlugin::PluginError WAInputPlugin::Stop() -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->Pause(); - _inPlugin->UnPause(); - _inPlugin->Stop(); - return errOk; -} - -WAInputPlugin::PluginError WAInputPlugin::SetOutputTime(int t) -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->SetOutputTime(t); - return errOk; -} - -WAInputPlugin::PluginError WAInputPlugin::SetVolume(int volume) -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->SetVolume(volume); - return errOk; - -} -WAInputPlugin::PluginError WAInputPlugin::SetPan(int pan) -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->SetPan(pan); - return errOk; -} - -WAInputPlugin::PluginError WAInputPlugin::EQSet(int on, char data[10], int preamp) -{ - if (_inPlugin==0) return errNotLoaded; - _inPlugin->EQSet(on,data,preamp); - return errOk; -} - -bool WAInputPlugin::IsFinished() -{ - MSG msg; - if (PeekMessage(&msg,_hNotify,WM_WA_MPEG_EOF,WM_WA_MPEG_EOF,PM_REMOVE)) - { - DispatchMessage(&msg); - } - return _finished; -} \ No newline at end of file diff --git a/Windows/WAInputPlugin.h b/Windows/WAInputPlugin.h deleted file mode 100644 index 9c7ddf2..0000000 --- a/Windows/WAInputPlugin.h +++ /dev/null @@ -1,130 +0,0 @@ -// WAInputPlugin.h: interface for the WAInputPlugin class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_WAINPUTPLUGIN_H__C78D396A_67F6_473B_891C_D6D162312554__INCLUDED_) -#define AFX_WAINPUTPLUGIN_H__C78D396A_67F6_473B_891C_D6D162312554__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "winamp/in2.h" - -class IWAOutput -{ -public: - - // returns >=0 on success, <0 on failure - // NOTENOTENOTE: bufferlenms and prebufferms are ignored in most if not all output plug-ins. - // ... so don't expect the max latency returned to be what you asked for. - // returns max latency in ms (0 for diskwriters, etc) - // bufferlenms and prebufferms must be in ms. 0 to use defaults. - // prebufferms must be <= bufferlenms - virtual int Open(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms)=0; - - // close the ol' output device. - virtual void Close()=0; - - // 0 on success. Len == bytes to write (<= 8192 always). buf is straight audio data. - // 1 returns not able to write (yet). Non-blocking, always. - virtual int Write(const char *buf, int len)=0; - - // returns number of bytes possible to write at a given time. - // Never will decrease unless you call Write (or Close, heh) - virtual int CanWrite()=0; - - // non0 if output is still going or if data in buffers waiting to be - // written (i.e. closing while IsPlaying() returns 1 would truncate the song - virtual int IsPlaying()=0; - - // returns previous pause state - virtual int Pause(int pause)=0; - - // volume is 0-255 - virtual void SetVolume(int volume)=0; - // pan is -128 to 128 - virtual void SetPan(int pan)=0; - - // flushes buffers and restarts output at time t (in ms) - // (used for seeking) - virtual void Flush(int t)=0; - - // returns played time in MS - virtual int GetOutputTime()=0; - - // returns time written in MS (used for synching up vis stuff) - virtual int GetWrittenTime()=0; - - virtual uint32_t AddRef()=0; - - virtual uint32_t Release()=0; - -}; - - -class WAInputPlugin -{ - HMODULE _mod; - In_Module *_inPlugin; - Out_Module _output; - IWAOutput *_ioutput; - bool _finished; - HWND _hNotify; - WAInputPlugin &operator=(const WAInputPlugin &other); - WAInputPlugin(const WAInputPlugin &other); -public: - enum PluginError - { - errOk=0, - errNotFound, - errCantInit, - errNotValidPlugin, - errNotLoaded, - errBufferTooSmall, - errPluginBufferOverrun, - errUnknownFileFormat, - errTooManyPlugins, - errFileNotFound, - errCantPlay, - errFalse, - errGPF - }; -public: - WAInputPlugin(); - virtual ~WAInputPlugin(); - - PluginError LoadPlugin(const char *name); - PluginError UIConfig(HWND parentHwnd=0); - PluginError UIAbout(HWND parentHwnd=0); - PluginError UnloadPlugin(); - PluginError IsLoaded(); - const char *GetDescription(); - PluginError GetFileInfo(const char *filename, char *title, int title_size, int *len_in_ms); - PluginError UIFileInfo(const char *filename, HWND parentHwnd=0); - PluginError CanPlayFile(const char *filename); - PluginError AttachOutput(IWAOutput *o); - IWAOutput *GetAttachedOutput() {if (_ioutput) _ioutput->AddRef();return _ioutput;} - IWAOutput *GetAttachedOutputNoAddRef() {return _ioutput;} - PluginError Play(const char *name); - PluginError Pause(); - PluginError UnPause(); - PluginError IsPaused(); - PluginError Stop(); - int GetLength() - {if (_inPlugin) return _inPlugin->GetLength();return -1;} - int GetOutputTime() - {if (_inPlugin) return _inPlugin->GetOutputTime();return -1;} - PluginError SetOutputTime(int t); - PluginError SetVolume(int volume); // from 0 to 255.. usually just call outMod->SetVolume - PluginError SetPan(int pan); // from -127 to 127.. usually just call outMod->SetPan - - PluginError EQSet(int on, char data[10], int preamp); // 0-64 each, 31 is +0, 0 is +12, 63 is -12. Do nothing to ignore. - bool IsFinished(); - bool IsUsesOutput() {return _inPlugin->UsesOutputPlug!=0;} - - void MarkFinished() {_finished=true;} - -}; - -#endif // !defined(AFX_WAINPUTPLUGIN_H__C78D396A_67F6_473B_891C_D6D162312554__INCLUDED_) diff --git a/Windows/WAPlayer.cpp b/Windows/WAPlayer.cpp deleted file mode 100644 index 6251b68..0000000 --- a/Windows/WAPlayer.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "stdafx.h" -#include ".\waplayer.h" -#include - -WAPlayer::WAPlayer(void) -{ - _pluginList=0; -} - -WAPlayer::~WAPlayer(void) -{ - ClearList(); -} - - -void WAPlayer::ClearList() -{ - delete [] _pluginList; - _pluginList=0; - _nPlugins=0; -} - -void WAPlayer::LoadPlugins(const char *path) -{ - char *wildcards=(char *)alloca(strlen(path)+10); - char *pathname=(char *)alloca(strlen(path)+MAX_PATH); -// CheckPathname(pathname); - strcpy(wildcards,path); - strcpy(pathname,path); - if (wildcards[strlen(wildcards)-1]!='\\') - { - strcat(wildcards,"\\"); - strcat(pathname,"\\"); - } - char *fname=strchr(pathname,0); - strcat(wildcards,"in_*.dll"); - HANDLE h; - ClearList(); - WIN32_FIND_DATA fnd; - h=FindFirstFile(wildcards,&fnd); - if (h) do - { - _nPlugins++; - }while(FindNextFile(h,&fnd)); - FindClose(h); - - _pluginList=new WAInputPlugin[_nPlugins]; - int pos=0; - h=FindFirstFile(wildcards,&fnd); - if (h != INVALID_HANDLE_VALUE) do - { - strcpy(fname,fnd.cFileName); - if (_pluginList[pos].LoadPlugin(pathname)!=WAInputPlugin::errOk) - _pluginList[pos].UnloadPlugin(); - else - pos++; - } - while (FindNextFile(h,&fnd)); - _nPlugins=pos; - FindClose(h); -} - -WAInputPlugin *WAPlayer::SelectBestPlugin(const char *songName) -{ - for (int i=0;i<_nPlugins;i++) - if (_pluginList[i].CanPlayFile(songName)==WAInputPlugin::errOk) return _pluginList+i; - return 0; -} - -bool WAPlayer::EnumPlugins(bool (*EnumProc)(WAPlayer &player, WAInputPlugin &plugin, void *context), void *context) -{ - for (int i=0;i<_nPlugins;i++) if (EnumProc(*this,_pluginList[i],context)==false) return false; - return true; -} \ No newline at end of file diff --git a/Windows/WAPlayer.h b/Windows/WAPlayer.h deleted file mode 100644 index 1900358..0000000 --- a/Windows/WAPlayer.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "WAInputPlugin.h" - -class WAPlayer -{ - WAInputPlugin *_pluginList; - int _nPlugins; - - WAPlayer &operator=(const WAPlayer &other); - WAPlayer(const WAPlayer &other); -public: - WAPlayer(void); - ~WAPlayer(void); - - - - void ClearList(); - void LoadPlugins(const char *path); - WAInputPlugin *SelectBestPlugin(const char *songName); - - bool EnumPlugins(bool (*EnumProc)(WAPlayer &player, WAInputPlugin &plugin, void *context), void *context); -}; diff --git a/Windows/WaveOut.cpp b/Windows/WaveOut.cpp deleted file mode 100644 index 89a3e9d..0000000 --- a/Windows/WaveOut.cpp +++ /dev/null @@ -1,157 +0,0 @@ -// WaveOut.cpp: implementation of the WaveOut class. -// -////////////////////////////////////////////////////////////////////// - -#include "stdafx.h" -#include "WaveOut.h" - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -WaveOut::WaveOut() -{ -_device=0; -} - -WaveOut::~WaveOut() -{ -if (_device) Close(); -} - - -int WaveOut::Open(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms) -{ - MSG msg; - PeekMessage(&msg,0,0,0,0); //ensure message queue created - _paused=false; - _wrpos=0; - _pending=0; - memset(_buffers,0,sizeof(_buffers)); - _played=0; - _written=0; - - WAVEFORMATEX format; - format.cbSize=sizeof(format); - format.nChannels=numchannels; - format.nSamplesPerSec=samplerate; - format.nAvgBytesPerSec=numchannels*samplerate*(bitspersamp/8); - format.nBlockAlign=numchannels*(bitspersamp/8); - format.wBitsPerSample=bitspersamp; - format.wFormatTag=WAVE_FORMAT_PCM; - _event=CreateEvent(NULL,FALSE,FALSE,NULL); - _persec=format.nAvgBytesPerSec; - MMRESULT res=waveOutOpen(&_device,WAVE_MAPPER,&format,(DWORD)_event,(DWORD)this,CALLBACK_EVENT); - if (res==MMSYSERR_NOERROR) return 0; - return -1; -} - -void WaveOut::Close() -{ - Flush(1); - waveOutClose(_device); - _device=0; - -} - -int WaveOut::NextBuffer() -{ - int b=_wrpos; - printf("Buffers: %5d time: %d\r",_pending,GetOutputTime()/1000); - if (_buffers[_wrpos]==0 || (_buffers[_wrpos]->dwFlags & WHDR_DONE)) - { - if (_buffers[_wrpos]) - { - waveOutUnprepareHeader(_device,_buffers[_wrpos],sizeof(*_buffers[_wrpos])); - free(_buffers[_wrpos]->lpData); - _played+=_buffers[_wrpos]->dwBufferLength; - delete _buffers[_wrpos]; - _buffers[_wrpos]=0; - _pending--; - } - _wrpos++; - if (_wrpos>=MAXBUFFERS) _wrpos=0; - return b; - } - return -1; -} - - -int WaveOut::Write(const char *buf, int len) -{ - int pos=NextBuffer(); - while (pos==-1) - { - WaitForSingleObject(_event,INFINITE); - pos=NextBuffer(); - } - WAVEHDR *hdr=new WAVEHDR; - memset(hdr,0,sizeof(*hdr)); - hdr->dwBufferLength=len; - hdr->lpData=(char *)malloc(len); - memcpy(hdr->lpData,buf,len); - waveOutPrepareHeader(_device,hdr,sizeof(*hdr)); - waveOutWrite(_device,hdr,sizeof(*hdr)); - _buffers[pos]=hdr; - _pending++; - _written+=len; - return 0; -} - -int WaveOut::CanWrite() -{ - return _paused?0:16*1024*1024; -} - -int WaveOut::IsPlaying() -{ - while (_pending) - { - if (NextBuffer()==-1) return 1; - } - return 0; -} - -int WaveOut::Pause(int pause) -{ - bool waspaused=_paused; - if (pause) - { - if (!waspaused) waveOutPause(_device); - _paused=true; - } - else - { - if (waspaused) waveOutRestart(_device); - _paused=false; - } - return waspaused?1:0; -} - -void WaveOut::SetVolume(int volume) -{ - -} - -void WaveOut::SetPan(int pan) -{ - -} - - -void WaveOut::Flush(int t) -{ - waveOutReset(_device); - while (_pending) NextBuffer(); -} - - -int WaveOut::GetOutputTime() -{ - return (int)((__int64)_played*(__int64)1000/(__int64)_persec); -} - -int WaveOut::GetWrittenTime() -{ - return (int)((__int64)_played*(__int64)1000/(__int64)_persec); -} diff --git a/Windows/WaveOut.h b/Windows/WaveOut.h deleted file mode 100644 index 1f04759..0000000 --- a/Windows/WaveOut.h +++ /dev/null @@ -1,52 +0,0 @@ -// WaveOut.h: interface for the WaveOut class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_WAVEOUT_H__1390C856_FA5C_4E84_B98D_4CC05086733D__INCLUDED_) -#define AFX_WAVEOUT_H__1390C856_FA5C_4E84_B98D_4CC05086733D__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define MAXBUFFERS 64 - -#include "WAInputPlugin.h" -#include - -class WaveOut: public IWAOutput -{ - HWAVEOUT _device; - bool _paused; - LPWAVEHDR _buffers[MAXBUFFERS]; - int _wrpos; - HANDLE _event; - DWORD _played; - DWORD _written; - DWORD _persec; - - int NextBuffer(); - int _pending; - -public: - WaveOut(); - virtual ~WaveOut(); - - virtual int Open(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms); - virtual void Close(); - virtual int Write(const char *buf, int len); - virtual int CanWrite(); - virtual int IsPlaying(); - virtual int Pause(int pause); - virtual void SetVolume(int volume); - virtual void SetPan(int pan); - virtual void Flush(int t); - virtual int GetOutputTime(); - virtual int GetWrittenTime(); - virtual uint32_t AddRef() {return 1;} - virtual uint32_t Release() {return 0;} -}; - - - -#endif // !defined(AFX_WAVEOUT_H__1390C856_FA5C_4E84_B98D_4CC05086733D__INCLUDED_) diff --git a/Windows/WinAmpInterface.cpp b/Windows/WinAmpInterface.cpp deleted file mode 100644 index 9950d46..0000000 --- a/Windows/WinAmpInterface.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// WinAmpInterface.cpp : Defines the entry point for the console application. -// - -#include "stdafx.h" -#include "WAInputPlugin.h" -#include "WaveOut.h" -#include "waplayer.h" - - -int main(int argc, char* argv[]) -{ - WAPlayer player; - player.LoadPlugins("C:\\Program Files\\Winamp\\Plugins"); - const char *name="\\\\bredy-doma\\d$\\MUSIC\\S3M\\s3m\\CTGOBLIN.S3M"; - WAInputPlugin *plug=player.SelectBestPlugin(name); - - WaveOut output; - plug->AttachOutput(&output); - plug->Play(name); - while (kbhit()==0 && !plug->IsFinished()) Sleep(500); - plug->Stop(); - plug->AttachOutput(0); - - - - return 0; -} diff --git a/Windows/WinAmpInterface.h b/Windows/WinAmpInterface.h deleted file mode 100644 index e69de29..0000000 diff --git a/Windows/bios.c b/Windows/bios.c deleted file mode 100644 index e69de29..0000000 diff --git a/Windows/bios.h b/Windows/bios.h deleted file mode 100644 index 704adbe..0000000 --- a/Windows/bios.h +++ /dev/null @@ -1,2 +0,0 @@ -#include - diff --git a/Windows/debug.h b/Windows/debug.h deleted file mode 100644 index d4c81ad..0000000 --- a/Windows/debug.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _DEBUG_H_ -#define _DEBUG_H_ - -#include - -#define STOP() StopProgram(__FILE__,__LINE__); - -static __inline void StopProgram(const char *text, int line) - { - char buff[256]; - sprintf(buff,"Stop at %s line %d",text,line); - MessageBox(NULL,buff,NULL,MB_OK|MB_SYSTEMMODAL); - __asm - { - int 3; - } - } - -#endif \ No newline at end of file diff --git a/Windows/extras.rtf b/Windows/extras.rtf deleted file mode 100644 index 9c6431e..0000000 --- a/Windows/extras.rtf +++ /dev/null @@ -1,77 +0,0 @@ -{\rtf1\ansi\deff1\adeflang1025 -{\fonttbl{\f0\froman\fprq2\fcharset238 Times New Roman;}{\f1\froman\fprq2\fcharset238 Thorndale{\*\falt Times New Roman};}{\f2\froman\fprq2\fcharset238 Times New Roman;}{\f3\froman\fprq2\fcharset238 Thorndale{\*\falt Times New Roman};}{\f4\fnil\fprq0\fcharset238 Times New Roman;}{\f5\fnil\fprq0\fcharset2 StarSymbol;}{\f6\fmodern\fprq1\fcharset238 Courier New;}{\f7\fnil\fprq2\fcharset238 Lucida Sans Unicode;}{\f8\fnil\fprq2\fcharset238 Tahoma;}{\f9\fnil\fprq0\fcharset238 Tahoma;}} -{\colortbl;\red0\green0\blue0;\red128\green128\blue128;} -{\stylesheet{\s1\cf1{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1029\snext1 Default;} -{\s2\sa120\cf1{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs20\lang1029\sbasedon1\snext2 Text body;} -{\s3\li283\ri0\lin283\rin0\fi283\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f2\fs20\lang1029\sbasedon2\snext3 Text body indent;} -{\s4\sb240\sa120\keepn\cf1{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af8\afs28\lang255\ltrch\dbch\af7\afs28\langfe255\loch\f4\fs28\lang1029\sbasedon1\snext2 Heading;} -{\s5\cf1\uldb{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe255\ab\loch\f1\fs32\lang1029\b\sbasedon4\snext2{\*\soutlvl0} Heading 1;} -{\s6\cf1\shad\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs28\lang255\ai\ab\ltrch\dbch\af1\afs28\langfe255\ai\ab\loch\f1\fs24\lang1029\i\b\sbasedon4\snext2{\*\soutlvl1} Heading 2;} -{\s7\cf1{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af9\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1029\sbasedon2\snext7 List;} -{\s8\sb120\sa120\cf1{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af9\afs20\lang255\ai\ltrch\dbch\af1\afs20\langfe255\ai\loch\f1\fs20\lang1029\i\sbasedon1\snext8 Caption;} -{\s9\cf1{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af9\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1029\sbasedon1\snext9 Index;} -{\*\cs11\cf1\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1029 Drop Caps;} -{\*\cs12\cf1\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1029 Bullets;} -{\*\cs13\cf1\horzvert0\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1029 Vertical Numbering Symbols;} -{\*\cs14\cf1\rtlch\af6\afs24\lang255\ltrch\dbch\af6\afs24\langfe255\loch\f6\fs24\lang1029 Example;} -{\*\cs15\cf1\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1029 Definition;} -{\*\cs16\cf1\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1029 Numbering Symbols;} -}{\*\listtable{\list\listtemplateid1 -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'00.;}{\levelnumbers\'01;}\fi-283\li283} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'01);}{\levelnumbers\'01;}\fi-283\li567}\listid1} -}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls0}} - -{\info{\creatim\yr2004\mo4\dy25\hr23\min7}{\operator Ondrej Novak}{\revtim\yr2004\mo4\dy26\hr22\min53}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6450}}\deftab1134 -{\*\pgdsctbl -{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Default;}} -{\*\pgdscno0}\paperh15840\paperw12240\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc -\pard\plain \sb240\sa120\keepn\f4\fs32\uldb\b\f7\fs32\b\f8\fs32\b \ltrpar\s5\cf1\uldb{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe255\ab\loch\f1\fs32\lang1029\b {\loch\f4\fs32\lang1029\i0\b Popis nov\'fdch roz\'9a\'ed\u345 ?en\'ed ve Skeldalu} -\par \pard\plain \ltrpar\s2\cf1{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs20\lang1029 {\loch\f1\fs20\lang1029\i0\b0 Oproti p\u367 ?vodn\'ed DOS verzi obsahuje verze pro Windows n\u283 ?kter\'e1 vylep\'9aen\'ed. Ka\'9ed\'e9 vylep\'9aen\'ed je v\'9aak nutn\'e9 aktivovat zatrhnut\'edm p\u345 ?\'edslu\'9an\'e9ho ok\'e9nka.} -\par \pard\plain \sb240\sa120\keepn\f4\i\shad\b\f7\fs28\i\b\f8\fs28\i\b\qj \ltrpar\s6\cf1\shad\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs28\lang255\ai\ab\ltrch\dbch\af1\afs28\langfe255\ai\ab\loch\f1\fs24\lang1029\i\b {\loch\f4\fs24\lang1029\i\b N\'e1hodn\'fd backfire (p\u345 ?i kouzlen\'ed) } -\par \pard\plain \ltrpar\s3\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li283\ri0\lin283\rin0\fi283\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f2\fs20\lang1029{\loch\f2\fs20\lang1029\i0\b{\b Backfire }}{\loch\f2\fs20\lang1029znamen\'e1 v p\u345 ?ekladu {\i "Zp\u283 ?tn\'fd n\'e1raz"}. To nast\'e1v\'e1 v situaci, kdy se \u269 ?arod\u283 ?ji kouzlo nezda\u345 ?\'ed, av\'9aak nav\'edc m\'e1 tu sm\u367 ?lu, \'9ee jeho ne\'fasp\u283 ?ch je tak fat\'e1ln\'ed, \'9ee se kouzlo obr\'e1t\'ed proti n\u283 ?mu. Pokud je za\'9akrtnuta volba {\b N\'e1hodn\'fd backfire}, m\u367 ?\'9ee \u269 ?arod\u283 ?j p\u345 ?i fat\'e1ln\'ed -m ne\'fasp\u283 ?chu necht\u283 ?n\u283 ? vyvolat n\'e1hodn\u283 ? kter\'e9koliv kouzlo z cel\'e9ho souboru kouzel Skeldalu (jde jen o kouzla z run), takto m\u367 ?\'9ee vyvolat i kouzlo, na kter\'e9 nem\'e1, ani nem\u367 ?\'9ee m\'edt \'farve\u328 ?, nebo nem\'e1 manu. Mana se p\u345 ?itom spot\u345 ?ebuje jen tolik, kolik by se spot\u345 ?eboval -o na kouzlo, jen\'9e cht\u283 ?l vyvolat. } -\par {\loch\f2\fs20\lang1029\i0\b0 Plat\'ed zde n\u283 ?kolik pravidel. Pokud je to kouzlo na postavu, automaticky se vybere \u269 ?arod\u283 ?j. Pokud m\'e1 kouzlo \'fa\u269 ?inkovat na pol\'ed\u269 ?ko, m\'e1 vliv na v\'9aechny postavy na pol\'ed\u269 ?ku, kde stoj\'ed \u269 ?arod\u283 ?j. Pokud m\'e1 kouzlo \'fa\u269 ?inkovat na pol\'ed\u269 ?ku p\u345 ?ed \u269 ?arod\u283 ?jem, m\'e1 vliv na v\'9aechn -y postavy na pol\'ed\u269 ?ku, kde stoj\'ed \u269 ?arod\u283 ?j. V p\u345 ?\'edpad\u283 ?, \'9ee se jedn\'e1 o kouzlo teleportace, je zvolen n\'e1hodn\'fd c\'edl v r\'e1mci cel\'e9ho bludi\'9at\u283 ?. } -\par {\loch\f2\fs20\lang1029\i0\b0 Za\'9akrtnut\'ed t\'e9to volby m\u367 ?\'9ee zp\u283 ?st\u345 ?it hru p\u345 ?i souboj\'edch s nep\u345 ?\'edli\'9a vy\'9akolen\'fdmi \u269 ?arod\u283 ?ji. \u268 ?asto m\u367 ?\'9ee tento necht\u283 ?n\'fd backfire p\u345 ?\'edn\'e9st i n\u283 ?jakou v\'fdhodu. } -\par \pard\plain \sb240\sa120\keepn\f4\i\shad\b\f7\fs28\i\b\f8\fs28\i\b\qj \ltrpar\s6\cf1\shad\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs28\lang255\ai\ab\ltrch\dbch\af1\afs28\langfe255\ai\ab\loch\f1\fs24\lang1029\i\b {\loch\f4\fs24\lang1029\i\b Recykluj nestv\u367 ?ry } -\par \pard\plain \ltrpar\s3\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li283\ri0\lin283\rin0\fi283\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f2\fs20\lang1029 {\loch\f2\fs20\lang1029\i0\b0 Zap\'edn\'e1 obnovov\'e1n\'ed nestv\u367 ?r. Pro hr\'e1\u269 ?e, jen\'9e maj\'ed pocit, \'9ee vybit\'e9 prostory jsou p\u345 ?\'edli\'9a nudn\'e9 je mo\'9en\'e9 tuto volbu aktivovat. Pot\'e9 se p\u345 ?esto v m\'edstech, kde byly nestvury pobity \u269 ?asem n\u283 ?jak\'e1 nestv\u367 ?ra znova objev\'ed. Nastaven\'ed neovlivn\'ed ty nestv\u367 ?ry, jen\'9e maj\'ed obn -ovov\'e1n\'ed povolen\'e9 v dobrodru\'9estv\'ed (ty se obnovuj\'ed st\'e1le) } -\par \pard\plain \sb240\sa120\keepn\f4\i\shad\b\f7\fs28\i\b\f8\fs28\i\b\qj \ltrpar\s6\cf1\shad\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs28\lang255\ai\ab\ltrch\dbch\af1\afs28\langfe255\ai\ab\loch\f1\fs24\lang1029\i\b {\loch\f4\fs24\lang1029\i\b Alternativn\'ed bojov\'fd syst\'e9m} -\par \pard\plain \ltrpar\s3\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li283\ri0\lin283\rin0\fi283\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f2\fs20\lang1029 {\loch\f2\fs20\lang1029\i0\b0 Br\'e1ny Skeldalu pro Windows p\u345 ?in\'e1\'9aej\'ed pozm\u283 ?n\u283 ?n\'fd bojov\'fd system. Jde zejm\'e9na o nov\'e9 v\'fdpo\u269 ?ty a vzorce pro z\'e1sah. P\u367 ?vodn\'ed bojov\'fd syst\'e9m pouze p\u345 ?i\u269 ?\'edt\'e1 k s\'edle \'fato\u269 ?n\'e9 \u269 ?\'edslo, obratnosti obran\'e9 \u269 ?\'edslo, porovn\'e1v\'e1 je a z toho se vypo\u269 ?\'edt\'e1 z\'e1sah. Alternativn\'ed bojov\'fd syst -\'e9m m\'e1 v\'edc n\'e1hodn\'fdch \u269 ?\'e1st\'ed, ale p\u345 ?esto d\'e1v\'e1 v\u283 ?t\'9a\'ed d\u367 ?raz i na vlastnosti postav. } -\par {\loch\f2\fs20\lang1029\i0\b0 \'dato\u269 ?n\'e1 a obrann\'e1 \u269 ?\'edsla se po\u269 ?\'edtaj\'ed 2x. Ve vzorc\'edch parametr chaos ud\'e1v\'e1 postih za p\u345 ?\'edli\'9a mnoho postav na pol\'ed\u269 ?ku a po\u269 ?\'edt\'e1 se jako chaos=(po\u269 ?et_postav+1)/2 /v\u269 ?etn\u283 ? sama sebe/.} -\par \pard\plain {\listtext\pard\plain \li850\ri0\lin850\rin0\fi-283\sa120\f2\fs20\qj 1)}\ilvl1 \ltrpar\s3\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\li850\ri0\lin850\rin0\fi-283\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f2\fs20\lang1029 {\loch\f2\fs20\lang1029\i0\b0 Prvn\'ed v\'fdpo\u269 ?et spo\u269 ?\'edt\'e1 \'fato\u269 ?n\'e9 \u269 ?\'edslo (\'fa\u269 ?) a obrann\'e9 \u269 ?\'edslo (o\u269 ?) takto:} -\par \pard\plain \ltrpar\s3\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li850\ri0\lin850\rin0\fi283\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f2\fs20\lang1029{\loch\f6\fs16\lang1029\i0\b0{\fs16\f6 \'fa\u269 ?=n\'e1hoda(\'fatok_min,\'fatok_max)+\'fato\u269 ?n\'edk.obratnost/4\line o\u269 ?=n\'e1hoda(obrana_min,obrana_max)+obr\'e1nce.obratnost/(4*chaos)}}{\loch\f2\fs20\lang1029\line \line pokud o\u269 ?>\'fa\u269 ?, pak se obr\'e1nce \'fabr\'e1n\'edl \'fatoku (me\u269 ?em, \'9at\'edtem, usko\u269 ?il, nastavil bezpe\u269 ?nou \u269 ?\'e1st brn\u283 ?n\'ed) a nem\u367 ?\'9ee b\'fdt zasa\'9een b\u283 ?\'9en\'fdm \'fatokem} -\par \pard\plain {\listtext\pard\plain \li850\ri0\lin850\rin0\fi-283\sa120\f2\fs20\qj 2)}\ilvl1 \ltrpar\s3\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\li850\ri0\lin850\rin0\fi-283\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f2\fs20\lang1029 {\loch\f2\fs20\lang1029\i0\b0 Druh\'fd v\'fdpo\u269 ?et spo\u269 ?\'edt\'e1 druh\'e9 \'fato\u345 ?n\'e9 \u269 ?\'edslo (\'fa\u269 ?2) a druh\'e9 obrann\'e9 \u269 ?\'edslo (o\u269 ?2)} -\par \pard\plain \ltrpar\s3\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li850\ri0\lin850\rin0\fi283\rtlch\af1\afs16\lang255\ltrch\dbch\af1\afs16\langfe255\loch\f6\fs16\lang1029 {\loch\f6\fs16\lang1029\i0\b0 \'fa\u269 ?2=n\'e1hoda(\'fatok_min,\'fatok_max)+\'fato\u269 ?n\'edk.s\'edla/5\line o\u269 ?2=n\'e1hoda(obrana_min,obrana_max)+obr\'e1nce.obratnost/(5*chaos)} -\par \pard\plain \ltrpar\s3\cf1\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li850\ri0\lin850\rin0\fi283\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f2\fs20\lang1029 {\loch\f2\fs20\lang1029\i0\b0 pokud o\u269 ?>\'fa\u269 ?, pak z\'e1sah padnul na brn\u283 ?n\'ed a nezp\u367 ?sobilo \'9e\'e1dn\'e9 po\'9akozen\'ed\line pokud \'fa\u269 ?JeU%h_&mp=RLPksEuANu*% z-}UUpw;}|RPIUF zWi?d0omXFi;E^Q)I+{QMdzxn-Xn9UO zim?`wWc1`=ltocFDZ0Xrk8vKyAq?)L_dXUfW6U%Z``Da7-#WV}9Kr>9T}oYHm`f;3 zo0^x_7^rt|kw)6aVy4`AYR-3Y7bry%^M7}L4+B>S?(4NKsm?a2+pw4$3 z^zP^M=t3UlgpL!+tGf$k8-GCg&Y_M@lHTEApn^BF88`Z?rT7E~KkzzFB&2AHbEhp@ zh*6Jewllv?8Y>Wk3hK^baUK&qGUM=e7#IucB4KOjhFZv;W;HL=NrZbMMCpreZkDp4 zzl}t}_7-Cp%eh!O-@3`}dY#*)v0~8NWjlx0Sm2bUg7+7l+OQ*4O@Ajh&U!qYtF00l z8df%)Ro7Ozn2Z{*&emX-)_ZBJs~Yh$XKTyR#wAQSntIe#V?Fus%uo3^o5{)*@GX+N n9<^vKhf*`Pqp=z}s?}PL);1v3xgY5n3zE`Bq|0J3H%GztZ z-f}(W3dRET)#|r@{C)W31AG6`oA%AqkL|PDm+jlvAKH^wntk-}#=d;}k$wN}8}{k5 zXZHM$Kkf79zuP-M{$_7|{fm9~!_W5K(=Se4Yql7RS=?;1ZcD~y3dXXYOvjJeR--&}Yxi{gb7Eb<4)Q2$m(R4L%!bk0uw3BM$+cq+({c((9 z8t6jK6HUAknFoU$5gV8aHX>6yTHFzIJzyP~Dql*o$^L3jqU#_I;>+xFn+KTFmU2~y zE90XmkPqo^^3xItfHO!zXSu{taODjz|LhjwZJW zC{qu2e2G&y)SC1GigDk8UJ$5n^mUv5?vT6!xFTS;G^m_AjhWuw=xwQ>ClFoKeJ4QO zy{>fjvM7t4I_{Ik?tOHT6!o~Ud?A)vtMKU@Q4eW^K};`D?-*zbl(INd#$g^_pm8dw zKyWu=59~sJSNfX`*mt(rG^*u1%rg^oG-+#-j!ty6qPyhCRV1=XZvC4~LwoF!hEy?NInPE{$zD!)7>XJxya;?vISM(>he54kV9NblIwhX7gn zc4b2d`EaiPxr$2qy#*tE+uEi$odiL}pnZ?29wi0Kapmex0~Z=Nz!dS(yd$`xWv7cJ zEh4Ndc{&}luznoF|E~b@g(g|pPf3Q(e@i;2=;(6Gbv>s%K1UWScXWSFxj(0i z{W<0Tc23ch$s89>(%fQxFems3LzjaHv$px!A#!X0Qrc+T!0PiWV!#=8*DKjP=+EB>UlN{5mRgF46s--ao+uTaWc4n;1 v#yqNX^bixTT{BISt9IrJ@OFO5i6QfmUzc+PFdTU0v+V(&-)au2|C0U!EtYu( diff --git a/Windows/install.cpp b/Windows/install.cpp deleted file mode 100644 index dd4cc6a..0000000 --- a/Windows/install.cpp +++ /dev/null @@ -1,325 +0,0 @@ -#include -#include -#include "install.h" -#include "resource.h" -#include -#include -extern "C" - { -#include -#include - } -#include -#include - -static void correctfilter(char *z) - { - char *c; - while ((c=strrchr(z,'|'))!=NULL) *c=0; - } - -static void CommDlgError(HWND owner, int error) -{ - char *msg=0; - switch (error) - { - case CDERR_DIALOGFAILURE: msg="CDERR_DIALOGFAILURE: The dialog box could not be created. The common dialog box function's call to the DialogBox function failed. For example, this error occurs if the common dialog box call specifies an invalid window handle. ";break; - case CDERR_FINDRESFAILURE: msg="CDERR_FINDRESFAILURE: The common dialog box function failed to find a specified resource. ";break; - case CDERR_INITIALIZATION: msg="CDERR_INITIALIZATION: The common dialog box function failed during initialization. This error often occurs when sufficient memory is not available. ";break; - case CDERR_LOADRESFAILURE: msg="CDERR_LOADRESFAILURE: The common dialog box function failed to load a specified resource. ";break; - case CDERR_LOADSTRFAILURE: msg="CDERR_LOADSTRFAILURE: The common dialog box function failed to load a specified string. ";break; - case CDERR_LOCKRESFAILURE: msg="CDERR_LOCKRESFAILURE: The common dialog box function failed to lock a specified resource. ";break; - case CDERR_MEMALLOCFAILURE: msg="CDERR_MEMALLOCFAILURE: The common dialog box function was unable to allocate memory for internal structures. ";break; - case CDERR_MEMLOCKFAILURE: msg="CDERR_MEMLOCKFAILURE: The common dialog box function was unable to lock the memory associated with a handle. ";break; - case CDERR_NOHINSTANCE: msg="CDERR_NOHINSTANCE: The ENABLETEMPLATE flag was set in the Flags member of the initialization structure for the corresponding common dialog box, but you failed to provide a corresponding instance handle. ";break; - case CDERR_NOHOOK: msg="CDERR_NOHOOK: The ENABLEHOOK flag was set in the Flags member of the initialization structure for the corresponding common dialog box, but you failed to provide a pointer to a corresponding hook procedure. ";break; - case CDERR_NOTEMPLATE: msg="CDERR_NOTEMPLATE: The ENABLETEMPLATE flag was set in the Flags member of the initialization structure for the corresponding common dialog box, but you failed to provide a corresponding template. ";break; - case CDERR_REGISTERMSGFAIL: msg="CDERR_REGISTERMSGFAIL: The RegisterWindowMessage function returned an error code when it was called by the common dialog box function. ";break; - case CDERR_STRUCTSIZE: msg="CDERR_STRUCTSIZE: The lStructSize member of the initialization structure for the corresponding common dialog box is invalid. ";break; - case FNERR_BUFFERTOOSMALL: msg="FNERR_BUFFERTOOSMALL: The buffer pointed to by the lpstrFile member of the OPENFILENAME structure is too small for the file name specified by the user. The first two bytes of the lpstrFile buffer contain an integer value specifying the size, in TCHARs, required to receive the full name. ";break; - case FNERR_INVALIDFILENAME: msg="FNERR_INVALIDFILENAME: A file name is invalid. ";break; - case FNERR_SUBCLASSFAILURE: msg="FNERR_SUBCLASSFAILURE: An attempt to subclass a list box failed because sufficient memory was not available. ";;break; - default: msg="Unknown CommDlgError.";break; - } - char *text=(char *)alloca(strlen(msg)+200); - sprintf(text,"CommDlgError (%d / %04X)\r\n\r\nDescription:\r\n\r\n%s",error,error,msg); - MessageBox(owner,text,NULL,MB_OK|MB_ICONEXCLAMATION); -} - -static bool VyberSlozku(HWND owner, char *slozka) - { - OPENFILENAME ofn; - char filter[100]; - char title[100]; - LoadString(GetModuleHandle(NULL),IDS_INSTALLFILTER,filter,sizeof(filter)); - LoadString(GetModuleHandle(NULL),IDS_INSTALLTITLE,title,sizeof(title)); - LoadString(GetModuleHandle(NULL),IDS_INSTALLPRENAME,slozka,MAX_PATH); - correctfilter(filter); - memset(&ofn,0,sizeof(ofn)); -#ifdef OPENFILENAME_SIZE_VERSION_400 - ofn.lStructSize=OPENFILENAME_SIZE_VERSION_400; -#else - ofn.lStructSize=sizeof(ofn); -#endif - ofn.hwndOwner=owner; - ofn.lpstrFilter=filter; - ofn.lpstrFile=slozka; - ofn.nMaxFile=MAX_PATH*4; - ofn.lpstrTitle=title; - ofn.Flags=OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) return true; - else - { - int err=CommDlgExtendedError(); - if (err) CommDlgError(owner,err); - return false; - } - } - -static bool VyberCD(HWND owner, char *slozka) - { - OPENFILENAME ofn; - char filter[100]; - char title[100]; - LoadString(GetModuleHandle(NULL),IDS_INSTALLCDFILTER,filter,sizeof(filter)); - LoadString(GetModuleHandle(NULL),IDS_INSTALLCDTITLE,title,sizeof(title)); - LoadString(GetModuleHandle(NULL),IDS_INSTALLCDFILE,slozka,MAX_PATH); - correctfilter(filter); - memset(&ofn,0,sizeof(ofn)); -#ifdef OPENFILENAME_SIZE_VERSION_400 - ofn.lStructSize=OPENFILENAME_SIZE_VERSION_400; -#else - ofn.lStructSize=sizeof(ofn); -#endif - ofn.hwndOwner=owner; - ofn.lpstrFilter=filter; - ofn.lpstrFile=slozka; - ofn.nMaxFile=MAX_PATH*4; - ofn.lpstrTitle=title; - ofn.Flags=OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) return true; - else { - int err=CommDlgExtendedError(); - if (err) CommDlgError(owner,err); - return false; - } - } - - - -static TSTR_LIST filetocopy=NULL; - -static void FileSingleCopy(const char *src, const char *trg) - { - if (filetocopy==NULL) filetocopy=create_list(100); - str_add(&filetocopy,(char *)src); - str_add(&filetocopy,(char *)trg); - } - -static void FileCopy(HWND hWnd,const char *srcmask, const char *trgmask, const char *src, const char *trg) - { - char *fsrc=(char *)alloca((strlen(srcmask)+strlen(src))*2+MAX_PATH); - char *ftrg=(char *)alloca((strlen(trgmask)+strlen(trg))*2+MAX_PATH); - sprintf(fsrc,srcmask,src); - sprintf(ftrg,trgmask,trg); - strcat(ftrg,"\\"); - char *trgplace=strchr(ftrg,0); - char *srcplace=strrchr(fsrc,'\\')+1; - WIN32_FIND_DATA fdata; - HANDLE h=FindFirstFile(fsrc,&fdata); - if (h==INVALID_HANDLE_VALUE) - { - ResMessageBox2(hWnd,IDS_INSTALLCHYBISOUBOR,MB_ICONEXCLAMATION|MB_OK,fsrc); - return; - } - if (h) do - { - if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - { - strcpy(trgplace,fdata.cFileName); - strcpy(srcplace,fdata.cFileName); - FileSingleCopy(fsrc,ftrg); - } - } - while (FindNextFile(h,&fdata)); - FindClose(h); - } - -static void DirCreate(const char *srcmask, const char *src) - { - char *fsrc=(char *)alloca((strlen(srcmask)+strlen(src))*2+MAX_PATH); - sprintf(fsrc,srcmask,src); - CreateDirectory(fsrc,NULL); - } - -static BOOL CommitCopy(HWND hWnd) - { - int size=0; - int i; - for (i=0;iSetPath(lpszPathObj); - psl->SetDescription( lpszDesc); - psl->SetWorkingDirectory(wkd); - if (args!=NULL) psl->SetArguments(args); - - // Query IShellLink for the IPersistFile interface for saving the - // shortcut in persistent storage. - hres = psl->QueryInterface(IID_IPersistFile, - (void **)&ppf); - - if (SUCCEEDED(hres)) { - wchar_t wsz[MAX_PATH]; - - // Ensure that the string is ANSI. - MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, - wsz, MAX_PATH); - - // Save the link by calling IPersistFile::Save. - hres = ppf->Save(wsz, TRUE); - ppf->Release(); - } - psl->Release(); - } - return hres; -} - - - -static void CreateLinkSkeldal(char *buff,char *slozka) - { - CoInitialize(NULL); - GetModuleFileName(NULL,buff,MAX_PATH*4); - char *c=strrchr(buff,'\\'); - strcat(slozka,c); - SHGetSpecialFolderPath(NULL,buff,CSIDL_DESKTOPDIRECTORY,TRUE); - strcat(buff,"\\"); - c=strchr(buff,0); - LoadString(GetModuleHandle(NULL),IDS_WINTITLE,c,50); - strcat(c,".lnk"); - CreateLink(slozka,buff,"",NULL); - } - -BOOL RunInstall(HWND hWnd) - { - char slozka[MAX_PATH*4]; - char cd[MAX_PATH*4]; - char mypath[MAX_PATH*4]; - TSTR_LIST ini; - char *c; - - if (ResMessageBox(hWnd,IDS_INSTALLTEXT1,MB_OKCANCEL)==IDCANCEL) return FALSE; - if (VyberCD(hWnd,cd)==false) return FALSE; - if (ResMessageBox(hWnd,IDS_INSTALLTEXT2,MB_OKCANCEL)==IDCANCEL) return FALSE; -opakuj1: - if (VyberSlozku(hWnd,slozka)==false) return FALSE; - c=strrchr(slozka,'\\'); - if (c==NULL) goto opakuj1; - c++; - if (strstr(slozka,c) -#include -#include -#include -#include -#include -#include "resource.h" -#include "konfig.h" -#include "../game/extras.h" -#include "richview.h" -#include - -extern "C" - { -#include -#include - } - -static HWND handles[5]; -static HWND konfigHelp; - -#define CFGCHEATS 4 -#define CFGEXTRAS 3 -#define CFGSOUND 1 -#define CFGVIDEO 2 -#define CFGGENERAL 0 - -static LRESULT NullProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) - { - return 0; - } - -static HANDLE StartHelp(HWND hDlg, const char *process,const char *helppathname) - { - SHELLEXECUTEINFO nfo; - - memset(&nfo,0,sizeof(nfo)); - nfo.cbSize=sizeof(nfo); - nfo.fMask=SEE_MASK_DOENVSUBST|SEE_MASK_NOCLOSEPROCESS; - nfo.hwnd=hDlg; - nfo.lpFile=process; - nfo.lpParameters=helppathname; - nfo.nShow=SW_NORMAL; - if (ShellExecuteEx(&nfo)==0) return NULL; - return nfo.hProcess; - } - -static void ShowHelp(HWND hDlg, char *helpname) - { - SetCursor(LoadCursor(NULL,IDC_WAIT)); - HINSTANCE hInstance=GetModuleHandle(NULL); - HRSRC rscr=FindResource(hInstance,helpname,RT_HTML); - HGLOBAL hglob=LoadResource(hInstance,rscr); - void *ptr=LockResource(hglob); - DWORD sz=SizeofResource(hInstance,rscr); - DWORD wrt; - char buff[MAX_PATH*2]; - GetTempPath(sizeof(buff),buff); - strcat(buff,helpname); - HANDLE file=CreateFile(buff,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - WriteFile(file,ptr,sz,&wrt,NULL); - CloseHandle(file); - HANDLE hlp=StartHelp(hDlg,"hh",buff); - if (hlp==NULL) hlp=StartHelp(hDlg,"iexplore",buff); - if (hlp==NULL) {hlp=StartHelp(hDlg,buff,NULL);} - for (int i=0;i<10;i++) {WaitForInputIdle(hlp,10000); Sleep(10);} - while (DeleteFile(buff)==FALSE) - {WaitForInputIdle(hlp,10000); Sleep(10);} - CloseHandle(hlp); - } - -static bool ModeWarning() - { - DEVMODE devmode; - devmode.dmSize=sizeof(DEVMODE); - EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&devmode); - return devmode.dmBitsPerPel!=16; - } - -int ResMessageBox(HWND hWnd, UINT idc, UINT flags) - { - char buff1[1024],buff2[256]; - HINSTANCE hInst=GetModuleHandle(NULL); - LoadString(hInst,idc,buff1,sizeof(buff1)); - LoadString(hInst,IDS_WINTITLE,buff2,sizeof(buff2)); - return MessageBox(hWnd,buff1,buff2,flags); - } - -int ResMessageBox2(HWND hWnd, UINT idc, UINT flags,...) - { - char buff1[1024],buff2[256],buff3[2048]; - va_list args; - va_start(args,flags); - HINSTANCE hInst=GetModuleHandle(NULL); - LoadString(hInst,idc,buff1,sizeof(buff1)); - LoadString(hInst,IDS_WINTITLE,buff2,sizeof(buff2)); - _vsnprintf(buff3,sizeof(buff3),buff1,args); - return MessageBox(hWnd,buff3,buff2,flags); - } - - - -#include "WAPlayer.h" -static WAPlayer GWinAmpPlayer; - -static bool FillListOfPlugins(WAPlayer &player, WAInputPlugin &inplug, void *context) -{ - HWND list=(HWND)context; - int i=ListBox_AddString(list,inplug.GetDescription()); - ListBox_SetItemData(list,i,(LPARAM)&inplug); - return true; -} - -static void UpdateListOfWinampPlugins(HWND okno) -{ - int len=GetWindowTextLength(GetDlgItem(okno,IDC_CESTANAPLUGINY)); - char *path=(char *)alloca(len+1); - GetWindowText(GetDlgItem(okno,IDC_CESTANAPLUGINY),path,len+1); - GWinAmpPlayer.LoadPlugins(path); - ListBox_ResetContent(GetDlgItem(okno,IDC_PLUGLIST)); - GWinAmpPlayer.EnumPlugins(FillListOfPlugins,(void *)GetDlgItem(okno,IDC_PLUGLIST)); -} - -static int WINAPI PosBrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData) - { - const char *curpath=(const char *)lpData; - if (uMsg == BFFM_INITIALIZED) - { - if (curpath && curpath[0]) - { - ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)((LPCSTR)curpath)); - ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)((LPCSTR)curpath)); - } - } - else if (uMsg == BFFM_SELCHANGED) - { - char buff[_MAX_PATH]; - if (SHGetPathFromIDList((LPITEMIDLIST)lParam,buff)) - { - ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buff); - } - } - return 0; - }; - -static bool PathBrowser(HWND hWnd, char *path /* MAX_PATH size */) -{ - BROWSEINFO brw; - memset(&brw,0,sizeof(brw)); - brw.hwndOwner=hWnd; - brw.pidlRoot=NULL; - brw.pszDisplayName=path; - brw.lParam=(LPARAM)path; -#ifdef BIF_USENEWUI - brw.ulFlags= BIF_RETURNONLYFSDIRS |BIF_STATUSTEXT|BIF_USENEWUI ; -#else - brw.ulFlags= BIF_RETURNONLYFSDIRS |BIF_STATUSTEXT ; -#endif - brw.lpfn = (BFFCALLBACK)(PosBrowseCallbackProc); - LPITEMIDLIST il=SHBrowseForFolder( &brw ); - if (il==NULL) return false; - SHGetPathFromIDList(il,path); - IMalloc *shmalloc; - SHGetMalloc(&shmalloc); - shmalloc->Free(il); - if (path[0]==0) return false; - return true; -} - -static void BrowseCestaNaPluginy(HWND main, HWND control) -{ - int len=GetWindowTextLength(control); - len+=MAX_PATH; - char *path=(char *)alloca(len+1); - GetWindowText(control,path,len+1); - if (PathBrowser(main,path)) - { - SetWindowText(control,path); - UpdateListOfWinampPlugins(main); - } -} - -static void OnPlugVlastnosti(HWND hDlg) -{ - HWND list=GetDlgItem(hDlg,IDC_PLUGLIST); - int cursel=ListBox_GetCurSel(list); - if (cursel<0) - { - char buff[256]; - LoadString((HINSTANCE)GetWindowLong(hDlg,GWL_HINSTANCE),IDS_NICVYBRANO,buff,256); - MessageBox(hDlg,buff,0,MB_OK); - } - else - { - WAInputPlugin *p=(WAInputPlugin *)ListBox_GetItemData(list,cursel); - p->UIConfig(hDlg); - } - -} - -static LRESULT SubDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) - { - switch (msg) - { - case WM_NOTIFY: - { - int idCtrl = (int) wParam; - LPNMHDR pnmh = (LPNMHDR) lParam; - switch (idCtrl) - { - case IDC_GAMESPEED: - SetDlgItemInt(hDlg,IDC_GAMESPEEDINFO,SendDlgItemMessage(hDlg,IDC_GAMESPEED,TBM_GETPOS,0,0),FALSE);break; - default:return 0; - } - } - case WM_COMMAND: - { - BOOL tmp; - int idCtrl=LOWORD(wParam); - switch (idCtrl) - { - case IDC_WINDOWED: - tmp=IsDlgButtonChecked(hDlg,idCtrl)==BST_CHECKED; - if (tmp && ModeWarning()) - ResMessageBox(hDlg,IDS_SCREENBPPWARNING,MB_OK|MB_ICONINFORMATION); - EnableWindow(GetDlgItem(hDlg,IDC_ZOOM1),tmp); - EnableWindow(GetDlgItem(hDlg,IDC_ZOOM2),tmp); - EnableWindow(GetDlgItem(hDlg,IDC_ZOOM3),tmp); - break; - case IDC_GAMESPEEDDEFAULT: - SendDlgItemMessage(hDlg,IDC_GAMESPEED,TBM_SETPOS,1,20-6); - SendDlgItemMessage(hDlg,IDC_BATTLEACC,TBM_SETPOS,1,0);break; - case IDC_NOHUNGRY: - case IDC_DEBUGCONSOLE: - if (IsDlgButtonChecked(hDlg,idCtrl)==BST_CHECKED) - { - if (ResMessageBox(hDlg,IDS_CHEATWARNING1,MB_YESNO|MB_ICONQUESTION)!=IDYES || - ResMessageBox(hDlg,IDS_CHEATWARNING2,MB_OKCANCEL|MB_ICONINFORMATION)!=IDCANCEL || - ResMessageBox(hDlg,IDS_CHEATWARNING3,MB_RETRYCANCEL|MB_ICONEXCLAMATION)!=IDRETRY || - ResMessageBox(hDlg,IDS_CHEATWARNING4,MB_ABORTRETRYIGNORE|MB_ICONSTOP)!=IDIGNORE) - CheckDlgButton(hDlg,idCtrl,BST_UNCHECKED); - else - ResMessageBox(hDlg,IDS_CHEATWARNING5,MB_OK|MB_ICONEXCLAMATION); - } - - break; - - case IDC_CESTANAPLUGINY: - BrowseCestaNaPluginy(hDlg,GetDlgItem(hDlg,IDC_CESTANAPLUGINY)); - UpdateListOfWinampPlugins(hDlg); - break; - case IDC_PLUGVLASTNOSTI: - OnPlugVlastnosti(hDlg); - break; - case IDC_PLUGLIST: - if (HIWORD(wParam)==LBN_DBLCLK) OnPlugVlastnosti(hDlg); - break; - case IDC_PLUGINYNAPOVEDA: - { - if (konfigHelp) DestroyWindow(konfigHelp); - konfigHelp=(HWND)ShowRichView(hDlg,MAKEINTRESOURCE(IDR_WINAMPPLUGS),"RTF",false); - RECT rc1,rc2; - SystemParametersInfo(SPI_GETWORKAREA,0,&rc1,0); - GetWindowRect(konfigHelp,&rc2); - SetWindowPos(konfigHelp,NULL,rc1.right-rc2.right+rc2.left,0,0,0,SWP_NOSIZE|SWP_NOZORDER); - break; - } - case IDC_EXTRASHELP: - { - if (konfigHelp) DestroyWindow(konfigHelp); - konfigHelp=(HWND)ShowRichView(hDlg,MAKEINTRESOURCE(IDR_EXTRAS),"RTF",false); - RECT rc1,rc2; - SystemParametersInfo(SPI_GETWORKAREA,0,&rc1,0); - GetWindowRect(konfigHelp,&rc2); - SetWindowPos(konfigHelp,NULL,rc1.right-rc2.right+rc2.left,0,0,0,SWP_NOSIZE|SWP_NOZORDER); - break; - } - default:return 0; - } - } - case WM_MOUSEMOVE: - { - if (IsWindowVisible(handles[CFGCHEATS])) - { - EnableWindow(GetDlgItem(handles[CFGCHEATS],IDC_NOHUNGRY),FALSE); - EnableWindow(GetDlgItem(handles[CFGCHEATS],IDC_DEBUGCONSOLE),FALSE); - } - return 0; - } - default: return 0; - } - return 1; - } - - - -static void LoadSubDialog(HWND hParent, int pos, int uid, DLGPROC dlgproc) - { - RECT rc; - handles[pos]=CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(uid),hParent,dlgproc); - ShowWindow(handles[pos],SW_HIDE); - GetWindowRect(GetDlgItem(hParent,IDC_CLIENTDESK),&rc); - ScreenToClient(hParent,(POINT *)&rc.left); - ScreenToClient(hParent,(POINT *)&rc.right); - MoveWindow(handles[pos],rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,FALSE); - } - -static int GetCountOfMonitors() -{ - IDirect3D9 *dx=Direct3DCreate9(D3D_SDK_VERSION); - if (dx==NULL) return 1; - int num=dx->GetAdapterCount(); - dx->Release(); - return num; -} - -static void SetupDialog() - { - int num; - TSTR_LIST lst=read_config(SKELDALINI); - SendDlgItemMessage(handles[CFGGENERAL],IDC_GAMESPEED,TBM_SETRANGE,1,MAKELONG(1, 20)); - SendDlgItemMessage(handles[CFGGENERAL],IDC_BATTLEACC,TBM_SETRANGE,1,MAKELONG(0, 5)); - SendDlgItemMessage(handles[CFGSOUND],IDC_SNDMUSIC,TBM_SETRANGE,1,MAKELONG(0,127)); - SendDlgItemMessage(handles[CFGSOUND],IDC_SNDFX,TBM_SETRANGE,1,MAKELONG(0,255)); - CheckDlgButton(handles[CFGGENERAL],IDC_WINDOWED,(get_num_field(lst,"WINDOWED",&num)==0 && num==1)?BST_CHECKED:BST_UNCHECKED); - CheckDlgButton(handles[CFGGENERAL],IDC_PRELOAD,(get_num_field(lst,"PRELOAD",&num)==0 && num==1)?BST_CHECKED:BST_UNCHECKED); - CheckDlgButton(handles[CFGGENERAL],IDC_AUTOSAVE,(get_num_field(lst,"AUTOSAVE",&num)==0 && num==1)?BST_CHECKED:BST_UNCHECKED); - num=6;get_num_field(lst,"GAME_SPEED",&num); - num=20-num; - SendDlgItemMessage(handles[CFGGENERAL],IDC_GAMESPEED,TBM_SETPOS,1,num); - num=0;get_num_field(lst,"BATTLE_ACCEL",&num); - SendDlgItemMessage(handles[CFGGENERAL],IDC_BATTLEACC,TBM_SETPOS,1,num); - SetDlgItemInt(handles[CFGGENERAL],IDC_GAMESPEEDINFO,num,FALSE); - num=44100;get_num_field(lst,"SOUND_MIXFREQ",&num); - SetDlgItemInt(handles[CFGSOUND],IDC_MIXFREQ,num,FALSE); - num=127;get_num_field(lst,"MUSIC_VOLUME",&num); - SendDlgItemMessage(handles[CFGSOUND],IDC_SNDMUSIC,TBM_SETPOS,1,num); - num=255;get_num_field(lst,"SOUND_VOLUME",&num); - SendDlgItemMessage(handles[CFGSOUND],IDC_SNDFX,TBM_SETPOS,1,num); - CheckDlgButton(handles[CFGVIDEO],IDC_SKIPINTRO,(get_num_field(lst,"SKIP_INTRO",&num)==0 && num==1)?BST_CHECKED:BST_UNCHECKED); - CheckDlgButton(handles[CFGVIDEO],IDC_FULLRESVIDEO,(get_num_field(lst,"FULLRESVIDEO",&num)==0 && num==1)?BST_CHECKED:BST_UNCHECKED); - num=1;get_num_field(lst,"WINDOWEDZOOM",&num); - CheckRadioButton(handles[CFGGENERAL],IDC_ZOOM1,IDC_ZOOM3,IDC_ZOOM1+num-1); - num=0;get_num_field(lst,"MONITOR",&num); - CheckRadioButton(handles[CFGGENERAL],IDC_MON1,IDC_MON3,IDC_MON1+num); - const char *cestaNaPluginy=get_text_field(lst,"CESTA_PLUGINS"); - if (cestaNaPluginy==0) - { - char *cesta=AutodetectWinAmp(); - SetDlgItemText(handles[CFGSOUND],IDC_CESTANAPLUGINY,cesta); - free(cesta); - } - else - SetDlgItemText(handles[CFGSOUND],IDC_CESTANAPLUGINY,cestaNaPluginy); - UpdateListOfWinampPlugins(handles[CFGSOUND]); - int moncnt=GetCountOfMonitors(); - if (moncnt<3) EnableWindow(GetDlgItem(handles[CFGGENERAL],IDC_MON3),FALSE); - if (moncnt<2) EnableWindow(GetDlgItem(handles[CFGGENERAL],IDC_MON2),FALSE); - num=0;get_num_field(lst,"EXTRAS",&num); - for (int i=0;i<16;i++) - { - int p=1<1) SetDlgItemInt(handles[CFGCHEATS],IDC_CHEATPASSWORD,num,FALSE); - release_list(lst); - } - -static int RadioButtonChecked(HWND hWnd, int min, int max) -{ - for (int i=min;i<=max;i++) - { - if (IsDlgButtonChecked(hWnd,i)==BST_CHECKED) return i-min; - } - return -1; -} - -static void SaveKonfig(HWND hDlg) - { - TSTR_LIST lst=read_config(SKELDALINI); - add_field_num(&lst,"WINDOWED",IsDlgButtonChecked(handles[CFGGENERAL],IDC_WINDOWED)==BST_CHECKED); - add_field_num(&lst,"PRELOAD",IsDlgButtonChecked(handles[CFGGENERAL],IDC_PRELOAD)==BST_CHECKED); - add_field_num(&lst,"AUTOSAVE",IsDlgButtonChecked(handles[CFGGENERAL],IDC_AUTOSAVE)==BST_CHECKED); - add_field_num(&lst,"SKIP_INTRO",IsDlgButtonChecked(handles[CFGVIDEO],IDC_SKIPINTRO)==BST_CHECKED); - add_field_num(&lst,"FULLRESVIDEO",IsDlgButtonChecked(handles[CFGVIDEO],IDC_FULLRESVIDEO)==BST_CHECKED); - add_field_num(&lst,"DEBUG",IsDlgButtonChecked(handles[CFGCHEATS],IDC_DEBUGCONSOLE)==BST_CHECKED); - int mixfreq=GetDlgItemInt(handles[CFGSOUND],IDC_MIXFREQ,NULL,FALSE); - if (mixfreq<8000 || mixfreq>44100) - ResMessageBox(hDlg,IDS_MIXFREQINVALID,MB_OK|MB_ICONEXCLAMATION); - else - add_field_num(&lst,"SOUND_MIXFREQ",mixfreq); - add_field_num(&lst,"MUSIC_VOLUME",SendDlgItemMessage(handles[CFGSOUND],IDC_SNDMUSIC,TBM_GETPOS,0,0)); - add_field_num(&lst,"SOUND_VOLUME",SendDlgItemMessage(handles[CFGSOUND],IDC_SNDFX,TBM_GETPOS,0,0)); - add_field_num(&lst,"GAME_SPEED",20-SendDlgItemMessage(handles[CFGGENERAL],IDC_GAMESPEED,TBM_GETPOS,0,0)); - add_field_num(&lst,"BATTLE_ACCEL",SendDlgItemMessage(handles[CFGGENERAL],IDC_BATTLEACC,TBM_GETPOS,0,0)); - add_field_num(&lst,"WINDOWEDZOOM",RadioButtonChecked(handles[CFGGENERAL],IDC_ZOOM1,IDC_ZOOM3)+1); - add_field_num(&lst,"MONITOR",RadioButtonChecked(handles[CFGGENERAL],IDC_MON1,IDC_MON3)); - int acc=0; - for (int i=0;i<16;i++) - { - int p=1<1) add_field_num(&lst,"DEBUG",acc); - acc=GetWindowTextLength(GetDlgItem(handles[CFGSOUND],IDC_CESTANAPLUGINY)); - char *buff=(char *)alloca(acc+1); - GetWindowText(GetDlgItem(handles[CFGSOUND],IDC_CESTANAPLUGINY),buff,acc+1); - add_field_txt(&lst,"CESTA_PLUGINS",buff); - save_config(lst,SKELDALINI); - } - -static LRESULT KonfigProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) - { - switch (msg) - { - case WM_INITDIALOG: - LoadSubDialog(hDlg,CFGGENERAL,IDD_CFGGENERAL,(DLGPROC)SubDlgProc); - LoadSubDialog(hDlg,CFGSOUND,IDD_CFGSOUND,(DLGPROC)SubDlgProc); - LoadSubDialog(hDlg,CFGVIDEO,IDD_CFGVIDEO,(DLGPROC)NullProc); - LoadSubDialog(hDlg,CFGEXTRAS,IDD_CFGEXTRAS,(DLGPROC)SubDlgProc); - LoadSubDialog(hDlg,CFGCHEATS,IDD_CFGCHEATS,(DLGPROC)SubDlgProc); - { - for (int i=0;i<5;i++) - { - TCITEM item; - char buff[256]; - item.mask=TCIF_TEXT; - LoadString(GetModuleHandle(NULL),IDS_CFGGENERAL+i,buff,sizeof(buff)); - item.pszText=buff; - SendDlgItemMessage(hDlg,IDC_TAB,TCM_INSERTITEM,i,(LPARAM)&item); - } - ShowWindow(handles[0],SW_SHOW); - SetupDialog(); - } - konfigHelp=NULL; - break; - - case WM_NOTIFY: - { - LPNMHDR lpnmhdr = (LPNMHDR) lParam; - if (lpnmhdr->idFrom==IDC_TAB && lpnmhdr->code==TCN_SELCHANGE) - { - int cursel=TabCtrl_GetCurSel(GetDlgItem(hDlg,IDC_TAB)); - for (int i=0;i<5;i++) - ShowWindow(handles[i],i==cursel?SW_SHOW:SW_HIDE); - if (cursel==CFGCHEATS) - { - EnableWindow(GetDlgItem(handles[cursel],IDC_NOHUNGRY),TRUE); - EnableWindow(GetDlgItem(handles[cursel],IDC_DEBUGCONSOLE),TRUE); - } - } - break; - } - case WM_COMMAND: - { - switch (LOWORD(wParam)) - { - case IDCANCEL: EndDialog(hDlg,0);break; - case IDOK: SaveKonfig(hDlg);EndDialog(hDlg,1);break; - } - return 1; - } - case WM_DESTROY: - konfigHelp=NULL; - break; - case WM_MOUSEMOVE: - { - if (IsWindowVisible(handles[CFGCHEATS])) - { - EnableWindow(GetDlgItem(handles[CFGCHEATS],IDC_NOHUNGRY),FALSE); - EnableWindow(GetDlgItem(handles[CFGCHEATS],IDC_DEBUGCONSOLE),FALSE); - } - return 0; - } - default: return 0; - } - return 1; - } - - -void OpenKonfig(HWND hParent) - { - DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_CFGTABDIALOG),hParent,(DLGPROC)KonfigProc,NULL); - GWinAmpPlayer.ClearList(); - } \ No newline at end of file diff --git a/Windows/konfig.h b/Windows/konfig.h deleted file mode 100644 index c2f620e..0000000 --- a/Windows/konfig.h +++ /dev/null @@ -1 +0,0 @@ -void OpenKonfig(HWND hParent); \ No newline at end of file diff --git a/Windows/logo.bmp b/Windows/logo.bmp deleted file mode 100644 index ac73d75b1698c0a548b9683b777b5c97e1edee74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19440 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 XmOXe&4&KrOZ|Q-z^uYgz9^n5ErwfPd diff --git a/Windows/mem.h b/Windows/mem.h deleted file mode 100644 index d8396fe..0000000 --- a/Windows/mem.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -#include \ No newline at end of file diff --git a/Windows/plugins.rtf b/Windows/plugins.rtf deleted file mode 100644 index e69de29..0000000 diff --git a/Windows/resource.h b/Windows/resource.h deleted file mode 100644 index 271db4c..0000000 --- a/Windows/resource.h +++ /dev/null @@ -1,139 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Skeldal.rc -// -#define IDS_WINTITLE 1 -#define IDS_CFGGENERAL 100 -#define IDR_BOLDCZ 101 -#define IDS_CFGSOUND 101 -#define IDD_LADICIOKNO 102 -#define IDS_CFGVIDEO 102 -#define IDD_INPUTWINDOW 103 -#define IDS_CFGEXTRAS 103 -#define IDB_INITLOGO 104 -#define IDD_CFGSOUND 104 -#define IDS_CFGCHEATS 104 -#define IDD_CFGTABDIALOG 105 -#define IDS_NICVYBRANO 105 -#define IDD_CFGGENERAL 106 -#define IDD_CFGVIDEO 109 -#define IDD_CFGEXTRAS 111 -#define IDD_CFGCHEATS 112 -#define IDB_UVODNIPOZADI 113 -#define IDB_UVODNISELECT 114 -#define IDD_INSTALL 115 -#define IDI_MAINICON 117 -#define IDD_RTFVIEWER 122 -#define IDR_EXTRAS 124 -#define IDD_SELADV 128 -#define IDB_SELADVDLG 130 -#define IDR_WINAMPPLUGS 131 -#define IDD_DIALOG1 132 -#define IDD_LISTDIALOG 132 -#define IDS_CHEATWARNING1 200 -#define IDS_CHEATWARNING2 201 -#define IDS_CHEATWARNING3 202 -#define IDS_CHEATWARNING4 203 -#define IDS_CHEATWARNING5 204 -#define IDS_RICHEDMISSING 205 -#define IDS_MIXFREQINVALID 206 -#define IDS_SCREENBPPWARNING 207 -#define IDS_INSTALLFILTER 208 -#define IDS_INSTALLTITLE 209 -#define IDS_INSTALLPRENAME 210 -#define IDS_INSTALLCDFILE 211 -#define IDS_INSTALLCDTITLE 212 -#define IDS_INSTALLCDFILTER 213 -#define IDS_CREATEDIR 214 -#define IDS_NELZEVYTVORITSLOZKU 215 -#define IDS_INSTALLEDGAME 216 -#define IDS_INSTALLHDD 217 -#define IDS_INSTALLCHYBISOUBOR 218 -#define IDS_INSTALLTEXT1 219 -#define IDS_INSTALLTEXT2 220 -#define IDS_DEFAULTADV 221 -#define IDC_OUTPUT 1000 -#define IDC_ADVENCE 1001 -#define IDC_VALUE 1002 -#define IDC_CLEARMAP 1003 -#define IDC_RAISEDEATH 1004 -#define IDC_GOTO 1005 -#define IDC_PROMPT 1005 -#define IDC_IMMORTAL 1006 -#define IDC_TAB 1006 -#define IDC_RAISEMONSTER 1007 -#define IDC_WINDOWED 1007 -#define IDC_LOADITEM 1008 -#define IDC_PRELOAD 1008 -#define IDC_LOADMAP 1009 -#define IDC_AUTOSAVE 1009 -#define IDC_NETECNOST 1010 -#define IDC_OPENDOOR 1011 -#define IDC_GAMESPEED 1011 -#define IDC_PURGE 1012 -#define IDC_GAMESPEEDINFO 1012 -#define IDC_REFRESH 1013 -#define IDC_MIXFREQ 1013 -#define IDC_RELOADMOBILES 1014 -#define IDC_TAKEMONEY 1015 -#define IDC_UNAFFECT 1016 -#define IDC_SNDMUSIC 1016 -#define IDC_WEAPONSKILL 1017 -#define IDC_SNDFX 1017 -#define IDC_HEAL 1018 -#define IDC_SKIPINTRO 1019 -#define IDC_FULLRESVIDEO 1020 -#define IDC_DEBUGCONSOLE 1021 -#define IDC_NOHUNGRY 1022 -#define IDC_INSTALLED 1025 -#define IDC_RADIO2 1028 -#define IDC_EDIT2 1029 -#define IDC_BROWSEHDD 1030 -#define IDC_EDIT3 1031 -#define IDC_BROWSEHDD2 1032 -#define IDC_CHECK1 1033 -#define IDC_CREATELINK 1033 -#define IDC_INSTHLAVNI 1035 -#define IDC_INSTALLMUSIC 1036 -#define IDC_CLIENTDESK 1036 -#define IDC_INSTALLVIDEO 1037 -#define IDC_GAMESPEEDDEFAULT 1037 -#define IDC_EXTRASHELP 1038 -#define IDC_RICHEDIT 1040 -#define IDC_CHEATPASSWORD 1041 -#define IDC_BATTLEACC 1042 -#define IDC_LIST 1044 -#define IDC_ZOOM1 1045 -#define IDC_ZOOM2 1046 -#define IDC_ZOOM3 1047 -#define IDC_MON1 1048 -#define IDC_MON2 1049 -#define IDC_MON3 1050 -#define IDC_CESTANAPLUGINY 1050 -#define IDC_PLUGLIST 1051 -#define IDC_PLUGVLASTNOSTI 1052 -#define IDC_PLUGINYNAPOVEDA 1053 -#define IDC_HODNOTA 1054 -#define IDC_EXRANDOMBACKFIRES 2000 -#define IDC_EXRESPAWNMONSTERS 2001 -#define IDC_EXALTERNATEFIGHT 2002 -#define IDC_EXRECORVERITEMS 2003 -#define IDC_EXBAGEXTENDED 2005 -#define IDC_EXSHIELDBLOCKING 2006 -#define IDC_EXFASTTRADE 2007 -#define IDC_EXALWAYSMINIMAP 2008 -#define IDC_EXGROUPFLEE 2009 -#define IDC_EXAUTOOPENBOOK 2011 -#define IDC_EXAUTOSHOWRUNE 2012 -#define IDC_EXMOBDIAGONAL 2013 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 133 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1055 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Windows/richview.cpp b/Windows/richview.cpp deleted file mode 100644 index 3b24e7e..0000000 --- a/Windows/richview.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include -#include -#include -#include -#include - -static bool IsModal=false; - -static DWORD CALLBACK RtfViewerCallback( - DWORD dwCookie, // application-defined value - LPBYTE pbBuff, // pointer to a buffer - LONG cb, // number of bytes to read or write - LONG *pcb // pointer to number of bytes transferred -) - { - char **rdptr=(char **)dwCookie; - char *p=*rdptr; - *pcb=0; - while (*p && cb) - { - *pbBuff=*(LPBYTE)p; - pbBuff++; - p++; - cb--; - pcb[0]++; - } - *rdptr=p; - return 0; - } - - -static LRESULT RtfViewer(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) - { - switch (msg) - { - case WM_INITDIALOG: - { - HWND rtf=GetDlgItem(hWnd,IDC_RICHEDIT); - EDITSTREAM edstr; - char *rdptr=(char *)lParam; - edstr.dwCookie=(DWORD)(&rdptr); - edstr.pfnCallback=RtfViewerCallback; - SendMessage(rtf,EM_STREAMIN,SF_RTF|SFF_PLAINRTF,(LPARAM)(&edstr)); - break; - } - case WM_COMMAND: - if (LOWORD(wParam)==IDOK || LOWORD(wParam)==IDCANCEL) - { - if (IsModal) EndDialog(hWnd,LOWORD(wParam)); - else DestroyWindow(hWnd); - break; - } - return 0; - default: return 0; - } - return 1; - } - -DWORD ShowRichView(HWND hWnd, const char *resourceName, const char *resourceType, bool modal) - { - - HMODULE mod; - mod=GetModuleHandle("RICHED20.DLL"); - if (mod==NULL) mod=LoadLibrary("RICHED20.DLL"); - if (mod==NULL) - { - char buff[256]; - LoadString(GetModuleHandle(NULL),IDS_RICHEDMISSING,buff,sizeof(buff)); - MessageBox(hWnd,buff,NULL,MB_OK|MB_ICONEXCLAMATION); - return 0; - } - HRSRC rsrc=FindResource(GetModuleHandle(NULL),resourceName,resourceType); - if (rsrc==NULL) return 0; - HGLOBAL src=LoadResource(GetModuleHandle(NULL),rsrc); - const char *ptr=(const char *)LockResource(src); - DWORD res=0; - if (modal) - { - IsModal=true; - res=DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_RTFVIEWER),hWnd,(DLGPROC)RtfViewer,(LPARAM)ptr); - IsModal=false; - } - else - { - HWND hDlg=CreateDialogParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_RTFVIEWER),hWnd,(DLGPROC)RtfViewer,(LPARAM)ptr); - ShowWindow(hDlg,SW_SHOW); - res=(DWORD)hDlg; - } - return res; - } diff --git a/Windows/richview.h b/Windows/richview.h deleted file mode 100644 index 9b64dd2..0000000 --- a/Windows/richview.h +++ /dev/null @@ -1 +0,0 @@ -DWORD ShowRichView(HWND hWnd, const char *resourceName, const char *resourceType, bool modal); \ No newline at end of file diff --git a/Windows/seladv_male.bmp b/Windows/seladv_male.bmp deleted file mode 100644 index ff414cd103a71d5572c02dfef87b5f8fb5919203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25078 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 diff --git a/Windows/skeldal_win.c b/Windows/skeldal_win.c deleted file mode 100644 index 03f41fd..0000000 --- a/Windows/skeldal_win.c +++ /dev/null @@ -1,199 +0,0 @@ -#include "skeldal_win.h" -#include "debug.h" -#include "resource.h" -#include - -void DXMouseTransform(unsigned short *x, unsigned short *y); -void DxLockBuffers(BOOL lock); - -HKL english_layout=NULL; - -#define WM_EXTRACHAR (WM_APP+100) - -#define MAX_KEYQUEUE 16 - -#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) -#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) - - -static uint32_t keyqueue[MAX_KEYQUEUE]; -static uint32_t keyqueuelen=0; -static char wheel_mapping[2]={'Q','I'}; -static BOOL noextra; -MS_EVENT win_mouseEvent; -static BOOL ActiveWindow=FALSE; -static DWORD WaitNext=0; - -void SetWheelMapping(char up, char down) -{ - wheel_mapping[0]=down; - wheel_mapping[1]=up; -} - -static void SetMouseEvent(MS_EVENT *event,UINT msg, WPARAM wParam,LPARAM lParam) - { - event->event_type=0; - switch (msg) - { - case WM_LBUTTONDOWN: event->event_type=0x2;break; - case WM_LBUTTONUP: event->event_type=0x4;break; - case WM_RBUTTONDOWN: event->event_type=0x8;break; - case WM_RBUTTONUP: event->event_type=0x10;break; - case WM_MBUTTONDOWN: event->event_type=0x20;break; - case WM_MBUTTONUP: event->event_type=0x40;break; - case WM_MOUSEMOVE: event->event_type=0x1;break; - } - event->x=GET_X_LPARAM(lParam); - event->y=GET_Y_LPARAM(lParam); - event->tl1=(wParam & MK_LBUTTON)!=0; - event->tl3=(wParam & MK_MBUTTON)!=0; - event->tl2=(wParam & MK_RBUTTON)!=0; - event->event=1; - DXMouseTransform(&event->x,&event->y); - } - -LRESULT GameMainWindowWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) - { - if (msg>=WM_MOUSEFIRST && msg<=WM_MOUSELAST && msg!=WM_MOUSEWHEEL) - { - SetMouseEvent(&win_mouseEvent,msg,wParam,lParam); - } - else switch (msg) - { - case WM_CREATE: - if (english_layout==NULL) english_layout=LoadKeyboardLayout("00000409",KLF_ACTIVATE); - DSReportWindowCreation(hWnd); - return TRUE; - case WM_ENDSESSION: - case WM_CLOSE: - DXCloseMode(); - exit(1); - break; - case WM_SETCURSOR: if (LOWORD(lParam)==HTCLIENT)SetCursor(NULL); - else return DefWindowProc(hWnd,msg,wParam,lParam);break; - return TRUE; - case WM_EXTRACHAR: if (noextra) {noextra=FALSE;break; } - case WM_CHAR: - if (keyqueuelen<16) - { - memmove(keyqueue,keyqueue+1,sizeof(*keyqueue)*keyqueuelen); - keyqueuelen++; - keyqueue[0]=MAKEWORD(wParam,HIWORD(lParam)); - } - if (msg==WM_CHAR) noextra=TRUE; - break; - case WM_MOUSEWHEEL: - { - short delta=HIWORD(wParam); - if (keyqueuelen<16) - { - memmove(keyqueue,keyqueue+1,sizeof(*keyqueue)*keyqueuelen); - keyqueuelen++; - keyqueue[0]=MAKEWORD(0,delta<0?wheel_mapping[0]:wheel_mapping[1]); - } - break; - } - case WM_ACTIVATE: - { - int fActive = LOWORD(wParam); - ActiveWindow=fActive!=WA_INACTIVE; - break; - } - case WM_PAINT: - { - PAINTSTRUCT ps; - BeginPaint(hWnd,&ps); - DXCopyRects64(0,0,DxGetResX(),DxGetResY()); - EndPaint(hWnd,&ps); - break; - } - case WM_RELOADMAP: - { - char buff[256]; - int sektor=wParam; - GlobalGetAtomName((ATOM)lParam,buff,256); - GlobalDeleteAtom((ATOM)lParam); - send_message(E_RELOADMAP,buff,sektor); - break; - } - - default: return DefWindowProc(hWnd,msg,wParam,lParam);break; - } - return 0; - } - - -void CheckMessageQueue() - { - MSG msg; - while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) - { - TranslateMessage(&msg); - if (msg.message==WM_KEYDOWN) - { - PostMessage(msg.hwnd,WM_EXTRACHAR,0,msg.lParam); - } - DispatchMessage(&msg); - } - } - -void WaitMsgQueue() - { - WaitMessage(); - CheckMessageQueue(); - } - -uint32_t _bios_keybrd(int mode) - { -repeat: - if (keyqueuelen) - { - if (mode==_KEYBRD_READY) return 1; - if (mode==_KEYBRD_READ) {keyqueuelen--;return keyqueue[keyqueuelen];} - } - if (mode==_KEYBRD_READ) {WaitMsgQueue(); goto repeat;} - CheckMessageQueue(); - return keyqueuelen!=0; - } - -void task_terminating() - { - STOP(); - } - -void *LoadResourceFont(const char *name) - { - HINSTANCE hInst=GetModuleHandle(NULL); - HRSRC rsrc=FindResource(hInst,name,"SKELDAL_FONT"); - HGLOBAL glb=LoadResource(hInst,rsrc); - return LockResource(glb); - } - -void *LoadDefaultFont() - { - return LoadResourceFont(MAKEINTRESOURCE(IDR_BOLDCZ)); - } - - -void ShareCPU() -{ - DWORD curTime=GetTickCount(); - DWORD timeout=WaitNext - -#define BGSWITCHBIT 0x0020 - -#define SKELDALINI "WSKELDAL.INI" - -#ifdef __cplusplus -extern "C" - { -#endif - - -#define _KEYBRD_READY 0 -#define _KEYBRD_READ 1 - -#define TIMERSPEED 20; - -uint32_t _bios_keybrd(int mode); - - -LRESULT GameMainWindowWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - - -void CheckMessageQueue(); - -void DSReportWindowCreation(HWND hWindow); -char *AutodetectWinAmp(); - -#ifdef __cplusplus - } -#endif - -#define RGB888(r,g,b) ((unsigned short)((((r)<<8)&0xF800) | (((g)<<3) & 0x7C0) | ((b)>>3))) -#define RGB555(r,g,b) ((unsigned short)(((r)<<11) | (((g) & 0xF8)<<6) | (b))) -#define RGB555_ALPHA(r,g,b) ((unsigned short)(((r)<<11) | ((((g) & 0xF8) | 0x04)<<6) | (b))) - -#pragma warning (disable : 4244 4761 4133) - - -void *LoadDefaultFont(); -void *LoadResourceFont(const char *name); - -void ShareCPU(); -void SetWheelMapping(char up, char down); - - -//------------- BGRAPH DX wrapper ------------------- -#include "BGraph2Dx.h" - -#define WM_RELOADMAP (WM_APP+215) -#define E_RELOADMAP 40 - diff --git a/Windows/uvodni.bmp b/Windows/uvodni.bmp deleted file mode 100644 index da3bb7701ff13d36524fad8ee2694e530c3bc688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 308280 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

bC5V#efg{`=@I_k6|~n=v#BX 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

44s*8KmicB($Fm@5mTeK?*3OvvBt#fP7clx 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

Ug!QyIZ}(BYHFd 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 F{R8}Pf -#include -#include -#include "uvodni.h" -#include "resource.h" -#include "konfig.h" -#include "install.h" -#include -#include -#include "..\game\version.h" - - -#define UVODNIOKNOCLASS "Uvodni okno hry Brany Skeldalu@bredysoft" -#define SELPOSX 0 -#define SELPOSY 279 - -LRESULT UvodniWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - -void RegistrujTriduOkna() - { - WNDCLASSEX cls; - memset(&cls,0,sizeof(cls)); - cls.cbSize=sizeof(cls); - cls.hCursor=LoadCursor(NULL,IDC_ARROW); - cls.hInstance=GetModuleHandle(NULL); - cls.hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_MAINICON)); - cls.lpfnWndProc=(WNDPROC)UvodniWinProc; - cls.lpszClassName=UVODNIOKNOCLASS; - if (RegisterClassEx(&cls)==NULL) - { - MessageBox(NULL,"Nelze registrovat tridu okna",NULL,MB_OK|MB_ICONSTOP); - exit(-1); - } - } - -static HBITMAP pozadi; -static HBITMAP selpozadi; -static HDC pozadi_dc; -static HDC selpozadi_dc; -static HBITMAP pozadi_dc_old; -static HBITMAP selpozadi_dc_old; -static int exitstatus=0; - -static int GetSelection(HWND hWnd, DWORD pt,RECT *rcout) - { - POINT ptt; - BITMAP bmpi; - ptt.x=GET_X_LPARAM(pt); - ptt.y=GET_Y_LPARAM(pt); - ScreenToClient(hWnd,&ptt); - GetObject(selpozadi,sizeof(bmpi),&bmpi); - RECT rc; - rc.left=SELPOSX; - rc.top=SELPOSY; - rc.right=rc.left+bmpi.bmWidth; - rc.bottom=rc.top+bmpi.bmHeight; - for (int i=0;i<3;i++) - { - RECT rrc=rc; - rrc.top=rc.top+((rc.bottom-rc.top)*i)/3; - rrc.bottom=rc.top+((rc.bottom-rc.top)*(i+1))/3; - if (PtInRect(&rrc,ptt)) - { - if (rcout) *rcout=rrc; - return i; - } - } - return -1; - } - -static void UkazSelekci(HWND hWnd, HDC hDc, DWORD pt) - { - RECT rc; - int res=GetSelection(hWnd,pt,&rc); - if (res==-1) return; - BitBlt(hDc,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,selpozadi_dc,rc.left-SELPOSX,rc.top-SELPOSY,SRCCOPY); - } - -static HFONT vfont; - -static void ShowVersion(HDC dc) -{ - HFONT fnt=(HFONT )SelectObject(dc,vfont); - char ver[200]="Version: "VERSION; - int len=strlen(ver); - SIZE sz; - ::GetTextExtentPoint(dc,ver,len,&sz); - - SetTextColor(dc,RGB(255,255,255)); - SetBkMode(dc,TRANSPARENT); - TextOut(dc,630-sz.cx,450-sz.cy,ver,len); - SelectObject(dc,fnt); -} - -static LRESULT UvodniWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) - { - static int lastsel; - static RECT lastselrect; - switch (msg) - { - case WM_CREATE: - { - HDC wdc=GetDC(hWnd); - pozadi=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_UVODNIPOZADI)); - selpozadi=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_UVODNISELECT)); - pozadi_dc=CreateCompatibleDC(wdc); - selpozadi_dc=CreateCompatibleDC(wdc); - ReleaseDC(hWnd,wdc); - pozadi_dc_old=(HBITMAP)SelectObject(pozadi_dc,pozadi); - selpozadi_dc_old=(HBITMAP)SelectObject(selpozadi_dc,selpozadi); - lastsel=-1; - if (_access(SKELDALINI,06)!=0) PostMessage(hWnd,WM_APP,0,0); - vfont=CreateFont(15,0,0,0,0,0,0,0,0,0,0,0,0,"Arial"); - return 1; - } - break; - case WM_PAINT: - { - PAINTSTRUCT ps; - HDC wdc=BeginPaint(hWnd,&ps); - BitBlt(wdc,0,0,640,480,pozadi_dc,0,0,SRCCOPY); - ShowVersion(wdc); - UkazSelekci(hWnd,wdc,GetMessagePos()); - EndPaint(hWnd,&ps); - } - break; - case WM_SETCURSOR: - if (lastsel!=-1) - SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(32649))); - else - SetCursor(LoadCursor(NULL, IDC_ARROW)); - break; - case WM_MOUSEMOVE: - { - RECT rc; - int p=GetSelection(hWnd,GetMessagePos(),&rc); - if (p!=lastsel) - { - InvalidateRect(hWnd,&rc,FALSE); - InvalidateRect(hWnd,&lastselrect,FALSE); - lastsel=p; - lastselrect=rc; - } - } - break; - case WM_CLOSE: - exitstatus=0; - DestroyWindow(hWnd); - break; - case WM_DESTROY: - SelectObject(pozadi_dc,pozadi_dc_old); - SelectObject(selpozadi_dc,selpozadi_dc_old); - DeleteObject(pozadi); - DeleteObject(selpozadi); - DeleteDC(pozadi_dc); - DeleteDC(selpozadi_dc); - PostQuitMessage(exitstatus); - DeleteObject(vfont); - break; - case WM_LBUTTONUP: - { - int p=GetSelection(hWnd,GetMessagePos(),NULL); - if (p!=-1) - { - switch (p) - { - case 2: exitstatus=0; DestroyWindow(hWnd);break; - case 0: exitstatus=1; DestroyWindow(hWnd);break; - case 1: OpenKonfig(hWnd);break; -// case 0: RunInstall(hWnd);break; - } - } - break; - } - case WM_APP: - if (RunInstall(hWnd)==FALSE) {exitstatus=0;DestroyWindow(hWnd);} - break; - default:return DefWindowProc(hWnd,msg,wParam,lParam); - } - return 1; - } - -extern "C" - { - - -char OtevriUvodniOkno() - { - RECT rc; - - char buff[256]; - - LoadString(GetModuleHandle(NULL),IDS_WINTITLE,buff,sizeof(buff)); - - InitCommonControls(); - - RegistrujTriduOkna(); - GetClientRect(GetDesktopWindow(),&rc); - rc.left=(rc.right-640)/2; - rc.top=(rc.bottom-480)/2; - - AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,FALSE); - - HWND hOknoWnd=CreateWindow(UVODNIOKNOCLASS,buff,WS_OVERLAPPED|WS_SYSMENU|WS_VISIBLE|WS_MINIMIZEBOX|WS_BORDER,rc.left,rc.top,640,480,NULL,NULL,GetModuleHandle(NULL),NULL); - MSG msg; - while (GetMessage(&msg,0,0,0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - UnregisterClass(UVODNIOKNOCLASS,GetModuleHandle(NULL)); - return msg.wParam==1; - } - -static void CreateAdvLink(char *advname) - { - char modname[MAX_PATH*4]; - char linkname[MAX_PATH*4]; - GetModuleFileName(NULL,modname,MAX_PATH*4); - CoInitialize(NULL); - SHGetSpecialFolderPath(NULL,linkname,CSIDL_DESKTOPDIRECTORY,TRUE); - strcat(linkname,"\\"); - strcat(linkname,advname); - strcat(linkname,".lnk"); - CreateLink(modname,linkname,"",advname); - } - - -static char selectedAdv[MAX_PATH]; -static LRESULT SelectAdventureDlg(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) - { - char temp[MAX_PATH]; - switch (msg) - { - case WM_INITDIALOG: - { - WIN32_FIND_DATA fdata; - HANDLE fnd=FindFirstFile("*.adv",&fdata); - selectedAdv[0]=0; - if (fnd!=INVALID_HANDLE_VALUE) - { - HWND lsbx=GetDlgItem(hDlg,IDC_LIST); - LoadString(GetModuleHandle(NULL),IDS_DEFAULTADV,temp,sizeof(temp)); - ListBox_AddString(lsbx,temp); - do ListBox_AddString(lsbx,fdata.cFileName); while (FindNextFile(fnd,&fdata)); - FindClose(fnd); - ListBox_SetCurSel(lsbx,0); - EnableWindow(GetDlgItem(hDlg,IDC_CREATELINK),0); - } - else - EndDialog(hDlg,IDOK); - } - break; - case WM_DRAWITEM: if (wParam==IDC_LIST) - { - LPDRAWITEMSTRUCT drawinfo=(LPDRAWITEMSTRUCT)lParam; - char *c; - if (drawinfo->itemState & ODS_SELECTED) - { - SetTextColor(drawinfo->hDC,GetSysColor(COLOR_HIGHLIGHTTEXT)); - SetBkColor(drawinfo->hDC,GetSysColor(COLOR_HIGHLIGHT)); - } - else - { - SetTextColor(drawinfo->hDC,GetSysColor(COLOR_WINDOWTEXT)); - SetBkColor(drawinfo->hDC,GetSysColor(COLOR_WINDOW)); - } - ListBox_GetText(drawinfo->hwndItem,drawinfo->itemID,temp); - c=strrchr(temp,'.'); - if (c) *c=0; - ExtTextOut(drawinfo->hDC,0,0,ETO_OPAQUE,&drawinfo->rcItem,"",0,NULL); - DrawText(drawinfo->hDC,temp,strlen(temp),&drawinfo->rcItem,DT_SINGLELINE|DT_VCENTER|DT_CENTER|DT_NOPREFIX); - } - break; - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDOK: - { - HWND lsbx=GetDlgItem(hDlg,IDC_LIST); - int cursel=ListBox_GetCurSel(lsbx); - if (cursel!=0) - { - ListBox_GetText(lsbx,cursel,selectedAdv); - if (IsDlgButtonChecked(hDlg,IDC_CREATELINK) & BST_CHECKED) - CreateAdvLink(selectedAdv); - } - EndDialog(hDlg,IDOK); - } - break; - case IDCANCEL: - EndDialog(hDlg,IDCANCEL); - break; - case IDC_LIST: - if (HIWORD(wParam)==LBN_DBLCLK) - PostMessage(hDlg,WM_COMMAND,IDOK,0); - if (HIWORD(wParam)==LBN_SELCHANGE) - EnableWindow(GetDlgItem(hDlg,IDC_CREATELINK),ListBox_GetCurSel(GetDlgItem(hDlg,IDC_LIST))!=0); - break; - - default:return 0; - } - break; - default: return 0; - } - return 1; - } - -char SelectAdventure() - { - int ret=DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_SELADV), NULL, (DLGPROC)SelectAdventureDlg); - if (ret==IDCANCEL) exit(0); - if (selectedAdv[0]==0) return 0; - return 1; - } - -char *GetSelectedAdventure() - { - return selectedAdv; - } - - } diff --git a/Windows/uvodni.h b/Windows/uvodni.h deleted file mode 100644 index ccbd839..0000000 --- a/Windows/uvodni.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -char OtevriUvodniOkno(); -char SelectAdventure(); -char *GetSelectedAdventure(); - -#ifdef __cplusplus - } -#endif \ No newline at end of file diff --git a/Windows/uvodni_sel.bmp b/Windows/uvodni_sel.bmp deleted file mode 100644 index afdcfa4519fda6f8e23368edcb0193d664eac690..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40520 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 diff --git a/Windows/wa_ipc.h b/Windows/wa_ipc.h deleted file mode 100644 index 76f891b..0000000 --- a/Windows/wa_ipc.h +++ /dev/null @@ -1,1028 +0,0 @@ - /* -** Copyright (C) 2003 Nullsoft, Inc. -** -** This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held -** liable for any damages arising from the use of this software. -** -** Permission is granted to anyone to use this software for any purpose, including commercial applications, and to -** alter it and redistribute it freely, subject to the following restrictions: -** -** 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. -** If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -** -** 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -** -** 3. This notice may not be removed or altered from any source distribution. -** -*/ - -#ifndef _WA_IPC_H_ -#define _WA_IPC_H_ - -/* -** This is the modern replacement for the classic 'frontend.h'. Most of these -** updates are designed for in-process use, i.e. from a plugin. -** -*/ - -/* message used to sent many messages to winamp's main window. -** most all of the IPC_* messages involve sending the message in the form of: -** result = SendMessage(hwnd_winamp,WM_WA_IPC,(parameter),IPC_*); -*/ -#define WM_WA_IPC WM_USER -/* but some of them use WM_COPYDATA. be afraid. -*/ - -#define IPC_GETVERSION 0 -/* int version = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETVERSION); -** -** Version will be 0x20yx for winamp 2.yx. versions previous to Winamp 2.0 -** typically (but not always) use 0x1zyx for 1.zx versions. Weird, I know. -*/ - -#define IPC_GETREGISTEREDVERSION 770 - - -typedef struct { - char *filename; - char *title; - int length; -} enqueueFileWithMetaStruct; // send this to a IPC_PLAYFILE in a non WM_COPYDATA, -// and you get the nice desired result. if title is NULL, it is treated as a "thing", -// otherwise it's assumed to be a file (for speed) - -#define IPC_PLAYFILE 100 // dont be fooled, this is really the same as enqueufile -#define IPC_ENQUEUEFILE 100 -/* sent as a WM_COPYDATA, with IPC_PLAYFILE as the dwData, and the string to play -** as the lpData. Just enqueues, does not clear the playlist or change the playback -** state. -*/ - - -#define IPC_DELETE 101 -#define IPC_DELETE_INT 1101 // don't use this, it's used internally by winamp when - // dealing with some lame explorer issues. -/* SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_DELETE); -** Use IPC_DELETE to clear Winamp's internal playlist. -*/ - - -#define IPC_STARTPLAY 102 // starts playback. almost like hitting play in Winamp. -#define IPC_STARTPLAY_INT 1102 // used internally, don't bother using it (won't be any fun) - - -#define IPC_CHDIR 103 -/* sent as a WM_COPYDATA, with IPC_CHDIR as the dwData, and the directory to change to -** as the lpData. -*/ - - -#define IPC_ISPLAYING 104 -/* int res = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_ISPLAYING); -** If it returns 1, it is playing. if it returns 3, it is paused, -** if it returns 0, it is not playing. -*/ - - -#define IPC_GETOUTPUTTIME 105 -/* int res = SendMessage(hwnd_winamp,WM_WA_IPC,mode,IPC_GETOUTPUTTIME); -** returns the position in milliseconds of the current track (mode = 0), -** or the track length, in seconds (mode = 1). Returns -1 if not playing or error. -*/ - - -#define IPC_JUMPTOTIME 106 -/* (requires Winamp 1.60+) -** SendMessage(hwnd_winamp,WM_WA_IPC,ms,IPC_JUMPTOTIME); -** IPC_JUMPTOTIME sets the position in milliseconds of the -** current song (approximately). -** Returns -1 if not playing, 1 on eof, or 0 if successful -*/ - -#define IPC_GETMODULENAME 109 -#define IPC_EX_ISRIGHTEXE 666 -/* usually shouldnt bother using these, but here goes: -** send a WM_COPYDATA with IPC_GETMODULENAME, and an internal -** flag gets set, which if you send a normal WM_WA_IPC message with -** IPC_EX_ISRIGHTEXE, it returns whether or not that filename -** matches. lame, I know. -*/ - -#define IPC_WRITEPLAYLIST 120 -/* (requires Winamp 1.666+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_WRITEPLAYLIST); -** -** IPC_WRITEPLAYLIST writes the current playlist to \\Winamp.m3u, -** and returns the current playlist position. -** Kinda obsoleted by some of the 2.x new stuff, but still good for when -** using a front-end (instead of a plug-in) -*/ - - -#define IPC_SETPLAYLISTPOS 121 -/* (requires Winamp 2.0+) -** SendMessage(hwnd_winamp,WM_WA_IPC,position,IPC_SETPLAYLISTPOS) -** IPC_SETPLAYLISTPOS sets the playlist position to 'position'. It -** does not change playback or anything, it just sets position, and -** updates the view if necessary -*/ - - -#define IPC_SETVOLUME 122 -/* (requires Winamp 2.0+) -** SendMessage(hwnd_winamp,WM_WA_IPC,volume,IPC_SETVOLUME); -** IPC_SETVOLUME sets the volume of Winamp (from 0-255). -*/ - - -#define IPC_SETPANNING 123 -/* (requires Winamp 2.0+) -** SendMessage(hwnd_winamp,WM_WA_IPC,panning,IPC_SETPANNING); -** IPC_SETPANNING sets the panning of Winamp (from 0 (left) to 255 (right)). -*/ - - -#define IPC_GETLISTLENGTH 124 -/* (requires Winamp 2.0+) -** int length = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTLENGTH); -** IPC_GETLISTLENGTH returns the length of the current playlist, in -** tracks. -*/ - - -#define IPC_GETLISTPOS 125 -/* (requires Winamp 2.05+) -** int pos=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTPOS); -** IPC_GETLISTPOS returns the playlist position. A lot like IPC_WRITEPLAYLIST -** only faster since it doesn't have to write out the list. Heh, silly me. -*/ - - -#define IPC_GETINFO 126 -/* (requires Winamp 2.05+) -** int inf=SendMessage(hwnd_winamp,WM_WA_IPC,mode,IPC_GETINFO); -** IPC_GETINFO returns info about the current playing song. The value -** it returns depends on the value of 'mode'. -** Mode Meaning -** ------------------ -** 0 Samplerate (i.e. 44100) -** 1 Bitrate (i.e. 128) -** 2 Channels (i.e. 2) -** 3 (5+) Video LOWORD=w HIWORD=h -** 4 (5+) > 65536, string (video description) -*/ - - -#define IPC_GETEQDATA 127 -/* (requires Winamp 2.05+) -** int data=SendMessage(hwnd_winamp,WM_WA_IPC,pos,IPC_GETEQDATA); -** IPC_GETEQDATA queries the status of the EQ. -** The value returned depends on what 'pos' is set to: -** Value Meaning -** ------------------ -** 0-9 The 10 bands of EQ data. 0-63 (+20db - -20db) -** 10 The preamp value. 0-63 (+20db - -20db) -** 11 Enabled. zero if disabled, nonzero if enabled. -** 12 Autoload. zero if disabled, nonzero if enabled. -*/ - - -#define IPC_SETEQDATA 128 -/* (requires Winamp 2.05+) -** SendMessage(hwnd_winamp,WM_WA_IPC,pos,IPC_GETEQDATA); -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SETEQDATA); -** IPC_SETEQDATA sets the value of the last position retrieved -** by IPC_GETEQDATA. This is pretty lame, and we should provide -** an extended version that lets you do a MAKELPARAM(pos,value). -** someday... - - new (2.92+): - if the high byte is set to 0xDB, then the third byte specifies - which band, and the bottom word specifies the value. -*/ - -#define IPC_ADDBOOKMARK 129 -/* (requires Winamp 2.4+) -** Sent as a WM_COPYDATA, using IPC_ADDBOOKMARK, adds the specified -** file/url to the Winamp bookmark list. -*/ -/* -In winamp 5+, we use this as a normal WM_WA_IPC and the string: - - "filename\0title\0" - - to notify the library/bookmark editor that a bookmark -was added. Note that using this message in this context does not -actually add the bookmark. -do not use :) -*/ - - -#define IPC_INSTALLPLUGIN 130 -/* not implemented, but if it was you could do a WM_COPYDATA with -** a path to a .wpz, and it would install it. -*/ - - -#define IPC_RESTARTWINAMP 135 -/* (requires Winamp 2.2+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_RESTARTWINAMP); -** IPC_RESTARTWINAMP will restart Winamp (isn't that obvious ? :) -*/ - - -#define IPC_ISFULLSTOP 400 -/* (requires winamp 2.7+ I think) -** ret=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_ISFULLSTOP); -** useful for when you're an output plugin, and you want to see -** if the stop/close is a full stop, or just between tracks. -** returns nonzero if it's full, zero if it's just a new track. -*/ - - -#define IPC_INETAVAILABLE 242 -/* (requires Winamp 2.05+) -** val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_INETAVAILABLE); -** IPC_INETAVAILABLE will return 1 if the Internet connection is available for Winamp. -*/ - - -#define IPC_UPDTITLE 243 -/* (requires Winamp 2.2+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_UPDTITLE); -** IPC_UPDTITLE will ask Winamp to update the informations about the current title. -*/ - - -#define IPC_REFRESHPLCACHE 247 -/* (requires Winamp 2.2+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_REFRESHPLCACHE); -** IPC_REFRESHPLCACHE will flush the playlist cache buffer. -** (send this if you want it to go refetch titles for tracks) -*/ - - -#define IPC_GET_SHUFFLE 250 -/* (requires Winamp 2.4+) -** val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_SHUFFLE); -** -** IPC_GET_SHUFFLE returns the status of the Shuffle option (1 if set) -*/ - - -#define IPC_GET_REPEAT 251 -/* (requires Winamp 2.4+) -** val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_REPEAT); -** -** IPC_GET_REPEAT returns the status of the Repeat option (1 if set) -*/ - - -#define IPC_SET_SHUFFLE 252 -/* (requires Winamp 2.4+) -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SET_SHUFFLE); -** -** IPC_SET_SHUFFLE sets the status of the Shuffle option (1 to turn it on) -*/ - - -#define IPC_SET_REPEAT 253 -/* (requires Winamp 2.4+) -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SET_REPEAT); -** -** IPC_SET_REPEAT sets the status of the Repeat option (1 to turn it on) -*/ - - -#define IPC_ENABLEDISABLE_ALL_WINDOWS 259 // 0xdeadbeef to disable -/* (requires Winamp 2.9+) -** SendMessage(hwnd_winamp,WM_WA_IPC,enable?0:0xdeadbeef,IPC_MBOPENREAL); -** sending with 0xdeadbeef as the param disables all winamp windows, -** any other values will enable all winamp windows. -*/ - - -#define IPC_GETWND 260 -/* (requires Winamp 2.9+) -** HWND h=SendMessage(hwnd_winamp,WM_WA_IPC,IPC_GETWND_xxx,IPC_GETWND); -** returns the HWND of the window specified. -*/ - #define IPC_GETWND_EQ 0 // use one of these for the param - #define IPC_GETWND_PE 1 - #define IPC_GETWND_MB 2 - #define IPC_GETWND_VIDEO 3 -#define IPC_ISWNDVISIBLE 261 // same param as IPC_GETWND - - - - -/************************************************************************ -***************** in-process only (WE LOVE PLUGINS) -************************************************************************/ - - -#define IPC_SETSKIN 200 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)"skinname",IPC_SETSKIN); -** IPC_SETSKIN sets the current skin to "skinname". Note that skinname -** can be the name of a skin, a skin .zip file, with or without path. -** If path isn't specified, the default search path is the winamp skins -** directory. -*/ - - -#define IPC_GETSKIN 201 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)skinname_buffer,IPC_GETSKIN); -** IPC_GETSKIN puts the directory where skin bitmaps can be found -** into skinname_buffer. -** skinname_buffer must be MAX_PATH characters in length. -** When using a .zip'd skin file, it'll return a temporary directory -** where the ZIP was decompressed. -*/ - - -#define IPC_EXECPLUG 202 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)"vis_file.dll",IPC_EXECPLUG); -** IPC_EXECPLUG executes a visualization plug-in pointed to by WPARAM. -** the format of this string can be: -** "vis_whatever.dll" -** "vis_whatever.dll,0" // (first mod, file in winamp plug-in dir) -** "C:\\dir\\vis_whatever.dll,1" -*/ - - -#define IPC_GETPLAYLISTFILE 211 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTFILE); -** IPC_GETPLAYLISTFILE gets the filename of the playlist entry [index]. -** returns a pointer to it. returns NULL on error. -*/ - - -#define IPC_GETPLAYLISTTITLE 212 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTTITLE); -** -** IPC_GETPLAYLISTTITLE gets the title of the playlist entry [index]. -** returns a pointer to it. returns NULL on error. -*/ - - -#define IPC_GETHTTPGETTER 240 -/* retrieves a function pointer to a HTTP retrieval function. -** if this is unsupported, returns 1 or 0. -** the function should be: -** int (*httpRetrieveFile)(HWND hwnd, char *url, char *file, char *dlgtitle); -** if you call this function, with a parent window, a URL, an output file, and a dialog title, -** it will return 0 on successful download, 1 on error. -*/ - - -#define IPC_MBOPEN 241 -/* (requires Winamp 2.05+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_MBOPEN); -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)url,IPC_MBOPEN); -** IPC_MBOPEN will open a new URL in the minibrowser. if url is NULL, it will open the Minibrowser window. -*/ - - - -#define IPC_CHANGECURRENTFILE 245 -/* (requires Winamp 2.05+) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)file,IPC_CHANGECURRENTFILE); -** IPC_CHANGECURRENTFILE will set the current playlist item. -*/ - - -#define IPC_GETMBURL 246 -/* (requires Winamp 2.2+) -** char buffer[4096]; // Urls can be VERY int32_t -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)buffer,IPC_GETMBURL); -** IPC_GETMBURL will retrieve the current Minibrowser URL into buffer. -** buffer must be at least 4096 bytes int32_t. -*/ - - -#define IPC_MBBLOCK 248 -/* (requires Winamp 2.4+) -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_MBBLOCK); -** -** IPC_MBBLOCK will block the Minibrowser from updates if value is set to 1 -*/ - -#define IPC_MBOPENREAL 249 -/* (requires Winamp 2.4+) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)url,IPC_MBOPENREAL); -** -** IPC_MBOPENREAL works the same as IPC_MBOPEN except that it will works even if -** IPC_MBBLOCK has been set to 1 -*/ - -#define IPC_ADJUST_OPTIONSMENUPOS 280 -/* (requires Winamp 2.9+) -** int newpos=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)adjust_offset,IPC_ADJUST_OPTIONSMENUPOS); -** moves where winamp expects the Options menu in the main menu. Useful if you wish to insert a -** menu item above the options/skins/vis menus. -*/ - -#define IPC_GET_HMENU 281 -/* (requires Winamp 2.9+) -** HMENU hMenu=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GET_HMENU); -** values for data: -** 0 : main popup menu -** 1 : main menubar file menu -** 2 : main menubar options menu -** 3 : main menubar windows menu -** 4 : main menubar help menu -** other values will return NULL. -*/ - -#define IPC_GET_EXTENDED_FILE_INFO 290 //pass a pointer to the following struct in wParam -#define IPC_GET_EXTENDED_FILE_INFO_HOOKABLE 296 -/* (requires Winamp 2.9+) -** to use, create an extendedFileInfoStruct, point the values filename and metadata to the -** filename and metadata field you wish to query, and ret to a buffer, with retlen to the -** length of that buffer, and then SendMessage(hwnd_winamp,WM_WA_IPC,&struct,IPC_GET_EXTENDED_FILE_INFO); -** the results should be in the buffer pointed to by ret. -** returns 1 if the decoder supports a getExtendedFileInfo method -*/ -typedef struct { - char *filename; - char *metadata; - char *ret; - int retlen; -} extendedFileInfoStruct; - -#define IPC_GET_BASIC_FILE_INFO 291 //pass a pointer to the following struct in wParam -typedef struct { - char *filename; - - int quickCheck; // set to 0 to always get, 1 for quick, 2 for default (if 2, quickCheck will be set to 0 if quick wasnot used) - - // filled in by winamp - int length; - char *title; - int titlelen; -} basicFileInfoStruct; - -#define IPC_GET_EXTLIST 292 //returns doublenull delimited. GlobalFree() it when done. if data is 0, returns raw extlist, if 1, returns something suitable for getopenfilename - -#define IPC_INFOBOX 293 -typedef struct { - HWND parent; - char *filename; -} infoBoxParam; - -#define IPC_SET_EXTENDED_FILE_INFO 294 //pass a pointer to the a extendedFileInfoStruct in wParam -/* (requires Winamp 2.9+) -** to use, create an extendedFileInfoStruct, point the values filename and metadata to the -** filename and metadata field you wish to write in ret. (retlen is not used). and then -** SendMessage(hwnd_winamp,WM_WA_IPC,&struct,IPC_SET_EXTENDED_FILE_INFO); -** returns 1 if the metadata is supported -** Call IPC_WRITE_EXTENDED_FILE_INFO once you're done setting all the metadata you want to update -*/ - -#define IPC_WRITE_EXTENDED_FILE_INFO 295 -/* (requires Winamp 2.9+) -** writes all the metadata set thru IPC_SET_EXTENDED_FILE_INFO to the file -** returns 1 if the file has been successfully updated, 0 if error -*/ - -#define IPC_FORMAT_TITLE 297 -typedef struct -{ - char *spec; // NULL=default winamp spec - void *p; - - char *out; - int out_len; - - char * (*TAGFUNC)(char * tag, void * p); //return 0 if not found - void (*TAGFREEFUNC)(char * tag,void * p); -} waFormatTitle; - -#define IPC_GETUNCOMPRESSINTERFACE 331 -/* returns a function pointer to uncompress(). -** int (*uncompress)(unsigned char *dest, uint32_t *destLen, const unsigned char *source, uint32_t sourceLen); -** right out of zlib, useful for decompressing zlibbed data. -** if you pass the parm of 0x10100000, it will return a wa_inflate_struct * to an inflate API. -*/ - -typedef struct { - int (*inflateReset)(void *strm); - int (*inflateInit_)(void *strm,const char *version, int stream_size); - int (*inflate)(void *strm, int flush); - int (*inflateEnd)(void *strm); - uint32_t (*crc32)(uint32_t crc, const unsigned char *buf, unsigned int len); -} wa_inflate_struct; - - -#define IPC_ADD_PREFS_DLG 332 -#define IPC_REMOVE_PREFS_DLG 333 -/* (requires Winamp 2.9+) -** to use, allocate a prefsDlgRec structure (either on the heap or some global -** data, but NOT on the stack), initialze the members: -** hInst to the DLL instance where the resource is located -** dlgID to the ID of the dialog, -** proc to the window procedure for the dialog -** name to the name of the prefs page in the prefs. -** where to 0 (eventually we may add more options) -** then, SendMessage(hwnd_winamp,WM_WA_IPC,&prefsRec,IPC_ADD_PREFS_DLG); -** -** you can also IPC_REMOVE_PREFS_DLG with the address of the same prefsRec, -** but you shouldn't really ever have to. -** -*/ -#define IPC_OPENPREFSTOPAGE 380 // pass an id of a builtin page, or a &prefsDlgRec of prefs page to open - -typedef struct _prefsDlgRec { - HINSTANCE hInst; - int dlgID; - void *proc; - - char *name; - int where; // 0 for options, 1 for plugins, 2 for skins, 3 for bookmarks, 4 for prefs - - - int _id; - struct _prefsDlgRec *next; -} prefsDlgRec; - - -#define IPC_GETINIFILE 334 // returns a pointer to winamp.ini -#define IPC_GETINIDIRECTORY 335 // returns a pointer to the directory to put config files in (if you dont want to use winamp.ini) - -#define IPC_SPAWNBUTTONPOPUP 361 // param = -// 0 = eject -// 1 = previous -// 2 = next -// 3 = pause -// 4 = play -// 5 = stop - -#define IPC_OPENURLBOX 360 // pass a HWND to a parent, returns a HGLOBAL that needs to be freed with GlobalFree(), if successful -#define IPC_OPENFILEBOX 362 // pass a HWND to a parent -#define IPC_OPENDIRBOX 363 // pass a HWND to a parent - -// pass an HWND to a parent. call this if you take over the whole UI so that the dialogs are not appearing on the -// bottom right of the screen since the main winamp window is at 3000x3000, call again with NULL to reset -#define IPC_SETDIALOGBOXPARENT 364 - - - -// pass 0 for a copy of the skin HBITMAP -// pass 1 for name of font to use for playlist editor likeness -// pass 2 for font charset -// pass 3 for font size -#define IPC_GET_GENSKINBITMAP 503 - - -#define IPC_GET_EMBEDIF 505 // pass an embedWindowState -// returns an HWND embedWindow(embedWindowState *); if the data is NULL, otherwise returns the HWND directly -typedef struct -{ - HWND me; //hwnd of the window - - int flags; - - RECT r; - - void *user_ptr; // for application use - - int extra_data[64]; // for internal winamp use -} embedWindowState; - -#define EMBED_FLAGS_NORESIZE 1 // set this bit in embedWindowState.flags to keep window from being resizable -#define EMBED_FLAGS_NOTRANSPARENCY 2 // set this bit in embedWindowState.flags to make gen_ff turn transparency off for this wnd - - -#define IPC_EMBED_ENUM 532 -typedef struct embedEnumStruct -{ - int (*enumProc)(embedWindowState *ws, struct embedEnumStruct *param); // return 1 to abort - int user_data; // or more :) -} embedEnumStruct; - // pass - -#define IPC_EMBED_ISVALID 533 - -#define IPC_CONVERTFILE 506 -/* (requires Winamp 2.92+) -** Converts a given file to a different format (PCM, MP3, etc...) -** To use, pass a pointer to a waFileConvertStruct struct -** This struct can be either on the heap or some global -** data, but NOT on the stack. At least, until the conversion is done. -** -** eg: SendMessage(hwnd_winamp,WM_WA_IPC,&myConvertStruct,IPC_CONVERTFILE); -** -** Return value: -** 0: Can't start the conversion. Look at myConvertStruct->error for details. -** 1: Conversion started. Status messages will be sent to the specified callbackhwnd. -** Be sure to call IPC_CONVERTFILE_END when your callback window receives the -** IPC_CB_CONVERT_DONE message. -*/ -typedef struct -{ - char *sourcefile; // "c:\\source.mp3" - char *destfile; // "c:\\dest.pcm" - int destformat[8]; // like 'PCM ',srate,nch,bps - HWND callbackhwnd; // window that will receive the IPC_CB_CONVERT notification messages - - //filled in by winamp.exe - char *error; //if IPC_CONVERTFILE returns 0, the reason will be here - - int bytes_done; //you can look at both of these values for speed statistics - int bytes_total; - int bytes_out; - - int killswitch; // don't set it manually, use IPC_CONVERTFILE_END - int extra_data[64]; // for internal winamp use -} convertFileStruct; - -#define IPC_CONVERTFILE_END 507 -/* (requires Winamp 2.92+) -** Stop/ends a convert process started from IPC_CONVERTFILE -** You need to call this when you receive the IPC_CB_CONVERTDONE message or when you -** want to abort a conversion process -** -** eg: SendMessage(hwnd_winamp,WM_WA_IPC,&myConvertStruct,IPC_CONVERTFILE_END); -** -** No return value -*/ - -typedef struct { - HWND hwndParent; - int format; - - //filled in by winamp.exe - HWND hwndConfig; - int extra_data[8]; -} convertConfigStruct; -#define IPC_CONVERT_CONFIG 508 -#define IPC_CONVERT_CONFIG_END 509 - -typedef struct -{ - void (*enumProc)(int user_data, const char *desc, int fourcc); - int user_data; -} converterEnumFmtStruct; -#define IPC_CONVERT_CONFIG_ENUMFMTS 510 -/* (requires Winamp 2.92+) -*/ - - -typedef struct -{ - char cdletter; - char *playlist_file; - HWND callback_hwnd; - - //filled in by winamp.exe - char *error; -} burnCDStruct; -#define IPC_BURN_CD 511 -/* (requires Winamp 5.0+) -*/ - -typedef struct -{ - convertFileStruct *cfs; - int priority; -} convertSetPriority; -#define IPC_CONVERT_SET_PRIORITY 512 - -typedef struct -{ - char *filename; - char *title; // 2048 bytes - int length; - int force_useformatting; // can set this to 1 if you want to force a url to use title formatting shit -} waHookTitleStruct; -// return TRUE if you hook this -#define IPC_HOOK_TITLES 850 - -#define IPC_GETSADATAFUNC 800 -// 0: returns a char *export_sa_get() that returns 150 bytes of data -// 1: returns a export_sa_setreq(int want); - -#define IPC_ISMAINWNDVISIBLE 900 - - -#define IPC_SETPLEDITCOLORS 920 -typedef struct -{ - int numElems; - int *elems; - HBITMAP bm; // set if you want to override -} waSetPlColorsStruct; - - -// the following IPC use waSpawnMenuParms as parameter -#define IPC_SPAWNEQPRESETMENU 933 -#define IPC_SPAWNFILEMENU 934 //menubar -#define IPC_SPAWNOPTIONSMENU 935 //menubar -#define IPC_SPAWNWINDOWSMENU 936 //menubar -#define IPC_SPAWNHELPMENU 937 //menubar -#define IPC_SPAWNPLAYMENU 938 //menubar -#define IPC_SPAWNPEFILEMENU 939 //menubar -#define IPC_SPAWNPEPLAYLISTMENU 940 //menubar -#define IPC_SPAWNPESORTMENU 941 //menubar -#define IPC_SPAWNPEHELPMENU 942 //menubar -#define IPC_SPAWNMLFILEMENU 943 //menubar -#define IPC_SPAWNMLVIEWMENU 944 //menubar -#define IPC_SPAWNMLHELPMENU 945 //menubar -#define IPC_SPAWNPELISTOFPLAYLISTS 946 - -typedef struct -{ - HWND wnd; - int xpos; // in screen coordinates - int ypos; -} waSpawnMenuParms; - -// waSpawnMenuParms2 is used by the menubar submenus -typedef struct -{ - HWND wnd; - int xpos; // in screen coordinates - int ypos; - int width; - int height; -} waSpawnMenuParms2; - - -// system tray sends this (you might want to simulate it) -#define WM_WA_SYSTRAY WM_USER+1 - -// input plugins send this when they are done playing back -#define WM_WA_MPEG_EOF WM_USER+2 - - - -//// video stuff - -#define IPC_IS_PLAYING_VIDEO 501 // returns >1 if playing, 0 if not, 1 if old version (so who knows):) -#define IPC_GET_IVIDEOOUTPUT 500 // see below for IVideoOutput interface -#define VIDEO_MAKETYPE(A,B,C,D) ((A) | ((B)<<8) | ((C)<<16) | ((D)<<24)) -#define VIDUSER_SET_INFOSTRING 0x1000 -#define VIDUSER_GET_VIDEOHWND 0x1001 -#define VIDUSER_SET_VFLIP 0x1002 - -#ifndef NO_IVIDEO_DECLARE -#ifdef __cplusplus - -class VideoOutput; -class SubsItem; - -typedef struct { - unsigned char* baseAddr; - int32_t rowBytes; -} YV12_PLANE; - -typedef struct { - YV12_PLANE y; - YV12_PLANE u; - YV12_PLANE v; -} YV12_PLANES; - -class IVideoOutput -{ - public: - virtual ~IVideoOutput() { } - virtual int open(int w, int h, int vflip, double aspectratio, unsigned int fmt)=0; - virtual void setcallback(LRESULT (*msgcallback)(void *token, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam), void *token) { } - virtual void close()=0; - virtual void draw(void *frame)=0; - virtual void drawSubtitle(SubsItem *item) { } - virtual void showStatusMsg(const char *text) { } - virtual int get_latency() { return 0; } - virtual void notifyBufferState(int bufferstate) { } /* 0-255*/ - - virtual int extended(int param1, int param2, int param3) { return 0; } // Dispatchable, eat this! -}; -#endif //cplusplus -#endif//NO_IVIDEO_DECLARE - -// these messages are callbacks that you can grab by subclassing the winamp window - -// wParam = -#define IPC_CB_WND_EQ 0 // use one of these for the param -#define IPC_CB_WND_PE 1 -#define IPC_CB_WND_MB 2 -#define IPC_CB_WND_VIDEO 3 -#define IPC_CB_WND_MAIN 4 - -#define IPC_CB_ONSHOWWND 600 -#define IPC_CB_ONHIDEWND 601 - -#define IPC_CB_GETTOOLTIP 602 - -#define IPC_CB_MISC 603 - #define IPC_CB_MISC_TITLE 0 - #define IPC_CB_MISC_VOLUME 1 // volume/pan - #define IPC_CB_MISC_STATUS 2 - #define IPC_CB_MISC_EQ 3 - #define IPC_CB_MISC_INFO 4 - #define IPC_CB_MISC_VIDEOINFO 5 - -#define IPC_CB_CONVERT_STATUS 604 // param value goes from 0 to 100 (percent) -#define IPC_CB_CONVERT_DONE 605 - -#define IPC_ADJUST_FFWINDOWSMENUPOS 606 -/* (requires Winamp 2.9+) -** int newpos=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)adjust_offset,IPC_ADJUST_FFWINDOWSMENUPOS); -** moves where winamp expects the freeform windows in the menubar windows main menu. Useful if you wish to insert a -** menu item above extra freeform windows. -*/ - -#define IPC_ISDOUBLESIZE 608 - -#define IPC_ADJUST_FFOPTIONSMENUPOS 609 -/* (requires Winamp 2.9+) -** int newpos=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)adjust_offset,IPC_ADJUST_FFOPTIONSMENUPOS); -** moves where winamp expects the freeform preferences item in the menubar windows main menu. Useful if you wish to insert a -** menu item above preferences item. -*/ - -#define IPC_GETTIMEDISPLAYMODE 610 // returns 0 if displaying elapsed time or 1 if displaying remaining time - -#define IPC_SETVISWND 611 // param is hwnd, setting this allows you to receive ID_VIS_NEXT/PREVOUS/RANDOM/FS wm_commands -#define ID_VIS_NEXT 40382 -#define ID_VIS_PREV 40383 -#define ID_VIS_RANDOM 40384 -#define ID_VIS_FS 40389 -#define ID_VIS_CFG 40390 -#define ID_VIS_MENU 40391 - -#define IPC_GETVISWND 612 // returns the vis cmd handler hwnd -#define IPC_ISVISRUNNING 613 -#define IPC_CB_VISRANDOM 628 // param is status of random - -#define IPC_SETIDEALVIDEOSIZE 614 // sent by winamp to winamp, trap it if you need it. width=HIWORD(param), height=LOWORD(param) - -#define IPC_GETSTOPONVIDEOCLOSE 615 -#define IPC_SETSTOPONVIDEOCLOSE 616 - -typedef struct { - HWND hwnd; - int uMsg; - int wParam; - int lParam; -} transAccelStruct; - -#define IPC_TRANSLATEACCELERATOR 617 - -typedef struct { - int cmd; - int x; - int y; - int align; -} windowCommand; // send this as param to an IPC_PLCMD, IPC_MBCMD, IPC_VIDCMD - -#define IPC_CB_ONTOGGLEAOT 618 - -#define IPC_GETPREFSWND 619 - -#define IPC_SET_PE_WIDTHHEIGHT 620 // data is a pointer to a POINT structure that holds width & height - -#define IPC_GETLANGUAGEPACKINSTANCE 621 - -#define IPC_CB_PEINFOTEXT 622 // data is a string, ie: "04:21/45:02" - -#define IPC_CB_OUTPUTCHANGED 623 // output plugin was changed in config - -#define IPC_GETOUTPUTPLUGIN 625 - -#define IPC_SETDRAWBORDERS 626 -#define IPC_DISABLESKINCURSORS 627 -#define IPC_CB_RESETFONT 629 - -#define IPC_IS_FULLSCREEN 630 // returns 1 if video or vis is in fullscreen mode -#define IPC_SET_VIS_FS_FLAG 631 // a vis should send this message with 1/as param to notify winamp that it has gone to or has come back from fullscreen mode - -#define IPC_SHOW_NOTIFICATION 632 - -#define IPC_GETSKININFO 633 - -// >>>>>>>>>>> Next is 634 - -#define IPC_PLCMD 1000 - -#define PLCMD_ADD 0 -#define PLCMD_REM 1 -#define PLCMD_SEL 2 -#define PLCMD_MISC 3 -#define PLCMD_LIST 4 - -#define IPC_MBCMD 1001 - -#define MBCMD_BACK 0 -#define MBCMD_FORWARD 1 -#define MBCMD_STOP 2 -#define MBCMD_RELOAD 3 -#define MBCMD_MISC 4 - -#define IPC_VIDCMD 1002 - -#define VIDCMD_FULLSCREEN 0 -#define VIDCMD_1X 1 -#define VIDCMD_2X 2 -#define VIDCMD_LIB 3 -#define VIDPOPUP_MISC 4 - -#define IPC_MBURL 1003 //sets the URL -#define IPC_MBGETCURURL 1004 //copies the current URL into wParam (have a 4096 buffer ready) -#define IPC_MBGETDESC 1005 //copies the current URL description into wParam (have a 4096 buffer ready) -#define IPC_MBCHECKLOCFILE 1006 //checks that the link file is up to date (otherwise updates it). wParam=parent HWND -#define IPC_MBREFRESH 1007 //refreshes the "now playing" view in the library -#define IPC_MBGETDEFURL 1008 //copies the default URL into wParam (have a 4096 buffer ready) - -#define IPC_STATS_LIBRARY_ITEMCNT 1300 // updates library count status - -// IPC 2000-3000 reserved for freeform messages, see gen_ff/ff_ipc.h -#define IPC_FF_FIRST 2000 -#define IPC_FF_LAST 3000 - -#define IPC_GETDROPTARGET 3001 - -#define IPC_PLAYLIST_MODIFIED 3002 // sent to main wnd whenever the playlist is modified - -#define IPC_PLAYING_FILE 3003 // sent to main wnd with the file as parm whenever a file is played -#define IPC_FILE_TAG_MAY_HAVE_UPDATED 3004 // sent to main wnd with the file as parm whenever a file tag might be updated - - -#define IPC_ALLOW_PLAYTRACKING 3007 -// send nonzero to allow, zero to disallow - -#define IPC_HOOK_OKTOQUIT 3010 // return 0 to abort a quit, nonzero if quit is OK - -#define IPC_WRITECONFIG 3011 // pass 2 to write all, 1 to write playlist + common, 0 to write common+less common - -// pass a string to be the name to register, and returns a value > 65536, which is a unique value you can use -// for custom WM_WA_IPC messages. -#define IPC_REGISTER_WINAMP_IPCMESSAGE 65536 - -/**************************************************************************/ - -/* -** Finally there are some WM_COMMAND messages that you can use to send -** Winamp misc commands. -** -** To send these, use: -** -** SendMessage(hwnd_winamp, WM_COMMAND,command_name,0); -*/ - -#define WINAMP_OPTIONS_EQ 40036 // toggles the EQ window -#define WINAMP_OPTIONS_PLEDIT 40040 // toggles the playlist window -#define WINAMP_VOLUMEUP 40058 // turns the volume up a little -#define WINAMP_VOLUMEDOWN 40059 // turns the volume down a little -#define WINAMP_FFWD5S 40060 // fast forwards 5 seconds -#define WINAMP_REW5S 40061 // rewinds 5 seconds - -// the following are the five main control buttons, with optionally shift -// or control pressed -// (for the exact functions of each, just try it out) -#define WINAMP_BUTTON1 40044 -#define WINAMP_BUTTON2 40045 -#define WINAMP_BUTTON3 40046 -#define WINAMP_BUTTON4 40047 -#define WINAMP_BUTTON5 40048 -#define WINAMP_BUTTON1_SHIFT 40144 -#define WINAMP_BUTTON2_SHIFT 40145 -#define WINAMP_BUTTON3_SHIFT 40146 -#define WINAMP_BUTTON4_SHIFT 40147 -#define WINAMP_BUTTON5_SHIFT 40148 -#define WINAMP_BUTTON1_CTRL 40154 -#define WINAMP_BUTTON2_CTRL 40155 -#define WINAMP_BUTTON3_CTRL 40156 -#define WINAMP_BUTTON4_CTRL 40157 -#define WINAMP_BUTTON5_CTRL 40158 - -#define WINAMP_FILE_PLAY 40029 // pops up the load file(s) box -#define WINAMP_FILE_DIR 40187 // pops up the load directory box -#define WINAMP_OPTIONS_PREFS 40012 // pops up the preferences -#define WINAMP_OPTIONS_AOT 40019 // toggles always on top -#define WINAMP_HELP_ABOUT 40041 // pops up the about box :) - -#define ID_MAIN_PLAY_AUDIOCD1 40323 // starts playing the audio CD in the first CD reader -#define ID_MAIN_PLAY_AUDIOCD2 40323 // plays the 2nd -#define ID_MAIN_PLAY_AUDIOCD3 40323 // plays the 3nd -#define ID_MAIN_PLAY_AUDIOCD4 40323 // plays the 4nd - -// IDs 42000 to 45000 are reserved for gen_ff -// IDs from 45000 to 57000 are reserved for library - - -#define IPC_GET_RANDFUNC 3015 // returns a function to get a random number -#define IPC_REGISTER_LOWORD_COMMAND 3019 // assigns you a unique ID to make your own commands (for menus, etc) -#define IPC_GET_PROXY_STRING 3023 - - -#endif//_WA_IPC_H_ - -/* -** EOF.. Enjoy. -*/ \ No newline at end of file diff --git a/Windows/winamp/In2.h b/Windows/winamp/In2.h deleted file mode 100644 index 802592f..0000000 --- a/Windows/winamp/In2.h +++ /dev/null @@ -1,103 +0,0 @@ -#include "out.h" - -// note: exported symbol is now winampGetInModule2. - -#define IN_VER 0x100 - -typedef struct -{ - int version; // module type (IN_VER) - char *description; // description of module, with version string - - HWND hMainWindow; // winamp's main window (filled in by winamp) - HINSTANCE hDllInstance; // DLL instance handle (Also filled in by winamp) - - char *FileExtensions; // "mp3\0Layer 3 MPEG\0mp2\0Layer 2 MPEG\0mpg\0Layer 1 MPEG\0" - // May be altered from Config, so the user can select what they want - - int is_seekable; // is this stream seekable? - int UsesOutputPlug; // does this plug-in use the output plug-ins? (musn't ever change, ever :) - - void (*Config)(HWND hwndParent); // configuration dialog - void (*About)(HWND hwndParent); // about dialog - - void (*Init)(); // called at program init - void (*Quit)(); // called at program quit - - void (*GetFileInfo)(char *file, char *title, int *length_in_ms); // if file == NULL, current playing is used - int (*InfoBox)(char *file, HWND hwndParent); - - int (*IsOurFile)(char *fn); // called before extension checks, to allow detection of mms://, etc - // playback stuff - int (*Play)(char *fn); // return zero on success, -1 on file-not-found, some other value on other (stopping winamp) error - void (*Pause)(); // pause stream - void (*UnPause)(); // unpause stream - int (*IsPaused)(); // ispaused? return 1 if paused, 0 if not - void (*Stop)(); // stop (unload) stream - - // time stuff - int (*GetLength)(); // get length in ms - int (*GetOutputTime)(); // returns current output time in ms. (usually returns outMod->GetOutputTime() - void (*SetOutputTime)(int time_in_ms); // seeks to point in stream (in ms). Usually you signal yoru thread to seek, which seeks and calls outMod->Flush().. - - // volume stuff - void (*SetVolume)(int volume); // from 0 to 255.. usually just call outMod->SetVolume - void (*SetPan)(int pan); // from -127 to 127.. usually just call outMod->SetPan - - // in-window builtin vis stuff - - void (*SAVSAInit)(int maxlatency_in_ms, int srate); // call once in Play(). maxlatency_in_ms should be the value returned from outMod->Open() - // call after opening audio device with max latency in ms and samplerate - void (*SAVSADeInit)(); // call in Stop() - - - // simple vis supplying mode - void (*SAAddPCMData)(void *PCMData, int nch, int bps, int timestamp); - // sets the spec data directly from PCM data - // quick and easy way to get vis working :) - // needs at least 576 samples :) - - // advanced vis supplying mode, only use if you're cool. Use SAAddPCMData for most stuff. - int (*SAGetMode)(); // gets csa (the current type (4=ws,2=osc,1=spec)) - // use when calling SAAdd() - void (*SAAdd)(void *data, int timestamp, int csa); // sets the spec data, filled in by winamp - - - // vis stuff (plug-in) - // simple vis supplying mode - void (*VSAAddPCMData)(void *PCMData, int nch, int bps, int timestamp); // sets the vis data directly from PCM data - // quick and easy way to get vis working :) - // needs at least 576 samples :) - - // advanced vis supplying mode, only use if you're cool. Use VSAAddPCMData for most stuff. - int (*VSAGetMode)(int *specNch, int *waveNch); // use to figure out what to give to VSAAdd - void (*VSAAdd)(void *data, int timestamp); // filled in by winamp, called by plug-in - - - // call this in Play() to tell the vis plug-ins the current output params. - void (*VSASetInfo)(int nch, int srate); - - - // dsp plug-in processing: - // (filled in by winamp, called by input plug) - - // returns 1 if active (which means that the number of samples returned by dsp_dosamples - // could be greater than went in.. Use it to estimate if you'll have enough room in the - // output buffer - int (*dsp_isactive)(); - - // returns number of samples to output. This can be as much as twice numsamples. - // be sure to allocate enough buffer for samples, then. - int (*dsp_dosamples)(short int *samples, int numsamples, int bps, int nch, int srate); - - - // eq stuff - void (*EQSet)(int on, char data[10], int preamp); // 0-64 each, 31 is +0, 0 is +12, 63 is -12. Do nothing to ignore. - - // info setting (filled in by winamp) - void (*SetInfo)(int bitrate, int srate, int stereo, int synched); // if -1, changes ignored? :) - - Out_Module *outMod; // filled in by winamp, optionally used :) -} In_Module; - - diff --git a/Windows/winamp/Out.h b/Windows/winamp/Out.h deleted file mode 100644 index 0dae194..0000000 --- a/Windows/winamp/Out.h +++ /dev/null @@ -1,62 +0,0 @@ - -// ids: -// waveout: 32 -// gapless: 64 -// xfade: 63 -// disk: 33 -// dsound: 38 -// NULL: 65 -// mm2: 69 - -#define OUT_VER 0x10 - -typedef struct -{ - int version; // module version (OUT_VER) - char *description; // description of module, with version string - int id; // module id. each input module gets its own. non-nullsoft modules should - // be >= 65536. - - HWND hMainWindow; // winamp's main window (filled in by winamp) - HINSTANCE hDllInstance; // DLL instance handle (filled in by winamp) - - void (*Config)(HWND hwndParent); // configuration dialog - void (*About)(HWND hwndParent); // about dialog - - void (*Init)(); // called when loaded - void (*Quit)(); // called when unloaded - - int (*Open)(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms); - // returns >=0 on success, <0 on failure - // NOTENOTENOTE: bufferlenms and prebufferms are ignored in most if not all output plug-ins. - // ... so don't expect the max latency returned to be what you asked for. - // returns max latency in ms (0 for diskwriters, etc) - // bufferlenms and prebufferms must be in ms. 0 to use defaults. - // prebufferms must be <= bufferlenms - - void (*Close)(); // close the ol' output device. - - int (*Write)(char *buf, int len); - // 0 on success. Len == bytes to write (<= 8192 always). buf is straight audio data. - // 1 returns not able to write (yet). Non-blocking, always. - - int (*CanWrite)(); // returns number of bytes possible to write at a given time. - // Never will decrease unless you call Write (or Close, heh) - - int (*IsPlaying)(); // non0 if output is still going or if data in buffers waiting to be - // written (i.e. closing while IsPlaying() returns 1 would truncate the song - - int (*Pause)(int pause); // returns previous pause state - - void (*SetVolume)(int volume); // volume is 0-255 - void (*SetPan)(int pan); // pan is -128 to 128 - - void (*Flush)(int t); // flushes buffers and restarts output at time t (in ms) - // (used for seeking) - - int (*GetOutputTime)(); // returns played time in MS - int (*GetWrittenTime)(); // returns time written in MS (used for synching up vis stuff) - -} Out_Module; - - diff --git a/Windows/zvuk_win.cpp b/Windows/zvuk_win.cpp deleted file mode 100644 index 2050cf3..0000000 --- a/Windows/zvuk_win.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include -#include - -extern "C" - { - -int mix_back_sound(int synchro) - { - - return 0; - } - -int get_timer_value() - { - return GetTickCount()/TIMERSPEED; - } - - -int get_snd_effect(int funct) - { - return 0; - } - -char set_snd_effect(int funct,int data) - { - return 0; - } - -char check_snd_effect(int funct) - { - return 0; - } - -void change_music(char *filename) - { - - } - - -void set_backsnd_freq(int freq) - { - - } - -void fade_music() - { - - } - -void set_mixing_device(int mix_dev,int mix_freq,...) - { - } -char start_mixing() - { - return 0; - } -void stop_mixing() - { - } -void play_sample(int channel,void *sample,int32_t size,int32_t lstart,int32_t sfreq,int type) - { - } -void set_channel_volume(int channel,int left,int right) - { - } -int open_backsound(char *filename) - { - return 0; - } -char *device_name(int device) - { - return ""; - } -void force_music_volume(int volume) - { - } -char get_channel_state(int channel) - { - return 0; - } -void get_channel_volume(int channel,int *left,int *right) - { - } -void mute_channel(int channel) - { - } -void chan_break_loop(int channel) - { - } -void chan_break_ext(int channel,void *org_sample,int32_t size_sample) //zrusi loop s moznosti dohrat zvuk - { - } - - } - diff --git a/ZVUK/ANALYSE/DOSMEM.C b/ZVUK/ANALYSE/DOSMEM.C deleted file mode 100644 index 752670a..0000000 --- a/ZVUK/ANALYSE/DOSMEM.C +++ /dev/null @@ -1,71 +0,0 @@ -/*********************************************/ -/*** DOS memory allocation - DOSMEM.C ***/ -/*** vykostena verze chlumakova memalloc.c ***/ -/*********************************************/ - -#include -#include -#include -#include -#include "dosmem.h" - - -/*** Alokace pole v dolni pameti ***/ - -void *mem_alloc(int size) -{ - static union REGS r; - MEMREC memrec; - - r.x.eax=0x0100; - r.x.ebx=(size>>4)+1; - size=r.x.ebx<<4; - int386(0x31,&r,&r); - if (r.x.cflag) - { - printf ("No fucking DOS memory left!!!"); - exit(1); - } - memrec.ptr=(void *)((r.x.eax&0xFFFF)<<4); - Selector=memrec.selector=(short int)r.x.edx; - - return memrec.ptr; -} - - -/*** Uvolneni dolni pameti ***/ - -void mem_free(void *ptr) -{ - union REGS r; - - if(ptr!=NULL) - { - r.x.eax=0x0101; - r.x.edx=Selector; - int386(0x31,&r,&r); - if(r.x.cflag) - printf("Cannot free DOS memory!!!!"); - } - -} - - -/*** Vyvolani preruseni pomoci protected modu ***/ - -void WtNs386(int IntNum, DPMIREGS *dpmiregs) -{ - union REGS r; - struct SREGS sr; - - r.w.ax=0x300; - r.h.bl=(char)IntNum; - r.h.bh=0; - r.w.cx=0; - segread(&sr); - sr.es=FP_SEG(dpmiregs); - r.x.edi=FP_OFF(dpmiregs); - - int386x(0x31,&r,&r,&sr); -} - diff --git a/ZVUK/ANALYSE/DOSMEM.H b/ZVUK/ANALYSE/DOSMEM.H deleted file mode 100644 index b33588d..0000000 --- a/ZVUK/ANALYSE/DOSMEM.H +++ /dev/null @@ -1,46 +0,0 @@ -/************************************/ -/*** Hlavickovt soubor k DOSMEM.H ***/ -/************************************/ - - -typedef enum -{ DOS_MEMORY, - NEW, -} MEMORY_ITEMS; - -typedef struct -{ int EDI; - int ESI; - int EBP; - int reserved; - int EBX; - int EDX; - int ECX; - int EAX; - short int Flags; - short int ES; - short int DS; - short int GS; - short int IP; - short int CS; - short int SP; - short int SS; - } DPMIREGS; - -typedef struct -{ void *ptr; - int size; - int selector; //smysl jen u DOS_MEMORY - } MEMREC; - -#define D32RealSeg(P) ((((unsigned int)(P))>>4)&0xFFFF) -#define D32RealOff(P) (((unsigned int)(P))&0xF) - -int Selector; -DPMIREGS dpmiregs; - -void *mem_alloc(int size); -void mem_free(void *ptr); -void WtNs386(int IntNum, DPMIREGS *dpmiregs); - - diff --git a/ZVUK/ANALYSE/FLC.C b/ZVUK/ANALYSE/FLC.C deleted file mode 100644 index 5994eb7..0000000 --- a/ZVUK/ANALYSE/FLC.C +++ /dev/null @@ -1,5 +0,0 @@ -// -// Knihovna pro dekompresi FLC souboru -// - -#include "flc.h" diff --git a/ZVUK/ANALYSE/FLC.H b/ZVUK/ANALYSE/FLC.H deleted file mode 100644 index 15f903a..0000000 --- a/ZVUK/ANALYSE/FLC.H +++ /dev/null @@ -1,54 +0,0 @@ -// -// Hlavickovy soubor ke knihovne FLC.C slouzici k dekompresi FLC -// - -#ifndef _FLC_H -#define _FLC_H - -typedef struct FLCHEADER { - unsigned int size; // delka souboru vcetne hlavicky - unsigned short idflc; // ID FLC=0AF12h - unsigned short frames; // pocet frejmu - unsigned short width; // sirka vsech obrazku - unsigned short height; // vyska vsech obrazku - unsigned short color; // hloubka barvy (bpp) - unsigned short flag1; - unsigned int speed; // rychlost prehravani (v 1/1000 s) - unsigned short reserv1; // rezervovany - unsigned int date1; // datum a cas vytvoreni - unsigned int serial; // seriove cislo programu - unsigned int date2; // datum a cas posledni zmeny - unsigned short XA; - unsigned short YA; - char reserv2 [42]; // rezervovano - unsigned int offset1; // offset prvniho frame - unsigned int offset2; // offset druheho frame - char reserv3 [40]; // rezervovano - } flcheader; - -typedef struct FRAMEHEADER { - unsigned int size; // velikost frame v bytech - unsigned short sign; // znacka frame OFAF1h - unsigned short actions; // pocet akci v tomto frame - char reserv [8]; // rezervovano - } frameheader; - -typedef struct ACTIONHEADER { - unsigned int size; // velikost akce v bytech - unsigned short code; // kod akce - // 04h - predani casti nebo cele palety - // 07h - predavani zmenenych casti obrazu - // 0Dh - vymaze obrazovku - // 0Fh - cela obrazovka v RLE - // 10h - nekomprimovana kopie cele obrazovky - // nasleduji data akce - } actionheader; - -char frame_buffer [307200]; -char *flc_buffer; - -void Get_first_frame (void); -void Get_next_frame (void); -void Decompress_frame (void); - -#endif diff --git a/ZVUK/ANALYSE/PLAY.C b/ZVUK/ANALYSE/PLAY.C deleted file mode 100644 index d5aaca9..0000000 --- a/ZVUK/ANALYSE/PLAY.C +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include "flc.h" - -flcheader h_flc; -frameheader h_frame; -actionheader h_action; - - -void main (int argc, char *argv[]) -{ - FILE *flc; - long pozice; - int frames, actions, x, y; - - flc = fopen (argv[1], "rb"); - fread (&h_flc, sizeof(flcheader), 1, flc); - frames=h_flc.frames; - - printf ("\nHlavicka FLC souboru %s:\n", argv[1]); - printf ("Delka celeho souboru: %d\n", h_flc.size); - printf ("Pocet frame: %d\n", h_flc.frames); - printf ("Velikost filmu: %dx%d\n", h_flc.width, h_flc.height); - printf ("Hloubka barvy: %d\n", h_flc.color); - printf ("Rychlost prehravani: %d fps\n", 1000/h_flc.speed); - printf ("Offset prvniho frame: %d\n", h_flc.offset1); - - fseek (flc, h_flc.offset1, SEEK_SET); - for (x=0; x<=(frames-1); x++) - { - fread (&h_frame, sizeof(frameheader), 1, flc); - actions=h_frame.actions; - printf ("\nHlavicka %d framu:\n", x+1); - printf ("Velikost framu: %d\n", h_frame.size); - printf ("Pocet akci ve framu: %d\n", h_frame.actions); - - for (y=0; y<=(actions-1); y++) - { - pozice = ftell (flc); - fread (&h_action, sizeof(actionheader), 1, flc); - fseek (flc, (pozice+h_action.size), SEEK_SET); - printf ("\nHlavicka %d akce:\n", y+1); - printf ("Velikost dat pro tuto akci: %d\n", h_action.size); - printf ("Kod akce: %x\n", h_action.code); - } - getch (); - _clearscreen (_GCLEARSCREEN); - } - - fclose (flc); -} - - diff --git a/ZVUK/ANALYSE/VESA.C b/ZVUK/ANALYSE/VESA.C deleted file mode 100644 index a59e4d4..0000000 --- a/ZVUK/ANALYSE/VESA.C +++ /dev/null @@ -1,296 +0,0 @@ -/********************************/ -/* Prace se SVGA VESA adapterem */ -/********************************/ - -#include -#include -#include -#include -#include "vesa.h" -#include "dosmem.h" - - extern void wm_ChangeBank_(int bank); - #pragma aux (ASM) wm_ChangeBank_; - - -void Set_VESA_mode (int mode) -{ - union REGS r; - - r.w.ax=0x4f02; - r.w.bx=mode; - int386 (0x10, &r, &r); -} - - -void Show_screen (char *display) -{ - wm_ChangeBank_ (0); - memmove (0xa0000, display, 65536); - wm_ChangeBank_ (1); - memmove (0xa0000, (display+65536), 65536); - wm_ChangeBank_ (2); - memmove (0xa0000, (display+131072), 65536); - wm_ChangeBank_ (3); - memmove (0xa0000, (display+196608), 65536); - wm_ChangeBank_ (4); - memmove (0xa0000, (display+262144), 45056); -} - -void Put_image (int x, int y, int xlen, int ylen, char *image) -{ - int a,b,c,d; - long int posunuti=0; - int banka; - - if (y<103) {wm_ChangeBank_ (0); banka=0;} - if (y>103 && y<205) {wm_ChangeBank_ (1); banka=1;} - if (y>205 && y<308) {wm_ChangeBank_ (2); banka=2;} - if (y>308 && y<410) {wm_ChangeBank_ (3); banka=3;} - if (y>410) {wm_ChangeBank_ (4); banka=4;} - - for (a=0; a<=ylen; a++) - { - - d=y+a; - switch (d) - { - case 102: - if ((x+xlen)<256){ - posunuti=(y+a)*640+x; - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (1); banka=1;} - if (x>=256){ - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - } - if (x<256 && (x+xlen)>256){ - posunuti=(y+a)*640+x; b=x; c=0; - while (b!=256) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - case 204: - if ((x+xlen)<512){ - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (2); banka=2;} - if (x>=512){ - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<512 && (x+xlen)>512){ - posunuti=(((y+a)*640+x)-65536); b=x; c=0; - while (b!=512) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - case 307: - if ((x+xlen)<128){ - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (3); banka=3;} - if (x>=128){ - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<128 && (x+xlen)>128){ - posunuti=(((y+a)*640+x)-131072); b=x; c=0; - while (b!=128) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - case 409: - if ((x+xlen)<384){ - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (4); banka=4;} - if (x>=384){ - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<384 && (x+xlen)>384){ - posunuti=(((y+a)*640+x)-196608); b=x; c=0; - while (b!=384) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - default: - posunuti=(y+a)*640+x-banka*65536; - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - break; - }; - } -} - -void Get_image (int x, int y, int xlen, int ylen, char *image) -{ - int a,b,c,d; - long int posunuti=0; - int banka; - - if (y<103) {wm_ChangeBank_ (0); banka=0;} - if (y>103 && y<205) {wm_ChangeBank_ (1); banka=1;} - if (y>205 && y<308) {wm_ChangeBank_ (2); banka=2;} - if (y>308 && y<410) {wm_ChangeBank_ (3); banka=3;} - if (y>410) {wm_ChangeBank_ (4); banka=4;} - - for (a=0; a<=ylen; a++) - { - - d=y+a; - switch (d) - { - case 102: - if ((x+xlen)<256){ - posunuti=(y+a)*640+x; - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (1); banka=1;} - if (x>=256){ - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - } - if (x<256 && (x+xlen)>256){ - posunuti=(y+a)*640+x; b=x; c=0; - while (b!=256) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - case 204: - if ((x+xlen)<512){ - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (2); banka=2;} - if (x>=512){ - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<512 && (x+xlen)>512){ - posunuti=(((y+a)*640+x)-65536); b=x; c=0; - while (b!=512) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - case 307: - if ((x+xlen)<128){ - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (3); banka=3;} - if (x>=128){ - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<128 && (x+xlen)>128){ - posunuti=(((y+a)*640+x)-131072); b=x; c=0; - while (b!=128) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - case 409: - if ((x+xlen)<384){ - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (4); banka=4;} - if (x>=384){ - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<384 && (x+xlen)>384){ - posunuti=(((y+a)*640+x)-196608); b=x; c=0; - while (b!=384) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - default: - posunuti=(y+a)*640+x-banka*65536; - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - break; - }; - } - -} - - -void Get_VESA_info (void) -{ - char far *str; - VESA_INFO_BLOCK *p; - - p=(VESA_INFO_BLOCK *)mem_alloc(sizeof(VESA_INFO_BLOCK)); - - memset(&dpmiregs,0,sizeof(DPMIREGS)); - dpmiregs.EAX=0x00004f00; - dpmiregs.DS=D32RealSeg(p); - dpmiregs.ES=D32RealSeg(p); - dpmiregs.EDI=D32RealOff(p); - - WtNs386(0x10,&dpmiregs); - - str=(char far *)MK_FP(Selector,0); - _fmemcpy(&VesaInfoBlock,str,sizeof(VESA_INFO_BLOCK)); - - mem_free(p); - if(dpmiregs.EAX!=0x4f) - { - printf ("VESA Bios extension not found!!!!"); - exit (1); - } -} - - -void Get_mode_info (int mode) -{ - char far *str; - VESA_MODE_INFO_BLOCK *p; - - p=(VESA_MODE_INFO_BLOCK *)mem_alloc(sizeof(VESA_MODE_INFO_BLOCK)); - - memset(&dpmiregs,0,sizeof(DPMIREGS)); //nuluje registry - dpmiregs.EAX=0x00004f01; - dpmiregs.DS=D32RealSeg(p); - dpmiregs.ES=D32RealSeg(p); - dpmiregs.EDI=D32RealOff(p); - dpmiregs.ECX=mode; - - WtNs386(0x10,&dpmiregs); - - str=(char far *)MK_FP(Selector,0); - _fmemcpy(&VesaModeInfoBlock,str,sizeof(VESA_INFO_BLOCK)); - - _VGAGran=VesaModeInfoBlock.WinGranularity; - - mem_free(p); -} - diff --git a/ZVUK/ANALYSE/VESA.H b/ZVUK/ANALYSE/VESA.H deleted file mode 100644 index a0f12a2..0000000 --- a/ZVUK/ANALYSE/VESA.H +++ /dev/null @@ -1,70 +0,0 @@ -/********************************/ -/* Prace se SVGA VESA adapterem */ -/********************************/ - -#ifndef __VESA_H -#define __VESA_H - - -typedef struct -{ char VESASignature[4]; - short VESAversion; - unsigned OEMStringPtr; - char capabilities[4]; - short int *videomodeptr; - short int TotalMemory; - char dummy[236]; - } VESA_INFO_BLOCK; - -typedef struct -{ short unsigned ModeAttributes; - char WinAAttributes; - char WinBAttributes; - short unsigned WinGranularity; - short unsigned WinSize; - short unsigned WinASegment; - short unsigned WinBSegment; - short unsigned WinFuncPtroff; - short unsigned WinFuncPtrseg; - short unsigned BytesPerScanLine; - - short unsigned XResolution; - short unsigned YResolution; - char Xcharsize; - char Ycharsize; - char NumberOfPlanes; - char BitsPerPixel; - char NumberOfBanks; - char MemoryModel; - char BankSize; - char NumberOfImagePages; - char Reserved; - - char RedMaskSize; - char RedFieldPosition; - char GreenMaskSize; - char GreenFieldPosition; - char BlueMaskSize; - char BlueFieldPosition; - char RsvdMaskSize; - char DirectColorModeInfo; - char Dummy[216]; - } VESA_MODE_INFO_BLOCK; - - -VESA_MODE_INFO_BLOCK VesaModeInfoBlock; -VESA_INFO_BLOCK VesaInfoBlock; - -extern unsigned char _VGAPage=0; -extern unsigned char _VGAGran=0; - -void Set_VESA_mode (int mode); -void Show_screen (char *display); -void Get_VESA_info (void); -void Get_mode_info (int mode); - -void Put_image (int x, int y, int xlen, int ylen, char *image); -void Get_image (int x, int y, int xlen, int ylen, char *image); - -#endif - diff --git a/ZVUK/ANALYSE/VESA_.ASM b/ZVUK/ANALYSE/VESA_.ASM deleted file mode 100644 index d11920c..0000000 --- a/ZVUK/ANALYSE/VESA_.ASM +++ /dev/null @@ -1,63 +0,0 @@ -;EAX EDX EBX ECX -.386p -jumps -;############################################################################ -; Constanty -;############################################################################ - -dlt_x equ 640 -dlt_y equ 480 - -;############################################################################ -; Datovy segment -;############################################################################ -_DATA SEGMENT PARA PUBLIC USE32 'DATA' -align 4 - - -EXTRN __VGAPage:BYTE -EXTRN __VGAGran:BYTE - - -_DATA ENDS - -DGROUP GROUP _DATA - -;############################################################################ -; Kodovy segment -;############################################################################ -_TEXT SEGMENT PARA PUBLIC USE32 'CODE' - ASSUME cs:_TEXT, ds:_DATA - - - -public wm_ChangeBank__ -wm_ChangeBank__ PROC - - push es - pushad - - push eax - mov edx, eax - mov ebx, 0000h - mov eax, 4f05h - int 10h - - pop eax - mov edx, eax - mov ebx, 0001h - mov eax, 4f05h - int 10h - - popad - pop es - ret - -wm_ChangeBank__ endp -;---------------------------------------------------------------------------- - -_TEXT ENDS - -END - - diff --git a/ZVUK/DOSMEM.C b/ZVUK/DOSMEM.C deleted file mode 100644 index 752670a..0000000 --- a/ZVUK/DOSMEM.C +++ /dev/null @@ -1,71 +0,0 @@ -/*********************************************/ -/*** DOS memory allocation - DOSMEM.C ***/ -/*** vykostena verze chlumakova memalloc.c ***/ -/*********************************************/ - -#include -#include -#include -#include -#include "dosmem.h" - - -/*** Alokace pole v dolni pameti ***/ - -void *mem_alloc(int size) -{ - static union REGS r; - MEMREC memrec; - - r.x.eax=0x0100; - r.x.ebx=(size>>4)+1; - size=r.x.ebx<<4; - int386(0x31,&r,&r); - if (r.x.cflag) - { - printf ("No fucking DOS memory left!!!"); - exit(1); - } - memrec.ptr=(void *)((r.x.eax&0xFFFF)<<4); - Selector=memrec.selector=(short int)r.x.edx; - - return memrec.ptr; -} - - -/*** Uvolneni dolni pameti ***/ - -void mem_free(void *ptr) -{ - union REGS r; - - if(ptr!=NULL) - { - r.x.eax=0x0101; - r.x.edx=Selector; - int386(0x31,&r,&r); - if(r.x.cflag) - printf("Cannot free DOS memory!!!!"); - } - -} - - -/*** Vyvolani preruseni pomoci protected modu ***/ - -void WtNs386(int IntNum, DPMIREGS *dpmiregs) -{ - union REGS r; - struct SREGS sr; - - r.w.ax=0x300; - r.h.bl=(char)IntNum; - r.h.bh=0; - r.w.cx=0; - segread(&sr); - sr.es=FP_SEG(dpmiregs); - r.x.edi=FP_OFF(dpmiregs); - - int386x(0x31,&r,&r,&sr); -} - diff --git a/ZVUK/DOSMEM.H b/ZVUK/DOSMEM.H deleted file mode 100644 index b33588d..0000000 --- a/ZVUK/DOSMEM.H +++ /dev/null @@ -1,46 +0,0 @@ -/************************************/ -/*** Hlavickovt soubor k DOSMEM.H ***/ -/************************************/ - - -typedef enum -{ DOS_MEMORY, - NEW, -} MEMORY_ITEMS; - -typedef struct -{ int EDI; - int ESI; - int EBP; - int reserved; - int EBX; - int EDX; - int ECX; - int EAX; - short int Flags; - short int ES; - short int DS; - short int GS; - short int IP; - short int CS; - short int SP; - short int SS; - } DPMIREGS; - -typedef struct -{ void *ptr; - int size; - int selector; //smysl jen u DOS_MEMORY - } MEMREC; - -#define D32RealSeg(P) ((((unsigned int)(P))>>4)&0xFFFF) -#define D32RealOff(P) (((unsigned int)(P))&0xF) - -int Selector; -DPMIREGS dpmiregs; - -void *mem_alloc(int size); -void mem_free(void *ptr); -void WtNs386(int IntNum, DPMIREGS *dpmiregs); - - diff --git a/ZVUK/EXAMPLE.ASM b/ZVUK/EXAMPLE.ASM deleted file mode 100644 index 9de1631..0000000 --- a/ZVUK/EXAMPLE.ASM +++ /dev/null @@ -1,67 +0,0 @@ -.model small -.386 - -DGROUP group _DATA - - -tchannel struct - PLAYPOS DD ? - STARTLOOP DD ? - ENDLOOP DD ? - SPEEDMAJ DD ? - SPEEDMIN DW ? - MINORPOS DW ? - SMPTYPE DW ?;0 - DISABLED, 1 - 8 BIT, 2 - 16 BIT - VOLUMELEFT DW ? - VOLUMERIGHT DW ? -tchannel ends - -extrn _chaninfo:dword -extrn _mixbuffer:dword -extrn _backsnd:dword ;ukazatel na buffer s hudbou na pozadi (64Kb) -extrn _backstep:dword ;krok o kolik se meni _backsnd -extrn _backsndbuff:dword ;buffer hudby na pozadi - - -extrn _jumptable:dword[3] ;[0] - skip, [1] - mix8, [2] - mix16 -extrn _getdma:dword -extrn _ido:dword - -extrn _predstih:word -extrn _lastdma:dword -extrn _lastmix:dword -extrn _surpos:dword -extrn _mixpos:dword -extrn _mixsize:dword - -extrn _dmaposadr:dword -extrn _dpmiselector:word - - - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - - PUBLIC _MIXER -_MIXER: ;THIS IS MAIN MIXING PROCEDURE. - ;BEFORE USING, YOU MUST SET UP ALL VARIBLES TO THE CORRECT VALUES. - ;_MIXBUFFER MUST START ON PAGE OF MEMORY (EXP 0x10000 0x20000 0x30000) - ;PROCEDURE MUST BE CALLED EACH 18ms OR LITTLE. - ;IF YOU USING INTERRUPT, REMEBER, THAT YOU MUST STORE ALL REGISTERS - ;BEFORE USE. - -; CALL calcsize ;VYPOCET DELKY MIXOVANI - mov edi,_mixpos ;Nejprve se vymaze mixovaci pamet - mov ecx,_mixsize - shr ecx,2 - xor eax,eax -MIXCLR: mov [edi],eax - add di,4 - dec ecx - jnz MIXCLR - mov ebx,_chaninfo ;TED SE ZACNE MIXOVAT -MIXING: xor eax,eax - mov ax,[ebx]offset tchannel.smptype -_TEXT ends -end diff --git a/ZVUK/FLC.C b/ZVUK/FLC.C deleted file mode 100644 index 62e38b3..0000000 --- a/ZVUK/FLC.C +++ /dev/null @@ -1,176 +0,0 @@ -// -// Knihovna pro dekompresi FLC souboru -// - -#include -#include -#include -#include -#include -#include "flc.h" - - -void Open_FLC (char *filename) -{ - flc = fopen (filename, "rb"); - fread (&h_flc, sizeof(flcheader), 1, flc); -} - -void Close_FLC (void) -{ - fclose (flc); - free (flc_buffer); -} - -void Get_first_frame (void) -{ - fseek (flc, h_flc.offset1, SEEK_SET); - fread (&h_frame, sizeof(frameheader), 1, flc); - flc_buffer = (char*)malloc((h_frame.size-sizeof(frameheader))); - fread (flc_buffer, (h_frame.size-sizeof(frameheader)), 1, flc); -} - -void Get_next_frame (void) -{ - free (flc_buffer); - fread (&h_frame, sizeof(frameheader), 1, flc); - flc_buffer = (char*)malloc((h_frame.size-sizeof(frameheader))); - fread (flc_buffer, (h_frame.size-sizeof(frameheader)), 1, flc); -} - -void Decompress_frame (void) -{ - unsigned short x,y,z,w; - unsigned short changes, nfo_word, packets, offset, row; - int frame_pos=0; - unsigned int scr_pos; - char c1, c2, c3, a; - char hi, lo; - - for (z=1; z<=h_frame.actions; z++) - { - memmove ( &h_action, (flc_buffer+frame_pos), sizeof(actionheader) ); - switch (h_action.code) - { - case 4: - a=1;//fcl_buffer[frame_pos]; -// b=0;//flc_buffer[frame_pos]; -// c=256; //0=256 - - frame_pos+=10; - outp (0x3c8, 0); - for (x=0; x<=768; x++) outp (0x3c9, (flc_buffer[(x+frame_pos)]/=4) ); - frame_pos+=768; - break; - case 7: - frame_pos+=6; - lo=flc_buffer[frame_pos]; frame_pos++; - hi=flc_buffer[frame_pos]; frame_pos++; - changes=hi*256+lo; - row=0; - - for (y=0; y<=(changes-1); y++) // pocet menenych radek - { - lo=flc_buffer[frame_pos]; frame_pos++; - hi=flc_buffer[frame_pos]; frame_pos++; - nfo_word=hi*256+lo; - - scr_pos=row*h_flc.width; - - if (nfo_word>=0xC000) // preskakovane radky - { - nfo_word=0xFFFF-nfo_word+1; - row+=nfo_word; - } - - else - { - for (z=1; z<=nfo_word; z++) // pocet menenych bloku - { - x=1; a=0; - - offset = flc_buffer[frame_pos]; // rel. offset bloku - frame_pos++; - scr_pos+=offset; - -// while (!a) // zmena bloku -// { - c1 = flc_buffer[frame_pos]; - frame_pos++; - - if (c1>128) - { - c1=0xFF-c1+1; - c2=flc_buffer[frame_pos]; - frame_pos++; - c3=flc_buffer[frame_pos]; - frame_pos++; - - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=c2; - scr_pos++; - frame_buffer[scr_pos]=c3; - scr_pos++; } - } - else - { -// c3=0xFF-c3+1; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=flc_buffer[frame_pos]; - frame_pos++; - scr_pos++; - frame_buffer[scr_pos]=flc_buffer[frame_pos]; - frame_pos++; - scr_pos++; } - } - -// if (x>=640) a=1; -// } - - } - row++; - } - } - -// frame_pos+=h_action.size; - break; - case 15: - frame_pos+=6; - for (y=0; y<=(h_flc.height-1); y++) - { - frame_pos++; x=1; //a=0; - scr_pos=y*h_flc.width; - - while (x<=h_flc.width) - { - c1 = flc_buffer[frame_pos]; - frame_pos++; - - if (c1<128) - { - c2=flc_buffer[frame_pos]; - frame_pos++; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=c2; - scr_pos++; - x++; } - } - else - { - c1=0xFF-c1+1; - for (w=1; w<=c1; w++) - { frame_buffer[scr_pos]=flc_buffer[frame_pos]; - scr_pos++; - frame_pos++; - x++; } - } - } - } - break; - default: frame_pos+=h_action.size; - break; - }; - - } - -} diff --git a/ZVUK/FLC.H b/ZVUK/FLC.H deleted file mode 100644 index 012a222..0000000 --- a/ZVUK/FLC.H +++ /dev/null @@ -1,61 +0,0 @@ -// -// Hlavickovy soubor ke knihovne FLC.C slouzici k dekompresi FLC -// - -#ifndef _FLC_H -#define _FLC_H - -typedef struct FLCHEADER { - unsigned int size; // delka souboru vcetne hlavicky - unsigned short idflc; // ID FLC=0AF12h - unsigned short frames; // pocet frejmu - unsigned short width; // sirka vsech obrazku - unsigned short height; // vyska vsech obrazku - unsigned short color; // hloubka barvy (bpp) - unsigned short flag1; - unsigned int speed; // rychlost prehravani (v 1/1000 s) - unsigned short reserv1; // rezervovany - unsigned int date1; // datum a cas vytvoreni - unsigned int serial; // seriove cislo programu - unsigned int date2; // datum a cas posledni zmeny - unsigned short XA; - unsigned short YA; - char reserv2 [42]; // rezervovano - unsigned int offset1; // offset prvniho frame - unsigned int offset2; // offset druheho frame - char reserv3 [40]; // rezervovano - } flcheader; - -typedef struct FRAMEHEADER { - unsigned int size; // velikost frame v bytech - unsigned short sign; // znacka frame OFAF1h - unsigned short actions; // pocet akci v tomto frame - char reserv [8]; // rezervovano - } frameheader; - -typedef struct ACTIONHEADER { - unsigned int size; // velikost akce v bytech - unsigned short code; // kod akce - // 04h - predani casti nebo cele palety - // 07h - predavani zmenenych casti obrazu - // 0Dh - vymaze obrazovku - // 0Fh - cela obrazovka v RLE - // 10h - nekomprimovana kopie cele obrazovky - // nasleduji data akce - } actionheader; - -FILE *flc; -flcheader h_flc; -frameheader h_frame; -actionheader h_action; -char frame_buffer [307205]; -char *flc_buffer; -//unsigned int ladici; - -void Open_FLC (char *filename); -void Close_FLC (void); -void Get_first_frame (void); -void Get_next_frame (void); -void Decompress_frame (void); - -#endif diff --git a/ZVUK/PLAY.C b/ZVUK/PLAY.C deleted file mode 100644 index 3138bf2..0000000 --- a/ZVUK/PLAY.C +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include -#include "flc.h" -#include "vesa.h" - -void Set_TEXT_mode (void); - -void main (int argc, char *argv[]) -{ - int x; - - Open_FLC (argv[1]); - - printf ("\nHlavicka FLC souboru %s:\n", argv[1]); - printf ("Delka celeho souboru: %d\n", h_flc.size); - printf ("Pocet frame: %d\n", h_flc.frames); - printf ("Velikost filmu: %dx%d\n", h_flc.width, h_flc.height); - printf ("Hloubka barvy: %d\n", h_flc.color); -// printf ("Rychlost prehravani: %d fps\n", 1000/h_flc.speed); - printf ("Offset prvniho frame: %d\n", h_flc.offset1); - getch (); - - Set_VESA_mode (0x101); - delay (1000); - - Get_first_frame (); - Decompress_frame (); - Show_screen (frame_buffer); - - for (x=2; x<=h_flc.frames; x++) - { - Get_next_frame (); - Decompress_frame (); - Show_screen (frame_buffer); - delay (7); - } - getch (); - - Set_TEXT_mode (); - Close_FLC (); -} - -void Set_TEXT_mode (void) -{ - union REGS inr, outr; - - inr.h.ah = 0x00; - inr.h.al = 03; - int386 (0x10, &inr, &outr); -} - - diff --git a/ZVUK/SNDPACK.C b/ZVUK/SNDPACK.C deleted file mode 100644 index 14384fb..0000000 --- a/ZVUK/SNDPACK.C +++ /dev/null @@ -1,254 +0,0 @@ -#include -#include -#include -#include - -#define BLK_SIZE 8192 - -short ampl_table[256]; -signed short source[BLK_SIZE]; -char target[BLK_SIZE]; - -long sfreq; -unsigned short chans; -FILE *sf,*tf; - - -char *nsource; -char *ntarget; -long ssize; -long rsize,blck; -char difftype=4; - -void Create_table_16() - { - int a,c,d,e; - float b; - - d=-1;e=0; - for(a=0;a<128;a++) - { - b=(a/128.0); - switch (difftype) - { - case 1:b=(b*32768.0);break; - case 2:b=(b*b*32768.0);break; - case 3:b=(b*b*b*32768.0);break; - case 4:b=(b*b*b*b*32768.0);break; - case 5:b=(b*b*b*b*b*32768.0);break; - } - c=(int)b; - if (c==d) e++; - d=c;c+=e; - ampl_table[128+a]=c; - ampl_table[128-a]=-c; - } - } - -int find_index(int value) - { - int i; - - if (value==0) return 128; - if (value>0) - { - for(i=128;i<256;i++) - if (ampl_table[i]>value) return i-1; - return 255; - } - else - { - for(i=128;i>=0;i--) - if (ampl_table[i]32768 || last1<-32768) abort(); - target[i]=indx; - } - else - { - val=source[i]; - indx=find_index(val-last2); - last2+=ampl_table[indx]; - if (last2>32768 || last2<-32768) abort(); - target[i]=indx; - } - } - } - -void find_data() - { - char w[5]="data"; - int i,d; - - i=0; - do - { - d=fgetc(sf); - if (d==w[i]) i++;else i=0; - if (d==EOF) abort(); - } - while (i<4); - } - - -void open_files() - { - int i=0; - sf=fopen(nsource,"rb"); - tf=fopen(ntarget,"wb"); - if (sf==NULL || tf==NULL) abort(); - fseek(sf,0x16,SEEK_SET); - fread(&chans,1,2,sf); - fread(&sfreq,1,4,sf); - find_data(); - fread(&ssize,1,4,sf); - rsize=ssize; - blck=rsize/sizeof(source); - fwrite(&chans,1,2,tf); - fwrite(&sfreq,1,4,tf); - fwrite(&ssize,1,4,tf); - fwrite(&blck,1,4,tf); - fwrite(&i,1,4,tf); - fwrite(&i,1,4,tf); - fwrite(&l_table,1,sizeof(ampl_table),tf); - } - -int read_buffer() - { - int l; - - if (rsize>sizeof(source)) l=sizeof(source); else l=rsize; - rsize-=l; - memset(source,0,sizeof(source)); - return fread(source,1,l,sf); - } - -void write_buffer() - { - int i,j; - - i=sizeof(target); - j=sizeof(source); - fwrite(&i,1,sizeof(i),tf); - fwrite(&j,1,sizeof(j),tf); - fwrite(target,1,sizeof(target),tf); - } -void timestate(int tim3,int tim4) - { - if (tim3<0) tim3=0; - tim3/=CLOCKS_PER_SEC; - tim4/=CLOCKS_PER_SEC; - cprintf("Packing time: %02d:%02d Remainig: %02d:%02d ",tim4/60,tim4%60,tim3/60,tim3%60); - } - -void pack() - { - long size; - int i,j,pt; - long tim1,tim2,tim3,tim4; - - pt=(ssize/(2*chans))/sfreq; - cprintf("\n\r" - "Packing sample : %s --> %s\n\r" - "Lenght : %10d KB\n\r" - "Total blocks : %10d blocks \n\r" - "Sample freq. : %10d Hz\n\r" - "Sample type : 16-bit %s\n\r" - "Aproximation : %10d \n\r" - "Playing time : %02d:%02d\n\r", - nsource,ntarget,ssize/1024,blck,sfreq,chans==1?"mono":"stereo",difftype,pt/60,pt%60); - timestate(88*60+88,88*60+88); - for (i=0;i<40;i++) putch('.'); - putch('\r'); - tim1=clock(); - do - { - size=read_buffer(); - if (chans==1) compress_buffer_mono(); - else compress_buffer_stereo(); - j=ftell(sf)*40/ssize; - putch('\r'); - tim2=clock(); - tim3=(tim2-tim1); - tim4=(int)((((float)ssize/ftell(sf))*tim3)); - tim3=tim4-tim3; - timestate(tim3,tim4); - for(i=0;i -#include -#include -#include - -UWORD seg; //Segment bufferu -UWORD sel; //Selector na buffer - - //Funkce pro alokaci v dolni casti pameti. - // Alloc dos memory -void dosalloc (unsigned para,unsigned short *rmseg,unsigned short *select) -{ -union REGS regs; - -regs.w.ax = 0x100; -regs.w.bx = para; -int386 (0x31,®s,®s); -*rmseg = regs.w.ax; -*select = regs.w.dx; -} - - //Funkce pro uvolneni v dolni casti pameti. - // Free dos memory -void dosfree (unsigned short select) -{ -union REGS regs; - -regs.w.ax = 0x101; -regs.w.dx = select; -int386 (0x31,®s,®s); -} - -void alloc_buffer() //nejprve se zaalokuje buffer - { - dosalloc(65536/16,&seg,&sel); - } - -void dealloc_buffer() //dealokace - { - dosfree(sel); - } - -void speaker_test() - { - puts("Init..."); - rm_proc_set(seg,sel,PORT_SPK,SPK_MODE);//Nastav rm_proc - load_rm_proc(); //nahraj rm_proc do dolni pameti - pc_speak_enable(); //PCSPEAKER do modu DAC (pokud se hraje na spk) - pc_speak_run(19000,18); //Zacni prehravat buffer (18Hz emulacni frekvence) - puts("Running..."); - getche(); //cekej na klavesu - puts("Stopping..."); - pc_speak_stop(); //Zastav prehravani - pc_speak_disable(); //PCSPEAKER vrat do normalniho rezimu - purge_rm_proc(); //vymaz rm_proc z dolni pameti - puts("Ending..."); - } - -void main() - { - alloc_buffer(); //Alokuj buffer - speaker_test(); //Test - dealloc_buffer(); //Dealokuj buffer - } diff --git a/ZVUK/TRACK.C b/ZVUK/TRACK.C deleted file mode 100644 index 1dfaab5..0000000 --- a/ZVUK/TRACK.C +++ /dev/null @@ -1,834 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#define SCRADR 0xb8000 -#define SCRSIZE (80*25*2) -#define SCRLLEN 80 -#define VOL_BLOCK (bfreq/44) -#define BVSTEP 2350 - -extern char backsndbuff[BACK_BUFF_SIZE]; -extern volatile long backsnd; -extern volatile long backstep; -extern volatile int backfine; -extern int bfreq,bblocks,bvolume; -extern FILE *bsnd; -extern unsigned short bchans; -extern long blength; -extern int bblock_size; -extern int device; -extern int devport; - -char manual_refresh=0; - -int get_playing_time(char *filename) - { - open_backsound(filename); - fclose(bsnd); - if (blength!=-1) return (bblocks*bblock_size)/(bfreq*bchans);else return 0; - } - -TSTR_LIST read_dir(char *mask,int attrs) - { - TSTR_LIST flist; - int index=0; - char c[80]; - struct find_t s; - int rc; - int doba; - - flist=create_list(256); - if (flist==NULL) return flist; - rc=_dos_findfirst(mask,attrs,&s); - while (rc==0) - { - char d[13],*p; - int i=0,j; - - if (attrs==_A_NORMAL || s.attrib & attrs) - { - - p=&d;d[12]='\0'; - while (s.name[i]!='.' && s.name[i]!='\0' ) *p++=s.name[i++]; - if (s.name[i]!='\0') j=i+1;else j=i; - while (i<8) - { - *p++=32;i++; - } - i=3; - *p++='.'; - while (s.name[j]!='\0') - { - *p++=s.name[j++]; - i--; - } - while (i>0) - { - *p++=32; - i--; - } - doba=get_playing_time(s.name); - sprintf(c,"%s %02d:%02d",d,doba/60,doba%60); - if (str_replace(&flist,index++,c)==NULL) - { - release_list(flist); - return NULL; - } - } - rc=_dos_findnext(&s); - } - sort_list(flist,-1); - str_delfreelines(&flist); - return flist; - } - -void name_conv(char *c) - { - char *a,*b,cn,cd; - - a=c;b=c; - cn=4;cd=0; - for(;*a && cn;a++,cn-=cd) - { - if (*a!=32) *b++=*a; - if (*a=='.') cd=1; - } - *b--='\0'; - if (*b=='.') *b='\0'; - } - - - -long music_size; -int block_size; -int block_max; -int vybrano=0; -int posledni=-1; -char error=0; - -typedef char TDIGIT[10]; - -TSTR_LIST adresar; - -char istr[300]; -char pause=0; - -unsigned short *screen; - -TDIGIT digits[15]= - { "���" - "� �" - "���", - " �" - " �" - " �", - "���" - "���" - "���", - "���" - "���" - "���", - "� �" - "���" - " �", - "���" - "���" - "���", - "���" - "���" - "���", - "���" - "� �" - " �", - "���" - "���" - "���", - "���" - "���" - "���", - " � " - " � " - " ", - " " - "���" - " " - }; - - -void load_font(char *font,int start,int count); -#pragma aux load_font =\ - "cli"\ - "mov edx,3c4h"\ - "mov eax,0402h"\ - "out dx,ax"\ - "mov eax,0704h"\ - "out dx,ax"\ - "Mov edx,3ceh"\ - "mov eax,0204h"\ - "out dx,ax"\ - "mov eax,0005h"\ - "out dx,ax"\ - "mov ax,0406h"\ - "out dx,ax"\ - "shl ecx,5"\ - "mov edx,edi"\ - "mov edi,0a0000h"\ - "add edi,ecx"\ - "Opk: mov ecx,4"\ - "rep movsd"\ - "add edi,16"\ - "dec edx"\ - "jne opk"\ - "mov edx,3c4h"\ - "mov eax,0302h"\ - "out dx,ax"\ - "mov eax,0304h"\ - "out dx,ax"\ - "mov edx,3ceh"\ - "mov eax,0004h"\ - "out dx,ax"\ - "mov eax,1005h"\ - "out dx,ax"\ - "mov eax,0E06h"\ - "out dx,ax"\ - "sti"\ - parm [ESI][ECX][EDI] modify [EDX EAX]; - -void font_effekt1(); -#pragma aux font_effekt1 =\ - "mov ecx,32"\ - "mov edi,127"\ - "mov edx,3c4h"\ - "mov eax,0402h"\ - "out dx,ax"\ - "mov eax,0704h"\ - "out dx,ax"\ - "Mov edx,3ceh"\ - "mov eax,0204h"\ - "out dx,ax"\ - "mov eax,0005h"\ - "out dx,ax"\ - "mov ax,0406h"\ - "out dx,ax"\ - "shl ecx,5"\ - "mov edx,edi"\ - "mov esi,0a0000h"\ - "mov edi,0a4000h"\ - "push ecx"\ - "mov ecx,2000h"\ - "rep movsb"\ - "pop ecx"\ - "mov edi,0a4000h"\ - "add edi,ecx"\ - modify [EDX EAX ESI ECX EDI]; - -void font_effekt2(); -#pragma aux font_effekt2 =\ - "Opk: mov al,0ffh"\ - "stosb"\ - "add edi,14"\ - "stosb"\ - "add edi,16"\ - "dec edx"\ - "jne opk"\ - "mov edx,3c4h"\ - "mov eax,0302h"\ - "out dx,ax"\ - "mov eax,0304h"\ - "out dx,ax"\ - "mov edx,3ceh"\ - "mov eax,0004h"\ - "out dx,ax"\ - "mov eax,1005h"\ - "out dx,ax"\ - "mov eax,0E06h"\ - "out dx,ax"\ - modify [EDX EAX ESI ECX EDI]; -void font_effekt() - { - font_effekt1(); - font_effekt2(); - } - -#pragma aux dve_sady modify [EAX EBX EDX]=\ - "mov ebx,1"\ - "mov eax,1103h"\ - "int 10h"\ - "cli"\ - "mov edx,3d4h"\ - "mov eax,0100h"\ - "out dx,ax"\ - "mov edx,3c4h"\ - "mov al,1"\ - "out dx,al"\ - "inc edx "\ - "in al,dx "\ - "or al,1"\ - "out dx,al"\ - "mov edx,03dah"\ - "in al,dx"\ - "mov edx,03c0h"\ - "mov al,13h"\ - "out dx,al"\ - "mov al,0"\ - "out dx,ax"\ - "mov al,32"\ - "out dx,al"\ - "mov edx,3d4h"\ - "mov eax,0300h"\ - "out dx,ax"\ - "sti"\ - -void dve_sady(); - -void set_palcolor(int index,int r,int g,int b); -#pragma aux set_palcolor parm [ebx][edx][eax][ecx]=\ - "mov ch,al"\ - "mov dh,dl"\ - "mov eax,1010h"\ - "int 10h" - - -void def_fbars() - { - char f_bars[8][16]; - int i,j; - - memset(f_bars,0,sizeof(f_bars)); - for(i=0;i<8;i++) - for(j=0;j<=i;j++) - f_bars[7-i][15-j*2]=255; - load_font(f_bars,192,8); - for(i=0;i<16;i++) f_bars[0][i]=1; - for(i=0;i<16;i++) f_bars[1][i]=192; - for(i=0;i<16;i++) f_bars[2][i]=255*(i>13); - load_font(f_bars,200,3); - } - - -void disp_digit(int x,int y,char num) - { - unsigned short *adr; - char *c; - - adr=screen+y*SCRLLEN+x; - c=&digits[num]; - for(y=0;y<3;y++,adr+=SCRLLEN-3) - for(x=0;x<3;x++) *(char *)(adr++)=*c++; - } - -void clear_window(int x1,int y1,int x2,int y2,int color) - { - int x,y; - unsigned short *adr; - - color<<=8;color+=32; - for(y=y1;y<=y2;y++) - { - adr=screen+y*SCRLLEN; - for(x=x1;x<=x2;x++) - adr[x]=color; - } - } - -void disp_str(int x,int y,char *c,int color) - { - unsigned short *adr; - - adr=screen+y*SCRLLEN+x; - while (*c) *adr++=*(c++)+(color<<8); - } - -void disp_vbar_track(int x,int y,int step) - { - unsigned short *adr; - int drw=0;char cl; - - adr=screen+y*SCRLLEN+x; - while (drw<32768) - { - cl=15; - drw+=step; - adr[0]=200+(cl<<8); - adr[3]=201+(cl<<8); - adr-=SCRLLEN; - } - } - -void disp_bnum(int x,int y,int num,int dgs) - { - char sgn; - - sgn=num<0;num=abs(num); - while (dgs>0 || num>0) - { - disp_digit(x,y,num%10); - num/=10;dgs--; - x-=4; - } - if (sgn) disp_digit(x,y,11); - } - -void disp_chan(int x,int y,int value,int step) - { - unsigned short *adr; - int drw=0;char cl; - - adr=screen+y*SCRLLEN+x; - while (drw<32768) - { - if (drw>=value) cl=0; - else if (drw>24660) cl=12; - else if (drw>16384) cl=14; - else cl=10; - drw+=step; - if (drw>value && cl>0) - *adr=192+8*(drw-value)/step+(cl<<8); - else - *adr=192+(cl<<8); - adr-=SCRLLEN; - } - *adr=202+(15<<8); - } - -void init(int a,int b,int c,int d) - { - screen=(unsigned short *)SCRADR; - clear_window(0,0,79,24,15); - disp_str(0,0,"Output Device:",9); - disp_str(0,1,"Parameters:",9); - disp_str(0,3,"Track name:",9); - disp_str(0,4,"Mode:",9); - disp_str(0,5,"Blocks:",9); - disp_str(0,6,"Size:",9); - disp_str(0,7,"Playing time:",9); - if (a==-1) - if (sound_detect(&a,&b,&c,&d)) - { - disp_str(16,0,"No sound device found",14); - exit(1); - } - set_mixing_device(a,22050,b,c,d); - disp_str(16,0,device_name(a),14); - if (a>=DEV_SB10 && a<=DEV_ULTRA) - { - sprintf(istr,"port %03X dma %1d irq %1X",b,c,d); - disp_str(16,1,istr,13); - } - clear_window(50,0,79,3,30); - clear_window(50,4,79,7,4*16+15); - } - -void open_files(char *filename,char fade) - { - long total; - char spaces[50]; - - memset(spaces,32,50);spaces[30]=0; - if (bsnd!=NULL)fclose(bsnd); - if (filename!=NULL)if (fade) change_music(filename);else open_backsound(filename); - else blength=-1; - music_size=blength; - block_size=bblock_size; - disp_str(16,3,spaces,12); - error=0; - if (music_size==-1) - { - disp_str(16,3,"Track NOT found",12); - block_size=1; - bchans=1; - bfreq=1; - bblocks=0; - error=1; - } - else disp_str(16,3,filename,12); - if (bchans==1) - sprintf(istr,"16-bit mono %5d Hz ",bfreq); - else - sprintf(istr,"16-bit stereo %5d Hz",bfreq); - disp_str(16,4,istr,11); - sprintf(istr,"%05d",bblocks); - disp_str(16,5,istr,10); - sprintf(istr,"%05d KB",music_size/1024); - disp_str(16,6,istr,15); - total=(bblocks*block_size)/(bfreq*bchans); - sprintf(istr,"%02d:%02d",total/60,total%60); - disp_str(16,7,istr,14); - block_max=bblocks; - } - -void display_time(int bblocks) - { - long time,b; - - if (error) - { - disp_bnum(76,1,88,2); - disp_digit(68,1,10); - disp_bnum(64,1,88,2); - } - else - { - b=bblocks+128*1024/block_size; - if (b>block_max) b-=block_max; - time=(b*block_size)/(bfreq*bchans); - disp_bnum(76,1,time%60,2); - disp_digit(68,1,10); - disp_bnum(64,1,time/60,2); - } - } - -void display_bblocks(int bblocks) - { - long b; - - if (error) - disp_bnum(76,5,88888,5); - else - { - b=bblocks+128*1024/block_size; - if (b>block_max) b-=block_max; - disp_bnum(76,5,b,5); - } - } - -void volume_bars(int *left,int *right) - { - int i,k,l,r; - static last=0; - static sl,sr; - - r=backsnd-last; - if (r<0) r+=BACK_BUFF_SIZE/4; - if (r>VOL_BLOCK) - { - *left=sl; - *right=sr; - sr-=1000; - sl-=1000; - last=backsnd; - for(i=0;i=BACK_BUFF_SIZE/4) k-=BACK_BUFF_SIZE/4;; - l=*((short *)backsndbuff+k*2); - r=*((short *)backsndbuff+k*2+1); - if (l>sl) - sl=l; - if (r>sr) - sr=r; - } - } - } -char retrace() -//vraci stav kresliciho paprsku na obrazovce - { - return (((~inp(0x3da)) & 8)>>3); - } - -void wait_retrace() -//ceka na zpetny chod - { - while (!retrace()); - while (retrace()); - } - -void disp_volume() - { - disp_chan(77,23,bvolume*64,BVSTEP); - disp_chan(78,23,bvolume*64,BVSTEP); - disp_vbar_track(76,23,BVSTEP); - } - -void show_dir(int sel_file,int playing) - { - int cn=str_count(adresar); - int i=sel_file-5; - char spaces[32]; - int color; - - memset(spaces,32,32); - spaces[31]=0; - for(;i=cn || adresar[i]==NULL)disp_str(3,i-sel_file+17,spaces,0); - else disp_str(3,i-sel_file+17,adresar[i],color); - } - color=3+(playing==sel_file?2:0); - disp_str(1,17," ",color); - disp_str(21,17," ",color); - disp_str(0,17,"�",color); - disp_str(23,17,"�",color); - } -void play_next(char **next) - { - posledni++; - if (posledni>=str_count(adresar)) posledni=0; - if (adresar[posledni]==NULL) posledni=0; - if (adresar[posledni]==NULL) {*next=NULL;posledni=0;} - else - { - static char c[50]; - vybrano=posledni; - show_dir(vybrano,posledni); - strcpy(c,adresar[vybrano]); - name_conv(c); - open_files(c,0); - fclose(bsnd); - *next=c; - } - } - -void set_new_position() - { - static int l=0,r=0; - int i=bblocks; - long c; - int delta1=5,delta2=1; - int volsave; - char zn,oldzn; - - c=get_timer_value(); - do - { - if (_bios_keybrd(_KEYBRD_READY)) - switch (zn=_bios_keybrd(_KEYBRD_READ)>>8) - { - case 'M':i-=delta2; - if (i<0) i=0; - display_time(i); - c=get_timer_value(); - delta1--; - break; - case 'K':i+=delta2;if (i>=block_max) i=block_max-1; - display_time(i); - c=get_timer_value(); - delta1--; - break; - } - if (delta1<0) - { - delta1=5; - delta2++; - } - if (zn!=oldzn) delta2=1; - oldzn=zn; - display_bblocks(bblocks); - volume_bars(&l,&r); - mix_back_sound(0); - disp_chan(37,23,l,BVSTEP); - disp_chan(38,23,l,BVSTEP); - disp_chan(41,23,r,BVSTEP); - disp_chan(42,23,r,BVSTEP); - } - while (get_timer_value()-c<50); - if (i==bblocks) return; - volsave=get_snd_effect(SND_MUSIC); - set_snd_effect(SND_MUSIC,0); - set_snd_effect(SND_MUSIC,volsave);; - delta1=0; - if (i>bblocks && (i-bblocks)<(block_max-i)) - { - fseek(bsnd,4,SEEK_CUR); - for(;bblocksbblocks) open_backsound(NULL); - for(;bblocks!=i;bblocks--) - { - fread(&delta1,1,4,bsnd); - fseek(bsnd,4+delta1,SEEK_CUR); - display_bblocks(bblocks); - } - } - -extern int bxbass; -extern unsigned short predstih; -extern int dmatable[8][4]; -extern char intr_test; - - -static void print_dma(int dma_num) - { - int i,j,k; - - i=inp(dmatable[dma_num][0]); - j=inp(dmatable[dma_num][0]); - k=inp(dmatable[dma_num][2]); - cprintf("%04X %0X|",i+j*256,k); - } - -static void print_all_dma() - { - int i; - static char negate; - - for(i=0;i<8;i++) print_dma(i); - if (intr_test) - { - negate=!negate; - intr_test=0; - } - cprintf(" %c %d\r",negate?'*':' ',predstih); - } - -void MIXER(); -#pragma aux MIXER modify [eax ebx ecx edx esi edi]; - - -char refresh() - { - static int l=0,r=0; - char *c; - int z; - mix_back_sound(0); - if (manual_refresh) - { - MIXER(); - predstih=0x8000; - if (device==DEV_SB16) - { - int i; - i=inp(devport+0xf); - i=inp(devport+0xe); - } - } - else - { - display_bblocks(bblocks); - display_time(bblocks); - print_all_dma(); - volume_bars(&l,&r); - disp_chan(37,23,l,BVSTEP); - disp_chan(38,23,l,BVSTEP); - disp_chan(41,23,r,BVSTEP); - disp_chan(42,23,r,BVSTEP); - } - if (error && adresar[0]!=NULL) - { - play_next(&c); - open_files(c,0); - } - while (_bios_keybrd(_KEYBRD_READY)) - switch (_bios_keybrd(_KEYBRD_READ)>>8) - { - case 1:return 0; - case 'M': - case 'K': set_new_position();break; - case 0x39:if (pause) start_mixing(); else stop_mixing(); - pause=!pause; - break; - case 0x17:set_snd_effect(SND_OUTFILTER,2);break; - case 'I': if (bvolume<512) bvolume+=4; - disp_volume(); - break; - case 'Q': if (bvolume>3) bvolume-=4;else bvolume=0; - disp_volume(); - break; - case 'G': if (check_snd_effect(SND_LSWAP)) - { - z=get_snd_effect(SND_LSWAP); - z+=0xf;if (z>0xff) z=0xff; - set_snd_effect(SND_LSWAP,z); - }break; - case 'O': if (check_snd_effect(SND_LSWAP)) - { - z=get_snd_effect(SND_LSWAP); - z-=0xf;if (z<0) z=0; - set_snd_effect(SND_LSWAP,z); - } - case 'H': if (vybrano>0) - { - vybrano--;show_dir(vybrano,posledni); - }break; - break; - case 'P': if (vybrano+1256) bxbass=256;break; - case '<':bxbass-=16;if (bxbass<0) bxbass=0;break; - case 0x1c:if (adresar[vybrano]!=NULL) - { - char c[50]; - posledni=vybrano; - show_dir(vybrano,posledni); - strcpy(c,adresar[vybrano]); - name_conv(c); - open_files(c,vybrano); - break; - } - - } - return 1; - } - - -void restore_mode(); -#pragma aux restore_mode=\ - "mov eax,3"\ - "int 10h"\ - modify [eax]; - -main(int argc,char *argv[]) - { - int a,b,c,d; - - adresar=read_dir("*.mus",_A_NORMAL); - if (argc!=2 && argc!=6 && (argc!=1 || adresar[0]==NULL)) - { - int i; - printf("\n\nUsage: TRACK trackname [device] [port] [dma] [irq] \n" - " or TRACK * [device] [port] [dma] [irq] - plays current directory." - "\n\nDevice numbers:\n"); - for (i=0;i<7;i++) printf("%d. %s\n",i,device_name(i)); - puts("\nIf you use character '~' (tilda) as trackname, it will have the same\n" - "effect as '*' so you will able to play sound background in WIN95\n" - "But the volume bars will not display correct values."); - exit(0); - } - if (argc==6) - { - sscanf(argv[2],"%d",&a); - sscanf(argv[3],"%x",&b); - sscanf(argv[4],"%d",&c); - sscanf(argv[5],"%d",&d); - } - else - a=-1; - if (argv[1][0]=='~') manual_refresh=1; - def_fbars(); - //dve_sady(); - //font_effekt(); - set_palcolor(57,0,42,42); - set_palcolor(5,0,63,63); - init(a,b,c,d); - open_files(argv[1],0); - start_mixing(); - disp_vbar_track(36,23,BVSTEP); - disp_vbar_track(40,23,BVSTEP); - disp_volume(); - show_dir(0,1); - konec_skladby=play_next; - while (refresh()); - stop_mixing(); - clear_window(0,0,79,24,15); - restore_mode(); - } diff --git a/ZVUK/VESA.C b/ZVUK/VESA.C deleted file mode 100644 index a59e4d4..0000000 --- a/ZVUK/VESA.C +++ /dev/null @@ -1,296 +0,0 @@ -/********************************/ -/* Prace se SVGA VESA adapterem */ -/********************************/ - -#include -#include -#include -#include -#include "vesa.h" -#include "dosmem.h" - - extern void wm_ChangeBank_(int bank); - #pragma aux (ASM) wm_ChangeBank_; - - -void Set_VESA_mode (int mode) -{ - union REGS r; - - r.w.ax=0x4f02; - r.w.bx=mode; - int386 (0x10, &r, &r); -} - - -void Show_screen (char *display) -{ - wm_ChangeBank_ (0); - memmove (0xa0000, display, 65536); - wm_ChangeBank_ (1); - memmove (0xa0000, (display+65536), 65536); - wm_ChangeBank_ (2); - memmove (0xa0000, (display+131072), 65536); - wm_ChangeBank_ (3); - memmove (0xa0000, (display+196608), 65536); - wm_ChangeBank_ (4); - memmove (0xa0000, (display+262144), 45056); -} - -void Put_image (int x, int y, int xlen, int ylen, char *image) -{ - int a,b,c,d; - long int posunuti=0; - int banka; - - if (y<103) {wm_ChangeBank_ (0); banka=0;} - if (y>103 && y<205) {wm_ChangeBank_ (1); banka=1;} - if (y>205 && y<308) {wm_ChangeBank_ (2); banka=2;} - if (y>308 && y<410) {wm_ChangeBank_ (3); banka=3;} - if (y>410) {wm_ChangeBank_ (4); banka=4;} - - for (a=0; a<=ylen; a++) - { - - d=y+a; - switch (d) - { - case 102: - if ((x+xlen)<256){ - posunuti=(y+a)*640+x; - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (1); banka=1;} - if (x>=256){ - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - } - if (x<256 && (x+xlen)>256){ - posunuti=(y+a)*640+x; b=x; c=0; - while (b!=256) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - case 204: - if ((x+xlen)<512){ - posunuti=(((y+a)*640+x)-65536); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (2); banka=2;} - if (x>=512){ - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<512 && (x+xlen)>512){ - posunuti=(((y+a)*640+x)-65536); b=x; c=0; - while (b!=512) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - case 307: - if ((x+xlen)<128){ - posunuti=(((y+a)*640+x)-131072); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (3); banka=3;} - if (x>=128){ - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<128 && (x+xlen)>128){ - posunuti=(((y+a)*640+x)-131072); b=x; c=0; - while (b!=128) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - case 409: - if ((x+xlen)<384){ - posunuti=(((y+a)*640+x)-196608); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - wm_ChangeBank_ (4); banka=4;} - if (x>=384){ - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen);} - if (x<384 && (x+xlen)>384){ - posunuti=(((y+a)*640+x)-196608); b=x; c=0; - while (b!=384) - {memmove ((0xa0000+posunuti), (image+a*(xlen+1)+c), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((0xa0000+posunuti+c), (image+a*(xlen+1)+c), (xlen-c));} - break; - - default: - posunuti=(y+a)*640+x-banka*65536; - memmove ((0xa0000+posunuti), (image+a*(xlen+1)), xlen); - break; - }; - } -} - -void Get_image (int x, int y, int xlen, int ylen, char *image) -{ - int a,b,c,d; - long int posunuti=0; - int banka; - - if (y<103) {wm_ChangeBank_ (0); banka=0;} - if (y>103 && y<205) {wm_ChangeBank_ (1); banka=1;} - if (y>205 && y<308) {wm_ChangeBank_ (2); banka=2;} - if (y>308 && y<410) {wm_ChangeBank_ (3); banka=3;} - if (y>410) {wm_ChangeBank_ (4); banka=4;} - - for (a=0; a<=ylen; a++) - { - - d=y+a; - switch (d) - { - case 102: - if ((x+xlen)<256){ - posunuti=(y+a)*640+x; - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (1); banka=1;} - if (x>=256){ - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - } - if (x<256 && (x+xlen)>256){ - posunuti=(y+a)*640+x; b=x; c=0; - while (b!=256) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (1); banka=1; - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - case 204: - if ((x+xlen)<512){ - posunuti=(((y+a)*640+x)-65536); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (2); banka=2;} - if (x>=512){ - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<512 && (x+xlen)>512){ - posunuti=(((y+a)*640+x)-65536); b=x; c=0; - while (b!=512) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (2); banka=2; - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - case 307: - if ((x+xlen)<128){ - posunuti=(((y+a)*640+x)-131072); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (3); banka=3;} - if (x>=128){ - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<128 && (x+xlen)>128){ - posunuti=(((y+a)*640+x)-131072); b=x; c=0; - while (b!=128) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (3); banka=3; - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - case 409: - if ((x+xlen)<384){ - posunuti=(((y+a)*640+x)-196608); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - wm_ChangeBank_ (4); banka=4;} - if (x>=384){ - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen);} - if (x<384 && (x+xlen)>384){ - posunuti=(((y+a)*640+x)-196608); b=x; c=0; - while (b!=384) - {memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti), 1); - posunuti++; b++; c++;} - wm_ChangeBank_ (4); banka=4; - posunuti=(((y+a)*640+x)-262144); - memmove ((image+a*(xlen+1)+c), (0xa0000+posunuti+c), (xlen-c));} - break; - - default: - posunuti=(y+a)*640+x-banka*65536; - memmove ((image+a*(xlen+1)), (0xa0000+posunuti), xlen); - break; - }; - } - -} - - -void Get_VESA_info (void) -{ - char far *str; - VESA_INFO_BLOCK *p; - - p=(VESA_INFO_BLOCK *)mem_alloc(sizeof(VESA_INFO_BLOCK)); - - memset(&dpmiregs,0,sizeof(DPMIREGS)); - dpmiregs.EAX=0x00004f00; - dpmiregs.DS=D32RealSeg(p); - dpmiregs.ES=D32RealSeg(p); - dpmiregs.EDI=D32RealOff(p); - - WtNs386(0x10,&dpmiregs); - - str=(char far *)MK_FP(Selector,0); - _fmemcpy(&VesaInfoBlock,str,sizeof(VESA_INFO_BLOCK)); - - mem_free(p); - if(dpmiregs.EAX!=0x4f) - { - printf ("VESA Bios extension not found!!!!"); - exit (1); - } -} - - -void Get_mode_info (int mode) -{ - char far *str; - VESA_MODE_INFO_BLOCK *p; - - p=(VESA_MODE_INFO_BLOCK *)mem_alloc(sizeof(VESA_MODE_INFO_BLOCK)); - - memset(&dpmiregs,0,sizeof(DPMIREGS)); //nuluje registry - dpmiregs.EAX=0x00004f01; - dpmiregs.DS=D32RealSeg(p); - dpmiregs.ES=D32RealSeg(p); - dpmiregs.EDI=D32RealOff(p); - dpmiregs.ECX=mode; - - WtNs386(0x10,&dpmiregs); - - str=(char far *)MK_FP(Selector,0); - _fmemcpy(&VesaModeInfoBlock,str,sizeof(VESA_INFO_BLOCK)); - - _VGAGran=VesaModeInfoBlock.WinGranularity; - - mem_free(p); -} - diff --git a/ZVUK/VESA.H b/ZVUK/VESA.H deleted file mode 100644 index a0f12a2..0000000 --- a/ZVUK/VESA.H +++ /dev/null @@ -1,70 +0,0 @@ -/********************************/ -/* Prace se SVGA VESA adapterem */ -/********************************/ - -#ifndef __VESA_H -#define __VESA_H - - -typedef struct -{ char VESASignature[4]; - short VESAversion; - unsigned OEMStringPtr; - char capabilities[4]; - short int *videomodeptr; - short int TotalMemory; - char dummy[236]; - } VESA_INFO_BLOCK; - -typedef struct -{ short unsigned ModeAttributes; - char WinAAttributes; - char WinBAttributes; - short unsigned WinGranularity; - short unsigned WinSize; - short unsigned WinASegment; - short unsigned WinBSegment; - short unsigned WinFuncPtroff; - short unsigned WinFuncPtrseg; - short unsigned BytesPerScanLine; - - short unsigned XResolution; - short unsigned YResolution; - char Xcharsize; - char Ycharsize; - char NumberOfPlanes; - char BitsPerPixel; - char NumberOfBanks; - char MemoryModel; - char BankSize; - char NumberOfImagePages; - char Reserved; - - char RedMaskSize; - char RedFieldPosition; - char GreenMaskSize; - char GreenFieldPosition; - char BlueMaskSize; - char BlueFieldPosition; - char RsvdMaskSize; - char DirectColorModeInfo; - char Dummy[216]; - } VESA_MODE_INFO_BLOCK; - - -VESA_MODE_INFO_BLOCK VesaModeInfoBlock; -VESA_INFO_BLOCK VesaInfoBlock; - -extern unsigned char _VGAPage=0; -extern unsigned char _VGAGran=0; - -void Set_VESA_mode (int mode); -void Show_screen (char *display); -void Get_VESA_info (void); -void Get_mode_info (int mode); - -void Put_image (int x, int y, int xlen, int ylen, char *image); -void Get_image (int x, int y, int xlen, int ylen, char *image); - -#endif - diff --git a/ZVUK/VESA_.ASM b/ZVUK/VESA_.ASM deleted file mode 100644 index d11920c..0000000 --- a/ZVUK/VESA_.ASM +++ /dev/null @@ -1,63 +0,0 @@ -;EAX EDX EBX ECX -.386p -jumps -;############################################################################ -; Constanty -;############################################################################ - -dlt_x equ 640 -dlt_y equ 480 - -;############################################################################ -; Datovy segment -;############################################################################ -_DATA SEGMENT PARA PUBLIC USE32 'DATA' -align 4 - - -EXTRN __VGAPage:BYTE -EXTRN __VGAGran:BYTE - - -_DATA ENDS - -DGROUP GROUP _DATA - -;############################################################################ -; Kodovy segment -;############################################################################ -_TEXT SEGMENT PARA PUBLIC USE32 'CODE' - ASSUME cs:_TEXT, ds:_DATA - - - -public wm_ChangeBank__ -wm_ChangeBank__ PROC - - push es - pushad - - push eax - mov edx, eax - mov ebx, 0000h - mov eax, 4f05h - int 10h - - pop eax - mov edx, eax - mov ebx, 0001h - mov eax, 4f05h - int 10h - - popad - pop es - ret - -wm_ChangeBank__ endp -;---------------------------------------------------------------------------- - -_TEXT ENDS - -END - - diff --git a/ZVUK/ZVUK1.C b/ZVUK/ZVUK1.C deleted file mode 100644 index d8d604c..0000000 --- a/ZVUK/ZVUK1.C +++ /dev/null @@ -1,872 +0,0 @@ -#include -#include -//#include -#include -#include -#include - -#include - - -#define MIX_MONO 8 -#define MIX_STEREO 16 -#define MIX_16STEREO 32 - -#define MUSIC1 "..\\music\\ascent.mus" -#define MUSIC2 "..\\music\\late.mus" -#define MUSIC3 "..\\music\\december.mus" -#define MUSIC4 "..\\music\\ssi.mus" -#define MUSIC5 "..\\music\\test.mus" - - -#define BACK_BUFF_SIZE 0x40000 - -#define DEV_SB10 0x0e -#define DEV_SB20 0x10 -#define DEV_SBPRO 0x12 -#define DEV_SB16 0x14 -#define DEV_WWS 0x16 -#define DEV_ULTRA 0x18 -#define DEV_DAC 0x1A -#define DEV_PCSPEAKER 0x1C - -#define MIX_REZERVA 0x50 - -#define build_dac_xlat() \ - {\ - int i;\ - for(i=0;i<256;i++) da_xlat[i]=i;\ - }\ - -#define sendsb(data) \ - while (inp(sbport+0xc) & 0x80);\ - outp(sbport+0xc,data) - -#define recivesb(data)\ - while (!(inp(sbport+0xe) & 0x80));\ - data=inp(sbport+0xa) - -char detect_enables[8]; - -#define irqdetect(irq) \ - {\ - if (detect_enables[irq]) \ - sbirq=irq;\ - detect_enables[irq]=0;\ - inp(sbport+0xE);\ - outp(0x20,0x20);\ - } - - -typedef struct tchannel - { - char *play_pos, *start_loop, *end_loop; - long speed_maj; - unsigned short speed_min, minor_pos, sample_type, vol_left, vol_right; - }TCHANNEL; - -char musiclist[5][30]={ - MUSIC1,MUSIC2,MUSIC3,MUSIC4,MUSIC5}; - -TCHANNEL chaninfo[32]; -char *mixbuffer; -char backsndbuff[BACK_BUFF_SIZE]; -volatile long backsnd=0; -volatile long backstep=1; -volatile int backfine=0; -long jumptable[3]; -long getdma; -long ido; -unsigned short predstih=0x960; -long lastdma; -long lastmix; -long mixpos; -long surpos; -long mixsize; -long dmaposadr; -long dmasizadr; -long dmapageadr; -long dmanum; -int dmamask; -int dmamode; -int device; -long samplerate=1000; -long mixfreq=100; -long idt_map[2]; -int call_back_data; -int call_back_sel; -unsigned short dpmiselector; -char mixer_zavora=0; -FILE *bsnd; -unsigned short bchans; -short btable[256]; -int bfreq,bblocks,bvolume=255; -char depack[32768]; - -char da_xlat[256]; // Xlat tabulka pro DA a PC Speaker; -int dac_port; //DAC port -int test_counter=0; - -char *sample1; -long last_load_size; - -int dmatable[8][4]= - { - {0,1,0x87,0x0A0B}, - {2,3,0x83,0x0A0B}, - {4,5,0x81,0x0A0B}, - {6,7,0x82,0x0A0B}, - {0xd0,0xd1,0x8f,0xD4D6}, - {0xd2,0xd3,0x8b,0xD4D6}, - {0xd4,0xd5,0x89,0xD4D6}, - {0xd6,0xd7,0x8a,0xD4D6} - }; - -int irqtable[16]={8,9,0xa,0xb,0xc,0xd,0xe,0xf,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77}; - -void *load_file(char *filename) - { - FILE *f; - long size,*p; - - f=fopen(filename,"rb"); - if (f==NULL) abort(); - fseek(f,0,SEEK_END); - size=ftell(f); - fseek(f,0,SEEK_SET); - p=(void *)malloc(size); - if (fread(p,1,size,f)!=size) abort; - fclose(f); - last_load_size=size; - return p; - } - -char *buff_alloc(); -#pragma aux buff_alloc modify[ebx ecx edx] value [eax] -void mixer(); -#pragma aux mixer modify [eax ebx ecx edx esi edi] -void setsbpro(); -#pragma aux setsbpro modify [eax edi] -void setsb2(); -#pragma aux setsb2 modify [eax edi] -void setsb16(); -#pragma aux setsb16 modify [eax edi] - -int sbport=0x220; -int sbirq=0; - -void init_dma(int dma) -{ -dmanum=dma; -dmaposadr=dmatable[dma][0]; -dmasizadr=dmatable[dma][1]; -dmapageadr=dmatable[dma][2]; -dmamask=dmatable[dma][3] >> 8; -dmamode=dmatable[dma][3] & 0xff; -} - -void prepare_dma(char *adr) -{ -int poz; - -outp(0x0C,0);outp(0xD8,0); -outp(dmamask,(dmanum & 3)+0x04); -outp(dmamode,(dmanum & 3)+0x58); -if (dmanum>3) poz=(long)adr >> 1; else poz=(long)adr; -outp(dmaposadr,poz & 0xff); -outp(dmaposadr,(poz>>8) & 0xff); -outp(dmapageadr,poz>>16); -outp(dmasizadr,0xff); -outp(dmasizadr,0xff); -outp(dmamask,dmanum & 3+0x04); -} - - - -void reset_blaster() -{ -int counter=100; -outp(sbport+0x6,1); -delay(10); -outp(sbport+0x6,0); -while (inp(sbport+0x0A)!=0xAA && counter--) delay(1); -} -void start_sbmono() -{ -prepare_dma(mixbuffer); -sendsb(0xd1); -sendsb(0x40); -sendsb(256 - (1000000 / samplerate)); -sendsb(0x48); -sendsb(0xff); -sendsb(0xff); -sendsb(0x1c); -} - -void stop_sbmono() -{ -sendsb(0xd3); -sendsb(0xd0); -//sendsb(0xda); -//sendsb(0xd0); -} - -void start_sb16(); - -void __interrupt __far sb16_irq() - { - int i=32767; - - i=inp(sbport+0xf); - i=inp(sbport+0xe); -// sendsb(0xb6); -// sendsb(0x30); -// sendsb(i & 0xff); -// sendsb(i >> 8); //play(16bit,signed,stereo,16384); - outp(0x20,0x20); - outp(0xA0,0x20); - } -void start_sb16() - { - int i=16383; - - outp(sbport+0x4,0x81); - outp(sbport+0x5,1 << dmanum); - outp(sbport+0x4,0x80); - switch (sbirq) - { - case 2:outp(sbport+0x5,0xf1);break; - case 5:outp(sbport+0x5,0xf2);break; - case 7:outp(sbport+0x5,0xf4);break; - } - outp(sbport+0x4,0x80); - prepare_dma(mixbuffer); - sendsb(0xd1); //speaker(enable) - sendsb(0x41); - sendsb(samplerate>>8); - sendsb(samplerate & 0xff); //Set_sample_rate(samplerate); - sendsb(0xb4); - sendsb(0x30); - sendsb(i & 0xff); - sendsb(i >> 8); //play(16bit,signed,stereo,16384); - outp(0x21,inp(0x21) & ~(1<>8); -sendsb(0x48); -sendsb(0xff); -sendsb(0xff); -sendsb(0x90); -outp(sbport+0x4,0x0e); -outp(sbport+0x5,0x13); -} - -void __interrupt __far sb10_irq() - { - int i=32767; - - i=inp(sbport+0xe); - sendsb(0x14); - sendsb(0xff); - sendsb(0xff); - outp(0x20,0x20); - outp(0xA0,0x20); - } - -void start_sb10() - { - prepare_dma(mixbuffer); - sendsb(0xd1); - sendsb(0x40); - sendsb((65536 - (256000000 / (samplerate*2)))>>8); - sendsb(0x14); - sendsb(0xff); - sendsb(0xff); - outp(0x21,inp(0x21) & ~(1<BACK_BUFF_SIZE) nextpos-=BACK_BUFF_SIZE; - return nextpos; - } - for(;;) - { - val=backsnd*4-nextpos; - if (val<0) val+=BACK_BUFF_SIZE; - if (val<32768) return nextpos; - for(count=16384;count>0;count--) - { - if (remain==0) - { - bblocks--; - if (bblocks<=0) - { - fclose(bsnd); - open_backsound(NULL); - } - load_music_block(); - last[0]=0; - last[1]=0; - remain=32768; - depos=0; - } - val=btable[depack[depos++]];remain--; - val+=last[swap]; - last[swap++]=val; - if (swap>=bchans) swap=0; - val=(val*bvolume)>>8; - if (val>32676) val=32767; - if (val<-32767) val=-32767; - *(short *)(backsndbuff+(nextpos))=val; - nextpos+=2; - if (nextpos>=BACK_BUFF_SIZE) nextpos=0; - } - } - } - - -void fade_music() - { - short *p; - int i,j,k,l,m; - - mix_back_sound(0); - k=backsnd*2; - i=k; - p=(short *)&backsndbuff; - m=mix_back_sound(1); - m=m-k*2; - if (m<0) m+=BACK_BUFF_SIZE; - m/=2; - j=m;m/=256; - do - { - l=j/256; - p[i]=p[i]*l/m; - i++;j--;if (j<0) j=0; - if (i>BACK_BUFF_SIZE/2) i=0; - } - while (i!=k); - memset(&depack,0x80,sizeof(depack)); - } - - -void stop_sbstereo() -{ -reset_blaster(); -outp(sbport+0x4,0x0e); -outp(sbport+0x5,0x11); -//sendsb(0xda); -//sendsb(0xd0); -} - -int init_blaster(int port) -{ -sbport=port; -reset_blaster(); -return(inp(sbport+0x0a)==0xaa); -} - - -void prepare_mixing(int mode) -{ -predstih=samplerate/mixfreq+MIX_REZERVA; -predstih+=MIX_REZERVA+predstih; -predstih*=(mode/MIX_MONO); -switch (mode) - { - case MIX_MONO:setsb2();break; - case MIX_STEREO:setsbpro();break; - case MIX_16STEREO:setsb16();break; - } -backsndbuff[0]=0;backstep=bfreq*0x10000/samplerate;backsnd=0; -//backsndbuff[0]=128;backstep=0;backsnd=0; -lastdma=0; -mixpos=(long)(mixbuffer+predstih); -memset(chaninfo,0,sizeof(TCHANNEL)*32); -memset(mixbuffer,0x80,65536); -} - -void play_sample(int channel,void *sample,long size,long lstart,long sfreq,int type) - { - chaninfo[channel].play_pos=sample; - chaninfo[channel].start_loop=(char *)sample+lstart; - chaninfo[channel].end_loop=(char *)sample+size; - chaninfo[channel].speed_maj=sfreq/samplerate; - chaninfo[channel].speed_min=(sfreq%samplerate)*65536/samplerate; - chaninfo[channel].sample_type=type; - } - -void set_channel_volume(int channel,int left,int right) - { - chaninfo[channel].vol_left=left; - chaninfo[channel].vol_right=right; - } - -void set_bass_treble(int x,int y) - { - outp(sbport+4,0x44);outp(sbport+5,y); - outp(sbport+4,0x45);outp(sbport+5,y); - outp(sbport+4,0x46);outp(sbport+5,x); - outp(sbport+4,0x47);outp(sbport+5,x); - } - -void mixing() -{ -int c;int smpsize; -int treble=240,bass=240; - -sample1=(char *)load_file("d:\\music\\samples\\fx\\playboy.smp"); -smpsize=last_load_size; -set_channel_volume(0,32768,0); -set_channel_volume(1,0,32768); -for (c=2;c<12;c++) - set_channel_volume(c,(c-2)*3000,27000-(c-2)*3000); -c=0; -while (c!=1) -{ -int a,b; - a=inp(dmaposadr); - a+=inp(dmaposadr)<<8; - b=(bblocks*65536)/(22050*bchans*2); - cprintf("%04X %6X %6X volume %03d block:%04d time %02d:%02d %10d\r",a,mixpos,mixsize,bvolume,bblocks,b/60,b%60,test_counter); - mix_back_sound(0); - //mixer(); - c=0; - while (_bios_keybrd(_KEYBRD_READY)) - { - c=_bios_keybrd(_KEYBRD_READ)>>8; - switch(c) - { - case 'H': if (bvolume<512) bvolume++;break; - case 'P': if (bvolume>0) bvolume--;break; - case 'I': if (treble<240) treble+=16;set_bass_treble(bass,treble);break; - case 'Q': if (treble>0) treble-=16;set_bass_treble(bass,treble);break; - case 'G': if (bass<240) bass+=16;set_bass_treble(bass,treble);break; - case 'O': if (bass>0) bass-=16;set_bass_treble(bass,treble);break; - case 'M': if (bblocks>0) - { - mixer_zavora=1; - backsnd+=8196;if (backsnd>BACK_BUFF_SIZE/4) backsnd-=BACK_BUFF_SIZE/4; - mixer_zavora=0; - } - break; - case 'K': if (ftell(bsnd)>2*(32768+8)) - { - fseek(bsnd,-2*(32768+8),SEEK_CUR); - bblocks++; - load_music_block(); - } - break; - case 0x17: - do - { - a=inp(dmaposadr); - a+=inp(dmaposadr)<<8; - } - while (!(a & 1)); - do - { - a=inp(dmaposadr); - a+=inp(dmaposadr)<<8; - } - while (a & 1); - outp(sbport+0x4,0x0e); - outp(sbport+0x5,inp(sbport+0x5) ^ 0x20); - break; - default: - if (c>=2 && c<=11) - play_sample(c-2,sample1,smpsize,smpsize,11000,1); - else - if (c>=';' && c<='@') - { - fclose(bsnd); - fade_music(); - open_backsound(musiclist[c-';']); - } - - } - } - } -} - -int int_relocation(); -#pragma aux int_relocation modify [eax ebx ecx edx esi edi] -void int_mixer_alloc(int num); -#pragma aux int_mixer_alloc parm [ebx] modify [eax ecx edx esi edi] -int int_dealloc(); -#pragma aux int_dealloc modify [eax ebx ecx edx esi edi] -void __interrupt __far int_normal(); -void high_speed_parm(void *mix,int dosdelay,char *xlattab,int port); -#pragma aux high_speed_parm parm [ebx][eax][esi][edx] modify [edi] -void int_high_alloc(int num); -#pragma aux int_high_alloc parm [ebx] modify [eax ecx edx esi edi] - - -void int_init() - { - int l; - _dos_setvect(0x1c,int_normal); - l=0x1234bc/mixfreq; - outp(0x43,0x34); - outp(0x40,l%256); - outp(0x40,l/256); - } - -void int_highspeed(int port) - { - int l; - _dos_setvect(0x1c,int_normal); - high_speed_parm(mixbuffer,samplerate/mixfreq,da_xlat,port); - int_high_alloc(0x8); - l=0x1234bc/samplerate; - outp(0x43,0x34); - outp(0x40,l%256); - outp(0x40,l/256); - } - - -void set_mixing_device(int mix_dev,int mix_freq,...) - { - int *p; - samplerate=mix_freq; - mixbuffer=buff_alloc(); - p=&mix_freq;p++; - device=mix_dev; - switch (mix_dev) - { - case DEV_SB10: - case DEV_SB20: - case DEV_SBPRO: - case DEV_SB16: - init_blaster(p[0]); - init_dma(p[1]); - sbirq=p[2]; - break; - case DEV_DAC: - dac_port=p[0]; - break; - } - } - -void start_mixing() - { - switch (device) - { - case DEV_SB10: - start_sb10(); - int_init(); - prepare_mixing(MIX_MONO); - break; - case DEV_SB20: - start_sbmono(); - int_init(); - prepare_mixing(MIX_MONO); - break; - case DEV_SBPRO: - start_sbstereo(); - int_init(); - prepare_mixing(MIX_STEREO); - break; - case DEV_SB16: - start_sb16(); - int_init(); - prepare_mixing(MIX_16STEREO); - break; - case DEV_DAC: - build_dac_xlat(); - prepare_mixing(MIX_MONO); - int_highspeed(dac_port); - break; - } - } - -void stop_mixing() - { - outp(0x43,0x34); - outp(0x40,0); - outp(0x40,0); - switch (device) - { - case DEV_SB10: - stop_sb10(); - break; - case DEV_SB20: - stop_sbmono(); - break; - case DEV_SBPRO: - stop_sbstereo(); - break; - case DEV_SB16: - stop_sb16(); - break; - case DEV_DAC: - int_dealloc(); - break; - } - } - -void __far __interrupt sb_detect_irq2() -irqdetect(2) -void __far __interrupt sb_detect_irq3() -irqdetect(3) -void __far __interrupt sb_detect_irq5() -irqdetect(5) -void __far __interrupt sb_detect_irq7() -irqdetect(7) - - -char *device_name(int device) - { - static char names[][25]= - { - "Unsupported Device", - "Sound Blaster", - "Sound Blaster 2", - "Sound Blaster Pro/2", - "Sound Blaster 16+", - "Windows Sound System", - "UltraSound", - "DAC on LPT", - "Internal Hooker", - "Pro Audio Spectrum" - }; - - switch (device) - { - case DEV_SB10:return names[1]; - case DEV_SB20:return names[2]; - case DEV_SBPRO:return names[3]; - case DEV_SB16:return names[4]; - case DEV_WWS:return names[5]; - case DEV_ULTRA:return names[6]; - case DEV_DAC:return names[7]; - case DEV_PCSPEAKER:return names[8]; - } - return names[0]; - } - -int sb_detect(int *dev,int *port,int *dma, int *irq) - { - int i,a,j; - char ver_lo; - char ver_hi; - void __far *irqsave2,__far *irqsave3,__far *irqsave5,__far *irqsave7; - int dmasaves[4]; - char dmadis[4]; - int dmatesting[4]={1,3,0,1}; - - *port=0x210; - do - { - sbport=*port; - outp(sbport+6,1);delay(1); - outp(sbport+6,0); - for(i=0;i<100 && inp(sbport+0xA)!=0xAA;i++) delay(1); - (*port)+=0x10; - } - while (i==100 && sbport<0x280); - if (i==100) return -1; //NOT DETECTED; - *port=sbport; - sendsb(0xe1); - recivesb(ver_lo); - recivesb(ver_hi); - switch (ver_hi) - { - case 1: *dev=DEV_SB10;break; - case 2: if (ver_lo) *dev=DEV_SB20;break; - case 3: *dev=DEV_SBPRO;break; - case 4: *dev=DEV_SB16;break; - default: *dev=DEV_SB10;break; - } - if (*dev==DEV_SB16) - { - outp(sbport+4,0x80); - i=inp(sbport+5); - *irq=5; - if (i & 8) *irq=7; - if (i & 4) *irq=7; - if (i & 2) *irq=5; - if (i & 1) *irq=2; - outp(sbport+4,0x81); - i=inp(sbport+5); - *dma=1; - if (i & 1) *dma=0; - if (i & 2) *dma=1; - if (i & 8) *dma=3; - return 0; - } - for(i=0;i<4;i++) - { - outp(0xc,0); - a=inp(dmatable[i][0]); - a=a+256*inp(dmatable[i][0]); - dmasaves[i]=a; - } - irqsave2=_dos_getvect(irqtable[2]); - irqsave3=_dos_getvect(irqtable[3]); - irqsave5=_dos_getvect(irqtable[5]); - irqsave7=_dos_getvect(irqtable[7]); - _dos_setvect(irqtable[2],sb_detect_irq2); - _dos_setvect(irqtable[3],sb_detect_irq3); - _dos_setvect(irqtable[5],sb_detect_irq5); - _dos_setvect(irqtable[7],sb_detect_irq7); - ver_lo=inp(0x21); - outp(0x21,0x53); - memset(detect_enables,0x1,sizeof(detect_enables)); - delay(100); - sbirq=-1; - sendsb(0xf2); - delay(1); - _dos_setvect(irqtable[2],irqsave2); - _dos_setvect(irqtable[3],irqsave3); - _dos_setvect(irqtable[5],irqsave5); - _dos_setvect(irqtable[7],irqsave7); - outp(0x21,ver_lo); - if (sbirq==-1) return -2; //DETECTION ERROR - *irq=sbirq; - for(i=0;i<4;i++) - { - outp(0xc,0); - a=inp(dmatable[i][0]); - a=a+256*inp(dmatable[i][0]); - dmadis[i]=(dmasaves[i]==a); - } - for (j=0,*dma=-1;j<4 && *dma==-1;j++) - { - i=dmatesting[j]; - init_dma(i); - prepare_dma(NULL); - sendsb(0xd3); - sendsb(0x14); - sendsb(0xff); - sendsb(0x7f); - delay(100); - outp(0xc,0); - a=inp(dmatable[i][0]); - a=a+256*inp(dmatable[i][0]); - if (dmasaves[i]!=a && dmadis[i]) *dma=i; - reset_blaster(); - } - if (*dma==-1) return -2; - return 0; - } - -main() -{ -int a,b,c,d; -printf("%d\n",sizeof(TCHANNEL)); -if (sb_detect(&a,&b,&c,&d)) - { - printf("SB not present\n"); - return; - } -//a=DEV_SBPRO; -printf("%s\n",device_name(a)); -//printf("IRQ:\n"); -//scanf("%d",&d); -set_mixing_device(a,22050,b,c,d); -printf("Port %03X dma %d irq %d freq %d.\n",b,c,d,samplerate); -open_backsound(MUSIC1); -start_mixing(); -mixing(); -stop_mixing(); -printf("\n\n\n"); -} - - - - diff --git a/ZVUK/ZVUK1A.ASM b/ZVUK/ZVUK1A.ASM deleted file mode 100644 index 2646da9..0000000 --- a/ZVUK/ZVUK1A.ASM +++ /dev/null @@ -1,271 +0,0 @@ -.model small -.386 - -DGROUP group _DATA - - -tchannel struct - PLAYPOS DD ? - STARTLOOP DD ? - ENDLOOP DD ? - SPEEDMAJ DD ? - SPEEDMIN DW ? - MINORPOS DW ? - SMPTYPE DW ?;0 - DISABLED, 1 - 8 BIT, 2 - 16 BIT - VOLUMELEFT DW ? - VOLUMERIGHT DW ? -tchannel ends - -extrn _chaninfo:dword -extrn _mixbuffer:dword -extrn _backsnd:dword ;ukazatel na buffer s hudbou na pozadi (64Kb) -extrn _backstep:dword ;krok o kolik se meni _backsnd -extrn _backsndbuff:dword ;buffer hudby na pozadi - - -extrn _jumptable:dword[3] ;[0] - skip, [1] - mix8, [2] - mix16 -extrn _getdma:dword -extrn _ido:dword - -extrn _predstih:word -extrn _lastdma:dword -extrn _lastmix:dword -extrn _surpos:dword -extrn _mixpos:dword -extrn _mixsize:dword - -extrn _dmaposadr:dword -extrn _dpmiselector:word - - - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - - PUBLIC MIXER_ -MIXER_: ;THIS IS MAIN MIXING PROCEDURE. - ;BEFORE USING, YOU MUST SET UP ALL VARIBLES TO THE CORRECT VALUES. - ;_MIXBUFFER MUST START ON PAGE OF MEMORY (EXP 0x10000 0x20000 0x30000) - ;PROCEDURE MUST BE CALLED EACH 55ms OR LITTLE. - ;IF YOU USING INTERRUPT, REMEBER, THAT YOU MUST STORE ALL REGISTERS - ;BEFORE USE. - - CALL calcsize ;VYPOCET DELKY MIXOVANI - mov edi,_mixpos ;Nejprve se vymaze mixovaci pamet - mov ecx,_mixsize - shr ecx,2 - jnz MIXOK - ret -MIXOK: xor eax,eax -MIXCLR: mov [edi],eax - add di,4 - dec ecx - jnz MIXCLR - lea ebx,_chaninfo ;TED SE ZACNE MIXOVAT -MIXING: xor eax,eax - mov ax,smptype[ebx] - call _jumptable[eax*4] - add ebx,sizeof(tchannel) - cmp ebx,(32*sizeof(tchannel))+offset _chaninfo - jnz MIXING - call _ido - mov ecx,_mixsize - add word ptr _mixpos,cx - add word ptr _surpos,cx - ret - - -CALCSIZE:call _getdma ;eax - pozice v mixovaci pameti - mov ebx,_lastdma - mov _lastdma,eax - sub ax,bx - add ax,_predstih - add ax,word ptr _lastdma - mov bx,word ptr _mixpos - sub ax,bx - js CALCEND - and ax,not 3 - add ax,4 - and eax,0ffffh - mov _mixsize,eax - ret -CALCEND:mov _mixsize,0 - ret - -ADDC macro REG1,REG2,CLIP - local addc1 - add REG1,REG2 - jno addc1 - shl REG2,1 - Mov REG2,CLIP - adc REG2,0 - mov REG1,REG2 -addc1: - endm - - - -MIXS_ :;primixuje sampl do bufferu (8-bit stereo) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos - mov ecx,_mixsize - mov esi,[ebx] - push ebp - mov bp,minorpos[ebx] -mixslp: mov al,[esi] - mov ah,al - mov edx,eax - mov al,byte ptr volumeleft[ebx+1] - imul dl - shl eax,1 - mov dl,ah - mov al,byte ptr volumeright[ebx+1] - imul dh - shl eax,1 - mov dh,ah - mov ax,[edi] - addc al,dl,7fh - addc ah,dh,7fh - mov [edi],ax ;je smixovano - add di,2 ;dalsi pozice - add bp,speedmin[ebx] - adc esi,speedmaj[ebx] - cmp esi,endloop[ebx] - jc mixsskp - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mixsskp - mov smptype[ebx],0 - jmp mixsend -mixsskp:dec ecx - dec ecx - jnz mixslp -mixsend:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - -mixskip:ret -mixs2: ret - -m8sido: mov esi,_mixpos - mov edi,_surpos ;surpos musi byt liche - mov ecx,_mixsize - mov edx,_backsnd ;backsnd-index na hudbu v pozadi -m8sido1:mov al,[edi] ;vem surround data - sar al,1 ;sniz jejich hlasitost - mov ah,[esi] ;vem namixovana data - addc al,ah,7fh ;secti je mezi sebou - mov ah,byte ptr _backsndbuff[edx] ;ven data z hudby v pozadi - add dx,word ptr _backstep ;mezitim jdi na dalsi index - addc al,ah,7fh ;secti je mexi sebou - mov [edi],al - inc di ;dalsi pozice v mixbuff - inc si - dec ecx ;dokud to neni vsechno - jnz m8sido1 ;opakuj - mov _backsnd,edx ;zachovej index do backsoundbuff - mov esi,_surpos ;nyni pracuj jiz s prehravanymi daty - and esi,not 1 - mov edi,esi - sub si,2 ;pozice o jeden sampl za - mov ecx,_mixsize ;velikost/2 - shr ecx,1 -m8sido2:mov ax,[esi] ;vem cely sampl - xor ax,8080h - mov bx,[edi] - xor bx,8080h - ;add al,bl ;uplna prumerovaci interpolace - ;rcr al,1 - ;add ah,bh - ;rcr ah,1 - mov [esi],ax - add di,2 ;dalsi vzorek - add si,2 - dec ecx - jnz m8sido2 ;dokud neni konec - ret - -sbdma: mov edx,_dmaposadr - out 0ch,al - out 0d8h,al - xor eax,eax - in al,dx - xchg al,ah - in al,dx - xchg al,ah - add eax,offset _mixbuffer - ret - - -PUBLIC setsbpro_ -setsbpro_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mixs_ - stosd - mov eax,offset mixs2 - stosd - mov _getdma,offset sbdma - mov _ido,offset m8sido - ret - - - -dpmibufalloc: - mov ax,0100h - int 31h - ret - - - -public buff_dealloc_ -buff_dealloc_: - mov dx,_dpmiselector - mov ax,0101h - int 31h - ret - -public buff_alloc_ - -buff_alloc_: - mov ebx,4200 - call dpmibufalloc - jc allcerror - test eax,0fffh - jz allc_ok - push eax - mov eax,0101h - int 31h - pop eax - mov ebx,eax - and ebx,0f000h - add ebx,1000h - sub ebx,eax - dec ebx - call dpmibufalloc - jc allcerror - push edx - call buff_alloc_ - mov ecx,edx - pop edx - push eax - mov eax,0101h - int 31h - pop eax - ret -allc_ok:mov _dpmiselector,dx - shl eax,4 - ret -allcerror: - mov word ptr _dpmiselector,0 - xor eax,eax - ret - -_TEXT ends - -end - - diff --git a/ZVUK/ZVUK2A.ASM b/ZVUK/ZVUK2A.ASM deleted file mode 100644 index 2ec022f..0000000 --- a/ZVUK/ZVUK2A.ASM +++ /dev/null @@ -1,741 +0,0 @@ -.model small -.386P - -DGROUP group _DATA - - -tchannel struct - PLAYPOS DD ? - STARTLOOP DD ? - ENDLOOP DD ? - SPEEDMAJ DD ? - SPEEDMIN DW ? - MINORPOS DW ? - SMPTYPE DW ?;0 - DISABLED, 1 - 8 BIT, 2 - 16 BIT - VOLUMELEFT DW ? - VOLUMERIGHT DW ? -tchannel ends - -rm_playdata struct - XLAT_TAB DB 256 DUP(?) - SCANOFS DW ? - SCANSEG DW ? - PORT DW ? -rm_playdata ends - -extrn _chaninfo:dword -extrn _mixbuffer:dword -extrn _backsnd:dword ;ukazatel na buffer s hudbou na pozadi (64Kb) -extrn _backstep:dword ;krok o kolik se meni _backsnd -extrn _backfine:dword ;citac udavajici kdy se zmeni _backsnd -extrn _backsndbuff:dword ;buffer hudby na pozadi -extrn _call_back_data:dword ;data_call_back_procedury -extrn _call_back_sel:word ;data_call_back_procedury - -extrn _jumptable:dword[3] ;[0] - skip, [1] - mix8, [2] - mix16 -extrn _getdma:dword -extrn _ido:dword - -extrn _predstih:word -extrn _lastdma:dword -extrn _lastmix:dword -extrn _surpos:dword -extrn _mixpos:dword -extrn _mixsize:dword - -extrn _dmaposadr:dword -extrn _dpmiselector:word - -extrn _idt_map:dword - -extrn _test_counter:dword - -extrn _mixer_zavora:byte - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - - PUBLIC MIXER_ -MIXER_: ;THIS IS MAIN MIXING PROCEDURE. - ;BEFORE USING, YOU MUST SET UP ALL VARIBLES TO THE CORRECT VALUES. - ;_MIXBUFFER MUST START ON PAGE OF MEMORY (EXP 0x10000 0x20000 0x30000) - ;PROCEDURE MUST BE CALLED EACH 55ms OR LITTLE. - ;IF YOU USING INTERRUPT, REMEBER, THAT YOU MUST STORE ALL REGISTERS - ;BEFORE USE. - - cmp _mixer_zavora,0 - jnz mixend - inc _mixer_zavora - CALL calcsize ;VYPOCET DELKY MIXOVANI - mov edi,_mixpos ;Nejprve se vymaze mixovaci pamet - mov ecx,_mixsize - shr ecx,2 - jz MIXALL -MIXOK: xor eax,eax -MIXCLR: mov [edi],eax - add di,4 - dec ecx - jnz MIXCLR - lea ebx,_chaninfo ;TED SE ZACNE MIXOVAT -MIXING: xor eax,eax - mov ax,smptype[ebx] - call _jumptable[eax*4] - add ebx,sizeof(tchannel) - cmp ebx,(32*sizeof(tchannel))+offset _chaninfo - jnz MIXING - call _ido - mov ecx,_mixsize - add word ptr _mixpos,cx -MIXALL: mov _mixer_zavora,0 -MIXEND: ret - - -CALCSIZE:call _getdma ;eax - pozice v mixovaci pameti - mov ebx,_lastdma - mov _lastdma,eax - sub ax,bx - add ax,_predstih - add ax,word ptr _lastdma - mov bx,word ptr _mixpos - sub ax,bx - js CALCEND - and ax,not 3 - add ax,4 - and eax,0ffffh - mov _mixsize,eax - ret -CALCEND:mov _mixsize,0 - ret - -ADDC macro REG1,REG2,CLIP - local addc1 - add REG1,REG2 - jno addc1 - shl REG2,1 - Mov REG2,CLIP - adc REG2,0 - mov REG1,REG2 -addc1: - endm - - - -MIXS_ :;primixuje sampl do bufferu (8-bit stereo) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos - mov ecx,_mixsize - mov esi,[ebx] - push ebp - mov bp,minorpos[ebx] -mixslp: mov dl,[esi] - mov dh,dl - mov al,byte ptr volumeleft[ebx+1] - imul dl - shl eax,1 - mov dl,ah - mov al,byte ptr volumeright[ebx+1] - imul dh - shl eax,1 - mov dh,ah - mov ax,[edi] - addc al,dl,7fh - addc ah,dh,7fh - mov [edi],ax ;je smixovano - add di,2 ;dalsi pozice - add bp,speedmin[ebx] - adc esi,speedmaj[ebx] - cmp esi,endloop[ebx] - jc mixsskp - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mixsskp - mov smptype[ebx],0 - jmp mixsend -mixsskp:dec ecx - dec ecx - jnz mixslp -mixsend:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - -mixskip:ret -mixs2 :;primixuje sampl do bufferu (16-bit stereo) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos ;vem mixovaci pozici - mov ecx,_mixsize ;vem pocet potrebnych bajtu - mov esi,[ebx] ;vyzvedni ukazatel na sample - push ebp ;zachovej bp - mov bp,minorpos[ebx] ;bp pro tuto chvili predstavuje minorpozici -mix2slp:mov dl,[esi+1] ;vem sample, ale jen vyssi bajt - mov dh,dl ;zkopiruj levy kanal do praveho - mov al,byte ptr volumeleft[ebx+1];vyzvedni hlasitost leveho kanalu - imul dl ;nasob vzorek hlasitosti - shl eax,1 ;vysledek je v ah vydelen 256x - mov dl,ah ;schovej vysledek do dl - mov al,byte ptr volumeright[ebx+1];to same pro pravy kanal - imul dh - shl eax,1 - mov dh,ah - mov ax,[edi] ;ted precti aktualni stav samplu v bufferu - addc al,dl,7fh ;pricti levy kanal s clippingem - addc ah,dh,7fh ;pricti pravy kanal s clippingem - mov [edi],ax ;je smixovano - add di,2 ;dalsi pozice - add bp,speedmin[ebx] ;skok po minor hodnotach - lahf ;uchovej priznaky v ah (hlavne cf) - adc esi,speedmaj[ebx] ;skok po major hodnotach - sahf ;obnov cf - adc esi,speedmaj[ebx] ;a jeste jednou celkem o 2xvic nez je rychlost - cmp esi,endloop[ebx] ;test na konec samplu - jc mix2sskp ;pokud jsme prekrocili konec mohou nastat dva - mov esi,startloop[ebx];pripady: - cmp esi,endloop[ebx] ; bud ma sampl opakovani pak zacina na adrese - jnz mix2sskp ; startloop nebo nema - mov smptype[ebx],0 ; pak je vypnut - jmp mix2send ;skoc na konec -mix2sskp:dec ecx ;pokracujeme v prehravani - dec ecx ;byly naplneny 2 bajty, citac o 2 dolu - jnz mix2slp ;opakuj cele mixovani dokud neni citac nule -mix2send:mov minorpos[ebx],bp ;uloz minorpozici - mov playpos[ebx],esi ;uloz majorpozici - pop ebp ;obnov BP - ret ;konec - -m8sido: mov esi,_mixpos ;vem mixovaci pozici - sub si,2 ;o jeden sampl dozadu - mov edi,_backfine ;finepozice - mov ebx,_backsnd ;pozice v bufferu - mov ecx,_mixsize ;pocet bajtu - sub ecx,2 - shl ecx,16 ;uloz do horni poloviny ecx - mov ax,[esi] ;vezmi sample - xor eax,8080h ;neznaminkova korekce -m8sido1:add si,2 ;dalsi sample - mov dx,[esi] ;nacti do dx sample - xor edx,8080h ;neznaminkova korekce - add al,dl ;secti leve kanaly - rcr al,1 ;nasleduje deleni 2x prumer - add ah,dh ;totez pro prave kanaly - rcr ah,1 - xor eax,8080h ;neznaminkova korekce - mov cl,byte ptr _backsndbuff[1+ebx*4] ;nacti back sound pro levej kanal - mov ch,byte ptr _backsndbuff[3+ebx*4];nactu back sound pro pravej kanal - addc al,cl,7fh ;secti s clippingem levy kanal - addc ah,ch,7fh ;secti s clippingem pravy kanal - add di,word ptr _backstep ;pricti fine pozici - adc bx,word ptr [_backstep+2];preteceni jde do bx plus step - and ebx,03ffffh ;celkem 16384*4 samplu - xor eax,8080h ;neznaminkova korekce - sub si,2 ;uloz na zdrojovou pozici - mov [esi],ax - add si,2 - mov eax,edx ;pouzity sampl pro prumerovani se - sub ecx,20000h ;do ax a odecti dva takty pro citac - jnc m8sido1 ;a opakuj dokud neni konec - mov _backsnd,ebx - mov _backfine,edi - ret ;navrat - - -sbdma: mov edx,_dmaposadr - out 0ch,al - out 0d8h,al - xor eax,eax - in al,dx - xchg al,ah - in al,dx - xchg al,ah - add eax,_mixbuffer - ret - - -PUBLIC setsbpro_ -setsbpro_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mixs_ - stosd - mov eax,offset mixs2 - stosd - mov _getdma,offset sbdma - mov _ido,offset m8sido - ret - - -MIXM_ :;primixuje sampl do bufferu (8-bit mono) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos ;vezmi mixovaci pozici - mov ecx,_mixsize ;vezmi delku mixovani - mov esi,[ebx] ;nacti ukazatel na aktualni pozici v samplu - push ebp ;uchovej docasne BP - mov bp,minorpos[ebx] ;bp ma novou ulohu, drzi minor pozici - mov al,byte ptr volumeleft[ebx+1] ;vypocti hlasitost - mov ah,byte ptr volumeright[ebx+1] - add al,ah - rcr al,1 ;jak prumer leve a prave hlasitosti - mov dh,al -mixmlp: mov al,[esi] ;vezmi sample - imul dh ;vynasob s hlasitosti - shl eax,1 ;vydel /256x (ah je vysledek) - mov al,[edi] ;vezmi momentalni obsah bufferu - addc al,ah,7fh ;secti s clippingem - mov [edi],al ;je smixovano - inc di ;dalsi pozice - add bp,speedmin[ebx] - adc esi,speedmaj[ebx] - cmp esi,endloop[ebx] - jc mixmskp - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mixmskp - mov smptype[ebx],0 - jmp mixmend -mixmskp:dec ecx - jnz mixmlp -mixmend:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - -m8mido: mov esi,_mixpos ;vem mixovaci pozici - dec si ;o jeden sampl dozadu - lea edi,_backfine ;ukazatel na back sound buffer - mov ebx,_backsnd ;pozice v bufferu - mov ecx,_mixsize ;pocet bajtu - dec ecx - shl ecx,16 ;uloz do horni poloviny ecx - mov al,[esi] ;vezmi sample - xor eax,80h ;neznaminkova korekce -m8mido1:inc si ;dalsi sample - mov dl,[esi] ;nacti do dx - xor edx,80h ;neznaminkova korekce - add al,dl ;secti kanal - rcr al,1 ;nasleduje deleni 2x prumer - xor eax,80h ;vysledek oznamenkuj - bude se scitat - mov cl,byte ptr _backsndbuff[1+ebx*4];nacti back sound pro levej kanal - mov ch,byte ptr _backsndbuff[3+ebx*4];nactu back sound pro pravej kanal - add di,word ptr _backstep ;pricti fine pozici - adc bx,word ptr [_backstep+2];preteceni jde do bx plus step - and ebx,03ffffh ;celkem 16384*4 samplu - sar cl,1 ;del levy kanal 2ma - sar ch,1 ;del pravy kanal 2ma - add cl,ch ;secti oba kanaly - addc al,cl,7fh ;secti s clippingem kanal - xor eax,80h ;neznaminkova korekce pro SB Pro - dec si ;uloz na zdrojovou pozici - mov [esi],al - inc si - mov eax,edx ;pouzity sampl pro prumerovani se - sub ecx,10000h ;do ax a odecti jeden takt pro citac - jnc m8mido1 ;a opakuj dokud neni konec - mov _backsnd,ebx - ret ;navrat - -mixm2: ret ;navrat - - -PUBLIC setsb2_ -setsb2_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mixm_ - stosd - mov eax,offset mixm2 - stosd - mov _getdma,offset sbdma - mov _ido,offset m8mido - ret - -MIX16_ :;primixuje sampl do bufferu (16-bit stereo) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos ;vem mixovaci pozici - mov ecx,_mixsize ;vem mixovaci delku - mov esi,[ebx] ;vyzvedni ukazatel na sample - push ebp ;uchovej BP - mov bp,minorpos[ebx] ;bp bude drzet minor pozice -mix1lp: mov al,[esi] ;nacti sample - mov dl,al ;al a dl obsahuji levej a pravej kanal - mov ah,byte ptr volumeright[ebx+1] ;nacti pravou hlastitot - imul ah ;vynasob hlasitosti - shl eax,1 ;vse je vyreseno, deleni neni potreba - xchg edx,eax ;ted pracuj s druhym kanalem - mov ah,byte ptr volumeleft[ebx+1] ;nactu hlasitost - imul ah ;vynasob - shl eax,1 - addc [edi],dx,7fffh ;k aktualnimu vzorku pricti hodnotu - add di,2 ;dalsi pozice - addc [edi],ax,7fffh ;je smixovano - add di,2 ;dalsi pozice - add bp,speedmin[ebx] - adc esi,speedmaj[ebx] - cmp esi,endloop[ebx] - jc mix1skp - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mix1skp - mov smptype[ebx],0 - jmp mix1end -mix1skp:sub ecx,4 - jnz mix1lp -mix1end:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - -mix162: ret - -m16ido: push ebp - mov esi,_mixpos ;vem mixovaci pozici - sub si,4 ;o jeden sampl dozadu - mov edi,_backfine ;finepozice - mov ebx,_backsnd ;pozice v bufferu - mov ecx,_mixsize ;pocet bajtu - sub ecx,4 - shl ecx,16 ;uloz do horni poloviny ecx - mov eax,[esi] ;vezmi sample - xor eax,80008000h ;neznaminkova korekce -m16ido1:add si,4 ;dalsi sample - mov ebp,eax - and ebp,0ffff0000h - mov edx,[esi] ;nacti do dx sample - xor edx,80008000h ;neznaminkova korekce - add ax,dx ;secti leve kanaly - rcr ax,1 ;nasleduje deleni 2x prumer - add ebp,edx ;totez pro prave kanaly - rcr ebp,1 - shld eax,ebp,16 - xor eax,80008000h ;neznaminkova korekce - mov cx,word ptr _backsndbuff[ebx*4] ;nacti back sound pro levej kanal - addc ax,cx,7fffh ;secti s clippingem levy kanal - mov cx,word ptr _backsndbuff[2+ebx*4];nacti back sound pro pravej kanal - rol eax,16 - addc ax,cx,7fffh ;secti s clippingem pravy kanal - add di,word ptr _backstep ;pricti fine pozici - adc bx,word ptr [_backstep+2];preteceni jde do bx plus step - and ebx,03ffffh ;celkem 16384*4 samplu - sub si,4 ;uloz na zdrojovou pozici - mov [esi],eax - add si,4 - mov eax,edx ;pouzity sampl pro prumerovani se - sub ecx,40000h ;do ax a odecti ctyri takty pro citac - jnc m16ido1 ;a opakuj dokud neni konec - pop ebp - mov _backsnd,ebx - mov _backfine,edi - ret ;navrat - - - -PUBLIC setsb16_ -setsb16_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mix16_ - stosd - mov eax,offset mix162 - stosd - mov _getdma,offset sbdma - mov _ido,offset m16ido - ret - -dpmibufalloc: - mov ax,0100h - int 31h - ret - -public buff_dealloc_ -buff_dealloc_: - mov dx,_dpmiselector - mov ax,0101h - int 31h - ret - -public buff_alloc_ - -buff_alloc_: - mov ebx,4200 - call dpmibufalloc - jc allcerror - test eax,0fffh - jz allc_ok - push eax - mov eax,0101h - int 31h - pop eax - mov ebx,eax - and ebx,0f000h - add ebx,1000h - sub ebx,eax - dec ebx - call dpmibufalloc - jc allcerror - push edx - call buff_alloc_ - mov ecx,edx - pop edx - push eax - mov eax,0101h - int 31h - pop eax - ret -allc_ok:mov _dpmiselector,dx - shl eax,4 - ret -allcerror: - mov word ptr _dpmiselector,0 - xor eax,eax - ret - -public int_relocation_ -int_relocation_: - mov eax,0de0ah - int 67h - shl ebx,16 - mov bx,cx - rol ebx,16 - mov eax,ebx - ret - -public int_mixer_alloc_ -int_mixer_alloc_: - lea eax,_idt_map - sidt [eax] -; db 0fh -; db 01 -; db 08h - add eax,2 - mov eax,[eax] - shl ebx,3 - add eax,ebx - cli - mov edi,eax - push ds - pop es - mov ecx,offset int_normal_ - mov eax,ecx - stosw - mov ax,cs - stosw - mov eax,8e00h - stosw - mov eax,ecx - shr eax,16 - stosw - sti - mov ebx,1000h - call dpmibufalloc - mov esi,4*8 - mov edi,offset rm_old - mov ecx,4 - rep movsb - mov _call_back_sel,dx - mov esi,offset rm_data_ - mov edi,eax - shl edi,4 - mov _call_back_data,edi - mov ecx,1000 - rep movsb - mov edi,4*8 - mov word ptr [edi],8 - mov [edi+2],ax - ret - -public int_high_alloc_ -int_high_alloc_: - lea eax,_idt_map - sidt [eax] - add eax,2 - mov eax,[eax] - shl ebx,3 - add eax,ebx - cli - mov edi,eax - push ds - pop es - mov ecx,offset int_hspd_ - mov eax,ecx - stosw - mov ax,cs - stosw - mov eax,8e00h - stosw - mov eax,ecx - shr eax,16 - stosw - sti - mov ebx,1000h - call dpmibufalloc - mov esi,4*8 - mov edi,offset rm_old - mov ecx,4 - rep movsb - mov _call_back_sel,dx - mov esi,offset rm_data_ - mov edi,eax - shl edi,4 - mov _call_back_data,edi - mov ecx,1000 - rep movsb - mov edi,4*8 -; mov word ptr [edi],(high_speed - rm_data_) -; mov [edi+2],ax - ret - -public high_speed_parm_ - ;eax dos delay - ;edx port - ;ebx mixbuffer - ;esi xlattab -high_speed_parm_: - mov edi,offset w_max - mov [edi],ax - mov edi,offset rm_hspd - mov ecx,64 - rep movsd - xor eax,eax - stosw - mov eax,ebx - shr eax,4 - stosw - mov eax,edx - stosw - ret -public int_dealloc_ -int_dealloc_: - mov edi,4*8 - mov esi,offset rm_old - mov ecx,4 - rep movsb - mov dx,_call_back_sel - mov ax,101h - int 31h - ret - -public int_normal_: -int_normal_: - cli - pushad - push ds - push es - mov ax,seg _DATA - mov ds,ax - mov es,ax - inc _test_counter - mov al,20h - out 20h,al - sti - call mixer_ - cli - pop es - pop ds - popad - iretd - -public int_hspd_: ;high speed mode interrupt - pro D/A a PC Speaker -int_hspd_: - push ds - push esi - push ebx - push edx - push eax - mov al,20h - out 20h,al - mov ax,seg _DATA - mov ds,ax - mov ebx,_call_back_data - add ebx,(offset rm_hspd-offset rm_data_) - xor eax,eax - xor esi,esi - mov ax,[ebx+scanofs] - mov si,[ebx+scanseg] - shl esi,4 - add esi,eax - mov dx,[ebx+port] - lodsb - xlatb - out dx,al - inc word ptr [ebx+scanofs] - mov ebx,_call_back_data - dec word ptr [ebx] - jnz hs_end - mov ax,[ebx+2] - mov [ebx],ax - sti - call mixer_ - cli -hs_end: - pop eax - pop ebx - pop edx - pop esi - pop ds - iretd - -_TEXT ends - -_TEXT16 SEGMENT BYTE PUBLIC USE16 'CODE' - ASSUME cs:_TEXT16 -public rm_proc_: -rm_data_: -w_count:dw 2 ;citac preruseni -w_max dw 2 ;maximalni hodnota citace -rm_old dw ? ;stary vektor preruseni - dw ? -rm_proc_: - cli - int 1ch - cli - push si - xor si,si - dec word ptr cs:[si] - jnz w_skip - push ax - mov ax,cs:[si+2] - mov cs:[si],ax - pop ax - pushf - call dword ptr cs:[si+4] -w_skip: pop si - iret - -rm_hspd db 300 dup(?) -high_speed: - push ds - push si - push bx - push dx - push ax - mov bx,offset rm_hspd-offset rm_data_ - lds si,cs:[bx+scanofs] - mov dx,cs:[bx+port] - lodsb - xlat cs: - out dx,al - mov cs:[bx+scanofs],si - mov al,20h - out 20h,al - dec word ptr cs:[0] - jnz hspd_end - mov ax,cs:[2] - mov cs:[0],ax - pushf - call dword ptr cs:[4] - int 1ch -hspd_end: - pop ax - pop dx - pop bx - pop si - pop ds - iret - -_TEXT16 ends - -end - - diff --git a/ZVUK/zvuk.c b/ZVUK/zvuk.c deleted file mode 100644 index bd4e72b..0000000 --- a/ZVUK/zvuk.c +++ /dev/null @@ -1,1425 +0,0 @@ -#include -#include -//#include -//#include - - - -#include "zvuk.h" -//#include "pcspeak.h" - -#define MIX_REZERVA 0x50 -#define XBASS_PARM 5 -/* -#define build_dac_xlat() \ - {\ - int i;\ - for(i=0;i<256;i++) da_xlat[i]=i;\ - }\ - -#define sendsb(data) \ - *countdown=10;\ - while ((inp(devport+0xc) & 0x80) && *countdown);\ - outp(devport+0xc,data) - -#define recivesb(data)\ - *countdown=10;\ - while (!(inp(devport+0xe) & 0x80) && *countdown);\ - data=inp(devport+0xa) - -#define sendwss(reg,data)\ - *countdown=10;\ - while ((inp(devport+0x4) & 0x80) && *countdown);\ - outp(devport+0x4,reg);\ - outp(devport+0x5,data); - -#define recivewss(reg,data)\ - *countdown=10;\ - while ((inp(devport+0x4) & 0x80) && *countdown);\ - outp(devport+0x4,reg);\ - data=inp(devport+0x5); - - - -char detect_enables[8]; -#define irqdetect(irq) \ - {\ - if (detect_enables[irq]) \ - devirq=irq;\ - detect_enables[irq]=0;\ - inp(devport+0xE);\ - outp(0x20,0x20);\ - } - -*/ -typedef struct tchannel - { - char *play_pos, *start_loop, *end_loop; - int32_t speed_maj; - unsigned short speed_min, minor_pos, sample_type, vol_left, vol_right; - }TCHANNEL; - -TCHANNEL chaninfo[32]; -char *mixbuffer=NULL; -char backsndbuff[BACK_BUFF_SIZE]; -volatile int32_t backsnd=0; -volatile int32_t backstep=0x10000; -volatile int backfine=0; -int32_t ticker_save; -/*int32_t jumptable[3]; -int32_t getdma; -int32_t ido;*/ -unsigned short predstih=0x960; -int32_t lastdma; -int32_t lastmix; -int32_t mixpos; -int32_t surpos; -int32_t mixsize; -int32_t dmaposadr; -int32_t dmasizadr; -int32_t dmapageadr; -int32_t dmanum; -int dmamask; -int dmamode; -int dmamodenum=0x58;//rezim DMA (default pro SB - POZOR zmenit pro GUS na 0x48 -int device; -int32_t samplerate=22050; -int32_t mixfreq=50; -int32_t idt_map[2]; -int call_back_data; -int call_back_sel; -static char *countdown=(char *)0x440; -unsigned short dpmiselector; -char mixer_zavora=0; -static char hw_intpol=0; -FILE *bsnd; -unsigned short bchans; -short btable[256]; -int bfreq,bblocks,bblock_size,bvolume=255; -int bxbass=0; -static int gfxvol=255; -int32_t blength; -static char depack[32768]; -//void (__far __interrupt *oldvect)(); -static char swap_chans=0; - -char da_xlat[256]; // Xlat tabulka pro DA a PC Speaker; - - -int devport=0x220; //device base port -int devirq=0; //device main irq - -char gus_dma_type=0x41; //typ dma prenosu pro GUS (default 8-bit dma 16-bit samples highspeed) -char gus_last_buff=0; - - -int test_counter=0; -int timer_test_port; -int timer_value=0; -char intr_test; - -void (*konec_skladby)(char **jmeno)=NULL; - -int dmatable[8][4]= - { - {0,1,0x87,0x0A0B}, - {2,3,0x83,0x0A0B}, - {4,5,0x81,0x0A0B}, - {6,7,0x82,0x0A0B}, - {0xc0,0xc2,0x8f,0xD4D6}, - {0xc4,0xc6,0x8b,0xD4D6}, - {0xc8,0xca,0x89,0xD4D6}, - {0xcc,0xce,0x8a,0xD4D6} - }; - -static int irqtable[16]={8,9,0xa,0xb,0xc,0xd,0xe,0xf,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77}; - - static char names[][25]= - { - "Unsupported device", - "Nosound", - "Sound Blaster", - "Sound Blaster 2", - "Sound Blaster Pro", - "Sound Blaster 16+", - "Windows Sound System", - "Gravis Ultrasound", - "DAC on LPT", - "Internal Hooker", - "Pro Audio Spectrum" - }; - -char *buff_alloc(); -#pragma aux buff_alloc modify[ebx ecx edx] value [eax] -void mixer(); -#pragma aux mixer modify [eax ebx ecx edx esi edi] -void setsbpro(); -#pragma aux setsbpro modify [eax edi] -void setsb2(); -#pragma aux setsb2 modify [eax edi] -void setsb2_s(); -#pragma aux setsb2_s modify [eax edi] -void setsb16(); -#pragma aux setsb16 modify [eax edi] -void setgus(); -#pragma aux setgus modify [eax edi] -void init_gus(); -#pragma aux init_gus modify [eax ecx edx edi] -void stop_gus(); -#pragma aux stop_gus modify [eax ecx edx edi] -void gus_setchan_vol(int voice,int volume); -#pragma aux gus_setchan_vol parm [eax][ecx] modify [edx] -void gus_setchan_pan(int voice,int volume); -#pragma aux gus_setchan_pan parm [eax][ecx] modify [edx] - - -void init_dma(int dma) -{ -dmanum=dma; -dmaposadr=dmatable[dma][0]; -dmasizadr=dmatable[dma][1]; -dmapageadr=dmatable[dma][2]; -dmamask=dmatable[dma][3] >> 8; -dmamode=dmatable[dma][3] & 0xff; -} - -void prepare_dma(char *adr,int block) -{ -int poz;int page; - -outp(0x0C,0);outp(0xD8,0); -outp(dmamask,(dmanum & 3)+0x04); -outp(dmamode,(dmanum & 3)+dmamodenum); -if (dmanum>3) - { - block>>=1; - poz=(int32_t)adr>>1; - page=((int32_t)adr>>16) & ~1; - } -else - { - poz=(int32_t)adr; - page=(int32_t)adr>>16; - } -block--; -outp(dmaposadr,poz & 0xff); -outp(dmaposadr,(poz>>8) & 0xff); -outp(dmapageadr,page); -outp(dmasizadr,block & 0xff); -outp(dmasizadr,block>>8); -outp(dmamask,dmanum & 3); -/* -printf("adr: %p\n" - "block: %04X\n" - "pos: %04X\n" - "map: %04X\n" - "dmapage: %X\n" - "dmapos: %X\n" - "dmasize: %X\n" - "dmamask: %X\n", - adr,block,poz & 0xffff,page,dmapageadr,dmaposadr,dmasizadr,dmamask); -getche(); - */ -} - - - -void reset_blaster() -{ -int counter=100; -outp(devport+0x6,1); -delay(10); -outp(devport+0x6,0); -while (inp(devport+0x0A)!=0xAA && counter--) delay(1); -} -void start_sbmono() -{ -prepare_dma(mixbuffer,65536); -sendsb(0xd1); -sendsb(0x40); -sendsb(256 - (1000000 / samplerate)); -sendsb(0x48); -sendsb(0xff); -sendsb(0xff); -sendsb(0x1c); -} - -void stop_sbmono() -{ -sendsb(0xd3); -sendsb(0xd0); -//sendsb(0xda); -//sendsb(0xd0); -} - -void start_sb16(); - -void __interrupt __far sb16_irq() - { - int i=32767; - - i=inp(devport+0xf); - i=inp(devport+0xe); -// sendsb(0xb6); -// sendsb(0x30); -// sendsb(i & 0xff); -// sendsb(i >> 8); //play(16bit,signed,stereo,16384); - outp(0x20,0x20); - outp(0xA0,0x20); - intr_test=1; - } -void start_sb16() - { - int i=16383; - - outp(devport+0x4,0x81); - if (dmanum>3) - outp(devport+0x5,(1 << dmanum)| (inp(devport+0x5) & 0xf)); - else - outp(devport+0x5,1 << dmanum); - outp(devport+0x4,0x80); - switch (devirq) - { - case 2:outp(devport+0x5,0xf1);break; - case 5:outp(devport+0x5,0xf2);break; - case 7:outp(devport+0x5,0xf4);break; - } - outp(devport+0x4,0x80); - prepare_dma(mixbuffer,65536); - sendsb(0xd1); //speaker(enable) - sendsb(0x41); - sendsb(samplerate>>8); - sendsb(samplerate & 0xff); //Set_sample_rate(samplerate); - sendsb(0xb4); - sendsb(0x30); - sendsb(i & 0xff); - sendsb(i >> 8); //play(16bit,signed,stereo,16384); - outp(0x21,inp(0x21) & ~(1<>8); -sendsb(0x48); -sendsb(0xff); -sendsb(0xff); -sendsb(0x90); -outp(devport+0x4,0x0e); -outp(devport+0x5,0x23-0x20*hw_intpol); -} - -void __interrupt __far sb10_irq() - { - int i=32767; - - i=inp(devport+0xe); - sendsb(0x14); - sendsb(0xff); - sendsb(0xff); - outp(0x20,0x20); - outp(0xA0,0x20); - intr_test=1; - } - -void start_sb10() - { - prepare_dma(mixbuffer,65536); - sendsb(0xd1); - sendsb(0x40); - sendsb(256 - (1000000 / samplerate)); - sendsb(0x14); - sendsb(0xff); - sendsb(0xff); - outp(0x21,inp(0x21) & ~(1<BACK_BUFF_SIZE) nextpos-=BACK_BUFF_SIZE; - return nextpos; - } - if (synchro==3) - { - nextpos=backsnd*4-16; - if (nextpos<0) nextpos+=BACK_BUFF_SIZE; - return nextpos; - } - if (synchro>=32768) - { - predstih=synchro; - return nextpos; - } - for(;;) - { - val=backsnd*4-nextpos; - if (val<0) val+=BACK_BUFF_SIZE; - if (val0;count--) - { - if (remain<=0) - { - bblocks--; - if (bblocks<=0) - { - char *new_filename=NULL; - fclose(bsnd); - if (konec_skladby!=NULL) konec_skladby(&new_filename); - open_backsound(new_filename); - } - last[0]=0; - last[1]=0; - remain=load_music_block();; - depos=0; - } - val=btable[c=depack[depos]]; - if (bchans==2 || swap) remain--,depos++; - val+=last[swap]; - last[swap++]=val; - if (c==0) //pridano jako provizorni reseni pro korekci chyby komprimacniho programu - { - val-=31767; - } - if (swap>1)swap=0; - if (bxbass) - { - int c; - xbass[swap]+=val; - c=xbass[swap]>>XBASS_PARM; - xbass[swap]-=c; - c=(c*bxbass*4)>>8; - val+=c; - } - val=(val*bvolume)>>8; - if (val>32676) val=32767; - if (val<-32767) val=-32767; - *(short *)(backsndbuff+(nextpos))=val; - nextpos+=2; - if (nextpos>=BACK_BUFF_SIZE) nextpos=0; - } - } - } - - -void fade_music() - { - short *p; - int i,j,k,l,m; - - mix_back_sound(0); - k=backsnd*2; - i=k; - p=(short *)&backsndbuff; - m=mix_back_sound(1); - m=m-k*2; - if (m<0) m+=BACK_BUFF_SIZE; - m/=2; - j=m;m/=256; - if (m) - do - { - l=j/256; - p[i]=p[i]*l/m; - i++;j--;if (j<0) j=0; - if (i>BACK_BUFF_SIZE/2) i=0; - } - while (i!=k); - memset(&depack,0x80,sizeof(depack)); - } - - -void stop_sbstereo() -{ -reset_blaster(); -outp(devport+0x4,0x0e); -outp(devport+0x5,0x11); -//sendsb(0xda); -//sendsb(0xd0); -} - -int init_blaster(int port) -{ -devport=port; -reset_blaster(); -return(inp(devport+0x0a)==0xaa); -} - - -void prepare_mixing(int mode) -{ -predstih=samplerate/mixfreq+MIX_REZERVA; -predstih+=MIX_REZERVA+predstih; -predstih*=(mode/MIX_MONO); -switch (mode) - { - case MIX_MONO:setsb2();break; - case MIX_MONO_S:setsb2_s();break; - case MIX_STEREO:setsbpro();break; - case MIX_16STEREO:setsb16();break; - case MIX_ULTRA:setgus();break; - } -//backsndbuff[0]=128;backstep=0;backsnd=0; -lastdma=0; -mixpos=(int32_t)(mixbuffer+predstih); -memset(chaninfo,0,sizeof(TCHANNEL)*32); -memset(mixbuffer,0x80,65536); -} - -void play_sample(int channel,void *sample,int32_t size,int32_t lstart,int32_t sfreq,int type) - { - chaninfo[channel].play_pos=sample; - chaninfo[channel].start_loop=(char *)sample+lstart; - chaninfo[channel].end_loop=(char *)sample+size; - chaninfo[channel].speed_maj=sfreq/samplerate; - chaninfo[channel].speed_min=(sfreq%samplerate)*65536/samplerate; - chaninfo[channel].sample_type=type; - } - -void chan_break_ext(int channel,void *org_sample,int32_t size_sample) - { - chaninfo[channel].start_loop=chaninfo[channel].end_loop=(char *)org_sample+size_sample; - } - -void set_channel_volume(int channel,int left,int right) - { - left=(left*gfxvol)>>8; - right=(right*gfxvol)>>8; - left=max(left,0);left=min(left,32767); - right=max(right,0);right=min(right,32767); - if (swap_chans) - { - chaninfo[channel].vol_right=left; - chaninfo[channel].vol_left=right; - } - else - { - chaninfo[channel].vol_left=left; - chaninfo[channel].vol_right=right; - } - } - - -int int_relocation(); -#pragma aux int_relocation modify [eax ebx ecx edx esi edi] -void int_mixer_alloc(int num); -#pragma aux int_mixer_alloc parm [ebx] modify [eax ecx edx esi edi] -int int_dealloc(); -#pragma aux int_dealloc modify [eax ebx ecx edx esi edi] -void high_speed_parm(void *mix,int dosdelay,char *xlattab,int port); -#pragma aux high_speed_parm parm [ebx][eax][esi][edx] modify [edi] -void int_high_alloc(int num); -#pragma aux int_high_alloc parm [ebx] modify [eax ecx edx esi edi] -void write_adlib(int data); -#pragma aux write_adlib parm[eax] modify [edx] -void write_adlib_nodelay(int data); -#pragma aux write_adlib_nodelay parm[eax] modify [edx] - - -void __interrupt __far int_nosound_counter() - { - test_counter++; - _chain_intr(oldvect); - } - -void __interrupt __far int_adlib() - { - outp(0x20,0x20); - _enable(); - if (inp(timer_test_port) & 0x80) - { - test_counter++; - write_adlib_nodelay(0x8004); - } - mixer(); - _disable(); - _chain_intr(oldvect); - } - -void __interrupt __far int_normal() - { - outp(0x20,0x20); - _enable(); - test_counter++; - mixer(); - _disable(); - _chain_intr(oldvect); - } - - -void int_init() - { - int l; - - l=0x1234bc/mixfreq; - timer_test_port=0; - _disable(); - oldvect=_dos_getvect(0x8); - _dos_setvect(0x8,int_normal); - outp(0x43,0x34); - outp(0x40,l & 0xff); - outp(0x40,l>>8); - _enable(); - } - -void int_init_adlib_timer() - { - int l; - - timer_value=l=255-3125/mixfreq; - timer_test_port=0x388; - _disable(); - oldvect=_dos_getvect(0x8); - _dos_setvect(0x8,int_adlib); - write_adlib(l*256+3); - write_adlib(2*256+4); - _enable(); - } -/* -void int_ultrasnd() - { - { - int l; - - l=0x1234bc/mixfreq; - timer_test_port=0; - _disable(); - oldvect=_dos_getvect(0x8); - _dos_setvect(0x8,gus_irq); - outp(0x43,0x34); - outp(0x40,l & 0xff); - outp(0x40,l>>8); - _enable(); - } - } -*/ -void int_nosound() - { - int l; - _disable(); - oldvect=_dos_getvect(0x8); - _dos_setvect(0x8,int_nosound_counter); - l=0x1234bc/mixfreq; - outp(0x43,0x34); - outp(0x40,l%256); - outp(0x40,l/256); - _enable(); - } - -void int_highspeed(int port) - { - int l; - _dos_setvect(0x1c,int_normal); - high_speed_parm(mixbuffer,samplerate/mixfreq,da_xlat,port); - int_high_alloc(0x8); - l=0x1234bc/samplerate; - outp(0x43,0x34); - outp(0x40,l%256); - outp(0x40,l/256); - } - - -void set_mixing_device(int mix_dev,int mix_freq,...) - { - int *p; - samplerate=mix_freq; - if (mixbuffer==NULL) mixbuffer=buff_alloc(); - p=&mix_freq;p++; - device=mix_dev; - switch (mix_dev) - { - case DEV_SB10: - case DEV_SB20: - case DEV_SBPRO: - case DEV_SB16: - init_blaster(p[0]); - init_dma(p[1]); - devirq=p[2]; - break; - case DEV_DAC: - if (p[0]==0x42) set_mixing_device(DEV_PCSPEAKER,mix_freq); - else - { - rm_proc_set((int32_t)mixbuffer>>4,dpmiselector,p[0],DAC_MODE); - if (samplerate>22050) samplerate=22050; - } - break; - case DEV_PCSPEAKER: - rm_proc_set((int32_t)mixbuffer>>4,dpmiselector,0x42,SPK_MODE); - if (samplerate>19000) samplerate=19000; - break; - case DEV_ULTRA: - init_dma(p[1]); - devirq=p[2]; - dmamodenum=0x58; - if (dmanum>3) gus_dma_type=0x45;else gus_dma_type=0x41; - break; - case DEV_WSS: - devport=p[0]; - init_dma(p[1]); - break; - } - } - -int32_t pc_speak_position(void); - -void start_mixing() - { - ticker_save=*(int32_t *)0x46c; - test_counter=0; - switch (device) - { - case DEV_SB10: - prepare_mixing(MIX_MONO); - start_sb10(); - int_init(); - break; - case DEV_SB20: - prepare_mixing(MIX_MONO); - start_sbmono(); - int_init(); - break; - case DEV_SBPRO: - prepare_mixing(MIX_STEREO); - start_sbstereo(); - int_init(); - break; - case DEV_SB16: - prepare_mixing(MIX_16STEREO); - start_sb16(); - int_init(); - break; - case DEV_PCSPEAKER: - prepare_mixing(MIX_MONO_S); - pc_speak_set_proc(&getdma); - load_rm_proc(); - int_init(); - pc_speak_enable(); - pc_speak_run(samplerate,mixfreq); - break; - case DEV_DAC: - prepare_mixing(MIX_MONO_S); - pc_speak_set_proc(&getdma); - load_rm_proc(); - int_init(); - pc_speak_run(samplerate,mixfreq); - break; - case DEV_ULTRA: - prepare_mixing(MIX_ULTRA); - init_gus(); - int_init(); - delay(200); - break; - case DEV_WSS: - prepare_mixing(MIX_16STEREO); - start_wss16(); - int_init(); - break; - case DEV_NOSOUND:int_nosound();break; - } - mixer_zavora=0; - } - -void stop_mixing() - { - mixer_zavora=1; - _disable(); - *(int32_t *)0x46c=ticker_save+(int32_t)(((float)test_counter/mixfreq)*(18.2059)); - outp(0x43,0x34); - outp(0x40,0); - outp(0x40,0); - _enable(); - switch (device) - { - case DEV_SB10: - stop_sb10(); - break; - case DEV_SB20: - stop_sbmono(); - break; - case DEV_SBPRO: - stop_sbstereo(); - break; - case DEV_SB16: - stop_sb16(); - break; - case DEV_PCSPEAKER: - pc_speak_stop(); - pc_speak_disable(); - purge_rm_proc(); - break; - case DEV_DAC: - pc_speak_stop(); - purge_rm_proc(); - break; - case DEV_ULTRA: - stop_gus(); - break; - case DEV_WSS: - stop_wss16(); - break; - } - _dos_setvect(0x8,oldvect); - } - -void __far __interrupt sb_detect_irq2() -irqdetect(2) -void __far __interrupt sb_detect_irq3() -irqdetect(3) -void __far __interrupt sb_detect_irq5() -irqdetect(5) -void __far __interrupt sb_detect_irq7() -irqdetect(7) - - -char *device_name(int device) - { - - switch (device) - { - case DEV_NOSOUND:return names[1]; - case DEV_SB10:return names[2]; - case DEV_SB20:return names[3]; - case DEV_SBPRO:return names[4]; - case DEV_SB16:return names[5]; - case DEV_WSS:return names[6]; - case DEV_ULTRA:return names[7]; - case DEV_DAC:return names[8]; - case DEV_PCSPEAKER:return names[9]; - } - return names[0]; - } - -int sb_detect(int *dev,int *port,int *dma, int *irq) - { - int i,a,j; - char ver_lo; - char ver_hi; - void __far *irqsave2,__far *irqsave3,__far *irqsave5,__far *irqsave7; - int dmasaves[4]; - char dmadis[4]; - int dmatesting[4]={1,3,0,1}; - - *port=0x210; - do - { - devport=*port; - outp(devport+6,1);delay(1); - outp(devport+6,0); - for(i=0;i<100 && inp(devport+0xA)!=0xAA;i++) delay(1); - (*port)+=0x10; - } - while (i==100 && devport<0x280); - if (i==100) return -1; //NOT DETECTED; - *port=devport; - _disable();sendsb(0xe1);recivesb(ver_lo);recivesb(ver_hi);_enable(); - switch (ver_hi) - { - case 1: *dev=DEV_SB10;break; - case 2: if (ver_lo) *dev=DEV_SB20;break; - case 3: *dev=DEV_SBPRO;break; - case 4: *dev=DEV_SB16;break; - default: *dev=DEV_SB16;break; - } - if (*dev==DEV_SB16) - { - outp(devport+4,0x80); - i=inp(devport+5); - *irq=5; - if (i & 8) *irq=7; - if (i & 4) *irq=7; - if (i & 2) *irq=5; - if (i & 1) *irq=2; - outp(devport+4,0x81); - i=inp(devport+5); - *dma=1; - if (i & 0x20) *dma=5; - else if (i & 0x40) *dma=6; - else if (i & 0x80) *dma=7; - else if (i & 1) *dma=0; - else if (i & 2) *dma=1; - else if (i & 8) *dma=3; - return 0; - } - for(i=0;i<4;i++) - { - outp(0xc,0); - a=inp(dmatable[i][0]); - a=a+256*inp(dmatable[i][0]); - dmasaves[i]=a; - } - irqsave2=_dos_getvect(irqtable[2]); - irqsave3=_dos_getvect(irqtable[3]); - irqsave5=_dos_getvect(irqtable[5]); - irqsave7=_dos_getvect(irqtable[7]); - _dos_setvect(irqtable[2],sb_detect_irq2); - _dos_setvect(irqtable[3],sb_detect_irq3); - _dos_setvect(irqtable[5],sb_detect_irq5); - _dos_setvect(irqtable[7],sb_detect_irq7); - ver_lo=inp(0x21); - outp(0x21,0x53); - memset(detect_enables,0x1,sizeof(detect_enables)); - delay(100); - devirq=-1; - sendsb(0xf2); - delay(1); - _dos_setvect(irqtable[2],irqsave2); - _dos_setvect(irqtable[3],irqsave3); - _dos_setvect(irqtable[5],irqsave5); - _dos_setvect(irqtable[7],irqsave7); - outp(0x21,ver_lo); - if (devirq==-1) return -2; //DETECTION ERROR - *irq=devirq; - for(i=0;i<4;i++) - { - outp(0xc,0); - a=inp(dmatable[i][0]); - a=a+256*inp(dmatable[i][0]); - dmadis[i]=(dmasaves[i]==a); - } - for (j=0,*dma=-1;j<4 && *dma==-1;j++) - { - i=dmatesting[j]; - init_dma(i); - prepare_dma(NULL,65536); - sendsb(0xd3); - sendsb(0x14); - sendsb(0xff); - sendsb(0x7f); - delay(100); - outp(0xc,0); - a=inp(dmatable[i][0]); - a=a+256*inp(dmatable[i][0]); - if (dmasaves[i]!=a && dmadis[i]) *dma=i; - reset_blaster(); - } - if (*dma==-1) return -2; - return 0; - } - -int wss_detect(int *dev,int *port,int *dma,int *irq) - { - int wss_ports[]={0x530,0x604,0xe80,0xf40}; - int i,d; - - for(i=0;i<4;i++) - { - devport=wss_ports[i]; - if (!(inp(devport+0x4) & 0x80)) - { - sendwss(00,0xaa); - recivewss(00,d) - if (d==0xAA) break; - } - } - if (i==4) return -1; - *dev=DEV_WSS; - *port=devport; - *dma=1; - *irq=0; - return 0; - } - -int sound_detect(int *dev,int *port,int *dma, int *irq) - { - char *env; - char *f; - - *dev=0; - env=getenv("BS_SOUND"); - if (env!=NULL) - if (sscanf(env,"%d %x %d %d",dev,port,dma,irq)!=4) *dev=0; - if (*dev==0) - if (wss_detect(dev,port,dma,irq)) *dev=0; - if (*dev==0 && (env=getenv("ULTRASND"))!=NULL) - { - char c;int i; - sscanf(env,"%x%c%d%c%d%c%d",port,&c,dma,&c,&i,&c,irq); - *dev=DEV_ULTRA; - } - if (*dev==0 && (env=getenv("BLASTER"))!=NULL) - { - int i; - f=strchr(env,'T'); - if (f!=NULL) - { - sscanf(f+1,"%d",&i); - switch (i) - { - case 1:*dev=DEV_SB10;break; - case 2:*dev=DEV_SBPRO;break; - case 3:*dev=DEV_SB20;break; - case 4:*dev=DEV_SBPRO;break; - default: *dev=DEV_NOSOUND;break; - } - if (i>4) *dev=DEV_SB16; - } - f=strchr(env,'A'); - if (f!=NULL) sscanf(f+1,"%x",port);else *dev=0; - f=strchr(env,'I'); - if (f!=NULL) sscanf(f+1,"%d",irq);else *dev=0; - f=strchr(env,'D'); - if (f!=NULL) sscanf(f+1,"%d",dma);else *dev=0; - f=strchr(env,'H'); - if (f!=NULL) sscanf(f+1,"%d",dma); - } - if (*dev==0) - { - if (sb_detect(dev,port,dma,irq) && sb_detect(dev,port,dma,irq) && sb_detect(dev,port,dma,irq)) - { - *dev=0; - } - } - return -(*dev==0); - } - -/*main() -{ -printf("%d\n",sizeof(TCHANNEL)); -if (sb_detect(&a,&b,&c,&d)) - { - printf("SB not present\n"); - return; - } -//a=DEV_SBPRO; -printf("%s\n",device_name(a)); -//printf("IRQ:\n"); -//scanf("%d",&d); -set_mixing_device(a,22050,b,c,d); -printf("Port %03X dma %d irq %d freq %d.\n",b,c,d,samplerate); -open_backsound(MUSIC1); -start_mixing(); -mixing(); -stop_mixing(); -printf("\n\n\n"); -} -*/ -void change_music(char *filename) - { - mix_back_sound(0); - if (bsnd!=NULL)fclose(bsnd); - fade_music(); - open_backsound(filename); - } - -int get_timer_value() - { - return test_counter; - } - -char get_channel_state(int channel) - { - return chaninfo[channel].sample_type; - } - -void get_channel_volume(int channel,int *left,int *right) - { - *left=chaninfo[channel].vol_left; - *right=chaninfo[channel].vol_right; - } - -void mute_channel(int channel) - { - chaninfo[channel].sample_type=0; - } - -void chan_break_loop(int channel) - { - chaninfo[channel].start_loop=chaninfo[channel].end_loop; - } - -void get_bass_treble(int *x,int *y) - { - if (device==DEV_SB16) - { - outp(devport+4,0x44);*x=inp(devport+5); - outp(devport+4,0x46);*y=inp(devport+5); - } - else - { - *x=255; - *y=255; - } - } - -char sb_set_global_volume(int x) - { - if (device==DEV_SBPRO) - { - outp(devport+4,2);outp(devport+5,(x & 0xf0) | (x>>4)); - } - else if (device==DEV_SB16) - { - outp(devport+4,2);outp(devport+5,(x & 0xf0) | (x>>4)); - outp(devport+4,0x30);outp(devport+5,x); - outp(devport+4,0x31);outp(devport+5,x); - } - else return 1; - return 0; - } - - -char sb_get_global_volume() - { - if (device==DEV_SBPRO) - { - outp(devport+4,2);return inp(devport+5)&0xf0; - } - else if (device==DEV_SB16) - { - int check1,check2; - outp(devport+4,2);check1=inp(devport+5)&0xf0; - outp(devport+4,0x30);check2=inp(devport+5); - if (check1!=check2 & 0xe0) return check1;else return check2; - } - else return 1; - } - -void wss_set_global_volume(int x) - { - x>>=4; - sendwss(06,0xf-x); - sendwss(07,0xf-x); - } - -char wss_get_global_volume() - { - int x; - - recivewss(06,x); - x<<=4; - return 0xff-x; - } - -void set_music_volume(int volume) - { - if (volume==0 && bvolume!=0) - memset(backsndbuff,0,sizeof(backsndbuff)); - bvolume=volume; - } - -int get_music_volume() - { - return bvolume; - } - -void set_gfx_volume(int volume) - { - gfxvol=volume; - } - -int get_gfx_volume() - { - return gfxvol; - } - - -void snd_ping1(int data) - { - data; - } - -int snd_ping2() - { - return 0; - } - - -void set_swap_channels(int data) - { - swap_chans=data & 1; - } - -int get_swap_channels() - { - return swap_chans; - } - -void set_treble(int y) - { - outp(devport+4,0x44);outp(devport+5,y); - outp(devport+4,0x45);outp(devport+5,y); - } -void set_bass(int x) - { - outp(devport+4,0x46);outp(devport+5,x); - outp(devport+4,0x47);outp(devport+5,x); - } - -int get_treble() - { - outp(devport+4,0x44);return inp(devport+5); - } -int get_bass() - { - outp(devport+4,0x46);return inp(devport+5); - } - -char gus_swap=0; -char gus_volume=0xff; - -void set_gus_swap(int x) - { - gus_swap=x; - gus_setchan_pan(0,x>>4); - gus_setchan_pan(1,(0xff-x)>>4); - } - -void set_xbass(int x) - { - bxbass=x; - } - -int get_xbass() - { - return bxbass; - } - -int get_gus_swap() - { - return gus_swap; - } - -void gus_set_global_volume(int x) - { - gus_setchan_vol(0,x<<8); - gus_setchan_vol(1,x<<8); - gus_volume=x; - } - -int gus_get_global_volume() - { - return gus_volume; - } - -char get_outfilter() - { - return hw_intpol; - } - - -char set_outfilter(char value) - { - int a; - - if (device!=DEV_SBPRO) return 1; - if (value>1) hw_intpol=!hw_intpol; - else hw_intpol=value; - do - { - a=inp(dmaposadr); - a+=inp(dmaposadr)<<8; - } - while (a & 1); - do - { - a=inp(dmaposadr); - a+=inp(dmaposadr)<<8; - } - while (!(a & 1)); - outp(devport+0x4,0x0e); - if (hw_intpol) outp(devport+0x5,inp(devport+0x5) & ~0x20); - else outp(devport+0x5,inp(devport+0x5) | 0x20); - return 0; - } - -typedef void (*FPROC_SET)(int data); -typedef int (*FPROC_GET)(); - -FPROC_SET set_funct_table[][SND_MAXFUNCT]= - { - {snd_ping1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}, - {snd_ping1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,set_gfx_volume,set_music_volume,set_xbass}, - {snd_ping1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,set_gfx_volume,set_music_volume,set_xbass}, - {snd_ping1,sb_set_global_volume,NULL,NULL,set_swap_channels,NULL,NULL,set_outfilter,set_gfx_volume,set_music_volume,set_xbass}, - {snd_ping1,sb_set_global_volume,set_bass,set_treble,set_swap_channels,NULL,NULL,NULL,set_gfx_volume,set_music_volume,set_xbass}, - {snd_ping1,wss_set_global_volume,NULL,NULL,set_swap_channels,NULL,NULL,NULL,set_gfx_volume,set_music_volume,set_xbass}, - {snd_ping1,gus_set_global_volume,NULL,NULL,NULL,set_gus_swap,NULL,NULL,set_gfx_volume,set_music_volume,set_xbass}, - {snd_ping1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,set_gfx_volume,set_music_volume,set_xbass}, - {snd_ping1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,set_gfx_volume,set_music_volume,set_xbass}, - }; - -FPROC_GET get_funct_table[][SND_MAXFUNCT]= - { - {snd_ping2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}, - {snd_ping2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,get_gfx_volume,get_music_volume,get_xbass}, - {snd_ping2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,get_gfx_volume,get_music_volume,get_xbass}, - {snd_ping2,sb_get_global_volume,NULL,NULL,get_swap_channels,NULL,NULL,get_outfilter,get_gfx_volume,get_music_volume,get_xbass}, - {snd_ping2,sb_get_global_volume,get_bass,get_treble,get_swap_channels,NULL,NULL,NULL,get_gfx_volume,get_music_volume,get_xbass}, - {snd_ping2,wss_get_global_volume,NULL,NULL,get_swap_channels,NULL,NULL,NULL,get_gfx_volume,get_music_volume,get_xbass}, - {snd_ping2,gus_get_global_volume,NULL,NULL,NULL,get_gus_swap,NULL,NULL,get_gfx_volume,get_music_volume,get_xbass}, - {snd_ping2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,get_gfx_volume,get_music_volume,get_xbass}, - {snd_ping2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,get_gfx_volume,get_music_volume,get_xbass}, - }; - -char check_snd_effect(int funct) - { - return set_funct_table[device][funct]!=NULL; - } - -char set_snd_effect(int funct,int data) - { - if (set_funct_table[device][funct]!=NULL) - { - set_funct_table[device][funct](data); - return 1; - } - return 0; - } - -int get_snd_effect(int funct) - { - if (get_funct_table[device][funct]!=NULL) - { - return get_funct_table[device][funct](); - } - return 0; - } - - -void force_music_volume(int volume) - { - bvolume=volume; - } diff --git a/ZVUK/zvuk.h b/ZVUK/zvuk.h deleted file mode 100644 index a136066..0000000 --- a/ZVUK/zvuk.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef __ZVUK_H___ -#define __ZVUK_H___ - -#ifdef __cplusplus -extern "C" { -#endif - -#define BACK_BUFF_SIZE 0x40000 - -#define DEV_NOSOUND 0 -#define DEV_SB10 1 -#define DEV_SB20 2 -#define DEV_SBPRO 3 -#define DEV_SB16 4 -#define DEV_WSS 5 -#define DEV_ULTRA 6 -#define DEV_DAC 7 -#define DEV_PCSPEAKER 8 -#define DEV_DIRECTSOUND 9 //only valid device for this module - -extern int bvolume; - - -int sound_detect(int *dev,int *port,int *dma, int *irq); -void set_mixing_device(int mix_dev,int mix_freq,...); -char start_mixing(void); -void stop_mixing(void); -void play_sample(int channel,const void *sample,int32_t size,int32_t lstart,int32_t sfreq,int type); -void set_channel_volume(int channel,int left,int right); -void set_end_of_song_callback(const char * (*cb)(void *), void *ctx); - -void fade_music(void); -int mix_back_sound(int synchro); -int open_backsound(char *filename); -void change_music(const char *filename); -int get_timer_value(void); -const char *device_name(int device); -void force_music_volume(int volume); - -void set_backsnd_freq(int freq); - -char get_channel_state(int channel); -void get_channel_volume(int channel,int *left,int *right); -void mute_channel(int channel); -void chan_break_loop(int channel); -void chan_break_ext(int channel,const void *org_sample,int32_t size_sample); //zrusi loop s moznosti dohrat zvuk - -char set_snd_effect(int funct,int data); -char check_snd_effect(int funct); -int get_snd_effect(int funct); - -void *PrepareVideoSound(int mixfreq, int buffsize); -char LoadNextVideoFrame(void *buffer, const char *data, int size, const short *xlat, short *accnums, int32_t *writepos); -void DoneVideoSound(void *buffer); - - -#define SND_MAXFUNCT 11 -#define SND_PING 0 //Ping function -#define SND_GVOLUME 1 //SetGlobalVolume -#define SND_BASS 2 //SetBass -#define SND_TREBL 3 //SetTrebles -#define SND_SWAP 4 //SetSwapChannels -#define SND_LSWAP 5 //SetLinearSwapping -#define SND_SURROUND 6 //Surrourd -#define SND_OUTFILTER 7//Out Filter -#define SND_GFX 8 //setgfxvolume -#define SND_MUSIC 9 //setmusicvolume -#define SND_XBASS 10 //setxbassy - -#ifdef __cplusplus - } -#endif -#endif - diff --git a/ZVUK/zvuk_dx.cpp b/ZVUK/zvuk_dx.cpp deleted file mode 100644 index c74cab6..0000000 --- a/ZVUK/zvuk_dx.cpp +++ /dev/null @@ -1,842 +0,0 @@ -#define INITGUID -#include -#include -#include -#include -#define DWORD_PTR DWORD * -#include -#include "types.h" -#include "zvuk.h" -#include -extern "C" { -#include - } -#define MAXCHANNELS 32 -#define TIMEIDLESTOPCHANNEL 250 -#define DEFAULTBUFFERSIZE (256*1024) -#define FADELENGTH 3000 -#define MUS_ERRORWAIT 5000 -#include "Music.h" - - -static int cur_device=0; -static int cur_mixfreq=0; -static bool swap_chans=false; - -class CheckRes - { - public: - HRESULT operator=(HRESULT other) - { - if (other==0) return 0; - char buff[256]; - sprintf(buff,"DirectSound error HRESULT %08X, code %d",other,other & 0xFFFF); - int id=MessageBox(NULL,buff,NULL,MB_SYSTEMMODAL|MB_ABORTRETRYIGNORE); - if (id==IDRETRY) - { - __asm int 3; - return other; - } - if (id==IDIGNORE) return other; - exit(-1); - } - }; - - - - - -static CheckRes hres; -static HWND hWndDS8=NULL; -static IDirectSound8 *ds8=NULL; -static IDirectSoundBuffer *ds_primary; -static WAVEFORMATEX waveformat; -static int gfx_volume=255; -static int music_volume=127; -static int glob_volume=255; -static int linvoltable[256]; -static MusicPlayer GMusicPlayer; -static MusDecoder GMusDecoder; -static WinAmpDecoder GWinAmpPlayer; -static IDecoder *GCurrentDecoder=&GMusDecoder; - - -class SoundChannelInfo - { - public: - CRITICAL_SECTION sect; - char *play_pos, *start_loop, *end_loop; - IDirectSoundBuffer8 *buffer; - uint32_t chantype; - uint32_t idsPlayPos; - uint32_t idsWritePos; - uint32_t idsBuffSize; - int32_t volume; //volume for DS - int32_t pan; //pan for DS - int volleft; //left volume for skeldal - int volright; //right volume for skeldal - uint32_t preload; - uint32_t stopTime; //time, when buffer reached end. For calculating idle time - uint32_t startTime; //time, when buffer started. For calculating idle time, use 0 to sticky buffer - SoundChannelInfo() - { - buffer=NULL; - play_pos=start_loop=end_loop=NULL; - InitializeCriticalSection(§); - pan=DSBPAN_CENTER; - volume=DSBVOLUME_MAX; - } - ~SoundChannelInfo() {if (buffer) buffer->Release();DeleteCriticalSection(§);} - uint32_t CalculateLockSize(); - void ChannelMaintaince(); - bool IsPlaying() {return play_pos!=NULL;} -// bool IsFree(char type) {return play_pos==NULL || (type==chantype && play_pos==end_loop);} - void Reset(); - void InitChannel(char type, char *ppos, char *bloop,char *eloop, int freq); - void Lock() {EnterCriticalSection(§);} - void Unlock() {LeaveCriticalSection(§);} - bool TryLock() {return TryEnterCriticalSection(§)!=FALSE;} - void SetVolume(int32_t vol) - { - Lock(); - if (volume!=vol) if (buffer && play_pos ) hres=buffer->SetVolume(vol); - volume=vol; - Unlock(); - } - void SetPan(int32_t p) - { - Lock(); - if (pan!=p) if (buffer && play_pos ) hres=buffer->SetPan(p); - pan=p; - Unlock(); - } - void Mute() - { - Lock(); - Stop(); - Unlock(); - } - void Stop() - { - if (buffer) - buffer->Stop(); - play_pos=NULL; - } - - void BreakLoop() {start_loop=end_loop;} - void BreakLoopEx(char *end_sample) {start_loop=end_loop=end_sample;} - }; - -static bool shutMaintaince=false; -static SoundChannelInfo channels[MAXCHANNELS]; -static HANDLE maintainceThread; - -ULONG __stdcall MaintainceThread(void *); - -static void DSStart(int mixfreq) - { - DSBUFFERDESC desc; - - for (int i=1;i<256;i++) - { - double rang=pow(i/255.0,15); - linvoltable[i]=100*log(rang); - - } - linvoltable[0]=-10000; - - hres=DirectSoundCreate8(&DSDEVID_DefaultPlayback,&ds8,NULL); - if (hWndDS8) hres=ds8->SetCooperativeLevel(hWndDS8,DSSCL_PRIORITY); - memset(&desc,0,sizeof(desc)); - desc.dwSize=sizeof(desc); - desc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME; - hres=ds8->CreateSoundBuffer(&desc,&ds_primary,NULL); - - waveformat.cbSize=sizeof(waveformat); - waveformat.nBlockAlign=4; - waveformat.nChannels=2; - waveformat.nSamplesPerSec=mixfreq; - waveformat.nAvgBytesPerSec=mixfreq*4; - waveformat.wBitsPerSample=16; - waveformat.wFormatTag=WAVE_FORMAT_PCM; - - hres=ds_primary->SetFormat(&waveformat); - DWORD id; - - shutMaintaince=false; - maintainceThread=CreateThread(NULL,0,MaintainceThread,NULL,0,&id); - SetThreadPriority(maintainceThread,THREAD_PRIORITY_HIGHEST); - - GMusicPlayer.InitBuffer(ds8,linvoltable); - GMusicPlayer.Play(); - } - -void init_winamp_plugins(const char *path) -{ - GWinAmpPlayer.LoadPlugins(path); -} - -static void DSStop() - { - GCurrentDecoder->Stop(); - GMusDecoder.Stop(); - GMusicPlayer.Done(); - GWinAmpPlayer.ClearList(); - shutMaintaince=true; - WaitForSingleObject(maintainceThread,INFINITE); - CloseHandle(maintainceThread); - for (int i=0;iRelease();channels[i].buffer=NULL;} - if (ds_primary) ds_primary->Release(); - ds_primary=NULL; - if (ds8) ds8->Release(); - ds8=NULL; - } - -uint32_t SoundChannelInfo::CalculateLockSize() - { - if (buffer==NULL) return 0; - uint32_t playpos; - buffer->GetCurrentPosition(NULL,&playpos); - int32_t diff=(signed)playpos-(signed)idsPlayPos; - if (diff<0) diff+=idsBuffSize; - uint32_t wendpos=playpos+preload; - if (wendpos>=idsBuffSize) wendpos-=idsBuffSize; - if (wendposplaypos) return 0; - if (wendposidsBuffSize/2) sz=idsBuffSize/2; - idsPlayPos=playpos; - return sz; - } - -void SoundChannelInfo::ChannelMaintaince() - { - Lock(); - if (play_pos!=NULL) - { - if (play_pos!=end_loop) stopTime=GetTickCount(); - uint32_t lockSize=CalculateLockSize(); - if (lockSize) - { - // printf("%8d\r",lockSize); - void *audioptrs[2]; - uint32_t sizes[2]; - hres=buffer->Lock(idsWritePos,lockSize,audioptrs,sizes,audioptrs+1,sizes+1,0); - for (int i=0;i<2 && audioptrs[i];i++) - { - char *wrt=(char *)audioptrs[i]; - for (uint32_t j=0;jUnlock(audioptrs[0],sizes[0],audioptrs[1],sizes[1]); - idsWritePos+=lockSize; - if (idsWritePos>=idsBuffSize) idsWritePos-=idsBuffSize; - } - if (play_pos==end_loop && GetTickCount()-stopTime>TIMEIDLESTOPCHANNEL) - { - Stop(); - } - } - Unlock(); - } - -static void MixMaintaince() - { - for (int i=0;iRelease(); - buffer=NULL; - Unlock(); - } - -void SoundChannelInfo::InitChannel(char type, char *ppos, char *bloop,char *eloop, int freq) - { - Lock(); - uint32_t newchantype=type+freq*4; - if (chantype!=newchantype || buffer==NULL) - { - Reset(); - DSBUFFERDESC desc; - WAVEFORMATEX wfex; - wfex.cbSize=sizeof(wfex); - wfex.wFormatTag=WAVE_FORMAT_PCM; - wfex.wBitsPerSample=type==1?8:16; - wfex.nSamplesPerSec=freq; - wfex.nChannels=1; - wfex.nBlockAlign=type==1?1:2; - wfex.nAvgBytesPerSec=wfex.nBlockAlign*wfex.nSamplesPerSec; - - memset(&desc,0,sizeof(desc)); - desc.dwSize=sizeof(desc); - desc.dwFlags=DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLPAN|DSBCAPS_CTRLVOLUME|DSBCAPS_GETCURRENTPOSITION2; - desc.dwBufferBytes=DEFAULTBUFFERSIZE; - desc.lpwfxFormat=&wfex; - - preload=wfex.nAvgBytesPerSec/5; - - IDirectSoundBuffer *bufold; - - hres=ds8->CreateSoundBuffer(&desc,&bufold,NULL); - hres=bufold->QueryInterface(IID_IDirectSoundBuffer8,(void **)&buffer); - bufold->Release(); - - idsPlayPos=DEFAULTBUFFERSIZE-cur_mixfreq; - idsWritePos=0; - idsBuffSize=DEFAULTBUFFERSIZE; - - play_pos=ppos; - start_loop=bloop; - end_loop=eloop; - - chantype=newchantype; - - hres=buffer->SetVolume(volume); - hres=buffer->SetPan(pan); - - ChannelMaintaince(); - - hres=buffer->Play(0,0,DSBPLAY_LOOPING); - stopTime=startTime=GetTickCount(); - } - else - { - buffer->Stop(); - idsBuffSize=DEFAULTBUFFERSIZE; - buffer->SetCurrentPosition(0); - buffer->GetCurrentPosition(&idsPlayPos,&idsWritePos); - hres=buffer->SetVolume(volume); - hres=buffer->SetPan(pan); - play_pos=ppos; - start_loop=bloop; - end_loop=eloop; - ChannelMaintaince(); - buffer->Play(0,0,DSBPLAY_LOOPING); - stopTime=startTime=GetTickCount(); - } - Unlock(); - } - -/* -static int FindFreeChannel(char type) - { - int older=0; - DWORD m_age=0; - DWORD timval=GetTickCount(); - for (int i=0;im_age) {older=i;m_age=age;} - } - return older; - } - */ - - -extern "C" - { -int bvolume; //background volume -void (*konec_skladby)(char **jmeno)=NULL; //pointer to function to notify that end of song has been reached - -void DSReportWindowCreation(HWND hWindow) - { - hWndDS8=hWindow; - if (ds8!=NULL) hres=ds8->SetCooperativeLevel(hWndDS8,DSSCL_PRIORITY); - } - - -int sound_detect(int *dev,int *port,int *dma, int *irq) - { - *dev=DEV_DIRECTSOUND; - *port=0; - *dma=0; - *irq=0; - return 0; - } - -void set_mixing_device(int mix_dev,int mix_freq,...) - { - cur_device=mix_dev; - cur_mixfreq=mix_freq; - } - -char start_mixing() - { - if (cur_device!=DEV_DIRECTSOUND) - { - MessageBox(hWndDS8,"Invalid sound device! Check SKELDAL.INI. Only device 9 (DirectSound) can be used.",NULL,MB_SYSTEMMODAL); - exit(1); - } - if (cur_mixfreq==0) return FALSE; - DSStart(cur_mixfreq); - return TRUE; - } -void stop_mixing() - { - DSStop(); - } - -void play_sample(int channel,void *sample,int32_t size,int32_t lstart,int32_t sfreq,int type) - { - char *start=(char *)sample; - channels[channel].InitChannel(type,start,start+lstart,start+size,sfreq); - } - -void set_channel_volume(int channel,int left,int right) - { - if (left>32767) left=32767; - if (left<0) left=0; - if (right>32767) right=32767; - if (right<0) right=0; - int volleft=linvoltable[(left>>7)*gfx_volume/255]; - int volright=linvoltable[(right>>7)*gfx_volume/255]; - int volsum=__max(volleft,volright); - channels[channel].SetVolume(volsum); - channels[channel].SetPan(swap_chans?(volright-volleft):(volleft-volright)); - channels[channel].volleft=left; - channels[channel].volright=right; - } - -char get_channel_state(int channel) - { - return channels[channel].IsPlaying()==true; - } - -void get_channel_volume(int channel,int *left,int *right) - { - if (left) *left=channels[channel].volleft; - if (right) *right=channels[channel].volright; - } - -void mute_channel(int channel) - { - channels[channel].Mute(); - } - -void chan_break_loop(int channel) - { - channels[channel].BreakLoop(); - } - -void chan_break_ext(int channel,void *org_sample,int32_t size_sample) //zrusi loop s moznosti dohrat zvu - { - char *end_sample=(char *)org_sample+size_sample; - channels[channel].BreakLoopEx(end_sample); - } - -char set_snd_effect(int funct,int data) - { - switch (funct) - { - case SND_PING: return 1; - case SND_SWAP: swap_chans=(data & 1)!=0;return 1; - case SND_GFX: gfx_volume=data;return 1; - case SND_MUSIC: GCurrentDecoder->SetVolume(music_volume=data,get_snd_effect(SND_GVOLUME));return 1; - case SND_GVOLUME: hres=ds_primary->SetVolume(linvoltable[glob_volume=data]);return 1; - default: return 0; - } - } - -int get_snd_effect(int funct) - { - switch (funct) - { - case SND_PING: return 1; - case SND_SWAP: return swap_chans; - case SND_GFX: return gfx_volume; - case SND_MUSIC: return music_volume; - case SND_GVOLUME: return glob_volume; - default: return 0; - } - - } - -char check_snd_effect(int funct) - { - switch (funct) - { - case SND_PING: - case SND_SWAP: - case SND_MUSIC: - case SND_GVOLUME: - case SND_GFX: return 1; - default: return 0; - } - } - - - - -static DWORD Mus_buffSize; -/* -static HANDLE music_file=NULL; -static HANDLE next_music_file=NULL; -static bool fading=false; -static DWORD fadetime; -static DWORD Mus_lastWritePos; -static DWORD Mus_nextBlockSize; -static DWORD Mus_nextBlockRead; -static DWORD Mus_errorWait=0; -static DWORD Mus_silentPlay=0; - -#pragma pack (1) - -struct MusFile - { - short channels; - int32_t freq; - int32_t ssize; - int32_t blocks; - int32_t reserved1; - int32_t reserved2; - short ampltable[256]; - }; - -static MusFile curMus; - -#pragma pack() - - - - -static char OpenMus(HANDLE music_file) - { - DWORD bytesread; - - SetFilePointer(music_file,0,NULL,FILE_BEGIN); - - if (ReadFile(music_file,&curMus,sizeof(curMus),&bytesread,NULL)==TRUE && bytesread==sizeof(curMus)) - { - if (ReadFile(music_file,&Mus_nextBlockRead,sizeof(Mus_nextBlockRead),&bytesread,NULL)==FALSE) return 0; - if (ReadFile(music_file,&Mus_nextBlockSize,sizeof(Mus_nextBlockSize),&bytesread,NULL)==FALSE) return 0; - - - if (ds_music!=NULL) ds_music->Release(); - - WAVEFORMATEX wfex; - wfex.cbSize=sizeof(wfex); - wfex.wBitsPerSample=16; - wfex.nBlockAlign=2*curMus.channels; - wfex.nSamplesPerSec=curMus.freq; - wfex.nAvgBytesPerSec=curMus.freq*wfex.nBlockAlign; - wfex.wFormatTag=WAVE_FORMAT_PCM; - wfex.nChannels=curMus.channels; - - DSBUFFERDESC desc; - desc.dwSize=sizeof(desc); - desc.dwBufferBytes=Mus_buffSize=wfex.nAvgBytesPerSec*4; - desc.dwReserved=0; - desc.dwFlags=DSBCAPS_CTRLVOLUME ; - desc.lpwfxFormat=&wfex; - - IDirectSoundBuffer *dsbf; - - hres=ds8->CreateSoundBuffer(&desc,&dsbf,NULL); - hres=dsbf->QueryInterface(IID_IDirectSoundBuffer8,(void **)&ds_music); - dsbf->Release(); - - void *ptr; - DWORD size; - - ds_music->Lock(0,0,&ptr,&size,NULL,NULL,DSBLOCK_ENTIREBUFFER); - memset(ptr,0,size); - ds_music->Unlock(ptr,size,NULL,NULL); - ds_music->SetVolume(linvoltable[music_volume]); - ds_music->Play(0,0,DSBPLAY_LOOPING); - fadetime=0; - Mus_lastWritePos=wfex.nAvgBytesPerSec; - Mus_silentPlay=0; - - return 1; - } - return 0; - } - -static void PrepareMusFile(const char *filename) - { - CloseHandle(next_music_file); - next_music_file=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ, - NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, - NULL); - if (next_music_file==INVALID_HANDLE_VALUE) - next_music_file=NULL; - } - -static char music_decompres_block() - { - DWORD bytesread; - char *data=(char *)alloca(Mus_nextBlockRead); - short accum[2]={0,0}; - char curchan=0; - - DWORD lockSizes[2]; - void *lockPtrs[2]; - - if (ReadFile(music_file,data,Mus_nextBlockRead,&bytesread,NULL)==FALSE) return 0; - - ds_music->Lock(Mus_lastWritePos,Mus_nextBlockSize,lockPtrs,lockSizes,lockPtrs+1,lockSizes+1,0); - for (int j=0;j<2;j++) - { - short *target=(short *)lockPtrs[j]; - for (DWORD i=0;i=curMus.channels) curchan=0; - } - } - ds_music->Unlock(lockPtrs[0],lockSizes[0],lockPtrs[1],lockSizes[1]); - Mus_lastWritePos+=Mus_nextBlockSize; - if (Mus_lastWritePos>=Mus_buffSize) Mus_lastWritePos-=Mus_buffSize; - return 1; - } - -static char music_silent_play() - { - DWORD lockSizes[2]; - void *lockPtrs[2]; - - ds_music->Lock(Mus_lastWritePos,Mus_nextBlockSize,lockPtrs,lockSizes,lockPtrs+1,lockSizes+1,0); - for (int j=0;j<2;j++) - { - short *target=(short *)lockPtrs[j]; - for (DWORD i=0;iUnlock(lockPtrs[0],lockSizes[0],lockPtrs[1],lockSizes[1]); - Mus_lastWritePos+=Mus_nextBlockSize; - if (Mus_lastWritePos>=Mus_buffSize) Mus_lastWritePos-=Mus_buffSize; - return 1; - } - - -void fade_music() - { - if (fadetime==0) fadetime=music_file?GetTickCount():0; - } - - -static int mix_back_sound_worker() - { - DWORD bytesread; - if (music_file==NULL) return -2; - if (ds_music==NULL) - if (OpenMus(music_file)==0) return -2; - DWORD play; - ds_music->GetCurrentPosition(&play,NULL); - while (true) - { - if (Mus_lastWritePos<=play) - { - if (Mus_lastWritePos+Mus_nextBlockSize>=play) return 0; - } - else - { - if (Mus_lastWritePos+Mus_nextBlockSize>play+Mus_buffSize) return 0; - } - if (Mus_silentPlay) - { - if (Mus_silentPlay>GetTickCount()) - { - music_silent_play(); - return 0; - } - else - return -2; - } - - if (music_decompres_block()==0) return -2; - curMus.blocks--; - if (curMus.blocks<0) - { - Mus_silentPlay=GetTickCount()+4000; - return 0; - } - if (ReadFile(music_file,&Mus_nextBlockRead,sizeof(Mus_nextBlockRead),&bytesread,NULL)==FALSE) return -2; - if (ReadFile(music_file,&Mus_nextBlockSize,sizeof(Mus_nextBlockSize),&bytesread,NULL)==FALSE) return -2; - if (fadetime && fadetime+FADELENGTHIsPlaying()) return 0; - char *next_music; - - konec_skladby(&next_music); - change_music(next_music); - return 0; - } - -void change_music(const char *mus_filename) - { - if (GCurrentDecoder->NotUsingOutput()) GMusDecoder.Stop(); - GCurrentDecoder->Stop(); - if (mus_filename==0) - { - mus_filename="?"; - GCurrentDecoder=&GMusDecoder; - } - else - { - const char *c=strrchr(mus_filename,'.'); - if (c!=0 && istrcmp(c,".mus")==0) - GCurrentDecoder=&GMusDecoder; - else - GCurrentDecoder=&GWinAmpPlayer; - } - GCurrentDecoder->AttachOutput(&GMusicPlayer); - if (GCurrentDecoder->Play(mus_filename)==false) change_music(0); - GCurrentDecoder->SetVolume(music_volume,get_snd_effect(SND_GVOLUME)); - if (GCurrentDecoder->NotUsingOutput()) - GMusDecoder.Play("?"); - } - - -int get_timer_value() - { - return GetTickCount()/TIMERSPEED - } -char *device_name(int device) - { - if (device!=DEV_DIRECTSOUND) return "Unknown device!"; - else return "DirectSound 8"; - } -void force_music_volume(int volume) - { - } -void set_backsnd_freq(int bfreq) - { - } - -void *PrepareVideoSound(int mixfreq, int buffsize) - { - WAVEFORMATEX wfex; - wfex.cbSize=sizeof(wfex); - wfex.wBitsPerSample=16; - wfex.nBlockAlign=4; - wfex.nSamplesPerSec=mixfreq; - wfex.nAvgBytesPerSec=mixfreq*wfex.nBlockAlign; - wfex.wFormatTag=WAVE_FORMAT_PCM; - wfex.nChannels=2; - - DSBUFFERDESC desc; - desc.dwSize=sizeof(desc); - desc.dwBufferBytes=Mus_buffSize=buffsize; - desc.dwReserved=0; - desc.dwFlags=DSBCAPS_CTRLVOLUME ; - desc.lpwfxFormat=&wfex; - - IDirectSoundBuffer *dsbf; - IDirectSoundBuffer8 *ds_music; - - hres=ds8->CreateSoundBuffer(&desc,&dsbf,NULL); - hres=dsbf->QueryInterface(IID_IDirectSoundBuffer8,(void **)&ds_music); - dsbf->Release(); - - void *ptr; - DWORD size; - - ds_music->Lock(0,0,&ptr,&size,NULL,NULL,DSBLOCK_ENTIREBUFFER); - memset(ptr,0,size); - ds_music->Unlock(ptr,size,NULL,NULL); - ds_music->SetVolume(0); - ds_music->Play(0,0,DSBPLAY_LOOPING); - return (void *)ds_music; - } - -char LoadNextVideoFrame(void *buffer, char *data, int size, short *xlat,short *accnums, int32_t *writepos) - { - IDirectSoundBuffer8 *ds_music=(IDirectSoundBuffer8 *)buffer; - DSBCAPS caps; - caps.dwSize=sizeof(caps); - ds_music->GetCaps(&caps); - DWORD play; - ds_music->GetCurrentPosition(&play,NULL); - int32_t remain=play-*writepos; - if (remain<0) remain+=caps.dwBufferBytes; - if (remainLock(*writepos,size*2,lockPtrs,lockSizes,lockPtrs+1,lockSizes+1,0); - for (int j=0;j<2;j++) - { - short *target=(short *)lockPtrs[j]; - for (DWORD i=0;i32767) - {accnums[curchan]-=val-32768;val=32767;} - if (val<-32767) - {accnums[curchan]-=val+32768;val=-32767;} - accnums[curchan]=val; -/* if (data[-1]==0) //pridano jako provizorni reseni pro korekci chyby komprimacniho programu - { - val-=31767; - }*/ - *target++=val; - curchan++; - if (curchan>=2) curchan=0; - } - } - ds_music->Unlock(lockPtrs[0],lockSizes[0],lockPtrs[1],lockSizes[1]); - writepos[0]+=size*2; - if (writepos[0]>caps.dwBufferBytes) writepos[0]-=caps.dwBufferBytes; - return 1; - } - - -void DoneVideoSound(void *buffer) - { - IDirectSoundBuffer8 *ds_music=(IDirectSoundBuffer8 *)buffer; - ds_music->Stop(); - ds_music->Release(); - } - -} - diff --git a/ZVUK/zvuka.asm b/ZVUK/zvuka.asm deleted file mode 100644 index f557efa..0000000 --- a/ZVUK/zvuka.asm +++ /dev/null @@ -1,1247 +0,0 @@ -.model small -.386P - -DGROUP group _DATA - - -tchannel struct - PLAYPOS DD ? - STARTLOOP DD ? - ENDLOOP DD ? - SPEEDMAJ DD ? - SPEEDMIN DW ? - MINORPOS DW ? - SMPTYPE DW ?;0 - DISABLED, 1 - 8 BIT, 2 - 16 BIT - VOLUMELEFT DW ? - VOLUMERIGHT DW ? -tchannel ends - -rm_playdata struct - XLAT_TAB DB 256 DUP(?) - SCANOFS DW ? - SCANSEG DW ? - PORT DW ? -rm_playdata ends - -extrn _chaninfo:dword -extrn _mixbuffer:dword -extrn _backsnd:dword ;ukazatel na buffer s hudbou na pozadi (64Kb) -extrn _backstep:dword ;krok o kolik se meni _backsnd -extrn _backfine:dword ;citac udavajici kdy se zmeni _backsnd -extrn _backsndbuff:dword ;buffer hudby na pozadi -extrn _call_back_data:dword ;data_call_back_procedury -extrn _call_back_sel:word ;data_call_back_procedury - -extrn _jumptable:dword[3] ;[0] - skip, [1] - mix8, [2] - mix16 -extrn _getdma:dword -extrn _ido:dword - -extrn _predstih:word -extrn _lastdma:dword -extrn _lastmix:dword -extrn _surpos:dword -extrn _mixpos:dword -extrn _mixsize:dword -extrn _samplerate:dword - -extrn _dmaposadr:dword -extrn _dmasizadr:dword -extrn _dmanum:byte -extrn _dpmiselector:word - -extrn _idt_map:dword - -extrn _test_counter:dword - -extrn _mixer_zavora:byte -extrn _timer_test_port:word -extrn _oldvect:dword - -extrn _devport:dword -extrn _devirq:dword - -extrn _gus_dma_type:byte -extrn _gus_last_buff:byte - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - -gus_out equ 0 -gus_irqs equ 6 -gus_timer_c equ 8 -gus_timer_d equ 9 -gus_irq_dma equ 0bh -gus_voice equ 102h -gus_reg equ 103h -gus_reg_data equ 104h -gus_pio equ 107h - -gus_block equ 2000h - - - - PUBLIC MIXER_ -MIXER_: ;THIS IS MAIN MIXING PROCEDURE. - ;BEFORE USING, YOU MUST SET UP ALL VARIBLES TO THE CORRECT VALUES. - ;_MIXBUFFER MUST START ON PAGE OF MEMORY (EX. 0x10000 0x20000 0x30000) - ;PROCEDURE MUST BE CALLED EACH 55ms OR LITTLE. - ;IF YOU USING INTERRUPT, REMEBER, THAT YOU MUST STORE ALL REGISTERS - ;BEFORE USE. - - cmp _mixer_zavora,0 - jnz mixend - inc _mixer_zavora - CALL calcsize ;VYPOCET DELKY MIXOVANI - mov edi,_mixpos ;Nejprve se vymaze mixovaci pamet - mov ecx,_mixsize - shr ecx,2 - jz MIXALL -MIXOK: xor eax,eax -MIXCLR: mov [edi],ax - add di,2 - mov [edi],ax - add di,2 - dec ecx - jnz MIXCLR - lea ebx,_chaninfo ;TED SE ZACNE MIXOVAT -MIXING: xor eax,eax - mov ax,smptype[ebx] - call _jumptable[eax*4] - add ebx,sizeof(tchannel) - cmp ebx,(32*sizeof(tchannel))+offset _chaninfo - jnz MIXING - call _ido - mov ecx,_mixsize - add word ptr _mixpos,cx -MIXALL: mov _mixer_zavora,0 -MIXEND: ret - - -CALCSIZE:call _getdma ;eax - pozice v mixovaci pameti - mov ecx,eax ;ecx - pozice dma - sub cx,word ptr _mixpos ;odecti mixpos (dma-mix_pos<0) - js CALCOK - shr cx,2 - ;add _predstih,cx - ;add _predstih,64 -CALCOK: mov ebx,_lastdma - mov _lastdma,eax - sub ax,bx - add ax,_predstih - add ax,word ptr _lastdma - mov bx,word ptr _mixpos - sub ax,bx - js CALCEND - and ax,not 3 - add ax,4 - and eax,0ffffh - mov _mixsize,eax - ret -CALCEND:mov _mixsize,0 - ret - -ADDC macro REG1,REG2,CLIP - local addc1 - add REG1,REG2 - jno addc1 - shl REG2,1 - Mov REG2,CLIP - adc REG2,0 - mov REG1,REG2 -addc1: - endm - - - -MIXS_ :;primixuje sampl do bufferu (8-bit stereo) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos - mov ecx,_mixsize - mov esi,[ebx] - push ebp - mov bp,minorpos[ebx] -mixslp: mov dl,[esi] - mov dh,dl - mov al,byte ptr volumeleft[ebx+1] - imul dl - shl eax,1 - mov dl,ah - mov al,byte ptr volumeright[ebx+1] - imul dh - shl eax,1 - mov dh,ah - mov ax,[edi] - addc al,dl,7fh - addc ah,dh,7fh - mov [edi],ax ;je smixovano - add di,2 ;dalsi pozice - add bp,speedmin[ebx] - adc esi,speedmaj[ebx] - cmp esi,endloop[ebx] - jc mixsskp - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mixsskp - mov smptype[ebx],0 - jmp mixsend -mixsskp:dec ecx - dec ecx - jnz mixslp -mixsend:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - -mixskip:ret -mixs2 :;primixuje sampl do bufferu (16-bit stereo) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos ;vem mixovaci pozici - mov ecx,_mixsize ;vem pocet potrebnych bajtu - mov esi,[ebx] ;vyzvedni ukazatel na sample - push ebp ;zachovej bp - mov bp,minorpos[ebx] ;bp pro tuto chvili predstavuje minorpozici -mix2slp:mov dl,[esi+1] ;vem sample, ale jen vyssi bajt - mov dh,dl ;zkopiruj levy kanal do praveho - mov al,byte ptr volumeleft[ebx+1];vyzvedni hlasitost leveho kanalu - imul dl ;nasob vzorek hlasitosti - shl eax,1 ;vysledek je v ah vydelen 256x - mov dl,ah ;schovej vysledek do dl - mov al,byte ptr volumeright[ebx+1];to same pro pravy kanal - imul dh - shl eax,1 - mov dh,ah - mov ax,[edi] ;ted precti aktualni stav samplu v bufferu - addc al,dl,7fh ;pricti levy kanal s clippingem - addc ah,dh,7fh ;pricti pravy kanal s clippingem - mov [edi],ax ;je smixovano - add di,2 ;dalsi pozice - add bp,speedmin[ebx] ;skok po minor hodnotach - lahf ;uchovej priznaky v ah (hlavne cf) - adc esi,speedmaj[ebx] ;skok po major hodnotach - sahf ;obnov cf - adc esi,speedmaj[ebx] ;a jeste jednou celkem o 2xvic nez je rychlost - cmp esi,endloop[ebx] ;test na konec samplu - jc mix2sskp ;pokud jsme prekrocili konec mohou nastat dva - mov esi,startloop[ebx];pripady: - cmp esi,endloop[ebx] ; bud ma sampl opakovani pak zacina na adrese - jnz mix2sskp ; startloop nebo nema - mov smptype[ebx],0 ; pak je vypnut - jmp mix2send ;skoc na konec -mix2sskp:dec ecx ;pokracujeme v prehravani - dec ecx ;byly naplneny 2 bajty, citac o 2 dolu - jnz mix2slp ;opakuj cele mixovani dokud neni citac nule -mix2send:mov minorpos[ebx],bp ;uloz minorpozici - mov playpos[ebx],esi ;uloz majorpozici - pop ebp ;obnov BP - ret ;konec - -m8sido: mov esi,_mixpos ;vem mixovaci pozici - sub si,2 ;o jeden sampl dozadu - and esi,not 1 - mov edi,_backfine ;finepozice - mov ebx,_backsnd ;pozice v bufferu - mov ecx,_mixsize ;pocet bajtu - sub ecx,2 - shl ecx,16 ;uloz do horni poloviny ecx - mov ax,[esi] ;vezmi sample - xor eax,8080h ;neznaminkova korekce -m8sido1:add si,2 ;dalsi sample - mov dx,[esi] ;nacti do dx sample - xor edx,8080h ;neznaminkova korekce - add al,dl ;secti leve kanaly - rcr al,1 ;nasleduje deleni 2x prumer - add ah,dh ;totez pro prave kanaly - rcr ah,1 - xor eax,8080h ;neznaminkova korekce - mov cl,byte ptr _backsndbuff[1+ebx*4] ;nacti back sound pro levej kanal - mov ch,byte ptr _backsndbuff[3+ebx*4];nactu back sound pro pravej kanal - addc al,cl,7fh ;secti s clippingem levy kanal - addc ah,ch,7fh ;secti s clippingem pravy kanal - add di,word ptr _backstep ;pricti fine pozici - adc bx,word ptr [_backstep+2];preteceni jde do bx plus step -; and ebx,03ffffh ;celkem 16384*4 samplu - xor eax,8080h ;neznaminkova korekce - sub si,2 ;uloz na zdrojovou pozici - mov [esi],ax - add si,2 - mov eax,edx ;pouzity sampl pro prumerovani se - sub ecx,20000h ;do ax a odecti dva takty pro citac - jnc m8sido1 ;a opakuj dokud neni konec - mov _backsnd,ebx - mov _backfine,edi - ret ;navrat - - -sbdma: mov edx,_dmaposadr - out 0ch,al - out 0d8h,al - xor eax,eax - in al,dx - xchg al,ah - in al,dx - xchg al,ah - cmp _dmanum,4 - jc sbdma1 - shl eax,1 -sbdma1: add eax,_mixbuffer - ret - - -PUBLIC setsbpro_ -setsbpro_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mixs_ - stosd - mov eax,offset mixs2 - stosd - mov _getdma,offset sbdma - mov _ido,offset m8sido - ret - - -MIXM_ :;primixuje sampl do bufferu (8-bit mono) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos ;vezmi mixovaci pozici - mov ecx,_mixsize ;vezmi delku mixovani - mov esi,[ebx] ;nacti ukazatel na aktualni pozici v samplu - push ebp ;uchovej docasne BP - mov bp,minorpos[ebx] ;bp ma novou ulohu, drzi minor pozici - mov al,byte ptr volumeleft[ebx+1] ;vypocti hlasitost - mov ah,byte ptr volumeright[ebx+1] - add al,ah - rcr al,1 ;jak prumer leve a prave hlasitosti - mov dh,al -mixmlp: mov al,[esi] ;vezmi sample - imul dh ;vynasob s hlasitosti - shl eax,1 ;vydel /256x (ah je vysledek) - mov al,[edi] ;vezmi momentalni obsah bufferu - addc al,ah,7fh ;secti s clippingem - mov [edi],al ;je smixovano - inc di ;dalsi pozice - add bp,speedmin[ebx] - adc esi,speedmaj[ebx] - cmp esi,endloop[ebx] - jc mixmskp - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mixmskp - mov smptype[ebx],0 - jmp mixmend -mixmskp:dec ecx - jnz mixmlp -mixmend:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - -MIXM2 :;primixuje sampl 16 do bufferu (8-bit mono) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos ;vezmi mixovaci pozici - mov ecx,_mixsize ;vezmi delku mixovani - mov esi,[ebx] ;nacti ukazatel na aktualni pozici v samplu - push ebp ;uchovej docasne BP - mov bp,minorpos[ebx] ;bp ma novou ulohu, drzi minor pozici - mov al,byte ptr volumeleft[ebx+1] ;vypocti hlasitost - mov ah,byte ptr volumeright[ebx+1] - add al,ah - rcr al,1 ;jak prumer leve a prave hlasitosti - mov dh,al -mixmlp2:mov al,[esi+1] ;vezmi sample - imul dh ;vynasob s hlasitosti - shl eax,1 ;vydel /256x (ah je vysledek) - mov al,[edi] ;vezmi momentalni obsah bufferu - addc al,ah,7fh ;secti s clippingem - mov [edi],al ;je smixovano - inc di ;dalsi pozice - add bp,speedmin[ebx] - lahf ;uchovej priznaky v ah (hlavne cf) - adc esi,speedmaj[ebx] ;skok po major hodnotach - sahf ;obnov cf - adc esi,speedmaj[ebx] ;a jeste jednou celkem o 2xvic nez je rychlost - cmp esi,endloop[ebx] - jc mixmskp2 - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mixmskp2 - mov smptype[ebx],0 - jmp mixmend2 -mixmskp2:dec ecx - jnz mixmlp2 -mixmend2:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - -m8mido: mov esi,_mixpos ;vem mixovaci pozici - dec si ;o jeden sampl dozadu - lea edi,_backfine ;ukazatel na back sound buffer - mov ebx,_backsnd ;pozice v bufferu - mov ecx,_mixsize ;pocet bajtu - dec ecx - shl ecx,16 ;uloz do horni poloviny ecx - mov al,[esi] ;vezmi sample - xor eax,80h ;neznaminkova korekce -m8mido1:inc si ;dalsi sample - mov dl,[esi] ;nacti do dx - xor edx,80h ;neznaminkova korekce - add al,dl ;secti kanal - rcr al,1 ;nasleduje deleni 2x prumer - xor eax,80h ;vysledek oznamenkuj - bude se scitat - mov cl,byte ptr _backsndbuff[1+ebx*4];nacti back sound pro levej kanal - mov ch,byte ptr _backsndbuff[3+ebx*4];nactu back sound pro pravej kanal - add di,word ptr _backstep ;pricti fine pozici - adc bx,word ptr [_backstep+2];preteceni jde do bx plus step -; and ebx,03ffffh ;celkem 16384*4 samplu - sar cl,1 ;del levy kanal 2ma - sar ch,1 ;del pravy kanal 2ma - add cl,ch ;secti oba kanaly - addc al,cl,7fh ;secti s clippingem kanal - xor eax,80h ;neznaminkova korekce pro SB Pro - dec si ;uloz na zdrojovou pozici - mov [esi],al - inc si - mov eax,edx ;pouzity sampl pro prumerovani se - sub ecx,10000h ;do ax a odecti jeden takt pro citac - jnc m8mido1 ;a opakuj dokud neni konec - mov _backsnd,ebx - ret ;navrat - -m8midos:mov esi,_mixpos ;vem mixovaci pozici - dec si ;o jeden sampl dozadu - lea edi,_backfine ;ukazatel na back sound buffer - mov ebx,_backsnd ;pozice v bufferu - mov ecx,_mixsize ;pocet bajtu - dec ecx - shl ecx,16 ;uloz do horni poloviny ecx - mov al,[esi] ;vezmi sample - xor eax,80h ;neznaminkova korekce -m8mido2:inc si ;dalsi sample - mov dl,[esi] ;nacti do dx - xor edx,80h ;neznaminkova korekce - add al,dl ;secti kanal - rcr al,1 ;nasleduje deleni 2x prumer - xor eax,80h ;vysledek oznamenkuj - bude se scitat - mov cl,byte ptr _backsndbuff[1+ebx*4];nacti back sound pro levej kanal - mov ch,byte ptr _backsndbuff[3+ebx*4];nactu back sound pro pravej kanal - add di,word ptr _backstep ;pricti fine pozici - adc bx,word ptr [_backstep+2];preteceni jde do bx plus step -; and ebx,03ffffh ;celkem 16384*4 samplu - sar cl,1 ;del levy kanal 2ma - sar ch,1 ;del pravy kanal 2ma - add cl,ch ;secti oba kanaly - addc al,cl,7fh ;secti s clippingem kanal - dec si ;uloz na zdrojovou pozici - mov [esi],al - inc si - mov eax,edx ;pouzity sampl pro prumerovani se - sub ecx,10000h ;do ax a odecti jeden takt pro citac - jnc m8mido2 ;a opakuj dokud neni konec - mov _backsnd,ebx - ret ;navrat - - - - -PUBLIC setsb2_ -setsb2_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mixm_ - stosd - mov eax,offset mixm2 - stosd - mov _getdma,offset sbdma - mov _ido,offset m8mido - ret - -PUBLIC setsb2_s_ -setsb2_s_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mixm_ - stosd - mov eax,offset mixm2 - stosd - mov _getdma,offset sbdma - mov _ido,offset m8midos - ret - - -MIX16_ :;primixuje sampl do bufferu (16-bit stereo) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos ;vem mixovaci pozici - mov ecx,_mixsize ;vem mixovaci delku - mov esi,[ebx] ;vyzvedni ukazatel na sample - push ebp ;uchovej BP - mov bp,minorpos[ebx] ;bp bude drzet minor pozice -mix1lp: mov al,[esi] ;nacti sample - mov dl,al ;al a dl obsahuji levej a pravej kanal - mov ah,byte ptr volumeright[ebx+1] ;nacti pravou hlastitot - imul ah ;vynasob hlasitosti - shl eax,1 ;vse je vyreseno, deleni neni potreba - xchg edx,eax ;ted pracuj s druhym kanalem - mov ah,byte ptr volumeleft[ebx+1] ;nactu hlasitost - imul ah ;vynasob - shl eax,1 - addc [edi],dx,7fffh ;k aktualnimu vzorku pricti hodnotu - add di,2 ;dalsi pozice - addc [edi],ax,7fffh ;je smixovano - add di,2 ;dalsi pozice - add bp,speedmin[ebx] - adc esi,speedmaj[ebx] - cmp esi,endloop[ebx] - jc mix1skp - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mix1skp - mov smptype[ebx],0 - jmp mix1end -mix1skp:sub ecx,4 - jnz mix1lp -mix1end:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - -mix162: ;primixuje sampl do bufferu (16-bit stereo) - ;musi platit vsechny promenne a ebx je adresa kanalu - mov edi,_mixpos ;vem mixovaci pozici - mov ecx,_mixsize ;vem mixovaci delku - mov esi,[ebx] ;vyzvedni ukazatel na sample - push ebp ;uchovej BP - mov bp,minorpos[ebx] ;bp bude drzet minor pozice -mix12lp:movsx eax,word ptr [esi] ;nacti sample - imul word ptr volumeright[ebx] ;nacti pravou hlastitot a vynasob - shl edx,1 ;vse je vyreseno, deleni neni potreba - addc [edi],dx,7fffh ;k aktualnimu vzorku pricti hodnotu - add di,2 ;dalsi pozice - movsx eax,word ptr [esi] ;nacti sample - imul word ptr volumeleft[ebx] ;nacti pravou hlastitot a vynasob - shl edx,1 ;vse je vyreseno, deleni neni potreba - addc [edi],dx,7fffh ;k aktualnimu vzorku pricti hodnotu - add di,2 ;dalsi pozice - add bp,speedmin[ebx] - lahf ;uchovej priznaky v ah (hlavne cf) - adc esi,speedmaj[ebx] ;skok po major hodnotach - sahf ;obnov cf - adc esi,speedmaj[ebx] - cmp esi,endloop[ebx] - jc mix12skp - mov esi,startloop[ebx] - cmp esi,endloop[ebx] - jnz mix12skp - mov smptype[ebx],0 - jmp mix12end -mix12skp:sub ecx,4 - jnz mix12lp -mix12end:mov minorpos[ebx],bp - mov playpos[ebx],esi - pop ebp - ret - - -m16ido: push ebp - mov esi,_mixpos ;vem mixovaci pozici - sub si,4 ;o jeden sampl dozadu - mov edi,_backfine ;finepozice - mov ebx,_backsnd ;pozice v bufferu - mov ecx,_mixsize ;pocet bajtu - sub ecx,4 - shl ecx,16 ;uloz do horni poloviny ecx - mov eax,[esi] ;vezmi sample - xor eax,80008000h ;neznaminkova korekce -m16ido1:add si,4 ;dalsi sample - mov ebp,eax - and ebp,0ffff0000h - mov edx,[esi] ;nacti do dx sample - xor edx,80008000h ;neznaminkova korekce - add ax,dx ;secti leve kanaly - rcr ax,1 ;nasleduje deleni 2x prumer - add ebp,edx ;totez pro prave kanaly - rcr ebp,1 - shld eax,ebp,16 - xor eax,80008000h ;neznaminkova korekce - mov cx,word ptr _backsndbuff[ebx*4] ;nacti back sound pro levej kanal - addc ax,cx,7fffh ;secti s clippingem levy kanal - mov cx,word ptr _backsndbuff[2+ebx*4];nacti back sound pro pravej kanal - rol eax,16 - addc ax,cx,7fffh ;secti s clippingem pravy kanal - add di,word ptr _backstep ;pricti fine pozici - adc bx,word ptr [_backstep+2];preteceni jde do bx plus step -; and ebx,03ffffh ;celkem 16384*4 samplu - sub si,4 ;uloz na zdrojovou pozici - mov [esi],eax - add si,4 - mov eax,edx ;pouzity sampl pro prumerovani se - sub ecx,40000h ;do ax a odecti ctyri takty pro citac - jnc m16ido1 ;a opakuj dokud neni konec - pop ebp - mov _backsnd,ebx - mov _backfine,edi - ret ;navrat - - - -PUBLIC setsb16_ -setsb16_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mix16_ - stosd - mov eax,offset mix162 - stosd - mov _getdma,offset sbdma - mov _ido,offset m16ido - ret - - -dpmibufalloc: - mov ax,0100h - int 31h - ret - -public buff_dealloc_ -buff_dealloc_: - mov dx,_dpmiselector - mov ax,0101h - int 31h - ret - -public buff_alloc_ - -buff_alloc_: - mov ebx,4200 - call dpmibufalloc - jc allcerror - test eax,0fffh - jz allc_ok - push eax - mov eax,0101h - int 31h - pop eax - mov ebx,eax - and ebx,0f000h - add ebx,1000h - sub ebx,eax - dec ebx - call dpmibufalloc - jc allcerror - push edx - call buff_alloc_ - mov ecx,edx - pop edx - push eax - mov eax,0101h - int 31h - pop eax - ret -allc_ok:mov _dpmiselector,dx - shl eax,4 - ret -allcerror: - mov word ptr _dpmiselector,0 - xor eax,eax - ret - -public int_relocation_ -int_relocation_: - mov eax,0de0ah - int 67h - shl ebx,16 - mov bx,cx - rol ebx,16 - mov eax,ebx - ret - -public int_mixer_alloc_ -int_mixer_alloc_: - lea eax,_idt_map - sidt [eax] -; db 0fh -; db 01 -; db 08h - add eax,2 - mov eax,[eax] - shl ebx,3 - add eax,ebx - cli - mov edi,eax - push ds - pop es - mov ecx,offset int_normal_ - mov eax,ecx - stosw - mov ax,cs - stosw - mov eax,8e00h - stosw - mov eax,ecx - shr eax,16 - stosw - sti - mov ebx,1000h - call dpmibufalloc - mov esi,4*8 - mov edi,offset rm_old - mov ecx,4 - rep movsb - mov _call_back_sel,dx - mov esi,offset rm_data_ - mov edi,eax - shl edi,4 - mov _call_back_data,edi - mov ecx,1000 - rep movsb - mov edi,4*8 - mov word ptr [edi],8 - mov [edi+2],ax - ret - -public int_high_alloc_ -int_high_alloc_: - lea eax,_idt_map - sidt [eax] - add eax,2 - mov eax,[eax] - shl ebx,3 - add eax,ebx - cli - mov edi,eax - push ds - pop es - mov ecx,offset int_hspd_ - mov eax,ecx - stosw - mov ax,cs - stosw - mov eax,8e00h - stosw - mov eax,ecx - shr eax,16 - stosw - sti - mov ebx,1000h - call dpmibufalloc - mov esi,4*8 - mov edi,offset rm_old - mov ecx,4 - rep movsb - mov _call_back_sel,dx - mov esi,offset rm_data_ - mov edi,eax - shl edi,4 - mov _call_back_data,edi - mov ecx,1000 - rep movsb - mov edi,4*8 -; mov word ptr [edi],(high_speed - rm_data_) -; mov [edi+2],ax - ret - -public high_speed_parm_ - ;eax dos delay - ;edx port - ;ebx mixbuffer - ;esi xlattab -high_speed_parm_: - mov edi,offset w_max - mov [edi],ax - mov edi,offset rm_hspd - mov ecx,64 - rep movsd - xor eax,eax - stosw - mov eax,ebx - shr eax,4 - stosw - mov eax,edx - stosw - ret -public int_dealloc_ -int_dealloc_: - mov edi,4*8 - mov esi,offset rm_old - mov ecx,4 - rep movsb - mov dx,_call_back_sel - mov ax,101h - int 31h - ret - -public write_adlib_ -write_adlib_: - mov dx,_timer_test_port - out dx,al - in al,dx - in al,dx - in al,dx - in al,dx - in al,dx - in al,dx - mov al,ah - inc edx - out dx,al - mov ah,36 - dec edx -wwait: in al,dx - dec ah - jnz wwait - ret -public write_adlib_nodelay_ -write_adlib_nodelay_: - mov dx,_timer_test_port - out dx,al - in al,dx - in al,dx - in al,dx - in al,dx - in al,dx - in al,dx - mov al,ah - inc edx - out dx,al - ret - - -;public int_normal_: -int_normal_: - cli - pushad - push ds - push es - mov ax,seg _DATA - mov ds,ax - mov es,ax - mov al,20h - out 20h,al - mov dx,_timer_test_port - or dx,dx - jz intn_ok - in al,dx - test al,80h - jz intn_call_dos; - mov ax,8004h - call write_adlib_ -intn_ok:inc _test_counter - sti - call mixer_ - cli -intn_sk:pop es - pop ds - popad - iretd - -intn_call_dos:call _oldvect - jmp intn_sk - -public int_hspd_: ;high speed mode interrupt - pro D/A a PC Speaker -int_hspd_: - push ds - push esi - push ebx - push edx - push eax - mov al,20h - out 20h,al - mov ax,seg _DATA - mov ds,ax - mov ebx,_call_back_data - add ebx,(offset rm_hspd-offset rm_data_) - xor eax,eax - xor esi,esi - mov ax,[ebx+scanofs] - mov si,[ebx+scanseg] - shl esi,4 - add esi,eax - mov dx,[ebx+port] - lodsb - xlatb - out dx,al - inc word ptr [ebx+scanofs] - mov ebx,_call_back_data - dec word ptr [ebx] - jnz hs_end - mov ax,[ebx+2] - mov [ebx],ax - sti - call mixer_ - cli -hs_end: - pop eax - pop ebx - pop edx - pop esi - pop ds - iretd - -;------------------------------- ULTRASND LIB ----------------- -;Special thanx for Dalibor Straka - -gus_sv macro voice - mov edx,_devport - add edx,gus_voice - mov al,voice - out dx,al - ENDM - -gus_w macro reg,data - mov edx,_devport - mov al,reg - add edx,gus_reg - out dx,al - mov eax,data - add edx,gus_reg_data-gus_reg - out dx,ax - in ax,dx - in ax,dx - in ax,dx - in ax,dx - in ax,dx - in ax,dx - mov eax,data - out dx,ax - ENDM - -gus_wb macro reg,data - mov edx,_devport - mov al,reg - add edx,gus_reg - out dx,al - mov al,data - add edx,gus_reg_data-gus_reg+1 - out dx,al - in al,dx - in al,dx - in al,dx - in al,dx - in al,dx - in al,dx - mov al,data - out dx,al - ENDM - -gus_wbd macro reg,data - mov edx,_devport - mov al,reg - add edx,gus_reg - out dx,al - mov al,data - add edx,gus_reg_data-gus_reg+1 - out dx,al - endm - -gus_r macro reg ;vysledek v eax - mov edx,_devport - mov al,reg - add edx,gus_reg - out dx,al - add edx,gus_reg_data-gus_reg - in ax,dx - movzx eax,ax - ENDM - - -;organizace GUS RAM -;<0 - gus_block> prehravaci blok -;<32768 - +gus_block> mirror buffer (prazdny) - -extrn prepare_dma_:proc ;priprava DMA - -public stop_gus_ ;deinicializuje GUS -stop_gus_: - mov cl,31 ;ted se vyresetuji vsechny kanaly -igus_2: gus_sv cl ;vyber hlas - gus_wb 0,2 ;vypni hlas - gus_wb 1,0 ;nastav krok na 0 - gus_w 2,0003h ;nastav hlas na konec 64KB bloku - gus_w 3,0ff00h - gus_w 4,0003h - gus_w 5,0ff00h - gus_w 0Ah,0003h - gus_w 0Bh,0ff00h - gus_wb 0Dh,3fh ;vypni volume ramp - gus_wb 07h,0fh ;hlasitost 0 - gus_wb 08h,10h ;hlasitost 0 - gus_w 09h,0 ;hlasitost 0 - sub cl,1 - jnc igus_2 - ret - -gus_dma db 0,11h,11h,22h,22h,33h,44h,55h - -public init_gus_ ;inicializuje GUS do rezimu prehravani samplu - -init_gus_: - mov edx,_devport - mov al,19h ;zapni out - out dx,al - mov edx,_devport - lea edx,[edx+gus_irq_dma] - movzx eax,_dmanum - mov al,cs:gus_dma[eax] - out dx,al ;nastav DMA - gus_wbd 4ch,0 ;reset gus - mov edx,_devport - add edx,6 - mov ecx,1000 -igus_3: in al,dx - loop igus_3 ;cekani - gus_wbd 4ch,1 ;reset gus - add edx,6 - mov ecx,1000 -igus_4: in al,dx - loop igus_4 - gus_wbd 4ch,3 ;povol dac - mov edx,_devport - mov edi,_mixbuffer - mov ecx, 65536 shr 2 - xor eax,eax - rep stosd ;vynuluj dma_buffer - mov edx,_devport - add edx,gus_irqs - in al,dx - gus_r 41h - gus_wb 41h,0 - mov edx,_devport - add edx,gus_irqs - in al,dx - gus_r 41h - gus_r 41h - gus_w 42h,0 - mov eax,_mixbuffer - mov edx,65536 - call prepare_dma_ - movzx ecx,_gus_dma_type - gus_wb 41h,cl ;vynuluj prvnich 64KB GUSRAM - xor edx,edx - mov eax,617400 - mov ecx,_samplerate - div ecx - add dx,8000h - adc al,0 - cmp al,33 - jc igus_1 - mov al,32 -igus_1: dec al - or al,0c0h - mov cl,al - gus_wb 0eh,cl - call stop_gus_ - gus_sv 0 - mov ecx,0 ;nastaveni hlasu cislo 0 - gus_w 2,ecx ;zacni na 0 - gus_w 3,ecx - gus_w 0Ah,ecx - gus_w 0Bh,ecx - mov ecx,(gus_block-4) shl 8 ;konec az za gus_blockem - gus_w 5,ecx - shr ecx,16 - gus_w 4,ecx - mov ecx,(1 shl 0bh) - gus_w 1,ecx ;krok 2 - gus_w 9,0ffffh ;hlasitost max - gus_wb 0ch,0 ;panning vlevo - gus_wb 00,0ch ;spust hlas - gus_sv 1 ;nastaveni hlasu cislo 1 - mov ecx,2 shl 8 - gus_w 3,ecx ;zacni na 2 - gus_w 0Bh,ecx - shr ecx,16 - gus_w 2,ecx - gus_w 0Ah,ecx - mov ecx,(gus_block-2) shl 8 ;konec az za gus_blockem - gus_w 5,ecx - shr ecx,16 - gus_w 4,ecx - mov ecx,(1 shl 0bh) - gus_w 1,ecx ;krok 2 - gus_w 9,0ffffh ;hlasitost max - gus_wb 0ch,0fh ;panning vpravo - gus_wb 00,0ch ;spust hlas - ret - -gus_move_buff: ;presun bufferu do GUS - push eax - mov edx,_devport - add edx,gus_irqs - in al,dx - gus_r 41h - gus_wbd 41h,0 - mov edx,_devport - add edx,gus_irqs - in al,dx - gus_r 41h - gus_r 41h - mov edx,_devport - add edx,gus_irqs - in al,dx - pop eax - xor esi,esi - and ah,1fh - or ah,ah - jz gus_mb1 - mov esi,(gus_block shr 1) -gus_mb1:mov cl,4 - test _gus_dma_type,4 - jz gus_mb2 - inc cl -gus_mb2:shr esi,cl - push esi - mov eax,_mixbuffer - mov edx,ebx - call prepare_dma_ - pop esi - gus_w 42h,esi - movzx ecx,_gus_dma_type - gus_wbd 41h,cl - ret - -gus_skip:mov eax,_mixbuffer - mov _mixpos,eax - xor ecx,ecx - mov _mixsize,ecx - mov cl,_gus_last_buff - gus_sv 0 - gus_r 8Ah - shl eax,8 - cmp eax,gus_block shr 1 - rcl ch,1 - xor cl,ch - jz gus_ie - mov ah,ch - mov _gus_last_buff,ch - mov ecx,(gus_block shr 1) - mov _mixsize,ecx -gus_ie: pop eax - ret - - - -m16idog:push ebp - mov esi,_mixpos ;vem mixovaci pozici - mov edi,_backfine ;finepozice - mov ebx,_backsnd ;pozice v bufferu - mov ecx,_mixsize ;pocet bajtu - shr ecx,2 - dec ecx - shl ecx,16 -m16ido2:mov eax,[esi] - mov cx,word ptr _backsndbuff[ebx*4] ;nacti back sound pro levej kanal - addc ax,cx,7fffh ;secti s clippingem levy kanal - mov cx,word ptr _backsndbuff[2+ebx*4];nacti back sound pro pravej kanal - rol eax,16 - addc ax,cx,7fffh ;secti s clippingem pravy kanal - add di,word ptr _backstep ;pricti fine pozici - adc bx,word ptr [_backstep+2];preteceni jde do bx plus step - and ebx,03ffffh ;celkem 16384*4 samplu - mov [esi],eax - add si,4 - sub ecx,10000h ;do ax a odecti ctyri takty pro citac - jnc m16ido2 ;a opakuj dokud neni konec - pop ebp - mov _backsnd,ebx - mov _backfine,edi - mov ah,_gus_last_buff - mov ebx,_mixsize ;pocet bajtu - call gus_move_buff - ret ;navrat - - - - - -PUBLIC setGUS_ -setGUS_: - lea edi,_jumptable - mov eax,offset mixskip - stosd - mov eax,offset mix16_ - stosd - mov eax,offset mix162 - stosd - mov _getdma,offset GUS_SKIP - mov _ido,offset m16idog - ret - -public gus_setchan_vol_ -gus_setchan_vol_: ;ecx,eax - gus_sv al - gus_w 9,ecx - ret - -public gus_setchan_pan_ -gus_setchan_pan_: ;ecx,eax - gus_sv al - gus_wb 0ch,cl - ret - - -_TEXT16 SEGMENT BYTE PUBLIC USE16 'CODE' - ASSUME cs:_TEXT16 -public rm_proc_: -rm_data_: -w_count:dw 2 ;citac preruseni -w_max dw 2 ;maximalni hodnota citace -rm_old dw ? ;stary vektor preruseni - dw ? -rm_proc_: - cli - int 1ch - cli - push si - xor si,si - dec word ptr cs:[si] - jnz w_skip - push ax - mov ax,cs:[si+2] - mov cs:[si],ax - pop ax - pushf - call dword ptr cs:[si+4] -w_skip: pop si - iret - -rm_hspd db 300 dup(?) -high_speed: - push ds - push si - push bx - push dx - push ax - mov bx,offset rm_hspd-offset rm_data_ - lds si,cs:[bx+scanofs] - mov dx,cs:[bx+port] - lodsb - xlat cs: - out dx,al - mov cs:[bx+scanofs],si - mov al,20h - out 20h,al - dec word ptr cs:[0] - jnz hspd_end - mov ax,cs:[2] - mov cs:[0],ax - pushf - call dword ptr cs:[4] - int 1ch -hspd_end: - pop ax - pop dx - pop bx - pop si - pop ds - iret - -_TEXT16 ends - - -_TEXT ends - -END - diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 56243b3..2c47152 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -1,8 +1,16 @@ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/default_font.base64 COMMAND file_to_base64 ${CMAKE_CURRENT_LIST_DIR}/boldcz.fon > ${CMAKE_BINARY_DIR}/default_font.base64 DEPENDS ${CMAKE_CURRENT_LIST_DIR}/boldcz.fon) +add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/icon.base64 + COMMAND file_to_base64 ${CMAKE_CURRENT_LIST_DIR}/icon.bmp > ${CMAKE_BINARY_DIR}/icon.base64 + DEPENDS ${CMAKE_CURRENT_LIST_DIR}/icon.bmp) +add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/resources.cpp + COMMAND ${CMAKE_COMMAND} -DOUT=${CMAKE_BINARY_DIR}/resources.cpp -DIN_FONT=${CMAKE_BINARY_DIR}/default_font.base64 -DIN_ICON=${CMAKE_BINARY_DIR}/icon.base64 -DTEMPLATE=${CMAKE_CURRENT_LIST_DIR}/resources.in.cpp -P ${CMAKE_CURRENT_LIST_DIR}/resources_to_cpp.cmake + DEPENDS ${CMAKE_BINARY_DIR}/default_font.base64 ${CMAKE_BINARY_DIR}/icon.base64 ${CMAKE_CURRENT_LIST_DIR}/resources_to_cpp.cmake ${CMAKE_CURRENT_LIST_DIR}/resources.in.cpp + ) add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/default_font.cpp COMMAND ${CMAKE_COMMAND} -DOUT=${CMAKE_BINARY_DIR}/default_font.cpp -DIN=${CMAKE_BINARY_DIR}/default_font.base64 -DTEMPLATE=${CMAKE_CURRENT_LIST_DIR}/default_font.in.cpp -P ${CMAKE_CURRENT_LIST_DIR}/default_font_to_cpp.cmake @@ -37,7 +45,7 @@ gen_stringtable.c advconfig.c temp_storage.cpp lang.c -${CMAKE_BINARY_DIR}/default_font.cpp +${CMAKE_BINARY_DIR}/resources.cpp ) add_library(skeldal_main ${files}) diff --git a/game/automap.c b/game/automap.c index 1b84221..1789eb0 100644 --- a/game/automap.c +++ b/game/automap.c @@ -143,7 +143,8 @@ void save_text_to_map(int x,int y,int depth,char *text) char c[512],*d; if (text[0]==0) return; memset(c,1,sizeof(c)); - strcpy(c+12,text); + strncpy(c+12,text,sizeof(c)-13); + c[511] = 0; if (texty_v_mape==NULL) texty_v_mape=create_list(8); d=texty_v_mape[str_add(&texty_v_mape,c)]; x=(x-320)+map_xr; diff --git a/game/builder.c b/game/builder.c index a863fa4..a969dbd 100644 --- a/game/builder.c +++ b/game/builder.c @@ -719,13 +719,7 @@ void create_minimap(int sector, int smer) } -static const float Snapper=3<<22; -static __inline int toInt( float fval ) -{ - fval += Snapper; - return ( (*(int *)&fval)&0x007fffff ) - 0x00400000; -} static const void *check_autofade(const void *image, char ceil, int dark) @@ -755,9 +749,9 @@ static const void *check_autofade(const void *image, char ceil, int dark) int r=*imgdata>>11; int g=(*imgdata>>5) & 0x3F; int b=*imgdata & 0x1F; - r=toInt(r+factor*(br-r)); - g=toInt(g+factor*(bg-g)); - b=toInt(b+factor*(bb-b)); + r=(int)(r+factor*(br-r)); + g=(int)(g+factor*(bg-g)); + b=(int)(b+factor*(bb-b)); *imgdata=(r<<11)|(g<<5)|b; imgdata++; } @@ -954,8 +948,8 @@ void draw_players(int sector,int dir,int celx,int cely) { int i; THUMAN *p; - char freep[5]; - int j,d,pp=0,f; + char freep[5]= {0,0,0,0,0}; + int j,d,pp=0,f=0; memset(freep,0,sizeof(freep)); for(i=0,pp=0;i - - -constexpr binary_data font_data ="@CONTENT@"; - -extern "C" { - -const void *LoadDefaultFont() { - return font_data.begin(); -} - -} - - diff --git a/game/default_font_to_cpp.cmake b/game/default_font_to_cpp.cmake deleted file mode 100644 index e3dfec3..0000000 --- a/game/default_font_to_cpp.cmake +++ /dev/null @@ -1,4 +0,0 @@ -file(READ ${IN} CONTENT) - -configure_file(${TEMPLATE} ${OUT} @ONLY) - diff --git a/game/dialogy.c b/game/dialogy.c index c0eb7b3..4decc3f 100644 --- a/game/dialogy.c +++ b/game/dialogy.c @@ -159,7 +159,7 @@ static void dialog_anim(va_list args) const void *anm; void *aptr; char hid; - int spdc=0,cntr=rep,tm,tm2; + int spdc=0,cntr=rep,tm = 0,tm2 = 0; int32_t scr_linelen2 = GetScreenPitch(); loc_anim_render_buffer=PIC_Y*scr_linelen2+PIC_X; @@ -216,7 +216,7 @@ static void run_anim(char *name,int speed,int rep) static void error(char *text) { char buff[256]; - sprintf(buff,"%s v odstavci %d\r\nLocal_pgf=%d / DIALOG : %d / SENTENCE : %d\r\n",text,last_pgf+local_pgf,local_pgf,local_pgf/128,last_pgf); + sprintf(buff,"%.125s v odstavci %d\r\nLocal_pgf=%d / DIALOG : %d / SENTENCE : %d\r\n",text,last_pgf+local_pgf,local_pgf,local_pgf/128,last_pgf); // MessageBox(NULL,buff,NULL,MB_OK|MB_ICONSTOP|MB_SYSTEMMODAL); SEND_LOG("(DIALOGS) Dialog error detected at %d:%d",local_pgf/128,last_pgf); SEND_LOG("(DIALOGS) Error description: %s",text); @@ -312,7 +312,7 @@ static char *transfer_text(const char *source,char *target) if (*source=='l') { sn_nums[0]=sn_nums[num]; - strcpy(sn_nams[0],sn_nams[num]); + strcopy_n(sn_nams[0],sn_nams[num],sizeof(sn_nams[0])); sn_rods[0]=sn_rods[num]; } break; @@ -554,14 +554,14 @@ static void lecho(char *c) static void save_name(int pos) { sn_nums[pos]=sn_nums[0]; - strcpy(sn_nams[pos],sn_nams[0]); + strcopy_n(sn_nams[pos],sn_nams[0],sizeof(sn_nams[pos])); sn_rods[pos]=sn_rods[0]; } static void load_name(int pos) { sn_nums[0]=sn_nums[pos]; - strcpy(sn_nams[0],sn_nams[pos]); + strcopy_n(sn_nams[0],sn_nams[pos],sizeof(sn_nams[0])); sn_rods[0]=sn_rods[pos]; } @@ -1260,7 +1260,7 @@ void do_dialog() case 134:p1=Get_short();p2=Get_short();nahodne(VLS_SMAGIE,p1,p2);break; case 135:p1=Get_short();p2=Get_short();nahodne(VLS_SILA,p1,p2);break; case 136:p1=Get_short();p2=Get_short();nahodne(VLS_OBRAT,p1,p2);break; - case 137:c=Get_string();p1=Get_short();strncpy(sn_nams[0],c,32);sn_rods[0]=p1;break; + case 137:c=Get_string();p1=Get_short();strcopy_n(sn_nams[0],c,32);sn_rods[0]=p1;break; case 138:iff=Get_short();break; case 139:goto_paragraph(Get_short());break; case 140:p1=Get_short();if (iff) goto_paragraph(p1);break; diff --git a/game/enemy.c b/game/enemy.c index 54a2de0..0f639cb 100644 --- a/game/enemy.c +++ b/game/enemy.c @@ -314,9 +314,9 @@ static char pick_item_corpse(TMOB *m,char query) static char seber_predmet(TMOB *m) { short *p=NULL,*q; - int i,j,c,z; + int i,j,c,z = 0; - for(j=0,c=0;jinv[j]==0)); + for(j=0,c=0;jinv[j]==0),++j); i=0; do { @@ -535,7 +535,7 @@ char je_mozne_videt(int sector1, int sector2, int flag) { int q_vidis_postavu(int sector,int dir,TMOB *p,int *otocit_se,char ret) { int i,z=-1; - int xs,ys,nd,d,dis=255; + int xs,ys,nd=0,d,dis=255; if (p->vlastnosti[VLS_KOUZLA] & SPL_BLIND) return -1; if (p->vlastnosti[VLS_KOUZLA] & SPL_FEAR) return -1; @@ -558,7 +558,7 @@ int q_vidis_postavu(int sector,int dir,TMOB *p,int *otocit_se,char ret) if (ok) if (je_mozne_videt(sector,postavy[i].sektor,SD_MONST_IMPS | SD_PLAY_IMPS)) { - int alt; + int alt = 0; if (ys>=abs(xs)) {nd=0;alt=xs>0?3:1;} else if (xs>=abs(ys)) {nd=3;alt=ys>0?0:2;} else if (ys<=(-abs(xs))) {nd=2;alt=xs>0?1:3;} @@ -1198,7 +1198,7 @@ static int mob_check_teleport(int sect,int num) void mob_step_next(int num,int sect,int dir,char *change) { - int c,numm,d; + int c,numm,d = 0; TMOB *p; *change+=128; @@ -1387,7 +1387,7 @@ void mob_hit(TMOB *mm,int dostal) bott_draw(0); if (mm->lives<1) { - int xpos; + int xpos = 0; switch (viewdir) { case 0:xpos=-(mm->locx-128);break; diff --git a/game/gamesave.c b/game/gamesave.c index 714dd75..d5695ef 100644 --- a/game/gamesave.c +++ b/game/gamesave.c @@ -623,7 +623,7 @@ int save_basic_info() s.out_filter=get_snd_effect(SND_OUTFILTER); s.autosave=autosave_enabled; s.game_flags=(enable_glmap!=0); - strncpy(s.level_name,level_fname,12); + strcopy_n(s.level_name,level_fname,12); for(i=0;i<5;i++) s.runes[i]=runes[i]; if (picked_item!=NULL) for(i=1,p=picked_item;*p;i++,p++);else i=0; @@ -712,7 +712,7 @@ int load_basic_info() set_snd_effect(SND_OUTFILTER,s.out_filter); if (level_fname==NULL || strncmp(s.level_name,level_fname,12)) { - strncpy(loadlevel.name,s.level_name,12); + strcopy_n(loadlevel.name,s.level_name,12); loadlevel.start_pos=viewsector; loadlevel.dir=viewdir; send_message(E_CLOSE_MAP); @@ -760,7 +760,7 @@ int save_game(int slotnum,char *gamename) ssn=alloca(strlen(sn)+3); sprintf(ssn,sn,slotnum); gn=alloca(SAVE_NAME_SIZE); - strncpy(gn,gamename,SAVE_NAME_SIZE); + strcopy_n(gn,gamename,SAVE_NAME_SIZE); if ((r=save_shops())!=0) return r; if ((r=save_basic_info())!=0) return r; save_book(); diff --git a/game/globals.h b/game/globals.h index 47676bd..332318a 100644 --- a/game/globals.h +++ b/game/globals.h @@ -1721,7 +1721,7 @@ int smlouvat_prodej(int cena,int ponuka,int posledni,int puvod,int pocet); THAGGLERESULT smlouvat_dlg(int cena,int puvod,int pocet,int posledni, int money,char mode); void disable_intro(void); -void show_jrc_logo(char *filename); +//void show_jrc_logo(char *filename); //dialogy diff --git a/game/globmap.c b/game/globmap.c index eca4396..7d4f991 100644 --- a/game/globmap.c +++ b/game/globmap.c @@ -206,7 +206,7 @@ static char test_kriterii(void) char last_op=0; char not_op=0; char text[128]; - char hodn; + char hodn = 0; char vysl=0; char symb,*c; @@ -427,7 +427,7 @@ static char flp_validate(word sector, void *ctx) { m=mobs+mob_map[sector]-1; if (m->vlajky & ~MOB_PASSABLE) return 0; - if (!m->next) + if (m->next) if (mobs[m->next-1].vlajky & ~MOB_PASSABLE) return 0; } c=map_sectors[sector].sector_type; @@ -484,7 +484,7 @@ static char load_index_map(int index) */ if (!GlobEvent(MAGLOB_LEAVEMAP,viewsector,viewdir)) return 0; viewsector=lv; - strncpy(x.name,index_tab[index].mapname,12); + strcopy_n(x.name,index_tab[index].mapname,12); x.start_pos=0; x.dir=0; macro_load_another_map(&x); diff --git a/AdvMan/FCS_tasker.h b/game/icon.base64 similarity index 100% rename from AdvMan/FCS_tasker.h rename to game/icon.base64 diff --git a/game/icon.bmp b/game/icon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..765bd5006c176b09b4332e4db438b52ab4eb3050 GIT binary patch literal 630 zcmXYuO=uHA6oB7Kp*;lLS%NaYB5*n;LoptOJA*MemC3@)p$t4ax);Vrbhtio4o*x= z!(_P(`>%b5>f&oS^86=UZhFw{`~{+t0KK4w5FjK$q!@Zu=!!T(BJu#ThN_56A~+Ku z!kH~8gs6!^nAplYG%tx#)d*KqddL0yAoe1;vq1uBr1vH$l(h5N1oZRP0B;Cg0PWzd zo6}|LK0*7dZM*RH9u>GNv|}^T=fAA75bvY6&N{dl<+#ae_XFepx82Bo-{pU9=tXYL zFt;&?=s)FkLQ>pku5~z?a=6o7mH-%a?Mvc*{TtYQAVc4ZzfuR0hf#D}!}1uTKZFn& zB1pZ)&NiiM!u0~##n+KKJ=(ScH}p#H9dg>MJGNMy)ilQ+nnmAARlIou;*HST?m6hr z@98ebfhaq$wdB1=ZjE-=6geNA@umQqXKH9^iO;-_fMe3?A(EO0HC+ejQUP4i0lamk!v%#A-5 aUK>3]|=1<<(start & 0x7); for(*stk_free++=start;stk_free!=stk_cur;stk_cur++) { - uint8_t i;word s,d,ss; + uint8_t i;word s=0,d=0,ss=0; s=(ss=Lo(*stk_cur))<<2; for(i=0;i<4;i++) if (!(map_sides[s+i].flags & flag)) { @@ -1181,7 +1181,7 @@ void fletna_pridej_notu(char note) { note+=65; fletna_str[pos]=note; - if (pos==13) memcpy(fletna_str,fletna_str+1,pos); + if (pos==13) memmove(fletna_str,fletna_str+1,pos-1); else pos++; } @@ -1535,6 +1535,7 @@ THAGGLERESULT smlouvat_dlg(int cena,int puvod,int pocet,int posledni, int money, return res; } +#if 0 //----------------- JRC LOGO ---------------------------------- #define SHOWDELAY 125 @@ -1611,3 +1612,4 @@ void show_jrc_logo(char *filename) showview(0,0,0,0); free(pcx); } +#endif diff --git a/game/inv.c b/game/inv.c index cdae9ac..ed19d1d 100644 --- a/game/inv.c +++ b/game/inv.c @@ -248,9 +248,9 @@ void load_items() *sep = 0; --sep; } - strncpy(glob_items[i].popis, nx, sizeof(glob_items[i].popis)-1); + strcopy_n(glob_items[i].popis, nx, sizeof(glob_items[i].popis)-1); } - strncpy(glob_items[i].jmeno, trnw, sizeof(glob_items[i].jmeno)-1); + strcopy_n(glob_items[i].jmeno, trnw, sizeof(glob_items[i].jmeno)-1); } } stringtable_free(str_table); @@ -270,7 +270,7 @@ static short expand_itemlist(void) if (item_count>32766) { - int i,j; + int i,j = 0; for(i=it_count_orgn;i=0) l=*(int32_t *)(((char *)human_selected)+parm); else switch (parm) diff --git a/game/kniha.c b/game/kniha.c index af51f86..9681a3e 100644 --- a/game/kniha.c +++ b/game/kniha.c @@ -323,7 +323,7 @@ static int get_data_handle(char *filename,void *dec) static void insert_picture(char *filename,int align,int line,int lsize) { - int x, y; + int x=0, y=0; const short *psiz; char *c=write_buff; @@ -391,7 +391,7 @@ static char read_tag(TMPFILE_RD *txt) while (c!='>') { c=read_set(txt,var,set); - if (!strcmp(var,SRC)) strncpy(pic_name,set,49); + if (!strcmp(var,SRC)) strcopy_n(pic_name,set,49); else if (!strcmp(var,ALIGN)) { if (!strcmp(set,ALEFT)) alig=1; diff --git a/game/kouzla.c b/game/kouzla.c index 808a290..fc298a6 100644 --- a/game/kouzla.c +++ b/game/kouzla.c @@ -205,14 +205,14 @@ const void *load_spells_legacy_format(const void *p, int32_t *s) { k = (np); for (int i = 0; i < count; ++i) { char *b = (char *)k; - char traceon = *(k->spellname-1); //traceon was there; + char traceon = b[offsetof(TKOUZLO, spellname)-1]; //traceon was there; size_t bofs = offsetof(TKOUZLO, traceon); size_t eofs = offsetof(TKOUZLO, spellname)-1; memmove(b+bofs+1, b+bofs, eofs-bofs);\ k->traceon = traceon; const char *new_name = stringtable_find(strtable, i, NULL); if (new_name) { - strncpy(k->spellname,new_name,sizeof(k->spellname)-1); + strcopy_n(k->spellname,new_name,sizeof(k->spellname)-1); } ++k; } @@ -435,7 +435,7 @@ static void spell_vzplanuti2(THE_TIMER *tt) static void spell_vzplanuti(int cil,int count,int hit,char mode,char zivel) { THE_TIMER *tt; - int sector,smer; + int sector = 0,smer = 0; int i,o,d; if (cil<0) { @@ -467,7 +467,7 @@ static void spell_vzplanuti(int cil,int count,int hit,char mode,char zivel) void spell_create(int cil,int what) { word sector=0; - char dir; + char dir = 0; short p[2]; if (dead_food) { @@ -508,7 +508,7 @@ void spell_create_weapon(int cil,int what) void spell_throw(int cil,int what) { word sector=0; - char dir; + char dir = 0; LETICI_VEC *fly; get_sector_dir(cil,§or,&dir); @@ -1029,7 +1029,7 @@ void spell_teleport_sector(int cil,int owner) if (cil!=owner) return; postavy_teleport_effect(0,0,0,1); - strncpy(loadlevel.name,TelepLocation.map,12); + strcopy_n(loadlevel.name,TelepLocation.map,12); loadlevel.name[12]=0; loadlevel.start_pos=TelepLocation.sector; loadlevel.dir=TelepLocation.dir; @@ -1102,7 +1102,7 @@ void spell_teleport_sector(int cil,int owner) static void spell_summon(int cil) { - short sector,i,rn,rno,slc; + short sector = 0,i,rn,rno,slc; int stdir,p; if (cil>0) sector=postavy[cil-1].sektor; @@ -1664,11 +1664,11 @@ void call_spell(int i) TelepLocation.map = 0; break; default: { - char *d = + const char *d = "Chyba v popisu kouzel: Program narazil na neznamou instrukci %d (%02X) pri zpracovani kouzla s cislem %d. Kouzlo bylo ukon�eno"; - char *c = alloca(strlen(d) + 20); - sprintf(c, d, *(c - 1), *(c - 1), p->num); - bott_disp_text(c); + char *buff = alloca(strlen(d) + 20); + sprintf(buff, d, *(c - 1), *(c - 1), p->num); + bott_disp_text(buff); spell_end(i, p->cil, p->owner); return; } diff --git a/game/macros.c b/game/macros.c index 2cf93ae..80be6c2 100644 --- a/game/macros.c +++ b/game/macros.c @@ -118,7 +118,9 @@ void load_macros(int size,void *data) macro_state_block.states = (uint8_t *)(macros+count_s); macro_state_block.count = count_m; TMULTI_ACTION *m_iter = (TMULTI_ACTION *)(macro_state_block.states + count_m); +#ifndef NDEBUG TMULTI_ACTION *m_end = m_iter + count_m; +#endif first_macro = m_iter; iter = data; @@ -603,8 +605,8 @@ static void ma_move_group(int where,int turn,char effect) else { THUMAN *h=postavy; - int i; - int sctr; + int i=0; + int sctr=0; char kdo=0; for(i=0;i + + +constexpr binary_data font_data ="@FONT_CONTENT@"; +constexpr binary_data icon_data ="@ICON_CONTENT@"; + +extern "C" { + +const void *LoadDefaultFont(void) { + return font_data.begin(); +} + +const void *getWindowIcon(void) { + return icon_data.begin(); +} +size_t getWindowIconSize(void) { + return std::distance(icon_data.begin(),icon_data.end()); +} + + +} diff --git a/game/resources_to_cpp.cmake b/game/resources_to_cpp.cmake new file mode 100644 index 0000000..2735b13 --- /dev/null +++ b/game/resources_to_cpp.cmake @@ -0,0 +1,5 @@ +file(READ ${IN_FONT} FONT_CONTENT) +file(READ ${IN_ICON} ICON_CONTENT) + +configure_file(${TEMPLATE} ${OUT} @ONLY) + diff --git a/game/setup.c b/game/setup.c index 49dd0f4..b6015e1 100644 --- a/game/setup.c +++ b/game/setup.c @@ -27,7 +27,7 @@ char q_runsetup(char *parm) { char c[6]; - strncpy(c,parm,6); + strcopy_n(c,parm,6); strupper(c); return !strncmp(c,"/SETUP",6); } diff --git a/game/skeldal.c b/game/skeldal.c index 6a3c1fa..3f078b8 100644 --- a/game/skeldal.c +++ b/game/skeldal.c @@ -16,7 +16,7 @@ #include #include #include "globals.h" -#include "default_font.h" +#include "resources.h" // #include "advconfig.h" #include "skeldal.h" @@ -691,10 +691,9 @@ void *user_timer(EVENT_MSG *msg,void **usr) void do_timer(void) { EVENT_MSG msg; - char x; msg.msg=E_IDLE; - otevri_zavoru=&x; + *otevri_zavoru=1; user_timer(&msg,NULL); } @@ -865,7 +864,7 @@ void swap_error_exception(void) exit(0); } -void *boldcz; +const void *boldcz; #define ERR_WINX 320 #define ERR_WINY 100 @@ -946,6 +945,7 @@ void init_skeldal(const INI_CONFIG *cfg) exit(1); } showview = game_display_update_rect; + game_display_set_icon(getWindowIcon(), getWindowIconSize()); general_engine_init(); atexit(done_skeldal); @@ -1065,7 +1065,7 @@ extern char running_battle; ReloadMapInfo *minfo=va_arg(msg->data, ReloadMapInfo *); const char *fname=minfo->fname; int sektor=minfo->sektor; - strncpy(loadlevel.name,fname,sizeof(loadlevel.name)); + strcopy_n(loadlevel.name,fname,sizeof(loadlevel.name)); loadlevel.start_pos=sektor; for(i=0;i2) { sscanf(argv[2],"%d",§); @@ -1490,7 +1490,7 @@ static void start(va_list args) schovej_mysku(); if (!any_save()) { - show_jrc_logo("LOGO.PCX"); +// show_jrc_logo("LOGO.PCX"); play_anim(7); } skip_intro=0; @@ -1573,7 +1573,7 @@ const char *configure_pathtable(const INI_CONFIG *cfg) { static char default_subpaths[DEFAULT_SUBPATHS][DEFAULT_SUBPATHS_LEN]; for (int i = 0; i < DEFAULT_SUBPATHS; ++i) { - strncpy(default_subpaths[i], build_pathname(2, "graphics", sub_paths[i]), DEFAULT_SUBPATHS_LEN); + strcopy_n(default_subpaths[i], build_pathname(2, "graphics", sub_paths[i]), DEFAULT_SUBPATHS_LEN); } const INI_CONFIG_SECTION *paths = ini_section_open(cfg, "paths"); @@ -1603,6 +1603,7 @@ void display_error(const char *format, ...) { if (display_error_cb) { char buff[1024]; vsnprintf(buff,sizeof(buff), format, lst); + display_error_cb(buff); } else { fprintf(stderr, format, lst); } diff --git a/game/souboje.c b/game/souboje.c index d87f0e9..866df90 100644 --- a/game/souboje.c +++ b/game/souboje.c @@ -733,7 +733,7 @@ void wire_end_game() if (mname != NULL) { cur_group = postavy[i].groupnum; TMA_LOADLEV lv; - strncpy(lv.name,mname, sizeof(lv.name)-1); + strcopy_n(lv.name,mname, sizeof(lv.name)-1); lv.start_pos = -postavy[i].sektor; lv.dir = postavy[i].direction; macro_load_another_map(&lv); @@ -902,7 +902,7 @@ void utek_postavy(THUMAN *p) int trace_path(int sector,int dir) { - int mm,p,c=5; + int mm,p=0,c=5; int r=rnd(2); do { @@ -2247,7 +2247,7 @@ char zasah_veci(int sector,TFLY *fl) mob2=m1->next-MOB_START; if (mob2>=0) { - int x1,y1; + int x1=0,y1=0; m2=&mobs[mob2]; switch (fl->smer) { diff --git a/game/specproc.c b/game/specproc.c index da061c7..f744045 100644 --- a/game/specproc.c +++ b/game/specproc.c @@ -223,13 +223,6 @@ static void show_liane(THE_TIMER *t) -static const float Snapper=3<<22; - -static __inline int toInt(float fval) - { - fval += Snapper; - return ( (*(int *)&fval)&0x007fffff ) - 0x00400000; - } static void OtocObrazPodleMatice(float mx[3][2], word *picture) { @@ -243,8 +236,8 @@ static void OtocObrazPodleMatice(float mx[3][2], word *picture) { int oldx=x-320; int oldy=y-180; - int newx=toInt(oldx*mx[0][0]+oldy*mx[1][0]+320); - int newy=toInt(oldx*mx[0][1]+oldy*mx[1][1]+180); + int newx=(int)(oldx*mx[0][0]+oldy*mx[1][0]+320); + int newy=(int)(oldx*mx[0][1]+oldy*mx[1][1]+180); if (newx>=0 && newx<640 && newy>=0 && newy<360) trg[x]=picture[newx+640*newy]; else diff --git a/game/temp_storage.cpp b/game/temp_storage.cpp index 9537687..34bf203 100644 --- a/game/temp_storage.cpp +++ b/game/temp_storage.cpp @@ -43,7 +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()); + std::copy(b,e, v.begin()); } int32_t temp_storage_find(const char *name) { diff --git a/game/transav.c b/game/transav.c index bf8ac18..c6864c5 100644 --- a/game/transav.c +++ b/game/transav.c @@ -287,7 +287,7 @@ void unpack_save(void *in) s.items_added=0; s.glob_flags=0; s.game_time=0; - strncpy(s.level_name,mapname,12); + strcopy_n(s.level_name,mapname,12); memset(s.runes,0,sizeof(s.runes)); } @@ -583,7 +583,7 @@ void begin_program(char *sourceadv,char *targetadv) cprintf("Vystupni dobrodruzstvi %s musi obsahovat polozku DEFAULT_MAP\n\r", targetadv); exit(1); } - strncpy(mapname,c,12);mapname[12]=0; + strcopy_n(mapname,c,12);mapname[12]=0; c=get_text_field(trg,"CESTA_MAPY"); if (c==NULL) { diff --git a/game/wizard.c b/game/wizard.c index d894151..fb0be8d 100644 --- a/game/wizard.c +++ b/game/wizard.c @@ -359,7 +359,7 @@ static reload_mobs() { extern char reset_mobiles; reset_mobiles=1; - strncpy(loadlevel.name,level_fname,12); + strcopy_n(loadlevel.name,level_fname,12); loadlevel.start_pos=viewsector; loadlevel.name[12]=0; loadlevel.dir=viewdir; diff --git a/insteng/SETUP.C b/insteng/SETUP.C deleted file mode 100644 index 3249d9d..0000000 --- a/insteng/SETUP.C +++ /dev/null @@ -1,1462 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "setup.h" -#include "setvideo.h" -#include "setuplib.h" -#include "setupcpy.h" - -#define TEST_MUSIC "\\SNDTEST.MUS" -#define SETUP_BATCH "SETUP.BAT" -#define _SOURCE_ copy_source_path -#define ER_NAME "c:\\skeldal.!!!" -#define VEL_RAMECEK 8 - -#define VMODE "VMODE" -#define SOUND_DEVICE "SOUND_DEVICE" - -#define SETUP_NAME "SETUP.EXE" - -word *ramecky[VEL_RAMECEK]; - -#define SKELDAL "SKELDAL" -#define SKELDAL_INI SKELDAL".INI" -#define CONCAT(t,s1,s2) strcat(strcpy(t=alloca(strlen(s1)+strlen(s2)+1),s1),s2) -void *bbutt; - -char *copy_source_path; -char *test_sound_name; -char *program_data_path=NULL; -char setup_mode=0; -char subtitles=1; - -char *pgm_name; - -TSTR_LIST setup_ini; - -typedef struct tsound - { - int device,port,irq,dma; - }TSOUND; - - -FILE *ini; -word *vga_font; -word *icones; -word icone_color[7]={0x2108,0x7fff,0x000f,0x4210,0x6f7b}; -//static char target_path[256]="E:\HRY\SKELDAL\"; -char *source_path; -char target_path[2049]; -static TSOUND sound_info={0,0,0,0}; -static int vmode=0; -static char mixer_running=0; -static char back=0; -static char install_type; -static long install_sizes[3]; -static long maxcopy=1; -TSTR_LIST handbook=NULL; -TSTR_LIST dirlist=NULL; -TSTR_LIST disklist=NULL; -int win_handbook=-1; -char rescue_mode=0; -char *inifile=NULL; - -#pragma off (stack_checking) - -static char home_path(char *source_path) - { - unsigned x,z; - _dos_setdrive(source_path[0]-'@',&x); - _dos_getdrive(&z); - if (z!=source_path[0]-'@') return 1; - chdir("\\"); - chdir(source_path); - return 0; - } -char error_device(word a,char b,char c) - { - a,b,c; - - errno=-1; - return _ERR_FAIL; - } - -int create_er_file() - { - FILE *f; - if (!access(ER_NAME,F_OK)) return 0; - - f=fopen(ER_NAME,"w"); - fprintf(f,"7925536\n"); - fprintf(f,"This is a rescue file for Gates of Skeldal game. Don't erase the file, if INSTALL has crashed."); - fclose(f); - return 1; - } - -void remove_er_file() - { - FILE *f; - - f=fopen(ER_NAME,"r"); - if (f!=NULL) - { - long l=0; - fscanf(f,"%d",&l); - fclose(f); - if (l==7925536) remove(ER_NAME); - } - } - - -static conv_ramecek(word *ram) - { - int i; - word xs,ys; - char *ptr; - word *targ; - - xs=ram[0]; - ys=ram[1]/VEL_RAMECEK; - ptr=(char *)(ram+3+256); - for(i=0;i"); - } - for(i=0;i", - "", - "HICOLOR(64K)" - }; - -static void autodetect() - { - SVGAinfo si; - char s[80]; - - default_font=&font6x9; - def_dialoge(12,12,324,140,"Autodetection",2); - define(-1,5,22,1,1,0,label,"Graphic system:"); - define(-1,5,34,1,1,0,label,"Type of SVGA:"); - define(-1,5,46,1,1,0,label,"Resolution:"); - define(-1,5,62,1,1,0,label,"Sound card:"); - define(-1,5,74,1,1,0,label,"Parameters:"); - define(-1,5,90,1,1,0,label,"CD-ROM:"); - define(-1,5,110,1,1,0,label,"Mouse:"); - define(10,5,22,120,10,1,view_line,256);set_default(""); - define(20,5,34,160,10,1,view_line,256);set_default(""); - define(30,5,46,150,10,1,view_line,256);set_default(""); - define(40,5,62,120,10,1,view_line,256);set_default(""); - define(50,5,74,140,10,1,view_line,256);set_default(""); - define(60,5,90,150,10,1,view_line,256);set_default(""); - define(70,5,110,180,10,1,view_line,256);set_default(""); - set_enable(0,6,0); - set_enable(0,5,0); - do_events(); - if (getsvgainfo(&si)) - { - set_value(0,10,""); - set_value(0,20,""); - } - else - { - sprintf(s,"VESA %d.%02d",si.version/256,si.version%256); - set_value(0,10,s); - set_value(0,20,si.oemstr); - } - set_value(0,30,gr_mody[vmode]);do_events(); - sound_detect(&sound_info.device,&sound_info.port,&sound_info.dma,&sound_info.irq); - set_value(0,40,device_name(sound_info.device)); - if (sound_info.device==DEV_WSS || sound_info.device==DEV_ULTRA) - sprintf(s,"Port %X Dma %X",sound_info.port,sound_info.dma); - else sprintf(s,"Port %X Dma %X Irq %X",sound_info.port,sound_info.dma,sound_info.irq); - set_value(0,50,s); - set_value(0,60,get_cdrom()); - set_enable(0,6,1); - set_enable(0,5,1); - sprintf(s,"%d buttons",ms_get_keycount()); - set_value(0,70,s); - } - -static EVENT_PROC(esc_mode2) - { - GET_USER_PTR(); - WHEN_MSG(E_KEYBOARD) - { - if (GET_DATA(char)==27) - { - donegr(); - if (vmode==0)initgr_low();else initgr_spec(vmode); - zobraz_mysku(); - redraw_desktop(); - goto_control(0); - terminate_gui(); - } - } - } - -static char test_mode() - { - char i,j,c,z; - - z=f_get_value(0,9); - if (z!=5) - if (msg_box("Test",'\x1', - "Install will try to change the screen to selected video-mode. If screen stays black or display " - "nosences then immediately press ESC and install will restore previous mode. ", - "Try it","Cancel",NULL)==2) return 0; - else; - else - if (msg_box("Test grafiky",'\x1', - "Install will try to change the screen to selected video-mode. If screen stays black or display " - "nosences then immediately press ESC and install will restore previous mode. " - "Note: Game is optimized for HICOLOR(32K)!" - ,"Try it","Cancel",NULL)==2) return 0; - - send_message(E_ADD,E_KEYBOARD,esc_mode2); - donegr(); - i=initgr_spec(z); - if (!i) - { - zobraz_mysku(); - redraw_desktop(); - } - else - { - initgr_low();zobraz_mysku(); - msg_box("Not supported",2,"Graphic card don't support selected mode.","Ok",NULL); - } - if (!i && (j=msg_box("Result",'\x2',"Works it corretly?","Yes","No",NULL))==1) - { - vmode=f_get_value(0,9); - if (vmode==0) initgr_low(); - zobraz_mysku(); - c=1; - } - else - { - c_set_value(0,9,vmode); - donegr(); - if (vmode==0) initgr_low();else initgr_spec(vmode); - zobraz_mysku(); - redraw_desktop(); - c=0; - } - send_message(E_DONE,E_KEYBOARD,esc_mode2); - return c; - } - -static TSTR_LIST video_ls=NULL; - -static void create_video_ls() - { - int i; - if (video_ls==NULL) - { - video_ls=create_list(10); - for(i=0;i<6;i++) if (gr_mody[i][0]!='<')str_replace(&video_ls,i,gr_mody[i]); - } - } - -static void toggle_subtitles() - { - subtitles=f_get_value(0,30); - } - -static void select_vga() - { - default_font=&font6x9; - def_dialoge(20,300,156,156,"Graphics modes",2); - define(9,0,20,156,80,0,listbox,video_ls,0x03ff,0);c_default(vmode); - property(NULL,vga_font,NULL,WINCOLOR); - define(20,38,20,80,20,3,button,"Change now");on_control_change(test_mode); - property(bbutt,NULL,NULL,BUTTONCOLOR); - define(30,10,5,80,10,3,check_box,"Subtitles in intro.");c_default(subtitles);on_control_change(toggle_subtitles); - redraw_window(); - } - - -static void change_dma() - { - int i,j; - - i=f_get_value(0,30); - j=f_get_value(0,35)+3; - if (o_aktual->id==30) - { - c_set_value(0,30,i); - c_set_value(0,35,i-3); - } - else - { - c_set_value(0,30,j); - c_set_value(0,35,j-3); - } - } - -static void select_mode_win() - { - def_dialoge(224,270,192,156,"Install",2); - default_font=&font6x9; - define(10,30,40,132,30,0,button,"Automatic");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(30,30,80,132,30,0,button,"Custom");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(40,50,15,92,20,3,button,"Quit");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(stop_copy); - redraw_window(); - } - -static void select_mode_win_setup() - { - def_dialoge(224,270,192,156,"Menu",2); - default_font=&font6x9; - define(10,30,40,132,30,0,button,"Change settings");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(30,30,80,132,30,0,button,"Uninstall");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(40,50,15,92,20,3,button,"Quit");property(bbutt,NULL,NULL,BUTTONCOLOR);on_control_change(stop_setup); - redraw_window(); - } - - - -static void device_select() - { - int i,p; - i=f_get_value(0,9); - set_enable(0,40,i!=DEV_ULTRA && i!=DEV_WSS && i!=DEV_NOSOUND && i!=DEV_DAC); - p=i==DEV_SB16 || i==DEV_ULTRA; - set_enable(0,35,p); - if (p==0) - { - c_set_value(0,30,1); - c_set_value(0,35,1-3); - } - set_enable(0,20,i!=DEV_NOSOUND); - set_enable(0,30,i!=DEV_NOSOUND && i!=DEV_DAC); - set_enable(0,50,i!=DEV_NOSOUND); - } - -static void device_select2() - { - int i; - - device_select(); - i=f_get_value(0,9); - if (i==DEV_DAC) - { - char c; - def_dialoge(270,240,100,100,device_name(i),3); - define(10,10,25,60,40,0,radio_butts,3,"LPT 1","LPT 2","PC Speaker");c_default(0); - define(20,10,5,80,20,2,button,"Ok");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - c=f_get_value(0,10); - close_current(); - if (c==0) set_value(0,20,"378");else - if (c==1)set_value(0,20,"278"); - else set_value(0,20,"042"); - } - if (i==DEV_SB16 || i==DEV_ULTRA || i==DEV_SBPRO || i==DEV_SB20 || i==DEV_SB10) - set_value(0,20,"220"); - if (i==DEV_WSS) set_value(0,20,"530"); - } - -static void select_sound(); -static void detect_sound() - { - if (msg_box("Sound card autodetect",'\x2',"This command may hangs computer. If it happened, restart the computer and configure sound card manually.","Yes","No",NULL)==2) return; - if (mixer_running) stop_mixing(); - mixer_running=0; - set_enable(0,70,mixer_running); - sound_detect(&sound_info.device,&sound_info.port,&sound_info.dma,&sound_info.irq); - close_current(); - select_sound(); - } - -static int sound_win=-1; - -static char sound_scan() - { - char buffer[20]; - char dmas[]={0,1,3,5,6,7}; - char irqs[]={2,3,5,7}; - - sound_info.device=f_get_value(sound_win,9); - if (sound_info.device!=DEV_NOSOUND) - { - if (sound_info.device==DEV_DAC) - if (msg_box("Warning!",'\x1', - "Selected sound device use non-standard accesses and routines using " - "hidden tricks on PC compatible computers. On some machines, device " - "may hangs the system. Don't use it, if not running under MS-DOS. " - "Don't use under WINDOWS! For best performance, uninstall any EMM manager, " - "such a EMM386, QEMM386 and other. Continue?", - "Yes","No",NULL)==2) return 1; - get_value(sound_win,20,buffer); - if (sscanf(buffer,"%x",&sound_info.port)!=1) - { - msg_box("Note!",'\x1',"Mistake in Port field","Ok",NULL); - return 1; - } - } - sound_info.dma=dmas[f_get_value(sound_win,30)]; - sound_info.irq=irqs[f_get_value(sound_win,40)]; - return 0; - } - - -static void test_sound() - { - if (mixer_running) stop_mixing(); - if (sound_scan()) return; - set_mixing_device(sound_info.device,22050,sound_info.port,sound_info.dma,sound_info.irq); - start_mixing(); - change_music(test_sound_name); - mix_back_sound(2); - mix_back_sound(0); - mixer_running=1; - set_enable(0,70,mixer_running); - } - -static void stop_sound() - { - if (mixer_running) - { - stop_mixing(); - mixer_running=0; - set_enable(sound_win,70,mixer_running); - } - } - -void select_sound() - { - TSTR_LIST ls; - int i; - char buff[30]; - - ls=create_list(8); - default_font=&font6x9; - for(i=0;i<8;i++) str_add(&ls,device_name(i)); - str_replace(&ls,0,""); - sound_win=def_dialoge(200,300,300,156,"Sound devices",2); - define(9,2,20,170,85,0,listbox,ls,0x03ff,0);c_default(sound_info.device);on_control_change(device_select2); - property(def_border(0,0x4210),vga_font,NULL,WINCOLOR); - define(-1,180,20,1,1,0,label,"Port:"); - define(20,10,20,30,12,1,input_line,3);property(def_border(0,0x4210),vga_font,NULL,WINCOLOR); - set_default(itoa(sound_info.port,buff,16)); - define(-1,180,40,1,1,0,label,"DMA:"); - i=sound_info.dma;i-=(i>2)+(i>4); - define(30,40,40,30,30,1,radio_butts,3,"0","1","3");c_default(i);on_control_change(change_dma); - define(35,10,40,30,30,1,radio_butts,3,"5","6","7");c_default(i-3);on_control_change(change_dma); - define(-1,180,80,1,1,0,label,"IRQ:"); - i=sound_info.irq;i-=2*(i>1)+(i>4)+(i>6); - define(40,40,80,30,40,1,radio_butts,4,"2","3","5","7");c_default(i); - define(50,10,5,80,20,2,button,"Test");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(test_sound); - define(60,100,5,80,20,2,button,"Autodetect");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(detect_sound); - define(70,190,5,80,20,2,button,"Stop");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(stop_sound); - redraw_window(); - set_enable(0,70,mixer_running); - device_select(); - } - -static void back_start() - { - back=1; - stop_sound(); - sound_scan(); - while (waktual!=NULL) close_current(); - terminate_gui(); - } - -static void control_window(void *forward,void *back,void *help); -static void control_next1(); - -static void control_back1() - { - close_current(); - get_value(0,60,target_path); - while (waktual!=NULL) close_current(); - exit_wait=0; - select_vga(); - select_sound(); - control_window(control_next1,back_start,open_help); - } - -static trace_chdir(char *what) - { - char *c; - char *d; - - c=alloca(strlen(what)+1); - strcpy(c,what); - d=strrchr(c,'\\'); - while (d!=NULL) - { - if (chdir(c)==0) - { - home_path(c); - return; - } - *d=0; - d=strrchr(c,'\\'); - } - strcat(c,"\\"); - home_path(c); - } - - -void static show_space(char device) - { - char buff[100]; - static long lastvalue; - static char lastdevice; - - device=toupper(device); - if (device>='A' && device<='Z') - { - if (device!=lastdevice) lastvalue=get_disk_free(device-'@')/1024; - sprintf(buff,"On device %c: is %d Kb free",device,lastvalue); - lastdevice=device; - set_value(0,80,buff); - } - } - -static open_load_window() - { - char c; - get_value(0,60,target_path); - trace_chdir(target_path); - getcwd(target_path,2047); - load_window(); - escape(); - home_path(source_path); - c=o_aktual->id==150; - if (c) - { - get_value(0,10,target_path); - } - close_current(); - if (c) - set_value(0,60,target_path); - else - get_value(0,60,target_path); - show_space(target_path[0]); - } - -static char create_ini(char *path,char *name) - { - - if (inifile!=NULL) - { - fclose(ini); - remove(inifile); - free(inifile); - } - inifile=NewArr(char,strlen(path)+strlen(name)+2); - sprintf(inifile,"%s\\%s",path,name); - ini=fopen(inifile,"w"); - if (ini==NULL) return 1; - add_to_list(inifile); - fprintf(ini,"vmode %d\n", vmode); - fprintf(ini,"sound_device %d %x %d %d\n",sound_info.device,sound_info.port,sound_info.dma,sound_info.irq); - fprintf(ini,"sound_mixfreq 22049\n"); - fprintf(ini,"default_map lespred.map\n"); - fprintf(ini,"preload 1\n"); - fprintf(ini,"game_speed 5\n"); - if (subtitles) fprintf(ini,"titles 1\n"); - return 0; - } - /* -static char create_setup_batch(char *path,char *name) - { - char *st; - FILE *batch; - - st=alloca(strlen(path)+strlen(name)+2); - sprintf(st,"%s\\%s",path,name); - batch=fopen(st,"w"); - if (batch==NULL) return 1; - fputs( - "@Echo off\n" - ":skok\n" - "Echo Vloz CD \"Brany Skeldalu\" do mechaniky\n" - "Echo a stiskni jakoukoliv klavesu. \n" - "Echo.\n" - "Echo Kombinace CNTR+C prerusi program....\n" - "Pause > NUL\n",batch); - fprintf(batch,"if not exist %s goto skok\n",pgm_name); - fprintf(batch,"%s -s \n",pgm_name); - fclose(batch); - return 0; - } - */ -static void close_ini() - { - if (ini!=NULL) fclose(ini); - } - -static void copy_self(char alloc) - { - static char *t; - - if (alloc) - { - t=NewArr(char,strlen(target_path)+strlen(SETUP_NAME)+2); - sprintf(t,"%s\\%s",target_path,SETUP_NAME); - cpy_file(pgm_name,t); - } - else free(t); - } - -static long self_size() - { - struct find_t f; - - _dos_findfirst(pgm_name,_A_NORMAL,&f); - return f.size; - } - -static void start_install() - { - long diskfree; - 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; - 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); - return; - } - get_script(_SOURCE_,target_path); - switch (o_aktual->id) - { - case 10:install_type=INST_MIN;break; - case 20:install_type=INST_MED;break; - case 30:install_type=INST_MAX;break; - } - maxcopy=install_sizes[install_type]; - diskfree=get_disk_free(target_path[0]-'@'); - if (maxcopy>diskfree) - { - if (msg_box("Low disk space!",'\x1', - "Install found that selected device is running out of free space. But if " - "you using disk-compressor, such as DRVSPACE, the free space may be" - "incorrectly calculated. Continue in installation?" - ,"Yes","No",NULL)==2) return; - } - else if (maxcopy+1024*1024>diskfree) - { - if (msg_box("Low disk space!",'\x2',"Out of space on target device. Needing 1MB for temporary files. Continue?","Yes","No",NULL)==2) return; - } - maxcopy=maxcopy<<1; - while (waktual!=NULL) close_current(); - cascade_mkdir(target_path); - if (create_ini(target_path,SKELDAL_INI)) - { - msg_box(PRG_HEADER,'\x1',"Cannot create configuration file. Check target path.","Ok",NULL); - clean_up(); - return; - } -// create_setup_batch(target_path,SETUP_BATCH); - display_progress(); - stop_sound(); - switch (install_type) - { - case INST_MIN:if (do_script(0) || do_script(-1) || do_script(-2) || do_script(-3)) error=1;break; - case INST_MED:if (do_script(0) || do_script(1) || do_script(-2) || do_script(-3)) error=1;break; - case INST_MAX:if (do_script(0) || do_script(1) || do_script(2) || do_script(3)) error=1; - break; - } - copy_self(1); - cpy_flush(); - copy_self(0); - close_ini(); - if (error) shutdown(),exit(1); - close_current(); - do_events(); - if (!autostart) msg_box("Done",' ',"The Game has been succesfully installed.","Ok",NULL); - purge_file_list(); - shutdown(); - home_path(target_path); - if (autostart) - { - puts("Please wait..."); - exit(254); - } - else exit(0); - } - -static EVENT_PROC (show_space_event) - { - OBJREC *o; - - o=(OBJREC *)user_ptr; - if (msg->msg==E_KEYBOARD || msg->msg==E_CURSOR_TICK) - { - char *c; - - c=o->data; - if (c[1]==':') - show_space(c[0]); - if (msg->msg==E_KEYBOARD) - *(char *)msg->data=toupper(*(char *)msg->data); - } - } - -static show_space_exit() - { - EVENT_MSG msg; - - msg.msg=E_KEYBOARD; - show_space_event(&msg,(void **)o_aktual); - } - - - -static void rozsah_window() - { - char buff[100]; - char *text="Need on HD: %d KB"; - - exit_wait=0; - default_font=&font6x9; - def_dialoge(146,160,348,264,"Installation ragne:",2); - define(10,10,30,70,30,0,button,"Minimum");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(start_install); - define(-1,90,30,1,1,0,label,"It will copy all important files"); - define(-1,90,40,1,1,0,label,"Data are loaded from CD"); - sprintf(buff,text,install_sizes[0]/1024); - define(-1,90,50,1,1,0,label,buff); - define(20,10,80,70,30,0,button,"Normal");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(start_install); - define(-1,90,80,1,1,0,label,"It will copy all important files and data"); - define(-1,90,90,1,1,0,label,"Music and video are loaded from CD"); - sprintf(buff,text,install_sizes[1]/1024); - define(-1,90,100,1,1,0,label,buff); - define(30,10,130,70,30,0,button,"Full");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(start_install); - define(-1,90,130,1,1,0,label,"It will copy all files."); - define(-1,90,140,1,1,0,label,"You will not need CD anymore."); - sprintf(buff,text,install_sizes[2]/1024); - define(-1,90,150,1,1,0,label,buff); - define(40,10,180,70,20,0,button,"Browse");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(open_load_window); - define(60,90,185,250,11,0,input_line,2048);property(def_border(1,0x4210),&font6x9,NULL,0x7fff); - set_default(target_path); - on_event(show_space_event);on_exit(show_space_exit); - define(-1,90,173,1,1,0,label,"Target directory:"); - define(70,40,220,200,10,0,check_box,"After installation, run the game automatically.");c_default(1); - define(80,10,10,250,11,2,view_line,100);set_default(""); - show_space(target_path[0]); - } - -static void automatic_window() - { - char buff[100]; - char *text="Game need %d KB free space"; - - exit_wait=0; - default_font=&font6x9; - def_dialoge(110,200,420,80,"Target directory:",2); - define(40,10,33,70,15,0,button,"Browse");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(open_load_window); - define(60,90,35,310,11,0,input_line,2048);property(def_border(1,0x4210),&font6x9,NULL,0x7fff); - set_default(target_path); - on_event(show_space_event);on_exit(show_space_exit); - define(10,10,10,70,20,2,button,"Start");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(start_install); - define(20,90,10,70,20,2,button,"<< Back");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(back_start); - sprintf(buff,text,install_sizes[0]/1024); - define(90,180,20,200,10,2,view_line,100);set_default(buff); - define(80,180,10,200,10,2,view_line,100);set_default(""); - show_space(target_path[0]); - redraw_window(); - } - - - -static void control_next1() - { - sound_scan(); - while (waktual!=NULL) close_current(); - rozsah_window(); - control_window(NULL,control_back1,open_help); - } - -static void control_window(void *forward,void *back,void *help) - { - def_dialoge(524,300,96,156,"Options",2); - define(10,8,30,80,20,0,button,"Next >>");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(forward); - define(20,8,60,80,20,0,button,"<< Back");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(back); - define(30,8,90,80,20,0,button,"? Help");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(help); - define(40,8,10,80,20,3,button,"Quit");property(bbutt,&font6x9,NULL,BUTTONCOLOR); - if (setup_mode) on_control_change(stop_setup);else on_control_change(stop_copy); - set_enable(0,10,forward!=NULL); - set_enable(0,20,back!=NULL); - set_enable(0,30,help!=NULL); - redraw_window(); - } - -static void run_setup() - { - int id; - - while (waktual!=NULL) close_current(); - get_script(_SOURCE_,""); - { - int minus[3]; - minus[1]=check_size(-2)+check_size(-3); - minus[0]=minus[1]+check_size(-1); - install_sizes[0]=check_size(0)+self_size(); - install_sizes[1]=install_sizes[0]+check_size(1); - install_sizes[2]=install_sizes[1]+check_size(2)+check_size(3); - install_sizes[0]+=minus[0]; - install_sizes[1]+=minus[1]; - id; - } - if (all_finder()) - { - char *c; - getcwd(&target_path,2047); - c=strchr(target_path,0); - c--; - if (*c=='\\') *c=0; - strcat(target_path,"\\"SKELDAL); - } - else - { - target_path[0]=select_disk()+'@'; - target_path[1]=':'; - target_path[2]='\\'; - strcpy(target_path+3,SKELDAL); - } - do - { - home_path(source_path); - back=0; - select_mode_win(); - about_window(); - id=o_aktual->id; - close_current(); - close_current(); - exit_wait=0; - if (id==10) - { - autodetect(); - automatic_window(); - } - if (id==30) - { - if (msg_box("Autodetection",'\x1',"Do you want to start autodetection?","Yes","No",NULL)==1) autodetect(); - select_vga(); - select_sound(); - control_window(control_next1,back_start,open_help); - } - if (id!=40) escape(); - } - while (back); - } - -static void save_ini() - { - char c[50]; - char d; - char err=1; - - if (sound_scan()) return; - d=msg_box("Quit",'\x2',"Do you wish to save all changes in configuration?","Yes","No","Cancel",NULL); - if (d==3) return; - if (d==1) - { - sprintf(c,"%d %x %d %d",sound_info.device, - sound_info.port, - sound_info.dma, - sound_info.irq); - add_field_txt(&setup_ini,SOUND_DEVICE,c); - add_field_num(&setup_ini,VMODE,vmode); - add_field_num(&setup_ini,"TITLES",subtitles); - home_path(target_path); - err=save_config(setup_ini,SKELDAL_INI); - } - shutdown(); - home_path(target_path); - switch (err) - { - case -1:puts("An error occured while saving changes. File "SKELDAL_INI" hasn't been changed");break; - case 0:puts("Changes has been saved..."); break; - case 1:puts("Changes has been discarded..."); break; - } - exit(0); - } - -static void deinstall() - { - char ig; - int x,y; - def_dialoge(200,200,250,156,"Uninstall?",2); - define(-1,10,30,200,100,0,label,"This will unistall the game."); - define(-1,10,40,200,100,0,label,"After it, you won't be able to play"); - define(-1,10,50,200,100,0,label,"the game until you install it again."); - define(10,30,80,150,10,0,check_box,"Don't erase saved positions");c_default(1); - define(20,10,10,80,30,3,button,"Yes, do it!");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - define(30,10,10,80,30,2,button,"No, newer!");property(bbutt,&font6x9,NULL,BUTTONCOLOR);on_control_change(terminate_gui); - redraw_window(); - escape(); - if (o_aktual->id==30) - { - close_current(); - return; - } - ig=f_get_value(0,10); - set_enable(0,30,0); - set_enable(0,20,0); - set_enable(0,10,0); - do_events(); - home_path(target_path); - cascade_delete(ig); - chdir(".."); - rmdir(target_path); - home_path(source_path); - curcolor=0; - for(x=319;x>-1;x-=2) - { - y=x*240/320;bar(x,y,639-x,479-y);showview(0,0,0,0); - } - shutdown(); - exit(0); - } - -static void run_resetup() - { - int id; - - while (waktual!=NULL) close_current(); - do - { - home_path(source_path); - back=0; - select_mode_win_setup(); - about_window(); - id=o_aktual->id; - close_current(); - close_current(); - exit_wait=0; - if (id==30) - { - deinstall(); - back=1; - } - if (id==10) - { - select_vga(); - select_sound(); - control_window(save_ini,back_start,NULL); - } - if (id!=40) escape(); - } - while (back); - } - - -#define REPEAT(i,cnt) for(i=0;i=2 && argv[1][0]=='-' && toupper(argv[1][1])=='S') || access(SKELDAL_INI,F_OK)==0) - { - int i; - char *c; - char *d; - setup_mode=1; - getcwd(target_path,PATH_MAX+1); - setup_ini=read_config(SKELDAL_INI); - if (setup_ini==NULL) - { - printf("The file %s has not been found. You must reinstall the game\n" - "Insert the CD into driver and run INSTALL.EXE\n",SKELDAL_INI); - printf("Nemohu najit soubor %s. Budes muset hru znovu nainstalovat\n" - "Z CD \"Brany Skeldalu\" spust program INSTALL.EXE\n",SKELDAL_INI); - exit(0); - } - get_num_field(setup_ini,VMODE,&vmode); - c=get_text_field(setup_ini,"CESTA_CD"); - program_data_path=NewArr(char,strlen(c)+1);strcpy(program_data_path,c); - c=strchr(program_data_path,0); - if (c>program_data_path && c[-1]=='\n') c[-1]=0,c--; - if (c>program_data_path && c[-1]=='\\') c[-1]=0; - c=get_text_field(setup_ini,SOUND_DEVICE); - sscanf(c,"%d %x %d %d",&sound_info.device, - &sound_info.port, - &sound_info.dma, - &sound_info.irq); - c=alloca(strlen(argv[0])+1); - strcpy(c,argv[0]); - i=subtitles; - get_num_field(setup_ini,"TITLES",&i); - subtitles=i; - d=strrchr(c,'\\'); - if (d!=NULL) - { - d[d-c<=2]=0; - home_path(c); - } - } - } - -main(int argc,char **argv) - { - char s; - char *c; - - pgm_name=argv[0]; - check_setup_mode(argc,argv); - if (argc==2 && !setup_mode) copy_source_path=argv[1];else copy_source_path=NULL; - if (!setup_mode) - { - _setvideomode(_TEXTC80); - rescue_mode=!(s=create_er_file()); - if (s && !setup_mode) warning(),getche(); - } - else - s=0; - init_setup(s); - create_video_ls(); - set_mixing_device(0,22050,0,0,0); - c=test_sound_name=NewArr(char, strlen(program_data_path)+strlen(TEST_MUSIC)+1); - sprintf(c,"%s%s",program_data_path,TEST_MUSIC); - if (access(c,F_OK)!=0) - { - shutdown(); - printf("Vloz CD \"Brany Skeldalu\" do jednotky CD-ROM a spust znova instalaci\n" - "Insert CD \"The Gates of the Skeldal\" into CD-ROM and try to run INSTALL again.\n"); - abort(); - } - konec_skladby=skladba_konec; - change_music(c); - mix_back_sound(2); - if (setup_mode) run_resetup(); - else - { - if (!rescue_mode) run_setup(); - if (rescue_mode) - { - ask_video(); - escape(); - } - } - shutdown(); - } diff --git a/insteng/SETUP.H b/insteng/SETUP.H deleted file mode 100644 index 9d3f7f0..0000000 --- a/insteng/SETUP.H +++ /dev/null @@ -1,18 +0,0 @@ -extern word ikones; -extern word boldcz; -extern word sipka; -extern word font6x9; -extern void *bbutt; -extern word *vga_font; -extern word *icones; -extern word icone_color[]; -extern word ramecek; -extern word *ramecky[]; - -//#define WINCOLOR 0x6318 -#define WINCOLOR (31*1024+31*32+26) -#define LABELCOLOR (11*1024+11*32+06) -#define BUTTONCOLOR (28*1024+24*32+3) - -#define PRG_HEADER "The Gates of Skeldal Setup v1."VERSION -extern FILE *ini; diff --git a/insteng/SETUPCPY.C b/insteng/SETUPCPY.C deleted file mode 100644 index 993be65..0000000 --- a/insteng/SETUPCPY.C +++ /dev/null @@ -1,165 +0,0 @@ -#include -#include -#include -#include -#include "setupcpy.h" - -#define DATASIZE 32768 -#define INFOBLOCK 1 -#define DATABLOCK 2 -#define ERRORBLOCK 3 - -typedef struct tdatablock - { - void *next; - char block_type; - unsigned short load_size; - char data[DATASIZE]; - }TDATABLOCK; - -typedef struct tinfoblock - { - void *next; - char block_type; - char pathname[2]; - }TINFOBLOCK; - -static void *start=NULL; -static void *end=NULL; -static FILE *cpyout=NULL; -static long progress=0; - -void (*cpy_error)(int,char *); -void (*mem_error_next)(long); - -void (*cpy_progress)(long); - - -static void *alloc_file(char *target_name) - { - TINFOBLOCK *p; - - p=(TINFOBLOCK *)getmem(sizeof(TINFOBLOCK)+strlen(target_name)); - strcpy(p->pathname,target_name); - p->next=NULL; - p->block_type=INFOBLOCK; - return p; - } - -static void *alloc_data() - { - TDATABLOCK *p; - - p=New(TDATABLOCK); - p->next=NULL; - p->load_size=0; - p->block_type=DATABLOCK; - return p; - } - - -static void *load_data(FILE *f) - { - TDATABLOCK *p; - int rc; - int retry=0; - void *end_line; - - p=end_line=alloc_data(); - again: - errno=0; - rc=fread(p->data,1,sizeof(p->data),f); - p->load_size=rc; - if (ferror(f) || rc!=sizeof(p->data) && errno!=0) - { - if (retry) retry--; - else cpy_error(CPERR_READ,NULL); - fseek(f,-rc,SEEK_CUR); - errno=0; - goto again; - } - progress+=p->load_size; - cpy_progress(progress); - return end_line; - } - -static error_mem(long size) - { - TDATABLOCK *p; - TINFOBLOCK *q; - int rc; - - size; - if (start==NULL) mem_error_next(size); - while (start!=NULL) - { - p=start; - q=start; - if (q->block_type==INFOBLOCK) - { - if (cpyout!=NULL) fclose(cpyout); - again: - cpyout=fopen(q->pathname,"wb"); - if (cpyout==NULL) - { - cpy_error(CPERR_OPEN,q->pathname); - goto again; - } - start=q->next; - free(q); - } - else if (p->block_type==DATABLOCK) - { - again2: - rc=fwrite(p->data,1,p->load_size,cpyout); - if (rc!=p->load_size) - { - cpy_error(CPERR_WRITE,q->pathname); - fseek(cpyout,-rc,SEEK_CUR); - goto again2; - } - progress+=p->load_size; - cpy_progress(progress); - start=p->next; - free(p); - } - } - end=NULL; - } - -void cpy_file(char *source,char *target) - { - FILE *f; - TDATABLOCK *p; - TINFOBLOCK *q; - - again: - errno=0; - f=fopen(source,"rb"); - if (f==NULL) - { - cpy_error(CPERR_OPEN,source); - goto again; - } - q=alloc_file(target); - if (start==NULL) start=end=q;else end=(((TDATABLOCK *)end)->next=q); - while (!feof(f)) - { - p=load_data(f); - if (start==NULL) start=end=p;else end=(((TDATABLOCK *)end)->next=p); - } - fclose(f); - } - -void cpy_flush() - { - if (start!=NULL)error_mem(0); - if (cpyout!=NULL)fclose(cpyout); - cpyout=NULL; - } - -void install_cpy() - { - mem_error_next=mem_error; - mem_error=error_mem; - } diff --git a/insteng/SETUPCPY.H b/insteng/SETUPCPY.H deleted file mode 100644 index e46a382..0000000 --- a/insteng/SETUPCPY.H +++ /dev/null @@ -1,9 +0,0 @@ -#define CPERR_OPEN 1 -#define CPERR_WRITE 2 -#define CPERR_READ 3 - -extern void (*cpy_error)(int,char *); -extern void (*cpy_progress)(long); -void cpy_file(char *source,char *target); -void cpy_flush(); -void install_cpy(); diff --git a/insteng/SETUPLIB.C b/insteng/SETUPLIB.C deleted file mode 100644 index d53d4f6..0000000 --- a/insteng/SETUPLIB.C +++ /dev/null @@ -1,505 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "setuplib.h" -#include "setupcpy.h" -#include "setup.h" - -#define COPY "COPY" -#define MKDIR "MKDIR" -#define INI "INI" - -#define DIR_NAMES 6 -char *dirnames[]= - { - "GAMES.*", - "GAME*.*", - "HRY.*", - "ZABAVA.*", - "SKELDAL", - "NAPOLEON", - }; - -TSTR_LIST file_list=NULL; - -static void done_bar_init(OBJREC *o,long *params) - { - o->userptr=New(long); - *(long *)o->userptr=*params; - } - -static void done_bar_draw(int x1,int y1,int x2,int y2,OBJREC *o) - { - long value,max,x3; - - value=*(long *)o->data; - max=*(long *)o->userptr; - x3=x1+(x2-x1)*value/max; - if (x3<=x1) x3=x1; - if (x3>=x2) x3=x2; - bar(x3,y1,x2,y2); - curcolor=o->f_color[1]; - bar(x1,y1,x3,y2); - } - -void done_bar(OBJREC *o) //define(...done_bar,max); - { - o->call_init=done_bar_init; - o->call_draw=done_bar_draw; - o->datasize=4; - } - - - -char select_disk() - { - char last=3; - struct diskfree_t ds; - int max=0,i; - long now; - - for(i=('C'-'@');i<('Z'-'@');i++) - { - if (_dos_getdiskfree(i,&ds)==0) - { - now=ds.avail_clusters*ds.sectors_per_cluster*ds.bytes_per_sector; - if (now>max) - { - max=now; - last=i; - } - } - } - return last; - } - -char dir_finder() - { - struct find_t ft; - int i; - int rc; - - for(i=0;imax && sz[j]datasize=(*len)+1; - } - -static void view_line_draw(int x1,int y1, int x2, int y2, OBJREC *o) - { - char *c; - - bar(x1,y1,x2,y2); - c=(char *)o->data; - if (!*c) return; - set_aligned_position(x2,y1,2,0,c); - outtext(c); - } - - -void view_line(OBJREC *o) - { - o->call_init=view_line_init; - o->call_draw=view_line_draw; - } - - -char get_max_res() - { - if (vesasupport(0x110)) return 2; - if (vesasupport(0x100)) return 1; - return 0; - } - -void add_to_list(char *name) - { - if (file_list==NULL) file_list=create_list(256); - str_add(&file_list,name); - } - -static void copy_1_file(char *init_mask,char *filename,char *target) - { - char *c,*d; - - c=alloca(strlen(init_mask)+strlen(filename)+1); - strcpy(c,init_mask); - d=strrchr(c,'\\'); - d++; - strcpy(d,filename); - d=alloca(strlen(target)+strlen(filename)+10); - strcpy(d,target); - if (d[0]==0 || d[strlen(d)-1]!='\\') strcat(d,"\\"); - strcat(d,filename); - set_value(0,20,filename); - add_to_list(d); - cpy_file(c,d); - } - -static void copy_files(char *param) - { - struct find_t ft; - char *source_mask; - char *target; - int rc; - - target=strchr(param,' '); - if (target==NULL) return; - source_mask=alloca(target-param); - source_mask[target-param]=0; - strncpy(source_mask,param,target-param); - target++; - rc=_dos_findfirst(source_mask,_A_NORMAL,&ft); - while (rc==0) - { - copy_1_file(source_mask,ft.name,target); - rc=_dos_findnext(&ft); - } - _dos_findclose(&ft); - } - -char cascade_mkdir(char *path) - { - char *c; - char d; - - if (path[0]==0||path[1]==':' && path[2]==0) return 0; - if (!access(path,F_OK)) return 0; - c=strrchr(path,'\\'); - if (c==NULL) return 0; - *c=0; - d=cascade_mkdir(path); - *c='\\'; - if (d==1) return 1; - if (mkdir(path)!=0) return 1; - add_to_list(path); - return 0; - } - - -static char add_to_ini(char *params) - { - return fprintf(ini,"%s\n",params)<0; - } - -static char *commands[]= - { - COPY, - MKDIR, - INI, - }; - -static char (*calls[])(char *params)= - { - copy_files, - cascade_mkdir, - add_to_ini, - }; - - - -static char command_match(char *cmd,char *test,char **params) - { - while (*test) if (toupper(*cmd++)!=toupper(*test++)) return 0; - if (*cmd!=' ') return 0; - *params=cmd+1; - return 1; - } - - -char do_script(int section) - { - int pos; - int num; - int str_siz=str_count(script); - char *command; - - for(pos=0;pos"); - } - return s; - } - -char validate_path(char *path) - { - unsigned disk; - unsigned cdisk,lastdrv; - char *c,ll=0,tt=0,d; - - static char valid[]="$%'_@{}~`#()&-"; - - if (path==NULL || path[0]==0 || path[1]!=':' || path[2]!='\\') return 0; - disk=toupper(path[0]); - if (disk<'A' || disk>'Z') return 0; - _dos_getdrive(&cdisk); - disk-='@';_dos_setdrive(disk,&lastdrv); - _dos_getdrive(&lastdrv); - disk=(disk==lastdrv); - _dos_setdrive(cdisk,&lastdrv); - if (!disk) return 0; - c=path+2;ll=0; - while (*c) - { - d=toupper(*c); - if (d=='\\') - if (ll) return 0;else ll=1,tt=0; - else - if (d>='A' && d<='Z' || d>='0' && d<='9' || strchr(valid,d)!=NULL || d>127) ll=0; - else if (d=='.') if (tt) return 0;else tt=1; - else return 0; - c++; - } - if (ll) return 0; - return 1; - } - -void clean_up() - { - int i,cnt; - if (file_list==NULL) return; - cnt=str_count(file_list); - for(i=cnt-1;i>=0;i--) if (file_list[i]!=NULL) - { - if (remove(file_list[i])) rmdir(file_list[i]); - } - release_list(file_list); - file_list=NULL; - } - -void purge_file_list() - { - if (file_list==NULL) return; - release_list(file_list); - file_list=NULL; - } - -char cascade_delete(char ignore_sav) - { - struct find_t f; - int rc; - - rc=_dos_findfirst("*.*",_A_SUBDIR,&f); - while (rc==0) - { - if (f.attrib & _A_SUBDIR) - { - if (f.name[0]!='.') - { - chdir(f.name); - cascade_delete(ignore_sav); - chdir(".."); - rmdir(f.name); - } - } - else - { - char *c=strchr(f.name,'.'); - - if (c!=NULL) - { - strupper(c); - if (!ignore_sav || strncmp(c,".SAV",4)) remove(f.name); - } - else remove(f.name); - } - rc=_dos_findnext(&f); - } - return 0; - } diff --git a/insteng/SETUPLIB.H b/insteng/SETUPLIB.H deleted file mode 100644 index 7928d30..0000000 --- a/insteng/SETUPLIB.H +++ /dev/null @@ -1,22 +0,0 @@ -char all_finder(); -char select_disk(); -char read_script(char *filename,char *source_path,char *target_path); -long check_size(int gr); -long get_disk_free(char disk); -void view_line(OBJREC *o); -char *get_cdrom(); -char get_max_res(); -char do_script(int); -void done_bar(); //define(...done_bar,max); -char cascade_mkdir(char *path); -char validate_path(char *path); -char cascade_delete(char ignore_sav); //maze soubory a podadresare. Pripadne ignoruje soubory SAV - -void clean_up(); //maze zkopirovane soubory a adresare -void purge_file_list(); -void add_to_list(char *name); - - -#define INST_MIN 0 -#define INST_MED 1 -#define INST_MAX 2 diff --git a/insteng/SETVIDEO.C b/insteng/SETVIDEO.C deleted file mode 100644 index f04bf9c..0000000 --- a/insteng/SETVIDEO.C +++ /dev/null @@ -1,210 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "setup.h" - -static void *xlat256=NULL; -static void *xlat16=NULL; -static void *xlat64=NULL; - -static void create_xlats() - { - if (xlat256==NULL) xlat256=create_special_palette(); - if (xlat16==NULL) xlat16=create_blw_palette16(); - if (xlat64==NULL) xlat64=create_hixlat(); - } - - -static void initgr_common() - { - register_ms_cursor(&sipka); - if (init_mysky()!=0) - { - closemode(); - puts("Neni mys!\nMouse not found!"); - exit(0); - } -// hranice_mysky(0,0,639,479); - update_mysky(); - schovej_mysku(); - bar(0,0,639,479); - showview(0,0,0,0); - } - -int initgr_auto() - { - int vmode; - create_xlats(); - vmode=2; - if (initmode32()) - { - vmode=5; - if (initmode64(xlat64)) - { - vmode=1; - if (initmode256(xlat256)) - { - vmode=0; - initmode16(xlat16); - } - } - } - initgr_common(); - return vmode; - } - -int initgr_spec(int vmode) - { - int i=-1; - create_xlats(); - switch (vmode) - { - case 0:i=initmode_lo(xlat256);break; - case 1:i=initmode256(xlat256);break; - case 2:i=initmode32();break; - case 5:i=initmode64(xlat64);break; - } - if (!i) initgr_common(); - return i; - } - -void initgr_low() - { - create_xlats(); - initmode16(xlat16); - initgr_common(); - } - -void donegr() - { - closemode(); - done_mysky(); - } - -void kresli_okno(WINDOW *w) - { - int x,y; - int xs,ys,xsr,ysr; - int x1,y1,xs1,ys1; - int i,j; - - xsr=ramecky[0][0]; - ysr=ramecky[0][1]; - x1=w->x-12; - y1=w->y-12; - xs1=w->xs+24; - ys1=w->ys+24; - xs=xs1/xsr; - ys=ys1/ysr; - curcolor=w->color; - bar(w->x,w->y,w->x+w->xs,w->y+w->ys); - for(j=0,y=y1;jx; - y=waktual->y; - } - name; - highlight(&ctl,WINCOLOR); - ctl.bsize=2;ctl.ctldef=0; - x+=20;y+=20; - memcpy(fc,flat_color(0x7fe0),sizeof(FC_TABLE)); - fc[0]=0x0000; - if (x+xs>MAX_X-2) x=MAX_X-2-xs; - if (y+ys>MAX_Y-2) y=MAX_Y-2-ys; - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - q=desktop_add_window(p); - define(0,2,2,xs-5-20*(xs>=70),14,0,win_label,name); - ctl.bsize=1;ctl.ctldef=1; - o_end->autoresizex=1; - property(&ctl,vga_font,&fc,LABELCOLOR); - if (xs>=70) - { - define(1,1,1,19,16,1,button,"\x0f"); - property(NULL,icones,&icone_color,WINCOLOR);on_control_change(close_current); - } - return q; - } - -int def_dialoge(word x,word y,word xs, word ys, char *name,char modal) - { - CTL3D ctl; - FC_TABLE fc; - WINDOW *p; - int i; - - memcpy(fc,flat_color(0x7fe0),sizeof(FC_TABLE)); - if (modal & 0x2) - { - ctl.bsize=12; - xs=((xs+6)/12)*12; - ys=((ys+6)/12)*12; - } - else - memcpy(&ctl,def_border(2,WINCOLOR),sizeof(CTL3D)); - p=create_window(x,y,xs,ys,WINCOLOR,&ctl); - i=desktop_add_window(p); - if (modal & 1) set_window_modal(); - memcpy(&ctl,def_border(5,WINCOLOR),sizeof(CTL3D)); - if (name!=NULL) - { - define(0,2,2,xs-4,14,0,win_label,name); - o_end->autoresizex=1; - property(&ctl,vga_font,&fc,LABELCOLOR); - } - if (modal & 0x2) p->draw_event=kresli_okno; - return i; - } - -void def_listbox(int id,word x,word y,word xs,word ys,TSTR_LIST ls,int ofs,int color) - { - CTL3D b1,b2; - word black[]={0,0,0,0,0,0}; - - memcpy(&b1,def_border(1,0),sizeof(CTL3D)); - memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D)); - define(id+1,x+xs+4,y+18,15,ys-35,0,scroll_bar_v,0,10,1,0x0200); - property(&b2,NULL,NULL,WINCOLOR); - define(id+2,x+xs+4,y,14,14,0,scroll_button,-1,0,"\x4"); - property(&b1,icones,black,WINCOLOR);on_control_change(scroll_support); - define(id+3,x+xs+4,y+ys-14,14,14,0,scroll_button,1,10,"\6"); - property(&b1,icones,black,WINCOLOR);on_control_change(scroll_support); - define(id,x,y,xs,ys,0,listbox,ls,color,ofs); - property(&b2,NULL,NULL,WINCOLOR); - } - diff --git a/insteng/SETVIDEO.H b/insteng/SETVIDEO.H deleted file mode 100644 index dce03e5..0000000 --- a/insteng/SETVIDEO.H +++ /dev/null @@ -1,6 +0,0 @@ -int initgr_auto(); -void initgr_low(); -int initgr_spec(int vmode); -void donegr(); -int def_dialoge(word x,word y,word xs, word ys, char *name,char modal); -void def_listbox(int id,word x,word y,word xs,word ys,TSTR_LIST ls,int ofs,int color); diff --git a/insteng/STUB.C b/insteng/STUB.C deleted file mode 100644 index c059d9b..0000000 --- a/insteng/STUB.C +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include -#include -#include -#include -#define QUIET x - -/* Add environment strings to be searched here */ -char *paths_to_check[] = { - "DOS4GPATH", - "PATH"}; - -char *dos4g_path() -{ - static char fullpath[80]; - int i; - - for( i = 0; - i < sizeof( paths_to_check ) / sizeof( paths_to_check[0] ); i++ ) { - _searchenv( "dos4gw.exe", paths_to_check[i], fullpath ); - if( fullpath[0] ) return( &fullpath ); - } - for( i = 0; - i < sizeof( paths_to_check ) / sizeof( paths_to_check[0] ); i++ ) { - _searchenv( "dos4g.exe", paths_to_check[i], fullpath ); - if( fullpath[0] ) return( &fullpath ); - } - return( "dos4gw.exe" ); -} - -main( int argc, char *argv[] ) -{ - char *av[4]; - auto char cmdline[128]; - int i; - av[0] = dos4g_path(); /* Locate the DOS/4G loader */ - av[1] = argv[0]; /* name of executable to run */ - av[2] = getcmd( cmdline ); /* command line */ - av[3] = NULL; /* end of list */ -#ifdef QUIET - putenv( "DOS4G=QUIET" ); /* disables DOS/4G Copyright banner */ -#endif - printf("Instalator Brny Skeldalu (C)1997 Napoleon gameS Nahrvm... \n"); - i=spawnvp(P_WAIT, av[0], av ); - if (i==254) - execl(av[0],av[0],"SKELDAL.EXE",NULL);else exit(0); - puts( "Chyba pri nacitani extenderu:" ); - puts( av[0] ); - puts( "\nZkontrolujte zda-li je k dosazeni na aktualnim adresari\n" - "popripade specifikujte jeho v cestu v systemove promenne:\n" - "SET DOS4GPATH=disk:\\cesta\n"); - exit( 1 ); /* indicate error */ -} diff --git a/insteng/TEXTLIB.ASM b/insteng/TEXTLIB.ASM deleted file mode 100644 index 3ec6511..0000000 --- a/insteng/TEXTLIB.ASM +++ /dev/null @@ -1,101 +0,0 @@ -.model small -.386 - -SEGB800 equ 0b8000h - -_TEXT segment byte public 'CODE' use32 - assume CS:_TEXT - assume DS:DGROUP - -public load_font_ -load_font_: ;esi font - mov esi,offset fonttable - mov edx,3c4h - mov eax,0402h - out dx,ax - mov eax,0704h - out dx,ax - Mov edx,3ceh - mov eax,0204h - out dx,ax - mov eax,0005h - out dx,ax - mov eax,0406h - out dx,ax - mov edi,0xA0000h - mov edx,256 -lfOpk: mov ecx,16 - rep movsb - add edi,16 - dec edx - jne lfopk - mov edx,3c4h - mov eax,0302h - out dx,ax - mov eax,0304h - out dx,ax - Mov edx,3ceh - mov eax,0004h - out dx,ax - mov eax,1005h - out dx,ax - mov eax,0E06h - out dx,ax - ret - -public set_font_8x8_ -set_font_8x8_: - cli - mov edx,3d4h - mov eax,0100h - out dx,ax - mov edx,3c4h - mov al,1 - out dx,al - inc edx - in al,dx - or al,1 - out dx,al - mov edx,03dah - in al,dx - mov edx,03c0h - mov al,13h - out dx,al - mov al,0 - out dx,ax - mov al,32 - out dx,al - mov edx,3d4h - mov eax,0300h - out dx,ax - sti - ret - -public turn_flashing_ ;ebx - ON/OFF -turn_flashing_: - mov eax,1003h - int 10h - ret - - -public get_window_size_ ;eax,edx-velikost -get_window_size_: - imul eax,edx - shl eax,1 - add eax,4 - ret - -public save_window_ ;eax,edx-pozice - ;ecx,ebx-velikost - ;edi - buffer -save_window_ - stosb - imul eax,160 - lea eax,[eax+edx*2] - lea esi,[eax+SEGB800] - mov al,dl - stosb - mov al,bl - mov ah,cl - stosw - mov edx,ebx diff --git a/insteng/TEXTLIB.C b/insteng/TEXTLIB.C deleted file mode 100644 index fd40910..0000000 --- a/insteng/TEXTLIB.C +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/libs/basicobj.c b/libs/basicobj.c index 26697b8..a9894be 100644 --- a/libs/basicobj.c +++ b/libs/basicobj.c @@ -243,7 +243,7 @@ void draw_status_line(char *c) void status_mem_info(EVENT_MSG *msg) { - + } void status_idle(EVENT_MSG *msg) @@ -530,6 +530,7 @@ void radio_butts_init(OBJREC *o,va_list params) q=(int32_t *)getmem(cnt+8); o->userptr=(void *)q; *q++=1;*q++=rcount; + z = (char *)q; va_copy(d, params); va_arg(d, int); for (i=0;i(input); - auto in_end = std::istream_iterator(); + auto in_iter = std::istreambuf_iterator(input); + auto in_end = std::istreambuf_iterator(); auto out_iter = std::ostream_iterator(std::cout); base64.encode(in_iter, in_end, out_iter); return 0; -} \ No newline at end of file +} diff --git a/libs/gui.c b/libs/gui.c index 552d88e..a390500 100644 --- a/libs/gui.c +++ b/libs/gui.c @@ -247,7 +247,7 @@ void absolute_window(WINDOW *w,OBJREC *o, int *x, int *y) void draw_object(WINDOW *w,OBJREC *o,char show) { - int x, y; + int x = 0, y = 0; int ok; // WINDOW *ws; @@ -533,7 +533,7 @@ void close_window(WINDOW *w) char mouse_in_object(MS_EVENT *ms,OBJREC *o, WINDOW *w) { - int x1, y1, x2, y2; + int x1=0, y1=0, x2=0, y2=0; absolute_window(w,o,&x1,&y1); x2=x1+o->xs; @@ -936,7 +936,7 @@ void background_runner(EVENT_MSG *msg,void **prog) { *prog_ptr=NULL; return; - } + } (*prog_ptr)(); msg->msg=-2; diff --git a/libs/inicfg.c b/libs/inicfg.c index eec88f4..21340c7 100644 --- a/libs/inicfg.c +++ b/libs/inicfg.c @@ -43,7 +43,7 @@ TSTR_LIST merge_configs(TSTR_LIST target, TSTR_LIST source) buff[255]=0; for (i=0;iseekpos=i; return h; } - strncpy(h->src_file,filename,sizeof(h->src_file)); + strcopy_n(h->src_file,filename,sizeof(h->src_file)); h->seekpos=0; strupper(h->src_file); h->loadproc=decompress; @@ -666,7 +666,7 @@ void display_status() int k; for(k=0;k<5;k++) copys[k]=h->flags & (1<src_file[0]) strncpy(nname,h->src_file,12);else strcpy(nname,""); + if (h->src_file[0]) strcopy_n(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,(unsigned long)(uintptr_t)h->blockdata,h->size,h->counter,h->lockcount); diff --git a/libs/pady.c b/libs/pady.c index ea601e6..9128559 100644 --- a/libs/pady.c +++ b/libs/pady.c @@ -58,36 +58,36 @@ typedef struct vzor TVZOR zena= { "hkrdtnbflmpsvz", - "aouy", + "a�o�u��y�", 1, - "-","y","","u","o","","ou" + "-","y","�","u","o","�","ou" }; //Vzor pro zena TVZOR natasa= { - "cj", - "a", + "c��j�����", + "a�", 1, - "-","i","","u","o","","ou" + "-","i","�","u","o","�","ou" }; //Vzor pro zena koncici mekkou souhlaskou a a TVZOR ruze= { - "cj", - "eiou", + "c��j�����", + "e�i�o�u��", 1, - "-","e","i","i","e","i","" + "-","e","i","i","e","i","�" }; //Vzor pro ruze s mekkou koncovkou TVZOR ruze2= { "dtn", - "i", + "i��", 1, - "-","e","i","i","e","i","" + "-","e","i","i","e","i","�" }; //Vzor pro ruze s tvrdou koncovkou d,t,n s mekkou samohlaskou @@ -95,9 +95,9 @@ TVZOR ruze2= TVZOR pisen= { "*", - "cjflmsx", + "c��j�����flmsx", 0, - "-","e","i","-","i","i","" + "-","e","i","-","i","i","�" }; //vzor pisen @@ -106,7 +106,7 @@ TVZOR kost= "*", "hkrdtnbpvz", 0, - "-","i","i","-","i","i","" + "-","i","i","-","i","i","�" }; //vzor kost @@ -142,17 +142,17 @@ TVZOR quasimodo= TVZOR pritel= { - "e", - "cjbflmpsvz", + "e�", + "c��j�����bflmpsvz", 0, "-","e","i","e","i","i","em" }; -//vzor pritel pro vzor muz pro obojetne souhlasky ze samohlaskou e, +//vzor pritel pro vzor muz pro obojetne souhlasky ze samohlaskou e, � TVZOR muz= { "*", - "cj", + "c��j�����", 0, "-","e","i","e","i","i","em" }; @@ -172,7 +172,7 @@ TVZOR fenix= TVZOR predseda= { "hkrdtnbpvz", - "aouy", + "a�o�u��y�", 1, "a","y","ovi","u","o","ovi","ou" }; @@ -181,8 +181,8 @@ TVZOR predseda= TVZOR soudce= { - "cjflmsx", - "eiou", + "c��j�����flmsx", + "e�i�o�u��", 1, "e","e","i","e","e","i","em" }; @@ -192,7 +192,7 @@ TVZOR soudce= TVZOR soudce2= { "dtn", - "i", + "�i�", 1, "e","e","i","e","e","i","em" }; @@ -213,17 +213,17 @@ char test_vzor(TVZOR *vz,char *jmeno) return 1; } -//tato funkce se vola ped odejmutm uritho znaku. -//Pokud to toti je zmkovac samohlska, mus se ppadn d,t,n -//zmkit ped touto samohlskou. +//tato funkce se vola p�ed odejmut�m ur�it�ho znaku. +//Pokud to toti� je zm�k�ovac� samohl�ska, mus� se p��padn� d,t,n +//zm�k�it p�ed touto samohl�skou. void odejmi_znak(char *znak) { - if (znak[0]=='' || znak[0]=='' || znak[0]=='i') + if (znak[0]=='�' || znak[0]=='�' || znak[0]=='i') switch (znak[-1]) { - case 'd': znak[-1]='';break; - case 't': znak[-1]='';break; - case 'n': znak[-1]='';break; + case 'd': znak[-1]='�';break; + case 't': znak[-1]='�';break; + case 'n': znak[-1]='�';break; } } @@ -233,13 +233,13 @@ void odejmi_znak(char *znak) //Zdenek => Zdenka void uprav_e_nakonci(char *konec) { - char samohlasky[]="aeiouy"; - char pismena[]="flmnrsxpv"; + char samohlasky[]="a�e�i�o�u�y�"; + char pismena[]="flmn�r�s�xpv"; char *c; c=konec-2; if (strchr(samohlasky,c[2])!=NULL && strchr(samohlasky,c[1])==NULL && strchr(pismena,c[-1])!=NULL) - if (c[0] =='e'|| c[0]==''|| c[0] =='') + if (c[0] =='e'|| c[0]=='�'|| c[0] =='�') { odejmi_znak(c); strcpy(c,c+1); @@ -257,7 +257,7 @@ void ziskej_pad(char *buffer,char *jmeno,TVZOR *vz,char pad) end=strchr(buffer,0)-vz->chrdel; odejmi_znak(end); //odejme znak, pokud je => znak 0 neni znak cesky. strcpy(end,vz->pady[pad]); - if (pad && !vz->chrdel && end[-2]=='') end[-2]='o'; + if (pad && !vz->chrdel && end[-2]=='�') end[-2]='o'; uprav_e_nakonci(end); return; } @@ -269,23 +269,23 @@ void uprav_dvojice(char *jmeno) { static char *dvojice[]= { - "e","d", - "e","t", - "e","n", - "i","di", - "i","ti", - "i","ni", - "","d", - "","t", - "","n", - "r","e", - "s","e", - "c","e", - "k","ce", - "","e", - "","e", - "","e", - "","e", + "�e","d�", + "�e","t�", + "�e","n�", + "�i","di", + "�i","ti", + "�i","ni", + "��","d�", + "��","t�", + "��","n�", + "r�","�e", + "s�","�e", + "c�","�e", + "k�","ce", + "��","�e", + "��","�e", + "��","�e", + "��","�e", }; while (*jmeno) @@ -295,7 +295,7 @@ void uprav_dvojice(char *jmeno) { if (!strncmp(jmeno,dvojice[i],2)) { - strncpy(jmeno,dvojice[i+1],2); + strcopy_n(jmeno,dvojice[i+1],2); break; } } @@ -309,8 +309,8 @@ char *jmena_padu[]= "kdo", "bez", "k", - "vidm", - "volm", + "vid�m", + "vol�m", "o", "s" }; @@ -322,7 +322,7 @@ void show_table(char *jmeno,TVZOR *vz,char tabnum) char *buff; buff=alloca(strlen(jmeno)+20); - printf("%d. monost\n\n",tabnum); + printf("%d. mo�nost\n\n",tabnum); for(i=0;i<7;i++) { if (i) @@ -334,15 +334,15 @@ void show_table(char *jmeno,TVZOR *vz,char tabnum) uprav_dvojice(buff); printf(" %d. %-6s %s\n",i+1,jmena_padu[i],buff); } - printf("**** Klvesu ****\n"); + printf("**** Kl�vesu ****\n"); getche(); } //Tato funkce vypise celkovy vysledek. void notabs(int i) { - if (i) printf("Program nael %d momost%s.\n",i,(i!=1?(i>1 && i<5?"i":""):"")); - else printf("Program bohuel nenael dnou monost jak skloovat toto jmno.\n"); + if (i) printf("Program na�el %d mo�most%s.\n",i,(i!=1?(i>1 && i<5?"i":"�"):"")); + else printf("Program bohu�el nena�el ��dnou mo�nost jak sklo�ovat toto jm�no.\n"); puts("-------------------------------------------------------------------------"); } @@ -384,20 +384,20 @@ void hlavni() char pohlavi; do { - printf("Zadej jmno. Vyaduje se min 3 znaky v etin kodu kamenickch \n"); - printf("Jmno nesm mt vc ne 50 znak, a nesm obsahovat mezery:\n"); - printf("Pi malmi psmeny, pouze prvn pismeno me bt velk:\n"); - printf("(pouh 'x' je odchod z programu)\n"); + printf("Zadej jm�no. Vy�aduje se min 3 znaky v �e�tin� kodu kamenick�ch \n"); + printf("Jm�no nesm� m�t v�c ne� 50 znak�, a nesm� obsahovat mezery:\n"); + printf("Pi� mal�mi p�smeny, pouze prvn� pismeno m��e b�t velk�:\n"); + printf("(pouh� 'x' je odchod z programu)\n"); jmeno_chyba: gets(jmeno); if (jmeno[0]=='x' && jmeno[1]==0) return; if (strlen(jmeno)<3) { - printf("Jmno mus bt min 3 znaky dlouh\n"); + printf("Jm�no mus� b�t min 3 znaky dlouh�\n"); goto jmeno_chyba; } chyba: - printf("Jsi mu nebo ena? (M/Z nebo M/F nebo X):"); + printf("Jsi mu� nebo �ena? (M/Z nebo M/F nebo X):"); pohlavi=getchar(); while (getchar()!='\n'); puts(""); @@ -414,11 +414,11 @@ main() { hlavni(); puts(""); - puts("Pokud jsi objevil pirozen jmno (tj reln jmno), kter program\n" - "nedokzal vyskloovat, poli mi jeho znn na adresu:\n" + puts("Pokud jsi objevil p�irozen� jm�no (tj re�ln� jm�no), kter� program\n" + "nedok�zal vysklo�ovat, po�li mi jeho zn�n� na adresu:\n" "xnovako1@cs.felk.cvut.cz\n"); - puts("Verze Latin2 se pipravuje...\n" - "O slovensk verzi se zatm neuvauje...\n"); - puts("Napsal: Ondej Novk za 2 a pl hodiny ve WATCOM C\n" - "Zdrojky maj povahu PUBLIC DOMAIN\n"); + puts("Verze Latin2 se p�ipravuje...\n" + "O slovensk� verzi se zat�m neuva�uje...\n"); + puts("Napsal: Ond�ej Nov�k za 2 a p�l hodiny ve WATCOM C\n" + "Zdroj�ky maj� povahu PUBLIC DOMAIN\n"); } diff --git a/libs/pcx.c b/libs/pcx.c index 69637c5..531765a 100644 --- a/libs/pcx.c +++ b/libs/pcx.c @@ -179,7 +179,7 @@ int load_pcx(const char *pcx,int32_t fsize,int conv_type,char **buffer, ... ) return sz; } - +/* int open_pcx(const char *filename,int type,char **buffer,...) { FILE *pcx; @@ -193,12 +193,15 @@ int open_pcx(const char *filename,int type,char **buffer,...) fseek(pcx,0,SEEK_SET); src=(char *)getmem(fsize); fread(src,1,fsize,pcx); + va_list lst; + va_start(lst, buffer); + int fsize=load_pcx(src,fsize,type,buffer,*((int *)&buffer+1),*((int *)&buffer+2),*((int *)&buffer+3)); fclose(pcx); free(src); return fsize; } - +*/ /*void initmode32b(); main() diff --git a/mapedit/CDialogy/CDialogy.vcproj b/mapedit/CDialogy/CDialogy.vcproj deleted file mode 100644 index f3ed9a4..0000000 --- a/mapedit/CDialogy/CDialogy.vcproj +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mapedit/CDialogy/Debug/BuildLog.htm b/mapedit/CDialogy/Debug/BuildLog.htm deleted file mode 100644 index e3892c5be28c691381f962eb315158bdafa940ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30474 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 diff --git a/mapedit/CDialogy/Debug/CDialogy.exe b/mapedit/CDialogy/Debug/CDialogy.exe deleted file mode 100644 index 8143bd959d2332f76415c68ff9da73399dd3c4a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532480 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

o0D5fE_u{sX(A{vhc*cD+iN*yi|10E|Yl6IzY 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 z zs;@<(f_J%UB)nTGeymFIV^y~BW9elb?Z>KU>Bn+p_f!h&SN;I&xA0@pPb9osF1(vx zj)RldM+dCi_50gMnwTAhB} z=zFX^ba!V(4V}<;IVQf5q0^8!I}y=;V&jSai_rH|8vC|ezFqq6B0~Oug}%?Qku>k* zC?pAeuLYY&kfb3sl7znB6^4(}O+Sym?>|)}$iC?NR#?OTlln~S4;aX}7EeBU;g(I+ z?!bJoKbQN(r)+)Zg6m;$IP)_XZd~QU6GZsLmq=;QRU4~ct#xc@d~et8jW~jjE&MBD zut#!fiSKM3;r{}6Rp8q|5A=5Ygkqj=+PnAKxQal1(~wR0Jl7*eOw1CW3XN(+&cRD- ze7zsRcNh&{7yRJD?%41vMWdQnOXkMSMWgmcLf=P1jaI02MOBxV(ir-oWe| zv^w4ZbzBntwVL&$D1ykIM|{);yc{Sjb=bnAZG?3=F=|i%(_amNM2QTFhSUfXd2^Yz zo^hmE+rpS*4C5&)HTwh$1C`tXPB%U`-yz}eqO)PLRS~1|8JLlJJ`b!$t?~hQm`t&0 zD#L7Pd6K;iiv917((7maQ@f3qzDXY|G;vn$5-cAp!n+*s`nP3Z03y-8$e+KL2-;gkR7du{1f zU#^byhdWhH3T@u_QOd+lm7#=}C^zxJoZUnI7FQp)C-7wxMd)iowgfi0mh7Yy^>^zd z!t_o4#Q5DyJ_eU8_LokbcK(o(&7skaCvWzh2r2u;$shTSfu#Lpqe?+k8ltKY)d5jE z!naMGrrSIkAKXFHM}Mz>8u=5Ai=Xn=KK}IVs2iHx{_G^OzJmSJ*blZ#Ci6>%T5Q?a zhWxa?={4A#Oko|Xb`OdY2O>XvgW)6MKtq}%0It93b)IFALq6mf(^PBIB;rt`tf>P>AoW3OTfHg%E;v5Dng90Ij1 zgIDeB zzj_Dk66uA8)KxIEN{UqREo>3?L2e273@`9h;HDyKR`rBdv=Nh}CYVzm$}f*LNy>38 zug&>X{$i4pib+x`CP`@vlVrUZ4BEf8zNJax$evRwCP`@vljIp@e@2@m&$Kp4)`4Ng zBw2^PV7+8r&;taPI82hWY_!eoAB8r+^jB*j0U~JAkQ!}blDs`ka#%+R>0U`*dN-@V zX{1kaiXt(2>Ge`8&W~xczedb{+!mzGep~~Ett6J&{}_+sX|umZoBh~&S~Qqd!0dl4 zl>Zp^nbT>4oywl7ERWj{;;u&dM)=q;HpEn|$gfp+ zBwPZsC6*^Wz`BwBO&r!!#CE0SQ~m#ee<6bEbN2xTAgzsq1HE6(6ZTJWghv8$@SD_RBeso!lVo zg7vDFj%WI+KGh=NKjw(i`b%^IX487B7*C}7yQo*dw0Z>SzkHlXw04hufh}0UGZTq# z9y7(ZF)y$M?u+BDJnT*8aYCqnd`vq-^NilJ)n_rHu}5C&!ER0N6Z0m9@s%i6jO%%P zJ?$#oxT;C^dG#?|XiWk@%0{Idkn7DJVHE$WNN}79sOZZE;7m;uxBBnK7wBVt5u3rL z_cg8Py}k3&j)`^)dLLvC94+)dSQ;By-vGU5s%bz}gx)oznE`N3@2h1dA_mq-@o|n9 z?HHjqF0XCZsBTSX^om@k#p5qdXM!K>2X3R+mV05U-Rlv@L~)sL`DNgvNUt@dxrV(K z_riVBXmKx|CnJwZKdnKpdb^*{o8Fd7*Ki>|bKU@(l7v?fgSoAz4qHKw7NP(~xFS?2 z`xiU2Ae;f>o=7(&1J00hw|h+{4A70WUn53tduRwHWa4@qTCfeGx8r=j3FXv@X06kj zHRO^{(W0IF<>-Gk&abW|e^_76yz7`BhP06J7 z-4N$>Vdv=&wqM^gSrE%bo4P!;u#ccG%TwdW?JcO&jl)#I9MyIwad=pviym|lOS|kM zKm7saULSr}w-~d$4Di1rVLk_nhtcbD)xo+p9N3lXfMzYhK3R;_)jjPIph&O~B{Bgr zULfRx58Rm~N5<;JbgI*)Qz%isJ)HdFgcuhuRRh-R1?xaXO(y$7doAwgoly8u>hl)| z*76(5%=tZqxted3_W^^h5;9X zy`;(E-pCxd1|Rq8iVdu^0C0?8waZ4+k4Jy!2GJ<4nr-|tD$ zQ?tj=CekJ@DQ)A(M2@)_XvA#uzKkfWLpdF%wgVRttZPVfHnC2^RY83JHTW+#!4-7?ON7}bck4B z;=lL@*eKEw4XJBkX4NH9%Y0f8bfWNFWbzYSkEnyblygU^P|QnqCPD%8PQKL8Xnf?Q zo|BMz12!=~j+eaj1m@34jaVSbOScIFrE;>Hyz~XW)vvOT?VGlI&7$^)Bv;lTO1@4X3 zM+dMPz-w1hd3ti42y1xi@ChJg_sxX^n`n~E%>fms-|$s>C{YE3)J~A98nbfhldt=f z9U%@9`_RzhXN5rO$-)P`s2qk@a~pdBf+u5ePDD4m9=|-h%Cnwu56YU398gs-7i!Q_ zuv~?RN=U7{yAczZdo&?io+H zxMUkMaqb&4lKh%D9x{cAK1sF& zC5vH%lJUJf7=f61VZ76gYa=vMN}6fjC{Lu zgtxWz{+=$PasF5KKMb;wH1F^zB#Go)3rdejP7SG%r1w9Foe{PFVG<;#y}u_>_V*;p z{+^?O!H_-!mi%JA8(&`pw+8b|u|F0Yf_VoeE;tRtt7mObEtR4nim?xIl6bY+3NIG$ZuBNgLV` zyQe*R?JpQzrmFJ zRq1_XD|+AF&U%((;%VEI)}rb0rg54G_D!i#V+fmafcgTY92r9mY1Wa@nOXI*rUM}K zuOQeR3$ym-naG)ItB$GBb%0I=sF1UcfzldXhfE+gT9z*AxQWVxH(ONTvmP**aGKUS z(VSC}t7=8$f^)czCCfzHWtnKZ_&ToZMjV3$ey!ZoLSpjEE734zIaMn zFB5HmK$c~q4QMjV;0-|!_tQ9*i3ZtNAKxVk>ww8r3t+KDu&yCBMuc;ou&i=S_ZP{$ zer6hrK+j<+L6%Pv1szeX+_-(uAr?dxl`ox11u^1~e@Da(=3CV|0Xu4E$)HAmj}W(` zp_Ca~Hi2oXGd(r*Apfr}@JtFV?ClO;Y3L+`OM{K~p%XXu;mFyJ*4p;kcp&+`yJ-)p6vC&fG-zhHvKb!vbY7Rz;tN9I!SW!mQD zR_ZS$jPgTulR|~OPHt<{SC6AByWb6b5wpUR_&wgrVup3}@nWgiP+8-&t!-^55q*vG zJZ^7O+6=j2)ZeKoZ8}193d5*xBm;3GDC;1(DtxdIFt<+Z&((KQK8sghr%T2b2aF_r zqWToP$0dGvXt2n1v}U7Fz1jl~3l5yxB9jAoy8Tu&=~=~XJe;AR#r@|ViJ2G*%u0P_ zB%O%7F(Bl6c`U-=lfn>;?k;n9)TsB>2dz&+FT*{<88`|>kum2G1USt_lAB2#!}046 zMc~IyXmtD3*PZxzB(}=%AGDr+r|`kyM0EtZC*5xM5<#8cp)+(DJC<;aproK{xdf z;-RM0)fgU$N>QtH6hMo$_Ex9EkhJ(p^#?=3#hOsiRVC=;rZf{WVr@<6EJJPX(A2bc zD6Z&H6FOROZuOyNcQv@H6?Kq$O-G@QceG-Jp5#gq9OT@tuudn3k}6C{pQIglhSC_$ zD=x>=8%iq0Pp(=b(t&2X%z3dqQQ7+vo6bR3ZcqM`f;> zCpEY?hc1CvNUyJB5&@wBWjh4KrN%ZF@L#fBRK`D$Jp$N`^~I|e@B)aes6+pN9WbN1o-* zJfS3J%2oAxZW)y+Vf_&Rt$h-YW(C7r7p;3#QwzD7U}JTBJljuQlg8SDt`*_R<_r#v z6jwMCP-4b5My<&PM#MJxhP9ivSMGmrJ0BN>QRdG0vLz{Kh0uPeU3Jp-ApD3}883AN z#9Q)<@e2G1$7sCrfN!walEm)ga3aKQ>yy;F63GwUN{r1Jioo;)d3V{BcbA3g zQcO#2Qmh(E)v9$(`Nj1KlXat32^gFA^F8-@CNud1MZn$l-9nyuo_o*zcka38o_p@O z=LSUc9QAkf-yW%MKa&hB?{k8@QR(FKMyq3aS3FPN)7RfL>0`IqOoOq>#1=gswEJfTkp!KaAjDF+Q#$t>pyMY4j)4+w{A&D#2aEa6!M0?Z2(K}&p$J>JU!mK zLLx@%^7!R?DfQ;U=L_avYza?~pXXp20+{2AVXAG%(80VTfcd}W1^H-CLN*38gQh94I6gmlY2|q z;INycfII=N#b!tHu~HmF<~}~(j`nsFXp6#beo50Ui@J7phfa_8iI;?0KNQsU?S*wU zm~*|=ES>X1)p8-WUxnqH=9-(@AMJcQOwCyqp355m*de4F zAI`KqoP4S-&9nXCmE4o5`ZqireQ?tqmo5*D&B?CfXYe=HDtv>P3zbkuo&+RV8jbf^|bT96fJp$kxdbH`3BAM+PMikl|Sq zVMw=^d4!{kM+VmdWAk@Dk5@oW1PbG1C9syE!FNppJ1GEb7&>e0>yoU72Hl2=S5ToU zh|)5nIeY6=peDOy`;;&(N0N_W&w6C=M=D+wXaB0OaaM7{l+Qy}MbNio90Dl-^eq8> zMo&V}-i^Qs{?q(2G*p?uFmwI<{YvY6fU``p6Eb!%#wm5q@F^+2mqYCxs~lTk2#3{U z7;buGP)>APBk?r>{I8D|!($NU!Jc<% za(9FU$YwVzplgYtO_`eIh{&pjy=YTeW^#Da97;EV@{yh;VZ&A9h_;u7G|ca`w1+;4 zoNaG{A5Axzi5>1rx##rPvE`v>`Mb7xd1xVjm-F|Frsbh;@mIt9+xgwd-{10gC4V;& z7OKeqD=E#t7Qd9`Kf}D0A9sBITQ89l#y@A+>&)knasD^zj~4?bugQLW()xcodtQHr zVwHX2@5Fop^|LSONk_(wps+j4K?dq=`4i3Fq9N8Yu+`Q~i?%Skd|e|0dqZ2&WWt+G z^h^>MP5qUkeBeyQ7BdV9ZB&ewV@L$0w{o%AKy`bq6@@sz{28kWY_oiDmW}4|jLkg4 zTl};jQ2)6)1lg*<#OY+?))txS4%3-?4JKwr2IsNVFRUfnjzLWu=Ip!meeq$FTw51- z>nwkkN`ApC((<_`7j=XZH^%Rd7Bx!?0q+gZTD7S7>*NhFU%4jlR*r)eRJbR+glOUK_CXeV?p9q&gnCsB~9%mzrroU&2V^^g0 zIT(?SZz+;F50+kd3S=fUa7CG_`9Jpzh|xbxf7^<@3+ST3Zt+c96>D}W%nVztXV`=> zRVhp7qH}uAxy%^L_}$gH*RrZv~~5Y_Tm91ZuR zdO1ia`e?nlHIz;5<16O9*9JvJHmgXkdB}FvA=_cP`c6?|7K!HMe(p_LDtiKVRBzKdA@o=garo&p+J9&t0EQ_4Ct{QgJ1r5+=ZK zI(3kbY-2c`9neclnB%MI)B%H2{Z0;tx_hkRqP>g&4-h<7)5$6p$)q(jRgc@O z$MX7(-s@RT2V!TdgN&~MJg&sv)xIpx4)ceQ%L{g~gPrn4%38~Fzl=MJ%dnmDZ!l={ zWjIJzh7xXnqfa}tijH{&fk_M_x!p?PoE;v>l;Vq;t8o{G zuq@Q4`vGM1eH6fHmeKVvPRd=QY7Ww#RtfqK75vQj%ux zJ;qY7#aJ_4kA7habmu@nf8iu@M z-i-ecEi6Zbl7wWJKdve!xcudhLrAJJbsx$pNu75{-(8}Rw24>k8WkTdP8`3OLPPc_ zD0G2SGsV11ZT_r{pHx>8ir>o|oXx6QP2Mk`QWrdIR1+Wh0rj2%InHrZG2*?yZ3~WW8~job^UmZ z{5v@`Z%@Ndm@y&Lv|uSe{v_s64@MQ9a=TNTu1Nl#mcb*bZ-Zmz5fJUYhLH= z?C>?w)M5C8;>f-wK-foE2NscHsci0(?)hJvI!n4TEi1&|7P_Ewf zjRzAa$JKml(CnhI81R1ha|gktIx9GzLR7;6+`p>=(p^y5fy}!i-Vgr$=-42V?pO{3 z@&4q^)khPjx!kz;&*k7p3h0kMPcAr` zI7+x*Ksv|kptPPcsEYYI$pejydX0jbO1=oH z%whz0O;woERb#DJ+tM6sYKq6#Eawipw}NhealJded`@I_`YeS2Ixlm11n6_-zbdn~ zB6;*^qMkg?OFnxv5w8E`jc?4JcVqU-f3C{ROmo)e6P!Ta7nkNcb792mL4MZ0n0;hn zUb*{Mf3{rNA~Rh5f%iX3w&ACjhL0n}SY2Yito)Gh=l6OWe|mJRB@?e5TU#-l6TtsgvVjCKylpD1>VQjx#(xiYKhX0*#(n ze|Aq?e-6!=X8nmh)BNsD4L`%xa|tCtTd<03%g=E312JVA_cgU17mIIt#mAP6)oejJ z%$?v0#>mGP{qg4gv)|V~*6IuOCP%{S=Wu0i7_l!?o$6c(<9KE)5p9k!GMdnETDz;R zdh~0n5k{N0i*^)cL`D3ZAifY8Q@mSw9Yc#w3`qPNH1d+nRT0KRd-Wyh9lL)a)lDx? zatwJp2Q*Kkzv&|c!8m$}x6IAZX#>i<^)7HCDrp^qSmJ}fL$dtdVx3f9_u5!Cb%12C z!YF#~#B5f<=$m*-bkeWaf*?_w%xdx^IiM$NcP{U&j4#wwYy<~Lmyzmr;KyOg+@{j*p$t3*xBW8WLhkauSBojx++ zGZ>Gw{@2!eAIwM3ziuRxvG0q7vtJT~jWJ8m)jvYctz+4giohkI;q#IBc!GZsL?)|V zLP+-O#Xebcdk=mXi@1*)tGR(6pYvY z-)FpvT-5fVT3H0ZgzRi&(oqOA!xh%Uwfpd4gck_Eo-bu(vrg!IHY37%|`f{e1 z`-Hdmk@8pfWO_GOEm0Xh_|D8PiWB(Yzq;q@T=~DQx%8sYR@FX}Rn0GHEsZsK5AlYI zNpGQLc*&*e*DdN-jiQ1vbiO}^)(2x~^XCSB@9}fw_ZUAT5X4s1_L9~z=4;Mo-wXpU z7(Cm4^wJF;kY<8Gfkb5Z1ND+GPRN8);rCsH5%~P>K!xVwb@@nmJ@;5w;KWBFNV?j7 zu6mSn7y+ntNdUifrFO(B_3SCXoTvU3LAoBy!wV)|sb^2QQcVMI`4-fFt5Otvx0N7% z4kd>|v1a7Cc%0_M|E7)+vMfHEcjVX)!Hx2&YRK%0%b$zTtbW^TFTK#Oy!-xQOVKy- zWN7Kc^VLVDkte;s`x)9ar+ozRG4FjeRU*^`PZ!5|+kS9#j3ZX;lmGs1gRQ>Fq1vtC z+hvsxM!j>b^q->Ns&>yiwEQbk4bh8o`RGtDbWyA4-bNW!fHlagnaPNK>0FHGvCmxu>mS8yM{kab+Jke3lMI`|@ zdhx$*JcuklhbTtJ;G5!oHU7!7&kSK^q*u zu`FtqP$!>XCm=X0jO~G24!D6irTFIPi$y$h8ysm8Q+rAAbNdgika7GRng&0*D()r3 z&sfcUpyn!+Y6X~cuhu@HFH@JnI2Rkf*v{4XRY(t)vH# zAP#}w_{#T-I7fqJ*DA7(FIO1mwEj{|4TztoFlz3HsS5G4i_@+lEV)=Y;AJhjSjq5& zlw2%WtnQPG1rTaGr>9&n@4E8BP^MCNP8*6cH9|((8n<;juiFIfI&GVJCAnD7u|%zp z()=h?I#`;7A|34TzW6=1lvPB`i}R`}R$oC+tn|ZFzW|p@{4iB@tICae=lVhV^4d0YjSsZ`e3;W)8mtZ$pB!esBq_;x zC~SG`*r&cpW8vipaP;VN(KCWJ3bRdKBxqw#xp7(PzWts)Ip4*ihn{llf8xFQ-#%Kr zz?o2KE06hd$)x#mI{Dv?lwW+;AEcOzM0%E7x$2`D2)JpiruW!R;#BH9$Ifvv=0<`v zSsmi!absh};o@M(vpvgnD28Dc*|Sko+=V3C)A4S?F0|PAf=kiHR(kh7ZpHhv5a5{= zaR%WEHNMz{v(o##8`O`sR(K!JC$my)UnRY44TU6cS`*?7NK0hv*;g~REG*Nsrr8TQ zq)*7T!dvR+`eGJ06Z+yvYT-`QM0T8-`bJ zgTh2>z71ZqQ|ChDBmSm2xNDH%*rCj_IWcel_pNajbIy3oIWcd0LCksMG3Uj+zbuGZ zG#;}k=5-dtEE$hk67yOMVwR7`EXUt=LClKrm=!VaZTXmvn`{*3D}H6ndzFi1z^sQ4 zz}|xaBmZP^oY$G%^jU1$GOJxocfmbR?r87VC`+8EuI+E~4j6ma324c&9%L2D%_PeU z9NX8pdR0DmH?Bb2n!xVwJT`Tkytg^RVvD-IMk6e7T1Wdp>;t@1BRnS;$h(B#RzDWh zv#_uVZ@=R=k6NcRdu|qD2{J*mFqO!1jFk5BfVuJN^YbPwheBBiP=O#u=&$TU-&h5l98ESsha7)anTdJ4Xge=~eN*K0#2I1>72mj$6xh7kedS<`t8&o^ z9brD&P3l2;i|}h2?feTqdK!j42e-wpqvNR!ylk&#GfloPv40rCt2NBKpVq|JUW4*4 zrpLyQ@K~jXK;uf}ecvV^Ec5m|u1s`p4&KtZN}WkSt*m{{XN1LrhO;7a!CCj#dX{GVd{2^9^(y8KB`nS`0#i1QcJ3z z7pL0(AvFdS%eT}A%>`-S8KnKPOB=6}!Pf1-J7f;-w!B}|R5k4wdpRR){7kKHI=R4q zkBuIbHuB#i+@M=Ia7?-tH~z7ApERFNcYez2V>HMhS{6)e&#YV`CSPfGJZnPHRGKbh z^7xsNKz=?FY+UZyH9xGnf)wvE8Iq}KplE6u7@wM$EfyO6U^&#kRf*Ee;;b_CVmTp# zOeqk4%4i_`sF;mku9;HLK=F8;nCfoKuU?eadiov@@Yy{HpVRrH;X)HhTHZ}20v+24m?SGS`tXxVWmSO3`C`LqWYcl8$>%14 zxM=V5CK=E}hsaj_W0Hs8GnU8NRe@6BU<5FkZ9_3KB1DG->}{Yq!#s7I9<8u zV`83|*hRK2(JN?Zs^Huz?>!A-a@ep)sIWtN^lUi?>5L$#!Zn$dv8rp*)s6Fj&i!CA zJYtCqE85Xx_Lo_z%}Zx*`sC%81OCHta1I{mu=oJrA%SyyNq?Da=La@#mQmlPO{?BV zitlHPnrW|(rr8~fMW9B-Rjs8)wlVMHHcukX^rww}$!t2}-RtI>M{{S}jYqF3l-6`T z=4)M6-q?QGJj>;lHZo*lN0%L(Brp}Ix~C`F|3)!x{EWpn{PJC))mzo7SaN8Nzm<+q zf5Zv(z9SCJHrd90@65gVEvugLbLe^fLsmH2_ImeCk1<#F*<^nRa?^-Y!qw0G&Pq%zf+XJzbS+}KQ!3ZF*8+^ zVW7$}^4ycOUrhxpxKRa(FTCy(6m#AFdCXzi+jng+CVxa(vCW2Wk|U^%qYujP{yhXm zA6!;~WR3QKS6o;P12}#a2w_bn3tNWQOHhnHvS~G$u@O<$GEBPDX6~e|Tzs-=>1nyg za(^{=Bb}>_WBO)Um?;0ejDnVhW8ROzgeDBUc`oJFhoI^OZjO#y#{pbJhh*7`Oxx%+ zna;IqDD;~2@{6i+PZ(}5%;Q#`b_eej{=t0W3`9o{qq9UUFS0&MM57Ox@$Eq;+1V{O z*O4aMa1gOG0!uz%G11P2$BuOB0IN5{;|l*`2lz`#^i%S3k!}1poLmUm2MpN<*aUIN zZXn1<_W4*OPl0U09I~Nq^>OsU6{jWla{fv9-gMDvxhHb>`o2L5Itjv%K)(*gt-c_S z(~^&w6>P)srr2q@@2S2`;b!kjnwUpFnc|ax5DqL*nt$MTyi*G3>9}>#`THdgHC9}c zUb(a?_aup%y&bMM(L>HoE;dFXxAn-JcerwhD8pm`@9#qx2K9W6@%&=68~=?M>oip{ z{viLBXkQqQ9fS9<0Kr>6L-M5c=W5IE!B1|wQ=WBF34XTEf{b$~Zx2WKsoH*$zE0RK z>z2UVB|ahE3*e>vUB%yO{;uOM6b^?=_{;w*Et{rB#lfzA<6Rth3*+iho5s;9aBacp zo~7a}P&is&$OHa_(vmvzmcLtOJd?t~+aA@K4B242(OSTsCYFWBpt3;9=1;CfgR*Jq zY>5m3O9-fsss$oLq|E%rZQj&!8Q>;3ATqodiZXn344ut(VVW{TtrBz4m>K5} za-7tY8X``Z$VD^uF1g8GI(AqTl)tVflhym?EaKF;sfJ1S-T zxM_=JHeT$WjS2`2zJ)1pP@CDu*t{L2izAruaCW)%ciwsbF8bE$E2W6!{PpN{`)fOP#k4r&U`_QmRuPexCVfXGBdF>W9`jQ4Kg(ORWG9hN zPxxC3)<0(Z<8xgvXot|RZ-FEj%o5C)bK2jlS}bw}B$iOowSz%& z191pB4uv=8Aiei~-Rem4g8JqDdVF>%n6u`zE3@Px%Pf?b!({|#T1pj@ zd*oPqaEket{lltd6YU45(+_c8UEPf4`g+m8Z0`bAMXjfM?}YM@E(s&uvWW=^{$O7J%>0UcAg zfic6IW#NBtM>0l_1!!zL1@_5)nxTwiM))(H<=u#xwuERVL4Qn4>m4-6&nHzD8*8DS zaRq-6Z@TAxqFjGo?65x$7f_MG$1lI^!jSjx4rW^jy2t}sJoGhh5`9g#KaD+?*SH;y zv}8lD1$CxBOvZ4F;Q9sGR7B`(sa#Jz`j4cUxS#aA>Jh77lXpmLbIC3K7Gf?E~zj?aJdz2See615YeY~49S8}CZy6Idu} zWsWcxfCv1$)_XJP4a~n}fAVGU4`<7)xYFquUtudREi+)0IF)9T#D*CQcdj6eV1Aoy zA97dxwUU&N@-~i;av!0I@z$M#F&9(PW{cuwK@qFW@Nk6MrkAY}H@qo~O2Xv6nuo7K zU0kdns8m>4WjD`-jl=DD5*)s6KMDXsu*x;dZXLu* z1bv1XCHQD%QG_NO+t${s3=oe5vPb{h66n-x9$kl_pgSs_dnguG@=}pkiU; z=(^I}4>L6uv>*LK#ln`+b!Y-cGZBa37AF^1Q{52ze$^wV~sUduk#{rmpT*8SW0 z$y5qoP2NXfyi~+kR7ELQUP!4@=_VUPY3|moLTJpZp9m=hvrCdO& zEf2f~An<_Yx7s#V7!q%LgZ4$l=CqfP+{q0?{rT}g(PgnK7q;}@Apc9>L|Pf#rt0fJ zaBrriH~ADgTwU%{wH|xyUR)**SqEna_|bhO8=TMH-9|EOD(ogTt>2B#+V?M;P{Tv< zZ9+oGkl?-T@74Oe7c2bBzR~+Idb7a8)HrZ_7=bRXEWAH|&?TZ!soN$`U|ZgK@AA-H z{Ppm61AoK(73q*lO_Nksg1+f&>VGbO(0WPmkGIfd>(-*7{73l_@TV=4_|tUuQLvZu z|IUWxIC}}TodJt57Rf#z^5n-jC-25R;xSw+lzTM*j&&Z&l*YV^3jt~Xum+7jxd}sTw*58rx0g!ay<4u+r)L*txn8< zfN!!=3+Bg2qQaQEX322dIo9G;Y1^dkS+YtEAtIt}FBt7=yhCeKe97wDgNQ{L6B5UF zMPQu=wwl~nZgOM80p!NU14t&~$jgu$BTjC7JU7Gp8FL7@oIvhOHhy(~>ZWsuo;omx zlELbjq&Mh2!q$d1d5rc2P}GuIcb1f}fX#JU%ed(svQescAm3wsaKP(R&kAxfAcxFE%kSCkM&nHm+AU}cn0_8~(Ay?RR zdpxgh&2y|$vX#G8!!_nDaB@kJENSsx76M6juP%yl9pK_WX7Q`0i(dox}Lumk_kn-cA|cgd9W_0Xw`Ji1s2`cN}%ytw-pUuVCH$BXKV(8*N2SX z2e>8nzGc~0+eKM}pSQ6a2|TfJH+JfSVhwiz?#{QH^CDJx3FoH0pIBop{rti)`?(NW z_ZLvLvsI%|Yb>bRcmBGlYQW6%Mqv^8syRqkH6`}mQdl)97vmKK%e>8*tNSa_Xi6(N zC;6CAEOQDI)v*ikm*V5~xiqNH1;zDY@>=d>Z0=@p%m`uo{U&VF4415+a$Wym%?XmU zxFosDS@p3=3DdU8_K5eTFN=Q<>&#SK9XeJsgm_=yFr0u(s3jhst@#nI9B@oL$d*+_l}|a=!5)z7N^B3uo3zjBPUt2XR~Wj=Cdo=lUmIS zu;_7b=(a9ZpLXz6NaClFS+>F$JD#g%6 z%BL`K-(7xU<(=H2XNU!X>=;|GjBmN_BIzbeGFe45d5=3{3$z>MgWmwo)mAhT!iC?zi1VJY)v-VsAO5C*;7JJt9T(q z`<7jLmko-0*`d#H`^6c9*<8_}oHu3PPiXYPF8wrn@3L0P(b5^2l=9^InCte=h(2QR z+2ynPTv3}!SS*$1?(%p3(U`OG|LwnE;Jlb^+CTI#%9m&3N%OI(@&LueHq^W?g7Z1}ejFC3vSV?dR&TUB-Ve>rkYX{`uV<&z_71D|$z_^s^Ya z>8mY*0Axo>{B0;dF~Z!r)ns+E@-^`$PLE%_2Br~ey)52m+{62=k-xumMvA@hPRn+RUK?+w z<>y!OppD<+GpZKfAb?tU=@; z8h6oXT5ILG)RKnnO_^16>@DT$N;>&Lj`#Ypzq$T5g41D%lEfMD+K;Kv;;5K$ z2kg47;|oHGPkER~nZXY<`c7(zoy1wHyv!Bg_iys085c43bK6wM6wV=tJPkqmRnG*< z=40laR^N`H+OmTAe|t~rZcHYWrEgLwPaXEv=Y9s06w-AgIAkbWu>k4M+Q`f!-9f&?n*-a*BRvoAkZ$*iU*?4Gp41%j z);}TrGE!wMWbnOFBzl%RNF^+HvbS43^i(~rboDsCpdL3A*TX@+!@CPMpRY$A-ql07 zc;7KDSM6?!2G{k2r2p@ z#8gBTx(@Gyv@twK`v%&Jn+NAB1eC(+Jl!|5&sWUQ{~REYQF4n2>LetLf;mCfpd>-H}H zwlrHd0@Vp$$F4Yr45k`1dov8L7+yp>&CJwLVIo2vWX&sR)^6Dc2aRV-!K{tBYRnqq z9L%Iso5+&xi)*}w;-4z$zJI3BJU2`35MZe79o~-_n)&X_!@KTNE?(8$md@QH5_De` zi?57b%`q6Eq1i5>+}0D(2Mys(-u9EM&VzfgK=5~WFq5^5bPw8op~u02Jm>0D&VfVT zKPQRbS?R9PQDIomq*s@AFFW*Ewf^0itX`rIer^j09-Gs(fghPT_l8*xvOCx~oZQR# zgyGy7GPc(3jl(&#`oonQ>0p7N8Uh57Yk2UC@j{c&zM<{xtX!%$yBV7LYQ^0?%fRt6 zJj^++r+>&oJjd>@cU?CUvo$-rGSWxr;DMQHwDIA=Uf%s)N{+mt?er`QDDN4=D%G@2 zgLYQah5@o`>AP+}*;%h63=mJ}a; ze1Meg4k`B-Qgkt7@|iVl?nXEibx_lArKYfPJm6PxcmL zF~#JWd}?Xhz3kBE+oPX8l?0iTKG^e_^BvJs))VSlhC7~|N2IP6&F3o&9IhfX(bALZ z)L7zQwxzn+>os97%*_M$5*&TVelVIuHp*tV6V#N|RnxCB%Bo6R;^Yp?A^{m3)ZCDJ ztx?|rw>l%MjilS0)pL{O0hbh9wo4h}^JMTUcE>Eu-7ZZ!bqg`c9eV0&?5us>guCKX zxDJ~gIT9hW#k^Zf(qDJ`IbNJ zQxo-tVf`a!9}(GlKutmR^qr8)$NySYyi2JwmPgXVl2@NxYH)hSqTLM#voa~cilprY z2Zk0qw{i6GXYgs1d%rWnC`4E~wLuwYEqg0O8;176RDXKLqM=egW@WkrYYTF{kiEsu zl^?T1gMVL6kBJrh+>{$Q-(3TcSNnN+4vD7jp?lG{fubRBVno5*q<119RK2BBaTTyb zPfglYj_Y@U^+0&o@tGp7?;zjd{S1`mxqcqraed|Dox<9l*`g;^OWyjYdFvEtD`O#p zCqZw69@C44-IH~RlhB?3c}*t!fPT`E+=-bkg>b0>&vdCz*@F*|hUq{J3g+gWb#6kp z5xj&EoK0<48g=W#8aLWkZD$qKN5ew7xwg$(6Qq9Tqgo*K8HTDlfF!}K;-`AydmCwP zT^9eLka9pmJ`N4~I(A(}f@bfp(`sgL5-b=SFfDyUoB< zXI6}4VvyP@RkLd~Poc-VooSszA&jHGCV&27PJEc}(WY#dfSb3Tr*qNXg>Dgx!?oSB zZPaa~mWkI|%j%TZU6z+T|17ZtCyghF6to-z7)FE=x1FJ6A8}Pc#aFqAbWPq5At#2n z3c})rb3R=2dTtvAGGgG?LZ&kRGIHYwgGMmo2ZJZD+yF4ScL@WQH7J}kl)FB7xdyy2 zmJ!|VreTnSNw<1`okAN%m|7h3+{jDf~7lB@E<5J=%7&UbU>BQI2u?r z4Ri4?vCx9phi00@X*O6+-D2%Yr(zV8?pn!n@GD9!JlKNlG-HFm`s`%5PrFi*hwF4n z9%Q>DG24LG*g`LS=NAgI&CRv~V=gZGPGVb0shKY2l1V9-WIszH%hY`aBaDngxmT&z4?j(>PaID!i^AFhcI{m z1%ba@$UbcuxppOY2z24CCuO?yQr0DULxai_>fM~x%O(-J)njz^|0Ftp>U zZW61FEaPu@;+#PyK2C8Mds;K%Ry3yd=PPED1hUQ#L~fkhaA+>qT&0$)`a*d{+w1~SI+ImIQ)`{Khyend zDvZNTNVWxU1s``&MoKw{aZ-Rhy z*Amr;ot@Moy=3j#rKinydP(h#c4`AWlM?JT84d`aSK9CJjg=hE22!7;+y@fy@YGf;1z;9HEVMZ zy8H-S_mFX2ui0<1TNB- zm+V$fI$KRLG2JqFY$m0zOyhR+;twYIMz@n0Tiv}pv})(_(4X-a*|j{>!ruq^yNAD@ zJi0veB;o(T-}m|3$KSL3l@S+myUyBkF4f+182g+>A{bd=0l z02xr(mg{?#hi32Qj^S^x$GvxXXbKPKTQ?;C&#>HP=rKlkLuc3L0!|06{+r9QL9wRypU7p|Q48}IZ_OIEI9zj%JP)7f_i2H2;!Cc# zeVU$IMNYw%0g`LmT<-{24wn2rB*rrA(3q0`4VzsGY>ltwJXf=KIHiEVSkR0OUu(H) zX&7`L-AlI&V22lRt7s*a?B)F?qvXZz@+!@@-Oo2!#<;}qM_66$d-OQgn<9$HdfE@a zKgRFijvv7Hs<+}670vZZ6BAB`Z@C)y+GB_RzTmx2Ja_&&TCLq>SDUX*2koCP5^{Zb ztIg(Phqu~X@jUR!Ar4ej6zo^8j>py-`E0Uw7jArxu%X-RUHVDuI#!-`mZqZP@F(GG zZF9Uk>Fu7-34CbdcUeWUw@w?$OL-X^d?yR798MA}f<^CZylV~oH3G-jhK;_*>c}u1 zGjMGu`@v6^Bvuf?#xkJ!z$%@588MJZy2{lgdH5&=uyxE~9-UCCNbaq30jj|_v}*H% z(f$Z7NcNxkPrnr3yqmS6e_V=8+7yXyo12533RS<6G+HO`ou=G5V`#2XIjwR0Ec{Fhpw|k&!WY^rXJb zanM&4v58QMo>484O&exwG-~(#n}XV5Q&itLiVAKL1?6yg5;;p#=rOYUiNpK9{5#O{rtGSP`2T2e7}uiD-;+Con!V9c4{+qi-ZLJ1$ICdF!)Laj344I+~~D| z-MWND?!`u@c#-Z*ws(e{P1(Pjrmr(yscmg;ZsA!6x}}uwOzuJ@+qqRS<=Puq*wDES z&o7;OmWH8+&K@q5XW`q>xo1f^)|Q=tZ9_{Z+u(CH60&J2t8V+cE&sJ=*;!C8XOLjv%;TzZtH8<0j#HBhHRcW-p~hlh4%-Bw5;~JRQJZ#VTJFLSrU-eA&KHWj=S0_^ z4W2{$dK&Ja@}bG!({0!uMHbDsiSL@```@w|;?cwCB-=1Xq9c9t%IYtS0 z$O^-#)o|R2%*rMgB)#BhH1$hso^aej8dD}E$niJ)<o1|%8WPBl%_$Ufhp9Nr~E!Hq%tO1cK2>1Ewh#Y;5 zm=_XOeRz|r@V#H;zA0rSjxo&asL7XOrRMH&yhW856qoxwCrE2glNJ^_`@q6N?T}>X zY`|JyAFutmNrr!NgE2&%oYlc4VCH&X>?l}RILLSyaA*4Uc)LphIdg|I{)MWJp^kR> z*X(rrk#yTg`l`{)RTY^>zmVxg44D7e+{dui(a#q$BlDk~`)u-OQT=2dpZWc^i!uzb zZzm7m#`V+nzev1d?k_IABiY)T@$_Sc>dl?&~29yblcSgU4P9I9)A+!apNi;x2`4PqlDddJz=-4C+xP{ z)@C2vNS@iR>-ny>ZPte8JU%{YMEm2V_7Z=<_;v&A{E=nolDjU?^l~3_T`2aYyRMk~ zc;eMfUz*{R#72~fJOt^+o00c37|tSLI8o)jnO|n4@vGyH<;KB49-B8w z9-Hp`r^#ajs;%FIYocfG^mlT6Nh`M$Z__9hkWu(r|E?)>O)Fx=Vl~@ zuu67*H-b#X#gV38k~Oil&wF;w(XnkSkVlH0QP4YFXkDSZsIiE+c7FHf<#QsPT=CTL ztagNNI5D|ciF6M9mFtdv3R#n(zJB zS`j{fO_b)|z|AjMYlqq@y_GDw-H9X=gH}}&lw^c1ZQR$9>{v8;SGrK|tUNdt>ea@I zXL?onKus6Nt}C?qGM|mRBf5Wsxg*-{FzDRZWZg${@jMV*(sqv7Pit+ad5uM*#C7D# z5!}sl5ep{dOkbftLmZCf@Q<%VWwIdy4`|rW{{D)21Y_fWFpFqOXBz)??PzD9;iNP=A!G=<#|;cFmLp(rTKYPoP&(-){Lpd-d`CV+Bx43p$nP6->Lg{VLGWz zXv$cmtV69I3d%UxT2uxwZ}iFw%W#mc3?=sJ$ICcMueCTC-7Iav2TpSDq#UKju0YrKC$%z&_TfKt7jv(5!1vE*pUW(%3XWoK)schz<=5_bUUc)%HDBTTD?y z__vrU_vB*b9>N;3s2JZLFWJ~2qU`s1p=AKVkyl*9354-EKQ zwqZ6rM+zto-k~0In+n>7F}8HeM}-rerSvCxDcGjsqLyE#VKz(oTC#HcC~U5n?SXgC zTFa(D&1~@7V;pet{^S}i8=DtnQr3+TemTB8lx(jJwfP?2{sooHp48BPqQmfSuJ<@q zfg- z3h5(E*Ka5ny(>Q1UZug;fFa91f)u6Sd=$xg`QGAZt9KVyp=9j)Wq13@^qY?&SvTLE zeloqgxKSmONzTJc#%U#xNb%L_)OH0>ynY3n$?7eg6`pIaIu!W>2*E8 zXSF||Fg0BU

npuC!~HW=&EA_o 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 z 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

KPCUnKvOb* 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 - - - - - - - - - \ No newline at end of file diff --git a/mapedit/CDialogy/Debug/CDialogy.exe.embed.manifest.res b/mapedit/CDialogy/Debug/CDialogy.exe.embed.manifest.res deleted file mode 100644 index 9c8df0e3c8e374037f6a16f24fed3e764becd3f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcma)2yG{c!5Hu1ENc5D}_LoaUgCgHW6d*;Spa6Qu*$Wna2(Ryy`w@PIf=}WT!t%IN zA{tg&YuB?g>#-0*NY35vC%HU`*P{VH=NWD|rsCvy82Wg7SBtH8vcp6+h6-krDM$<^ zu5H*<@Nj=qT!N&m!& - - - - - - - - - diff --git a/mapedit/CDialogy/Debug/mt.dep b/mapedit/CDialogy/Debug/mt.dep deleted file mode 100644 index facf237..0000000 --- a/mapedit/CDialogy/Debug/mt.dep +++ /dev/null @@ -1 +0,0 @@ -Manifest resource last updated at 21:19:30,53 on st 11.09.2013 diff --git a/mapedit/CDialogy/Debug/vc80.idb b/mapedit/CDialogy/Debug/vc80.idb deleted file mode 100644 index 548b7d2a89f2b38337479597af550748a8a5db39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117760 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 diff --git a/mapedit/CDialogy/Debug/vc90.idb b/mapedit/CDialogy/Debug/vc90.idb deleted file mode 100644 index df41d22a435ed62f5ace41a9b23b82ab2d0dddbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134144 zcmeHQ36xaTnSLdROGGq?;)0ZlEKzy^L?A(g?gmk4mhMKxHce4g-IQJ1)T{1>j7c;u zbFvs@lo*pZL{H%45K)qVQ8_VAT$-qe633Z%)VL5lX7ikwF?b|0-*@Z1uG{$9uD zi7)>>=kr!ofA@d?{qFtmTmJiSVIrE#*qPRRxTdn^yz{~f8|H>Dtf;CQdhBVn4Hn8^ z%Q^zp^}r>A_=9C#tNtth5d}nnkGlc~oS1g{@xdV}qJSvyPoqGu_3PlFkSqZIG(#^P z6$K8}E^P>Zf0$*x4=uPBgn^5HUbU2;dENicjn}`|^yg`{>+ihhp-rt1kKpfD09$|| zz!&RA?SAR0eM5)-b;z)T)6agQeoEz;qwzb-f@2CenqOkqZnr|aLc{m*OR?}6EFlN{ ze&E37w;sQsJ2au1f3d6xFb;6Jn{i-5*}Z+lr0c%@MCb^IOFoOsz57_pA{6(+ML(tw z2YX-h^l%RzWm$ycUbeGl$CSrIx4MQ3W_!5bJ>Iei#hozz9@>3OeQ}7I4;xOlEJFQx z{SSAL`}I#3dHm!aX7h3A8=$xkzkWZtV}5{}Fs-=U`V%dSP+UjfLvu7DKDyk+!!3(Y z++)xD5$#T`_2w=(72^iz{*L{OH}`nBMkwxtd%s~n+8tW?Q*Z8a%rio9mtC=yKKyK? zH+RV?mPP13?0nl>hvk@+gyK4yjhgIjH}(lkML==4?YxgZ>^;Mq8y#v{gl=~?C!SmCJc56A{LQp`b5H!FWf6+& z=&y-0Qz`FZ=c@%zeGM+%RI8 zP+Vty*a8jp;&MkKh6$b9bdk<1`a2deOen517T>Gxz3{kp_do+eah>@v=qhi!H=)af z;yP>Je8iMqT)Vq5z67~-Z(h9p(4U?RJ!I?5qQB3g&xG#pO-G^wT5;_@jd36p*U{|G zXEY){y4+VW5eUWI@ROTf_hQB^1|L zcRJLWtmud9?|yWdP+VuN=9;A!m-|P=JE6E=ZfN@LL*1dRm+8!+4!7f6NGPr|#zQ7} zb8A2%6xW$MFP`hoU59y1=-fSH``}_dT6fs_VniS7`UdowPziB^ip90th)p>v-Y?X5#SVwg}|XDn{p>3Uf3#r@WTeh`W~Z|L-s4|a!kUG44f z{g@|&;yP>8OVCg+uH6V?n9zObD~_A6HV`^@*E-#5QL`4rJE6Ev3_Tw6=Ef24gl@Ml zABG`*2*q{Ac>fGjFYZ`8hozQK+yh57EPSv#bkYu;S=9Fw#2TTvj=pznb1fCxxZlpf*b|ED%(K4q z9fP(yPQG4sK2jf8KK7{%>7fwO^5V{X1Ay)O`9_4Aw8$$Qt))t*v9Jkl7J`sxR z%*p3I)dv^j@Y-QxaeE)vh%aI;5X!DI#y9lA{SD> z<*vt?PAIN(-mL25y5wsZPeO4W%{uPTtrmT#Or$&GIXfPUXYI=9jOJ`E)0T^*!mWv9 z+-^?wWby1+yWQNCNXIf=c5~;{imFI+A{|Y3#Nzzb&So;niq%$SD(4vF{r?mkl8-`o zWGsUpDpXKcQ8NgidYLQJzf}=C?wdV38;{!gTq50Ow?txj-|SMyOtjrMd%0}XPh07j ze?yXqBx1eii}wJB$FG?-b%HhxI}>(CBpJ5z9kE0vJiVf-xii``5etJ-LZ1g_HohjB z^>383_UddT+CHTOH?@9$MEGS^UG3}i#xzXF^Ic`m!`mvVL$mO_k4x13H=ep__~wnX z@0we?b^l-Xyg2F%%c@LAQgK@?7;34(veBARU!%#0Z6EeEm5CL&9qIOTrYp@RJ-_9! z2q_z?c`}j4TuSC6y78()sn!-K?+I6$#(|JD~OhzkB`RLVD7P%#_Nwfbkz-$BOZLoC+r=S6jT)#R#=>MgJTr{UbMU;js} zlohsGt%Q|S*ZsV=;q||JkHgQoO8?IPxXrbA_eZ<4!uSu$xd4ABc&jxT;C&Jv|ERoU z6KXs*QiV_B<^i~^l_Cm=0s~OMH2!(Nz_?>fO56=VaG{C<|3C_u#{WN17sM4&Kol@k zK;qv}IB6yd1V90a{{Rf4bU_p_R6ye2P&jEO3Isp_iT?l$qI5wNFjPR|-%vPdCJF>V z0g3+r45D;F6fjgk;@?m>X(kE;Kmm#W01TpZK@>1lK;qv}IB6yd1V90a{{Rf4bU_p_ zR6ye2P&jEO3Isp_iT?l$qI5wNFjPR|-%vPdCJF>V0g3+r45D;F6fjgk;@?m>X(kE; zKmm#W01TpZK@>1lK;qv}IB6yd1V90a{{Rf4bU_p_R6ye2P&jEO3Isp_iT?l$qI5wN zFjPR|-%vPdCJF>V0g3+r45D;F6fjgk;@?m>X(kE;Kmm#W01TpZK@>1lK;qv}IB6yd z1V90a{{Rf4bU_p_R6ye2P&jEO3Isp_iT?l$qI5wNFjPR|-%vPdCJF>V0g3+r45D;F z6fjgk;@?m>X(kE;Kmm#W01TpZK@>1lK;qv}IB6yd1V90a{{Rf4bU_p_R6ye2P&jEO z3Isp_iT?l$qI5wNFjPR|-%vPdCJF>V0g3+r45D;F6fjgk;@?m>X(kE;Kmm#W01TpZ zK@>1lK;qv}IB6yd1V90a{{Rf4bU_p_R6ye2P&jEO3Isp_iT?l$qI5wNFjPR|-%vPd zCJF>V0g3+r45D;F6fjgk;@?m>X(kE;Kmm#W01TpZK@>1lK;qv}IB6yd1V90a{{Rf4 zbU_p_R6ye2P&jEO3Isp_iT?l$qI5wNFjPR|-%vPdCJF>V0g3+r45D;F6fjgk;@?m> zX(kE;Kmm#W01TpZK@>1lK;qv}IB6yd1V90a{{Rf4bU_p_R6ye2P&jEO3Isp_iT?l$ zqI5wNFjPR|-%vPdCJF>V0g3+r45D;F6fjgk;@?m>X(kE;Kmm#W01TpZK@>1lK;qv} zIB6yd1V90a{{Rf4bU_p_R6ye2P&jEO3Isp_iT?l$qI5wNFjPR|-%vPdCJF>V0g3+r z45D;F6fjgk;@?m>X(kE;Kmm#W01TpZK@>1lK;qv}IB6yd1V90a{{Rf4bU_p_R6ye2 zP&jEO3Isp_iT?l$qI5wNFjPR|-%vPdCJF>V0g3+r45D;F6fjgk;@?m>X(kE;Kmm#W z01TpZK@>1lK;qv}IB6yd1V90a{{Rf4bU_p_R6ye2P&jEO3Isp_iT?l$qI5wNFjOFx zv%}{fQEVK-$8o^Z_%I&zLH>Zkb>e&YdTdJ0t^9W)s5Qy z(l7Q69s1WH!wybA`-%D~m1mB|?<@-jxkFu=q9*^%ZSbw5rEglZe zsg`y8V9Q!Q%(9l8f_j8y#XezK(V><#673#2+Om#5&9YAXq-6~|$+GgWamopnb;3x? zItw<#us0IN7z>+w@cT_iTGnpxo(2DDa9)M&=kfQ~!F>hX{owr(c5jDoHL$%7KCFW; z8*u!a;ma-Xp%HEFfFF0mhfVNhFt|%#uMzg^VY?o7TVUgU_!5ELCfIL*?Ko@?gRK)` z^ElW#4K|0v-gEHj6xcflw#LBbmvG!?!FvY07r@yA&J@^s8f{*~v0ek`Meu(E{w%cp z4*a{ZA;B1vzN9s)i=zaS6^4FeppoBuxLS@`nY)U(#FR5&c~*D zG*Xn>x;ahr_-oIH`Sp!;^OnwD(6Vs$@|HRC8yjX$okGIGIW-NcZm4OQ(=>lU?aXTT zYu)n3Ivf^9bAOrJv|vHYvbv=+t1qaknp}0^r0MQo+#l8VM)lv8`OBwGojJ9ts`#yC z?&6v1>#~|@RV_`6;ZSYe%&Ik27gnpEd-{BNw%}dM!iHrvElZo~8|N>qgA#Q$m%*93 zOQQUb9iBLEF0d59uk-9FRnw=UUK^e`|Lo|DW(-eTE|LnjCX#VGJbulzsS}!0iD)ik zXIk^&&V=0&NrvrwM=X&EPp_!LfHp_+$y95!IgySgJ7V#(%?*8&1 zm)+bswW2EWk;g8*WxT)c#}YYA-8Er&5FUSZM>-y!R8?Iyq1WO2Fyig>p(d*m_C&ig9iDh; zc;dpwSa{;1RhU?d^5Ka~8*4CM@ZXN`#LFiGYKE0kk4IqcxLjh-R{J^`$F{ z&a|N63Vu%jSp-HjnXAt%?#RV!mSU3U*JcsONy}`m^{AG|1guzHrj=+eAB(rzW!teM z$+B%kF>H}^B)Qg3U~SBF}V zvaQ(pSS05)IHk)GZ}sq^sK$>lXG25h4x67$8E7Wx$R$5cleYm2eG zt0HzhZ^w+=w{;|9Gucx-Mb7`=Twt0_Jz>*rZfGfa6uHYi!hL?)UyU;jB0sc1PP z0R!1g#@vH!&R%VP&67#S&99j8w79J6)sA#~y372E35QR_%!P~cmdE%E(veH1%D7;H z?&bK7i{wr`BgITvH)ZaZ`B>&!nO9{ll=)4!FrUdhF7unr z`Rau^D&|_5S9J^Xxy;kLg}GK1=0llJW{#CPROU!om_KD&3-iRxOEcHZoGtUzD*p-|^R&#(GQZ0_?%{>`=)(*1#%^JLTQAIOGat?zGxNaA z3p1b195eIJ%w;pz%RDx7!4WiOzMT1N7Usa2e`aAmnq^#}QvYRsoB49)y_w%;uA6yh z=H!_(XFi&FY8K|&-NIZv^X?y2m?LLipE+!|oQS?Mf6e?obL4tqetd=ggM1bRM1jAn z0^9@geZ= zuK8-&h+Vtg3hfFF--kw8akn0EeJ8k~=)i%^Z#{lNcW6R&fygzEYnaRB8bc_%w~v@~ z-M60z9pP{bEs9*8e+b3BaM6$H!$BTIE3RGcMIsdUvYjx7t3#(RKF3&@R;yU^s znxhf%(dF{|MJVpEXa0zGr`CFNc|IX@f5(2to6GYip|}(7{f7N$cWC8Ly}3Mx5Q@9( zimmkFXNR2=Tz`39By=BkzU{38uN4Tzbu=3_+1m%6hX}>pw(~yvu=fmaF0Ty;-R^Eq zMyjgsh_o>spx#RFNfy%$gks27*Z>mx$v zHeIAMi*|YKNGPr|7T>Gxz3{kpc}+|xt}`D7UFB_;*MEfKI&0s2#FSoKyS$zy$gO+x z;_Zk2^knEETW1#i<+U`S`+L)o=zvySyS(-!6xY%0&Sx|tKDu09M-z&>;U_n}@cHi0 zo1?tByoM!oyU~}u$C%gTgwEa2TizZYc&$q)uCwlRs54p757*!Q=rW|GM0eW$D;JqB7`#WZ{&MfM{y|jelI&)|1n_Lx&#kI@( z2|{uA{^6I+r#~60yvCc$dm}>kVbWdRT;7WkI=8X9czk|xec*i

rSH0jIR$a(T~7 zD6TWck79o4#pUuIkkIX(vtDNwec*jBq1(Ntk2$IKBD?Fl;OI7@_PsV{zL~ z*TaG@?l;~`5{f%-==75hc87Ld?d>n`uL;F<)~J`Dpy}QAC{_@!fp>x0W&E5g$`oL!#gyK5m_EN~(E}vfz zy4{M6-a7CZ4WYO%|9%^I)r#9U zJ_{ri_nmaC;f=>ak3es|xLiJyBNTV79oUR)p6V@)R%*Ew%i^>JOo=XiwTI+}Idp<6Bb(EC^azVZHl3e5HQ&PZ<+{X4!` z5(Pwo|33w8tEdjm`gzq-E>ZX2cWtBYi{k<{eRi>;;1t$t1=x)#ciuHm8(>5 zoKz;#tr_(-nvB@?VP8|3Sb@v@Yo;sBCOyC9@bZbWp_(VLPazgh<|DfCszRw&j6@o{ z)@+cncIDwOBb1hd*S7W+x6`sK<(uwFF!yI}VB4{a+td5ATbcsJt*`yr8d3>2JpvbVPkK4P0Ib* z8`x@K>u(PpZrZ;cm4{n4ySn3w=xo&W$6#^ySAX^frfR=$j`nxB($?OdO^g1Rb6&aO z9!`G@7G9*u*ZpZCyg22WHlNmAyY_ON$om ztz&--7GG)b#~!Ak`(mU&2DNu={V~YNs9uHh$6U{QRsNVO?$!6l9xiXxdk_9ti#o56 z^k;2gA%e$tg@4kcKeMI92&SO>j*~wIohir{<^3_pAW<(~`)7`CMEPS)d(+Y%gFG`i zFYozdPm-)|3`8FnnH(>nnt@saT_+t-!Exd^Dk2&}CK7XviIrm?P z=+EH5)~ud?7|CC=g?Bsqvsv0Yh!b7mm2=)8}I$%;H`&#{pi0ry9SQICWmFU_XuZYiyFHFYlt=6{zpR z?`UGpgxxbyZ^7@&QF9aMbkt4QaCRQ*ICfr~i+VfivHTstpRA>5k0w?({5=QtT5LL7 zf_f1)!*H|2By4n9hN`fvEP2=!w4H6HaoY-(A6dL49`hWccP*?_tR z?Qlrz7w{7JW}Q4s{H`&{}_j5e%L6E_9ra`Yap|O{^cIQ+2363q9eo^)UJgigg?8UxxZzI5iXX zcy#U``dm-$sMaLE8+F1^xxd0XC2aI)F}K6~J+07{!5B zpbc0JB!H`db|49)fHc7Ai0DvZhgCvNQ-&IbS%o;m1yP{Fj8mFnhiFmDE0;npr-&A{ zEO05~vcjd6(g>;R5@ChXm(q{trl+CI9co8z`8DlK(H`tRngUvfr=56qNjb z8Ly`m|D|Prt~hySlKg*JuMA55-|$^a%st8f`xC~6eRKRrto^Yk`F~`vn8cC%zvTZV z|KBTTz&x_#|Nl0*eCDkO3g%<6TSjefT8oNl$`?QMi~Jx8hytR3C?E=m0-}H@APR^AK~>=Y0Q)jN0ssI2 diff --git a/mapedit/CDialogy/Release/BuildLog.htm b/mapedit/CDialogy/Release/BuildLog.htm deleted file mode 100644 index 0f03d55008ed99c29f89b4918be7e3844efe6d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9544 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 - - - - - - - - - diff --git a/mapedit/CDialogy/Release/mt.dep b/mapedit/CDialogy/Release/mt.dep deleted file mode 100644 index 4d51d5a..0000000 --- a/mapedit/CDialogy/Release/mt.dep +++ /dev/null @@ -1 +0,0 @@ -Manifest resource last updated at 20:26:01,30 on st 11.09.2013 diff --git a/mapedit/CDialogy/Release/vc80.idb b/mapedit/CDialogy/Release/vc80.idb deleted file mode 100644 index 95fa02df9d0fe3e3c1be2dd257a25f1f9d611c66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117760 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 lx-#orhcqBf$Sh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mapedit/CSpells/Debug/BuildLog.htm b/mapedit/CSpells/Debug/BuildLog.htm deleted file mode 100644 index 0d178e08dbfb1b70cb50c5c2284c6e86c7ad303d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23022 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∋;nX>)JW?Fzuss$ffWz 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 diff --git a/mapedit/CSpells/Debug/CSpells.exe.embed.manifest b/mapedit/CSpells/Debug/CSpells.exe.embed.manifest deleted file mode 100644 index 11bb704..0000000 --- a/mapedit/CSpells/Debug/CSpells.exe.embed.manifest +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/mapedit/CSpells/Debug/CSpells.exe.embed.manifest.res b/mapedit/CSpells/Debug/CSpells.exe.embed.manifest.res deleted file mode 100644 index 9c8df0e3c8e374037f6a16f24fed3e764becd3f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcma)2yG{c!5Hu1ENc5D}_LoaUgCgHW6d*;Spa6Qu*$Wna2(Ryy`w@PIf=}WT!t%IN zA{tg&YuB?g>#-0*NY35vC%HU`*P{VH=NWD|rsCvy82Wg7SBtH8vcp6+h6-krDM$<^ zu5H*<@Nj=qT!N&m!& - - - - - - - - - diff --git a/mapedit/CSpells/Debug/mt.dep b/mapedit/CSpells/Debug/mt.dep deleted file mode 100644 index 63ead3c..0000000 --- a/mapedit/CSpells/Debug/mt.dep +++ /dev/null @@ -1 +0,0 @@ -Manifest resource last updated at 21:19:30,58 on st 11.09.2013 diff --git a/mapedit/CSpells/Debug/vc80.idb b/mapedit/CSpells/Debug/vc80.idb deleted file mode 100644 index 00088c025bd84ba58c17a2e999c829ce5f2b26e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125952 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 Bm4g5P diff --git a/mapedit/CSpells/Release/BuildLog.htm b/mapedit/CSpells/Release/BuildLog.htm deleted file mode 100644 index 2e4d8809fde2b2227d36454053c15d1708e131ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9048 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 - - - - - - - - - diff --git a/mapedit/CSpells/Release/mt.dep b/mapedit/CSpells/Release/mt.dep deleted file mode 100644 index d15065b..0000000 --- a/mapedit/CSpells/Release/mt.dep +++ /dev/null @@ -1 +0,0 @@ -Manifest resource last updated at 20:25:58,79 on st 11.09.2013 diff --git a/mapedit/CSpells/Release/vc80.idb b/mapedit/CSpells/Release/vc80.idb deleted file mode 100644 index f844f799e484da40841057e91f6406a565b91dc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117760 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 Sgn$qb0zyCt2!WRif&T>;g~UYw diff --git a/mapedit/CSpells/Release/vc90.idb b/mapedit/CSpells/Release/vc90.idb deleted file mode 100644 index fd9d5c541f0dc503980c8ba0c9acf03fc85c56a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134144 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 -#include - -// TODO: reference additional headers your program requires here diff --git a/mapedit/ColEdit/ColEdit.cpp b/mapedit/ColEdit/ColEdit.cpp deleted file mode 100644 index 60c947c..0000000 --- a/mapedit/ColEdit/ColEdit.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// ColEdit.cpp : Defines the class behaviors for the application. -// - -#include "stdafx.h" -#include "ColEdit.h" -#include "ColEditDlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CColEditApp - -BEGIN_MESSAGE_MAP(CColEditApp, CWinApp) - //{{AFX_MSG_MAP(CColEditApp) - // NOTE - the ClassWizard will add and remove mapping macros here. - // DO NOT EDIT what you see in these blocks of generated code! - //}}AFX_MSG - ON_COMMAND(ID_HELP, CWinApp::OnHelp) -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CColEditApp construction - -CColEditApp::CColEditApp() -{ - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - -///////////////////////////////////////////////////////////////////////////// -// The one and only CColEditApp object - -CColEditApp theApp; - -///////////////////////////////////////////////////////////////////////////// -// CColEditApp initialization - -BOOL CColEditApp::InitInstance() -{ - // Standard initialization - // If you are not using these features and wish to reduce the size - // of your final executable, you should remove from the following - // the specific initialization routines you do not need. -/* -#ifdef _AFXDLL - Enable3dControls(); // Call this when using MFC in a shared DLL -#else - Enable3dControlsStatic(); // Call this when linking to MFC statically -#endif -*/ - CColEditDlg dlg; - m_pMainWnd = &dlg; - int nResponse = dlg.DoModal(); - if (nResponse == IDOK) - { - // TODO: Place code here to handle when the dialog is - // dismissed with OK - } - else if (nResponse == IDCANCEL) - { - // TODO: Place code here to handle when the dialog is - // dismissed with Cancel - } - - // Since the dialog has been closed, return FALSE so that we exit the - // application, rather than start the application's message pump. - return FALSE; -} diff --git a/mapedit/ColEdit/ColEdit.h b/mapedit/ColEdit/ColEdit.h deleted file mode 100644 index 5013faf..0000000 --- a/mapedit/ColEdit/ColEdit.h +++ /dev/null @@ -1,49 +0,0 @@ -// ColEdit.h : main header file for the COLEDIT application -// - -#if !defined(AFX_COLEDIT_H__4A70A254_5D3A_4703_9034_4EE5A90DFE73__INCLUDED_) -#define AFX_COLEDIT_H__4A70A254_5D3A_4703_9034_4EE5A90DFE73__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - -///////////////////////////////////////////////////////////////////////////// -// CColEditApp: -// See ColEdit.cpp for the implementation of this class -// - -class CColEditApp : public CWinApp -{ -public: - CColEditApp(); - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CColEditApp) - public: - virtual BOOL InitInstance(); - //}}AFX_VIRTUAL - -// Implementation - - //{{AFX_MSG(CColEditApp) - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code ! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_COLEDIT_H__4A70A254_5D3A_4703_9034_4EE5A90DFE73__INCLUDED_) diff --git a/mapedit/ColEdit/ColEdit.rc b/mapedit/ColEdit/ColEdit.rc deleted file mode 100644 index cb6985d..0000000 --- a/mapedit/ColEdit/ColEdit.rc +++ /dev/null @@ -1,281 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Czech resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) -#ifdef _WIN32 -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -#pragma code_page(1250) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#endif //_WIN32\r\n" - "#include ""res\\ColEdit.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON "res\\ColEdit.ico" -IDI_UP ICON "res\\icon1.ico" -IDI_DOWN ICON "res\\down.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_EDITPALETTE DIALOG 200, 0, 336, 301 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Edit Palette" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,77,280,50,14 - PUSHBUTTON "Cancel",IDCANCEL,143,280,50,14 - CONTROL "",IDC_PALETA,"Static",SS_BLACKFRAME | SS_NOTIFY,7,7,322, - 188 - LTEXT "Barva",IDC_STATIC,7,206,20,8 - CONTROL "Slider1",IDC_BARVA,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,35,204,294,15 - LTEXT "Sitost",IDC_STATIC,7,226,18,8 - CONTROL "Slider1",IDC_SITOST,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,35,224,294,15 - LTEXT "Jas",IDC_STATIC,7,246,12,8 - CONTROL "Slider1",IDC_JAS,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,35,244,294,15 - PUSHBUTTON "Undo",IDC_UNDO,209,280,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_EDITPALETTE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 329 - TOPMARGIN, 7 - BOTTOMMARGIN, 294 - HORZGUIDE, 195 - END -END -#endif // APSTUDIO_INVOKED - -#endif // Czech resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG 0, 0, 235, 55 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About ColEdit" -FONT 8, "MS Sans Serif" -BEGIN - ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 - LTEXT "ColEdit Version 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX - LTEXT "Copyright (C) 2005",IDC_STATIC,40,25,119,8 - DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP -END - -IDD_COLEDIT_DIALOG DIALOGEX 0, 0, 484, 330 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "ColEdit" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - LISTBOX IDC_COLORLIST,7,7,50,152,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Insert",IDC_INSERT,7,210,50,14 - PUSHBUTTON "Delete",IDC_DELETE,7,246,50,14 - DEFPUSHBUTTON "Save",IDOK,7,263,50,14 - PUSHBUTTON "Quit",IDCANCEL,7,309,50,14 - CONTROL "",IDC_IMAGE,"Static",SS_BLACKFRAME,61,7,416,299 - PUSHBUTTON "Load",IDC_LOAD,7,292,50,14 - COMBOBOX IDC_IMAGESEL,372,311,105,114,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Duplicate",IDC_DUPLICATE,7,227,50,14 - PUSHBUTTON "Up",IDC_UP,7,163,50,18,BS_ICON - PUSHBUTTON "Down",IDC_DOWN,7,182,50,18,BS_ICON - PUSHBUTTON "Oprav paletu",IDC_OPRAVPALETU,61,309,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END - - IDD_COLEDIT_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 477 - VERTGUIDE, 61 - TOPMARGIN, 7 - BOTTOMMARGIN, 323 - HORZGUIDE, 306 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "FileDescription", "ColEdit MFC Application" - VALUE "FileVersion", "1, 0, 0, 1" - VALUE "InternalName", "ColEdit" - VALUE "LegalCopyright", "Copyright (C) 2005" - VALUE "OriginalFilename", "ColEdit.EXE" - VALUE "ProductName", "ColEdit Application" - VALUE "ProductVersion", "1, 0, 0, 1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_ABOUTBOX "&About ColEdit..." - IDS_PALETANAME "Paleta %d" - IDS_COLFILTER "Skeldal palette list (*.col)|*.col||" - IDS_LOADFAILED "Load failed." - IDS_PALFILTER "JASC Palette (ex: IrfanView)|*.pal|All files|*.*|" - IDS_NOVAPALETA "" - IDS_SAVEFAILED "Nemohu soubor uloit" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#pragma code_page(1252) -#endif //_WIN32 -#include "res\ColEdit.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/mapedit/ColEdit/ColEdit.sln b/mapedit/ColEdit/ColEdit.sln deleted file mode 100644 index a110117..0000000 --- a/mapedit/ColEdit/ColEdit.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ColEdit", "ColEdit.vcproj", "{0ED4C971-BCD5-4E05-890D-26C8E2FAE867}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {0ED4C971-BCD5-4E05-890D-26C8E2FAE867}.Debug.ActiveCfg = Debug|Win32 - {0ED4C971-BCD5-4E05-890D-26C8E2FAE867}.Debug.Build.0 = Debug|Win32 - {0ED4C971-BCD5-4E05-890D-26C8E2FAE867}.Release.ActiveCfg = Release|Win32 - {0ED4C971-BCD5-4E05-890D-26C8E2FAE867}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/mapedit/ColEdit/ColEdit.vcproj b/mapedit/ColEdit/ColEdit.vcproj deleted file mode 100644 index 11b66e5..0000000 --- a/mapedit/ColEdit/ColEdit.vcproj +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mapedit/ColEdit/ColEditDlg.cpp b/mapedit/ColEdit/ColEditDlg.cpp deleted file mode 100644 index 798b8af..0000000 --- a/mapedit/ColEdit/ColEditDlg.cpp +++ /dev/null @@ -1,489 +0,0 @@ -// ColEditDlg.cpp : implementation file -// - -#include "stdafx.h" -#include "ColEdit.h" -#include "ColEditDlg.h" -#include "..\..\LIBS\PCX.H" -#include "EditPaletteDlg.h" -#include "../../DDLReader/WString.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CAboutDlg dialog used for App About - -class CAboutDlg : public CDialog -{ -public: - CAboutDlg(); - - // Dialog Data - //{{AFX_DATA(CAboutDlg) - enum { IDD = IDD_ABOUTBOX }; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAboutDlg) -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - - // Implementation -protected: - //{{AFX_MSG(CAboutDlg) - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) -{ - //{{AFX_DATA_INIT(CAboutDlg) - //}}AFX_DATA_INIT -} - -void CAboutDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CAboutDlg) - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) -//{{AFX_MSG_MAP(CAboutDlg) -// No message handlers -//}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CColEditDlg dialog - -CColEditDlg::CColEditDlg(CWnd* pParent /*=NULL*/) -: CDialog(CColEditDlg::IDD, pParent) -{ - //{{AFX_DATA_INIT(CColEditDlg) - //}}AFX_DATA_INIT - // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); - _palused=0; -} - -void CColEditDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CColEditDlg) - DDX_Control(pDX, IDC_UP, wUp); - DDX_Control(pDX, IDC_DOWN, wDown); - DDX_Control(pDX, IDC_IMAGESEL, wImageSel); - DDX_Control(pDX, IDC_IMAGE, wImage); - DDX_Control(pDX, IDC_COLORLIST, wColList); - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CColEditDlg, CDialog) -//{{AFX_MSG_MAP(CColEditDlg) -ON_WM_SYSCOMMAND() -ON_WM_PAINT() -ON_WM_QUERYDRAGICON() -ON_BN_CLICKED(IDC_LOAD, OnLoad) -ON_LBN_SELCHANGE(IDC_COLORLIST, OnSelchangeColorlist) -ON_CBN_SELCHANGE(IDC_IMAGESEL, OnSelchangeImagesel) -ON_BN_CLICKED(IDC_INSERT, OnInsert) -ON_BN_CLICKED(IDC_UP, OnUp) -ON_BN_CLICKED(IDC_DOWN, OnDown) -ON_BN_CLICKED(IDC_DUPLICATE, OnDuplicate) -ON_BN_CLICKED(IDC_DELETE, OnDelete) -ON_BN_CLICKED(IDC_OPRAVPALETU, OnOpravpaletu) -//}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CColEditDlg message handlers - -BOOL CColEditDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - // Add "About..." menu item to system menu. - - // IDM_ABOUTBOX must be in the system command range. - ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); - ASSERT(IDM_ABOUTBOX < 0xF000); - - CMenu* pSysMenu = GetSystemMenu(FALSE); - if (pSysMenu != NULL) - { - CString strAboutMenu; - strAboutMenu.LoadString(IDS_ABOUTBOX); - if (!strAboutMenu.IsEmpty()) - { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); - } - } - - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon - - wUp.SetIcon(AfxGetApp()->LoadIcon(IDI_UP)); - wDown.SetIcon(AfxGetApp()->LoadIcon(IDI_DOWN)); - - // TODO: Add extra initialization here - OnSelchangeColorlist(); - - return TRUE; // return TRUE unless you set the focus to a control -} - -void CColEditDlg::OnSysCommand(UINT nID, LPARAM lParam) -{ - if ((nID & 0xFFF0) == IDM_ABOUTBOX) - { - CAboutDlg dlgAbout; - dlgAbout.DoModal(); - } - else - { - CDialog::OnSysCommand(nID, lParam); - } -} - -// If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. - -void CColEditDlg::OnPaint() -{ - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } -} - -// The system calls this to obtain the cursor to display while the user drags -// the minimized window. -HCURSOR CColEditDlg::OnQueryDragIcon() -{ - return (HCURSOR) m_hIcon; -} - -void CColEditDlg::UpdateLB() -{ - CString name; - wColList.ResetContent(); - for (int i=0;i<_palused;i++) - { - name.Format(IDS_PALETANAME,_indexes[i]); - wColList.AddString(name); - } - if (_palusedEnableWindow(curSel>=0); - GetDlgItem(IDC_DUPLICATE)->EnableWindow(curSel>=0); - GetDlgItem(IDC_DELETE)->EnableWindow(curSel>=0); - GetDlgItem(IDC_UP)->EnableWindow(curSel>=0); - GetDlgItem(IDC_DOWN)->EnableWindow(curSel>=0); - GetDlgItem(IDC_OPRAVPALETU)->EnableWindow(curSel>=0); -} - -extern "C" -{ - - void *getmem(int32_t sz) - { - return malloc(sz); - } - -} - -void CColEditDlg::OnSelchangeImagesel() -{ - int i=wImageSel.GetCurSel(); - if (i!=-1) - { - CString pos; - wImageSel.GetLBText(i,pos); - int bsl=fname.ReverseFind('\\'); - pos=fname.Mid(0,bsl+1)+pos; - char * buffer; - memset(_stbuff,0,sizeof(_stbuff)); -#ifdef _UNICODE - WString pname(pos.GetString()); - const char *pcxname=pname.AsUTF8(pname); -#else - const char *pcxname=pos; -#endif - if (open_pcx(const_cast(pcxname),A_8BIT,&buffer)) return; - unsigned short *xy=(unsigned short *)buffer; - for (int y=0;y=0) - { - char *p=_palety[palid]; - for (int i=0;i<768;i++) - { - int item=0; - _ftscanf(f,_T("%d"),&item); - *p++=(char)item; - } - ok=true; - OnSelchangeImagesel(); - } - } - } - } - fclose(f); - if (!ok) - AfxMessageBox(IDS_LOADFAILED,MB_OK); - } -} - -int CColEditDlg::DuplicateCurrent() -{ - int i; - int curSel=wColList.GetCurSel(); - int saveCurSel=curSel; - if (curSel==_palused) curSel--; - if (curSel==-1) curSel=0; - for (i=MAX_PALET-1;i>curSel;i--) - { - memcpy(_palety[i],_palety[i-1],sizeof(_palety[i])); - _indexes[i]=_indexes[i-1]; - } - _palused++; - if (_palused>MAX_PALET) _palused=MAX_PALET; - int maxnum=0; - for (i=0;i<_palused;i++) - if (_indexes[i]>maxnum) maxnum=_indexes[i]; - _indexes[saveCurSel]=maxnum+1; - UpdateLB(); - wColList.SetCurSel(saveCurSel); - return saveCurSel; -} - - -void CColEditDlg::OnUp() -{ - int i; - int curSel=wColList.GetCurSel(); - if (curSel<1) return; - if (curSel>=_palused) return; - i=curSel; - char buff[768]; - memcpy(buff,_palety[i-1],sizeof(_palety[i])); - memcpy(_palety[i-1],_palety[i],sizeof(_palety[i])); - memcpy(_palety[i],buff,sizeof(_palety[i])); - int p=_indexes[i-1]; - _indexes[i-1]=_indexes[i]; - _indexes[i]=p; - curSel--; - UpdateLB(); - wColList.SetCurSel(curSel); -} - -void CColEditDlg::OnDown() -{ - int i; - int curSel=wColList.GetCurSel(); - if (curSel<0) return; - if (curSel>=_palused-1) return; - i=curSel; - char buff[768]; - memcpy(buff,_palety[i+1],sizeof(_palety[i])); - memcpy(_palety[i+1],_palety[i],sizeof(_palety[i])); - memcpy(_palety[i],buff,sizeof(_palety[i])); - int p=_indexes[i+1]; - _indexes[i+1]=_indexes[i]; - _indexes[i]=p; - curSel++; - UpdateLB(); - wColList.SetCurSel(curSel); - -} - -void CColEditDlg::OnDuplicate() -{ - DuplicateCurrent(); - OnSelchangeImagesel(); - -} - -void CColEditDlg::OnDelete() -{ - int i=wColList.GetCurSel(); - if (i<0) return; - if (i>=_palused) return; - for (int p=i+1;p<_palused;p++) - { - memcpy(_palety[p-1],_palety[p],sizeof(_palety[p])); - _indexes[p-1]=_indexes[p]; - } - _palused--; - UpdateLB(); - OnSelchangeColorlist(); -} - -void CColEditDlg::OnOK() -{ - if (fname=="") - { - CString filter; - filter.LoadString(IDS_COLFILTER); - CFileDialog fdlg(FALSE,_T("COL"),fname,OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT,filter); - if (fdlg.DoModal()!=IDOK) return; - fname=fdlg.GetPathName(); - } - if (SaveDocument(fname)==false) - AfxMessageBox(IDS_SAVEFAILED); - - -} - -bool CColEditDlg::SaveDocument(LPCTSTR name) -{ - HANDLE h=CreateFile(name,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); - if (h==INVALID_HANDLE_VALUE) return false; - for (int i=0;i<_palused;i++) - { - DWORD dummy[2]={0,0}; - DWORD result=0; - WriteFile(h,&dummy,8,&result,NULL); - if (result!=8) {CloseHandle(h);return false;} - WriteFile(h,_palety[i],768,&result,NULL); - if (result!=768) {CloseHandle(h);return false;} - } - CloseHandle(h); - return true; -} - -void CColEditDlg::OnOpravpaletu() -{ - CEditPaletteDlg dlg; - int i=wColList.GetCurSel(); - if (i<0) return; - dlg._palette=_palety[i]; - dlg._imgView=&wImage; - dlg.DoModal(); - -} diff --git a/mapedit/ColEdit/ColEditDlg.h b/mapedit/ColEdit/ColEditDlg.h deleted file mode 100644 index 042a041..0000000 --- a/mapedit/ColEdit/ColEditDlg.h +++ /dev/null @@ -1,79 +0,0 @@ -// ColEditDlg.h : header file -// - -#if !defined(AFX_COLEDITDLG_H__2FF53390_ECD2_468E_B1C9_60F1718D1470__INCLUDED_) -#define AFX_COLEDITDLG_H__2FF53390_ECD2_468E_B1C9_60F1718D1470__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -///////////////////////////////////////////////////////////////////////////// -// CColEditDlg dialog - - -#include "..\Podlahar\ImageView.h" -#define MAX_PALET 100 - -class CColEditDlg : public CDialog -{ -// Construction - char _palety[MAX_PALET][768]; - int _palused; - int _indexes[MAX_PALET]; - CString fname; - - char _stbuff[640*480]; - -public: - bool SaveDocument(LPCTSTR name); - int DuplicateCurrent(); - void UpdateCB(); - bool LoadDocument(LPCTSTR name); - void UpdateLB(); - CColEditDlg(CWnd* pParent = NULL); // standard constructor - -// Dialog Data - //{{AFX_DATA(CColEditDlg) - enum { IDD = IDD_COLEDIT_DIALOG }; - CButton wUp; - CButton wDown; - CComboBox wImageSel; - CImageView wImage; - CListBox wColList; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CColEditDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - HICON m_hIcon; - - // Generated message map functions - //{{AFX_MSG(CColEditDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnSysCommand(UINT nID, LPARAM lParam); - afx_msg void OnPaint(); - afx_msg HCURSOR OnQueryDragIcon(); - afx_msg void OnLoad(); - afx_msg void OnSelchangeColorlist(); - afx_msg void OnSelchangeImagesel(); - afx_msg void OnInsert(); - afx_msg void OnUp(); - afx_msg void OnDown(); - afx_msg void OnDuplicate(); - afx_msg void OnDelete(); - virtual void OnOK(); - afx_msg void OnOpravpaletu(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_COLEDITDLG_H__2FF53390_ECD2_468E_B1C9_60F1718D1470__INCLUDED_) diff --git a/mapedit/ColEdit/EditPaletteDlg.cpp b/mapedit/ColEdit/EditPaletteDlg.cpp deleted file mode 100644 index 85f7e58..0000000 --- a/mapedit/ColEdit/EditPaletteDlg.cpp +++ /dev/null @@ -1,233 +0,0 @@ -// EditPaletteDlg.cpp : implementation file -// - -#include "stdafx.h" -#include "ColEdit.h" -#include "EditPaletteDlg.h" -#include -#include - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CEditPaletteDlg dialog - - -CEditPaletteDlg::CEditPaletteDlg(CWnd* pParent /*=NULL*/) - : CDialog(CEditPaletteDlg::IDD, pParent) -{ - //{{AFX_DATA_INIT(CEditPaletteDlg) - //}}AFX_DATA_INIT -} - - -void CEditPaletteDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CEditPaletteDlg) - DDX_Control(pDX, IDC_SITOST, wSitost); - DDX_Control(pDX, IDC_JAS, wJas); - DDX_Control(pDX, IDC_BARVA, wBarva); - DDX_Control(pDX, IDC_PALETA, wPaleta); - //}}AFX_DATA_MAP -} - - -BEGIN_MESSAGE_MAP(CEditPaletteDlg, CDialog) - //{{AFX_MSG_MAP(CEditPaletteDlg) - ON_BN_CLICKED(IDC_PALETA, OnPaleta) - ON_WM_HSCROLL() - ON_BN_CLICKED(IDC_UNDO, OnUndo) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CEditPaletteDlg message handlers - -/* -RGB to HSV & HSV to RGB - -The Hue/Saturation/Value model was created by A. R. Smith in 1978. It is based on such intuitive color characteristics as tint, shade and tone (or family, purety and intensity). The coordinate system is cylindrical, and the colors are defined inside a hexcone. The hue value H runs from 0 to 360o. The saturation S is the degree of strength or purity and is from 0 to 1. Purity is how much white is added to the color, so S=1 makes the purest color (no white). Brightness V also ranges from 0 to 1, where 0 is the black. - -There is no transformation matrix for RGB/HSV conversion, but the algorithm follows: -*/ -// r,g,b values are from 0 to 1 -// h = [0,360], s = [0,1], v = [0,1] -// if s == 0, then h = -1 (undefined) -static void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v ) -{ - float min, max, delta; - min = __min( r, __min(g, b )); - max = __max( r, __max(g, b )); - *v = max; // v - delta = max - min; - if( max != 0 ) - *s = delta / max; // s - else { - // r = g = b = 0 // s = 0, v is undefined - *s = 0; - *h = -1; - return; - } - if( r == max ) - *h = ( g - b ) / delta; // between yellow & magenta - else if( g == max ) - *h = 2 + ( b - r ) / delta; // between cyan & yellow - else - *h = 4 + ( r - g ) / delta; // between magenta & cyan - *h *= 60; // degrees - if( *h < 0 ) - *h += 360; -} -static void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v ) -{ - int i; - float f, p, q, t; - if( s == 0 ) { - // achromatic (grey) - *r = *g = *b = v; - return; - } - h /= 60; // sector 0 to 5 - i = (int)floor( h ); - f = h - i; // factorial part of h - p = v * ( 1 - s ); - q = v * ( 1 - s * f ); - t = v * ( 1 - s * ( 1 - f ) ); - switch( i ) { - case 0: - *r = v; - *g = t; - *b = p; - break; - case 1: - *r = q; - *g = v; - *b = p; - break; - case 2: - *r = p; - *g = v; - *b = t; - break; - case 3: - *r = p; - *g = q; - *b = v; - break; - case 4: - *r = t; - *g = p; - *b = v; - break; - default: // case 5: - *r = v; - *g = p; - *b = q; - break; - } -} - - -BOOL CEditPaletteDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - memcpy(_paletteUndo,_palette,768); - wPaleta.SetPalette(_palette); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void CEditPaletteDlg::CalculateAvgHSV() -{ - float h,s,v,sh=0,ss=0,sv=0; - int cnt=0; - for (int i=0;i<256;i++) if (wPaleta.IsSelected(i)) - { - RGBtoHSV(wPaleta.GetR(i)/255.0f,wPaleta.GetG(i)/255.0f,wPaleta.GetB(i)/255.0f,&h,&s,&v); - if (!_finite(h)) h=0; - sh+=h; - ss+=s; - sv+=v; - cnt++; - } - if (cnt==0) return; - sh/=cnt; - ss/=cnt; - sv/=cnt; - wBarva.SetRange(0,359); - wBarva.SetPos((int)sh); - wSitost.SetRange(0,100); - wSitost.SetPos((int)(ss*100)); - wJas.SetRange(0,100); - wJas.SetPos((int)(sv*100)); - _curh=sh,_curv=sv,_curs=ss; - memcpy(_paletteScrl,_palette,768); - -} - -void CEditPaletteDlg::OnPaleta() -{ - CalculateAvgHSV(); -} - -void CEditPaletteDlg::OnCancel() -{ - memcpy(_palette,_paletteUndo,768); - wPaleta.Invalidate(FALSE); - _imgView->SetPalette(_palette); - _imgView->Invalidate(FALSE); - CDialog::OnCancel(); -} - -void CEditPaletteDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) -{ - float h,s,v; - float difh=wBarva.GetPos()-_curh; - float difs=(wSitost.GetPos()/100.0f)/_curs; - float difv=(wJas.GetPos()/100.0f)/_curv; - for (int i=0;i<256;i++) if (wPaleta.IsSelected(i)) - { - RGBtoHSV(_paletteScrl[i*3]/255.0f,_paletteScrl[i*3+1]/255.0f,_paletteScrl[i*3+2]/255.0f,&h,&s,&v); - if (!_finite(h)) h=0; - h+=difh; - while (h<0) {h+=360.0f;} - while (h>=360.0f) {h-=360.0f;} - if (s>0.001) - s*=difs; - else - s=wSitost.GetPos()/100.0f; - if (v>0.001) - v*=difv; - else - v=wJas.GetPos()/100.0f; - if (s<0) s=0; - if (s>1.0f) s=1.0f; - if (v<0) v=0; - if (v>1.0f) v=1.0f; - float r,g,b; - HSVtoRGB(&r,&g,&b,h,s,v); - _palette[i*3]=(int)(r*255.0f); - _palette[i*3+1]=(int)(g*255.0f); - _palette[i*3+2]=(int)(b*255.0f); - } - wPaleta.Invalidate(FALSE); - wPaleta.UpdateWindow(); - _imgView->SetPalette(_palette); - _imgView->Invalidate(FALSE); - _imgView->UpdateWindow(); -} - -void CEditPaletteDlg::OnUndo() -{ - memcpy(_palette,_paletteScrl,768); - wPaleta.Invalidate(FALSE); - _imgView->SetPalette(_palette); - _imgView->Invalidate(FALSE); -} diff --git a/mapedit/ColEdit/EditPaletteDlg.h b/mapedit/ColEdit/EditPaletteDlg.h deleted file mode 100644 index a574351..0000000 --- a/mapedit/ColEdit/EditPaletteDlg.h +++ /dev/null @@ -1,63 +0,0 @@ -#if !defined(AFX_EDITPALETTEDLG_H__8ED55BD3_E477_4C1A_80E7_D79CDA43A55E__INCLUDED_) -#define AFX_EDITPALETTEDLG_H__8ED55BD3_E477_4C1A_80E7_D79CDA43A55E__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -// EditPaletteDlg.h : header file -// - -///////////////////////////////////////////////////////////////////////////// -// CEditPaletteDlg dialog - -#include "PaletteEditor.h" -#include "..\Podlahar\ImageView.h" - -class CEditPaletteDlg : public CDialog -{ -// Construction - char _paletteUndo[768]; - char _paletteScrl[768]; - float _curh,_curv,_curs; -public: - CEditPaletteDlg(CWnd* pParent = NULL); // standard constructor - char *_palette; - CImageView *_imgView; - - -// Dialog Data - //{{AFX_DATA(CEditPaletteDlg) - enum { IDD = IDD_EDITPALETTE }; - CSliderCtrl wSitost; - CSliderCtrl wJas; - CSliderCtrl wBarva; - CPaletteEditor wPaleta; - //}}AFX_DATA - - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CEditPaletteDlg) - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - //}}AFX_VIRTUAL - -// Implementation -protected: - void CalculateAvgHSV(); - - // Generated message map functions - //{{AFX_MSG(CEditPaletteDlg) - virtual BOOL OnInitDialog(); - afx_msg void OnPaleta(); - virtual void OnCancel(); - afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); - afx_msg void OnUndo(); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_EDITPALETTEDLG_H__8ED55BD3_E477_4C1A_80E7_D79CDA43A55E__INCLUDED_) diff --git a/mapedit/ColEdit/PaletteEditor.cpp b/mapedit/ColEdit/PaletteEditor.cpp deleted file mode 100644 index 3f41f36..0000000 --- a/mapedit/ColEdit/PaletteEditor.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// PaletteEditor.cpp : implementation file -// - -#include "stdafx.h" -#include "ColEdit.h" -#include "PaletteEditor.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CPaletteEditor - -CPaletteEditor::CPaletteEditor() -{ - memset(_selection,0,sizeof(_selection)); -} - -CPaletteEditor::~CPaletteEditor() -{ -} - - -BEGIN_MESSAGE_MAP(CPaletteEditor, CStatic) - //{{AFX_MSG_MAP(CPaletteEditor) - ON_WM_PAINT() - ON_WM_LBUTTONDOWN() - ON_WM_MOUSEMOVE() - ON_WM_LBUTTONUP() - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CPaletteEditor message handlers - -void CPaletteEditor::OnPaint() -{ - CPaintDC dc(this); // device context for painting - CRect rc; - GetClientRect(&rc); - char *p=_palette; - - for (int i=0;i<16;i++) - for (int j=0;j<16;j++) - { - int x1=rc.right*j/16; - int y1=rc.bottom*i/16; - int x2=rc.right*(j+1)/16-1; - int y2=rc.bottom*(i+1)/16-1; - - COLORREF ref=RGB(p[0],p[1],p[2]); - bool white=(p[0]*0.3+p[1]*0.5+p[2]*0.2)<128; - p+=3; - dc.FillSolidRect(x1,y1,x2-x1,y2-y1,ref); - dc.SelectStockObject(white?WHITE_PEN:BLACK_PEN); - if (!_selection[i*16+j]) - { - dc.SelectStockObject(HOLLOW_BRUSH); - dc.Rectangle(x1,y1,x2,y2); - dc.MoveTo(x1,y1);dc.LineTo(x2,y2); - dc.MoveTo(x1,y2);dc.LineTo(x2,y1); - } - } -} - // Do not call CStatic::OnPaint() for painting message} - - -void CPaletteEditor::OnLButtonDown(UINT nFlags, CPoint point) -{ - int pt=IndexFromPoint(point); - if (!(nFlags & MK_CONTROL)) - memset(_selection,0,sizeof(_selection)); - if (pt>=0 && pt<256) - _selection[pt]=!_selection[pt]; - _drawsel=_selection[pt]; - Invalidate(); - SetCapture(); -} - - -void CPaletteEditor::OnMouseMove(UINT nFlags, CPoint point) -{ - if (GetCapture()==this) - { - int pt=IndexFromPoint(point); - if (pt>=0 && pt<256) - _selection[pt]=_drawsel; - Invalidate(); - } -} - -int CPaletteEditor::IndexFromPoint(CPoint pt) -{ - CRect rc; - GetClientRect(&rc); - int x=pt.x*16/rc.right; - int y=pt.y*16/rc.bottom; - int ret=y*16+x; - return ret; -} - -void CPaletteEditor::OnLButtonUp(UINT nFlags, CPoint point) -{ - if (GetCapture()==this) - { - ReleaseCapture(); - GetParent()->SendNotifyMessage(WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(),BN_CLICKED),(LPARAM)GetSafeHwnd()); - } - -} diff --git a/mapedit/ColEdit/PaletteEditor.h b/mapedit/ColEdit/PaletteEditor.h deleted file mode 100644 index 272376c..0000000 --- a/mapedit/ColEdit/PaletteEditor.h +++ /dev/null @@ -1,61 +0,0 @@ -#if !defined(AFX_PALETTEEDITOR_H__45E6ACB6_CCFC_47F4_906C_BF0D2E76E2FE__INCLUDED_) -#define AFX_PALETTEEDITOR_H__45E6ACB6_CCFC_47F4_906C_BF0D2E76E2FE__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -// PaletteEditor.h : header file -// - -///////////////////////////////////////////////////////////////////////////// -// CPaletteEditor window - -class CPaletteEditor : public CStatic -{ -// Construction - char *_palette; - bool _selection[256]; - bool _drawsel; -public: - CPaletteEditor(); - - void SetPalette(char *pal) {_palette=pal;} - bool IsSelected(int p) {return _selection[p];} - int GetR(int p) {return _palette[p*3];} - int GetG(int p) {return _palette[p*3+1];} - int GetB(int p) {return _palette[p*3+2];} - -// Attributes -public: - -// Operations -public: - -// Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CPaletteEditor) - //}}AFX_VIRTUAL - -// Implementation -public: - int IndexFromPoint(CPoint pt); - virtual ~CPaletteEditor(); - - // Generated message map functions -protected: - //{{AFX_MSG(CPaletteEditor) - afx_msg void OnPaint(); - afx_msg void OnLButtonDown(UINT nFlags, CPoint point); - afx_msg void OnMouseMove(UINT nFlags, CPoint point); - afx_msg void OnLButtonUp(UINT nFlags, CPoint point); - //}}AFX_MSG - - DECLARE_MESSAGE_MAP() -}; - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_PALETTEEDITOR_H__45E6ACB6_CCFC_47F4_906C_BF0D2E76E2FE__INCLUDED_) diff --git a/mapedit/ColEdit/StdAfx.cpp b/mapedit/ColEdit/StdAfx.cpp deleted file mode 100644 index d74f23c..0000000 --- a/mapedit/ColEdit/StdAfx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// ColEdit.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - - - diff --git a/mapedit/ColEdit/StdAfx.h b/mapedit/ColEdit/StdAfx.h deleted file mode 100644 index bb1666b..0000000 --- a/mapedit/ColEdit/StdAfx.h +++ /dev/null @@ -1,26 +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__5BFBE43D_BB22_424B_B397_EA20C9E39657__INCLUDED_) -#define AFX_STDAFX_H__5BFBE43D_BB22_424B_B397_EA20C9E39657__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -#include // MFC core and standard components -#include // MFC extensions -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__5BFBE43D_BB22_424B_B397_EA20C9E39657__INCLUDED_) diff --git a/mapedit/ColEdit/res/ColEdit.ico b/mapedit/ColEdit/res/ColEdit.ico deleted file mode 100644 index 7eef0bcbe6580a6f464d688906172c2d9de44262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmc&zF>b>!3}jLb9s)T}@Kod(893@u8ajANzT`op9^o+)S?=nU(FD@%0s)Sg^oyC8{H z9myetc;MEP)59v(LMa~xK8Yu^jIR*H22uCFiq5%C{s7(PJi>o15i^bmX4(vPxWAio z9ryY#AU_jfnd047-@`)XzL?%iS$gQyFP{44kS9X)fN{{QoL~hO-&=q&20Zr*cxFAt PkaNE{wR~2C$NfnjhSXWT diff --git a/mapedit/ColEdit/res/ColEdit.rc2 b/mapedit/ColEdit/res/ColEdit.rc2 deleted file mode 100644 index 867ae26..0000000 --- a/mapedit/ColEdit/res/ColEdit.rc2 +++ /dev/null @@ -1,13 +0,0 @@ -// -// COLEDIT.RC2 - resources Microsoft Visual C++ does not edit directly -// - -#ifdef APSTUDIO_INVOKED - #error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/mapedit/ColEdit/res/down.ico b/mapedit/ColEdit/res/down.ico deleted file mode 100644 index 40df50aee29841b4fb81235f11490e1fb233f761..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmeHFAr62r5bFpD5)_t6egQw@p0=kTkw^rg^q3_9552X$yG|_wf-1%aj->!vc`rtB z6az{rV9M@c3YC~;ld45ZN$vr!1JXNDvG~UAgE%j;FvO?mbYRQ zdoduF0!i65l0qdZohDTaGn0G3(^b diff --git a/mapedit/ColEdit/resource.h b/mapedit/ColEdit/resource.h deleted file mode 100644 index c9ce4fa..0000000 --- a/mapedit/ColEdit/resource.h +++ /dev/null @@ -1,44 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by ColEdit.rc -// -#define IDM_ABOUTBOX 0x0010 -#define IDD_ABOUTBOX 100 -#define IDS_ABOUTBOX 101 -#define IDD_COLEDIT_DIALOG 102 -#define IDS_PALETANAME 102 -#define IDS_COLFILTER 103 -#define IDS_LOADFAILED 104 -#define IDS_PALFILTER 105 -#define IDS_NOVAPALETA 106 -#define IDS_SAVEFAILED 107 -#define IDR_MAINFRAME 128 -#define IDI_UP 129 -#define IDI_DOWN 130 -#define IDD_EDITPALETTE 131 -#define IDC_COLORLIST 1000 -#define IDC_INSERT 1001 -#define IDC_DELETE 1002 -#define IDC_IMAGE 1003 -#define IDC_LOAD 1004 -#define IDC_IMAGESEL 1005 -#define IDC_DUPLICATE 1006 -#define IDC_BARVA 1006 -#define IDC_UP 1007 -#define IDC_SITOST 1007 -#define IDC_DOWN 1008 -#define IDC_JAS 1008 -#define IDC_PALETA 1009 -#define IDC_OPRAVPALETU 1010 -#define IDC_UNDO 1011 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 132 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1012 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/mapedit/ItemIcons/DlgOpen.cpp b/mapedit/ItemIcons/DlgOpen.cpp deleted file mode 100644 index 4d739bb..0000000 --- a/mapedit/ItemIcons/DlgOpen.cpp +++ /dev/null @@ -1,184 +0,0 @@ -// DlgOpen.cpp : implementation file -// - -#include "stdafx.h" -#include "ItemIcons.h" -#include "iconviewerbutton.h" -#include "DlgOpen.h" - - -// DlgOpen dialog - -IMPLEMENT_DYNAMIC(DlgOpen, CDialog) -DlgOpen::DlgOpen(CWnd* pParent /*=NULL*/) - : CDialog(DlgOpen::IDD, pParent) -{ -} - -DlgOpen::~DlgOpen() -{ -} - -void DlgOpen::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - for (int i=0;i<18;i++) - DDX_Control(pDX, IDC_ICON1+i, icons[i]); - DDX_Control(pDX, IDC_LIST, wList); -} - - -BEGIN_MESSAGE_MAP(DlgOpen, CDialog) - ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse) - ON_LBN_DBLCLK(IDC_LIST, OnLbnDblclkList) - ON_WM_DESTROY() - ON_LBN_SELCHANGE(IDC_LIST, OnLbnSelchangeList) -END_MESSAGE_MAP() - - -// DlgOpen message handlers - -BOOL DlgOpen::OnInitDialog() -{ - CDialog::OnInitDialog(); - ReadFolder(); - _iconlib=new char[ICONLIBSIZE]; - ZeroMemory(_iconlib,ICONLIBSIZE); - for (int i=0;i<18;i++) icons[i]._data=GETICONADDR(i); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} - -void DlgOpen::ReadFolder(void) -{ - wList.ResetContent(); - CFileFind fnd; - BOOL ok=fnd.FindFile(_umisteni+_T("ikony*.lib")); - while (ok) - { - ok=fnd.FindNextFile(); - wList.AddString(fnd.GetFileName()); - } - CString createnew; - createnew.LoadString(IDS_CREATENEW); - int index=wList.AddString(createnew); - wList.SetItemData(index,1); -} - -static int WINAPI PosBrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData) - { - const _TCHAR *curpath=(const _TCHAR *)lpData; - if (uMsg == BFFM_INITIALIZED) - { - if (curpath && curpath[0]) - { - ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)((LPCSTR)curpath)); - ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)((LPCSTR)curpath)); - } - } - else if (uMsg == BFFM_SELCHANGED) - { - _TCHAR buff[_MAX_PATH]; - if (SHGetPathFromIDList((LPITEMIDLIST)lParam,buff)) - { - ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buff); - } - } - return 0; - }; - -static bool PathBrowser(HWND hWnd, _TCHAR *path /* MAX_PATH size */) -{ - BROWSEINFO brw; - memset(&brw,0,sizeof(brw)); - brw.hwndOwner=hWnd; - brw.pidlRoot=NULL; - brw.pszDisplayName=path; - brw.lParam=(LPARAM)path; - brw.ulFlags= BIF_RETURNONLYFSDIRS |BIF_STATUSTEXT|BIF_USENEWUI ; - brw.lpfn = (BFFCALLBACK)(PosBrowseCallbackProc); - LPITEMIDLIST il=SHBrowseForFolder( &brw ); - if (il==NULL) return false; - SHGetPathFromIDList(il,path); - IMalloc *shmalloc; - SHGetMalloc(&shmalloc); - shmalloc->Free(il); - if (path[0]==0) return false; - return true; -} - - -void DlgOpen::OnBnClickedBrowse() -{ - _TCHAR buffer[MAX_PATH+1]; - _tcsncpy(buffer,_umisteni,MAX_PATH); - if (PathBrowser(*this,buffer)) - _umisteni=buffer; - if (_umisteni.GetLength() && _umisteni[_umisteni.GetLength()-1]!='\\') - _umisteni=_umisteni+'\\'; - ReadFolder(); -} - -void DlgOpen::OnOK() -{ - int sel=wList.GetCurSel(); - if (sel<0) return; - CString name; - if (wList.GetItemData(sel)==1) - { - int i=-1; - do - { - i++; - name.Format(_T("IKONY%02d.LIB"),i); - _selected=_umisteni+name; - } - while (_tcheck_file_exists( _selected)==0); - } - else - { - wList.GetText(sel,name); - _selected=_umisteni+name; - } - CDialog::OnOK(); -} - - -CString DlgOpen::GetSelectedFile() -{ - return _selected; -} - -void DlgOpen::OnLbnDblclkList() -{ -OnOK(); -} - -void DlgOpen::OnDestroy() -{ - delete [] _iconlib; -} - -void DlgOpen::OnLbnSelchangeList() -{ - ZeroMemory(_iconlib,ICONLIBSIZE); - int sel=wList.GetCurSel(); - if (sel>=0) - { - CString name; - if (wList.GetItemData(sel)!=1) - { - wList.GetText(sel,name); - _selected=_umisteni+name; - HANDLE h=CreateFile(_selected,GENERIC_READ,0,0,OPEN_EXISTING,0,0); - if (h!=INVALID_HANDLE_VALUE) - { - DWORD rd; - ReadFile(h,_iconlib,ICONLIBSIZE,&rd,0); - CloseHandle(h); - } - } - } - for (int i=0;i<18;i++) icons[i].Invalidate(); -} diff --git a/mapedit/ItemIcons/DlgOpen.h b/mapedit/ItemIcons/DlgOpen.h deleted file mode 100644 index a48f516..0000000 --- a/mapedit/ItemIcons/DlgOpen.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -#include "afxwin.h" - - -// DlgOpen dialog - -class DlgOpen : public CDialog -{ - DECLARE_DYNAMIC(DlgOpen) - CString _umisteni; - CString _selected; - char *_iconlib; - CIconViewerButton icons[18]; - -public: - DlgOpen(CWnd* pParent = NULL); // standard constructor - virtual ~DlgOpen(); - -// Dialog Data - enum { IDD = IDD_OPENDLG }; - -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - - DECLARE_MESSAGE_MAP() -public: - virtual BOOL OnInitDialog(); - void ReadFolder(void); - CListBox wList; - afx_msg void OnBnClickedBrowse(); - CString GetSelectedFile(); -protected: - virtual void OnOK(); -public: - afx_msg void OnLbnDblclkList(); - afx_msg void OnDestroy(); - afx_msg void OnLbnSelchangeList(); -}; diff --git a/mapedit/ItemIcons/IconViewerButton.cpp b/mapedit/ItemIcons/IconViewerButton.cpp deleted file mode 100644 index 64d3424..0000000 --- a/mapedit/ItemIcons/IconViewerButton.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// IconViewerButton.cpp : implementation file -// - -#include "stdafx.h" -#include "ItemIcons.h" -#include "IconViewerButton.h" -#include ".\iconviewerbutton.h" - - -// CIconViewerButton - -IMPLEMENT_DYNAMIC(CIconViewerButton, CStatic) -CIconViewerButton::CIconViewerButton() -{ -} - -CIconViewerButton::~CIconViewerButton() -{ -} - - -BEGIN_MESSAGE_MAP(CIconViewerButton, CStatic) - ON_WM_PAINT() - ON_WM_SETCURSOR() -END_MESSAGE_MAP() - - - -// CIconViewerButton message handlers - - - -void CIconViewerButton::OnPaint() -{ - unsigned short *data=reinterpret_cast(_data); - if (data[0]!=45 && data[1]!=55 && data[2]!=8) - { - __super::OnPaint(); - return; - } - - - BitMapInfo bmpinfo; - ZeroMemory(&bmpinfo,sizeof(bmpinfo)); - bmpinfo.hdr.biSize=sizeof(bmpinfo.hdr); - bmpinfo.hdr.biBitCount=8; - bmpinfo.hdr.biCompression=BI_RGB; - bmpinfo.hdr.biHeight=55; - bmpinfo.hdr.biPlanes=1; - bmpinfo.hdr.biWidth=45; - for (int i=0;i<256;i++) - { - RGBQUAD &col=bmpinfo.palette[i]; - col.rgbBlue=(data[i+3] & 0x1F)<<3; - col.rgbGreen=(data[i+3] & 0x3E0)>>2; - col.rgbRed=(data[i+3] & 0x7C00)>>7; - col.rgbReserved=0; - } - - bmpinfo.palette[0].rgbBlue=80; - bmpinfo.palette[0].rgbGreen=70; - bmpinfo.palette[0].rgbRed=60; - - char bitmap[55][48]; - char *p=reinterpret_cast(data+3+256); - for (int i=0;i<55;i++,p+=45) memcpy(bitmap[55-i-1],p,45); - - CPaintDC dc(this); - CRect rc; - GetClientRect(&rc); - dc.SetStretchBltMode(HALFTONE); - StretchDIBits(dc,0,0,rc.right,rc.bottom,0,0,45,55,bitmap,reinterpret_cast(&bmpinfo),DIB_RGB_COLORS,SRCCOPY); -} - -BOOL CIconViewerButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) -{ - if (pWnd==this) - { - HCURSOR h=LoadCursor(0,IDC_HAND); - ::SetCursor(h); - return TRUE; - } - else - return __super::OnSetCursor(pWnd,nHitTest,message); - -} diff --git a/mapedit/ItemIcons/IconViewerButton.h b/mapedit/ItemIcons/IconViewerButton.h deleted file mode 100644 index e7df456..0000000 --- a/mapedit/ItemIcons/IconViewerButton.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - - -// CIconViewerButton - - struct BitMapInfo - { - BITMAPINFOHEADER hdr; - RGBQUAD palette[256]; - }; - - -class CIconViewerButton : public CStatic -{ - DECLARE_DYNAMIC(CIconViewerButton) - -public: - CIconViewerButton(); - virtual ~CIconViewerButton(); - - void *_data; - -protected: - DECLARE_MESSAGE_MAP() -public: - afx_msg void OnPaint(); - afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); -}; - - diff --git a/mapedit/ItemIcons/ItemIcons.cpp b/mapedit/ItemIcons/ItemIcons.cpp deleted file mode 100644 index d62a712..0000000 --- a/mapedit/ItemIcons/ItemIcons.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// ItemIcons.cpp : Defines the class behaviors for the application. -// - -#include "stdafx.h" -#include "ItemIcons.h" -#include "ItemIconsDlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#endif - - -// CItemIconsApp - -BEGIN_MESSAGE_MAP(CItemIconsApp, CWinApp) - ON_COMMAND(ID_HELP, CWinApp::OnHelp) -END_MESSAGE_MAP() - - -// CItemIconsApp construction - -CItemIconsApp::CItemIconsApp() -{ - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - - -// The one and only CItemIconsApp object - -CItemIconsApp theApp; - - -// CItemIconsApp initialization - -BOOL CItemIconsApp::InitInstance() -{ - // InitCommonControls() is required on Windows XP if an application - // manifest specifies use of ComCtl32.dll version 6 or later to enable - // visual styles. Otherwise, any window creation will fail. - InitCommonControls(); - - CWinApp::InitInstance(); - - // Standard initialization - // If you are not using these features and wish to reduce the size - // of your final executable, you should remove from the following - // the specific initialization routines you do not need - // Change the registry key under which our settings are stored - // TODO: You should modify this string to be something appropriate - // such as the name of your company or organization - SetRegistryKey(_T("Local AppWizard-Generated Applications")); - - CItemIconsDlg dlg; - m_pMainWnd = &dlg; - INT_PTR nResponse = dlg.DoModal(); - if (nResponse == IDOK) - { - // TODO: Place code here to handle when the dialog is - // dismissed with OK - } - else if (nResponse == IDCANCEL) - { - // TODO: Place code here to handle when the dialog is - // dismissed with Cancel - } - - // Since the dialog has been closed, return FALSE so that we exit the - // application, rather than start the application's message pump. - return FALSE; -} diff --git a/mapedit/ItemIcons/ItemIcons.h b/mapedit/ItemIcons/ItemIcons.h deleted file mode 100644 index 629029f..0000000 --- a/mapedit/ItemIcons/ItemIcons.h +++ /dev/null @@ -1,31 +0,0 @@ -// ItemIcons.h : main header file for the PROJECT_NAME application -// - -#pragma once - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - - -// CItemIconsApp: -// See ItemIcons.cpp for the implementation of this class -// - -class CItemIconsApp : public CWinApp -{ -public: - CItemIconsApp(); - -// Overrides - public: - virtual BOOL InitInstance(); - -// Implementation - - DECLARE_MESSAGE_MAP() -}; - -extern CItemIconsApp theApp; \ No newline at end of file diff --git a/mapedit/ItemIcons/ItemIcons.rc b/mapedit/ItemIcons/ItemIcons.rc deleted file mode 100644 index 6352fa1..0000000 --- a/mapedit/ItemIcons/ItemIcons.rc +++ /dev/null @@ -1,354 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Czech resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) -#ifdef _WIN32 -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -#pragma code_page(1250) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1250)\r\n" - "#include ""res\\ItemIcons.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON "res\\ItemIcons.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_OPENDLG DIALOGEX 0, 0, 390, 175 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Otevt knihovnu ikon" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "Otevt",IDOK,7,118,92,14 - PUSHBUTTON "Cancel",IDCANCEL,7,153,91,14 - LISTBOX IDC_LIST,7,7,92,105,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Vybrat jin umstn",IDC_BROWSE,7,135,92,14 - CTEXT "",IDC_ICON1,104,6,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON2,151,6,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON3,198,6,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON4,245,6,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON5,292,6,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON6,339,6,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON7,104,62,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON8,151,62,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "Nhled",IDC_ICON9,198,62,44,51,SS_NOTIFY | - SS_CENTERIMAGE - CTEXT "",IDC_ICON10,245,62,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON11,292,62,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON12,339,62,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON13,104,118,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON14,151,118,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON15,198,118,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON16,245,118,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON17,292,118,44,51,SS_NOTIFY | SS_CENTERIMAGE - CTEXT "",IDC_ICON18,339,118,44,51,SS_NOTIFY | SS_CENTERIMAGE -END - -IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "About ItemIcons" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 - LTEXT "ItemIcons Version 1.0",IDC_STATIC,40,10,119,8, - SS_NOPREFIX - LTEXT "Copyright (C) 2005",IDC_STATIC,40,25,119,8 - DEFPUSHBUTTON "OK",IDOK,178,7,50,16,WS_GROUP -END - -IDD_ITEMICONS_DIALOG DIALOGEX 0, 0, 299, 224 -STYLE DS_SETFONT | DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | - WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_ACCEPTFILES | WS_EX_APPWINDOW -CAPTION "Icon Library" -MENU IDR_MAINMENU -FONT 10, "Microsoft Sans Serif", 400, 0, 0xEE -BEGIN - CTEXT "",IDC_ICON1,7,35,45,55,SS_NOTIFY | SS_CENTERIMAGE, - WS_EX_STATICEDGE - CTEXT "",IDC_ICON2,55,35,45,55,SS_NOTIFY | SS_CENTERIMAGE, - WS_EX_STATICEDGE - CTEXT "",IDC_ICON3,103,35,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON4,151,35,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON5,199,35,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON6,247,35,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON7,7,92,45,55,SS_NOTIFY | SS_CENTERIMAGE, - WS_EX_STATICEDGE - CTEXT "",IDC_ICON8,55,92,45,55,SS_NOTIFY | SS_CENTERIMAGE, - WS_EX_STATICEDGE - CTEXT "",IDC_ICON9,103,92,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON10,151,92,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON11,199,92,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON12,247,92,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON13,7,150,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON14,55,150,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON15,103,150,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON16,151,150,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON17,199,150,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_ICON18,247,150,45,55,SS_NOTIFY | - SS_CENTERIMAGE,WS_EX_STATICEDGE - LTEXT "Jmno souboru",IDC_STATIC,7,6,50,11 - EDITTEXT IDC_FILENAME,7,17,285,12,ES_AUTOHSCROLL | ES_READONLY - CONTROL "Pi vkldn do knihovny vybrat vhodnou transparetn barvu.", - IDC_TRANSPARENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6, - 208,193,10 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_OPENDLG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 383 - TOPMARGIN, 7 - BOTTOMMARGIN, 168 - END - - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END - - IDD_ITEMICONS_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 292 - TOPMARGIN, 6 - BOTTOMMARGIN, 217 - HORZGUIDE, 17 - HORZGUIDE, 29 - HORZGUIDE, 35 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINMENU MENUEX -BEGIN - MENUITEM "&Otevt", ID_OPEN,MFT_STRING,MFS_ENABLED - MENUITEM "&Uloit!", ID_SAVE,MFT_STRING,MFS_ENABLED - POPUP "&pravy", 65535,MFT_STRING,MFS_ENABLED - BEGIN - MENUITEM "&Koprovat", 57634,MFT_STRING,MFS_ENABLED - MENUITEM "&Vloi", 57637,MFT_STRING,MFS_ENABLED - MENUITEM "V&ymazat", ID_EDIT_DELETE,MFT_STRING, - MFS_ENABLED - MENUITEM MFT_SEPARATOR - MENUITEM "Koprovat &do souboru", 32792,MFT_STRING,MFS_ENABLED - MENUITEM "Vloit ze &souboru", 32793,MFT_STRING,MFS_ENABLED - MENUITEM MFT_SEPARATOR - MENUITEM "Koprovat v&e do souboru", 32794,MFT_STRING,MFS_ENABLED - END - MENUITEM "O &Aplikaci!", 32779, - MFT_STRING | MFT_RIGHTJUSTIFY,MFS_ENABLED -END - -IDR_POPUP MENU -BEGIN - POPUP "Popup" - BEGIN - MENUITEM "Import BMP", ID_POPUP_IMPORTBMP - MENUITEM "Export BMP", ID_POPUP_EXPORTBMP - MENUITEM SEPARATOR - MENUITEM "Copy", ID_POPUP_COPY - MENUITEM "Paste", ID_POPUP_PASTE - MENUITEM SEPARATOR - MENUITEM "Vymazat", ID_POPUP_VYMAZAT - END - POPUP "List" - BEGIN - MENUITEM "Obrzek", 1 - MENUITEM "Obrzek", 7 - MENUITEM "Obrzek", 13 - MENUITEM "Obrzek", 2, MENUBREAK - MENUITEM "Obrzek", 8 - MENUITEM "Obrzek", 14 - MENUITEM "Obrzek", 3, MENUBREAK - MENUITEM "Obrzek", 9 - MENUITEM "Obrzek", 15 - MENUITEM "Obrzek", 4, MENUBREAK - MENUITEM "Obrzek", 10 - MENUITEM "Obrzek", 16 - MENUITEM "Obrzek", 5, MENUBREAK - MENUITEM "Obrzek", 11 - MENUITEM "Obrzek", 17 - MENUITEM "Obrzek", 6, MENUBREAK - MENUITEM "Obrzek", 12 - MENUITEM "Obrzek", 18 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040504e4" - BEGIN - VALUE "CompanyName", "TODO: " - VALUE "FileDescription", "TODO: " - VALUE "FileVersion", "1.0.0.1" - VALUE "InternalName", "ItemIcons.exe" - VALUE "LegalCopyright", "TODO: (c) . All rights reserved." - VALUE "OriginalFilename", "ItemIcons.exe" - VALUE "ProductName", "TODO: " - VALUE "ProductVersion", "1.0.0.1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x405, 1250 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_ABOUTBOX "&About ItemIcons..." - IDS_CREATENEW "" - IDS_CHYBNYFORMAT "Chybn formt obrzku. Povolen je pouze obrzek ve formt Windows BMP o rozmrech 45x55 a bitov hloubce 8bit (256 barev) - bez kompresse" - IDS_CHYBAPRIULOZENI "Nepodailo se uloit knihovnu." -END - -STRINGTABLE -BEGIN - IDS_BMPFILTER "Obrzky v BMP (*.BMP - 45 x 55 x 256 barev)|*.bmp||" - IDS_NEPLATNYFORMATBMP "Soubor nebyl rozpoznn jako BMP" - IDS_NELZEOTEVRITSOUBOR "Soubor se nepodailo otevt" - IDS_CHYBAPRIZAPISU "Nastala nejaka chyba pri zapisu. Obrazek se nepodarilo ulozit" -END - -#endif // Czech resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE 9, 1 -#pragma code_page(1250) -#include "res\ItemIcons.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/mapedit/ItemIcons/ItemIcons.sln b/mapedit/ItemIcons/ItemIcons.sln deleted file mode 100644 index 0e97678..0000000 --- a/mapedit/ItemIcons/ItemIcons.sln +++ /dev/null @@ -1,30 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ItemIcons", "ItemIcons.vcproj", "{ADB487B3-9F9B-4B49-8B02-92F8B2B5D563}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SourceCodeControl) = preSolution - SccNumberOfProjects = 2 - SccLocalPath0 = . - CanCheckoutShared = false - SolutionUniqueID = {B21D216F-7A5B-43A2-BED6-A3AB49EF2F3D} - SccProjectUniqueName1 = ItemIcons.vcproj - SccLocalPath1 = . - CanCheckoutShared = false - EndGlobalSection - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {ADB487B3-9F9B-4B49-8B02-92F8B2B5D563}.Debug.ActiveCfg = Debug|Win32 - {ADB487B3-9F9B-4B49-8B02-92F8B2B5D563}.Debug.Build.0 = Debug|Win32 - {ADB487B3-9F9B-4B49-8B02-92F8B2B5D563}.Release.ActiveCfg = Release|Win32 - {ADB487B3-9F9B-4B49-8B02-92F8B2B5D563}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/mapedit/ItemIcons/ItemIcons.vcproj b/mapedit/ItemIcons/ItemIcons.vcproj deleted file mode 100644 index e6c5617..0000000 --- a/mapedit/ItemIcons/ItemIcons.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mapedit/ItemIcons/ItemIconsDlg.cpp b/mapedit/ItemIcons/ItemIconsDlg.cpp deleted file mode 100644 index c4800ad..0000000 --- a/mapedit/ItemIcons/ItemIconsDlg.cpp +++ /dev/null @@ -1,554 +0,0 @@ -// ItemIconsDlg.cpp : implementation file -// - - -#include "stdafx.h" -#include "ItemIcons.h" -#include "ItemIconsDlg.h" -#include ".\itemiconsdlg.h" -#include "DlgOpen.h" -#include - -#ifdef _DEBUG -#define new DEBUG_NEW -#endif - - -// CAboutDlg dialog used for App About - -class CAboutDlg : public CDialog -{ -public: - CAboutDlg(); - -// Dialog Data - enum { IDD = IDD_ABOUTBOX }; - - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - -// Implementation -protected: - DECLARE_MESSAGE_MAP() -public: -}; - -CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) -{ -} - -void CAboutDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); -} - -BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) -END_MESSAGE_MAP() - - -// CItemIconsDlg dialog - - - -CItemIconsDlg::CItemIconsDlg(CWnd* pParent /*=NULL*/) - : CDialog(CItemIconsDlg::IDD, pParent) - , _selicon(0) -{ - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); -} - -void CItemIconsDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - for (int i=0;i<18;i++) - DDX_Control(pDX, IDC_ICON1+i, icons[i]); - DDX_Control(pDX, IDC_FILENAME, wFilename); -} - -BEGIN_MESSAGE_MAP(CItemIconsDlg, CDialog) - ON_WM_SYSCOMMAND() - ON_WM_PAINT() - ON_WM_QUERYDRAGICON() - //}}AFX_MSG_MAP - ON_COMMAND(ID_OPEN, OnOpen) - ON_WM_CONTEXTMENU() - ON_COMMAND(ID_POPUP_PASTE, OnPopupPaste) - ON_COMMAND(ID_POPUP_COPY, OnPopupCopy) - ON_COMMAND(ID_POPUP_IMPORTBMP, OnPopupImportbmp) - ON_WM_DROPFILES() - ON_COMMAND(ID_POPUP_EXPORTBMP, OnPopupExportbmp) - ON_COMMAND(ID_EDIT_COPY, OnEditCopy) - ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) - ON_COMMAND_RANGE(IDC_ICON1,IDC_ICON18,OnClickIcon) - ON_COMMAND(ID_EDIT_EXPORT, OnEditExport) - ON_COMMAND(ID_EDIT_IMPORT, OnEditImport) - ON_COMMAND(ID_EDIT_EXPORTALL, OnEditExportall) - ON_COMMAND(ID_SAVE, OnSave) - ON_COMMAND(ID_POPUP_VYMAZAT, OnPopupVymazat) - ON_COMMAND(ID_EDIT_DELETE, OnEditDelete) -END_MESSAGE_MAP() - - -// CItemIconsDlg message handlers - -BOOL CItemIconsDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - // Add "About..." menu item to system menu. - - // IDM_ABOUTBOX must be in the system command range. - ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); - ASSERT(IDM_ABOUTBOX < 0xF000); - - CMenu* pSysMenu = GetSystemMenu(FALSE); - if (pSysMenu != NULL) - { - CString strAboutMenu; - strAboutMenu.LoadString(IDS_ABOUTBOX); - if (!strAboutMenu.IsEmpty()) - { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); - } - } - - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon - - // TODO: Add extra initialization here - ZeroMemory(_iconlib,sizeof(_iconlib)); - for (int i=0;i<18;i++) icons[i]._data=_iconlib+i*ICONSIZE; - CheckDlgButton(IDC_TRANSPARENT,1); - return TRUE; // return TRUE unless you set the focus to a control -} - -void CItemIconsDlg::OnSysCommand(UINT nID, LPARAM lParam) -{ - if ((nID & 0xFFF0) == IDM_ABOUTBOX) - { - CAboutDlg dlgAbout; - dlgAbout.DoModal(); - } - else - { - CDialog::OnSysCommand(nID, lParam); - } -} - -// If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. - -void CItemIconsDlg::OnPaint() -{ - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } -} - -// The system calls this function to obtain the cursor to display while the user drags -// the minimized window. -HCURSOR CItemIconsDlg::OnQueryDragIcon() -{ - return static_cast(m_hIcon); -} - -void CItemIconsDlg::OnOpen() -{ - if (_dlgOpen.DoModal()==IDOK) - { - CString name=_dlgOpen.GetSelectedFile(); - LoadDocument(name); - } -} - -bool CItemIconsDlg::LoadDocument(const CString & name) -{ - _documentName=name; - wFilename.SetWindowText(name); - HANDLE h=CreateFile(name,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); - if (h==INVALID_HANDLE_VALUE) - { - ZeroMemory(_iconlib,sizeof(_iconlib)); - for (int i=0;i<18;i++) - { - unsigned short *data=reinterpret_cast(_iconlib+i*ICONSIZE); - data[0]=45; - data[1]=55; - data[2]=8; - } - } - else - { - DWORD rd; - ReadFile(h,_iconlib,ICONLIBSIZE,&rd,0); - CloseHandle(h); - } - for (int i=0;i<18;i++) icons[i].Invalidate(TRUE); - return true; -} - -void CItemIconsDlg::OnContextMenu(CWnd* pWnd, CPoint point) -{ - _selicon=IconFromWnd(pWnd); - if (_selicon!=-1) - { - CMenu mnu; - mnu.LoadMenu(IDR_POPUP); - CMenu *sub=mnu.GetSubMenu(0); - sub->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,this,0); - } -} - -int CItemIconsDlg::IconFromWnd(CWnd * wnd) -{ - for (int i=0;i<18;i++) if (icons+i==wnd) return i; - return -1; -} - -int CItemIconsDlg::ImportBMP(int icon,void *bmp, int dataoffset) -{ - BITMAPINFO *binfo=reinterpret_cast(bmp); - char *data=reinterpret_cast(bmp)+dataoffset; - if (binfo->bmiHeader.biBitCount==8 && binfo->bmiHeader.biWidth==45 && binfo->bmiHeader.biHeight==55 && binfo->bmiHeader.biCompression==BI_RGB) - { - unsigned short *pal=GETICONPAL(icon); - char *bits=GETICONBITS(icon); - for (int i=0;i<256;i++) - pal[i]=(((unsigned)binfo->bmiColors[i].rgbRed>>3)<<10)| - (((unsigned)binfo->bmiColors[i].rgbGreen>>3)<<5)| - (((unsigned)binfo->bmiColors[i].rgbBlue>>3)); - for (int i=0;i<55;i++,data+=3) - { - bits=GETICONBITS(icon)+(55-i-1)*45; - for (int j=0;j<45;j++) - *bits++=*data++; - } - if (IsDlgButtonChecked(IDC_TRANSPARENT)) AutodetectTransparent(icon); - } - else - AfxMessageBox(IDS_CHYBNYFORMAT); - icons[icon].Invalidate(); - return 0; -} - -void CItemIconsDlg::OnPopupPaste() -{ - OpenClipboard(); - HANDLE h=GetClipboardData(CF_DIB); - if (h) - { - LPVOID v=GlobalLock(h); - ImportBMP(_selicon,v,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256); - GlobalUnlock(h); - } - CloseClipboard(); -} - -void CItemIconsDlg::OnPopupCopy() -{ - HANDLE buff=GlobalAlloc(GHND, sizeof(BitMapInfo)+48*55); - BITMAPINFO *bmp=reinterpret_cast(GlobalLock(buff)); - ExportBMP(_selicon,bmp); - GlobalUnlock(buff); - OpenClipboard(); - EmptyClipboard(); - SetClipboardData(CF_DIB,buff); - CloseClipboard(); -} - -void CItemIconsDlg::ExportBMP(int icon, BITMAPINFO * bitmap) -{ - BitMapInfo &bmpinfo=*reinterpret_cast(bitmap); - - ZeroMemory(&bmpinfo,sizeof(bmpinfo)); - bmpinfo.hdr.biSize=sizeof(bmpinfo.hdr); - bmpinfo.hdr.biBitCount=8; - bmpinfo.hdr.biCompression=BI_RGB; - bmpinfo.hdr.biHeight=55; - bmpinfo.hdr.biPlanes=1; - bmpinfo.hdr.biWidth=45; - unsigned short *pal=GETICONPAL(icon); - for (int i=0;i<256;i++) - { - RGBQUAD &col=bmpinfo.palette[i]; - col.rgbBlue=(pal[i] & 0x1F)<<3; - col.rgbGreen=(pal[i] & 0x3E0)>>2; - col.rgbRed=(pal[i] & 0x7C00)>>7; - col.rgbReserved=0; - } - char *input=GETICONBITS(icon); - for (int i=0;i<55;i++) - { - char *data=reinterpret_cast(bitmap)+sizeof(bmpinfo)+48*(54-i); - for (int j=0;j<45;j++) - *data++=*input++; - } - -} - -void CItemIconsDlg::OnPopupImportbmp() -{ - CString filter; - filter.LoadString(IDS_BMPFILTER); - CFileDialog fdlg(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,filter,0); - if (fdlg.DoModal()==IDOK) - { - ImportBMP(fdlg.GetPathName(),_selicon); - } -} - -void CItemIconsDlg::OnDropFiles(HDROP hDropInfo) -{ - CPoint mouse; - DragQueryPoint(hDropInfo,&mouse); -// ScreenToClient(&mouse); - CWnd *wnd=ChildWindowFromPoint(mouse,CWP_SKIPINVISIBLE|CWP_SKIPDISABLED); - int icon=IconFromWnd(wnd); - if (icon!=-1) - { - int index=0; - CString name; - int sz=DragQueryFile(hDropInfo,index,0,0); - while (sz) - { - _TCHAR *buff=name.GetBuffer(sz+1); - DragQueryFile(hDropInfo,index,buff,sz+1); - _TCHAR *ext=_tcsrchr(buff,'.'); - if (ext && _tcsicmp(ext,_T(".BMP"))==0) - ImportBMP(buff,icon); - name.ReleaseBuffer(); - icon++; - if (icon>=18) icon=0; - index++; - sz=DragQueryFile(hDropInfo,index,0,0); - } - } - DragFinish(hDropInfo); -} - -void CItemIconsDlg::ImportBMP(const _TCHAR * name, int icon) -{ - HANDLE h=CreateFile(name,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0); - if (h!=INVALID_HANDLE_VALUE) - { - BITMAPFILEHEADER *hdr=(BITMAPFILEHEADER *)malloc(GetFileSize(h,0)); - DWORD rd; - ReadFile(h,hdr,GetFileSize(h,0),&rd,0); - if (hdr->bfType==MAKEWORD('B','M')) - { - BITMAPINFO *nfo=(BITMAPINFO *)((char *)hdr+sizeof(BITMAPFILEHEADER)); - ImportBMP(icon,nfo,hdr->bfOffBits-sizeof(*hdr)); - } - else - AfxMessageBox(IDS_NEPLATNYFORMATBMP); - free(hdr); - CloseHandle(h); - } - else - AfxMessageBox(IDS_NELZEOTEVRITSOUBOR); -} - -void CItemIconsDlg::ExportBMP(int icon, const _TCHAR * filename) -{ - DWORD sz=48*55+sizeof(BitMapInfo); - char *data=(char *)malloc(sz); - ExportBMP(icon,(BITMAPINFO *)data); - BITMAPFILEHEADER hdr; - ZeroMemory(&hdr,sizeof(hdr)); - hdr.bfType=MAKEWORD('B','M'); - hdr.bfSize=sz; - hdr.bfOffBits=sizeof(hdr)+sizeof(BitMapInfo); - HANDLE h=CreateFile(filename,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,0,0); - if (h!=INVALID_HANDLE_VALUE) - { - DWORD rd; - WriteFile(h,&hdr,sizeof(hdr),&rd,0); - if (rd!=sizeof(hdr)) - { - AfxMessageBox(IDS_CHYBAPRIZAPISU); - } - else - { - WriteFile(h,data,sz,&rd,0); - if (sz!=rd) - { - AfxMessageBox(IDS_CHYBAPRIZAPISU); - } - } - CloseHandle(h); - } - else - AfxMessageBox(IDS_NELZEOTEVRITSOUBOR); -} - -void CItemIconsDlg::OnPopupExportbmp() -{ - CString filter; - filter.LoadString(IDS_BMPFILTER); - CFileDialog fdlg(FALSE,_T(".BMP"),0,OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,filter,0); - if (fdlg.DoModal()==IDOK) - { - ExportBMP(_selicon,fdlg.GetPathName()); - } -} - -int CItemIconsDlg::ManualSelectPic(void) -{ - CMenu mnu; - mnu.LoadMenu(IDR_POPUP); - CMenu *sub=mnu.GetSubMenu(1); - CPoint pt(0,0); - ClientToScreen(&pt); - int res=sub->TrackPopupMenu(TPM_LEFTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD,pt.x,pt.y,this,0); - return res-1; -} - -void CItemIconsDlg::OnEditCopy() -{ - _selicon=ManualSelectPic(); - if (_selicon>=0) OnPopupCopy(); -} - -void CItemIconsDlg::OnEditPaste() -{ - _selicon=ManualSelectPic(); - if (_selicon>=0) OnPopupPaste(); -} - -void CItemIconsDlg::OnClickIcon(UINT cmd) -{ - _selicon=cmd-IDC_ICON1; - OnPopupImportbmp(); -} -void CItemIconsDlg::OnEditExport() -{ - _selicon=ManualSelectPic(); - if (_selicon>=0) OnPopupExportbmp(); -} - -void CItemIconsDlg::OnEditImport() -{ - CString filter; - filter.LoadString(IDS_BMPFILTER); - CFileDialog fdlg(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT,filter,0); - if (fdlg.DoModal()==IDOK) - { - _selicon=ManualSelectPic(); - POSITION pos=fdlg.GetStartPosition(); - while (pos) - { - ImportBMP(fdlg.GetNextPathName(pos),_selicon); - _selicon=(_selicon+1)%18; - } - } -} - -void CItemIconsDlg::OnEditExportall() -{ - CString filter; - filter.LoadString(IDS_BMPFILTER); - CFileDialog fdlg(FALSE,0,0,OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,filter,0); - if (fdlg.DoModal()==IDOK) - { - CString mask=fdlg.GetPathName()+_T(".%02d.BMP"); - for (int i=0;i<18;i++) - { - CString name; - name.Format(mask,i+1); - ExportBMP(i,name); - } - } -} - -void CItemIconsDlg::OnSave() -{ - if (SaveDocument(_documentName)==false) - { - AfxMessageBox(IDS_CHYBAPRIULOZENI); - } -} - -bool CItemIconsDlg::SaveDocument(const _TCHAR * name) -{ - HANDLE h=CreateFile(name,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0); - if (h==INVALID_HANDLE_VALUE) - { - return false; - } - else - { - DWORD rd; - WriteFile(h,_iconlib,ICONLIBSIZE,&rd,0); - CloseHandle(h); - return rd==ICONLIBSIZE; - } - -} - -void CItemIconsDlg::OnPopupVymazat() -{ - char *bits=GETICONBITS(_selicon); - ZeroMemory(bits,45*55); - icons[_selicon].Invalidate(); -} - -void CItemIconsDlg::OnEditDelete() -{ - _selicon=ManualSelectPic(); - if (_selicon>=0) OnPopupVymazat(); - -} - -void CItemIconsDlg::SetTransparentIndex(int icon, int index) -{ - if (index==0) return; - unsigned short *pal=GETICONPAL(icon); - char *bits=GETICONBITS(icon); - unsigned short save=pal[index]; - pal[index]=pal[0]; - pal[0]=save; - - for (int i=0;i<45*55;i++,bits++) if (*bits==index) *bits=0;else if (*bits==0) *bits=index; -} - - -void CItemIconsDlg::AutodetectTransparent(int icon) -{ - int stats[256]; - ZeroMemory(stats,sizeof(stats)); - for (int i=0;i<45;i++) - { - stats[*(unsigned char *)(GETICONBITS(icon)+i)]++; - stats[*(unsigned char *)(GETICONBITS(icon)+i+54*45)]++; - } - for (int i=1;i<54;i++) - { - stats[*(unsigned char *)(GETICONBITS(icon)+i*45)]++; - stats[*(unsigned char *)(GETICONBITS(icon)+i*45+44)]++; - } - int max=0,index=0; - for (int i=0;i<256;i++) if (stats[i]>max) {max=stats[i];index=i;} - SetTransparentIndex(icon,index); -} diff --git a/mapedit/ItemIcons/ItemIconsDlg.h b/mapedit/ItemIcons/ItemIconsDlg.h deleted file mode 100644 index a156d80..0000000 --- a/mapedit/ItemIcons/ItemIconsDlg.h +++ /dev/null @@ -1,69 +0,0 @@ -// ItemIconsDlg.h : header file -// - -#pragma once -#include "iconviewerbutton.h" -#include "dlgopen.h" -#include "afxwin.h" - - - -// CItemIconsDlg dialog -class CItemIconsDlg : public CDialog -{ -// Construction -public: - CItemIconsDlg(CWnd* pParent = NULL); // standard constructor - -// Dialog Data - enum { IDD = IDD_ITEMICONS_DIALOG }; - - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - -// Implementation -protected: - HICON m_hIcon; - - // Generated message map functions - virtual BOOL OnInitDialog(); - afx_msg void OnSysCommand(UINT nID, LPARAM lParam); - afx_msg void OnPaint(); - afx_msg HCURSOR OnQueryDragIcon(); - DECLARE_MESSAGE_MAP() -public: - CIconViewerButton icons[18]; - char _iconlib[ICONLIBSIZE]; - afx_msg void OnOpen(); - DlgOpen _dlgOpen; - CString _documentName; - bool LoadDocument(const CString & name); - CEdit wFilename; - int _selicon; - int IconFromWnd(CWnd * wnd); - int ImportBMP(int icon,void *bmp, int dataoffset); - afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/); - afx_msg void OnPopupPaste(); - afx_msg void OnPopupCopy(); - void ExportBMP(int icon, BITMAPINFO * bitmap); - afx_msg void OnPopupImportbmp(); - afx_msg void OnDropFiles(HDROP hDropInfo); - void ImportBMP(const _TCHAR * name, int icon); - void ExportBMP(int icon, const _TCHAR * filename); - afx_msg void OnPopupExportbmp(); - int ManualSelectPic(void); - afx_msg void OnEditCopy(); - afx_msg void OnEditPaste(); - afx_msg void OnClickIcon(UINT cmd); - afx_msg void OnEditExport(); - afx_msg void OnEditImport(); - afx_msg void OnEditExportall(); - afx_msg void OnSave(); - bool SaveDocument(const _TCHAR * name); - afx_msg void OnPopupVymazat(); - afx_msg void OnEditDelete(); - void SetTransparentIndex(int icon, int index); - void AutodetectTransparent(int icon); -}; - diff --git a/mapedit/ItemIcons/res/ItemIcons.ico b/mapedit/ItemIcons/res/ItemIcons.ico deleted file mode 100644 index 8a84ca3d34597ada57e4c79ef62b28cf07b5ed9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21630 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 V7_3;)FxY%t!w{8u!r68W{|isv(C`2N diff --git a/mapedit/ItemIcons/res/ItemIcons.rc2 b/mapedit/ItemIcons/res/ItemIcons.rc2 deleted file mode 100644 index b527f80..0000000 --- a/mapedit/ItemIcons/res/ItemIcons.rc2 +++ /dev/null @@ -1,13 +0,0 @@ -// -// ItemIcons.RC2 - resources Microsoft Visual C++ does not edit directly -// - -#ifdef APSTUDIO_INVOKED -#error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/mapedit/ItemIcons/resource.h b/mapedit/ItemIcons/resource.h deleted file mode 100644 index d9ff19a..0000000 --- a/mapedit/ItemIcons/resource.h +++ /dev/null @@ -1,66 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by ItemIcons.rc -// -#define IDC_BROWSE 3 -#define IDR_MAINMENU 4 -#define IDM_ABOUTBOX 0x0010 -#define IDD_ABOUTBOX 100 -#define IDS_ABOUTBOX 101 -#define IDD_ITEMICONS_DIALOG 102 -#define IDS_CREATENEW 102 -#define IDS_CHYBNYFORMAT 103 -#define IDS_CHYBAPRIULOZENI 104 -#define IDR_MAINFRAME 128 -#define IDD_OPENDLG 130 -#define IDR_POPUP 131 -#define IDS_BMPFILTER 132 -#define IDS_NEPLATNYFORMATBMP 133 -#define IDS_NELZEOTEVRITSOUBOR 134 -#define IDS_CHYBAPRIZAPISU 135 -#define IDC_ICON1 1001 -#define IDC_ICON2 1002 -#define IDC_ICON3 1003 -#define IDC_ICON4 1004 -#define IDC_ICON5 1005 -#define IDC_ICON6 1006 -#define IDC_ICON7 1007 -#define IDC_ICON8 1008 -#define IDC_ICON9 1009 -#define IDC_ICON10 1010 -#define IDC_ICON11 1011 -#define IDC_ICON12 1012 -#define IDC_ICON13 1013 -#define IDC_ICON14 1014 -#define IDC_ICON15 1015 -#define IDC_ICON16 1016 -#define IDC_ICON17 1017 -#define IDC_ICON18 1018 -#define IDC_FILENAME 1019 -#define IDC_LIST 1021 -#define IDC_CHECK1 1024 -#define IDC_TRANSPARENT 1024 -#define ID_OPEN 32774 -#define ID_SAVE 32776 -#define ID_ABOUT 32779 -#define ID_POPUP_COPY 32781 -#define ID_POPUP_PASTE 32782 -#define ID_POPUP_IMPORTBMP 32784 -#define ID_POPUP_EXPORTBMP 32785 -#define ID_EDIT_EXPORT 32792 -#define ID_EDIT_IMPORT 32793 -#define ID_EDIT_EXPORTALL 32794 -#define ID_POPUP_VYMAZAT 32795 -#define ID_Menu 32796 -#define ID_EDIT_DELETE 32798 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 136 -#define _APS_NEXT_COMMAND_VALUE 32799 -#define _APS_NEXT_CONTROL_VALUE 1025 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/mapedit/ItemIcons/stdafx.cpp b/mapedit/ItemIcons/stdafx.cpp deleted file mode 100644 index 880faec..0000000 --- a/mapedit/ItemIcons/stdafx.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// ItemIcons.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - - diff --git a/mapedit/ItemIcons/stdafx.h b/mapedit/ItemIcons/stdafx.h deleted file mode 100644 index 8556315..0000000 --- a/mapedit/ItemIcons/stdafx.h +++ /dev/null @@ -1,46 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#pragma once - -#ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif - -// Modify the following defines if you have to target a platform prior to the ones specified below. -// Refer to MSDN for the latest info on corresponding values for different platforms. -#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later. -#define WINVER 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. -#endif - -#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later. -#define _WIN32_WINNT 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. -#endif - -#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. -#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. -#endif - -#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later. -#define _WIN32_IE 0x0400 // Change this to the appropriate value to target IE 5.0 or later. -#endif - -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit - -// turns off MFC's hiding of some common and often safely ignored warning messages -#define _AFX_ALL_WARNINGS - -#include // MFC core and standard components -#include // MFC extensions - -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - -#define ICONSIZE (6+512+45*55) -#define ICONLIBSIZE (18*ICONSIZE) -#define GETICONADDR(icon) (_iconlib+icon*ICONSIZE) -#define GETICONBITS(icon) (_iconlib+icon*ICONSIZE+6+512) -#define GETICONPAL(icon) reinterpret_cast(_iconlib+icon*ICONSIZE+6) diff --git a/mapedit/Lex_Lib/Debug/BuildLog.htm b/mapedit/Lex_Lib/Debug/BuildLog.htm deleted file mode 100644 index 9b4fbfda3d8b96e0ed28ad55413035c6038f967c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21932 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 diff --git a/mapedit/Lex_Lib/Debug/Lex_Lib.exe b/mapedit/Lex_Lib/Debug/Lex_Lib.exe deleted file mode 100644 index 12c5aacdc98d33f9b1d50032588e04b8d6a44386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499200 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 m&lAPe+pOz}uqa{fbPMk&y5>+$Rn_;ns|BKPOkK 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 P+vvl>(+)G9Mv4dkQMjC| diff --git a/mapedit/Lex_Lib/Debug/Lex_Lib.exe.embed.manifest b/mapedit/Lex_Lib/Debug/Lex_Lib.exe.embed.manifest deleted file mode 100644 index 11bb704..0000000 --- a/mapedit/Lex_Lib/Debug/Lex_Lib.exe.embed.manifest +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/mapedit/Lex_Lib/Debug/Lex_Lib.exe.embed.manifest.res b/mapedit/Lex_Lib/Debug/Lex_Lib.exe.embed.manifest.res deleted file mode 100644 index 9c8df0e3c8e374037f6a16f24fed3e764becd3f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcma)2yG{c!5Hu1ENc5D}_LoaUgCgHW6d*;Spa6Qu*$Wna2(Ryy`w@PIf=}WT!t%IN zA{tg&YuB?g>#-0*NY35vC%HU`*P{VH=NWD|rsCvy82Wg7SBtH8vcp6+h6-krDM$<^ zu5H*<@Nj=qT!N&m!& - - - - - - - - - diff --git a/mapedit/Lex_Lib/Debug/mt.dep b/mapedit/Lex_Lib/Debug/mt.dep deleted file mode 100644 index 66a4874..0000000 --- a/mapedit/Lex_Lib/Debug/mt.dep +++ /dev/null @@ -1 +0,0 @@ -Manifest resource last updated at 21:19:30,59 on st 11.09.2013 diff --git a/mapedit/Lex_Lib/Debug/vc80.idb b/mapedit/Lex_Lib/Debug/vc80.idb deleted file mode 100644 index 9c17e7f109beab0a611fa8b019bcfac35483e103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27648 zcmeHQ&2Jk;6yKCmpisUFrBINTB1)^)&N@w#v{Hb?c2d*C3AU3)mDR=BT_@YDKeW3} z(hEXJT)1$c2ac2?PJk*ZRot2brT+p4kSaJpB}CKa(7r!wrzbWmX?S%OVTC^b`gJuIML2( zz(+=a5qQ86=-DLQWMTvufsKj4LfgX9#;iHlnh{_GVyU!zfF}6=5EPio$i(WmKMmj< z^Zr+U-s}wgb*b;%-+#P+_VV`qNPnF8IpQ|rlgA#WWAz+y+E|gpnULK}&njTQ?DRgAYK4UC zucQ;~mpy!JMGj{|cA9j8{j!}G8q0o3a$vvg!c&c9e~`~i>(boQWus}@9G42) zG;Omv-N-wn?ioVuWn!TC>h+sjDUc2ldo4pDP}hlJQHylD!Kwy{A0ysDnb2sD5L07H zbHq;&!>G0pj}b%R>%@?`Lc9&2PLn%@6IuoE2CPsh}xEBbV z2}jy6-osXZxY+;cFRv}e&)`&MH)&hH|JNbR4LM|F~WA2JL2YyIgV?a#i^zZ6V6yo!@qfLI|7`zjnZL6A^ZZ}DFT2BY&I2_6$NU`c z^_DOJSf+V;yug|Oo(t;fDkZEo_s8#evcXdd&;JPoCPrYLB7l{H&x!r(f1;@VXMT}} zkh%uXzVSP393<8V(2X=&{}VC@_bfA3HJBIyM&SM-aIeOHv1%#CfAkBO6Y%=q{cCH! zG9yrr0M`F8U-z&7=cIxpOL@tZEN@)Lc#rWNAqeMod-K-+&{yCc0Q9~k(}765)e!xN zcxzJs_5-r$R|bjk)`W=>Ul`o9y}MIZN_9G9ezoa#3K z;v1d|_*jPsd-1V%AA8ZU&mH^zv5y}6?y;90`{bclAz8m(FSGA}G6`xVf97pT`h+$R zFD-8z_REWW95Moo!0iaEY4_XmX3${HAGF$L++g{u&Le{5t!>B(mc6#CHduDyTq0m@ z|1RNxD#X6UVA+MM4ftk2pDy}v+)bjdMIY}c(Z6FXLBEf20Am1r!NBi>@CmY84kdQ4 ztypC%=jKax!O>@K(W2M;B*|6Wl5RLN+5F@@7#TVgr7IkXgd=y(y5i16H*G_6=jFp; zMJ5IE-je2)CJkFAO`ZGvTIl+-8hJ%IMeDjQy8PMglzDrG!@xJg`& z$RW+Llcmv$ZA4QU?}J%17B$Y&;?g48P~Jj^TTAQA7?z&1va|!-$y&y|iml+g`gfDM+suQwK(Sz36zfM^VQ{ zsRXfjuQIQ6N4(@(C9CZeQ`O=0cvMY|B{PZPI8{9!Jw}CzAJuSh!#El>SkS6p?rBdqvu|20~1z$=qCAyEMo z!mowx|8DKy*WY43UGM)3T>}W;`>)mi7rqN_wEqv|fY?94{=WzeB8-P%zn`xA<^K!A zcYV8|j2Ih4yCKfhS_r`Y*XsYPwGiOiFajGF0qos@|1b3M?Eee@gHS)$_4}_B&(Tft zuH}ESZ;r~^N=0+j(aHt;|604B)7o;=`uG2d{rN|Uo9+Jx%LzM)#r}Wx|4CplF#_uh P0r=@N?9BF& zXo3kL5u?V$7y1JeiT{+CKnx^Af{z+Z(BLEfGA5c3G=?82VkF@CraQas+J>^bO-eZ@ zIXiQ2&pmVJn|toPb7$sjNKa-=%j~vAf0cj31~C-fE^hWo(!%-6o1+5B-GXozZB~;W zL7HU6=!Sn80Y>09M_@=0uH9f^1Q>xk5`lel_FcXsPn=Jh5nu#vG)JOh2Tkz*B`h$N z5lOe6ks{c~y#Md;OKW~y`Eu(gCu$E3zj*K<^6w{ILh2#?`Xi(S;k|oD^*$tCh{k_A zIpXfC7P#E56f@rnJuO?FVn_WYiIe!fDs-%X6eT57^sdU+STQQ$6Y;;1t{1vOT({9^#$G{iUB|VE2XcQyLqN=+9jc@YNY9ZjBpoD$ zvp*>^7SpzcbROv%(z!XMwlBm<=aVA-seKDO=ZtnPhp61cly0IeV&X96FQx78bi9XX z%fbjS0%arcny=b}@t&efcqM$a%j+{kC*OVb_?ZhmZGTZ_Ra!}DmeVCVy)|{^-KLXF z8j58VB~zw4YMV{>rOm-KisbV$)PFlZoZ^O_rt!eAm9fsHQK_zQ7d)WQk*8tMuxWs* zL?=9MgiB`ZX{l|}R5c~77{ius$(EVTBq^CTZN=8j^mKs3w?AdD`nJAQL(&-r9Rv?VCfFWdW7^*QanGv zvLBWVu}p|1L)=ziDG|$iSn|Vd2$l|67y(9LdJw?+KjL}p`oAKi1X1V~biv3!r^8YJ zbqS7OKT}n?^*{6xh<*6oD$);0@nZsa`N4fm;665hExN82QaoN@VFVa~sUuKo{Ns56 z;tpdw$KBNNW=lq3CLvI2{LiFw;JPpZj6i7!aQv5s8<%1PW&;8o|FhvL@;NX9r6Iua zUm9*)iV>I%2ypz*hO5ZuzzCFv0LOo6xN#{)U^XDY@jn}`BA){zP#OXp|E1x^r5J(P zfPk8@M7-1M3f{p3$HRWob)?5gA?PP$+Kzosu!GWjHV_}+>9^+KU0%G?i}Gi4oFL%s z03QcubizjXZ)V(TKsp`bPp)e4cb^lC|)z7g-!3{^3Ra;3|X4Q(g^8k6KCMk%FV zQ+3<5lU1!N+vBEuW>>G^ZQdOW*Vc&M=7fL8wn!o#js{!8fo3P8EgWrY4LG~)?U7h4 znA?qqsgPsR9B7KSAUD4g495a3k!`Js(6)|5Q!o~7tlJ2KP?JCEY@_}}Q#{z(+*s`< z10Asd9hQ#f=4_9*wkCE3B8}CXB&k-~T(iafi<{}BW6p0P*im2CSSLw^RAPI3qm$g_ zua^?>cB)WwpivrC!E)HINp)Pm119OclLtUDUAJ zY|$Hu`Ki6oZ&vi~t|fI^SZ5R3StkWhXR@K&%tVuBzvd(clXNl(D%gp%PTEg_ku)-4 zvpt*9{1Iy8AOKKxLny7S>1^`&oh*i=O)jNRh}F7 z!{#!*jOElS)0ImmR-T(=j^AQ=ZWP4i6oVfosF*+DuT{6C2M$4GGuH~yLbhrnQA z1ZD^V{J;EW$c5l)FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 Lzz8q`6+qxWb$856 diff --git a/mapedit/Lex_Lib/Lex_Lib.cpp b/mapedit/Lex_Lib/Lex_Lib.cpp deleted file mode 100644 index 9bf699f..0000000 --- a/mapedit/Lex_Lib/Lex_Lib.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// Lex_Lib.cpp : Defines the entry point for the console application. -// - -#include "stdafx.h" - -int _tmain(int argc, _TCHAR* argv[]) -{ - return 0; -} - diff --git a/mapedit/Lex_Lib/Lex_Lib.vcproj b/mapedit/Lex_Lib/Lex_Lib.vcproj deleted file mode 100644 index a010c65..0000000 --- a/mapedit/Lex_Lib/Lex_Lib.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mapedit/Lex_Lib/Release/BuildLog.htm b/mapedit/Lex_Lib/Release/BuildLog.htm deleted file mode 100644 index 2d3cb9bf9f4276e3f445c464c3db6ca1ccae6a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8002 zcmeI1`EL_P6vyZ1O8gHiP$@@oAe6LR6~S?6s$9(hJyJz+?1X@G)HYYuzrF3}GvkeS zH->~1P%5F7*SmAPdGqG`zVqhoKY!l~PeVWKhEDiCoC{wB-`im$v<~0rLL;n%$&iH~ z_+JT&;Tk1Bh1D<<9*6tke5i;0u!od(ykDcun{dF}dHQUY>TGSh*WAYrN4^`|J!RBx z=uz88>I?2$jC3PR&?nc;K4tBi$Zs)T-r@im?ZdY|GMmh;%?Pi;4lVmgxR2E9TwhY! z4BJu14syEGTwpfS@z)5qkaLe7UH-H9q*Z*{8q6x=X@mZ4daC^n_YN(3JpCCxDXNT3o}r z;hdbC+7vBg-=j8Zgelg13d?Adi;UBZquw28tX)nnZ5lcG^*++B#8JvC{50CPXxm=2 zV3&KF+1+72i>%Ckc*grCrIyU{{5q`jzr#$vrX*o_i}!8Tsf*S6Jd11FFGWj>Jn{Kg zcoOY-GmOXiCmoXajIkC8fhS+fccD?6`zxa{*;<>w4-&@*NOZ2dTpP?Tp;2_SnOi=G zT&g2{MxBM0}t7!^Q_=_z*)<*=+jbpqTtMzJ_gQ)sM;s;F z_Dk$K>-1>wyvkdHw|V-nqvIs+^HI}Bv^ZYcV`ONlbtEmK?-CN!US@sG@7uV494}{% z`PN5__y~V?9(uO_4R+QZ81Q+HdHDY;>vAJL{TT1lSiCr5nUU7OL$NkVZaIN7A#op|Aci_PSWcMttLQD(rqXHuQ0oe{xwEV_r#~7H%Dg&Ts5iPj0pNY-jDi; zQ9_ZC>?I>*U~?1n*LZ#%-yfV2pV1C`Xl>lE&CmBX{-hUoK};Ka`Q(0+d|MvqGaotj zs0G}u&I(gZegLLez;{-ddl6M-1dbhIB%vl><6;l3D#PgC4Sb`)v$5zblJ#!u=Xlq< z-6NL=-cv1`rd}p_mp((xmi4JcEV@2jRw(hW9Nz|&X%F3j)7?G$rP+?sZ53VX6)oHg zUh?a}FJHm&J#^ipWIytMm$EEIj+1zT5nqqXmPVe&er=wsHXCxSS}ejd4=bY@8GWps zC-?o_j-&Zy8H7A!#eRva=IY+THbvf7_XV^UN3MTj&AeoW)~RF)8S_|n4$IY%If+Eq zx`>cE94nG6{~30lz^d-A-N-YYxQErSr);IYwQILhx*hjkce`Or_su<8>+Q0^uqJU@ zi?Z#C93%3Vtlj~A%hG!Bd}B;sE?07UWZ4F~_A50nB3@brT|6T-K~Gg`DmD5j)|`tR zRm7AGU-n+TrGX`lp=YppjoCMev5UQAy3;VetFXuFd5$G?&0sV0(sWp>}Ng}3jCA}vN$bP?^Rp_a~+>EA1BM~ zRWl!+-;8I{-n|Xxy+pvn9KfPe+OR zW)?1S0yJ*BOuISCH)C6On62oMk16Z1z9|Fim@i_yrpMn#m+SQNWWUD9>am7|;mJ}S zd4M;o#VT@){yfJn(6SZvS;MyvxTYclY*1$wcQcN+1{1$Guf${xl7hg*=nA*M{4=9p@%ogWC{kP%J++NTX)p7e z`{?!*k2lkH`*4NzN@r{T8*OS2{6~e4>w}bCy_@fl>}Di)=L;TRe~V zB8xRxas6ZXEhVF*97hZ}&zYzet__YgF+IRLTh&mnL5A@t<>J ziXP8{)bthL4oDdTRUa=KGt|ueN=&COzA5g{8CcxABVQZ%#BguA1U4?mZ)D@tm032` w>02j9y#D46a`aoQeC78y^}A2RKl)qb=41$$-gt(cKFTwU#y5LUH||9 diff --git a/mapedit/Lex_Lib/Release/Lex_Lib.exe b/mapedit/Lex_Lib/Release/Lex_Lib.exe deleted file mode 100644 index 435435868690917dc02021d401d5ea03cc02aa0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69120 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 diff --git a/mapedit/Lex_Lib/Release/Lex_Lib.exe.intermediate.manifest b/mapedit/Lex_Lib/Release/Lex_Lib.exe.intermediate.manifest deleted file mode 100644 index ecea6f7..0000000 --- a/mapedit/Lex_Lib/Release/Lex_Lib.exe.intermediate.manifest +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/mapedit/Lex_Lib/Release/mt.dep b/mapedit/Lex_Lib/Release/mt.dep deleted file mode 100644 index d15065b..0000000 --- a/mapedit/Lex_Lib/Release/mt.dep +++ /dev/null @@ -1 +0,0 @@ -Manifest resource last updated at 20:25:58,79 on st 11.09.2013 diff --git a/mapedit/Lex_Lib/Release/vc80.idb b/mapedit/Lex_Lib/Release/vc80.idb deleted file mode 100644 index f785173581afe845e01dd04c53e2d8b563985511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27648 zcmeI3Ply~v6vk^bMqQ2nVnj9p+k-}k%P^?Ls-~)kR|lgYZD;Lf?(MDZ-Lbkr1&33mK#D2E2*lIU=w$sUpq$s}KHZ4g-tPKLP>+%zhWC1q z&vwG$gEC zP`(H0L(q-T$Dq7-40;#zGu*!y=_TyXHzPfT^Z}&%klv5<8z{H)HT7 z%1c1=zr1~~mWx0m&AfRB17eEI`y$G6DwS{>~h1UXA)&DIb3eI)G*XkvVs8DQ^xxKwRHZ^bMBMv z=JOwY_wb+R_q@~iV9VPJvp@4TK{Cdd_m2!Qa<{ij3f_nKn->HOd7j-K}36ZsF+nmhl;2QKpb-$wZ3 zfkeX4`9DCAh`|4p0N>*!A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0_%&w E-|wkM5dZ)H diff --git a/mapedit/Lex_Lib/Release/vc90.idb b/mapedit/Lex_Lib/Release/vc90.idb deleted file mode 100644 index 2db3a57e4943f13f018ff8212fdaf6b75fed953e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27648 zcmeHOU5MON6uzc& z^+6G#uZwLT6#5{n527OMQWO-S)oBZT*_MKD3yPv3>kr5lW$XDeb7yC(OMj9`mYxG= zPHuAY&CPdn?oDRS8E~yIkU=HVcNKSS-mDLlpVOZ#luF$zAKP6PBzFsO7n!xB@1afd zXw&c~Gr$ZiaR#P^xW>W^Favic148^dcV}KXUo|tp4D8-p)_2e|44A;9%>AUMs0v+F zgeyFuQ5(p|Fat}Q0gnHrJ$~GKW*`Xz?-cs9$;r}QtnU}kKL7jsr`EkV z(Y392{hNjJKP(fX=$lnXiefb^R$R}KMc1zcantfld401Q*iGNMKjH_6eVo$X7uIbj z#^^vRHKi}!<@%#eC>`6W$)eS7)WYCkXjb+39DU=F9ZzgBs_maEM_pMrJzYk1+YR)c zg_1F98Ln@6^eu)J9j!TqLn)(>!~(1H>6>uOhpTbR}sIwY$lFNs70Jr)buAgzO&D6{NkST`j$b z>=+$iO?D0Ga?)vfy?B`HF|z2#A=3Luw@~{*vMkI1GmsSnJp_#Z^~Mp}Ejd9Ex}TzN zo7&N`-;>2}1vjIJZbUmG98rx3$E<*eCir+J!R&$=0<#Dr9}W*}Pz z`29ayei@w^$TI^R|9KuA?i(|ZEdw0?+49Ti%s`$Q;P}t;=y2bdfovJz_|KMKMrQ`{ z%mBxKo=1oK#tdZ30LOo}{4zQ-kY@%s{_{LK+&5+*TL$b<>d5O+f(*b7q;HXKB%L6I zV4g6@cGd~S2U;J<;Xzg(&OdG;t4D}g${`w~9Xi<$sJ)f8Kc($&$yUe?(!Lo|V3)`) zhE0bS)EwQaKh9@i2AF|=GcY$ZH-ngc21$8#KPAyq+WoL&MU>n<;&`^{8I*P`4bM69 z3i6MwMVzW;&9U7``5B?(Ii_?}yATWwi)1r)eS2hA`7b@Ry?eRSOu}VDj8H8 zEsGTrS+M_~U@b+i?_aI@U%lh2(fjouUL5=6YVqaq(@#J9+t8~Qa2P#QYyC+J8N1D^ z!xbW@R~#$v`}y;R_R&jd%nR@!uux1nv$NwreZ9S*^&w%nC16PTf>CIU`-g9rzdNga zbzO3>@&(h-*mu*%C*+xiHu!}?ZCd4vk$}d&Q@>m?)?Uzxuc@O8eK9J~*!TG9x39e3 z(0+Wp>7zc?nHY6w?7OFX=bFD8+PPunwGbC~1vK`Z=$~4#tf8I4ZPXzO7k3mi_C49N z<&Ag0(Oy`Dhe0|Y8vD+6l?Og+Xsah_M~5g}a1BNJ_kWEA{FE>5Y-o%-b>QmspM-l^ z9i;;#3tP>7{Fz?{5dX;YztOWdk86I%kbA}q+%5xL|9kUQ#qH;5R70m%tgIf4(?y+s z&q*1V>wg!oJC~hrC+YIue*H}umg|3Sck1Nxn1LnF0P25H`JZS`d=b} wg&D{p106rR<*;|$C1!vb$dZAsEWsI@8DIvO0cL<1U -#include - -// TODO: reference additional headers your program requires here diff --git a/mapedit/Podlahar/ColorButton.cpp b/mapedit/Podlahar/ColorButton.cpp deleted file mode 100644 index 119ffc7..0000000 --- a/mapedit/Podlahar/ColorButton.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// ColorButton.cpp : implementation file -// - -#include "stdafx.h" -#include "ColorButton.h" -#include ".\colorbutton.h" - - -// CColorButton - -IMPLEMENT_DYNAMIC(CColorButton, CButton) -CColorButton::CColorButton() -{ -} - -CColorButton::~CColorButton() -{ -} - - -BEGIN_MESSAGE_MAP(CColorButton, CButton) -END_MESSAGE_MAP() - - - -// CColorButton message handlers - - -void CColorButton::DrawItem(LPDRAWITEMSTRUCT dis) - { - CRect rcitem(dis->rcItem); - CDC dc; - dc.Attach(dis->hDC); - dc.DrawFrameControl(&dis->rcItem,DFC_BUTTON,DFCS_BUTTONPUSH|(dis->itemState & 1?DFCS_PUSHED:0)); - rcitem-=CRect(2,2,2,2); - if (dis->itemState & ODS_FOCUS) dc.DrawFocusRect(&rcitem); - rcitem-=CRect(2,2,2,2); - dc.FillSolidRect(&rcitem,_color); - dc.Detach(); - } - -void CColorButton ::SetColor(COLORREF color, BOOL redraw) - { - _color=color; - Invalidate(FALSE); - } diff --git a/mapedit/Podlahar/ColorButton.h b/mapedit/Podlahar/ColorButton.h deleted file mode 100644 index a7c28e8..0000000 --- a/mapedit/Podlahar/ColorButton.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - - -// CColorButton - -class CColorButton : public CButton -{ - DECLARE_DYNAMIC(CColorButton) - COLORREF _color; - -public: - CColorButton(); - virtual ~CColorButton(); - - void SetColor(COLORREF color, BOOL redraw=1); - COLORREF GetColor() const {return _color;} - - -protected: - DECLARE_MESSAGE_MAP() - -public: - virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/); -}; - - diff --git a/mapedit/Podlahar/ImageView.cpp b/mapedit/Podlahar/ImageView.cpp deleted file mode 100644 index b402d9c..0000000 --- a/mapedit/Podlahar/ImageView.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// ImageView.cpp : implementation file -// - -#include "stdafx.h" -#include "ImageView.h" -#include ".\imageview.h" - - -// CImageView - -IMPLEMENT_DYNAMIC(CImageView, CStatic) -CImageView::CImageView() -{ - ZeroMemory(&_bmi,sizeof(_bmi._bmh)); - _bmi._bmh.biSize=sizeof(_bmi._bmh); - _bmi._bmh.biWidth=640; - _bmi._bmh.biHeight=-480; - _bmi._bmh.biPlanes=1; - _bmi._bmh.biBitCount=8; - _bmi._bmh.biCompression=BI_RGB; - _bmi._bmh.biSizeImage =0; - _buffer=NULL; -} - -CImageView::~CImageView() -{ -} - - -BEGIN_MESSAGE_MAP(CImageView, CStatic) - ON_WM_PAINT() -END_MESSAGE_MAP() - - - -// CImageView message handlers - - -void CImageView::OnPaint() -{ - CPaintDC dc(this); - if (_buffer) - { - SetDIBitsToDevice(dc,0,0,640,480,0,0,0,480,_buffer,(BITMAPINFO *)&_bmi,DIB_RGB_COLORS); - } -} - - -void CImageView::UpdateBuffer(char *buffer) -{ - _buffer=buffer; - Invalidate(); -} - -void CImageView::SetPalette(char *palette) -{ - for (int i=0;i<256;i++) - { - _bmi._palette[i].rgbRed=*palette++; - _bmi._palette[i].rgbGreen=*palette++; - _bmi._palette[i].rgbBlue=*palette++; - _bmi._palette[i].rgbReserved=0; - } -} \ No newline at end of file diff --git a/mapedit/Podlahar/ImageView.h b/mapedit/Podlahar/ImageView.h deleted file mode 100644 index 6404871..0000000 --- a/mapedit/Podlahar/ImageView.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - - -// CImageView - -class CImageView : public CStatic -{ - DECLARE_DYNAMIC(CImageView) - char *_buffer; - struct BMI - { - BITMAPINFOHEADER _bmh; - RGBQUAD _palette[256]; - } _bmi; -public: - CImageView(); - virtual ~CImageView(); - -protected: - DECLARE_MESSAGE_MAP() -public: - afx_msg void OnPaint(); - void UpdateBuffer(char *buffer); - void SetPalette(char *palette); -}; - - diff --git a/mapedit/Podlahar/Podlahar.cpp b/mapedit/Podlahar/Podlahar.cpp deleted file mode 100644 index ffb3d0f..0000000 --- a/mapedit/Podlahar/Podlahar.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// Podlah��.cpp : Defines the class behaviors for the application. -// - -#include "stdafx.h" -#include "Podlahar.h" -#include "PodlaharDlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#endif - - -// CPodlahApp - -BEGIN_MESSAGE_MAP(CPodlahApp, CWinApp) - ON_COMMAND(ID_HELP, CWinApp::OnHelp) -END_MESSAGE_MAP() - - -// CPodlahApp construction - -CPodlahApp::CPodlahApp() -{ - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - - -// The one and only CPodlahApp object - -CPodlahApp theApp; - - -// CPodlahApp initialization - -BOOL CPodlahApp::InitInstance() -{ - // InitCommonControls() is required on Windows XP if an application - // manifest specifies use of ComCtl32.dll version 6 or later to enable - // visual styles. Otherwise, any window creation will fail. - InitCommonControls(); - - CWinApp::InitInstance(); - - // Standard initialization - // If you are not using these features and wish to reduce the size - // of your final executable, you should remove from the following - // the specific initialization routines you do not need - // Change the registry key under which our settings are stored - // TODO: You should modify this string to be something appropriate - // such as the name of your company or organization - SetRegistryKey(_T("Local AppWizard-Generated Applications")); - - CPodlahDlg dlg; - m_pMainWnd = &dlg; - INT_PTR nResponse = dlg.DoModal(); - if (nResponse == IDOK) - { - // TODO: Place code here to handle when the dialog is - // dismissed with OK - } - else if (nResponse == IDCANCEL) - { - // TODO: Place code here to handle when the dialog is - // dismissed with Cancel - } - - // Since the dialog has been closed, return FALSE so that we exit the - // application, rather than start the application's message pump. - return FALSE; -} - - -extern "C" -{ - showview() {abort();} - screen_buffer_size() {abort();} - DxDoneWalk() {abort();} - DxZoomWalk() {abort();} - DxPrepareWalk() {abort();} - get_timer_value() {abort();} - DxDoneTurn() {abort();} - DxTurn() {abort();} - DxPrepareTurn() {abort();} - GetBuffer2nd() {abort();} - GetScreenAdr() {abort();} - put_picture() {abort();} - put_textured_bar_() {abort();} - RestoreScreen() {abort();} - outtext() {abort();} - set_aligned_position() {abort();} - trans_bar() {abort();} - text_width() {abort();} - RedirectScreenBufferSecond() {abort();} - void *getmem(int32_t size) {return malloc(size);} -} \ No newline at end of file diff --git a/mapedit/Podlahar/Podlahar.h b/mapedit/Podlahar/Podlahar.h deleted file mode 100644 index 071bd29..0000000 --- a/mapedit/Podlahar/Podlahar.h +++ /dev/null @@ -1,32 +0,0 @@ -// Podlah.h : main header file for the PROJECT_NAME application -// - -#pragma once - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - - -// CPodlahApp: -// See Podlah.cpp for the implementation of this class -// - -class CPodlahApp : public CWinApp -{ -public: - CPodlahApp(); - -// Overrides - public: - virtual BOOL InitInstance(); - -// Implementation - - DECLARE_MESSAGE_MAP() -}; - -extern CPodlahApp theApp; - diff --git a/mapedit/Podlahar/Podlahar.rc b/mapedit/Podlahar/Podlahar.rc deleted file mode 100644 index 51e89b1..0000000 --- a/mapedit/Podlahar/Podlahar.rc +++ /dev/null @@ -1,235 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Czech resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) -#ifdef _WIN32 -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -#pragma code_page(1250) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE MOVEABLE PURE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE MOVEABLE PURE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE MOVEABLE PURE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1250)\r\n" - "\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON DISCARDABLE "res\\Podlahar.ico" -#endif // Czech resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About Podlah" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 - LTEXT "Podlah Version 1.0",IDC_STATIC,40,10,119,8, - SS_NOPREFIX - LTEXT "Copyright (C) 2005",IDC_STATIC,40,25,119,8 - DEFPUSHBUTTON "OK",IDOK,178,7,50,16,WS_GROUP -END - -IDD_PODLAH_DIALOG DIALOGEX 0, 0, 455, 426 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Podlah" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - LTEXT "Hlavn textura:",IDC_STATIC,7,7,49,8 - EDITTEXT IDC_HLTEXTURA,60,7,314,12,ES_AUTOHSCROLL | WS_GROUP - PUSHBUTTON "Browse",IDC_BROWSE1,378,7,70,12,WS_GROUP - LTEXT "Vedlej textura:",IDC_STATIC,7,20,54,8 - EDITTEXT IDC_VDTEXTURA,60,21,314,12,ES_AUTOHSCROLL | WS_GROUP - PUSHBUTTON "Browse",IDC_BROWSE2,378,21,70,12,WS_GROUP - LTEXT "Barva mlhy",IDC_STATIC,7,41,36,8 - CONTROL "Button4",IDC_COLOR,"Button",BS_OWNERDRAW | WS_GROUP | - WS_TABSTOP,59,38,44,14 - LTEXT "Clov soubor:",IDC_STATIC,7,72,47,8 - EDITTEXT IDC_CILOVYSOUBOR,60,71,314,12,ES_AUTOHSCROLL | WS_GROUP - PUSHBUTTON "Browse",IDC_BROWSE3,378,71,70,12,WS_GROUP - DEFPUSHBUTTON "Preview",IDC_PREVIEW,7,111,50,14,WS_GROUP - CONTROL "Podlaha",IDC_TYP,"Button",BS_AUTORADIOBUTTON | WS_GROUP | - WS_TABSTOP,280,89,41,10 - CONTROL "Strop",IDC_TYP2,"Button",BS_AUTORADIOBUTTON,336,89,33, - 10 - PUSHBUTTON "Ulo obrzek",IDC_SAVEPIC,377,88,71,14,WS_GROUP - CONTROL "",IDC_IMAGE,"Static",SS_BLACKFRAME | WS_GROUP,7,133,441, - 286 - CONTROL "Generuj mlhu",IDC_GENMLHU,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,115,40,58,10 -END - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "CompanyName", "TODO: \0" - VALUE "FileDescription", "TODO: \0" - VALUE "FileVersion", "1.0.0.1\0" - VALUE "InternalName", "Podlah.exe\0" - VALUE "LegalCopyright", "TODO: (c) . All rights reserved.\0" - VALUE "OriginalFilename", "Podlah.exe\0" - VALUE "ProductName", "TODO: \0" - VALUE "ProductVersion", "1.0.0.1\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO MOVEABLE PURE -BEGIN - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END - - IDD_PODLAH_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 448 - TOPMARGIN, 7 - BOTTOMMARGIN, 419 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ABOUTBOX "&About Podlah..." - IDS_PCXFILTER "PCX images|*.pcx||" - IDS_BROWSEPCX "Vyber PCX soubor 500x320" - IDS_ERRORPCX "PCX je neplatn. Povolen je pouze obrzek ve formtu PCX 8-bit velikosti pesn 500x320." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE 9, 1 -#pragma code_page(1250) - -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/mapedit/Podlahar/Podlahar.sln b/mapedit/Podlahar/Podlahar.sln deleted file mode 100644 index 8fa88d5..0000000 --- a/mapedit/Podlahar/Podlahar.sln +++ /dev/null @@ -1,30 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Podlah", "Podlahar.vcproj", "{5D7F2D3A-8169-4514-A9EC-A0FDBBAC917B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SourceCodeControl) = preSolution - SccNumberOfProjects = 1 - SccProjectUniqueName0 = Podlahar.vcproj - SccProjectName0 = \u0022$/Skeldal\u0022,\u0020RYCAAAAA - SccLocalPath0 = ..\\.. - SccProvider0 = MSSCCI:Microsoft\u0020Visual\u0020SourceSafe - CanCheckoutShared = false - SccProjectFilePathRelativizedFromConnection0 = mapedit\\Podlahar\\ - EndGlobalSection - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {5D7F2D3A-8169-4514-A9EC-A0FDBBAC917B}.Debug.ActiveCfg = Debug|Win32 - {5D7F2D3A-8169-4514-A9EC-A0FDBBAC917B}.Debug.Build.0 = Debug|Win32 - {5D7F2D3A-8169-4514-A9EC-A0FDBBAC917B}.Release.ActiveCfg = Release|Win32 - {5D7F2D3A-8169-4514-A9EC-A0FDBBAC917B}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/mapedit/Podlahar/Podlahar.vcproj b/mapedit/Podlahar/Podlahar.vcproj deleted file mode 100644 index f591956..0000000 --- a/mapedit/Podlahar/Podlahar.vcproj +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mapedit/Podlahar/PodlaharDlg.cpp b/mapedit/Podlahar/PodlaharDlg.cpp deleted file mode 100644 index 27cfead..0000000 --- a/mapedit/Podlahar/PodlaharDlg.cpp +++ /dev/null @@ -1,260 +0,0 @@ -// PodlahDlg.cpp : implementation file -// - -#include "stdafx.h" -#include "Podlahar.h" -#include "PodlaharDlg.h" -#include ".\podlahardlg.h" -#include "..\..\DDLReader\WString.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#endif - - -// CAboutDlg dialog used for App About - -class CAboutDlg : public CDialog -{ -public: - CAboutDlg(); - -// Dialog Data - enum { IDD = IDD_ABOUTBOX }; - - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - -// Implementation -protected: - DECLARE_MESSAGE_MAP() -}; - -CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) -{ -} - -void CAboutDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); -} - -BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) -END_MESSAGE_MAP() - - -// CPodlahDlg dialog - - - -CPodlahDlg::CPodlahDlg(CWnd* pParent /*=NULL*/) - : CDialog(CPodlahDlg::IDD, pParent) - , vHlTextura(_T("")) - , vVdTextura(_T("")) - , vTarget(_T("")) - , vGenMlhu(FALSE) - , vType(0) -{ - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); -} - -void CPodlahDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - DDX_Text(pDX, IDC_HLTEXTURA, vHlTextura); - DDX_Text(pDX, IDC_VDTEXTURA, vVdTextura); - DDX_Control(pDX, IDC_COLOR, wColorButt); - DDX_Text(pDX, IDC_CILOVYSOUBOR, vTarget); - DDX_Control(pDX, IDC_BROWSE1, wBrowse1); - DDX_Control(pDX, IDC_BROWSE2, wBrowse2); - DDX_Control(pDX, IDC_BROWSE3, wBrowse3); - DDX_Control(pDX, IDC_SAVEPIC, wSavePic); - DDX_Control(pDX, IDC_IMAGE, wPreview); - DDX_Check(pDX, IDC_GENMLHU, vGenMlhu); - DDX_Radio(pDX, IDC_TYP, vType); -} - -BEGIN_MESSAGE_MAP(CPodlahDlg, CDialog) - ON_WM_SYSCOMMAND() - ON_WM_PAINT() - ON_WM_QUERYDRAGICON() - //}}AFX_MSG_MAP - ON_BN_CLICKED(IDC_BROWSE1, OnBnClickedBrowse) - ON_BN_CLICKED(IDC_BROWSE2, OnBnClickedBrowse) - ON_BN_CLICKED(IDC_BROWSE3, OnBnClickedBrowseSave) - ON_BN_CLICKED(IDC_COLOR, OnBnClickedColor) - ON_BN_CLICKED(IDC_PREVIEW, OnBnClickedPreview) - ON_BN_CLICKED(IDC_SAVEPIC, OnBnClickedSavepic) -END_MESSAGE_MAP() - - -// CPodlahDlg message handlers - -BOOL CPodlahDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - // Add "About..." menu item to system menu. - - // IDM_ABOUTBOX must be in the system command range. - ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); - ASSERT(IDM_ABOUTBOX < 0xF000); - - CMenu* pSysMenu = GetSystemMenu(FALSE); - if (pSysMenu != NULL) - { - CString strAboutMenu; - strAboutMenu.LoadString(IDS_ABOUTBOX); - if (!strAboutMenu.IsEmpty()) - { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); - } - } - - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon - - // TODO: Add extra initialization here - - return TRUE; // return TRUE unless you set the focus to a control -} - -void CPodlahDlg::OnSysCommand(UINT nID, LPARAM lParam) -{ - if ((nID & 0xFFF0) == IDM_ABOUTBOX) - { - CAboutDlg dlgAbout; - dlgAbout.DoModal(); - } - else - { - CDialog::OnSysCommand(nID, lParam); - } -} - -// If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. - -void CPodlahDlg::OnPaint() -{ - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } -} - -// The system calls this function to obtain the cursor to display while the user drags -// the minimized window. -HCURSOR CPodlahDlg::OnQueryDragIcon() -{ - return static_cast(m_hIcon); -} - -void CPodlahDlg::OnBnClickedBrowse() -{ - CString pszFilePath; - GetFocus()->GetNextWindow(GW_HWNDPREV)->GetWindowText(pszFilePath); - CString filter;filter.LoadString(IDS_PCXFILTER); - CString title;title.LoadString(IDS_BROWSEPCX); - CFileDialog fdlg(TRUE,_T("PCX"),pszFilePath,OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,filter); - if (fdlg.DoModal()==IDOK) - { - pszFilePath=fdlg.GetPathName(); -#ifdef _UNICODE - char *name=(char *)alloca(pszFilePath.GetLength()+1); - WideCharToMultiByte(CP_ACP,0,pszFilePath,pszFilePath.GetLength()+1,name,pszFilePath.GetLength()+1,NULL,NULL); -#else - const char *name=pszFilePath; -#endif - if (CheckPCX(name)==0) - { - GetFocus()->GetNextWindow(GW_HWNDPREV)->SetWindowText(fdlg.GetPathName()); - } - else - AfxMessageBox(IDS_ERRORPCX); - } -} - -void CPodlahDlg::OnBnClickedBrowseSave() -{ - CString pszFilePath; - GetFocus()->GetNextWindow(GW_HWNDPREV)->GetWindowText(pszFilePath); - CString filter;filter.LoadString(IDS_PCXFILTER); - CString title;title.LoadString(IDS_BROWSEPCX); - CFileDialog fdlg(FALSE,_T("PCX"),pszFilePath,OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,filter); - if (fdlg.DoModal()) - { - GetFocus()->GetNextWindow(GW_HWNDPREV)->SetWindowText(fdlg.GetPathName()); - } -} - -void CPodlahDlg::OnBnClickedColor() -{ - CColorDialog dlg(wColorButt._color,CC_FULLOPEN|CC_ANYCOLOR|CC_RGBINIT); - if (dlg.DoModal()==IDOK) - { - wColorButt.SetColor(dlg.GetColor()); - } -} - -void CPodlahDlg::OnBnClickedPreview() -{ - UpdateData(TRUE); -#ifdef _UNICODE - WString hlTex(vHlTextura.GetString()); - WString vlTex(vVdTextura.GetString()); - COLORREF color=wColorButt._color; - char *result=PodlahaStrop(GetRValue(color), GetGValue(color), GetBValue(color), - hlTex.AsUTF8(hlTex),vlTex.AsUTF8(vlTex),vGenMlhu); -#else - const char *hlTex=vHlTextura; - const char *vlTex=vVdTextura; - COLORREF color=wColorButt._color; - char *result=PodlahaStrop(GetRValue(color), GetGValue(color), GetBValue(color), - hlTex,vlTex,vGenMlhu); -#endif - wPreview.UpdateBuffer(result+512+6); - wPreview.SetPalette(GetPodlahaPalette()); - -} - -void CPodlahDlg::OnBnClickedSavepic() -{ - UpdateData(TRUE); - if (vTarget.GetLength()) - { - OnBnClickedPreview(); -#ifdef _UNICODE - WString name(vTarget.GetString()); - char *cname=const_cast(name.AsUTF8(name)); -#else - char *cname=const_cast((LPCTSTR)vTarget); -#endif - if (vType) - save_pcx(cname,0,0,639,89); - else - save_pcx(cname,0,360-198,639,360); - ShellExecute(*this,NULL,vTarget,0,NULL,SW_SHOWNORMAL); - } -} diff --git a/mapedit/Podlahar/PodlaharDlg.h b/mapedit/Podlahar/PodlaharDlg.h deleted file mode 100644 index b44659e..0000000 --- a/mapedit/Podlahar/PodlaharDlg.h +++ /dev/null @@ -1,62 +0,0 @@ -// PodlahDlg.h : header file -// - -#pragma once -#include "afxwin.h" -#include "ColorButton.h" -#include "ImageView.h" - - -// CPodlahDlg dialog -class CPodlahDlg : public CDialog -{ -// Construction -public: - CPodlahDlg(CWnd* pParent = NULL); // standard constructor - -// Dialog Data - enum { IDD = IDD_PODLAH_DIALOG }; - - protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - -// Implementation -protected: - HICON m_hIcon; - - // Generated message map functions - virtual BOOL OnInitDialog(); - afx_msg void OnSysCommand(UINT nID, LPARAM lParam); - afx_msg void OnPaint(); - afx_msg HCURSOR OnQueryDragIcon(); - DECLARE_MESSAGE_MAP() -public: - afx_msg void OnBnClickedBrowse(); - int type; - CString vHlTextura; - CString vVdTextura; - CColorButton wColorButt; - CString vTarget; - CButton wBrowse1; - CButton wBrowse2; - CButton wBrowse3; - CButton wSavePic; - CImageView wPreview; - afx_msg void OnBnClickedColor(); - afx_msg void OnBnClickedPreview(); - BOOL vGenMlhu; - afx_msg void OnBnClickedSavepic(); - afx_msg void OnBnClickedBrowseSave(); - int vType; -}; - - -extern "C" -{ - char *PodlahaStrop(int r, int g, int b, const char *filename1, const char *filename2, int genMlhu); - char *GetPodlahaPalette(); - int save_pcx(char *filename,int x1,int y1,int x2,int y2); - char CheckPCX(const char *pcx); - -} \ No newline at end of file diff --git a/mapedit/Podlahar/Podlahy.c b/mapedit/Podlahar/Podlahy.c deleted file mode 100644 index 404bf87..0000000 --- a/mapedit/Podlahar/Podlahy.c +++ /dev/null @@ -1,397 +0,0 @@ -#include -#include -#include -#include -#include -#include "..\..\libs\types.h" -#include "..\..\game\engine1.h" -#include "..\..\libs\pcx.h" - - -void calc_points(); -void create_tables(); - -char filename1[128]; -char filename2[128]; - -char buffer[640*480+6+512]; - -char *obr1,*obr2; - -#pragma pack(1) -typedef struct tbarva - { - char r,g,b; - }TBARVA; -#pragma pack() - -TBARVA shadow; -int shadow_max; - -struct tbarva palette[256]; - - -char datapath[]=""; -extern struct all_view showtabs; -extern t_points viewport_geometry; - -void do_events() - { - - } - -int get_shd_color(char src,int cur) - { - struct tbarva what; - int c,d,m,p,i,ml; - - m=256*256*256; - c=0;d=0; - what=palette[src]; - cur=shadow_max-cur; - cur=(int)(shadow_max*sqrt((float)cur/(float)shadow_max)); - what.r=(shadow.r+(what.r-shadow.r)*cur/shadow_max); - what.g=(shadow.g+(what.g-shadow.g)*cur/shadow_max); - what.b=(shadow.b+(what.b-shadow.b)*cur/shadow_max); - for(i=0;i<256;i++) - { - p=(what.r-palette[i].r)*(what.r-palette[i].r)+ - (what.g-palette[i].g)*(what.g-palette[i].g)+ - (what.b-palette[i].b)*(what.b-palette[i].b); - if (p=1000) xp-=1000; - while (xp<0) xp+=1000; - if ((xp>=500)^(swap)) srcp=srcadr2+(xp % 500); else srcp=srcadr1+(xp%500); - if (genMlhu) - { - if (table[*srcp]==0xffff) table[*srcp]=get_shd_color(*srcp,yline); - *point=table[*srcp]&0xff; - } - else - *point=*srcp; - - } - return showtabs.f_table[2][yline].counter; - } - -void draw_it_all_f(int genMlhu) - { - int i,m,y,m2,s; - - y=0;s=0; - m2=(360-MIDDLE_Y)-viewport_geometry[0][0][VIEW3D_Z].y; - shadow_max=m2; - for (i=0;i=1000) xp-=1000; - while (xp<0) xp+=1000; - if ((xp>=500)^(swap)) srcp=srcadr2+(xp % 500); else srcp=srcadr1+(xp % 500); - if (genMlhu) - { - if (table[*srcp]==0xffff) table[*srcp]=get_shd_color(*srcp,yline); - *point=(table[*srcp]&0xff); - } - else - *point=*srcp; - } - return showtabs.c_table[2][yline].counter; - } - -void draw_it_all_c(int genMlhu) - { - int i,m,y,m2,s; - - y=0;s=0; - m2=MIDDLE_Y+viewport_geometry[0][1][VIEW3D_Z].y; - shadow_max=m2; - for (i=0;i \n" - "\n" - " \n" - " soubory s texturami ve formatu pcx. Textura musi mit velikost 500x320\n\n" - " \n" - " Cisla predstavujici slozky barvy, jenz se pouzije ke generovani mlhy,\n" - " nebo ke stmavovani. Jednotlive hodnoty jsou v rozsahu <0-255>\n" - "\n" - "Vysledne soubory se ulozi do aktualniho adresare pod jmeny:\n" - " PODLAHA.PCX - soubor s podlahou\n" - " STROP.PCX - soubor se stropem\n" - "\n" - "Pozn.: Prestoze se jedna o korektni format PCX, doporucuji oba soubory \n" - " natahnout do Autodesk Animatora a znovu v tomto formatu ulozit\n" - " Stavalo se mi, ze se muj PCX dekomprimator s timto vygenerovanym souborem\n" - " hroutil.\n" - ); - exit(0); - } -*/ -/* -main(int argv,char *argc[]) - { - int r,g,b,i; - char rv[10],gv[10],bv[10]; - if (argv!=6) help(); - strass(filename1,argc[1],128); - strass(filename2,argc[2],128); - strass(rv,argc[3],10); - strass(gv,argc[4],10); - strass(bv,argc[5],10); - sscanf(rv,"%d",&r); - sscanf(gv,"%d",&g); - sscanf(bv,"%d",&b); - if (r<0 || r>255 || g<0 || g>255 || b<0 || b>255 ) - { - printf("Hodnoty by mely byt rozsahu <0-255> \n"); - abort(); - } - shadow.r=r;shadow.g=g;shadow.b=b; - calc_points(); - create_tables(); - read_palette(filename1,&palette); - shadow_max=100; - memset(buffer,get_shd_color(0,100),640*480+6+512); - *(word *)buffer=640; - *((word *)buffer+1)=480; - *((word *)buffer+2)=8; - if (open_pcx(filename1,A_8BIT,&obr1) ) - { - printf("Nemohu najit %s.\n",filename1); - abort(); - } - if (open_pcx(filename2,A_8BIT,&obr2) ) - { - printf("Nemohu najit %s.\n",filename2); - abort(); - } - memcpy(buffer+6,obr1+6,512); - draw_it_all_f(); - draw_it_all_c(); - initmode32(); - for(i=0;i>3)<<10)+((g>>3)<<5)+(b>>3); - put_picture(0,0,buffer); - showview(0,0,0,0); - getchar(); - closemode(); - save_pcx("STROP.PCX",0,0,639,92); - save_pcx("PODLAHA.PCX",0,360-198,639,360); - printf("Vytvoreny soubory STROP.PCX a PODLAHA.PCX\n"); - - } - -*/ - - - int32_t scr_linelen=1280; - int32_t scr_linelen2=640; - - char *PodlahaStrop(int r, int g, int b, const char *filename1, const char *filename2, int genMlhu) - { - shadow.r=r;shadow.g=g;shadow.b=b; - obr1=obr2=NULL; - calc_points(); - create_tables(); - read_palette(filename1,&palette); - shadow_max=100; - memset(buffer,get_shd_color(0,100),640*480+6+512); - *(word *)buffer=640; - *((word *)buffer+1)=480; - *((word *)buffer+2)=8; - if (open_pcx(filename1,A_8BIT,&obr1) ) - { - free(obr1); - return NULL; - } - if (open_pcx(filename2,A_8BIT,&obr2) ) - { - free(obr1); - free(obr2); - return NULL; - } - memcpy(buffer+6,obr1+6,512); - draw_it_all_f(genMlhu); - draw_it_all_c(genMlhu); - free(obr1); - free(obr2); - return buffer; - } - - char CheckPCX(const char *pcx) - { - char p=open_pcx(pcx,A_8BIT,&obr1); - word *xy; - - if (p) {free(obr1);return -1;} - xy=(word *)obr1; - if (xy[0]!=500 || xy[1]!=320) p=-1; - free(obr1); - return p; - - } - -char *GetPodlahaPalette() -{ - return (char *)palette; -} \ No newline at end of file diff --git a/mapedit/Podlahar/res/Podlahar.ico b/mapedit/Podlahar/res/Podlahar.ico deleted file mode 100644 index 7eef0bcbe6580a6f464d688906172c2d9de44262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmc&zF>b>!3}jLb9s)T}@Kod(893@u8ajANzT`op9^o+)S?=nU(FD@%0s)Sg^oyC8{H z9myetc;MEP)59v(LMa~xK8Yu^jIR*H22uCFiq5%C{s7(PJi>o15i^bmX4(vPxWAio z9ryY#AU_jfnd047-@`)XzL?%iS$gQyFP{44kS9X)fN{{QoL~hO-&=q&20Zr*cxFAt PkaNE{wR~2C$NfnjhSXWT diff --git a/mapedit/Podlahar/res/Podlahar.rc2 b/mapedit/Podlahar/res/Podlahar.rc2 deleted file mode 100644 index 08c8e1d..0000000 --- a/mapedit/Podlahar/res/Podlahar.rc2 +++ /dev/null @@ -1,13 +0,0 @@ -// -// PODLAHAR.RC2 - resources Microsoft Visual C++ does not edit directly -// - -#ifdef APSTUDIO_INVOKED - #error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/mapedit/Podlahar/res/Podlahář.ico b/mapedit/Podlahar/res/Podlahář.ico deleted file mode 100644 index 8a84ca3d34597ada57e4c79ef62b28cf07b5ed9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21630 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 V7_3;)FxY%t!w{8u!r68W{|isv(C`2N diff --git a/mapedit/Podlahar/res/Podlahář.rc2 b/mapedit/Podlahar/res/Podlahář.rc2 deleted file mode 100644 index c14d366..0000000 --- a/mapedit/Podlahar/res/Podlahář.rc2 +++ /dev/null @@ -1,13 +0,0 @@ -// -// Podlah.RC2 - resources Microsoft Visual C++ does not edit directly -// - -#ifdef APSTUDIO_INVOKED -#error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/mapedit/Podlahar/resource.h b/mapedit/Podlahar/resource.h deleted file mode 100644 index e7d4b77..0000000 --- a/mapedit/Podlahar/resource.h +++ /dev/null @@ -1,39 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by Podlahar.rc -// -#define IDM_ABOUTBOX 0x0010 -#define IDD_ABOUTBOX 100 -#define IDS_ABOUTBOX 101 -#define IDD_PODLAH_DIALOG 102 -#define IDS_PCXFILTER 102 -#define IDS_BROWSEPCX 103 -#define IDS_ERRORPCX 104 -#define IDR_MAINFRAME 128 -#define IDC_HLTEXTURA 1000 -#define IDC_BROWSE1 1001 -#define IDC_VDTEXTURA 1002 -#define IDC_BROWSE2 1003 -#define IDC_CILOVYSOUBOR 1004 -#define IDC_COLOR 1005 -#define IDC_BROWSE3 1006 -#define IDC_SAVEPIC 1009 -#define IDC_BUTTON9 1010 -#define IDC_SAVEREF 1010 -#define IDC_TYP 1011 -#define IDC_TYP2 1012 -#define IDC_IMAGE 1013 -#define IDC_PREVIEW 1014 -#define IDC_GENMLHU 1015 -#define IDC_TYP3 1016 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 129 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1016 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/mapedit/Podlahar/stdafx.cpp b/mapedit/Podlahar/stdafx.cpp deleted file mode 100644 index 9520d94..0000000 --- a/mapedit/Podlahar/stdafx.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// Podlah.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - - diff --git a/mapedit/Podlahar/stdafx.h b/mapedit/Podlahar/stdafx.h deleted file mode 100644 index 6ec1eb3..0000000 --- a/mapedit/Podlahar/stdafx.h +++ /dev/null @@ -1,41 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#pragma once - -#ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif - -// Modify the following defines if you have to target a platform prior to the ones specified below. -// Refer to MSDN for the latest info on corresponding values for different platforms. -#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later. -#define WINVER 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. -#endif - -#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later. -#define _WIN32_WINNT 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. -#endif - -#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. -#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. -#endif - -#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later. -#define _WIN32_IE 0x0400 // Change this to the appropriate value to target IE 5.0 or later. -#endif - -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit - -// turns off MFC's hiding of some common and often safely ignored warning messages -#define _AFX_ALL_WARNINGS - -#include // MFC core and standard components -#include // MFC extensions - -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt index 33f54d2..8b22c12 100644 --- a/platform/CMakeLists.txt +++ b/platform/CMakeLists.txt @@ -29,7 +29,6 @@ if(WIN32) target_compile_definitions(skeldal_platform PRIVATE PLATFORM_WINDOWS) message(STATUS "Building for Windows") - elseif(UNIX AND NOT APPLE) target_sources(skeldal_platform PRIVATE linux/save_folder.cpp @@ -40,6 +39,11 @@ elseif(UNIX AND NOT APPLE) linux/app_start.cpp ) target_compile_definitions(skeldal_platform PRIVATE PLATFORM_LINUX) + add_custom_command( + TARGET skeldal POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_LIST_DIR}/linux/skeldal.sh + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/skeldal.sh) message(STATUS "Building for Linux") elseif(APPLE) diff --git a/platform/istr.c b/platform/istr.c index 65e155c..3d1fdfd 100644 --- a/platform/istr.c +++ b/platform/istr.c @@ -103,3 +103,13 @@ int imatch(const char *text, const char *hledany) { return 1; // Všechny části byly nalezeny ve správném pořadí } + +const char *strcopy_n(char *target, const char *source, int target_size) { + const char *ret = target; + while (target_size>1 && *source) { + *target++ = *source++; + --target_size; + } + *target = 0; + return ret; +} diff --git a/platform/linux/skeldal.sh b/platform/linux/skeldal.sh new file mode 100755 index 0000000..9f86177 --- /dev/null +++ b/platform/linux/skeldal.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +temp_file=$(mktemp /tmp/skeldal.XXXXXX.log) + +./skeldal > "$temp_file" 2>&1 + +exit_code=$? + +if [ $exit_code -ne 0 ]; then + error_message=$(cat "$temp_file") + + if command -v zenity > /dev/null; then + zenity --warning --title="Skeldal ERROR" --text="$error_message" + elif command -v kdialog > /dev/null; then + kdialog --title "Skeldal ERROR" --error "$error_message" + elif command -v xmessage > /dev/null; then + xmessage -center -file $temp_file + elif command -v xdg-open > /dev/null; then + xdg-open "$temp_file" + sleep 5; + else + cat "$temp_file" + fi +fi +#rm $temp_file +exit $exit_code \ No newline at end of file diff --git a/platform/platform.h b/platform/platform.h index 6d287fa..bd82317 100644 --- a/platform/platform.h +++ b/platform/platform.h @@ -16,8 +16,8 @@ #pragma warning(disable: 4456) #pragma warning(disable: 4457) #pragma warning(disable: 4702) -#define CASE_FALLTHROUGH -#else +#define CASE_FALLTHROUGH +#else #define CASE_FALLTHROUGH [[fallthrough]] #endif @@ -88,6 +88,7 @@ const char *file_icase_find(const char *pathname); int istrcmp(const char *a, const char *b); int imatch(const char *haystack, const char *needle); +const char *strcopy_n(char *target, const char *source, int target_size); #define MIN(a, b) ((a)<(b)?(a):(b)) #define MAX(a, b) ((a)>(b)?(a):(b)) void strupper(char *c); diff --git a/platform/sdl/BGraph2.cpp b/platform/sdl/BGraph2.cpp index 8656819..c00d8f3 100644 --- a/platform/sdl/BGraph2.cpp +++ b/platform/sdl/BGraph2.cpp @@ -225,3 +225,8 @@ char game_display_is_quit_requested() { void game_display_cancel_quit_request() { return get_sdl_global_context().cancel_quit_request(); } + +void game_display_set_icon(const void *icon_data, size_t icon_size) { + auto &sdl = get_sdl_global_context(); + sdl.set_window_icon(icon_data, icon_size); +} diff --git a/platform/sdl/BGraph2.h b/platform/sdl/BGraph2.h index 64f398a..cda94ba 100644 --- a/platform/sdl/BGraph2.h +++ b/platform/sdl/BGraph2.h @@ -1,6 +1,7 @@ #include #include "../config.h" +#include #ifndef __BGRAPH_DX_WRAPPER_ #define __BGRAPH_DX_WRAPPER_ @@ -23,6 +24,7 @@ void game_display_close(void); void game_display_update_rect(unsigned short x,unsigned short y,unsigned short xs,unsigned short ys); char game_display_is_quit_requested(); void game_display_cancel_quit_request(); +void game_display_set_icon(const void *icon_data, size_t icon_size); void *DxPrepareWalk(int ypos); void DxZoomWalk(void *handle, int ypos, int *points,float phase, void *lodka); diff --git a/platform/sdl/sdl_context.cpp b/platform/sdl/sdl_context.cpp index bc7043f..1c1898c 100644 --- a/platform/sdl/sdl_context.cpp +++ b/platform/sdl/sdl_context.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include void SDLContext::SDL_Deleter::operator ()(SDL_Window* window) { @@ -613,3 +614,17 @@ void SDLContext::pause_audio(bool pause) { void SDLContext::close_audio() { _audio.reset(); } + +void SDLContext::set_window_icon(const void *icon_data, size_t icon_size) { + SDL_Surface *surface = SDL_LoadBMP_RW(SDL_RWFromConstMem(icon_data, icon_size), 1); + if (surface == 0) { + char buff[256]; + snprintf(buff,sizeof(buff),"Can't load icon: %s", SDL_GetError()); + display_error(buff); + std::ofstream x("test.dat", std::ios::out|std::ios::binary|std::ios::trunc); + x.write(reinterpret_cast(icon_data), icon_size); + } else { + SDL_SetWindowIcon(_window.get(), surface); + } + +} diff --git a/platform/sdl/sdl_context.h b/platform/sdl/sdl_context.h index 396d670..5b131ab 100644 --- a/platform/sdl/sdl_context.h +++ b/platform/sdl/sdl_context.h @@ -47,6 +47,8 @@ public: void init_video(const VideoConfig &config, const char *title); + void set_window_icon(const void *icon_data, size_t icon_size); + void close_video(); AudioInfo init_audio(const AudioConfig &config, SDL_AudioCallback cb, void *cb_ctx);