From 9481e88bbda1f1b61bee98f9f5300b22f7e4f453 Mon Sep 17 00:00:00 2001 From: sam Date: Sun, 8 Sep 2024 18:03:02 +1200 Subject: [PATCH] first commit --- .gitignore | 1 + .session.vim | 54 + AUTHORS | 163 + CMakeLists.txt | 243 + COPYING | 367 + ICONS/icons.rc | 65 + ICONS/prboom-plus.bash | 51 + ICONS/prboom-plus.desktop | 10 + ICONS/prboom-plus.exe.manifest | 32 + ICONS/prboom-plus.ico | Bin 0 -> 417374 bytes ICONS/prboom-plus.svg | 127 + ICONS/resource.h | 20 + INSTALL | 245 + NEWS | 300 + README | 251 + cmake/FindALSA.cmake | 69 + cmake/FindDUMB.cmake | 28 + cmake/FindFluidSynth.cmake | 23 + cmake/FindLibMad.cmake | 45 + cmake/FindOgg.cmake | 53 + cmake/FindPCREPOSIX.cmake | 34 + cmake/FindPortMidi.cmake | 36 + cmake/FindSDL2.cmake | 368 + cmake/FindSDL2_image.cmake | 222 + cmake/FindSDL2_mixer.cmake | 220 + cmake/FindSDL2_net.cmake | 222 + cmake/FindVorbis.cmake | 76 + cmake/TargetArch.cmake | 157 + cmake/config.h.cin | 47 + data/CMakeLists.txt | 370 + data/convert-icon | 74 + data/flats/-n0_tex-.ppm | Bin 0 -> 12301 bytes data/graphics/boxcc.ppm | 4 + data/graphics/boxcl.ppm | 4 + data/graphics/boxcr.ppm | 4 + data/graphics/boxlc.ppm | 4 + data/graphics/boxll.ppm | 4 + data/graphics/boxlr.ppm | 4 + data/graphics/boxuc.ppm | 4 + data/graphics/boxul.ppm | 4 + data/graphics/boxur.ppm | 4 + data/graphics/cross1.ppm | Bin 0 -> 242 bytes data/graphics/cross2.ppm | Bin 0 -> 242 bytes data/graphics/cross3.ppm | Bin 0 -> 242 bytes data/graphics/dig0.ppm | Bin 0 -> 116 bytes data/graphics/dig1.ppm | Bin 0 -> 116 bytes data/graphics/dig2.ppm | Bin 0 -> 116 bytes data/graphics/dig3.ppm | Bin 0 -> 116 bytes data/graphics/dig4.ppm | Bin 0 -> 116 bytes data/graphics/dig45.ppm | Bin 0 -> 116 bytes data/graphics/dig46.ppm | Bin 0 -> 162 bytes data/graphics/dig47.ppm | Bin 0 -> 116 bytes data/graphics/dig5.ppm | Bin 0 -> 116 bytes data/graphics/dig58.ppm | Bin 0 -> 116 bytes data/graphics/dig6.ppm | Bin 0 -> 116 bytes data/graphics/dig7.ppm | Bin 0 -> 116 bytes data/graphics/dig8.ppm | Bin 0 -> 116 bytes data/graphics/dig9.ppm | Bin 0 -> 116 bytes data/graphics/dig91.ppm | Bin 0 -> 116 bytes data/graphics/dig93.ppm | Bin 0 -> 116 bytes data/graphics/diga.ppm | Bin 0 -> 116 bytes data/graphics/digb.ppm | Bin 0 -> 116 bytes data/graphics/digc.ppm | Bin 0 -> 116 bytes data/graphics/digd.ppm | Bin 0 -> 116 bytes data/graphics/dige.ppm | Bin 0 -> 116 bytes data/graphics/digf.ppm | Bin 0 -> 116 bytes data/graphics/digg.ppm | Bin 0 -> 116 bytes data/graphics/digh.ppm | Bin 0 -> 116 bytes data/graphics/digi.ppm | Bin 0 -> 116 bytes data/graphics/digj.ppm | Bin 0 -> 116 bytes data/graphics/digk.ppm | Bin 0 -> 116 bytes data/graphics/digl.ppm | Bin 0 -> 116 bytes data/graphics/digm.ppm | Bin 0 -> 116 bytes data/graphics/dign.ppm | Bin 0 -> 116 bytes data/graphics/digo.ppm | Bin 0 -> 116 bytes data/graphics/digp.ppm | Bin 0 -> 116 bytes data/graphics/digq.ppm | Bin 0 -> 116 bytes data/graphics/digr.ppm | Bin 0 -> 116 bytes data/graphics/digs.ppm | Bin 0 -> 116 bytes data/graphics/digt.ppm | Bin 0 -> 116 bytes data/graphics/digu.ppm | Bin 0 -> 116 bytes data/graphics/digv.ppm | Bin 0 -> 116 bytes data/graphics/digw.ppm | Bin 0 -> 116 bytes data/graphics/digx.ppm | Bin 0 -> 116 bytes data/graphics/digy.ppm | Bin 0 -> 116 bytes data/graphics/digz.ppm | Bin 0 -> 116 bytes data/graphics/m_butt1.ppm | Bin 0 -> 688 bytes data/graphics/m_butt2.ppm | Bin 0 -> 688 bytes data/graphics/m_colors.ppm | Bin 0 -> 56322 bytes data/graphics/m_palno.ppm | Bin 0 -> 158 bytes data/graphics/m_palsel.ppm | Bin 0 -> 254 bytes data/graphics/m_vbox.ppm | Bin 0 -> 12917 bytes data/graphics/stbr123.ppm | Bin 0 -> 203 bytes data/graphics/stbr124.ppm | Bin 0 -> 203 bytes data/graphics/stbr125.ppm | Bin 0 -> 203 bytes data/graphics/stbr126.ppm | Bin 0 -> 203 bytes data/graphics/stbr127.ppm | Bin 0 -> 203 bytes data/graphics/stcfn096.ppm | Bin 0 -> 59 bytes data/graphics/stkeys6.ppm | Bin 0 -> 158 bytes data/graphics/stkeys7.ppm | Bin 0 -> 158 bytes data/graphics/stkeys8.ppm | Bin 0 -> 158 bytes data/lumps/-prbhud-.lmp | 153 + data/lumps/animated.lmp | Bin 0 -> 510 bytes data/lumps/b_end.lmp | 0 data/lumps/b_start.lmp | 0 data/lumps/bfgbex.lmp | 3 + data/lumps/c_end.lmp | 0 data/lumps/c_start.lmp | 0 data/lumps/chexdeh.lmp | 811 + data/lumps/crblack.lmp | Bin 0 -> 256 bytes data/lumps/crblue.lmp | Bin 0 -> 256 bytes data/lumps/crblue2.lmp | Bin 0 -> 256 bytes data/lumps/crbrick.lmp | Bin 0 -> 256 bytes data/lumps/crbrown.lmp | Bin 0 -> 256 bytes data/lumps/crgold.lmp | Bin 0 -> 256 bytes data/lumps/crgray.lmp | Bin 0 -> 256 bytes data/lumps/crgreen.lmp | Bin 0 -> 256 bytes data/lumps/crorange.lmp | Bin 0 -> 256 bytes data/lumps/crpurple.lmp | Bin 0 -> 256 bytes data/lumps/crred.lmp | Bin 0 -> 256 bytes data/lumps/crtan.lmp | Bin 0 -> 256 bytes data/lumps/crwhite.lmp | Bin 0 -> 256 bytes data/lumps/cryellow.lmp | Bin 0 -> 256 bytes data/lumps/endboom.lmp | 1 + data/lumps/gammatbl.lmp | 3 + data/lumps/glfp.lmp | 18 + data/lumps/glshadow.lmp | Bin 0 -> 12342 bytes data/lumps/glvp.lmp | 6 + data/lumps/m_ammo.lmp | Bin 0 -> 4606 bytes data/lumps/m_armour.lmp | Bin 0 -> 5401 bytes data/lumps/m_arrow.lmp | Bin 0 -> 4785 bytes data/lumps/m_health.lmp | Bin 0 -> 3818 bytes data/lumps/m_key.lmp | Bin 0 -> 4627 bytes data/lumps/m_mark.lmp | Bin 0 -> 5692 bytes data/lumps/m_normal.lmp | Bin 0 -> 3315 bytes data/lumps/m_power.lmp | Bin 0 -> 5307 bytes data/lumps/m_shadow.lmp | Bin 0 -> 19952 bytes data/lumps/m_weap.lmp | Bin 0 -> 11738 bytes data/lumps/nervebex.lmp | 33 + data/lumps/sinetabl.lmp | Bin 0 -> 40960 bytes data/lumps/switches.lmp | Bin 0 -> 820 bytes data/lumps/tangtabl.lmp | Bin 0 -> 16384 bytes data/lumps/tantoang.lmp | Bin 0 -> 8196 bytes data/lumps/watermap.lmp | Bin 0 -> 8704 bytes data/palette.rgb | Bin 0 -> 768 bytes data/prboom.txt | 229 + data/rd_graphic.c | 197 + data/rd_graphic.h | 11 + data/rd_main.c | 174 + data/rd_output.c | 143 + data/rd_output.h | 10 + data/rd_palette.c | 93 + data/rd_palette.h | 10 + data/rd_sound.c | 81 + data/rd_sound.h | 7 + data/rd_util.c | 114 + data/rd_util.h | 38 + data/sounds/dsdgact.wav | Bin 0 -> 9901 bytes data/sounds/dsdgatk.wav | Bin 0 -> 7937 bytes data/sounds/dsdgdth.wav | Bin 0 -> 21839 bytes data/sounds/dsdgpain.wav | Bin 0 -> 6062 bytes data/sounds/dsdgsit.wav | Bin 0 -> 7027 bytes data/sprites/dogsa1.ppm | Bin 0 -> 14071 bytes data/sprites/dogsa2.ppm | Bin 0 -> 14071 bytes data/sprites/dogsa3.ppm | Bin 0 -> 14071 bytes data/sprites/dogsa4.ppm | Bin 0 -> 14071 bytes data/sprites/dogsa5.ppm | Bin 0 -> 14071 bytes data/sprites/dogsa6.ppm | Bin 0 -> 14071 bytes data/sprites/dogsa7.ppm | Bin 0 -> 14071 bytes data/sprites/dogsa8.ppm | Bin 0 -> 14071 bytes data/sprites/dogsb1.ppm | Bin 0 -> 14071 bytes data/sprites/dogsb2.ppm | Bin 0 -> 14071 bytes data/sprites/dogsb3.ppm | Bin 0 -> 14071 bytes data/sprites/dogsb4.ppm | Bin 0 -> 14071 bytes data/sprites/dogsb5.ppm | Bin 0 -> 14071 bytes data/sprites/dogsb6.ppm | Bin 0 -> 14071 bytes data/sprites/dogsb7.ppm | Bin 0 -> 14071 bytes data/sprites/dogsb8.ppm | Bin 0 -> 14071 bytes data/sprites/dogsc1.ppm | Bin 0 -> 14071 bytes data/sprites/dogsc2.ppm | Bin 0 -> 14071 bytes data/sprites/dogsc3.ppm | Bin 0 -> 14071 bytes data/sprites/dogsc4.ppm | Bin 0 -> 14071 bytes data/sprites/dogsc5.ppm | Bin 0 -> 14071 bytes data/sprites/dogsc6.ppm | Bin 0 -> 14071 bytes data/sprites/dogsc7.ppm | Bin 0 -> 14071 bytes data/sprites/dogsc8.ppm | Bin 0 -> 14071 bytes data/sprites/dogsd1.ppm | Bin 0 -> 14071 bytes data/sprites/dogsd2.ppm | Bin 0 -> 14071 bytes data/sprites/dogsd3.ppm | Bin 0 -> 14071 bytes data/sprites/dogsd4.ppm | Bin 0 -> 14071 bytes data/sprites/dogsd5.ppm | Bin 0 -> 14071 bytes data/sprites/dogsd6.ppm | Bin 0 -> 14071 bytes data/sprites/dogsd7.ppm | Bin 0 -> 14071 bytes data/sprites/dogsd8.ppm | Bin 0 -> 14071 bytes data/sprites/dogse1.ppm | Bin 0 -> 14071 bytes data/sprites/dogse2.ppm | Bin 0 -> 14071 bytes data/sprites/dogse3.ppm | Bin 0 -> 14071 bytes data/sprites/dogse4.ppm | Bin 0 -> 14071 bytes data/sprites/dogse5.ppm | Bin 0 -> 14071 bytes data/sprites/dogse6.ppm | Bin 0 -> 14071 bytes data/sprites/dogse7.ppm | Bin 0 -> 14071 bytes data/sprites/dogse8.ppm | Bin 0 -> 14071 bytes data/sprites/dogsf1.ppm | Bin 0 -> 14071 bytes data/sprites/dogsf2.ppm | Bin 0 -> 14071 bytes data/sprites/dogsf3.ppm | Bin 0 -> 14071 bytes data/sprites/dogsf4.ppm | Bin 0 -> 14071 bytes data/sprites/dogsf5.ppm | Bin 0 -> 14071 bytes data/sprites/dogsf6.ppm | Bin 0 -> 14071 bytes data/sprites/dogsf7.ppm | Bin 0 -> 14071 bytes data/sprites/dogsf8.ppm | Bin 0 -> 14071 bytes data/sprites/dogsg1.ppm | Bin 0 -> 14071 bytes data/sprites/dogsg2.ppm | Bin 0 -> 14071 bytes data/sprites/dogsg3.ppm | Bin 0 -> 14071 bytes data/sprites/dogsg4.ppm | Bin 0 -> 14071 bytes data/sprites/dogsg5.ppm | Bin 0 -> 14071 bytes data/sprites/dogsg6.ppm | Bin 0 -> 14071 bytes data/sprites/dogsg7.ppm | Bin 0 -> 14071 bytes data/sprites/dogsg8.ppm | Bin 0 -> 14071 bytes data/sprites/dogsh1.ppm | Bin 0 -> 14071 bytes data/sprites/dogsh2.ppm | Bin 0 -> 14071 bytes data/sprites/dogsh3.ppm | Bin 0 -> 14071 bytes data/sprites/dogsh4.ppm | Bin 0 -> 14071 bytes data/sprites/dogsh5.ppm | Bin 0 -> 14071 bytes data/sprites/dogsh6.ppm | Bin 0 -> 14071 bytes data/sprites/dogsh7.ppm | Bin 0 -> 14071 bytes data/sprites/dogsh8.ppm | Bin 0 -> 14071 bytes data/sprites/dogsi0.ppm | Bin 0 -> 14071 bytes data/sprites/dogsj0.ppm | Bin 0 -> 14071 bytes data/sprites/dogsk0.ppm | Bin 0 -> 14071 bytes data/sprites/dogsl0.ppm | Bin 0 -> 14071 bytes data/sprites/dogsm0.ppm | Bin 0 -> 14071 bytes data/sprites/dogsn0.ppm | Bin 0 -> 14071 bytes data/sprites/pls1a0.ppm | Bin 0 -> 877 bytes data/sprites/pls1b0.ppm | Bin 0 -> 781 bytes data/sprites/pls1c0.ppm | Bin 0 -> 877 bytes data/sprites/pls1d0.ppm | Bin 0 -> 781 bytes data/sprites/pls1e0.ppm | Bin 0 -> 3085 bytes data/sprites/pls1f0.ppm | Bin 0 -> 3085 bytes data/sprites/pls1g0.ppm | Bin 0 -> 3469 bytes data/sprites/pls2a0.ppm | Bin 0 -> 877 bytes data/sprites/pls2b0.ppm | Bin 0 -> 877 bytes data/sprites/pls2c0.ppm | Bin 0 -> 1600 bytes data/sprites/pls2d0.ppm | Bin 0 -> 3085 bytes data/sprites/pls2e0.ppm | Bin 0 -> 3469 bytes data/sprites/tnt1a0.ppm | Bin 0 -> 14 bytes doc/CMakeLists.txt | 27 + doc/DeePBSPV4specs.txt | 101 + doc/MBF.txt | 366 + doc/MBFFAQ.txt | 148 + doc/README.command-line | 735 + doc/README.compat | 93 + doc/README.demos | 54 + doc/boom.txt | 1269 ++ doc/prboom-history.txt | 566 + doc/prboom-plus-game-server.6 | 118 + doc/prboom-plus-history.html | 1026 + doc/prboom-plus-history.txt | 918 + doc/prboom-plus-usage.txt | 400 + doc/prboom-plus.6 | 361 + doc/prboom-plus.cfg.5 | 348 + doc/umapinfo.txt | 2 + src/CMakeLists.txt | 524 + src/MAC/ANSIString.h | 30 + src/MAC/ANSIString.m | 223 + src/MAC/ConsoleController.h | 22 + src/MAC/ConsoleController.m | 98 + src/MAC/DrawerButton.h | 14 + src/MAC/DrawerButton.m | 29 + .../English.lproj/MainMenu.nib/classes.nib | 80 + src/MAC/English.lproj/MainMenu.nib/info.nib | 78 + .../MainMenu.nib/keyedobjects.nib | 17352 ++++++++++++++++ src/MAC/FileButtonController.h | 26 + src/MAC/FileButtonController.m | 61 + src/MAC/Info.plist | 30 + src/MAC/Launcher.icns | Bin 0 -> 39288 bytes src/MAC/LauncherApp.h | 90 + src/MAC/LauncherApp.m | 383 + src/MAC/LauncherMain.m | 8 + src/MAC/PrBoom.icns | Bin 0 -> 30880 bytes src/MAC/PrBoom.sdef | 9 + src/MAC/ResolutionDataSource.h | 36 + src/MAC/ResolutionDataSource.m | 140 + src/MAC/TODO | 6 + src/MAC/UKFileWatcher.h | 57 + src/MAC/UKKQueue.h | 100 + src/MAC/UKKQueue.m | 464 + src/MAC/UKMainThreadProxy.h | 55 + src/MAC/UKMainThreadProxy.m | 136 + src/MAC/WadViewController.h | 36 + src/MAC/WadViewController.m | 98 + src/MAC/i_sound.m | 242 + src/MAC/i_system.m | 152 + src/MUSIC/alsaplayer.c | 1013 + src/MUSIC/alsaplayer.h | 60 + src/MUSIC/dbopl.c | 1596 ++ src/MUSIC/dbopl.h | 218 + src/MUSIC/dumbplayer.c | 295 + src/MUSIC/dumbplayer.h | 46 + src/MUSIC/flplayer.c | 529 + src/MUSIC/flplayer.h | 47 + src/MUSIC/madplayer.c | 335 + src/MUSIC/madplayer.h | 46 + src/MUSIC/midifile.c | 1272 ++ src/MUSIC/midifile.h | 194 + src/MUSIC/musicplayer.h | 124 + src/MUSIC/opl.c | 459 + src/MUSIC/opl.h | 123 + src/MUSIC/opl_queue.c | 280 + src/MUSIC/opl_queue.h | 45 + src/MUSIC/oplplayer.c | 1448 ++ src/MUSIC/oplplayer.h | 34 + src/MUSIC/portmidiplayer.c | 685 + src/MUSIC/portmidiplayer.h | 47 + src/MUSIC/vorbisplayer.c | 468 + src/MUSIC/vorbisplayer.h | 47 + src/PCSOUND/pcsound.c | 127 + src/PCSOUND/pcsound.h | 47 + src/PCSOUND/pcsound_linux.c | 129 + src/PCSOUND/pcsound_sdl.c | 180 + src/PCSOUND/pcsound_win32.c | 119 + src/POSIX/i_system.c | 136 + src/SDL/SDL_windows.h | 64 + src/SDL/SDL_windows_main.c | 109 + src/SDL/i_joy.c | 122 + src/SDL/i_main.c | 666 + src/SDL/i_network.c | 292 + src/SDL/i_sound.c | 1732 ++ src/SDL/i_sshot.c | 135 + src/SDL/i_system.c | 557 + src/SDL/i_video.c | 1683 ++ src/TEXTSCREEN/doomkeys.h | 100 + src/TEXTSCREEN/txt_font.h | 547 + src/TEXTSCREEN/txt_largefont.h | 2591 +++ src/TEXTSCREEN/txt_main.h | 154 + src/TEXTSCREEN/txt_sdl.c | 945 + src/TEXTSCREEN/txt_sdl.h | 41 + src/TEXTSCREEN/txt_smallfont.h | 2876 +++ src/WIN/win_opendir.c | 336 + src/WIN/win_opendir.h | 73 + src/am_map.c | 2373 +++ src/am_map.h | 189 + src/d_client.c | 549 + src/d_deh.c | 3366 +++ src/d_deh.h | 1126 + src/d_englsh.h | 711 + src/d_event.h | 129 + src/d_ipxgate.c | 291 + src/d_items.c | 168 + src/d_items.h | 60 + src/d_main.c | 2350 +++ src/d_main.h | 87 + src/d_net.h | 214 + src/d_player.h | 254 + src/d_server.c | 744 + src/d_think.h | 96 + src/d_ticcmd.h | 59 + src/doomdata.h | 252 + src/doomdef.c | 53 + src/doomdef.h | 346 + src/doomstat.c | 123 + src/doomstat.h | 370 + src/doomtype.h | 175 + src/dstrings.c | 85 + src/dstrings.h | 80 + src/e6y.c | 1426 ++ src/e6y.h | 359 + src/e6y_launcher.c | 1535 ++ src/e6y_launcher.h | 55 + src/f_finale.c | 750 + src/f_finale.h | 72 + src/f_finale2.c | 172 + src/f_wipe.c | 268 + src/f_wipe.h | 48 + src/g_game.c | 4565 ++++ src/g_game.h | 249 + src/g_overflow.c | 542 + src/g_overflow.h | 139 + src/gl_clipper.c | 463 + src/gl_detail.c | 875 + src/gl_drawinfo.c | 169 + src/gl_fbo.c | 183 + src/gl_gamma.c | 202 + src/gl_hires.c | 1477 ++ src/gl_hqresize.c | 288 + src/gl_intern.h | 589 + src/gl_light.c | 449 + src/gl_main.c | 3360 +++ src/gl_map.c | 260 + src/gl_missingtexture.c | 541 + src/gl_opengl.c | 658 + src/gl_opengl.h | 191 + src/gl_preprocess.c | 1162 ++ src/gl_shader.c | 231 + src/gl_shadow.c | 277 + src/gl_sky.c | 1315 ++ src/gl_struct.h | 301 + src/gl_texture.c | 1600 ++ src/gl_vertex.c | 481 + src/gl_wipe.c | 153 + src/hu_lib.c | 823 + src/hu_lib.h | 257 + src/hu_stuff.c | 2996 +++ src/hu_stuff.h | 125 + src/hu_tracers.c | 305 + src/hu_tracers.h | 97 + src/i_capture.c | 645 + src/i_capture.h | 63 + src/i_glob.c | 393 + src/i_glob.h | 44 + src/i_joy.h | 49 + src/i_main.h | 75 + src/i_network.h | 74 + src/i_pcsound.c | 237 + src/i_pcsound.h | 40 + src/i_sound.h | 165 + src/i_system.h | 109 + src/i_video.h | 120 + src/icon.c | 261 + src/info.c | 5053 +++++ src/info.h | 1552 ++ src/lprintf.c | 182 + src/lprintf.h | 65 + src/m_argv.c | 192 + src/m_argv.h | 56 + src/m_bbox.c | 58 + src/m_bbox.h | 56 + src/m_cheat.c | 924 + src/m_cheat.h | 76 + src/m_fixed.h | 124 + src/m_io.c | 423 + src/m_io.h | 35 + src/m_menu.c | 6401 ++++++ src/m_menu.h | 187 + src/m_misc.c | 1946 ++ src/m_misc.h | 142 + src/m_random.c | 147 + src/m_random.h | 154 + src/m_swap.h | 134 + src/md5.c | 240 + src/md5.h | 47 + src/memio.c | 206 + src/memio.h | 48 + src/mus2mid.c | 685 + src/mus2mid.h | 50 + src/p_ceilng.c | 477 + src/p_checksum.c | 99 + src/p_checksum.h | 4 + src/p_doors.c | 714 + src/p_enemy.c | 2833 +++ src/p_enemy.h | 123 + src/p_floor.c | 1161 ++ src/p_genlin.c | 1172 ++ src/p_inter.c | 1027 + src/p_inter.h | 76 + src/p_lights.c | 443 + src/p_map.c | 2425 +++ src/p_map.h | 100 + src/p_maputl.c | 789 + src/p_maputl.h | 98 + src/p_mobj.c | 1662 ++ src/p_mobj.h | 428 + src/p_plats.c | 454 + src/p_pspr.c | 974 + src/p_pspr.h | 130 + src/p_saveg.c | 1055 + src/p_saveg.h | 66 + src/p_setup.c | 2867 +++ src/p_setup.h | 61 + src/p_sight.c | 940 + src/p_spec.c | 3525 ++++ src/p_spec.h | 1165 ++ src/p_switch.c | 1210 ++ src/p_telept.c | 348 + src/p_tick.c | 299 + src/p_tick.h | 75 + src/p_user.c | 589 + src/p_user.h | 49 + src/protocol.h | 101 + src/r_bsp.c | 816 + src/r_bsp.h | 65 + src/r_data.c | 792 + src/r_data.h | 112 + src/r_defs.h | 473 + src/r_demo.c | 1705 ++ src/r_demo.h | 124 + src/r_draw.c | 1189 ++ src/r_draw.h | 175 + src/r_drawcolpipeline.inl | 51 + src/r_drawcolumn.inl | 381 + src/r_drawflush.inl | 300 + src/r_drawspan.inl | 160 + src/r_filter.c | 121 + src/r_filter.h | 174 + src/r_fps.c | 616 + src/r_fps.h | 71 + src/r_main.c | 1170 ++ src/r_main.h | 180 + src/r_patch.c | 991 + src/r_patch.h | 117 + src/r_plane.c | 535 + src/r_plane.h | 70 + src/r_segs.c | 1027 + src/r_segs.h | 44 + src/r_sky.c | 123 + src/r_sky.h | 61 + src/r_state.h | 125 + src/r_things.c | 1478 ++ src/r_things.h | 99 + src/s_advsound.c | 171 + src/s_advsound.h | 66 + src/s_sound.c | 826 + src/s_sound.h | 104 + src/sc_man.c | 440 + src/sc_man.h | 26 + src/scanner.cpp | 699 + src/scanner.h | 140 + src/sounds.c | 457 + src/sounds.h | 508 + src/st_lib.c | 375 + src/st_lib.h | 209 + src/st_stuff.c | 1273 ++ src/st_stuff.h | 127 + src/statdump.c | 358 + src/statdump.h | 23 + src/tables.c | 138 + src/tables.h | 97 + src/umapinfo.cpp | 735 + src/umapinfo.h | 80 + src/v_video.c | 1871 ++ src/v_video.h | 314 + src/version.c | 47 + src/version.h | 40 + src/w_memcache.c | 154 + src/w_mmap.c | 350 + src/w_wad.c | 604 + src/w_wad.h | 171 + src/wi_stuff.c | 2159 ++ src/wi_stuff.h | 64 + src/xs_Float.h | 81 + src/z_bmalloc.c | 123 + src/z_bmalloc.h | 57 + src/z_zone.c | 712 + src/z_zone.h | 129 + tests/boxes.pl | 61 + tests/crosses.pl | 76 + tests/demo-testing.csv | 24 + tests/donut_av.wad | Bin 0 -> 3039 bytes tests/heightlist_overflow.wad | Bin 0 -> 9843 bytes tests/lmpwatch.pl | 182 + tests/missed_back_side.zip | Bin 0 -> 46188 bytes tests/runtests.py | 177 + tests/sky.wad | Bin 0 -> 97161 bytes tests/weaponinfo.wad | Bin 0 -> 2436 bytes 553 files changed, 177275 insertions(+) create mode 100644 .gitignore create mode 100644 .session.vim create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100644 COPYING create mode 100644 ICONS/icons.rc create mode 100644 ICONS/prboom-plus.bash create mode 100644 ICONS/prboom-plus.desktop create mode 100644 ICONS/prboom-plus.exe.manifest create mode 100644 ICONS/prboom-plus.ico create mode 100644 ICONS/prboom-plus.svg create mode 100644 ICONS/resource.h create mode 100644 INSTALL create mode 100644 NEWS create mode 100644 README create mode 100644 cmake/FindALSA.cmake create mode 100644 cmake/FindDUMB.cmake create mode 100644 cmake/FindFluidSynth.cmake create mode 100644 cmake/FindLibMad.cmake create mode 100644 cmake/FindOgg.cmake create mode 100644 cmake/FindPCREPOSIX.cmake create mode 100644 cmake/FindPortMidi.cmake create mode 100644 cmake/FindSDL2.cmake create mode 100644 cmake/FindSDL2_image.cmake create mode 100644 cmake/FindSDL2_mixer.cmake create mode 100644 cmake/FindSDL2_net.cmake create mode 100644 cmake/FindVorbis.cmake create mode 100644 cmake/TargetArch.cmake create mode 100644 cmake/config.h.cin create mode 100644 data/CMakeLists.txt create mode 100644 data/convert-icon create mode 100644 data/flats/-n0_tex-.ppm create mode 100644 data/graphics/boxcc.ppm create mode 100644 data/graphics/boxcl.ppm create mode 100644 data/graphics/boxcr.ppm create mode 100644 data/graphics/boxlc.ppm create mode 100644 data/graphics/boxll.ppm create mode 100644 data/graphics/boxlr.ppm create mode 100644 data/graphics/boxuc.ppm create mode 100644 data/graphics/boxul.ppm create mode 100644 data/graphics/boxur.ppm create mode 100644 data/graphics/cross1.ppm create mode 100644 data/graphics/cross2.ppm create mode 100644 data/graphics/cross3.ppm create mode 100644 data/graphics/dig0.ppm create mode 100644 data/graphics/dig1.ppm create mode 100644 data/graphics/dig2.ppm create mode 100644 data/graphics/dig3.ppm create mode 100644 data/graphics/dig4.ppm create mode 100644 data/graphics/dig45.ppm create mode 100644 data/graphics/dig46.ppm create mode 100644 data/graphics/dig47.ppm create mode 100644 data/graphics/dig5.ppm create mode 100644 data/graphics/dig58.ppm create mode 100644 data/graphics/dig6.ppm create mode 100644 data/graphics/dig7.ppm create mode 100644 data/graphics/dig8.ppm create mode 100644 data/graphics/dig9.ppm create mode 100644 data/graphics/dig91.ppm create mode 100644 data/graphics/dig93.ppm create mode 100644 data/graphics/diga.ppm create mode 100644 data/graphics/digb.ppm create mode 100644 data/graphics/digc.ppm create mode 100644 data/graphics/digd.ppm create mode 100644 data/graphics/dige.ppm create mode 100644 data/graphics/digf.ppm create mode 100644 data/graphics/digg.ppm create mode 100644 data/graphics/digh.ppm create mode 100644 data/graphics/digi.ppm create mode 100644 data/graphics/digj.ppm create mode 100644 data/graphics/digk.ppm create mode 100644 data/graphics/digl.ppm create mode 100644 data/graphics/digm.ppm create mode 100644 data/graphics/dign.ppm create mode 100644 data/graphics/digo.ppm create mode 100644 data/graphics/digp.ppm create mode 100644 data/graphics/digq.ppm create mode 100644 data/graphics/digr.ppm create mode 100644 data/graphics/digs.ppm create mode 100644 data/graphics/digt.ppm create mode 100644 data/graphics/digu.ppm create mode 100644 data/graphics/digv.ppm create mode 100644 data/graphics/digw.ppm create mode 100644 data/graphics/digx.ppm create mode 100644 data/graphics/digy.ppm create mode 100644 data/graphics/digz.ppm create mode 100644 data/graphics/m_butt1.ppm create mode 100644 data/graphics/m_butt2.ppm create mode 100644 data/graphics/m_colors.ppm create mode 100644 data/graphics/m_palno.ppm create mode 100644 data/graphics/m_palsel.ppm create mode 100644 data/graphics/m_vbox.ppm create mode 100644 data/graphics/stbr123.ppm create mode 100644 data/graphics/stbr124.ppm create mode 100644 data/graphics/stbr125.ppm create mode 100644 data/graphics/stbr126.ppm create mode 100644 data/graphics/stbr127.ppm create mode 100644 data/graphics/stcfn096.ppm create mode 100644 data/graphics/stkeys6.ppm create mode 100644 data/graphics/stkeys7.ppm create mode 100644 data/graphics/stkeys8.ppm create mode 100644 data/lumps/-prbhud-.lmp create mode 100644 data/lumps/animated.lmp create mode 100644 data/lumps/b_end.lmp create mode 100644 data/lumps/b_start.lmp create mode 100644 data/lumps/bfgbex.lmp create mode 100644 data/lumps/c_end.lmp create mode 100644 data/lumps/c_start.lmp create mode 100644 data/lumps/chexdeh.lmp create mode 100644 data/lumps/crblack.lmp create mode 100644 data/lumps/crblue.lmp create mode 100644 data/lumps/crblue2.lmp create mode 100644 data/lumps/crbrick.lmp create mode 100644 data/lumps/crbrown.lmp create mode 100644 data/lumps/crgold.lmp create mode 100644 data/lumps/crgray.lmp create mode 100644 data/lumps/crgreen.lmp create mode 100644 data/lumps/crorange.lmp create mode 100644 data/lumps/crpurple.lmp create mode 100644 data/lumps/crred.lmp create mode 100644 data/lumps/crtan.lmp create mode 100644 data/lumps/crwhite.lmp create mode 100644 data/lumps/cryellow.lmp create mode 100644 data/lumps/endboom.lmp create mode 100644 data/lumps/gammatbl.lmp create mode 100644 data/lumps/glfp.lmp create mode 100644 data/lumps/glshadow.lmp create mode 100644 data/lumps/glvp.lmp create mode 100644 data/lumps/m_ammo.lmp create mode 100644 data/lumps/m_armour.lmp create mode 100644 data/lumps/m_arrow.lmp create mode 100644 data/lumps/m_health.lmp create mode 100644 data/lumps/m_key.lmp create mode 100644 data/lumps/m_mark.lmp create mode 100644 data/lumps/m_normal.lmp create mode 100644 data/lumps/m_power.lmp create mode 100644 data/lumps/m_shadow.lmp create mode 100644 data/lumps/m_weap.lmp create mode 100644 data/lumps/nervebex.lmp create mode 100644 data/lumps/sinetabl.lmp create mode 100644 data/lumps/switches.lmp create mode 100644 data/lumps/tangtabl.lmp create mode 100644 data/lumps/tantoang.lmp create mode 100644 data/lumps/watermap.lmp create mode 100644 data/palette.rgb create mode 100644 data/prboom.txt create mode 100644 data/rd_graphic.c create mode 100644 data/rd_graphic.h create mode 100644 data/rd_main.c create mode 100644 data/rd_output.c create mode 100644 data/rd_output.h create mode 100644 data/rd_palette.c create mode 100644 data/rd_palette.h create mode 100644 data/rd_sound.c create mode 100644 data/rd_sound.h create mode 100644 data/rd_util.c create mode 100644 data/rd_util.h create mode 100644 data/sounds/dsdgact.wav create mode 100644 data/sounds/dsdgatk.wav create mode 100644 data/sounds/dsdgdth.wav create mode 100644 data/sounds/dsdgpain.wav create mode 100644 data/sounds/dsdgsit.wav create mode 100644 data/sprites/dogsa1.ppm create mode 100644 data/sprites/dogsa2.ppm create mode 100644 data/sprites/dogsa3.ppm create mode 100644 data/sprites/dogsa4.ppm create mode 100644 data/sprites/dogsa5.ppm create mode 100644 data/sprites/dogsa6.ppm create mode 100644 data/sprites/dogsa7.ppm create mode 100644 data/sprites/dogsa8.ppm create mode 100644 data/sprites/dogsb1.ppm create mode 100644 data/sprites/dogsb2.ppm create mode 100644 data/sprites/dogsb3.ppm create mode 100644 data/sprites/dogsb4.ppm create mode 100644 data/sprites/dogsb5.ppm create mode 100644 data/sprites/dogsb6.ppm create mode 100644 data/sprites/dogsb7.ppm create mode 100644 data/sprites/dogsb8.ppm create mode 100644 data/sprites/dogsc1.ppm create mode 100644 data/sprites/dogsc2.ppm create mode 100644 data/sprites/dogsc3.ppm create mode 100644 data/sprites/dogsc4.ppm create mode 100644 data/sprites/dogsc5.ppm create mode 100644 data/sprites/dogsc6.ppm create mode 100644 data/sprites/dogsc7.ppm create mode 100644 data/sprites/dogsc8.ppm create mode 100644 data/sprites/dogsd1.ppm create mode 100644 data/sprites/dogsd2.ppm create mode 100644 data/sprites/dogsd3.ppm create mode 100644 data/sprites/dogsd4.ppm create mode 100644 data/sprites/dogsd5.ppm create mode 100644 data/sprites/dogsd6.ppm create mode 100644 data/sprites/dogsd7.ppm create mode 100644 data/sprites/dogsd8.ppm create mode 100644 data/sprites/dogse1.ppm create mode 100644 data/sprites/dogse2.ppm create mode 100644 data/sprites/dogse3.ppm create mode 100644 data/sprites/dogse4.ppm create mode 100644 data/sprites/dogse5.ppm create mode 100644 data/sprites/dogse6.ppm create mode 100644 data/sprites/dogse7.ppm create mode 100644 data/sprites/dogse8.ppm create mode 100644 data/sprites/dogsf1.ppm create mode 100644 data/sprites/dogsf2.ppm create mode 100644 data/sprites/dogsf3.ppm create mode 100644 data/sprites/dogsf4.ppm create mode 100644 data/sprites/dogsf5.ppm create mode 100644 data/sprites/dogsf6.ppm create mode 100644 data/sprites/dogsf7.ppm create mode 100644 data/sprites/dogsf8.ppm create mode 100644 data/sprites/dogsg1.ppm create mode 100644 data/sprites/dogsg2.ppm create mode 100644 data/sprites/dogsg3.ppm create mode 100644 data/sprites/dogsg4.ppm create mode 100644 data/sprites/dogsg5.ppm create mode 100644 data/sprites/dogsg6.ppm create mode 100644 data/sprites/dogsg7.ppm create mode 100644 data/sprites/dogsg8.ppm create mode 100644 data/sprites/dogsh1.ppm create mode 100644 data/sprites/dogsh2.ppm create mode 100644 data/sprites/dogsh3.ppm create mode 100644 data/sprites/dogsh4.ppm create mode 100644 data/sprites/dogsh5.ppm create mode 100644 data/sprites/dogsh6.ppm create mode 100644 data/sprites/dogsh7.ppm create mode 100644 data/sprites/dogsh8.ppm create mode 100644 data/sprites/dogsi0.ppm create mode 100644 data/sprites/dogsj0.ppm create mode 100644 data/sprites/dogsk0.ppm create mode 100644 data/sprites/dogsl0.ppm create mode 100644 data/sprites/dogsm0.ppm create mode 100644 data/sprites/dogsn0.ppm create mode 100644 data/sprites/pls1a0.ppm create mode 100644 data/sprites/pls1b0.ppm create mode 100644 data/sprites/pls1c0.ppm create mode 100644 data/sprites/pls1d0.ppm create mode 100644 data/sprites/pls1e0.ppm create mode 100644 data/sprites/pls1f0.ppm create mode 100644 data/sprites/pls1g0.ppm create mode 100644 data/sprites/pls2a0.ppm create mode 100644 data/sprites/pls2b0.ppm create mode 100644 data/sprites/pls2c0.ppm create mode 100644 data/sprites/pls2d0.ppm create mode 100644 data/sprites/pls2e0.ppm create mode 100644 data/sprites/tnt1a0.ppm create mode 100644 doc/CMakeLists.txt create mode 100644 doc/DeePBSPV4specs.txt create mode 100644 doc/MBF.txt create mode 100644 doc/MBFFAQ.txt create mode 100644 doc/README.command-line create mode 100644 doc/README.compat create mode 100644 doc/README.demos create mode 100644 doc/boom.txt create mode 100644 doc/prboom-history.txt create mode 100644 doc/prboom-plus-game-server.6 create mode 100644 doc/prboom-plus-history.html create mode 100644 doc/prboom-plus-history.txt create mode 100644 doc/prboom-plus-usage.txt create mode 100644 doc/prboom-plus.6 create mode 100644 doc/prboom-plus.cfg.5 create mode 100644 doc/umapinfo.txt create mode 100644 src/CMakeLists.txt create mode 100644 src/MAC/ANSIString.h create mode 100644 src/MAC/ANSIString.m create mode 100644 src/MAC/ConsoleController.h create mode 100644 src/MAC/ConsoleController.m create mode 100644 src/MAC/DrawerButton.h create mode 100644 src/MAC/DrawerButton.m create mode 100644 src/MAC/English.lproj/MainMenu.nib/classes.nib create mode 100644 src/MAC/English.lproj/MainMenu.nib/info.nib create mode 100644 src/MAC/English.lproj/MainMenu.nib/keyedobjects.nib create mode 100644 src/MAC/FileButtonController.h create mode 100644 src/MAC/FileButtonController.m create mode 100644 src/MAC/Info.plist create mode 100644 src/MAC/Launcher.icns create mode 100644 src/MAC/LauncherApp.h create mode 100644 src/MAC/LauncherApp.m create mode 100644 src/MAC/LauncherMain.m create mode 100644 src/MAC/PrBoom.icns create mode 100644 src/MAC/PrBoom.sdef create mode 100644 src/MAC/ResolutionDataSource.h create mode 100644 src/MAC/ResolutionDataSource.m create mode 100644 src/MAC/TODO create mode 100644 src/MAC/UKFileWatcher.h create mode 100644 src/MAC/UKKQueue.h create mode 100644 src/MAC/UKKQueue.m create mode 100644 src/MAC/UKMainThreadProxy.h create mode 100644 src/MAC/UKMainThreadProxy.m create mode 100644 src/MAC/WadViewController.h create mode 100644 src/MAC/WadViewController.m create mode 100644 src/MAC/i_sound.m create mode 100644 src/MAC/i_system.m create mode 100644 src/MUSIC/alsaplayer.c create mode 100644 src/MUSIC/alsaplayer.h create mode 100644 src/MUSIC/dbopl.c create mode 100644 src/MUSIC/dbopl.h create mode 100644 src/MUSIC/dumbplayer.c create mode 100644 src/MUSIC/dumbplayer.h create mode 100644 src/MUSIC/flplayer.c create mode 100644 src/MUSIC/flplayer.h create mode 100644 src/MUSIC/madplayer.c create mode 100644 src/MUSIC/madplayer.h create mode 100644 src/MUSIC/midifile.c create mode 100644 src/MUSIC/midifile.h create mode 100644 src/MUSIC/musicplayer.h create mode 100644 src/MUSIC/opl.c create mode 100644 src/MUSIC/opl.h create mode 100644 src/MUSIC/opl_queue.c create mode 100644 src/MUSIC/opl_queue.h create mode 100644 src/MUSIC/oplplayer.c create mode 100644 src/MUSIC/oplplayer.h create mode 100644 src/MUSIC/portmidiplayer.c create mode 100644 src/MUSIC/portmidiplayer.h create mode 100644 src/MUSIC/vorbisplayer.c create mode 100644 src/MUSIC/vorbisplayer.h create mode 100644 src/PCSOUND/pcsound.c create mode 100644 src/PCSOUND/pcsound.h create mode 100644 src/PCSOUND/pcsound_linux.c create mode 100644 src/PCSOUND/pcsound_sdl.c create mode 100644 src/PCSOUND/pcsound_win32.c create mode 100644 src/POSIX/i_system.c create mode 100644 src/SDL/SDL_windows.h create mode 100644 src/SDL/SDL_windows_main.c create mode 100644 src/SDL/i_joy.c create mode 100644 src/SDL/i_main.c create mode 100644 src/SDL/i_network.c create mode 100644 src/SDL/i_sound.c create mode 100644 src/SDL/i_sshot.c create mode 100644 src/SDL/i_system.c create mode 100644 src/SDL/i_video.c create mode 100644 src/TEXTSCREEN/doomkeys.h create mode 100644 src/TEXTSCREEN/txt_font.h create mode 100644 src/TEXTSCREEN/txt_largefont.h create mode 100644 src/TEXTSCREEN/txt_main.h create mode 100644 src/TEXTSCREEN/txt_sdl.c create mode 100644 src/TEXTSCREEN/txt_sdl.h create mode 100644 src/TEXTSCREEN/txt_smallfont.h create mode 100644 src/WIN/win_opendir.c create mode 100644 src/WIN/win_opendir.h create mode 100644 src/am_map.c create mode 100644 src/am_map.h create mode 100644 src/d_client.c create mode 100644 src/d_deh.c create mode 100644 src/d_deh.h create mode 100644 src/d_englsh.h create mode 100644 src/d_event.h create mode 100644 src/d_ipxgate.c create mode 100644 src/d_items.c create mode 100644 src/d_items.h create mode 100644 src/d_main.c create mode 100644 src/d_main.h create mode 100644 src/d_net.h create mode 100644 src/d_player.h create mode 100644 src/d_server.c create mode 100644 src/d_think.h create mode 100644 src/d_ticcmd.h create mode 100644 src/doomdata.h create mode 100644 src/doomdef.c create mode 100644 src/doomdef.h create mode 100644 src/doomstat.c create mode 100644 src/doomstat.h create mode 100644 src/doomtype.h create mode 100644 src/dstrings.c create mode 100644 src/dstrings.h create mode 100644 src/e6y.c create mode 100644 src/e6y.h create mode 100644 src/e6y_launcher.c create mode 100644 src/e6y_launcher.h create mode 100644 src/f_finale.c create mode 100644 src/f_finale.h create mode 100644 src/f_finale2.c create mode 100644 src/f_wipe.c create mode 100644 src/f_wipe.h create mode 100644 src/g_game.c create mode 100644 src/g_game.h create mode 100644 src/g_overflow.c create mode 100644 src/g_overflow.h create mode 100644 src/gl_clipper.c create mode 100644 src/gl_detail.c create mode 100644 src/gl_drawinfo.c create mode 100644 src/gl_fbo.c create mode 100644 src/gl_gamma.c create mode 100644 src/gl_hires.c create mode 100644 src/gl_hqresize.c create mode 100644 src/gl_intern.h create mode 100644 src/gl_light.c create mode 100644 src/gl_main.c create mode 100644 src/gl_map.c create mode 100644 src/gl_missingtexture.c create mode 100644 src/gl_opengl.c create mode 100644 src/gl_opengl.h create mode 100644 src/gl_preprocess.c create mode 100644 src/gl_shader.c create mode 100644 src/gl_shadow.c create mode 100644 src/gl_sky.c create mode 100644 src/gl_struct.h create mode 100644 src/gl_texture.c create mode 100644 src/gl_vertex.c create mode 100644 src/gl_wipe.c create mode 100644 src/hu_lib.c create mode 100644 src/hu_lib.h create mode 100644 src/hu_stuff.c create mode 100644 src/hu_stuff.h create mode 100644 src/hu_tracers.c create mode 100644 src/hu_tracers.h create mode 100644 src/i_capture.c create mode 100644 src/i_capture.h create mode 100644 src/i_glob.c create mode 100644 src/i_glob.h create mode 100644 src/i_joy.h create mode 100644 src/i_main.h create mode 100644 src/i_network.h create mode 100644 src/i_pcsound.c create mode 100644 src/i_pcsound.h create mode 100644 src/i_sound.h create mode 100644 src/i_system.h create mode 100644 src/i_video.h create mode 100644 src/icon.c create mode 100644 src/info.c create mode 100644 src/info.h create mode 100644 src/lprintf.c create mode 100644 src/lprintf.h create mode 100644 src/m_argv.c create mode 100644 src/m_argv.h create mode 100644 src/m_bbox.c create mode 100644 src/m_bbox.h create mode 100644 src/m_cheat.c create mode 100644 src/m_cheat.h create mode 100644 src/m_fixed.h create mode 100644 src/m_io.c create mode 100644 src/m_io.h create mode 100644 src/m_menu.c create mode 100644 src/m_menu.h create mode 100644 src/m_misc.c create mode 100644 src/m_misc.h create mode 100644 src/m_random.c create mode 100644 src/m_random.h create mode 100644 src/m_swap.h create mode 100644 src/md5.c create mode 100644 src/md5.h create mode 100644 src/memio.c create mode 100644 src/memio.h create mode 100644 src/mus2mid.c create mode 100644 src/mus2mid.h create mode 100644 src/p_ceilng.c create mode 100644 src/p_checksum.c create mode 100644 src/p_checksum.h create mode 100644 src/p_doors.c create mode 100644 src/p_enemy.c create mode 100644 src/p_enemy.h create mode 100644 src/p_floor.c create mode 100644 src/p_genlin.c create mode 100644 src/p_inter.c create mode 100644 src/p_inter.h create mode 100644 src/p_lights.c create mode 100644 src/p_map.c create mode 100644 src/p_map.h create mode 100644 src/p_maputl.c create mode 100644 src/p_maputl.h create mode 100644 src/p_mobj.c create mode 100644 src/p_mobj.h create mode 100644 src/p_plats.c create mode 100644 src/p_pspr.c create mode 100644 src/p_pspr.h create mode 100644 src/p_saveg.c create mode 100644 src/p_saveg.h create mode 100644 src/p_setup.c create mode 100644 src/p_setup.h create mode 100644 src/p_sight.c create mode 100644 src/p_spec.c create mode 100644 src/p_spec.h create mode 100644 src/p_switch.c create mode 100644 src/p_telept.c create mode 100644 src/p_tick.c create mode 100644 src/p_tick.h create mode 100644 src/p_user.c create mode 100644 src/p_user.h create mode 100644 src/protocol.h create mode 100644 src/r_bsp.c create mode 100644 src/r_bsp.h create mode 100644 src/r_data.c create mode 100644 src/r_data.h create mode 100644 src/r_defs.h create mode 100644 src/r_demo.c create mode 100644 src/r_demo.h create mode 100644 src/r_draw.c create mode 100644 src/r_draw.h create mode 100644 src/r_drawcolpipeline.inl create mode 100644 src/r_drawcolumn.inl create mode 100644 src/r_drawflush.inl create mode 100644 src/r_drawspan.inl create mode 100644 src/r_filter.c create mode 100644 src/r_filter.h create mode 100644 src/r_fps.c create mode 100644 src/r_fps.h create mode 100644 src/r_main.c create mode 100644 src/r_main.h create mode 100644 src/r_patch.c create mode 100644 src/r_patch.h create mode 100644 src/r_plane.c create mode 100644 src/r_plane.h create mode 100644 src/r_segs.c create mode 100644 src/r_segs.h create mode 100644 src/r_sky.c create mode 100644 src/r_sky.h create mode 100644 src/r_state.h create mode 100644 src/r_things.c create mode 100644 src/r_things.h create mode 100644 src/s_advsound.c create mode 100644 src/s_advsound.h create mode 100644 src/s_sound.c create mode 100644 src/s_sound.h create mode 100644 src/sc_man.c create mode 100644 src/sc_man.h create mode 100644 src/scanner.cpp create mode 100644 src/scanner.h create mode 100644 src/sounds.c create mode 100644 src/sounds.h create mode 100644 src/st_lib.c create mode 100644 src/st_lib.h create mode 100644 src/st_stuff.c create mode 100644 src/st_stuff.h create mode 100644 src/statdump.c create mode 100644 src/statdump.h create mode 100644 src/tables.c create mode 100644 src/tables.h create mode 100644 src/umapinfo.cpp create mode 100644 src/umapinfo.h create mode 100644 src/v_video.c create mode 100644 src/v_video.h create mode 100644 src/version.c create mode 100644 src/version.h create mode 100644 src/w_memcache.c create mode 100644 src/w_mmap.c create mode 100644 src/w_wad.c create mode 100644 src/w_wad.h create mode 100644 src/wi_stuff.c create mode 100644 src/wi_stuff.h create mode 100644 src/xs_Float.h create mode 100644 src/z_bmalloc.c create mode 100644 src/z_bmalloc.h create mode 100644 src/z_zone.c create mode 100644 src/z_zone.h create mode 100755 tests/boxes.pl create mode 100755 tests/crosses.pl create mode 100644 tests/demo-testing.csv create mode 100644 tests/donut_av.wad create mode 100644 tests/heightlist_overflow.wad create mode 100755 tests/lmpwatch.pl create mode 100644 tests/missed_back_side.zip create mode 100755 tests/runtests.py create mode 100644 tests/sky.wad create mode 100644 tests/weaponinfo.wad diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/.session.vim b/.session.vim new file mode 100644 index 0000000..ac1a512 --- /dev/null +++ b/.session.vim @@ -0,0 +1,54 @@ +let SessionLoad = 1 +let s:so_save = &g:so | let s:siso_save = &g:siso | setg so=0 siso=0 | setl so=-1 siso=-1 +let v:this_session=expand(":p") +silent only +silent tabonly +cd ~/Downloads/prboom/prboom-plus/prboom2 +if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' + let s:wipebuf = bufnr('%') +endif +let s:shortmess_save = &shortmess +if &shortmess =~ 'A' + set shortmess=aoOA +else + set shortmess=aoO +endif +badd +0 .gitignore +argglobal +%argdel +$argadd .gitignore +edit .gitignore +argglobal +setlocal fdm=manual +setlocal fde=0 +setlocal fmr={{{,}}} +setlocal fdi=# +setlocal fdl=0 +setlocal fml=1 +setlocal fdn=20 +setlocal fen +silent! normal! zE +let &fdl = &fdl +let s:l = 1 - ((0 * winheight(0) + 15) / 30) +if s:l < 1 | let s:l = 1 | endif +keepjumps exe s:l +normal! zt +keepjumps 1 +normal! 06| +tabnext 1 +if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 && getbufvar(s:wipebuf, '&buftype') isnot# 'terminal' + silent exe 'bwipe ' . s:wipebuf +endif +unlet! s:wipebuf +set winheight=1 winwidth=20 +let &shortmess = s:shortmess_save +let s:sx = expand(":p:r")."x.vim" +if filereadable(s:sx) + exe "source " . fnameescape(s:sx) +endif +let &g:so = s:so_save | let &g:siso = s:siso_save +set hlsearch +nohlsearch +doautoall SessionLoadPost +unlet SessionLoad +" vim: set ft=vim : diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..7839f8e --- /dev/null +++ b/AUTHORS @@ -0,0 +1,163 @@ +This file is now the amalgamated list of authors, contributors and credits +for PrBoom. Hopefully by keeping these all in one place, they will remain +more accurate. + +Doom was originally written by id software; when playing with any id main +wad file, you can see their list of credits, which includes the list of +programmers. After some years, they released the source code, to allow +others to work on improving the game. + +One of the first projects was DosDoom, by Chi Hoang. This was a quick port +of the released source code, which was for Linux, to DOS. This was then +picked up by TeamTNT (http://www.teamtnt.com/), who produced Boom, a greatly +debugged and extended version of Doom. The Boom programmers were Lee +Killough, Jim Flynn, Rand Phares, Ty Halderman. + +Several projects started working from the Boom source code. One was PrBoom, +made by Florian Schulze, that ported the code to Windows, added suport for +higher resolutions and later OpenGL. Another was Marine's Best Friend +(known as MBF) by Lee Killough, which fixed a lot of Boom bugs and added +many new game features. Finally, there was LxDoom, a port of Boom to Linux +by Colin Phipps. + +In October 1999, id Software re-released the Doom source code under the +GNU General Public License. TeamTNT have also changed to the new license, +and the other sources mentioned above have all allowed their code to be +GPLed. So PrBoom is covered by the GPL. + +In May 2000, LxDoom, PrBoom, and a derived port called LSDLDoom, merged into +one. The current authors of PrBoom are: + +Florian Schulze +Colin Phipps +Neil Stevens - Mac OS X porting +Andrey Budko +Rob Young (RjY) + +Our thanks go to all the authors of the ports mentioned above, and also the +following people who contributed code to LxDoom or PrBoom: + +Jess Haas +Of LSDLdoom, who merged his project into PrBoom, contributing his SDL code. + +Nicolas Kalkhof +Much work on the OpenGL renderer. + +James "Quasar" Haley +Ever willing to talk about source ideas, and has pointed me in the direction of +a lot of Boom and MBF bugs; also various bits code from his port Eternity have +been used, such as the BEX enhancements. + +Bob Aman (sporkmonger.com) +Created the RMUDAnsiTextView class used in the Mac launcher. + +Gady Kozma gady@math.tau.ac.il +Added hires to the SVGALib version of LxDoom, and other useful patches. + +Dick Leban +Lots of feedback about portability issues and helping get the network code +working properly back at v1.3.6. + +Eduardo Casino Almao +Lots of helpful feedback and suggestions, but more importantly actually getting +to grips with the code and giving very precise bug reports and patches. + +Joey Hess +For numerous patches, like the glibc fixes and window manager updates, and +help with the music. + +Ben Winslow +Various useful patches, like the colour ENDOOM code. + +Josh Parsons josh@schlick.anu.edu.au +Sent me the patches to use autoconf for configuring LxDoom. + +Steve Van Devender +Found the bug causing slight noise at the start of sounds playing, and other +patches. + +Barry Mead +Improvements to the mouse code and other odd patches. + +Mattias Kunkel +Made the lxdoom.spec file for creating LxDoom RPMs. + +Vicente Aguilar vicente@hal.dhis.org +Handy patch for the file handling + +Benjamin L McGee +Patch fixing the joystick code. + +Chris Young +Patch improving the ENDOOM printing + +Peter Jay Salzman +Cleanup patches + +Oliver Kraus +Send bug reports and patches for Solaris/Sparc. + +Paul S Jenner +Nice patch to make RPM building easier + +Julian +Fixed inline asm for gcc-2.95 (from Eternity) + +Lionel Ulmer +Patch to fix alignment problems on ARM processors. + +Ville Vuorinen +Spotted and helped patch the player spawn bug, as well as helping with some +Win32 issues. + +Steven Elliot +Misc patches. + +Andreas Dehmel +Spotted & patched a savegame bug. + +Jon Dowland +Bug reports & fixes, documentation improvements. + +If you have sent in patches and I forgot to list you, I apologise. Please email +me and I will add you. + +Also, thanks to the following people who have helped in various ways: + +Simon "fraggle" Howard +More MBF bugs. + +Robert Phipps +Network game testing, feature suggestions etc. + +Udo Monk +His port xdoom is very portable, and I referred to his code sometimes for help +with the X stuff; also his collection of Doom tools (XWadTools) is the +definitive tools collection for Linux. + +Andre Majorel +For Yadex, so I can debug those problematic levels more easily. + +Michael Heasley +Author of musserver, which helped me first add music support. + +Rafael Reilova +Helped with the music server program for LxDoom + +Frederic Oghdayan +For useful feedback on LxDoom v1.0.1, and repeating his bug reports until I +believed them :-). + +Adam Hegyi +Prompted me to hunt down those last few demo sync bugs, and provided some useful +insights and example demos to help. + +Adam Williamson +Pointing me toward yet another compatibility bug. + +Ingo van Lil +Another bug spotter. + +Everyone who contributed indirectly to MBF and Boom and Doom; see the +respective documentation files. + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..31e8798 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,243 @@ +cmake_minimum_required(VERSION 3.0) + +project("PrBoom-Plus" + VERSION 2.6.66 + HOMEPAGE_URL "https://github.com/coelckers/prboom-plus") + +# Set a default build type if none was specified +set(default_build_type "RelWithDebInfo") +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + message(STATUS "Setting build type to '${default_build_type}' as none was specified.") + set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE + STRING "Choose the type of build." FORCE) + # Set the possible values of build type for cmake-gui + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Release" "MinSizeRel" "RelWithDebInfo") +endif() + +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +include(TargetArch) + +include(TestBigEndian) +TEST_BIG_ENDIAN(WORDS_BIGENDIAN) + +# Check if a CMAKE_INSTALL_DOCDIR is provided before GNUInstallDirs sets its +# own default; this lets us set our own PrBoom-Plus default docdir later +# without clobbering a user-configured one +set(CUSTOM_DOCDIR "${CMAKE_INSTALL_DOCDIR}") +include(GNUInstallDirs) + +# Automated dependencies discovery, mostly needed for MSVC +target_architecture(TARGET_ARCH) +if(${TARGET_ARCH} MATCHES "i386") + set(DEPENDENCY_SUFFIX x86) +elseif(${TARGET_ARCH} MATCHES "x86_64") + set(DEPENDENCY_SUFFIX x64) +endif() +set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../dependencies_${DEPENDENCY_SUFFIX}") + +set(PACKAGE_NAME "${PROJECT_NAME}") +set(PACKAGE_TARNAME "prboom-plus") +set(PACKAGE_VERSION "${PROJECT_VERSION}") +set(PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE_URL}") +set(PACKAGE_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") +if(NOT CUSTOM_DOCDIR) + set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/${PACKAGE_TARNAME}" CACHE PATH "" FORCE) +endif() + +include(CheckSymbolExists) + +check_symbol_exists(stricmp "string.h" HAVE_STRICMP) +if(NOT HAVE_STRICMP) + add_definitions("-Dstricmp=strcasecmp") +endif() +check_symbol_exists(strnicmp "string.h" HAVE_STRNICMP) +if(NOT HAVE_STRNICMP) + add_definitions("-Dstrnicmp=strncasecmp") +endif() + +check_symbol_exists(getopt "unistd.h" HAVE_GETOPT) +check_symbol_exists(mmap "sys/mman.h" HAVE_MMAP) +check_symbol_exists(CreateFileMapping "windows.h" HAVE_CREATE_FILE_MAPPING) +if(NOT WIN32) + set(CMAKE_REQUIRED_DEFINITIONS_PREV ${CMAKE_REQUIRED_DEFINITIONS}) + set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE) + check_symbol_exists(sched_setaffinity "sched.h" HAVE_SCHED_SETAFFINITY) + set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS_PREV}) + if(HAVE_SCHED_SETAFFINITY) + add_definitions(-D_GNU_SOURCE) + endif() +endif() +check_symbol_exists(usleep "unistd.h" HAVE_USLEEP) +check_symbol_exists(strsignal "string.h" HAVE_STRSIGNAL) +check_symbol_exists(mkstemp "stdlib.h" HAVE_MKSTEMP) + +include(CheckIncludeFile) + +check_include_file("sys/wait.h" HAVE_SYS_WAIT_H) +check_include_file("unistd.h" HAVE_UNISTD_H) +check_include_file("asm/byteorder.h" HAVE_ASM_BYTEORDER_H) +check_include_file("dirent.h" HAVE_DIRENT_H) + +option(BUILD_GL "Enable OpenGL rendering code" ON) +if(BUILD_GL) + set(OpenGL_GL_PREFERENCE LEGACY) + find_package(OpenGL) +endif() + +find_package(SDL2 2.0.7 REQUIRED) + +option(WITH_IMAGE "Use SDL2_image if available" ON) +if(WITH_IMAGE) + find_package(SDL2_image) + if(SDL2_IMAGE_FOUND) + set(HAVE_LIBSDL2_IMAGE TRUE) + endif() +endif() + +option(WITH_MIXER "Use SDL2_mixer if available" ON) +if(WITH_MIXER) + find_package(SDL2_mixer) + if(SDL2_MIXER_FOUND) + set(HAVE_LIBSDL2_MIXER TRUE) + endif() +endif() + +option(WITH_NET "Use SDL2_net if available" ON) +if(WITH_NET) + find_package(SDL2_net) + if(SDL2_NET_FOUND) + set(HAVE_NET TRUE) + set(USE_SDL_NET TRUE) + endif() +endif() + +option(WITH_PCRE "Use PCRE if available" ON) +if(WITH_PCRE) + find_package(PCREPOSIX) + if(PCREPOSIX_FOUND) + set(HAVE_LIBPCREPOSIX TRUE) + endif() +endif() + +option(WITH_ZLIB "Use ZLIB if available" ON) +if(WITH_ZLIB) + find_package(ZLIB) + if(ZLIB_FOUND) + set(HAVE_LIBZ TRUE) + endif() +endif() + +option(WITH_MAD "Use libmad if available" ON) +if(WITH_MAD) + find_package(LibMad) + if(LIBMAD_FOUND) + set(HAVE_LIBMAD TRUE) + endif() +endif() + +option(WITH_FLUIDSYNTH "Use FluidSynth if available" ON) +if(WITH_FLUIDSYNTH) + find_package(FluidSynth) + if(FLUIDSYNTH_FOUND) + set(HAVE_LIBFLUIDSYNTH TRUE) + endif() +endif() + +option(WITH_DUMB "Use DUMB if available" ON) +if(WITH_DUMB) + find_package(DUMB) + if(DUMB_FOUND) + set(HAVE_LIBDUMB TRUE) + endif() +endif() + +option(WITH_VORBISFILE "Use vorbisfile if available" ON) +if(WITH_VORBISFILE) + find_package(Vorbis) + if(VORBIS_FOUND) + set(HAVE_LIBVORBISFILE TRUE) + endif() +endif() + +option(WITH_PORTMIDI "Use PortMidi if available" ON) +if(WITH_PORTMIDI) + find_package(PortMidi) + if(PortMidi_FOUND) + set(HAVE_LIBPORTMIDI TRUE) + endif() +endif() + +option(WITH_ALSA "Use ALSA MIDI if available" ON) +if(WITH_ALSA) + find_package(ALSA) + if(ALSA_FOUND) + set(HAVE_ALSA TRUE) + endif() +endif() + +set(CMAKE_REQUIRED_INCLUDES_PREV ${CMAKE_REQUIRED_INCLUDES}) +set(CMAKE_REQUIRED_LIBRARIES_PREV ${CMAKE_REQUIRED_LIBRARIES}) +set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${SDL2_INCLUDE_DIRS}) +set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${SDL2_LIBRARIES}) +check_symbol_exists(SDL_JoystickGetAxis "SDL.h" HAVE_SDL_JOYSTICKGETAXIS) +set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_PREV}) +set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES_PREV}) + +set(DOOMWADDIR "${CMAKE_INSTALL_PREFIX}/share/games/doom" CACHE PATH "Path to look for WAD files") +set(PRBOOMDATADIR "${CMAKE_INSTALL_PREFIX}/share/${PACKAGE_TARNAME}" CACHE PATH "Path to install supplemental files") + +option(SIMPLECHECKS "Enable checks which only impose significant overhead if a posible error is detected" ON) +option(ZONEIDCHECK "Enable id checks on zone blocks, to detect corrupted and illegally freed blocks" ON) + +# Debug options, disabled by default +option(RANGECHECK "Enable internal range checking" OFF) +option(INSTRUMENTED "Enable real-time memory allocation statistics, and extra debugging features" OFF) +option(TIMEDIAG "Enable creation of time stamps each time a lump is locked, and reporting of lumps locked for long periods of time" OFF) +option(HEAPCHECK "Turn on continuous heap checking (very slow)" OFF) +option(HEAPDUMP "Turn on dumping the heap state for debugging" OFF) + +configure_file(cmake/config.h.cin config.h) + +add_definitions(-DHAVE_CONFIG_H) + +if (MSVC) + add_definitions("/D_CRT_SECURE_NO_WARNINGS") +else() + set(CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} \ + -Wall -Wno-missing-field-initializers -Wwrite-strings -Wundef \ + -Wbad-function-cast -Wcast-align -Wcast-qual -Wdeclaration-after-statement \ + -Wpointer-arith -Wno-unused -Wno-switch -Wno-sign-compare -Wno-pointer-sign \ + -ffast-math" + ) +endif() + +# Support cross compiling +option(FORCE_CROSSCOMPILE "Enable cross-compilation" OFF) +if(FORCE_CROSSCOMPILE) + set(CMAKE_CROSSCOMPILING ON) +endif() + +if(CMAKE_CROSSCOMPILING) + set(IMPORT_EXECUTABLES "IMPORTFILE-NOTFOUND" CACHE FILEPATH "Export file from native build") + include(${IMPORT_EXECUTABLES}) +else() + if(NOT CROSS_EXPORTS) + set(CROSS_EXPORTS "") + endif() +endif() + +set(PRBOOM_OUTPUT_PATH ${CMAKE_BINARY_DIR}) + +set(WAD_DATA prboom-plus.wad) +set(WAD_DATA_PATH "${PRBOOM_OUTPUT_PATH}/${WAD_DATA}") + +add_subdirectory(data) +add_subdirectory(doc) +add_subdirectory(src) + +if(NOT CMAKE_CROSSCOMPILING) + export(TARGETS ${CROSS_EXPORTS} FILE "${CMAKE_BINARY_DIR}/ImportExecutables.cmake") +endif() diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..f698bce --- /dev/null +++ b/COPYING @@ -0,0 +1,367 @@ +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public License +is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit +to using it. (Some other Free Software Foundation software is covered +by the GNU Library General Public License instead.) You can apply it +to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge +for this service if you wish), that you receive source code or can +get it if you want it, that you can change the software or use pieces +of it in new free programs; and that you know you can do these +things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, +and (2) offer you this license which gives you legal permission to +copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, +we want its recipients to know that what they have is not the +original, so that any problems introduced by others will not reflect +on the original authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making +the program proprietary. To prevent this, we have made it clear that +any patent must be licensed for everyone's free use or not licensed +at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License applies to any program or other work which contains a +notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the +Program is covered only if its contents constitute a work based on +the Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any +warranty; and give any other recipients of the Program a copy of this +License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a +fee. + +2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any part +thereof, to be licensed as a whole at no charge to all third parties +under the terms of this License. + +c) If the modified program normally reads commands interactively when +run, you must cause it, when started running for such interactive use +in the most ordinary way, to print or display an announcement +including an appropriate copyright notice and a notice that there is +no warranty (or else, saying that you provide a warranty) and that +users may redistribute the program under these conditions, and +telling the user how to view a copy of this License. (Exception: if +the Program itself is interactive but does not normally print such an +announcement, your work based on the Program is not required to print +an announcement.) +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the +Program with the Program (or with a work based on the Program) on a +volume of a storage or distribution medium does not bring the other +work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the +following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections 1 +and 2 above on a medium customarily used for software interchange; +or, + +b) Accompany it with a written offer, valid for at least three years, +to give any third party, for a charge no more than your cost of +physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to +distribute corresponding source code. (This alternative is allowed +only for noncommercial distribution and only if you received the +program in object code or executable form with such an offer, in +accord with Subsection b above.) +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this +License. However, parties who have received copies, or rights, from +you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject +to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted +herein. You are not responsible for enforcing compliance by third +parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do +not excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not distribute the Program at all. For example, +if a patent license would not permit royalty-free redistribution of +the Program by all those who receive copies directly or indirectly +through you, then the only way you could satisfy both it and this +License would be to refrain entirely from distribution of the +Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended +to apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is +willing to distribute software through any other system and a +licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new +versions of the General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published +by the Free Software Foundation. If the Program does not specify a +version number of this License, you may choose any version ever +published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the +author to ask for permission. For software which is copyrighted by +the Free Software Foundation, write to the Free Software Foundation; +we sometimes make exceptions for this. Our decision will be guided by +the two goals of preserving the free status of all derivatives of our +free software and of promoting the sharing and reuse of software +generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + +END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Programs +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make +it free software which everyone can redistribute and change under +these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + +one line to give the program's name and an idea of what it does. +Copyright (C) yyyy name of author + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. + +Also add information on how to contact you by electronic and paper +mail. + +If the program is interactive, make it output a short notice like +this when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) yyyy name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details +type `show w'. This is free software, and you are welcome +to redistribute it under certain conditions; type `show c' +for details. + +The hypothetical commands `show w' and `show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and +`show c'; they could even be mouse-clicks or menu items--whatever +suits your program. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the +program, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright +interest in the program `Gnomovision' +(which makes passes at compilers) written +by James Hacker. + +signature of Ty Coon, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking +proprietary applications with the library. If this is what you want +to do, use the GNU Library General Public License instead of this +License. + + +---------------------------------------------------------------------- +---------- +Return to GNU's home page. +FSF & GNU inquiries & questions to gnu@gnu.org. Other ways to contact +the FSF. + +Comments on these web pages to webmasters@www.gnu.org, send other +questions to gnu@gnu.org. + +Copyright notice above. +Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +MA 02111, USA + +Updated: 16 Feb 1998 tower + diff --git a/ICONS/icons.rc b/ICONS/icons.rc new file mode 100644 index 0000000..3ca1cd4 --- /dev/null +++ b/ICONS/icons.rc @@ -0,0 +1,65 @@ +#include "resource.h" +#include "winresrc.h" +#include "config.h" + +/* IDC_STATIC is documented in winuser.h, but not defined. */ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON DISCARDABLE "prboom-plus.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +#ifdef USE_WINDOWS_LAUNCHER + +#ifdef _MSC_VER +1 24 MOVEABLE PURE "prboom-plus.exe.manifest" +#else +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "prboom-plus.exe.manifest" +#endif + +IDD_LAUNCHERSERVERDIALOG DIALOGEX 0, 0, 187, 245 +STYLE DS_SYSMODAL | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT | WS_EX_APPWINDOW +CAPTION "PrBoom-Plus Launcher" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,72,224,50,14 + PUSHBUTTON "Cancel",IDCANCEL,127,224,50,14 + CONTROL "Tab1",IDC_TAB1,"SysTabControl32",0x0,5,5,178,214 +END + +IDD_LAUNCHERCLIENTDIALOG DIALOGEX 7, 7, 173, 206 +STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Game:",IDC_STATIC,4,5,22,8,0,WS_EX_TRANSPARENT + COMBOBOX IDC_IWADCOMBO,4,15,164,100,CBS_DROPDOWNLIST | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + LTEXT "Files:",IDC_STATIC,4,32,17,8,0,WS_EX_TRANSPARENT + LISTBOX IDC_PWADLIST,4,42,164,110,LBS_SORT | + LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_EXTENDEDSEL | + WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + LTEXT "History:",IDC_STATIC,4,155,38,8,0,WS_EX_TRANSPARENT + COMBOBOX IDC_HISTORYCOMBO,4,165,164,100,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Commands:",IDC_STATIC,4,181,38,8,0,WS_EX_TRANSPARENT + COMBOBOX IDC_COMMANDCOMBO,4,191,164,100,CBS_DROPDOWNLIST | + WS_VSCROLL + LTEXT "",IDC_FULLFILENAMESTATIC,23,32,142,8 +END + +#endif // USE_WINDOWS_LAUNCHER +///////////////////////////////////////////////////////////////////////////// diff --git a/ICONS/prboom-plus.bash b/ICONS/prboom-plus.bash new file mode 100644 index 0000000..e5449f7 --- /dev/null +++ b/ICONS/prboom-plus.bash @@ -0,0 +1,51 @@ +# bash completion for PrBoom+ -*- shell-script -*- + +_prboom_plus() +{ + local cur prev words cword + _init_completion || return + + # Save the previous switch on the command line in the prevsw variable + local i prevsw="" + for (( i=1; $cword > 1 && i <= $cword; i++ )); do + if [[ ${words[i]} == -* ]]; then + prevsw=${words[i]} + fi + done + + # Allow adding more than one file with the same extension to the same switch + case $prevsw in + -iwad|-file) + _filedir wad + ;; + -deh) + _filedir '@(bex|deh)' + ;; + -record*|-*demo) + _filedir lmp + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=( $( compgen -W '-1 -2 -3 -altdeath -aspect -auto -avg + -avidemo -bexout -blockmap -complevel -config -deathmatch -debugfile + -deh -devparm -fast -fastdemo -ffmap -file -fullscreen -geom -height + -iwad -levelstat -noaccel -noblit -nocheats -nodraw -nodrawers + -nofullscreen -nojoy -nomonsters -nomouse -nomusic -nosfx -nosound + -nowindow -playdemo -port -record -recordfromto -resetgamma -respawn + -save -shorttics -shotdir -skill -skipsec -solo-net -spechit -timedemo + -timer -viddump -videodriver -vidmode -viewangle -warp -width -window' \ + -- "$cur" ) ) + else + # DoLooseFiles() takes any file names on the command line before the + # first switch parm and inserts the appropriate -file, -deh or -playdemo + # switch in front of them. + if [[ -z "$prevsw" ]]; then + _filedir '@(bex|deh|lmp|wad)' + fi + fi +} && + +complete -F _prboom_plus prboom-plus + +# ex: ts=4 sw=4 et filetype=sh diff --git a/ICONS/prboom-plus.desktop b/ICONS/prboom-plus.desktop new file mode 100644 index 0000000..48f4169 --- /dev/null +++ b/ICONS/prboom-plus.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Type=Application +Name=PrBoom+ +Comment=enhanced clone of the classic first-person shooter Doom +Icon=prboom-plus +TryExec=prboom-plus +Exec=prboom-plus %F +Categories=Game;ActionGame; +MimeType=application/x-doom-wad; +Keywords=first;person;shooter;doom; diff --git a/ICONS/prboom-plus.exe.manifest b/ICONS/prboom-plus.exe.manifest new file mode 100644 index 0000000..a46fd6c --- /dev/null +++ b/ICONS/prboom-plus.exe.manifest @@ -0,0 +1,32 @@ + + + + +PrBoom-Plus + + + + + + + + + + + true + + + diff --git a/ICONS/prboom-plus.ico b/ICONS/prboom-plus.ico new file mode 100644 index 0000000000000000000000000000000000000000..171db774e3aa4134010d49890fe3ea7ee4fb061a GIT binary patch literal 417374 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 + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/ICONS/resource.h b/ICONS/resource.h new file mode 100644 index 0000000..0fd38ba --- /dev/null +++ b/ICONS/resource.h @@ -0,0 +1,20 @@ +#define IDI_ICON1 101 +#define IDI_ICON2 102 +#define IDI_ICON3 103 +#define IDI_ICON4 104 +#define IDI_ICON5 105 +#define IDI_ICON6 106 +#define IDD_LAUNCHERSERVERDIALOG 120 +#define IDD_LAUNCHERCLIENTDIALOG 121 +#define IDC_TAB1 1003 +#define IDC_COMBO1 1004 +#define IDC_IWADCOMBO 1004 +#define IDC_IWADLIST 1006 +#define IDC_LIST2 1006 +#define IDC_PWADLIST 1006 +#define IDC_LIST3 1007 +#define IDC_COMMANDCOMBO 1008 +#define IDC_HISTORYCOMBO 1009 +#define IDC_EDIT2 1014 +#define IDC_CHECK1 1015 +#define IDC_FULLFILENAMESTATIC 1016 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..c73e604 --- /dev/null +++ b/INSTALL @@ -0,0 +1,245 @@ +Basic Installation (ZIP, tarball, Git) +================== + + 1. To compile PrBoom-Plus, you need at least SDL2. To enable various + extensions and optional features, the following are required: + - SDL2_net (for network play) + - SDL2_image (for high-res textures in OpenGL, and PNG screenshots) + - PCRE (for demo filename pattern matching) + - for music support, some or all of + * SDL2_mixer (midi, timidity) + * Fluidsynth (midi) + * ALSA (midi) + * Portmidi (midi) + * MAD (mp3) + * DUMB (various tracker-style formats) + * vorbisfile (ogg) + On a typical Debian or Ubuntu system this may be sufficient: + apt-get install libsdl2-dev libsdl2-net-dev libsdl2-image-dev \ + libpcre3-dev libsdl2-mixer-dev libfluidsynth-dev \ + libportmidi-dev libmad0-dev libdumb1-dev libvorbis-dev libasound2-dev + + You will also need `cmake` and `make` if you haven't already got them. + + 2. `cd' to the directory containing the PrBoom distribution (the directory + this file is in, prboom2). + + Create a new `build` folder and `cd` into it. + `mkdir build && cd build` + + Run `cmake .. -DCMAKE_BUILD_TYPE=Release` from this folder, or + `cmake .. -DCMAKE_BUILD_TYPE=Debug` for a debug build. (This gives + slightly lower performance, but more details in the event of + issues). + + This should end with the message "Build files have been written to: [folderpath]". + + 3. Type `make` to compile PrBoom. This may take some time; while it's + compiling I suggest you read the README, or maybe go and look for some + good doom levels to play when it's finished :-). + + This should work on all Linux systems, but systems that have a make + utility other than GNU make may have problems. E.g. you might need to + install GNU make, and then use it instead of make for these + instructions. I have tested BSD pmake and it works fine. + + 4. Type `make install/strip' as root, to install the programs, data files + and man pages for PrBoom. If you don't have root access on the machine, + you should ask the syadmin to do this and the next step for you. + + If you want to install manually then you should put the `prboom-plus.wad` + in /usr/local/share/games/doom/ (or symlink it from there). + + 5. Copy your Doom, Doom 2, Ultimate Doom or Final Doom IWAD (doom.wad or + doom2.wad) to /usr/local/share/games/doom/ (or symlink it from there). + Or if you don't have any of those, use the shareware IWAD, which you can + get from http://www.doomworld.com/ or http://www.idsoftware.com/. + + If you have a system with many users, you should read the license for + your version of Doom, and make sure only those users allowed to use it + can access the IWAD file. + + You may also aquire FreeDoom from https://freedoom.github.io/ which is a + free replacement to the iD Doom iWADs. + + 6. You can remove the program binaries and object files from the + source directory by typing `make clean`. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. PrBoom is now ready for use. If /usr/local/games is in your path, + you can just run prboom; otherwise give the full path. + + + +Building an RPM +=============== + +If you are on a system which uses the RPM packaging format, you might prefer +to build an RPM containing the PrBoom binaries rather than installing them +directly. Follow steps 1 and 2 above, then run a "make rpm". This performs +the usual proceedure for building the rpm in /usr/src/redhat/. Note that +the RPM sets its own parameters to ./configure; if you want to override +them you'll have to edit the build scripts yourself. Note that to get the +correct permissions, you either have to run this process as root, or use the +wrapper program fakeroot (version 0.4.5 or later - grab it from the Debian +source archive) and make sure you have permissions to the RPM build area. + +Installation Details +==================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.ac' is used to create `configure' by a program +called `autoconf'. You only need `configure.ac' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..25e92fe --- /dev/null +++ b/NEWS @@ -0,0 +1,300 @@ +PrBoom-Plus 2.6.66 @ 20 Jun 2023 +* Move default data directory to XDG_DATA_HOME on Linux by @facespkz in https://github.com/coelckers/prboom-plus/pull/470 +* sort resolutions by width first and height second by @fabiangreffrath in https://github.com/coelckers/prboom-plus/pull/472 +* check return status when checking for old prboom_dir by @facespkz in https://github.com/coelckers/prboom-plus/pull/473 +* Fix integer overflow during multiplication with realtic_clock_rate by @jengelh in https://github.com/coelckers/prboom-plus/pull/476 +* Fix UMAPINFO par times not loading for finale levels. by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/479 +* Don't overwrite user-configured custom docdir by @vilhelmgray in https://github.com/coelckers/prboom-plus/pull/480 +* Generate mixer buffer size from sample rate by @facespkz in https://github.com/coelckers/prboom-plus/pull/483 +* Allow uppercase episode shortcuts in UMAPINFO by @facespkz in https://github.com/coelckers/prboom-plus/pull/486 +* Add complevel hints for Default compatibility level by @facespkz in https://github.com/coelckers/prboom-plus/pull/488 +* UMAPINFO: Fix nextsecret inconsistencies by @rfomin in https://github.com/coelckers/prboom-plus/pull/497 +* Fix mid-texture judder when upper and middle textures overlap. by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/507 +* include wipe effect into video capture by @vadosnaprimer in https://github.com/coelckers/prboom-plus/pull/506 +* allow to -warp to MAP00 by @fabiangreffrath in https://github.com/coelckers/prboom-plus/pull/509 +* Workaround for optimization bug in clang by @rfomin in https://github.com/coelckers/prboom-plus/pull/512 +* Show a message when demo recording starts. by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/517 +* Remove shift when initializing translation tables vs. colormap. by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/519 +* Fix PortMidi level transitions by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/523 +* replace doomedsda.us links with dsdarchive.com by @andrey-budko in https://github.com/coelckers/prboom-plus/pull/525 +* Add proper SysEx support to PortMidi by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/526 +* Fix color translation tables to not rely on player map arrow colors. by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/527 +* Fix pitch bend typo for PortMidi by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/529 +* Add configurable reverb and chorus for PortMidi by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/530 +* Adjust music volume slider to match vanilla Doom by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/531 +* Use non-linear scaling for high volume levels by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/532 +* Adjust PortMidi volume slider to match midiOutSetVolume by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/533 +* Remove alpha channel from FBO scene texture. by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/534 +* UMAPINFO: bring par times fix in line with Woof by @fabiangreffrath in https://github.com/coelckers/prboom-plus/pull/537 +* Fixing wall texture bleed when a sector is inside the sky by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/542 +* Send all notes/sound off prior to SysEx reset by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/543 +* Fix MIDI looping when using reset delay by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/544 +* Clean up and fixes for PortMidi by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/548 +* Fix FluidSynth mode and polyphony by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/550 +* PortMidi: Use channel volume control, remove extra delay after reset by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/552 +* Replace win_fopen.c with wrappers used in Chocolate Doom by @rfomin in https://github.com/coelckers/prboom-plus/pull/554 +* PortMidi: Preserve timing when filtering SysEx; default to GM mode by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/555 +* PortMidi: Add fix for MS GS Synth bug by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/557 +* PortMidi: Fix songs with missing "hold pedal off" events by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/560 +* PortMidi: Send "reset all controllers" when song loops by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/562 +* Fix M_getcwd() in MinGW build by @rfomin in https://github.com/coelckers/prboom-plus/pull/563 +* Fix string overflow with large map numbers. by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/569 +* Supply correct texture format for GL wipe. by @JadingTsunami in https://github.com/coelckers/prboom-plus/pull/570 +* PortMidi: Update volume after "reset all controllers" event by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/571 +* PortMidi: Optimize reset messages by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/572 +* PortMidi Updates by @ceski-1 in https://github.com/coelckers/prboom-plus/pull/576 +* UMAPINFO: Introduce the new author field. by @rfomin in https://github.com/coelckers/prboom-plus/pull/436 + +PrBoom-Plus 2.6.2 @ 11 Feb 2022 +- added a prospective fix for OpenGL rendering: don't bleed walls through sky floors +- account for proper crosshair offsets when locked on to monsters +- relaxed "IWAD tag not present" error to a warning, which allows loading REKKR IWAD +- fixed processing of multiple DEHs +- UMAPINFO: fixed error reporting if token == TK_NoToken +- fixed intermission screen for E0Mx +- fixed Alt+Tabbing on Windows, broken in new SDL2 version +- UMAPINFO: fixed using_FMI reset * no more crashes at textscreens + (e.g. after MAP06, MAP11 or MAP20) after viewing finale picture upon finishing + a level with UMAPINFO 'endpic' property +- fixed freezing at TITLEPIC while using mousewheel in menus +- fixed looping forever in G_NextWeapon() +- UMAPINFO: fix 'entering' and 'enterpic' shown on exit levels +- GL: adjust sky offsets for non-standard FOVs +- fixed stuttering with uncapped framerate +- added support for widescreen low resolutions +- added REKKR to launcher string list +- let G_GotoNextLevel() close the circle for maps with an endpic +- Launcher: identify IWADs either by IWAD tag, or by PWAD tag and matching filename +- Portmidi: fix freeze after song change +- fixed scaled time interpolation when changing game speed +- fixed wrong pitch of SFX when MIDI Player is set to SDL +- v1.2 compat: + * do not use sfx_getpow for powerups + * do not render powerups and attacking Spiderdemon fullbright +- UMAPINFO: fixed par times not showing +- fixed demo playback warp consistency +- added SKILL cheat to display current skill level +- fixed calculation of interpolation frac value +- guard against screen buffer underflow +- fixed crash at startup by properly closing IWAD file handle +- added vanilla_keymap option à la Chocolate Doom +- added 'run' as a mouse-settable control (mouseb_speed) + +PrBoom-Plus 2.6.1um @ 16 Aug 2021 +- fixed MOD playback with DUMB 2.x +- added TNTCLxx cheat, e.g. TNTCL04 sets complevel 4 (Final DOOM) +- draw crosshair before messages, draw crosshair for fist/chainsaw and during on-screen messages +- fixed crosshair locking on target for melee weapons +- more consistently check for ammo instead of weapon type +- fixed odd strafe values (vanilla allows even values only) +- added TNTSHORT cheat to toggle shorttics on and off while in game +- fixed typo in ZDoom-style Actor name (Slalagtite -> Stalagtite) +- fixed Windows Alt-Tab +- fixed a memory leak on SDL_Quit() +- preserve automap position/scale when toggling overlay mode +- allow binding weapon selection to mouse buttons +- add a `-pistolstart` command-line parameter +- fixed crashes on WADs with empty music lumps, e.g. Nihility.wad +- enabled loading 16 bit RIFF wavs in WADs +- make low-pass sound filter (introduced by the previous change) optional +- if executable directory appears not writable, fall back to `.` +- made pitch-shift range independent of target samplerate +- fixed bogus condition preventing automap lines from being drawn +- fixed saving of mouse button bindings +- fixed interpolated z-coordinate after teleporting +- added a new option "Disable sound cutoffs" to allow removed map objects to finish playing their sounds and to make seesounds uninterruptible +- allow deleting savegames from menu +- fixed automap crash when `USE_VERTEX_ARRAYS` and `GL_VBO` are undefined +- fluidsynth: reset all controllers when looping a song +- fixed hanging notes on exit when using Portmidi +- show current and next levels when typing IDCLEV cheat +- added a config key for "exclusive" i.e. mode-changing fullscreen +- UMAPINFO: if interbackdrop does not specify a valid flat, draw it as a patch instead +- appended revision tracker to UMAPINFO spec document +- ALSA sequencer API backend for ALSA MIDI support (Linux only) +- extended range of maps reachable via `-warp` and IDCLEV: + * from E1M1-E4M9 to E1M0-E9M99 for D1 + * from MAP01-MAP33 to MAP00-MAP99 + * Limitations: + * E0My doesn't work, since episode must always be > 0 + * `-warp x 0`, because zero passed to `-warp` as map number is used to warping to first changed map in PWAD +- evaluate mouse motion only once per tick +- show Time/STS widgets above status bar +- removed lowpass-filter item from menu +- fixed `P_SetMobjState()` stack, fixes crash on mayhem18p.wad/m18p31-1509.lmp +- fixed crash in automap on certain maps (e.g. Sunlust MAP01) when using GL renderer, Thing Appearance = Icons and 2xIDDT +- fixed menu intermission desync +- fixed crash when leaving menu in Chex Quest +- initialize the map title widget with the generic map lump name +- make "Next Level" key simply increase map number if already outside regular level transition range +- check for next level in IDCLEV cheat before announcing it +- make sure "Next Level" key never warps to a non-existent map +- reformatted umapinfo.txt so that it is easier to read in plaintext +- fixed custom episode select for Doom 2 +- fixed shifting automap markers +- allow translucent sprites on all complevels +- allow disabling predefined translucency on all complevels +- fixed flood HOM on certain maps (e.g. Plutonia MAP11, HR MAP01) (GL) +- fixed sky walls for cases with sky vs. sky toptextures (e.g. E4M6) (GL) +- fixed transparent spites being rendered incorrectly with transparent walls in view (GL) +- generate a default save-slot name when saving to an empty slot +- added mouse button binds for turn left/right +- fixed sky scaling for non-standard sky sizes, e.g. Eviternity and Ancient Aliens (GL) +- added new advanced HUD layout by Fireb3rt+ +- added slice_samplecount config option +- added manifest to declare app as DPI aware, so that Windows will not apply DPI virtualization +- added support for widescreen assets +- added ZDoom's names for the new Crispy Doom/DEHEXTRA things to ActorNames[], so they can be used with BossAction() if needed +- fixed UMAPINFO music restarting issue +- skip the 'entering level' screen if one of endgame, endpic, endbunny or endcast is set (UMAPINFO) +- fixed endbunny and endgame UMAPINFO fields +- reset mlook on demo recording +- added OpenGL sprite fuzz options ("darken", "shadow", "transparent", "ghostly") +- properly check for the CreateFileMapping() symbol (build) +- always precache sound lumps +- replace W_SafeGetNumForName() with W_CheckNumForName() +- removed defunct lump locking warnings +- removed obsolete SFX usefulness references +- allow colored blood to get set/overridden by DEHACKED, implemented Eternity's coloredblood spec, added three additional color translation tables for black, purple and white +- made the Ouch Face fix available on all complevels +- added the autoload directory feature from Chocolate Doom +- implemented custom atexit() sequence, ported over from Chocolate Doom, fixing crashes during shutdown e.g. on Linux using Wayland +- fixed switching weapons when reaching zero ammo with boom_autoswitch == 0 +- made Doom sound quirk fixes available on all complevels +- UMAPINFO: introduced the new 'label' field +- do not cast degenmobj_t as mobj_t, breaks aliasing rules on platforms where mobj_t pointers are 64-bit aligned and +degenmobj_t pointers are only 32-bit aligned +- fixed `-solo-net` for demo restart +- fixed levelstat crash for MAP33 and above +- added autoload per PWAD feature, further enhancing the autoload directory feature +- UMAPINFO: fixed 'episode' field parsing, 'label' is single-line +- removed obsolete weapon toggle setting +- added ftell() and fseek() implementations for DEHACKED lumps, allowing the DEH parser to roll back to the start of a line following a blank line and re-process it with the last valid block code handler +- added mouse look / vertical mouse movement toggle notifications +- fixed forcing aspect ratio correction only for the canonical 16:10 (i.e. 320x200 and 640x400) modes +- do not even attempt to play DEMO4 if it is not available +- only apply palette changes when inside a level +- fixed 32-bit widescreen pain palette +- added a `-coop_spawns` parameter for using "coop in single-player" mode +- fixed OpenGL effect palettes +- added support for non-latin paths and filenames on Windows +- made sure to always autoload prboom-plus.wad +- introduced a supplemental data directory "PRBOOMDATADIR" to install prboom-plus.wad into (build) +- prepared for different autoload base directories, respecting the `-noload` parameter +- fixed playback of complevel 11 demo with UMAPINFO +- fixed attempted playback of a UMAPINFO demo without UMAPINFO loaded +- never exceed desktop resolution in fullscreen desktop mode +- UMAPINFO: entries without defined 'levelname' fall back to default +- UMAPINFO: fixed default intermission +- fixed setting 'finaleflat' in FMI_StartFinale (UMAPINFO) +- fixed load game during multiplayer demo playback +- fixed OpenGL backfill + +PrBoom-Plus 2.6um @ 09 Feb 2021 +- fixed episode selection when playing Doom 2 +- fixed Doom 1 level progression +- print a blinking arrow next to the currently highlighted menu item +- print another blinking arrow to the right of the currently selected menu setting +- support the DOOMWADPATH environment variable +- add some extra states, sprites and mobjtypes from Doom Retro and Crispy Doom +- fullscreen desktop for the software renderer +- improved v1.2 compat: + - fixed a desync on the internal demo in DTH1.WAD + - fixed the walkways to the BFG rising a little too high on 1_ON_1.WAD + - moving floors (except plats) should not make the floor stop sound +- fixed infinite loop in macOS launcher +- added CMake build system +- fixed the mainfest to allow 64 bit builds +- fixed PortMidi support on 64-bit Windows +- disabled the "popping skull player death" easter egg +- do not wait for VSync if running a timedemo +- added -statdump parameter from Chocolate Doom +- added mouse-strafe divisor setting +- removed and/or replace all non-free data lumps +- improved Boom random seed +- added -stroller param +- include secret exit in -levelstat +- added configurable quickstart window +- disallow 180-turn with strafe on +- fixed endianess for 32-bit ZDoom nodes +- show Extended Help screen when pressing the Help key +- made armor color depend on type, not amount +- added Chocolate Doom mouse behavior option +- fixed Boom autoswitch behavior +- reinstated the "WEAPON ATTACK ALIGNMENT" menu option +- changed "SECRET AREAS" menu option to "REPORT REVEALED SECRETS" +- fixed endianess for DeePBSP V4 nodes +- show error message boxes on Windows, except when video-dumping a demo +- unbind game speed changing keys in default config +- fixed heap buffer overflows in UDP multiplayer code +- fixed -longtics having no effect +- changed video capture to an ffmpeg-based approach +- track demo joins for TAS-detection purposes +- fixed some episode transition issues when using UMAPINFO +- added automap rotate and overlay keybindings to menus +- fixed a bug in DeHackEd string replacements with a length of exactly four +- added "Dropped Item" menu support +- enabled automap Follow Mode by default +- disabled chorus and reverb for Fluidsynth by default +- fix segfault with -viewangle parameter +- next levels no longer reset if endscreen is disabled in UMAPINFO +- added 200 Sounds for DEHEXTRA +- respawn when using IDDQD while dead +- fixes for empty DeHackEd lumps and entries +- restrict "next level" button usage to in-level only +- added adaptations for fluidsynth 2.0 +- added "No Vertical Mouse" setting and keybind +- save / load -complevel 9 friction +- added extensible demo format + "PR+UM" signature +- made canonical resolutions (320x200, 320x240, 640x400 and 640x480) + always available in menu, regardless of what video driver/SDL report +- fixed aspect ratio for canonical resolutions; be sure to set "Aspect Ratio" to "Auto" + and "Status Bar and Menu Appearance" to "Not Adjusted" for both 320x200 and 640x400 +- set minimum windows size to prevent window from shrinking when changing video modes +- "Screen Multiple Factor" now functions like a "window size factor" + (i.e. like "-1", "-2", "-3" in Chocolate Doom) and has no effect in fullscreen modes +- added "Integer Screen Scaling" option (à la Crispy Doom), which restricts the screen + size to integer multiples of the game resolution, under Options -> General, page 5 +- both executables now share the same config file "prboom-plus.cfg", with all config + keys always preserved - including the GL-related ones +- switched to the unified executable "prboom-plus" with optional OpenGL rendering +- portmidi: pitch bends are now reset when stopping song +- added support for more mouse buttons +- fixed resolution-independent mouse sensitivity +- added demo restart functionality - record a new demo on map restart +- setup menus remember last active item +- fixed the KFA cheat sting not read from .bex patches +- UMAPINFO docs updated re: "bossaction" field +- fixed a crash when running out of space while typing in a file path into the autoload + fields (Options -> General, page 2) +- fixed the "Garbage lines at the top of weapon sprites" issue (#95) +- add support for named complevels on command line: + -complevel 1.9 = -complevel 2 + -complevel doom2 = -complevel 2 + -complevel ultimate = -complevel 3 + -complevel udoom = -complevel 3 + -complevel final = -complevel 4 + -complevel tnt = -complevel 4 + -complevel plutonia = -complevel 4 + -complevel boom = -complevel 9 + -complevel mbf = -complevel 11 + -complevel vanilla = complevel autodetected according to IWAD loaded +- allow MBF sky transfers in all complevels +- add support for colored blood and gibs +- fixed key-bindings unusable after mouse-wheel up/down + +PrBoom-Plus 2.5.1.7um @ 16 Jun 2019 +- adds a special marker to demos recorded with UMAPINFO +- addes support for ZDBSP's compressed node format +- fixes the rendering problems in OpenGL +- fixes TRANMAP caching + +PrBoom-Plus 2.5.1.6um @ 11 Jun 2019 +This fixes a major bug with the episode selection menu not working and adds IDCLEV checks for maps outside the standard range. + +PrBoom-Plus 2.5.1.5um @ 10 Jun 2019 +First official release with UMAPINFO support + +2.5.1.4.umapinfo_test @ 22 Apr 2017 +Beta version with UMAPINFO support. +Note that this is for testing as the newly added MAPINFO feature has not seen thorough testing yet. diff --git a/README b/README new file mode 100644 index 0000000..d62e797 --- /dev/null +++ b/README @@ -0,0 +1,251 @@ +PrBoom 2.6.66 + +PrBoom is a version of the classic 3D shoot'em'up game Doom, originally +written by id Software. + +See the file AUTHORS in this distribution for a list of authors and +other contributors, and a history of the projects PrBoom is derived +from. + +PrBoom is made available under the GNU General Public License. See the +file COPYING included in this distribution for details. + +Please see the NEWS file included for changes since the previous version. + +Game data - WADs +---------------- + +(This section is aimed at people not familiar with Doom and the +data files it uses.) + +PrBoom is a game engine - it provides a program to play Doom levels, but +it doesn't include any levels itself. More importantly, you need all the +sounds, sprites, and other graphics that make up the Doom environment. +So to play PrBoom, you need one of the main Doom date files from id +Software - either doom.wad, doom2.wad, tnt.wad or plutonia.wad from one +of the commercial Doom games, or the shareware doom1.wad. This file +is called the IWAD. + +PrBoom also supports playing Doom add-on levels, called "PWADs", which +are small extra .wad files which just contain extra levels or other +resources. PWADs are ONLY ADD-ONS, you still need the original IWAD +that they are designed to work with. In practice, most PWADs on the +Internet require doom2.wad (although some work with doom.wad). + +If you don't own any of the Doom games, get the shareware doom1.wad +from doom19s.zip on Doomworld's shareware download page. But note that you +will not be able to play most add-ons. +http://www.doomworld.com/files/shareware.shtml + +Windows Installation +-------------------- + +Just extract the zip to a directory of your choice and copy your IWAD +files into it. Now you can make shortcuts and add "-iwad filename.wad" +to them. + +The SDL_mixer library used by PrBoom supports software MIDI music +synthesis. If you want to hear the Doom music, you need a set of +Timidity instrument patches. Do a web search for timidity patch sets, +there are plenty around. +These patch sets are a large download (>5megs). +SDL_mixer does not currently support hardware MIDI synthesis. But we +have added a hacked version of SDL_mixer with native midi support. If +you like to try it out, rename SDL_mixer_beta.dll to SDL_mixer.dll. +You should rename the original SDL_mixer.dll before. Tell us if it +works or not. Please note, that there might be bugs in the native midi +implementation. + +Linux Installation +------------------ + +For UNIX, Linux, and other POSIX systems, you need the SDL libraries in +order to use PrBoom. If you haven't already done so, visit +http://prboom.sourceforge.net/linux.html and follow the instructions there +for your system, downloading the necessary libraries, and either +installing the binary RPM package or compiling PrBoom from source. + +Once you've done that, you'll need to copy your IWAD file (see the section +above if you don't know what this is) to a directory where PrBoom can find +it. Make /usr/local/share/games/doom/, and copy your IWAD (all of your +IWADs, if you own more than one) to that directory. + +Mac OS Installation +------------------- + +Copy your IWAD (see above) into your home folder under +Library:Application Support:PrBoom (this folder will be created for you the +first time you run PrBoom). + +First Use +--------- + +If it's the first time you've run PrBoom, you'll need to do some configuring +to get the controls and display right for you. + +On a new installation, PrBoom runs at 640x480 resolution. If you have used +PrBoom before, you may have an old config file in your home directory which +specifies a lower resolution, such as Doom's normal 320x200. You can use the +-width and -height parameters to select a higher resolution, e.g.: + +prboom -width 640 -height 400 + +sets the resolution. This setting is remembered for future sessions. For +other parameters, see the included README.command-line. + +You may also wish to customise the key bindings. PrBoom's default keybindings +are the same as the original Doom; unlike original Doom, you can change key +bindings in the game. In the in-game menus, go to Options, Settings, Key +Bindings. + +On Mac OS X, you can't use the command line, but after running the program +once, you can edit YOURHOME:Library:Application Support:PrBoom:prboom.cfg to +change settings like your screen resolution. + +Features +-------- + + This is all the features PrBoom has compared to the original Doom game + - it's intended to give you an idea of the enhancements, rather than + burying you in details. + + See http://prboom.sourceforge.net/about.html for an HTML version of + this list. + + This is shamelessly modelled on Boom's changes pages. By each + change, there's the name of the port the feature comes from (so it's + compatible with). + +Playing the game + + * Supports loading dehacked files at the command line, or in WADs + (BOOM, MBF) + * Supports PWADs containing sprites and flats (BOOM) + * Save games and demos completely store game parameters (BOOM, + MBF) + * Savegames store list of loaded WAD files, warning if wrong files + loaded (BOOM, MBF) + +Game engine + + * Player bobbing improved, optional (BOOM, MBF) + * Friction effects (BOOM), affecting players and monsters + (MBF) + * Wind, current, conveyor effects (BOOM) + * Far more flexible scrolling wall/floor types (BOOM) + * Always run (BOOM) + * Weapon change logic overhauled and improved (BOOM) + * Support for friendly monsters, helper dogs (MBF) + * Monster target finding code improved (MBF) + * AI improvements (MBF) + * Bouncy and touchy things (MBF) + * New code pointers (MBF) + * Per-level and animated skies (MBF) + * Generalised line types system gives complete flexibility + (BOOM) + * Elevators (BOOM) + * Translucent sprites, walls (BOOM) + * Independent floor and ceiling lighting (BOOM) + * Silent teleports (BOOM) + * Deep water, true underwater areas (BOOM) + * Icon of Sin telefragging made more consistent (MBF) + * Fix large numbers of game bugs (BOOM, MBF, LxDoom) + * Support arbitrary texture heights (BOOM) + +Screen + + * High resolution support (PrBoom) + * Optional message console, multiple message lines (BOOM) + * Status bar shows health/armour/ammo in colours (BOOM) + * Heads up display, showing ammo, health, keys overlayed on view + (BOOM) + +Multiplayer + + * Spy mode improved (BOOM) + * Support for loadgame in a net game (LxDoom) + * Client server style network games (LxDoom) + +Automap + + * No limit on marks (BOOM) + * Rotation and overlay modes (DOSDoom, LxDoom) + * Map shows coordinates (BOOM), optionally follow pointer + (MBF) + * Teleport lines, key doors and switches marked specially (BOOM) + * Keys, secrets visible on map with cheat codes (BOOM) + * Colours fully configurable from menus (BOOM) + +Intermission screens + + * Par times hidden when not relevant (BOOM) + * Total episode time shown (LxDoom) + +Menus + + * F1 help screen shows current key setup (BOOM) + * Key bindings, monster behaviour, and compatibility settings all set + in menus (BOOM, MBF) + +Compatibility + + * Game is capable of behaving like any of: original Doom v1.9, Boom + v2.02, MBF (BOOM, MBF, LxDoom) + * Plays most original Doom v1.9 demos (more than Boom or MBF) + * Plays most Boom v2.02 demos (apart from levels with friction + effects everything should work). + * Plays some DOSDoom, earlier Doom, earlier Boom, and LxDoom demos. + * Plays all MBF demos. + * Auto-correction of common bugs in old levels (MBF), with + warnings (LxDoom) + * Fine control of options controlling compatibility and new features + (MBF) + +Controls + + * Greater control of key bindings from in game menus (BOOM) + * More accurate mouse sensitivity control (BOOM, LxDoom) + +Misc + + * Screenshot code improved, supports BMPs (BOOM) + * Support for ENDOOM and ENDBOOM (BOOM, LxDoom) + * -timedemo and -fastdemo options (BOOM) + * Real time frame rate, segs, visplanes, sprites display + (LxDoom) + * Various extra cheat codes (BOOM, LxDoom) + +Internals + + * Greatly improved internal memory management (BOOM, LxDoom) + * Startup time greatly shortened by lazy generation of some lookups + (DOSDoom, LxDoom) + * Removed internal limits (BOOM) + +Other Tips +---------- + +On Linux, SDL tries to detect an appropriate video device automatically. +If you want to overrite the default, you can set the SDL_VIDEODRIVER +enviromental variable. At a bash prompt, this is as easy as running: + +SDL_VIDEODRIVER=fbcon prboom +or +SDL_VIDEODRIVER=svga prboom + +Details +------- + +Details on these extra features are split into separate text files: + +README.demos provides a guide to PrBoom's demo support +README.compatibility describes PrBoom's various compatibility + options and modes +README.command-line gives a command line reference for prboom, + prboom-game-server, and the format of boom.cfg. + On UNIX/Linux systems use the man pages instead. + +Editing features are not covered in the docs with this package. We plan +to bundle the editing docs as a separate download. Watch our website +for news. + diff --git a/cmake/FindALSA.cmake b/cmake/FindALSA.cmake new file mode 100644 index 0000000..23003b3 --- /dev/null +++ b/cmake/FindALSA.cmake @@ -0,0 +1,69 @@ +# Alsa check, based on libkmid/configure.in.in. +# Only the support for Alsa >= 0.9.x was included; 0.5.x was dropped (but feel free to re-add it if you need it) +# It defines ... +# It offers the following macros: +# ALSA_CONFIGURE_FILE(config_header) - generate a config.h, typical usage: +# ALSA_CONFIGURE_FILE(${CMAKE_BINARY_DIR}/config-alsa.h) +# ALSA_VERSION_STRING(version_string) looks for alsa/version.h and reads the version string into +# the first argument passed to the macro + +# Copyright (c) 2006, David Faure, +# Copyright (c) 2007, Matthias Kretz +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +include(CheckIncludeFiles) +include(CheckIncludeFileCXX) +include(CheckLibraryExists) + +# Already done by toplevel +find_library(ASOUND_LIBRARY asound) +set(ASOUND_LIBRARY_DIR "") +if(ASOUND_LIBRARY) + get_filename_component(ASOUND_LIBRARY_DIR ${ASOUND_LIBRARY} PATH) +endif(ASOUND_LIBRARY) + +check_library_exists(asound snd_seq_create_simple_port "${ASOUND_LIBRARY_DIR}" HAVE_LIBASOUND2) +if(HAVE_LIBASOUND2) + message(STATUS "Found ALSA: ${ASOUND_LIBRARY}") +else(HAVE_LIBASOUND2) + message(STATUS "ALSA not found") +endif(HAVE_LIBASOUND2) +set(ALSA_FOUND ${HAVE_LIBASOUND2}) + +find_path(ALSA_INCLUDES alsa/version.h) + +macro(ALSA_VERSION_STRING _result) + # check for version in alsa/version.h + if(ALSA_INCLUDES) + file(READ "${ALSA_INCLUDES}/alsa/version.h" _ALSA_VERSION_CONTENT) + string(REGEX REPLACE ".*SND_LIB_VERSION_STR.*\"(.*)\".*" "\\1" ${_result} ${_ALSA_VERSION_CONTENT}) + else(ALSA_INCLUDES) + message(STATUS "ALSA version not known. ALSA output will probably not work correctly.") + endif(ALSA_INCLUDES) +endmacro(ALSA_VERSION_STRING _result) + + +get_filename_component(_FIND_ALSA_MODULE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) +macro(ALSA_CONFIGURE_FILE _destFile) + check_include_files(sys/soundcard.h HAVE_SYS_SOUNDCARD_H) + check_include_files(machine/soundcard.h HAVE_MACHINE_SOUNDCARD_H) + + check_include_files(linux/awe_voice.h HAVE_LINUX_AWE_VOICE_H) + check_include_files(awe_voice.h HAVE_AWE_VOICE_H) + check_include_files(/usr/src/sys/i386/isa/sound/awe_voice.h HAVE__USR_SRC_SYS_I386_ISA_SOUND_AWE_VOICE_H) + check_include_files(/usr/src/sys/gnu/i386/isa/sound/awe_voice.h HAVE__USR_SRC_SYS_GNU_I386_ISA_SOUND_AWE_VOICE_H) + + check_include_file_cxx(sys/asoundlib.h HAVE_SYS_ASOUNDLIB_H) + check_include_file_cxx(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H) + + check_library_exists(asound snd_pcm_resume "${ASOUND_LIBRARY_DIR}" ASOUND_HAS_SND_PCM_RESUME) + if(ASOUND_HAS_SND_PCM_RESUME) + set(HAVE_SND_PCM_RESUME 1) + endif(ASOUND_HAS_SND_PCM_RESUME) + + configure_file(${_FIND_ALSA_MODULE_DIR}/config-alsa.h.cmake ${_destFile}) +endmacro(ALSA_CONFIGURE_FILE _destFile) + +mark_as_advanced(ALSA_INCLUDES ASOUND_LIBRARY) diff --git a/cmake/FindDUMB.cmake b/cmake/FindDUMB.cmake new file mode 100644 index 0000000..a8a5e1b --- /dev/null +++ b/cmake/FindDUMB.cmake @@ -0,0 +1,28 @@ + +SET(DUMB_SEARCH_PATHS + /usr/local/ + /usr + /opt +) + +FIND_PATH(DUMB_INCLUDE_DIR dumb.h + HINTS ${DUMB_ROOT} + PATH_SUFFIXES include include/dumb + PATHS ${DUMB_SEARCH_PATHS} +) +FIND_LIBRARY(DUMB_LIBRARY dumb + HINTS ${DUMB_ROOT} + PATH_SUFFIXES lib64 lib + PATHS ${DUMB_SEARCH_PATHS} +) + +IF(DUMB_INCLUDE_DIR AND DUMB_LIBRARY) + SET(DUMB_FOUND TRUE) +ENDIF (DUMB_INCLUDE_DIR AND DUMB_LIBRARY) + + +IF(DUMB_FOUND) + MESSAGE(STATUS "Found Dumb: ${DUMB_LIBRARY}") +ELSE(DUMB_FOUND) + MESSAGE(STATUS "Could NOT find Dumb") +ENDIF(DUMB_FOUND) diff --git a/cmake/FindFluidSynth.cmake b/cmake/FindFluidSynth.cmake new file mode 100644 index 0000000..7d5cb6a --- /dev/null +++ b/cmake/FindFluidSynth.cmake @@ -0,0 +1,23 @@ +# - Find fluidsynth +# Find the native fluidsynth includes and library +# +# FLUIDSYNTH_INCLUDE_DIR - where to find fluidsynth.h +# FLUIDSYNTH_LIBRARIES - List of libraries when using fluidsynth. +# FLUIDSYNTH_FOUND - True if fluidsynth found. + + +IF (FLUIDSYNTH_INCLUDE_DIR AND FLUIDSYNTH_LIBRARIES) + # Already in cache, be silent + SET(FluidSynth_FIND_QUIETLY TRUE) +ENDIF (FLUIDSYNTH_INCLUDE_DIR AND FLUIDSYNTH_LIBRARIES) + +FIND_PATH(FLUIDSYNTH_INCLUDE_DIR fluidsynth.h) + +FIND_LIBRARY(FLUIDSYNTH_LIBRARIES NAMES fluidsynth ) +MARK_AS_ADVANCED( FLUIDSYNTH_LIBRARIES FLUIDSYNTH_INCLUDE_DIR ) + +# handle the QUIETLY and REQUIRED arguments and set FLUIDSYNTH_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(FluidSynth DEFAULT_MSG FLUIDSYNTH_LIBRARIES FLUIDSYNTH_INCLUDE_DIR) + diff --git a/cmake/FindLibMad.cmake b/cmake/FindLibMad.cmake new file mode 100644 index 0000000..e20fb0c --- /dev/null +++ b/cmake/FindLibMad.cmake @@ -0,0 +1,45 @@ +#------------------------------------------------------------------------------- +# +# Copyright 2013-2018 BBC Research and Development +# +# This file is part of Audio Waveform Image Generator. +# +# Author: Chris Needham +# +# Audio Waveform Image Generator is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the License, +# or (at your option) any later version. +# +# Audio Waveform Image Generator is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Audio Waveform Image Generator. If not, see . +# +#------------------------------------------------------------------------------- +# +# Finds libmad include file and library. This module sets the following +# variables: +# +# LIBMAD_FOUND - Flag if libmad was found +# LIBMAD_INCLUDE_DIRS - libmad include directories +# LIBMAD_LIBRARIES - libmad library paths +# +#------------------------------------------------------------------------------- + +include(FindPackageHandleStandardArgs) + +find_path(LIBMAD_INCLUDE_DIRS mad.h) +find_library(LIBMAD_LIBRARIES mad) + +find_package_handle_standard_args( + LibMad + DEFAULT_MSG + LIBMAD_LIBRARIES + LIBMAD_INCLUDE_DIRS +) + +#------------------------------------------------------------------------------- diff --git a/cmake/FindOgg.cmake b/cmake/FindOgg.cmake new file mode 100644 index 0000000..fda5893 --- /dev/null +++ b/cmake/FindOgg.cmake @@ -0,0 +1,53 @@ +# - Find ogg library +# Find the native Ogg headers and libraries. +# +# OGG_INCLUDE_DIRS - where to find ogg/ogg.h, etc. +# OGG_LIBRARIES - List of libraries when using ogg. +# OGG_FOUND - True if ogg is found. + +#============================================================================= +#Copyright 2000-2009 Kitware, Inc., Insight Software Consortium +#All rights reserved. +# +#Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +#* Redistributions of source code must retain the above copyright notice, +#this list of conditions and the following disclaimer. +# +#* Redistributions in binary form must reproduce the above copyright notice, +#this list of conditions and the following disclaimer in the documentation +#and/or other materials provided with the distribution. +# +#* Neither the names of Kitware, Inc., the Insight Software Consortium, nor +#the names of their contributors may be used to endorse or promote products +#derived from this software without specific prior written permission. +# +#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +#IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +#ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +#LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +#CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +#SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +#INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +#CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +#ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#POSSIBILITY OF SUCH DAMAGE. +#============================================================================= + +# Look for the header file. +FIND_PATH(OGG_INCLUDE_DIR NAMES ogg/ogg.h) +MARK_AS_ADVANCED(OGG_INCLUDE_DIR) + +# Look for the library. +FIND_LIBRARY(OGG_LIBRARY NAMES ogg) +MARK_AS_ADVANCED(OGG_LIBRARY) + +# handle the QUIETLY and REQUIRED arguments and set OGG_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Ogg DEFAULT_MSG OGG_LIBRARY OGG_INCLUDE_DIR) + +SET(OGG_LIBRARIES ${OGG_LIBRARY}) +SET(OGG_INCLUDE_DIRS ${OGG_INCLUDE_DIR}) diff --git a/cmake/FindPCREPOSIX.cmake b/cmake/FindPCREPOSIX.cmake new file mode 100644 index 0000000..7cc40ec --- /dev/null +++ b/cmake/FindPCREPOSIX.cmake @@ -0,0 +1,34 @@ +# - Find pcreposix +# Find the native PCRE and PCREPOSIX include and libraries +# +# PCRE_INCLUDE_DIR - where to find pcreposix.h, etc. +# PCREPOSIX_LIBRARIES - List of libraries when using libpcreposix. +# PCRE_LIBRARIES - List of libraries when using libpcre. +# PCREPOSIX_FOUND - True if libpcreposix found. +# PCRE_FOUND - True if libpcre found. + +IF (PCRE_INCLUDE_DIR) + # Already in cache, be silent + SET(PCRE_FIND_QUIETLY TRUE) +ENDIF (PCRE_INCLUDE_DIR) + +FIND_PATH(PCRE_INCLUDE_DIR pcreposix.h) +FIND_LIBRARY(PCREPOSIX_LIBRARY NAMES pcreposix libpcreposix) +FIND_LIBRARY(PCRE_LIBRARY NAMES pcre libpcre) + +# handle the QUIETLY and REQUIRED arguments and set PCREPOSIX_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCREPOSIX DEFAULT_MSG PCREPOSIX_LIBRARY PCRE_INCLUDE_DIR) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE DEFAULT_MSG PCRE_LIBRARY) + +IF(PCREPOSIX_FOUND) + SET(PCREPOSIX_LIBRARIES ${PCREPOSIX_LIBRARY}) + SET(HAVE_LIBPCREPOSIX 1) + SET(HAVE_PCREPOSIX_H 1) +ENDIF(PCREPOSIX_FOUND) + +IF(PCRE_FOUND) + SET(PCRE_LIBRARIES ${PCRE_LIBRARY}) + SET(HAVE_LIBPCRE 1) +ENDIF(PCRE_FOUND) diff --git a/cmake/FindPortMidi.cmake b/cmake/FindPortMidi.cmake new file mode 100644 index 0000000..55a7485 --- /dev/null +++ b/cmake/FindPortMidi.cmake @@ -0,0 +1,36 @@ +# - Try to find PortMidi +# Once done, this will define +# +# PortMidi_FOUND - system has PortMidi +# PortMidi_INCLUDE_DIRS - the PortMidi include directories +# PortMidi_LIBRARIES - link these to use PortMidi +# PortMidi_VERSION - detected version of PortMidi +# +# See documentation on how to write CMake scripts at +# http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries + +find_library(PORTMIDI_LIBRARY portmidi + HINTS + $ENV{PORTMIDI_DIR} +) + +find_library(PORTTIME_LIBRARY porttime + HINTS + $ENV{PORTMIDI_DIR} +) + +find_path(PORTMIDI_INCLUDE_DIR portmidi.h + HINTS + $ENV{PORTMIDI_DIR} +) + +set(PORTMIDI_LIBRARIES ${PORTMIDI_LIBRARY}) + +if (PORTTIME_LIBRARY) + list(APPEND PORTMIDI_LIBRARIES ${PORTTIME_LIBRARY}) +endif (PORTTIME_LIBRARY) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PortMidi REQUIRED_VARS PORTMIDI_LIBRARIES PORTMIDI_INCLUDE_DIR) + +mark_as_advanced(PORTMIDI_LIBRARY) diff --git a/cmake/FindSDL2.cmake b/cmake/FindSDL2.cmake new file mode 100644 index 0000000..40178ca --- /dev/null +++ b/cmake/FindSDL2.cmake @@ -0,0 +1,368 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# Copyright 2019 Amine Ben Hassouna +# Copyright 2000-2019 Kitware, Inc. and Contributors +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. + +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# * Neither the name of Kitware, Inc. nor the names of Contributors +# may be used to endorse or promote products derived from this +# software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindSDL2 +-------- + +Locate SDL2 library + +This module defines the following 'IMPORTED' targets: + +:: + + SDL2::Core + The SDL2 library, if found. + Libraries should link to SDL2::Core + + SDL2::Main + The SDL2main library, if found. + Applications should link to SDL2::Main instead of SDL2::Core + + + +This module will set the following variables in your project: + +:: + + SDL2_LIBRARIES, the name of the library to link against + SDL2_INCLUDE_DIRS, where to find SDL.h + SDL2_FOUND, if false, do not try to link to SDL2 + SDL2MAIN_FOUND, if false, do not try to link to SDL2main + SDL2_VERSION_STRING, human-readable string containing the version of SDL2 + + + +This module responds to the following cache variables: + +:: + + SDL2_PATH + Set a custom SDL2 Library path (default: empty) + + SDL2_NO_DEFAULT_PATH + Disable search SDL2 Library in default path. + If SDL2_PATH (default: ON) + Else (default: OFF) + + SDL2_INCLUDE_DIR + SDL2 headers path. + + SDL2_LIBRARY + SDL2 Library (.dll, .so, .a, etc) path. + + SDL2MAIN_LIBRAY + SDL2main Library (.a) path. + + SDL2_BUILDING_LIBRARY + This flag is useful only when linking to SDL2_LIBRARIES insead of + SDL2::Main. It is required only when building a library that links to + SDL2_LIBRARIES, because only applications need main() (No need to also + link to SDL2main). + If this flag is defined, then no SDL2main will be added to SDL2_LIBRARIES + and no SDL2::Main target will be created. + + +Don't forget to include SDLmain.h and SDLmain.m in your project for the +OS X framework based version. (Other versions link to -lSDL2main which +this module will try to find on your behalf.) Also for OS X, this +module will automatically add the -framework Cocoa on your behalf. + + +Additional Note: If you see an empty SDL2_LIBRARY in your project +configuration, it means CMake did not find your SDL2 library +(SDL2.dll, libsdl2.so, SDL2.framework, etc). Set SDL2_LIBRARY to point +to your SDL2 library, and configure again. Similarly, if you see an +empty SDL2MAIN_LIBRARY, you should set this value as appropriate. These +values are used to generate the final SDL2_LIBRARIES variable and the +SDL2::Core and SDL2::Main targets, but when these values are unset, +SDL2_LIBRARIES, SDL2::Core and SDL2::Main does not get created. + + +$SDL2DIR is an environment variable that would correspond to the +./configure --prefix=$SDL2DIR used in building SDL2. l.e.galup 9-20-02 + + + +Created by Amine Ben Hassouna: + Adapt FindSDL.cmake to SDL2 (FindSDL2.cmake). + Add cache variables for more flexibility: + SDL2_PATH, SDL2_NO_DEFAULT_PATH (for details, see doc above). + Mark 'Threads' as a required dependency for non-OSX systems. + Modernize the FindSDL2.cmake module by creating specific targets: + SDL2::Core and SDL2::Main (for details, see doc above). + + +Original FindSDL.cmake module: + Modified by Eric Wing. Added code to assist with automated building + by using environmental variables and providing a more + controlled/consistent search behavior. Added new modifications to + recognize OS X frameworks and additional Unix paths (FreeBSD, etc). + Also corrected the header search path to follow "proper" SDL + guidelines. Added a search for SDLmain which is needed by some + platforms. Added a search for threads which is needed by some + platforms. Added needed compile switches for MinGW. + +On OSX, this will prefer the Framework version (if found) over others. +People will have to manually change the cache value of SDL2_LIBRARY to +override this selection or set the SDL2_PATH variable or the CMake +environment CMAKE_INCLUDE_PATH to modify the search paths. + +Note that the header path has changed from SDL/SDL.h to just SDL.h +This needed to change because "proper" SDL convention is #include +"SDL.h", not . This is done for portability reasons +because not all systems place things in SDL/ (see FreeBSD). +#]=======================================================================] + +# Define options for searching SDL2 Library in a custom path + +set(SDL2_PATH "" CACHE STRING "Custom SDL2 Library path") + +set(_SDL2_NO_DEFAULT_PATH OFF) +if(SDL2_PATH) + set(_SDL2_NO_DEFAULT_PATH ON) +endif() + +set(SDL2_NO_DEFAULT_PATH ${_SDL2_NO_DEFAULT_PATH} + CACHE BOOL "Disable search SDL2 Library in default path") +unset(_SDL2_NO_DEFAULT_PATH) + +set(SDL2_NO_DEFAULT_PATH_CMD) +if(SDL2_NO_DEFAULT_PATH) + set(SDL2_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH) +endif() + +# Search for the SDL2 include directory +find_path(SDL2_INCLUDE_DIR SDL.h + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + include/SDL2 include + PATHS ${SDL2_PATH} + DOC "Where the SDL2 headers can be found" +) + +set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}") + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(VC_LIB_PATH_SUFFIX lib/x64) +else() + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() + +# SDL-2.0 is the name used by FreeBSD ports... +# don't confuse it for the version number. +find_library(SDL2_LIBRARY + NAMES SDL2 SDL-2.0 + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2_PATH} + DOC "Where the SDL2 Library can be found" +) + +set(SDL2_LIBRARIES "${SDL2_LIBRARY}") + +if(NOT SDL2_BUILDING_LIBRARY) + if(NOT SDL2_INCLUDE_DIR MATCHES ".framework") + # Non-OS X framework versions expect you to also dynamically link to + # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms + # seem to provide SDL2main for compatibility even though they don't + # necessarily need it. + + if(SDL2_PATH) + set(SDL2MAIN_LIBRARY_PATHS "${SDL2_PATH}") + endif() + + if(NOT SDL2_NO_DEFAULT_PATH) + set(SDL2MAIN_LIBRARY_PATHS + /sw + /opt/local + /opt/csw + /opt + "${SDL2MAIN_LIBRARY_PATHS}" + ) + endif() + + find_library(SDL2MAIN_LIBRARY + NAMES SDL2main + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2MAIN_LIBRARY_PATHS} + DOC "Where the SDL2main library can be found" + ) + unset(SDL2MAIN_LIBRARY_PATHS) + endif() +endif() + +# MinGW needs an additional link flag, -mwindows +# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -mwindows +if(MINGW) + set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW") +endif() + +if(SDL2_LIBRARY) + # For SDL2main + if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) + list(FIND SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX) + if(_SDL2_MAIN_INDEX EQUAL -1) + set(SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARIES}) + endif() + unset(_SDL2_MAIN_INDEX) + endif() + + # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. + # CMake doesn't display the -framework Cocoa string in the UI even + # though it actually is there if I modify a pre-used variable. + # I think it has something to do with the CACHE STRING. + # So I use a temporary variable until the end so I can set the + # "real" variable in one-shot. + if(APPLE) + set(SDL2_LIBRARIES ${SDL2_LIBRARIES} "-framework Cocoa") + endif() + + # For threads, as mentioned Apple doesn't need this. + # In fact, there seems to be a problem if I used the Threads package + # and try using this line, so I'm just skipping it entirely for OS X. + if(NOT APPLE) + set(SDL2_LIBRARIES ${SDL2_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + endif() + + # For MinGW library + if(MINGW) + set(SDL2_LIBRARIES ${MINGW32_LIBRARY} ${SDL2_LIBRARIES}) + endif() + +endif() + +# Read SDL2 version +if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") + set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) + unset(SDL2_VERSION_MAJOR_LINE) + unset(SDL2_VERSION_MINOR_LINE) + unset(SDL2_VERSION_PATCH_LINE) + unset(SDL2_VERSION_MAJOR) + unset(SDL2_VERSION_MINOR) + unset(SDL2_VERSION_PATCH) +endif() + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 + REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) + +if(SDL2MAIN_LIBRARY) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2main + REQUIRED_VARS SDL2MAIN_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) +endif() + + +mark_as_advanced(SDL2_PATH + SDL2_NO_DEFAULT_PATH + SDL2_LIBRARY + SDL2MAIN_LIBRARY + SDL2_INCLUDE_DIR + SDL2_BUILDING_LIBRARY) + + +# SDL2:: targets (SDL2::Core and SDL2::Main) +if(SDL2_FOUND) + + # SDL2::Core target + if(SDL2_LIBRARY AND NOT TARGET SDL2::Core) + add_library(SDL2::Core UNKNOWN IMPORTED) + set_target_properties(SDL2::Core PROPERTIES + IMPORTED_LOCATION "${SDL2_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}") + + if(APPLE) + # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. + # For more details, please see above. + set_property(TARGET SDL2::Core APPEND PROPERTY + INTERFACE_LINK_OPTIONS "-framework Cocoa") + else() + # For threads, as mentioned Apple doesn't need this. + # For more details, please see above. + set_property(TARGET SDL2::Core APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Threads::Threads) + endif() + endif() + + # SDL2::Main target + # Applications should link to SDL2::Main instead of SDL2::Core + # For more details, please see above. + if(NOT SDL2_BUILDING_LIBRARY AND NOT TARGET SDL2::Main) + + if(SDL2_INCLUDE_DIR MATCHES ".framework" OR NOT SDL2MAIN_LIBRARY) + add_library(SDL2::Main INTERFACE IMPORTED) + set_property(TARGET SDL2::Main PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::Core) + elseif(SDL2MAIN_LIBRARY) + # MinGW requires that the mingw32 library is specified before the + # libSDL2main.a static library when linking. + # The SDL2::MainInternal target is used internally to make sure that + # CMake respects this condition. + add_library(SDL2::MainInternal UNKNOWN IMPORTED) + set_property(TARGET SDL2::MainInternal PROPERTY + IMPORTED_LOCATION "${SDL2MAIN_LIBRARY}") + set_property(TARGET SDL2::MainInternal PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::Core) + + add_library(SDL2::Main INTERFACE IMPORTED) + + if(MINGW) + # MinGW needs an additional link flag '-mwindows' and link to mingw32 + set_property(TARGET SDL2::Main PROPERTY + INTERFACE_LINK_LIBRARIES "mingw32" "-mwindows") + endif() + + set_property(TARGET SDL2::Main APPEND PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::MainInternal) + endif() + + endif() +endif() diff --git a/cmake/FindSDL2_image.cmake b/cmake/FindSDL2_image.cmake new file mode 100644 index 0000000..624e915 --- /dev/null +++ b/cmake/FindSDL2_image.cmake @@ -0,0 +1,222 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# Copyright 2019 Amine Ben Hassouna +# Copyright 2000-2019 Kitware, Inc. and Contributors +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. + +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# * Neither the name of Kitware, Inc. nor the names of Contributors +# may be used to endorse or promote products derived from this +# software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindSDL2_image +-------------- + +Locate SDL2_image library + +This module defines the following 'IMPORTED' target: + +:: + + SDL2::Image + The SDL2_image library, if found. + Have SDL2::Core as a link dependency. + + + +This module will set the following variables in your project: + +:: + + SDL2_IMAGE_LIBRARIES, the name of the library to link against + SDL2_IMAGE_INCLUDE_DIRS, where to find the headers + SDL2_IMAGE_FOUND, if false, do not try to link against + SDL2_IMAGE_VERSION_STRING - human-readable string containing the + version of SDL2_image + + + +This module responds to the following cache variables: + +:: + + SDL2_IMAGE_PATH + Set a custom SDL2_image Library path (default: empty) + + SDL2_IMAGE_NO_DEFAULT_PATH + Disable search SDL2_image Library in default path. + If SDL2_IMAGE_PATH (default: ON) + Else (default: OFF) + + SDL2_IMAGE_INCLUDE_DIR + SDL2_image headers path. + + SDL2_IMAGE_LIBRARY + SDL2_image Library (.dll, .so, .a, etc) path. + + +Additional Note: If you see an empty SDL2_IMAGE_LIBRARY in your project +configuration, it means CMake did not find your SDL2_image library +(SDL2_image.dll, libsdl2_image.so, etc). Set SDL2_IMAGE_LIBRARY to point +to your SDL2_image library, and configure again. This value is used to +generate the final SDL2_IMAGE_LIBRARIES variable and the SDL2::Image target, +but when this value is unset, SDL2_IMAGE_LIBRARIES and SDL2::Image does not +get created. + + +$SDL2IMAGEDIR is an environment variable that would correspond to the +./configure --prefix=$SDL2IMAGEDIR used in building SDL2_image. + +$SDL2DIR is an environment variable that would correspond to the +./configure --prefix=$SDL2DIR used in building SDL2. + + + +Created by Amine Ben Hassouna: + Adapt FindSDL_image.cmake to SDL2_image (FindSDL2_image.cmake). + Add cache variables for more flexibility: + SDL2_IMAGE_PATH, SDL2_IMAGE_NO_DEFAULT_PATH (for details, see doc above). + Add SDL2 as a required dependency. + Modernize the FindSDL2_image.cmake module by creating a specific target: + SDL2::Image (for details, see doc above). + +Original FindSDL_image.cmake module: + Created by Eric Wing. This was influenced by the FindSDL.cmake + module, but with modifications to recognize OS X frameworks and + additional Unix paths (FreeBSD, etc). +#]=======================================================================] + +# SDL2 Library required +find_package(SDL2 QUIET) +if(NOT SDL2_FOUND) + set(SDL2_IMAGE_SDL2_NOT_FOUND "Could NOT find SDL2 (SDL2 is required by SDL2_image).") + if(SDL2_image_FIND_REQUIRED) + message(FATAL_ERROR ${SDL2_IMAGE_SDL2_NOT_FOUND}) + else() + if(NOT SDL2_image_FIND_QUIETLY) + message(STATUS ${SDL2_IMAGE_SDL2_NOT_FOUND}) + endif() + return() + endif() + unset(SDL2_IMAGE_SDL2_NOT_FOUND) +endif() + + +# Define options for searching SDL2_image Library in a custom path + +set(SDL2_IMAGE_PATH "" CACHE STRING "Custom SDL2_image Library path") + +set(_SDL2_IMAGE_NO_DEFAULT_PATH OFF) +if(SDL2_IMAGE_PATH) + set(_SDL2_IMAGE_NO_DEFAULT_PATH ON) +endif() + +set(SDL2_IMAGE_NO_DEFAULT_PATH ${_SDL2_IMAGE_NO_DEFAULT_PATH} + CACHE BOOL "Disable search SDL2_image Library in default path") +unset(_SDL2_IMAGE_NO_DEFAULT_PATH) + +set(SDL2_IMAGE_NO_DEFAULT_PATH_CMD) +if(SDL2_IMAGE_NO_DEFAULT_PATH) + set(SDL2_IMAGE_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH) +endif() + +# Search for the SDL2_image include directory +find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h + HINTS + ENV SDL2IMAGEDIR + ENV SDL2DIR + ${SDL2_IMAGE_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + # and ENV{SDL2IMAGEDIR} + include/SDL2 include + PATHS ${SDL2_IMAGE_PATH} + DOC "Where the SDL2_image headers can be found" +) + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(VC_LIB_PATH_SUFFIX lib/x64) +else() + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() + +# Search for the SDL2_image library +find_library(SDL2_IMAGE_LIBRARY + NAMES SDL2_image + HINTS + ENV SDL2IMAGEDIR + ENV SDL2DIR + ${SDL2_IMAGE_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2_IMAGE_PATH} + DOC "Where the SDL2_image Library can be found" +) + +# Read SDL2_image version +if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}") + set(SDL2_IMAGE_VERSION_STRING ${SDL2_IMAGE_VERSION_MAJOR}.${SDL2_IMAGE_VERSION_MINOR}.${SDL2_IMAGE_VERSION_PATCH}) + unset(SDL2_IMAGE_VERSION_MAJOR_LINE) + unset(SDL2_IMAGE_VERSION_MINOR_LINE) + unset(SDL2_IMAGE_VERSION_PATCH_LINE) + unset(SDL2_IMAGE_VERSION_MAJOR) + unset(SDL2_IMAGE_VERSION_MINOR) + unset(SDL2_IMAGE_VERSION_PATCH) +endif() + +set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY}) +set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image + REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS + VERSION_VAR SDL2_IMAGE_VERSION_STRING) + + +mark_as_advanced(SDL2_IMAGE_PATH + SDL2_IMAGE_NO_DEFAULT_PATH + SDL2_IMAGE_LIBRARY + SDL2_IMAGE_INCLUDE_DIR) + + +if(SDL2_IMAGE_FOUND) + + # SDL2::Image target + if(SDL2_IMAGE_LIBRARY AND NOT TARGET SDL2::Image) + add_library(SDL2::Image UNKNOWN IMPORTED) + set_target_properties(SDL2::Image PROPERTIES + IMPORTED_LOCATION "${SDL2_IMAGE_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_IMAGE_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES SDL2::Core) + endif() +endif() diff --git a/cmake/FindSDL2_mixer.cmake b/cmake/FindSDL2_mixer.cmake new file mode 100644 index 0000000..a71f26a --- /dev/null +++ b/cmake/FindSDL2_mixer.cmake @@ -0,0 +1,220 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# Copyright 2019 Amine Ben Hassouna +# Copyright 2000-2019 Kitware, Inc. and Contributors +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. + +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# * Neither the name of Kitware, Inc. nor the names of Contributors +# may be used to endorse or promote products derived from this +# software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindSDL2_mixer +-------------- + +Locate SDL2_mixer library + +This module defines the following 'IMPORTED' target: + +:: + + SDL2::Mixer + The SDL2_mixer library, if found. + Have SDL2::Core as a link dependency. + + + +This module will set the following variables in your project: + +:: + + SDL2_MIXER_LIBRARIES, the name of the library to link against + SDL2_MIXER_INCLUDE_DIRS, where to find the headers + SDL2_MIXER_FOUND, if false, do not try to link against + SDL2_MIXER_VERSION_STRING - human-readable string containing the + version of SDL2_mixer + +This module responds to the following cache variables: + +:: + + SDL2_MIXER_PATH + Set a custom SDL2_mixer Library path (default: empty) + + SDL2_MIXER_NO_DEFAULT_PATH + Disable search SDL2_mixer Library in default path. + If SDL2_MIXER_PATH (default: ON) + Else (default: OFF) + + SDL2_MIXER_INCLUDE_DIR + SDL2_mixer headers path. + + SDL2_MIXER_LIBRARY + SDL2_mixer Library (.dll, .so, .a, etc) path. + + +Additional Note: If you see an empty SDL2_MIXER_LIBRARY in your project +configuration, it means CMake did not find your SDL2_mixer library +(SDL2_mixer.dll, libsdl2_mixer.so, etc). Set SDL2_MIXER_LIBRARY to point +to your SDL2_mixer library, and configure again. This value is used to +generate the final SDL2_MIXER_LIBRARIES variable and the SDL2::Mixer target, +but when this value is unset, SDL2_MIXER_LIBRARIES and SDL2::Mixer does not +get created. + + +$SDL2MIXERDIR is an environment variable that would correspond to the +./configure --prefix=$SDL2MIXERDIR used in building SDL2_mixer. + +$SDL2DIR is an environment variable that would correspond to the +./configure --prefix=$SDL2DIR used in building SDL2. + + + +Created by Amine Ben Hassouna: + Adapt FindSDL_mixer.cmake to SDL2_mixer (FindSDL2_mixer.cmake). + Add cache variables for more flexibility: + SDL2_MIXER_PATH, SDL2_MIXER_NO_DEFAULT_PATH (for details, see doc above). + Add SDL2 as a required dependency. + Modernize the FindSDL2_mixer.cmake module by creating a specific target: + SDL2::Mixer (for details, see doc above). + +Original FindSDL_mixer.cmake module: + Created by Eric Wing. This was influenced by the FindSDL.cmake + module, but with modifications to recognize OS X frameworks and + additional Unix paths (FreeBSD, etc). +#]=======================================================================] + +# SDL2 Library required +find_package(SDL2 QUIET) +if(NOT SDL2_FOUND) + set(SDL2_MIXER_SDL2_NOT_FOUND "Could NOT find SDL2 (SDL2 is required by SDL2_mixer).") + if(SDL2_mixer_FIND_REQUIRED) + message(FATAL_ERROR ${SDL2_MIXER_SDL2_NOT_FOUND}) + else() + if(NOT SDL2_mixer_FIND_QUIETLY) + message(STATUS ${SDL2_MIXER_SDL2_NOT_FOUND}) + endif() + return() + endif() + unset(SDL2_MIXER_SDL2_NOT_FOUND) +endif() + + +# Define options for searching SDL2_mixer Library in a custom path + +set(SDL2_MIXER_PATH "" CACHE STRING "Custom SDL2_mixer Library path") + +set(_SDL2_MIXER_NO_DEFAULT_PATH OFF) +if(SDL2_MIXER_PATH) + set(_SDL2_MIXER_NO_DEFAULT_PATH ON) +endif() + +set(SDL2_MIXER_NO_DEFAULT_PATH ${_SDL2_MIXER_NO_DEFAULT_PATH} + CACHE BOOL "Disable search SDL2_mixer Library in default path") +unset(_SDL2_MIXER_NO_DEFAULT_PATH) + +set(SDL2_MIXER_NO_DEFAULT_PATH_CMD) +if(SDL2_MIXER_NO_DEFAULT_PATH) + set(SDL2_MIXER_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH) +endif() + +# Search for the SDL2_mixer include directory +find_path(SDL2_MIXER_INCLUDE_DIR SDL_mixer.h + HINTS + ENV SDL2MIXERDIR + ENV SDL2DIR + ${SDL2_MIXER_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + # and ENV{SDL2MIXERDIR} + include/SDL2 include + PATHS ${SDL2_MIXER_PATH} + DOC "Where the SDL2_mixer headers can be found" +) + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(VC_LIB_PATH_SUFFIX lib/x64) +else() + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() + +# Search for the SDL2_mixer library +find_library(SDL2_MIXER_LIBRARY + NAMES SDL2_mixer + HINTS + ENV SDL2MIXERDIR + ENV SDL2DIR + ${SDL2_MIXER_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2_MIXER_PATH} + DOC "Where the SDL2_mixer Library can be found" +) + +# Read SDL2_mixer version +if(SDL2_MIXER_INCLUDE_DIR AND EXISTS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MAJOR "${SDL2_MIXER_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MINOR "${SDL2_MIXER_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_PATCH "${SDL2_MIXER_VERSION_PATCH_LINE}") + set(SDL2_MIXER_VERSION_STRING ${SDL2_MIXER_VERSION_MAJOR}.${SDL2_MIXER_VERSION_MINOR}.${SDL2_MIXER_VERSION_PATCH}) + unset(SDL2_MIXER_VERSION_MAJOR_LINE) + unset(SDL2_MIXER_VERSION_MINOR_LINE) + unset(SDL2_MIXER_VERSION_PATCH_LINE) + unset(SDL2_MIXER_VERSION_MAJOR) + unset(SDL2_MIXER_VERSION_MINOR) + unset(SDL2_MIXER_VERSION_PATCH) +endif() + +set(SDL2_MIXER_LIBRARIES ${SDL2_MIXER_LIBRARY}) +set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_MIXER_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_mixer + REQUIRED_VARS SDL2_MIXER_LIBRARIES SDL2_MIXER_INCLUDE_DIRS + VERSION_VAR SDL2_MIXER_VERSION_STRING) + + +mark_as_advanced(SDL2_MIXER_PATH + SDL2_MIXER_NO_DEFAULT_PATH + SDL2_MIXER_LIBRARY + SDL2_MIXER_INCLUDE_DIR) + + +if(SDL2_MIXER_FOUND) + + # SDL2::Mixer target + if(SDL2_MIXER_LIBRARY AND NOT TARGET SDL2::Mixer) + add_library(SDL2::Mixer UNKNOWN IMPORTED) + set_target_properties(SDL2::Mixer PROPERTIES + IMPORTED_LOCATION "${SDL2_MIXER_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_MIXER_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES SDL2::Core) + endif() +endif() diff --git a/cmake/FindSDL2_net.cmake b/cmake/FindSDL2_net.cmake new file mode 100644 index 0000000..74c765b --- /dev/null +++ b/cmake/FindSDL2_net.cmake @@ -0,0 +1,222 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# Copyright 2019 Amine Ben Hassouna +# Copyright 2000-2019 Kitware, Inc. and Contributors +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. + +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# * Neither the name of Kitware, Inc. nor the names of Contributors +# may be used to endorse or promote products derived from this +# software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindSDL2_net +------------ + +Locate SDL2_net library + +This module defines the following 'IMPORTED' target: + +:: + + SDL2::Net + The SDL2_net library, if found. + Have SDL2::Core as a link dependency. + + + +This module will set the following variables in your project: + +:: + + SDL2_NET_LIBRARIES, the name of the library to link against + SDL2_NET_INCLUDE_DIRS, where to find the headers + SDL2_NET_FOUND, if false, do not try to link against + SDL2_NET_VERSION_STRING - human-readable string containing the + version of SDL2_net + + + +This module responds to the following cache variables: + +:: + + SDL2_NET_PATH + Set a custom SDL2_net Library path (default: empty) + + SDL2_NET_NO_DEFAULT_PATH + Disable search SDL2_net Library in default path. + If SDL2_NET_PATH (default: ON) + Else (default: OFF) + + SDL2_NET_INCLUDE_DIR + SDL2_net headers path. + + SDL2_NET_LIBRARY + SDL2_net Library (.dll, .so, .a, etc) path. + + +Additional Note: If you see an empty SDL2_NET_LIBRARY in your project +configuration, it means CMake did not find your SDL2_net library +(SDL2_net.dll, libsdl2_net.so, etc). Set SDL2_NET_LIBRARY to point +to your SDL2_net library, and configure again. This value is used to +generate the final SDL2_NET_LIBRARIES variable and the SDL2::Net target, +but when this value is unset, SDL2_NET_LIBRARIES and SDL2::Net does not +get created. + + +$SDL2NETDIR is an environment variable that would correspond to the +./configure --prefix=$SDL2NETDIR used in building SDL2_net. + +$SDL2DIR is an environment variable that would correspond to the +./configure --prefix=$SDL2DIR used in building SDL2. + + + +Created by Amine Ben Hassouna: + Adapt FindSDL_net.cmake to SDL2_net (FindSDL2_net.cmake). + Add cache variables for more flexibility: + SDL2_NET_PATH, SDL2_NET_NO_DEFAULT_PATH (for details, see doc above). + Add SDL2 as a required dependency. + Modernize the FindSDL2_net.cmake module by creating a specific target: + SDL2::Net (for details, see doc above). + +Original FindSDL_net.cmake module: + Created by Eric Wing. This was influenced by the FindSDL.cmake + module, but with modifications to recognize OS X frameworks and + additional Unix paths (FreeBSD, etc). +#]=======================================================================] + +# SDL2 Library required +find_package(SDL2 QUIET) +if(NOT SDL2_FOUND) + set(SDL2_NET_SDL2_NOT_FOUND "Could NOT find SDL2 (SDL2 is required by SDL2_net).") + if(SDL2_net_FIND_REQUIRED) + message(FATAL_ERROR ${SDL2_NET_SDL2_NOT_FOUND}) + else() + if(NOT SDL2_net_FIND_QUIETLY) + message(STATUS ${SDL2_NET_SDL2_NOT_FOUND}) + endif() + return() + endif() + unset(SDL2_NET_SDL2_NOT_FOUND) +endif() + + +# Define options for searching SDL2_net Library in a custom path + +set(SDL2_NET_PATH "" CACHE STRING "Custom SDL2_net Library path") + +set(_SDL2_NET_NO_DEFAULT_PATH OFF) +if(SDL2_NET_PATH) + set(_SDL2_NET_NO_DEFAULT_PATH ON) +endif() + +set(SDL2_NET_NO_DEFAULT_PATH ${_SDL2_NET_NO_DEFAULT_PATH} + CACHE BOOL "Disable search SDL2_net Library in default path") +unset(_SDL2_NET_NO_DEFAULT_PATH) + +set(SDL2_NET_NO_DEFAULT_PATH_CMD) +if(SDL2_NET_NO_DEFAULT_PATH) + set(SDL2_NET_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH) +endif() + +# Search for the SDL2_net include directory +find_path(SDL2_NET_INCLUDE_DIR SDL_net.h + HINTS + ENV SDL2NETDIR + ENV SDL2DIR + ${SDL2_NET_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + # and ENV{SDL2NETDIR} + include/SDL2 include + PATHS ${SDL2_NET_PATH} + DOC "Where the SDL2_net headers can be found" +) + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(VC_LIB_PATH_SUFFIX lib/x64) +else() + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() + +# Search for the SDL2_net library +find_library(SDL2_NET_LIBRARY + NAMES SDL2_net + HINTS + ENV SDL2NETDIR + ENV SDL2DIR + ${SDL2_NET_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2_NET_PATH} + DOC "Where the SDL2_net Library can be found" +) + +# Read SDL2_net version +if(SDL2_NET_INCLUDE_DIR AND EXISTS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_NET_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_NET_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_NET_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MAJOR "${SDL2_NET_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MINOR "${SDL2_NET_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_PATCH "${SDL2_NET_VERSION_PATCH_LINE}") + set(SDL2_NET_VERSION_STRING ${SDL2_NET_VERSION_MAJOR}.${SDL2_NET_VERSION_MINOR}.${SDL2_NET_VERSION_PATCH}) + unset(SDL2_NET_VERSION_MAJOR_LINE) + unset(SDL2_NET_VERSION_MINOR_LINE) + unset(SDL2_NET_VERSION_PATCH_LINE) + unset(SDL2_NET_VERSION_MAJOR) + unset(SDL2_NET_VERSION_MINOR) + unset(SDL2_NET_VERSION_PATCH) +endif() + +set(SDL2_NET_LIBRARIES ${SDL2_NET_LIBRARY}) +set(SDL2_NET_INCLUDE_DIRS ${SDL2_NET_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_net + REQUIRED_VARS SDL2_NET_LIBRARIES SDL2_NET_INCLUDE_DIRS + VERSION_VAR SDL2_NET_VERSION_STRING) + + +mark_as_advanced(SDL2_NET_PATH + SDL2_NET_NO_DEFAULT_PATH + SDL2_NET_LIBRARY + SDL2_NET_INCLUDE_DIR) + + +if(SDL2_NET_FOUND) + + # SDL2::Net target + if(SDL2_NET_LIBRARY AND NOT TARGET SDL2::Net) + add_library(SDL2::Net UNKNOWN IMPORTED) + set_target_properties(SDL2::Net PROPERTIES + IMPORTED_LOCATION "${SDL2_NET_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_NET_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES SDL2::Core) + endif() +endif() diff --git a/cmake/FindVorbis.cmake b/cmake/FindVorbis.cmake new file mode 100644 index 0000000..e50ba19 --- /dev/null +++ b/cmake/FindVorbis.cmake @@ -0,0 +1,76 @@ +# - Find vorbis library +# Find the native Vorbis headers and libraries.Vorbis depends on Ogg and will +# provide Ogg headers/libraries as well. +# +# VORBIS_INCLUDE_DIRS - where to find vorbis/vorbis.h, ogg/ogg.h, etc +# VORBIS_LIBRARIES - List of libraries when using libvorbis +# VORBIS_FOUND - True if vorbis is found. + + +#============================================================================= +#Copyright 2000-2009 Kitware, Inc., Insight Software Consortium +#All rights reserved. +# +#Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +#* Redistributions of source code must retain the above copyright notice, +#this list of conditions and the following disclaimer. +# +#* Redistributions in binary form must reproduce the above copyright notice, +#this list of conditions and the following disclaimer in the documentation +#and/or other materials provided with the distribution. +# +#* Neither the names of Kitware, Inc., the Insight Software Consortium, nor +#the names of their contributors may be used to endorse or promote products +#derived from this software without specific prior written permission. +# +#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +#IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +#ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +#LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +#CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +#SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +#INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +#CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +#ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#POSSIBILITY OF SUCH DAMAGE. +#============================================================================= + +# Find Ogg +if( Vorbis_FIND_REQUIRED ) + set( OGG_ARG "REQUIRED" ) +elseif( Vorbis_FIND_QUIETLY ) + set( OGG_ARG "QUIETLY" ) +endif() + +find_package( Ogg ${OGG_ARG} ) + +# Look for the vorbisfile header file. +find_path( VORBIS_INCLUDE_DIR + NAMES vorbis/vorbisfile.h + DOC "Vorbis include directory" ) +mark_as_advanced( VORBIS_INCLUDE_DIR ) + +# Look for the vorbisfile library. +find_library( VORBISFILE_LIBRARY + NAMES vorbisfile + DOC "Path to VorbisFile library" ) +mark_as_advanced( VORBISFILE_LIBRARY ) + +# Look for the vorbis library. +find_library( VORBIS_LIBRARY + NAMES vorbis + DOC "Path to Vorbis library" ) +mark_as_advanced( VORBIS_LIBRARY ) + + + +# handle the QUIETLY and REQUIRED arguments and set VORBISFILE_FOUND to TRUE if +# all listed variables are TRUE +include( ${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake ) +FIND_PACKAGE_HANDLE_STANDARD_ARGS( Vorbis DEFAULT_MSG VORBIS_LIBRARY VORBIS_INCLUDE_DIR ) + +set( VORBIS_LIBRARIES ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY} ${OGG_LIBRARIES} ) +set( VORBIS_INCLUDE_DIRS ${VORBIS_INCLUDE_DIR} ${OGG_INCLUDE_DIRS} ) diff --git a/cmake/TargetArch.cmake b/cmake/TargetArch.cmake new file mode 100644 index 0000000..198aa9c --- /dev/null +++ b/cmake/TargetArch.cmake @@ -0,0 +1,157 @@ + +# Copyright (c) 2012 Petroules Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation and/or +# other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. + +# Based on the Qt 5 processor detection code, so should be very accurate +# https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/global/qprocessordetection.h +# Currently handles arm (v5, v6, v7), x86 (32/64), ia64, and ppc (32/64) + +# Regarding POWER/PowerPC, just as is noted in the Qt source, +# "There are many more known variants/revisions that we do not handle/detect." + +set(archdetect_c_code " +#if defined(__arm__) || defined(__TARGET_ARCH_ARM) + #if defined(__ARM_ARCH_7__) \\ + || defined(__ARM_ARCH_7A__) \\ + || defined(__ARM_ARCH_7R__) \\ + || defined(__ARM_ARCH_7M__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7) + #error cmake_ARCH armv7 + #elif defined(__ARM_ARCH_6__) \\ + || defined(__ARM_ARCH_6J__) \\ + || defined(__ARM_ARCH_6T2__) \\ + || defined(__ARM_ARCH_6Z__) \\ + || defined(__ARM_ARCH_6K__) \\ + || defined(__ARM_ARCH_6ZK__) \\ + || defined(__ARM_ARCH_6M__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 6) + #error cmake_ARCH armv6 + #elif defined(__ARM_ARCH_5TEJ__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5) + #error cmake_ARCH armv5 + #else + #error cmake_ARCH arm + #endif +#elif defined(__i386) || defined(__i386__) || defined(_M_IX86) + #error cmake_ARCH i386 +#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) + #error cmake_ARCH x86_64 +#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64) + #error cmake_ARCH ia64 +#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\ + || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\ + || defined(_M_MPPC) || defined(_M_PPC) + #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) + #error cmake_ARCH ppc64 + #else + #error cmake_ARCH ppc + #endif +#endif + +#error cmake_ARCH unknown +") + +# Set ppc_support to TRUE before including this file or ppc and ppc64 +# will be treated as invalid architectures since they are no longer supported by Apple + +function(target_architecture output_var) + if(APPLE AND CMAKE_OSX_ARCHITECTURES) + # On OS X we use CMAKE_OSX_ARCHITECTURES *if* it was set + # First let's normalize the order of the values + + # Note that it's not possible to compile PowerPC applications if you are using + # the OS X SDK version 10.6 or later - you'll need 10.4/10.5 for that, so we + # disable it by default + # See this page for more information: + # http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4 + + # Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime. + # On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise. + + foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES}) + if("${osx_arch}" STREQUAL "ppc" AND ppc_support) + set(osx_arch_ppc TRUE) + elseif("${osx_arch}" STREQUAL "i386") + set(osx_arch_i386 TRUE) + elseif("${osx_arch}" STREQUAL "x86_64") + set(osx_arch_x86_64 TRUE) + elseif("${osx_arch}" STREQUAL "ppc64" AND ppc_support) + set(osx_arch_ppc64 TRUE) + else() + message(FATAL_ERROR "Invalid OS X arch name: ${osx_arch}") + endif() + endforeach() + + # Now add all the architectures in our normalized order + if(osx_arch_ppc) + list(APPEND ARCH ppc) + endif() + + if(osx_arch_i386) + list(APPEND ARCH i386) + endif() + + if(osx_arch_x86_64) + list(APPEND ARCH x86_64) + endif() + + if(osx_arch_ppc64) + list(APPEND ARCH ppc64) + endif() + else() + file(WRITE "${CMAKE_BINARY_DIR}/arch.c" "${archdetect_c_code}") + + enable_language(C) + + # Detect the architecture in a rather creative way... + # This compiles a small C program which is a series of ifdefs that selects a + # particular #error preprocessor directive whose message string contains the + # target architecture. The program will always fail to compile (both because + # file is not a valid C program, and obviously because of the presence of the + # #error preprocessor directives... but by exploiting the preprocessor in this + # way, we can detect the correct target architecture even when cross-compiling, + # since the program itself never needs to be run (only the compiler/preprocessor) + try_run( + run_result_unused + compile_result_unused + "${CMAKE_BINARY_DIR}" + "${CMAKE_BINARY_DIR}/arch.c" + COMPILE_OUTPUT_VARIABLE ARCH + CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} + ) + + # Parse the architecture name from the compiler output + string(REGEX MATCH "cmake_ARCH ([a-zA-Z0-9_]+)" ARCH "${ARCH}") + + # Get rid of the value marker leaving just the architecture name + string(REPLACE "cmake_ARCH " "" ARCH "${ARCH}") + + # If we are compiling with an unknown architecture this variable should + # already be set to "unknown" but in the case that it's empty (i.e. due + # to a typo in the code), then set it to unknown + if (NOT ARCH) + set(ARCH unknown) + endif() + endif() + + set(${output_var} "${ARCH}" PARENT_SCOPE) +endfunction() diff --git a/cmake/config.h.cin b/cmake/config.h.cin new file mode 100644 index 0000000..e58aaec --- /dev/null +++ b/cmake/config.h.cin @@ -0,0 +1,47 @@ +#cmakedefine PACKAGE_NAME "@PACKAGE_NAME@" +#cmakedefine PACKAGE_TARNAME "@PACKAGE_TARNAME@" +#cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" +#cmakedefine PACKAGE_HOMEPAGE "@PACKAGE_HOMEPAGE@" +#cmakedefine PACKAGE_STRING "@PACKAGE_STRING@" + +#cmakedefine DOOMWADDIR "@DOOMWADDIR@" +#cmakedefine PRBOOMDATADIR "@PRBOOMDATADIR@" + +#cmakedefine WORDS_BIGENDIAN + +#cmakedefine HAVE_GETOPT +#cmakedefine HAVE_MMAP +#cmakedefine HAVE_CREATE_FILE_MAPPING +#cmakedefine HAVE_SCHED_SETAFFINITY +#cmakedefine HAVE_USLEEP +#cmakedefine HAVE_STRSIGNAL +#cmakedefine HAVE_MKSTEMP + +#cmakedefine HAVE_SYS_WAIT_H +#cmakedefine HAVE_UNISTD_H +#cmakedefine HAVE_ASM_BYTEORDER_H +#cmakedefine HAVE_DIRENT_H + +#cmakedefine HAVE_SDL_JOYSTICKGETAXIS +#cmakedefine HAVE_LIBSDL2_IMAGE +#cmakedefine HAVE_LIBSDL2_MIXER +#cmakedefine HAVE_NET +#cmakedefine USE_SDL_NET + +#cmakedefine HAVE_LIBPCREPOSIX +#cmakedefine HAVE_LIBZ +#cmakedefine HAVE_LIBMAD +#cmakedefine HAVE_LIBFLUIDSYNTH +#cmakedefine HAVE_LIBDUMB +#cmakedefine HAVE_LIBVORBISFILE +#cmakedefine HAVE_LIBPORTMIDI +#cmakedefine HAVE_ALSA + +#cmakedefine SIMPLECHECKS +#cmakedefine ZONEIDCHECK + +#cmakedefine RANGECHECK +#cmakedefine INSTRUMENTED +#cmakedefine TIMEDIAG +#cmakedefine HEAPCHECK +#cmakedefine HEAPDUMP diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt new file mode 100644 index 0000000..9d7c669 --- /dev/null +++ b/data/CMakeLists.txt @@ -0,0 +1,370 @@ +# PrBoom-Plus WAD creation tool + +if(NOT CMAKE_CROSSCOMPILING) + add_executable(rdatawad + rd_main.c + rd_util.c + rd_util.h + rd_output.c + rd_output.h + rd_sound.c + rd_sound.h + rd_palette.c + rd_palette.h + rd_graphic.c + rd_graphic.h + ) + target_include_directories(rdatawad PRIVATE ${CMAKE_BINARY_DIR}) + + set(CROSS_EXPORTS ${CROSS_EXPORTS} rdatawad PARENT_SCOPE) +endif() + +# PrBoom-Plus internal WAD + +set(PALETTE + palette.rgb +) + +set(LUMPS + lumps/switches.lmp + lumps/animated.lmp + lumps/crbrick.lmp + lumps/crtan.lmp + lumps/crgray.lmp + lumps/crgreen.lmp + lumps/crbrown.lmp + lumps/crgold.lmp + lumps/crred.lmp + lumps/crblue.lmp + lumps/crblue2.lmp + lumps/crorange.lmp + lumps/cryellow.lmp + lumps/crblack.lmp + lumps/crpurple.lmp + lumps/crwhite.lmp +) + +set(COLORMAPS + lumps/watermap.lmp +) + +set(TABLES + lumps/sinetabl.lmp + lumps/tangtabl.lmp + lumps/tantoang.lmp + lumps/gammatbl.lmp + lumps/chexdeh.lmp + lumps/bfgbex.lmp + lumps/nervebex.lmp + lumps/glshadow.lmp + lumps/glfp.lmp + lumps/glvp.lmp + lumps/-prbhud-.lmp + lumps/m_ammo.lmp + lumps/m_armour.lmp + lumps/m_arrow.lmp + lumps/m_health.lmp + lumps/m_key.lmp + lumps/m_normal.lmp + lumps/m_shadow.lmp + lumps/m_power.lmp + lumps/m_weap.lmp + lumps/m_mark.lmp +) + +set(SOUNDS + sounds/dsdgsit.wav + sounds/dsdgatk.wav + sounds/dsdgact.wav + sounds/dsdgdth.wav + sounds/dsdgpain.wav +) + +set(GRAPHICS + graphics/dig0.ppm + graphics/dig1.ppm + graphics/dig2.ppm + graphics/dig3.ppm + graphics/dig4.ppm + graphics/dig5.ppm + graphics/dig6.ppm + graphics/dig7.ppm + graphics/dig8.ppm + graphics/dig9.ppm + graphics/diga.ppm + graphics/digb.ppm + graphics/digc.ppm + graphics/digd.ppm + graphics/dige.ppm + graphics/digf.ppm + graphics/digg.ppm + graphics/digh.ppm + graphics/digi.ppm + graphics/digj.ppm + graphics/digk.ppm + graphics/digl.ppm + graphics/digm.ppm + graphics/dign.ppm + graphics/digo.ppm + graphics/digp.ppm + graphics/digq.ppm + graphics/digr.ppm + graphics/digs.ppm + graphics/digt.ppm + graphics/digu.ppm + graphics/digv.ppm + graphics/digw.ppm + graphics/digx.ppm + graphics/digy.ppm + graphics/digz.ppm + graphics/dig45.ppm + graphics/dig46.ppm + graphics/dig47.ppm + graphics/dig58.ppm + graphics/dig91.ppm + graphics/dig93.ppm + graphics/stbr123.ppm + graphics/stbr124.ppm + graphics/stbr125.ppm + graphics/stbr126.ppm + graphics/stbr127.ppm + graphics/boxul.ppm + graphics/boxuc.ppm + graphics/boxur.ppm + graphics/boxcl.ppm + graphics/boxcc.ppm + graphics/boxcr.ppm + graphics/boxll.ppm + graphics/boxlc.ppm + graphics/boxlr.ppm + graphics/stkeys6.ppm + graphics/stkeys7.ppm + graphics/stkeys8.ppm + graphics/stcfn096.ppm + graphics/m_butt1.ppm + graphics/m_butt2.ppm + graphics/m_colors.ppm + graphics/m_palno.ppm + graphics/m_palsel.ppm + graphics/m_vbox.ppm + graphics/cross1.ppm + graphics/cross2.ppm + graphics/cross3.ppm +) + +set(FLATS + flats/-n0_tex-.ppm +) + +set(SPRITES + sprites/tnt1a0.ppm +) +set(SPRITEP "0,0,sprites/tnt1a0.ppm") + +set(SPRITES + ${SPRITES} + sprites/dogsa1.ppm + sprites/dogsa2.ppm + sprites/dogsa3.ppm + sprites/dogsa4.ppm + sprites/dogsa5.ppm + sprites/dogsa6.ppm + sprites/dogsa7.ppm + sprites/dogsa8.ppm + sprites/dogsb1.ppm + sprites/dogsb2.ppm + sprites/dogsb3.ppm + sprites/dogsb4.ppm + sprites/dogsb5.ppm + sprites/dogsb6.ppm + sprites/dogsb7.ppm + sprites/dogsb8.ppm + sprites/dogsc1.ppm + sprites/dogsc2.ppm + sprites/dogsc3.ppm + sprites/dogsc4.ppm + sprites/dogsc5.ppm + sprites/dogsc6.ppm + sprites/dogsc7.ppm + sprites/dogsc8.ppm + sprites/dogsd1.ppm + sprites/dogsd2.ppm + sprites/dogsd3.ppm + sprites/dogsd4.ppm + sprites/dogsd5.ppm + sprites/dogsd6.ppm + sprites/dogsd7.ppm + sprites/dogsd8.ppm + sprites/dogse1.ppm + sprites/dogse2.ppm + sprites/dogse3.ppm + sprites/dogse4.ppm + sprites/dogse5.ppm + sprites/dogse6.ppm + sprites/dogse7.ppm + sprites/dogse8.ppm + sprites/dogsf1.ppm + sprites/dogsf2.ppm + sprites/dogsf3.ppm + sprites/dogsf4.ppm + sprites/dogsf5.ppm + sprites/dogsf6.ppm + sprites/dogsf7.ppm + sprites/dogsf8.ppm + sprites/dogsg1.ppm + sprites/dogsg2.ppm + sprites/dogsg3.ppm + sprites/dogsg4.ppm + sprites/dogsg5.ppm + sprites/dogsg6.ppm + sprites/dogsg7.ppm + sprites/dogsg8.ppm + sprites/dogsh1.ppm + sprites/dogsh2.ppm + sprites/dogsh3.ppm + sprites/dogsh4.ppm + sprites/dogsh5.ppm + sprites/dogsh6.ppm + sprites/dogsh7.ppm + sprites/dogsh8.ppm + sprites/dogsi0.ppm + sprites/dogsj0.ppm + sprites/dogsk0.ppm + sprites/dogsl0.ppm + sprites/dogsm0.ppm + sprites/dogsn0.ppm +) +set(SPRITEP + ${SPRITEP} + "33,66,sprites/dogsa1.ppm" + "33,66,sprites/dogsa2.ppm" + "33,66,sprites/dogsa3.ppm" + "33,66,sprites/dogsa4.ppm" + "33,66,sprites/dogsa5.ppm" + "33,66,sprites/dogsa6.ppm" + "33,66,sprites/dogsa7.ppm" + "33,66,sprites/dogsa8.ppm" + "33,66,sprites/dogsb1.ppm" + "33,66,sprites/dogsb2.ppm" + "33,66,sprites/dogsb3.ppm" + "33,66,sprites/dogsb4.ppm" + "33,66,sprites/dogsb5.ppm" + "33,66,sprites/dogsb6.ppm" + "33,66,sprites/dogsb7.ppm" + "33,66,sprites/dogsb8.ppm" + "33,66,sprites/dogsc1.ppm" + "33,66,sprites/dogsc2.ppm" + "33,66,sprites/dogsc3.ppm" + "33,66,sprites/dogsc4.ppm" + "33,66,sprites/dogsc5.ppm" + "33,66,sprites/dogsc6.ppm" + "33,66,sprites/dogsc7.ppm" + "33,66,sprites/dogsc8.ppm" + "33,66,sprites/dogsd1.ppm" + "33,66,sprites/dogsd2.ppm" + "33,66,sprites/dogsd3.ppm" + "33,66,sprites/dogsd4.ppm" + "33,66,sprites/dogsd5.ppm" + "33,66,sprites/dogsd6.ppm" + "33,66,sprites/dogsd7.ppm" + "33,66,sprites/dogsd8.ppm" + "33,66,sprites/dogse1.ppm" + "33,66,sprites/dogse2.ppm" + "33,66,sprites/dogse3.ppm" + "33,66,sprites/dogse4.ppm" + "33,66,sprites/dogse5.ppm" + "33,66,sprites/dogse6.ppm" + "33,66,sprites/dogse7.ppm" + "33,66,sprites/dogse8.ppm" + "33,66,sprites/dogsf1.ppm" + "33,66,sprites/dogsf2.ppm" + "33,66,sprites/dogsf3.ppm" + "33,66,sprites/dogsf4.ppm" + "33,66,sprites/dogsf5.ppm" + "33,66,sprites/dogsf6.ppm" + "33,66,sprites/dogsf7.ppm" + "33,66,sprites/dogsf8.ppm" + "33,66,sprites/dogsg1.ppm" + "33,66,sprites/dogsg2.ppm" + "33,66,sprites/dogsg3.ppm" + "33,66,sprites/dogsg4.ppm" + "33,66,sprites/dogsg5.ppm" + "33,66,sprites/dogsg6.ppm" + "33,66,sprites/dogsg7.ppm" + "33,66,sprites/dogsg8.ppm" + "33,66,sprites/dogsh1.ppm" + "33,66,sprites/dogsh2.ppm" + "33,66,sprites/dogsh3.ppm" + "33,66,sprites/dogsh4.ppm" + "33,66,sprites/dogsh5.ppm" + "33,66,sprites/dogsh6.ppm" + "33,66,sprites/dogsh7.ppm" + "33,66,sprites/dogsh8.ppm" + "33,67,sprites/dogsi0.ppm" + "33,67,sprites/dogsj0.ppm" + "33,67,sprites/dogsk0.ppm" + "33,67,sprites/dogsl0.ppm" + "33,68,sprites/dogsm0.ppm" + "33,69,sprites/dogsn0.ppm" +) + +set(SPRITES + ${SPRITES} + sprites/pls1a0.ppm + sprites/pls1b0.ppm + sprites/pls1c0.ppm + sprites/pls1d0.ppm + sprites/pls1e0.ppm + sprites/pls1f0.ppm + sprites/pls1g0.ppm + sprites/pls2a0.ppm + sprites/pls2b0.ppm + sprites/pls2c0.ppm + sprites/pls2d0.ppm + sprites/pls2e0.ppm +) +set(SPRITEP + ${SPRITEP} + "9,11,sprites/pls1a0.ppm" + "8,11,sprites/pls1b0.ppm" + "9,11,sprites/pls1c0.ppm" + "8,11,sprites/pls1d0.ppm" + "16,27,sprites/pls1e0.ppm" + "16,27,sprites/pls1f0.ppm" + "18,27,sprites/pls1g0.ppm" + "9,11,sprites/pls2a0.ppm" + "8,13,sprites/pls2b0.ppm" + "11,18,sprites/pls2c0.ppm" + "16,27,sprites/pls2d0.ppm" + "18,27,sprites/pls2e0.ppm" +) + +set(WAD_SRC + ${PALETTE} + ${LUMPS} + ${COLORMAPS} + ${TABLES} + ${SOUNDS} + ${GRAPHICS} + ${FLATS} + ${SPRITES} +) + +set(WAD_CMDLINE + -palette ${PALETTE} + -lumps ${LUMPS} + -marker C_START -lumps ${COLORMAPS} -marker C_END + -marker B_START -lumps ${TABLES} -marker B_END + -sounds ${SOUNDS} + -graphics ${GRAPHICS} + -marker FF_START -flats ${FLATS} -marker FF_END + -marker SS_START -sprites ${SPRITEP} -marker SS_END +) + +add_custom_command( + OUTPUT "${WAD_DATA_PATH}" + COMMAND rdatawad -I "${CMAKE_CURRENT_SOURCE_DIR}" ${WAD_CMDLINE} -o "${WAD_DATA_PATH}" + DEPENDS rdatawad ${WAD_SRC} +) +add_custom_target(prboomwad DEPENDS ${WAD_DATA_PATH}) +install(FILES ${WAD_DATA_PATH} DESTINATION ${PRBOOMDATADIR} COMPONENT "PrBoom-Plus internal WAD") diff --git a/data/convert-icon b/data/convert-icon new file mode 100644 index 0000000..c651bc7 --- /dev/null +++ b/data/convert-icon @@ -0,0 +1,74 @@ +#!/usr/bin/python +# +# $Id: convert-icon 704 2006-10-18 00:51:11Z fraggle $ +# +# Copyright(C) 2005 Simon Howard +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# Converts images into C structures to be inserted in programs +# + +import sys +import os +import re + +try: + import Image +except ImportError: + print "WARNING: Could not update %s. Please install the Python Imaging library." % sys.argv[2] + sys.exit(0) + + +def convert_image(filename, output_filename): + + im = Image.open(filename).convert("RGB") + + outfile = open(output_filename, "w") + + size = im.size + + struct_name = os.path.basename(output_filename) + struct_name = re.sub(re.compile("\\..*$"), "", struct_name) + struct_name = re.sub(re.compile("\W"), "_", struct_name) + + outfile.write("static int %s_w = %i;\n" % (struct_name, size[0])) + outfile.write("static int %s_h = %i;\n" % (struct_name, size[1])) + + outfile.write("\n") + outfile.write("static unsigned char %s_data[] = {\n" % (struct_name)) + + elements_on_line = 0 + + outfile.write(" ") + + for y in range(size[1]): + for x in range(size[0]): + val = im.getpixel((x, y)) + outfile.write("0x%02x,0x%02x,0x%02x, " % val) + elements_on_line += 1 + + if elements_on_line >= 4: + elements_on_line = 0 + outfile.write("\n") + outfile.write(" ") + + outfile.write("\n") + outfile.write("};\n") + +convert_image(sys.argv[1], sys.argv[2]) + + diff --git a/data/flats/-n0_tex-.ppm b/data/flats/-n0_tex-.ppm new file mode 100644 index 0000000000000000000000000000000000000000..cb8f4ab9936be4efdf6ef71e0e0188b242b0c6bb GIT binary patch literal 12301 zcmeHFQL4i*4BK~4@y_trdXC-yGMm95gp>3&llMl3!zhYu$*#KlzU|ka{kr|$ZrkGv z&gJr0^ylF(y1cDj`+xS^RsNN~l0f}`l=O6M<*#R`I8^>hdb+mq*E3WcDt{$CU0eAh zLyy9q&Wx_Pi6y#?7Pi;H2^jDGGI+=S<{9=}ZhtI%{4OuY4xtaiRRO#+WAnrbSQ+P9 zch-HvVp!O~sFXM~(aIM-*cq>uI5g4fEBEKm;rXW|2HPyR|M$sFqxPRopz@zhEVsY% z&&_kzE#&Xl@HEfvVSa>JIO<^@{YG|qYw!{`FvBYF!M4k{J;w}J&tME?;6i2$a>PnOV#ef!zexKj-pLsJf(8ak`yc1qKM41U?wz z8dTs%a%%_&5-x#6bEtv`a7nnr2f!O}9jQh>%ridY!~JJ)SdvGC61#Dm@duq}RNOO* z!)RVCl-QZuz&o%KPQXFs*FeG~XuF;u4YY2|tc5v*wKn%{YyZ!FwaUNpR}!fIkCL9Q kt^D;26^F`SNl({S{(6RrL*=ier)w*JJwwI8^I!S-1Z#H;QUCw| literal 0 HcmV?d00001 diff --git a/data/graphics/boxcc.ppm b/data/graphics/boxcc.ppm new file mode 100644 index 0000000..44f6316 --- /dev/null +++ b/data/graphics/boxcc.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +C3?/3+?/C3?/3+?/C3?/C3?/?/3+?/3+C33+?/3+?/?/?/?/?/?/3+?/C3?/C3?/?/?/3+?/?/?/?/?/?/?/?/?/3+?/3+C33+?/3+?/?/C3?/C3?/3+?/C3?/3+?/C3 \ No newline at end of file diff --git a/data/graphics/boxcl.ppm b/data/graphics/boxcl.ppm new file mode 100644 index 0000000..f7b9a1a --- /dev/null +++ b/data/graphics/boxcl.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +#+7#C3C3C3?/C3#+# 7#C3K7C33+C3/7# 7#K7C3C3?/?/#+# 7#?/C3?/?/?//7# 7#C3C3?/3+?//77#C3?/C3?/?/#+# 7#C3C33+C33+/7# 7#C3C3C3?/3+ \ No newline at end of file diff --git a/data/graphics/boxcr.ppm b/data/graphics/boxcr.ppm new file mode 100644 index 0000000..e777dd5 --- /dev/null +++ b/data/graphics/boxcr.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +3+?/C3C3C37##+3+C33+C3C37## #+?/?/C3?/C37## /7C3C3K7K7C37## #+C3?/C3K7K77## /7?/?/C3C3K77#/7C33+C3K7C37## #+C3?/C3C3C37## /7 \ No newline at end of file diff --git a/data/graphics/boxlc.ppm b/data/graphics/boxlc.ppm new file mode 100644 index 0000000..cb67f18 --- /dev/null +++ b/data/graphics/boxlc.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +?/?/3+?/C3?/C3?/?/?/3+?/?/?/?/?/?/?/?/?/3+?/3+C33+?/3+?/?/C3?/C3?/3+?/C3?/3+?/C3/77?'/77?'/7/77?'7?'/7#+/7#+#+/7#+/7# # # # # # \ No newline at end of file diff --git a/data/graphics/boxll.ppm b/data/graphics/boxll.ppm new file mode 100644 index 0000000..fc5cdc4 --- /dev/null +++ b/data/graphics/boxll.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +#+# 7#?/C3?/?/?//7# 7#C3C3?/3+?//77#C3?/C3?/?/#+# 7#C3C33+C33+/7# 7#C3C3C3?/3+#+# #+7?'/7/77?'7?'/7#+#+#+#+/7#+/7#+# # # # # \ No newline at end of file diff --git a/data/graphics/boxlr.ppm b/data/graphics/boxlr.ppm new file mode 100644 index 0000000..6e399a9 --- /dev/null +++ b/data/graphics/boxlr.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +C3C3K7K7C37## #+C3?/C3K7K77## /7?/?/C3C3K77#/7C33+C3K7C37## #+C3?/C3C3C37## /7/77?'/77?'/7/7# #+/7#+/7#+/7#+#+/7# # # # # #+ \ No newline at end of file diff --git a/data/graphics/boxuc.ppm b/data/graphics/boxuc.ppm new file mode 100644 index 0000000..d298b2e --- /dev/null +++ b/data/graphics/boxuc.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +/7#+/7#+#+/7#+/7# # # # # # / / / / / / / / C3?/3+?/C3?/3+?/C3?/C3?/?/3+?/3+C33+?/3+?/?/?/?/?/?/3+?/C3?/C3?/?/?/3+?/?/?/?/?/ \ No newline at end of file diff --git a/data/graphics/boxul.ppm b/data/graphics/boxul.ppm new file mode 100644 index 0000000..1301b8d --- /dev/null +++ b/data/graphics/boxul.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +7?'#+#+#+#+/7#+/7#+# # # # # #+# / / / / / / #+7#C3C3C3?/C3#+# 7#C3K7C33+C3/7# 7#K7C3C3?/?/#+# 7#?/C3?/?/?//7# 7#C3C3?/3+?/ \ No newline at end of file diff --git a/data/graphics/boxur.ppm b/data/graphics/boxur.ppm new file mode 100644 index 0000000..15e0b7c --- /dev/null +++ b/data/graphics/boxur.ppm @@ -0,0 +1,4 @@ +P6 +8 8 +255 +/7#+/7#+/7#+#+7?'# # # # # #+/ / / / / / # #+3+?/C3C3C37##+3+C33+C3C37## #+?/?/C3?/C37## /7C3C3K7K7C37## #+C3?/C3K7K77## /7 \ No newline at end of file diff --git a/data/graphics/cross1.ppm b/data/graphics/cross1.ppm new file mode 100644 index 0000000000000000000000000000000000000000..673506c5847cd93dfc6ec8485059c90b724d098e GIT binary patch literal 242 zcmWGA<5E^|4svx2@ei_6aQE~LPzdnzRdCD9DM>9-2um$0&dkqKFw`^TvQV(#GBP#g pV$j!zp#2OCKm_N)8AOUhl)+7abKwkRTj0uof)E98>);F`#Q|lnEtCKN literal 0 HcmV?d00001 diff --git a/data/graphics/cross2.ppm b/data/graphics/cross2.ppm new file mode 100644 index 0000000000000000000000000000000000000000..7435aaa422061406d712c1bcd09ea364752bfe2b GIT binary patch literal 242 zcmWGA<5E^|4svx2@ei_6aQE~LPzdnzRdCD9DM>9-2um$0&dkqKFw`^TvQV(#GBP#g eV$j#88`{sn07uA{!Ucg0OmSop2pggv!Uh1=_$deg literal 0 HcmV?d00001 diff --git a/data/graphics/cross3.ppm b/data/graphics/cross3.ppm new file mode 100644 index 0000000000000000000000000000000000000000..db40ef14eaa7ac5c03b550ab6db979db61db0b42 GIT binary patch literal 242 zcmWGA<5E^|4svx2@ei_6aQE~LPzdnzRdCD9DM>9-2um$0&dkqKFw`^TvQV(#GBP#g XV$j#8F51t)07RH(;u6PHNs_5X40i!OjKig6KskfM^7h05N9~0ssI2 literal 0 HcmV?d00001 diff --git a/data/graphics/dig2.ppm b/data/graphics/dig2.ppm new file mode 100644 index 0000000000000000000000000000000000000000..044ccc08e815223d623532dc69c31000767b83b1 GIT binary patch literal 116 wcmWGA<1$q+=Q1)iQvhK=^g?9e8j%%4^)oO40MAMj AYXATM literal 0 HcmV?d00001 diff --git a/data/graphics/dig4.ppm b/data/graphics/dig4.ppm new file mode 100644 index 0000000000000000000000000000000000000000..e462df07114f7778a3d97a73ae0124a7e0d72980 GIT binary patch literal 116 zcmWGA<1$q+=Q1)i|CVjzqQ0QDUlw*UYD literal 0 HcmV?d00001 diff --git a/data/graphics/dig47.ppm b/data/graphics/dig47.ppm new file mode 100644 index 0000000000000000000000000000000000000000..a373e978ad61f04f15b5975eb18b30adab0be472 GIT binary patch literal 116 pcmWGA<1$q+=Q1)ia2x3D3SS6GT(}l@J)(bKOrWXJZ?hx7l literal 0 HcmV?d00001 diff --git a/data/graphics/dig93.ppm b/data/graphics/dig93.ppm new file mode 100644 index 0000000000000000000000000000000000000000..714c9ebebc485f07d4c9af4ccd87faac40104502 GIT binary patch literal 116 rcmWGA<1$q+=Q1)i_5X40i!NY~>MN$mb2{H`;9~ltZ literal 0 HcmV?d00001 diff --git a/data/graphics/diga.ppm b/data/graphics/diga.ppm new file mode 100644 index 0000000000000000000000000000000000000000..a7f5a43535c478b7911b8b770d63f61bc1a9df7e GIT binary patch literal 116 zcmWGA<1$q+=Q1)iy#5~ literal 0 HcmV?d00001 diff --git a/data/graphics/digb.ppm b/data/graphics/digb.ppm new file mode 100644 index 0000000000000000000000000000000000000000..e6ef5625d4be9a9b5d0104361865ad81d4fadeb8 GIT binary patch literal 116 vcmWGA<1$q+=Q1)iN#$lZ&huWGoT@0Buzf<^TWy literal 0 HcmV?d00001 diff --git a/data/graphics/digd.ppm b/data/graphics/digd.ppm new file mode 100644 index 0000000000000000000000000000000000000000..c57e815300ebcc8101a918ed08580a3ad818cd95 GIT binary patch literal 116 zcmWGA<1$q+=Q1)i;FA~ZC literal 0 HcmV?d00001 diff --git a/data/graphics/digf.ppm b/data/graphics/digf.ppm new file mode 100644 index 0000000000000000000000000000000000000000..58db7b66396e2cd2f0d0983ffafb696c60e26bc4 GIT binary patch literal 116 scmWGA<1$q+=Q1)ig&T95WOG+85jVU CxDtl| literal 0 HcmV?d00001 diff --git a/data/graphics/digi.ppm b/data/graphics/digi.ppm new file mode 100644 index 0000000000000000000000000000000000000000..0664d3a4e0f8807cb124f14344eec3f63138d3a7 GIT binary patch literal 116 scmWGA<1$q+=Q1)i#8 literal 0 HcmV?d00001 diff --git a/data/graphics/digl.ppm b/data/graphics/digl.ppm new file mode 100644 index 0000000000000000000000000000000000000000..ecc76465728675c17ca74f374b23c40d3ca9b7ee GIT binary patch literal 116 qcmWGA<1$q+=Q1)igz+eAaj5KVm<={ E01I&xCjbBd literal 0 HcmV?d00001 diff --git a/data/graphics/dign.ppm b/data/graphics/dign.ppm new file mode 100644 index 0000000000000000000000000000000000000000..c150ddb2b4bdd0b3300a719754c26692ddf4c5b8 GIT binary patch literal 116 zcmWGA<1$q+=Q1)i{#LopO11kmqOn(s_ literal 0 HcmV?d00001 diff --git a/data/graphics/digu.ppm b/data/graphics/digu.ppm new file mode 100644 index 0000000000000000000000000000000000000000..c2eaf1512d2c5d3046eda10144789dc5a3d1e4e4 GIT binary patch literal 116 tcmWGA<1$q+=Q1)ij5-9)x literal 0 HcmV?d00001 diff --git a/data/graphics/digv.ppm b/data/graphics/digv.ppm new file mode 100644 index 0000000000000000000000000000000000000000..0951ea55eac51a2fde1ceb01af6b3283dce5e266 GIT binary patch literal 116 zcmWGA<1$q+=Q1)iONX^=Pw08K^$0QH{} A$p8QV literal 0 HcmV?d00001 diff --git a/data/graphics/digx.ppm b/data/graphics/digx.ppm new file mode 100644 index 0000000000000000000000000000000000000000..e8550353086b685104a550dff00c618336a97d60 GIT binary patch literal 116 zcmWGA<1$q+=Q1)i;s0Rf=NaFT%m E0QnIU$p8QV literal 0 HcmV?d00001 diff --git a/data/graphics/digy.ppm b/data/graphics/digy.ppm new file mode 100644 index 0000000000000000000000000000000000000000..79d85815eee4222d8bba023c99c9dbe7f0053f70 GIT binary patch literal 116 zcmWGA<1$q+=Q1)it>SPK@CFIAW>l1;~?Dzlx literal 0 HcmV?d00001 diff --git a/data/graphics/m_butt2.ppm b/data/graphics/m_butt2.ppm new file mode 100644 index 0000000000000000000000000000000000000000..90d2195ca8a539e83894f54cab746c23fc27c0a4 GIT binary patch literal 688 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
  • tjFF3`ws4tMj!x~;f3u}IK z5T($Tfxxw8AaHFN2wYnR0@s#-z@uyO=0+)WH-o^#nml(>iDK47*Hq2}(KU8jOQnco zz@ldjE<`N00(NG$BwvqpN;P4rD4ta%zb%S+mHezI=2h}>QOv94-J+OR$s0v6uaa{~ z^MYTu9lneDwv8IAI>nkcaVUAex#@~Bh6V^0Rh13@a zTz!GS)fWg{eSyFUbHtK29@aEdC8BHc=0+)WH-nUXem7%(EBX9x#{NdchL-0}S)%zt z!{{mb{Geg;QW191?Nbqg8NZic2s<6@w%%@d|IdycTO4Uobl-?roOEQ1|?F8yeIzf59U>2diKnV3Eowz(-(jW6ZU*69D zvu6y*q32dOR+y0%6U8Z@tig1=jV`!C8{DPQaQ@?N?vGAe|1OaK K;qIRD=lMwOKU~yy;BK{vNj!fcLk8Co84N;Hm L5(pb2j*A2UZ(SZP literal 0 HcmV?d00001 diff --git a/data/graphics/stbr125.ppm b/data/graphics/stbr125.ppm new file mode 100644 index 0000000000000000000000000000000000000000..c860d62ba9d82d994ccb38b8187d01cffa1b2bef GIT binary patch literal 203 zcmWGAH?Q3XgV>C&?Fs3w8xr90>4dfT6g6i%i~n(lFr8U^px8`27Y>Gt6I zq9qN!)Q@#;1uJPv;yzE0fD(aLCXqDsQPKd@!<6I3DUktddMxX(%xfTnpLG3iNdtnW z>)ShzK{Vhe-KFP2G{AISNsd^Sf$46*7RUFK;