├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── COPYING ├── HISTORY.txt ├── MIT-LICENSE.txt ├── Makefile ├── Makefile.em ├── Makefile.os2 ├── README.md ├── build.sh ├── build ├── auto │ └── mac_doautobuilds.sh └── gettexthelper.sh ├── debian ├── appstream │ └── com.djoffe.davegnukem.metainfo.xml ├── changelog ├── control ├── copyright ├── davegnukem.6 ├── desktop │ └── davegnukem.desktop ├── icons │ └── hicolor │ │ ├── 128x128 │ │ └── apps │ │ │ └── davegnukem.png │ │ └── 32x32 │ │ └── apps │ │ └── davegnukem.png ├── patches │ ├── 00_hardening.patch │ └── series ├── rules ├── source │ ├── format │ └── include-binaries ├── upstream │ └── metadata └── watch ├── find_obj_files.sh ├── get_datafolders.sh ├── locale ├── af.po ├── am.po ├── ay.po ├── bg.po ├── ca.po ├── cs.po ├── cy.po ├── da.po ├── de.po ├── en.po ├── es.po ├── et.po ├── eu.po ├── fi.po ├── fr.po ├── ga.po ├── gl.po ├── he.po ├── hr.po ├── hu.po ├── id.po ├── ig.po ├── is.po ├── it.po ├── lb.po ├── lt.po ├── lv.po ├── mg.po ├── mk.po ├── ms.po ├── nl.po ├── no.po ├── pl.po ├── pt.po ├── sk.po ├── sl.po ├── sr.po ├── st.po ├── sv.po ├── sw.po ├── tl.po ├── tr.po ├── vi.po ├── xh.po └── zu.po ├── mac_build_release_dmg.sh └── src ├── 3rdparty └── stb_image.h ├── archive └── editor_standalone_original.cpp.bak ├── block.cpp ├── block.h ├── bullet.cpp ├── bullet.h ├── config.h ├── console.cpp ├── console.h ├── credits.cpp ├── credits.h ├── datadir.cpp ├── datadir.h ├── davegnukem.cfg ├── djfile.cpp ├── djfile.h ├── djfonts.cpp ├── djfonts.h ├── djgamelib.h ├── djgraph.h ├── djimage.cpp ├── djimage.h ├── djimageload.cpp ├── djimageload.h ├── djinput.h ├── djlang.cpp ├── djlang.h ├── djlog.cpp ├── djlog.h ├── djpoly.cpp ├── djpoly.h ├── djrect.cpp ├── djrect.h ├── djsound.h ├── djsprite.cpp ├── djsprite.h ├── djstring.cpp ├── djstring.h ├── djtime.h ├── djtypes.cpp ├── djtypes.h ├── djutf8.cpp ├── djutf8.h ├── djvec2d.cpp ├── djvec2d.h ├── docs ├── DesignNotes.md ├── msvc │ └── BUILD.md └── openbsd │ └── BUILD.md ├── ed.cpp ├── ed.h ├── ed_DrawBoxContents.cpp ├── ed_DrawBoxContents.h ├── ed_common.cpp ├── ed_common.h ├── ed_lvled.cpp ├── ed_lvled.h ├── ed_macros.cpp ├── ed_macros.h ├── ed_spred.cpp ├── ed_spred.h ├── effect_viewportshadow.cpp ├── effect_viewportshadow.h ├── game.cpp ├── game.h ├── gameending.cpp ├── graph.cpp ├── graph.h ├── hero.cpp ├── hero.h ├── hiscores.cpp ├── hiscores.dat ├── hiscores.h ├── installer ├── GnukemEnglish.isl └── gnukem.iss ├── instructions.cpp ├── instructions.h ├── inventory.cpp ├── inventory.h ├── keys.cpp ├── keys.h ├── level.cpp ├── level.h ├── loadedlevel.cpp ├── loadedlevel.h ├── localization ├── djgettext.cpp └── djgettext.h ├── m_aliases.h ├── m_misc.cpp ├── m_misc.h ├── main.cpp ├── mainmenu.cpp ├── mainmenu.h ├── menu.cpp ├── menu.h ├── mission.cpp ├── mission.h ├── mixins.cpp ├── mixins.h ├── sdl ├── djgraph.cpp ├── djinclude_sdlmixer.h ├── djinput.cpp ├── djsound.cpp └── djtime.cpp ├── settings.cpp ├── settings.h ├── sys_defs.h ├── sys_error.cpp ├── sys_error.h ├── sys_log.cpp ├── sys_log.h ├── thing.cpp ├── thing.h ├── thing_monsters.cpp ├── thing_monsters.h ├── vcDave ├── application_icon.ico ├── djVSPropertySheetIncludeFolders.props ├── djVSPropertySheetIncludeFoldersD.props ├── resource.h ├── vcDave.rc ├── vcDave.sln ├── vcDave.vcxproj └── vcDave.vcxproj.filters ├── version.h └── win32 ├── dpiscaling.cpp └── winmain.cpp /.gitattributes: -------------------------------------------------------------------------------- 1 | *.sh text eol=lf 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: https://www.paypal.com/paypalme/davidjoffe 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #dj2019-05 Creating basic .gitignore, this file isn't critical but maybe just makes it a bit easier when working. 2 | 3 | /MacRelease* 4 | # Mac Finder droppings (DS_Store files that Mac Finder leaves all over the place) - this is not really critically important to be here for anything to function but helps development as these keep showing up in git status etc. and impede easy auto-commit-all-local-changes type of workflow actions 5 | *.DS_Store 6 | 7 | /.vscode/* 8 | 9 | #The data subfolder is just a separate git project ie https://github.com/davidjoffe/gnukem_data - don't try commit etc. here 10 | /data 11 | #Same with datasrc if you have it 12 | /datasrc 13 | 14 | # Temporary Visual Studio build products that should not be committed: 15 | /src/vcDave/Debug 16 | /src/vcDave/Release 17 | /src/vcDave/x64/* 18 | # Local settings Visual Studio project file should probably not be in repo: 19 | /src/vcDave/vcDave.vcxproj.user 20 | /DaveGnukem.exe 21 | /DaveGnukem.pdb 22 | 23 | *.dll 24 | 25 | # Temporary local Visual Studio settings and cached stuff eg precompiled headers that should not be committed 26 | /src/vcDave/.vs/ 27 | 28 | # OS2 (dj2022-11 Merging Andreas Peters OS2 commits) 29 | /**/*.o 30 | /*.exe 31 | 32 | # Linux/Mac etc. build products: 33 | davegnukem 34 | src/*.o 35 | src/sdl/*.o 36 | -------------------------------------------------------------------------------- /MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 1995-2024 David Joffe 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /Makefile.em: -------------------------------------------------------------------------------- 1 | # 2 | # David Joffe 3 | # Copyright 1998-2024 David Joffe 4 | # Created 1998/12 5 | # Makefile for Dave Gnukem 6 | # 7 | # 2016-10: Get this working on Mac OS X [dj] 8 | # 2017-07-29: Remove obsolete standalone-editor-related stuff, and add new thing_monsters.o 9 | # 10 | # ~2019 - ~2023 In-progress work by Donovan Hutchence to get this working with Emscripten 11 | # 12 | 13 | CPP = em++ 14 | CC = emcc 15 | 16 | 17 | # dj2016-10 Add L -I/usr/local/include/SDL in process of getting this working on Mac OS X - not sure if this is 'bad' to just have both /usr/include and /usr/local/include?? 18 | #INCLUDEDIRS= -I/usr/include/SDL -I/usr/local/include/SDL 19 | 20 | #CCFLAGS = -O -Wall $(INCLUDEDIRS) 21 | 22 | # Un/recomment as needed for removing sound support, optimizations etc 23 | # If you don't -DDATA_DIR to a valid dir, then data files will be assumed 24 | # to be in current directory 25 | #CCFLAGS = -Wall -I/usr/local/include -DHAVE_SOUND -DDEBUG -O -m486 26 | CCFLAGS = -Wall -Wno-switch -DDEBUG $(INCLUDEDIRS) 27 | #Release version: 28 | #CCFLAGS = -O -Wall -I/usr/local/include -DHAVE_SOUND $(INCLUDEDIRS) 29 | 30 | #LIBS = -lSDL -lSDLmain -lSDL_mixer -lpthread 31 | LIBS = -lSDL -lpthread 32 | BIN = davegnukem.html 33 | 34 | 35 | ifeq ($(OS),Windows_NT) 36 | #CCFLAGS += -D WIN32 37 | ifeq ($(PROCESSOR_ARCHITEW6432),AMD64) 38 | #CCFLAGS += -D AMD64 39 | else 40 | ifeq ($(PROCESSOR_ARCHITECTURE),AMD64) 41 | #CCFLAGS += -D AMD64 42 | endif 43 | ifeq ($(PROCESSOR_ARCHITECTURE),x86) 44 | #CCFLAGS += -D IA32 45 | endif 46 | endif 47 | else 48 | UNAME_S := $(shell uname -s) 49 | ifeq ($(UNAME_S),Linux) 50 | #CCFLAGS += -D LINUX 51 | endif 52 | ifeq ($(UNAME_S),Darwin) 53 | LIBS += -framework Cocoa 54 | endif 55 | UNAME_P := $(shell uname -p) 56 | ifeq ($(UNAME_P),x86_64) 57 | #CCFLAGS += -D AMD64 58 | endif 59 | ifneq ($(filter %86,$(UNAME_P)),) 60 | #CCFLAGS += -D IA32 61 | endif 62 | ifneq ($(filter arm%,$(UNAME_P)),) 63 | #CCFLAGS += -D ARM 64 | endif 65 | endif 66 | 67 | 68 | OBJFILES = src/main.o src/graph.o src/game.o src/menu.o\ 69 | src/block.o src/credits.o src/instructions.o src/djstring.o \ 70 | src/djimage.o src/djlog.o src/inventory.o src/mission.o\ 71 | src/hiscores.o src/mixins.o src/thing.o src/hero.o \ 72 | src/thing_monsters.o src/gameending.o \ 73 | src/level.o src/settings.o src/keys.o \ 74 | src/djtypes.o src/bullet.o \ 75 | src/ed.o src/ed_DrawBoxContents.o src/ed_common.o src/ed_lvled.o \ 76 | src/ed_macros.o src/ed_spred.o \ 77 | src/sdl/djgraph.o src/sdl/djinput.o src/sdl/djsound.o \ 78 | src/sdl/djtime.o \ 79 | src/sys_error.o src/sys_log.o src/m_misc.cpp 80 | 81 | FLAGS=-s WASM=1 -s USE_SDL_MIXER=1 --preload-file ./data -s ALLOW_MEMORY_GROWTH=1 --use-preload-plugins -s STB_IMAGE=1 82 | 83 | default: gnukem 84 | 85 | gnukem: $(OBJFILES) 86 | $(CPP) -o $(BIN) $(OBJFILES) $(LIBS) $(FLAGS) 87 | clean: 88 | rm -f $(BIN) *~ core \#* 89 | find src -name '*.o' | xargs rm -f 90 | 91 | dist: 92 | rm -f core *~ \#* 93 | find src -name '*.o' | xargs rm -f 94 | 95 | linecount: 96 | cat src/*.cpp src/*.h src/sdl/*.h src/sdl/*.cpp | wc -l 97 | 98 | fixme: 99 | ls src/*.c src/*.cpp src/*.h | xargs grep -i fixme 100 | 101 | %.o: %.c 102 | $(CPP) $(CCFLAGS) -c $< -o $@ 103 | 104 | %.o: %.cpp 105 | $(CPP) $(CCFLAGS) $(FLAGS) -c $< -o $@ 106 | 107 | -------------------------------------------------------------------------------- /Makefile.os2: -------------------------------------------------------------------------------- 1 | # 2 | # David Joffe 3 | # Copyright 1998-2024 David Joffe 4 | # 1998/12 5 | # makefile for Dave Gnukem 6 | # 7 | 8 | CPP = g++ 9 | CC = gcc 10 | 11 | 12 | #CFLAGS = -O -Wall $(INCLUDEDIRS) 13 | 14 | # Un/recomment as needed for removing sound support, optimizations etc 15 | # If you don't -DDATA_DIR to a valid dir, then data files will be assumed 16 | # to be in current directory 17 | #CFLAGS = -Wall -I/@unixroot/usr/include -DHAVE_SOUND -DDEBUG -O -m486 18 | CFLAGS = -DUSESDL $(INCLUDEDIRS) -I/@unixroot/usr/include 19 | #Release version: 20 | #CFLAGS = -O -Wall -I/@unixroot/usr/include -DHAVE_SOUND $(INCLUDEDIRS) 21 | 22 | LIBS = -lSDL_mixer -lsdl -Zexe -lpthread 23 | BIN = davegnukem.exe 24 | 25 | OBJFILES = src/main.o src/graph.o src/game.o src/menu.o\ 26 | src/block.o src/credits.o src/instructions.o src/djstring.o \ 27 | src/djfonts.o src/djimage.o src/djlog.o src/inventory.o src/mission.o\ 28 | src/hiscores.o src/mixins.o src/thing.o src/hero.o \ 29 | src/thing_monsters.o src/gameending.o \ 30 | src/level.o src/settings.o src/keys.o \ 31 | src/djtypes.o src/bullet.o \ 32 | src/ed.o src/ed_DrawBoxContents.o src/ed_common.o src/ed_lvled.o \ 33 | src/ed_macros.o src/ed_spred.o \ 34 | src/sdl/djgraph.o src/sdl/djinput.o src/sdl/djsound.o \ 35 | src/sdl/djtime.o \ 36 | src/sys_error.o src/sys_log.o src/m_misc.o 37 | 38 | default: gnukem 39 | 40 | gnukem: $(OBJFILES) 41 | $(CPP) -o $(BIN) $(OBJFILES) $(LIBS) 42 | 43 | clean: 44 | rm -f $(BIN) *~ core \#* 45 | find src -name '*.o' | xargs rm -f 46 | 47 | dist: 48 | rm -f core *~ \#* 49 | find src -name '*.o' | xargs rm -f 50 | 51 | %.o: %.c 52 | $(CPP) $(CFLAGS) -c $< -o $@ 53 | 54 | %.o: %.cpp 55 | $(CPP) $(CFLAGS) -c $< -o $@ 56 | 57 | .PHONY: clean dist 58 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Very small build helper script 3 | # This script is not important to the core source and it is suggested to avoid building anything based on this script as it may change or move etc. in future - it's just to save time for dev 4 | 5 | @echo Make sure you have first installed dependencies if necessary, e.g. "sudo apt install libsdl2-dev", "sudo apt install libsdl2-mixer-dev" 6 | 7 | make clean && make -j8 8 | 9 | # Still thinking about this DdjUNICODE_SUPPORT etc. dj2024: 10 | #make clean && make -j8 CXXFLAGS="-DdjUNICODE_SUPPORT" 11 | -------------------------------------------------------------------------------- /build/auto/mac_doautobuilds.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #dj2023 new helper for attempting to increasingly automate builds 3 | # This is also to help automate build testing e.g. to help catch regressions 4 | 5 | echo ---------------------------------------------------- 6 | pwd 7 | #echo $djDIR 8 | 9 | echo ---------- git pull --all 10 | git pull --all 11 | echo ---------- git info 12 | git rev-list --count HEAD 13 | git log -1 14 | git status 15 | echo ---------- 16 | 17 | echo Clean 18 | make clean 19 | echo Build 20 | make -j8 21 | 22 | echo ---------------------------------------------------- 23 | 24 | -------------------------------------------------------------------------------- /build/gettexthelper.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | mkdir -p lang/ 4 | mkdir -p lang/po/ 5 | cd src 6 | xgettext --force-po -c -C *.cpp -o ../lang/po/messages.po 7 | xgettext --force-po -c -C *.cpp -o ../lang/po/en.po 8 | cd .. 9 | 10 | mkdir -p lang/auto/ 11 | 12 | cd src 13 | xgettext --force-po -c -C *.cpp -o ../lang/auto/messages.po 14 | xgettext --force-po -c -C *.cpp -o ../lang/auto/en.po 15 | cd .. 16 | 17 | cp -r lang/* data/lang/ 18 | -------------------------------------------------------------------------------- /debian/appstream/com.djoffe.davegnukem.metainfo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Game 5 | ActionGame 6 | 7 | 8 | mild 9 | 10 | 11 |

Dave Gnukem is an open source retro-style 2D scrolling platform shooter, inspired by and similar to Duke Nukem 1. It currently runs on Windows, macOS, Linux and various other platforms. It is written in C++ using SDL library and it features an integrated level editor as well. This game is not really a clone or remake, it is probably most akin to a parody.

12 |
13 | 14 | David Joffe 15 | 16 | com.djoffe.davegnukem 17 | 18 | 2D 19 | Action 20 | Duke Nukem 21 | Platform 22 | Retro 23 | 24 | davegnukem.desktop 25 | MIT 26 | Dave Gnukem 27 | GPL-2.0-only OR GPL-3.0-only OR MIT 28 | 29 | davegnukem 30 | 31 | 32 | 33 | https://github.com/davidjoffe/dave_gnukem/releases/tag/1.0.3 34 | 35 | 36 | https://github.com/davidjoffe/dave_gnukem/releases/tag/1.0.2 37 | 38 | 39 | https://github.com/davidjoffe/dave_gnukem/releases/tag/1.0.1 40 | 41 | 42 | https://github.com/davidjoffe/dave_gnukem/releases/tag/1.0 43 | 44 | 45 | https://github.com/davidjoffe/dave_gnukem/releases/tag/0.97 46 | 47 | 48 | https://github.com/davidjoffe/dave_gnukem/releases/tag/0.96 49 | 50 | 51 | https://github.com/davidjoffe/dave_gnukem/releases/tag/0.91 52 | 53 | 54 | https://github.com/davidjoffe/dave_gnukem/releases/tag/v0.81 55 | 56 | 57 | https://github.com/davidjoffe/dave_gnukem/releases/tag/v0.72 58 | 59 | 60 | https://github.com/davidjoffe/dave_gnukem/releases/tag/v0.70 61 | 62 | 63 | 64 | 65 | https://screenshots.debian.net/shrine/screenshot/simage/large-ba1ad64dbc011af7b899da1f4b97a20d.png 66 | 67 | 68 | Retro-style 2D scrolling platform shooter 69 | https://github.com/davidjoffe/dave_gnukem/issues 70 | https://djoffe.com/contact/ 71 | https://djoffe.com/gnukem/#h 72 | https://www.paypal.com/paypalme/davidjoffe 73 | https://github.com/davidjoffe/dave_gnukem#faq-frequently-asked-questions 74 | https://djoffe.com/gnukem/#f 75 | https://djoffe.com/gnukem/ 76 | https://github.com/davidjoffe/dave_gnukem 77 |
78 | -------------------------------------------------------------------------------- /debian/changelog: -------------------------------------------------------------------------------- 1 | davegnukem (1.0.3-1) unstable; urgency=low 2 | 3 | * Initial release (Closes: #1009780) 4 | 5 | -- Matteo Bini Tue, 29 Nov 2022 11:01:36 +0100 6 | -------------------------------------------------------------------------------- /debian/control: -------------------------------------------------------------------------------- 1 | Source: davegnukem 2 | Section: games 3 | Priority: optional 4 | Maintainer: Matteo Bini 5 | Build-Depends: debhelper-compat (= 13), 6 | libsdl2-dev, 7 | libsdl2-mixer-dev 8 | Standards-Version: 4.6.1 9 | Homepage: https://djoffe.com/gnukem/ 10 | Rules-Requires-Root: no 11 | 12 | Package: davegnukem 13 | Architecture: any 14 | Depends: davegnukem-data (= ${source:Version}), 15 | ${shlibs:Depends}, 16 | ${misc:Depends} 17 | Description: Retro-style 2D scrolling platform shooter 18 | Dave Gnukem is an open source retro-style 2D scrolling platform shooter, 19 | inspired by and similar to Duke Nukem 1. It currently runs on Windows, macOS, 20 | Linux and various other platforms. It is written in C++ using SDL library and 21 | it features an integrated level editor as well. This game is not really a 22 | clone or remake, it is probably most akin to a parody. 23 | 24 | Package: davegnukem-data 25 | Architecture: all 26 | Depends: ${misc:Depends} 27 | Multi-Arch: foreign 28 | Suggests: davegnukem 29 | Description: Data files for davegnukem 30 | This package contains the data files required by the davegnukem package. 31 | 32 | Package: davegnukem-datasrc 33 | Architecture: all 34 | Depends: ${misc:Depends} 35 | Multi-Arch: foreign 36 | Suggests: davegnukem-data 37 | Description: Data source files for davegnukem 38 | This package contains the data source files used to create the graphics for 39 | the Dave Gnukem video game. 40 | . 41 | You don't need this package to play nor to build the game: it contains the 42 | original Photoshop files that are exported to TGA in the game's data folder. 43 | This package would only be necessary if you intend to edit the game's sprites. 44 | -------------------------------------------------------------------------------- /debian/davegnukem.6: -------------------------------------------------------------------------------- 1 | .TH DAVEGNUKEM 6 "VERSION" 2 | 3 | .SH NAME 4 | davegnukem \- A retro-style 2D scrolling platform shooter 5 | 6 | .SH SYNOPSIS 7 | .B davegnukem 8 | .RI [ OPTIONS ] 9 | 10 | .SH DESCRIPTION 11 | Dave Gnukem is an open source retro-style 2D scrolling platform 12 | shooter, inspired by and similar to Duke Nukem 1. It is written in C++ 13 | using SDL library and it features an integrated level editor as 14 | well. 15 | 16 | .SH OPTIONS 17 | .TP 18 | .B \-f 19 | Fullscreen. 20 | .TP 21 | .B \-640 22 | Set resolution to 640x480. 23 | .TP 24 | .BI \-scale " NUMBER" 25 | Force window size to multiple of 320x200 base resolution. 26 | .TP 27 | .BI \-datadir " DIR" 28 | Override default data path, it may be absolute or relative. 29 | 30 | .SH GAMEPLAY 31 | Try find the exit, while dodging or shooting monsters. 32 | 33 | .SH DEFAULT KEYS 34 | .TP 35 | .B Left/Right 36 | Move left/right 37 | .TP 38 | .B Ctrl 39 | Jump 40 | .TP 41 | .B Alt 42 | Shoot 43 | .TP 44 | .B Up 45 | Action key for opening doors, using teleporters or lifts, activating 46 | the exit, etc 47 | .TP 48 | .B Esc 49 | In-game menu 50 | .TP 51 | .B 6/7 52 | Decrease/increase volume 53 | .TP 54 | .B Insert 55 | Toggle sounds 56 | .TP 57 | .B Shift+F6/F7 58 | Decrease/increase speed (framerate) 59 | .TP 60 | .B Shift+F8/F9 61 | Toggle map/sprite auto-shadows 62 | .TP 63 | .B F10 64 | Save screenshot 65 | 66 | .SH LEVEL EDITOR 67 | To enter the level editor you must first enable DebugStuff by pressing 68 | .IR Ctrl+Shift+G . 69 | Then use 70 | .I F5 71 | to invoke the level editor or 72 | .I F4 73 | for the sprite one. See the 74 | .I README 75 | for more details about both the debug mode and the editors. 76 | 77 | .SH SEE ALSO 78 | More information can be found in the 79 | .I README 80 | and on the website 81 | .B https://djoffe.com/gnukem/ 82 | 83 | .SH AUTHOR 84 | Dave Gnukem was written by David Joffe . 85 | .br 86 | This manual page was written by Matteo Bini . 87 | -------------------------------------------------------------------------------- /debian/desktop/davegnukem.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=Dave Gnukem 4 | Comment=Retro-style 2D scrolling platform shooter 5 | Exec=davegnukem 6 | Icon=davegnukem 7 | Categories=Game 8 | Keywords=2D;Action;Duke Nukem;Platform;Retro 9 | -------------------------------------------------------------------------------- /debian/icons/hicolor/128x128/apps/davegnukem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidjoffe/dave_gnukem/2255bd4bba31d3a95bc6a850a10c1e9220baee61/debian/icons/hicolor/128x128/apps/davegnukem.png -------------------------------------------------------------------------------- /debian/icons/hicolor/32x32/apps/davegnukem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidjoffe/dave_gnukem/2255bd4bba31d3a95bc6a850a10c1e9220baee61/debian/icons/hicolor/32x32/apps/davegnukem.png -------------------------------------------------------------------------------- /debian/patches/00_hardening.patch: -------------------------------------------------------------------------------- 1 | Author: Matteo Bini 2 | Description: Inject hardening flags 3 | Forwarded: not-needed 4 | --- a/Makefile 5 | +++ b/Makefile 6 | @@ -24,9 +24,9 @@ PREFIX = /usr/local 7 | DATA_DIR = $(PREFIX)/share/games/$(BIN)/# the trailing slash is required for paths in the source 8 | 9 | LIBS = `sdl2-config --libs` -lSDL2_mixer 10 | -LDFLAGS = $(LIBS) 11 | +LDFLAGS += $(LIBS) 12 | 13 | -CPPFLAGS = -DDATA_DIR=\"$(DATA_DIR)\" -DVERSION=\"'$(VERSION)'\" 14 | +CPPFLAGS += -DDATA_DIR=\"$(DATA_DIR)\" -DVERSION=\"'$(VERSION)'\" 15 | 16 | CXX = g++ 17 | 18 | @@ -68,7 +68,7 @@ endif 19 | 20 | # debug 21 | #CXXFLAGS = -ggdb -DDEBUG -std=c++14 -Wall `sdl2-config --cflags` $(CPPFLAGS) 22 | -CXXFLAGS = -Os -std=c++14 -Wall `sdl2-config --cflags` $(CPPFLAGS) 23 | +CXXFLAGS += -Os -std=c++14 -Wall `sdl2-config --cflags` $(CPPFLAGS) 24 | 25 | all: options davegnukem 26 | 27 | -------------------------------------------------------------------------------- /debian/patches/series: -------------------------------------------------------------------------------- 1 | 00_hardening.patch 2 | -------------------------------------------------------------------------------- /debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | 3 | export DEB_BUILD_MAINT_OPTIONS = hardening=+all 4 | 5 | SHELL := sh -e 6 | 7 | %: 8 | dh $@ 9 | 10 | override_dh_auto_build: 11 | dh_auto_build -- PREFIX=/usr 12 | 13 | override_dh_auto_install: 14 | dh_auto_install -- DESTDIR=$(CURDIR)/debian/davegnukem PREFIX=/usr 15 | 16 | mkdir -p debian/davegnukem-data/usr/share/games 17 | mv debian/davegnukem/usr/share/games/davegnukem debian/davegnukem-data/usr/share/games 18 | rmdir debian/davegnukem/usr/share/games 19 | mkdir -p debian/davegnukem-data/usr/share/doc 20 | mv debian/davegnukem/usr/share/doc/davegnukem-data debian/davegnukem-data/usr/share/doc 21 | 22 | mkdir -p debian/davegnukem-datasrc/usr/share/games/davegnukem 23 | cp -R datasrc debian/davegnukem-datasrc/usr/share/games/davegnukem/src 24 | rm debian/davegnukem-datasrc/usr/share/games/davegnukem/src/README.md 25 | mkdir -p debian/davegnukem-datasrc/usr/share/doc/davegnukem-datasrc 26 | cp datasrc/README.md debian/davegnukem-datasrc/usr/share/doc/davegnukem-datasrc 27 | -------------------------------------------------------------------------------- /debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (quilt) 2 | -------------------------------------------------------------------------------- /debian/source/include-binaries: -------------------------------------------------------------------------------- 1 | debian/icons/hicolor/32x32/apps/davegnukem.png 2 | debian/icons/hicolor/128x128/apps/davegnukem.png 3 | -------------------------------------------------------------------------------- /debian/upstream/metadata: -------------------------------------------------------------------------------- 1 | Bug-Database: https://github.com/davidjoffe/dave_gnukem/issues 2 | Donation: https://www.paypal.com/paypalme/davidjoffe 3 | Repository: https://github.com/davidjoffe/dave_gnukem.git 4 | Repository-Browse: https://github.com/davidjoffe/dave_gnukem 5 | Screenshots: https://djoffe.com/gnukem/#i 6 | -------------------------------------------------------------------------------- /debian/watch: -------------------------------------------------------------------------------- 1 | version=4 2 | opts=filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/dave_gnukem-$1\.tar\.gz/ \ 3 | https://github.com/davidjoffe/dave_gnukem/tags .*/v?(\d\S+)\.tar\.gz 4 | 5 | opts=pgpmode=none,component=data,filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/gnukem_data-$1\.tar\.gz/ \ 6 | https://github.com/davidjoffe/gnukem_data/tags .*/v?(\d\S+)\.tar\.gz 7 | 8 | opts=pgpmode=none,component=datasrc \ 9 | https://github.com/davidjoffe/gnukem_datasrc/tags .*/v?(\d\S+)\.tar\.gz ignore uupdate 10 | -------------------------------------------------------------------------------- /find_obj_files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | find src -iname '*.cpp' -type f | sed 's/\.cpp$/.o \\/' | sort 4 | -------------------------------------------------------------------------------- /get_datafolders.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # dj2022 small convenience helper script to get or update data subfolder (you need git installed for this) 3 | # 4 | # NB this gets latest cloned git repo with ".git" folder - if you're distributing a RELEASE you may want to delete the ".git" subfolders 5 | # 6 | # If you want to optionally use a different data folder name to the default djDATADIR) 7 | # 8 | 9 | djDATADIR="data" 10 | djDATA_URL="https://github.com/davidjoffe/gnukem_data" 11 | djDATADIR2="datasrc" 12 | djDATA_URL2="https://github.com/davidjoffe/gnukem_datasrc" 13 | 14 | 15 | echo 16 | echo "This is a small convenience helper script to get or update data subfolder. You need git for this." 17 | echo "The data subfolder is necessary for the game to run." 18 | echo "The datasrc subfolder is NOT necessary for the game to run but is intended only if you want to do tasks like edit sprites." 19 | echo "This helper script itself is not necessary for the game to run and is not used by the game at all so does not need to be included with releases." 20 | echo 21 | echo "NB this gets latest cloned git repo with .git folder. If you're distributing a RELEASE you may want to delete the .git subfolders." 22 | echo 23 | echo "This script will do:" 24 | echo git clone "${djDATA_URL}" "${djDATADIR}" 25 | echo git clone "${djDATA_URL2}" "${djDATADIR2}" 26 | echo "If the subfolders exist it will update with git pull." 27 | echo 28 | echo "(If you want to use a different data folder name you can but then you may need to use the -datadir commandline option for the game or adapt the Makefile)" 29 | echo 30 | 31 | read -p "ARE YOU SURE YOU WANT TO PROCEED? (y/n) " keyread 32 | case $keyread in 33 | y ) echo ok, we will proceed;; 34 | n ) echo exiting...; 35 | exit;; 36 | * ) echo invalid response; 37 | exit 1;; 38 | esac 39 | 40 | 41 | echo DATA FOLDER "${djDATADIR}" 42 | if [ -d "$djDATADIR" ]; then 43 | echo Updating data folder "${djDATADIR}" ... 44 | echo cd "${djDATADIR}" 45 | cd "${djDATADIR}" 46 | # show current folder 47 | pwd 48 | echo git pull 49 | git pull 50 | echo cd .. 51 | cd .. 52 | else 53 | echo Cloning data folder ... 54 | git clone "${djDATA_URL}" "${djDATADIR}" 55 | fi 56 | 57 | 58 | echo 59 | echo DATASRC FOLDER "${djDATADIR2}" 60 | echo "Also getting datasrc but these are NOT necessary for game to run (datasrc folder are for those who might want to do things like edit sprites)" 61 | 62 | if [ -d "$djDATADIR2" ]; then 63 | echo Updating datasrc folder "${djDATADIR2}" ... 64 | echo cd "${djDATADIR2}" 65 | cd "${djDATADIR2}" 66 | # show current folder 67 | pwd 68 | echo git pull 69 | git pull 70 | echo cd .. 71 | cd .. 72 | else 73 | echo Cloning datasrc folder ... 74 | git clone "${djDATA_URL2}" "${djDATADIR2}" 75 | fi 76 | -------------------------------------------------------------------------------- /locale/af.po: -------------------------------------------------------------------------------- 1 | # DAVE GNUKEM AFRIKAANS TRANSLATIONS 2 | # Copyright (C) 1995-2025 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-17 20:10+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: Afrikaans \n" 14 | "Language: af\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "Telling" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "Vuurkrag(?)" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | 40 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 41 | #. If a similar pun works in your language, feel free to use it. Otherwise, 42 | #. translate as "Start new game". 43 | #: mainmenu.cpp:53 44 | msgctxt "mainmenu/start" 45 | msgid "Start gnu game" 46 | msgstr "Begin gnu spel" 47 | 48 | #. mainmenu.addmenuitem(pgettext("mainmenu", "Start gnu game")); 49 | #: mainmenu.cpp:55 50 | msgctxt "mainmenu/restore" 51 | msgid "Restore game" 52 | msgstr "Herstel spel" 53 | 54 | #: mainmenu.cpp:56 55 | msgctxt "mainmenu" 56 | msgid "Select Mission" 57 | msgstr "Kies Sending" 58 | 59 | #: mainmenu.cpp:57 60 | msgctxt "mainmenu" 61 | msgid "Ordering info" 62 | msgstr "Bestelinligting" 63 | 64 | #: mainmenu.cpp:58 65 | msgctxt "mainmenu" 66 | msgid "(not!)" 67 | msgstr "(nie!)" 68 | 69 | #. { true, pgettext("mainmenu", "Select language") }, //?todo add 'select language'? 70 | #: mainmenu.cpp:60 71 | msgctxt "mainmenu" 72 | msgid "Instructions" 73 | msgstr "Instruksies" 74 | 75 | #: mainmenu.cpp:61 76 | msgctxt "mainmenu" 77 | msgid "Redefine keys" 78 | msgstr "Herkonfigureer sleutels" 79 | 80 | #: mainmenu.cpp:62 81 | msgctxt "mainmenu" 82 | msgid "High scores" 83 | msgstr "Hoë tellings" 84 | 85 | #: mainmenu.cpp:63 86 | msgctxt "mainmenu" 87 | msgid "Credits" 88 | msgstr "Krediete" 89 | 90 | #: mainmenu.cpp:64 91 | msgctxt "mainmenu" 92 | msgid "About" 93 | msgstr "Oor" 94 | 95 | #: mainmenu.cpp:65 96 | msgctxt "mainmenu" 97 | msgid "Settings" 98 | msgstr "Instellings" 99 | 100 | #: mainmenu.cpp:66 101 | msgctxt "mainmenu" 102 | msgid "Retro Settings" 103 | msgstr "Retro-instellings" 104 | 105 | #. todo make general Settings? 106 | #: mainmenu.cpp:67 107 | msgctxt "mainmenu" 108 | msgid "Don't quit" 109 | msgstr "Moenie ophou nie" 110 | 111 | #: mainmenu.cpp:68 112 | msgctxt "mainmenu" 113 | msgid "Quit" 114 | msgstr "Afsluit" 115 | -------------------------------------------------------------------------------- /locale/am.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/ay.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/bg.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/ca.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/cs.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/cy.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/da.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "Gesundheit" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "Punktzahl" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "Feuerkraft" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "Inventar" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "Fortsetzen" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "Spiel speichern" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "Spiel wiederherstellen" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "Anleitung" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "Retro-Einstellungen" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "Vollbild" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "Spiel abbrechen" 73 | 74 | #: mainmenu.cpp:79 75 | msgctxt "mainmenu/start_new_game" 76 | msgid "Start new game" 77 | msgstr "Neues Spiel starten" 78 | 79 | #: mainmenu.cpp:80 80 | msgctxt "mainmenu/restore_game" 81 | msgid "Restore game" 82 | msgstr "Spiel wiederherstellen" 83 | 84 | #: mainmenu.cpp:81 85 | msgctxt "mainmenu/select_mission" 86 | msgid "Select Mission" 87 | msgstr "Mission auswählen" 88 | 89 | #: mainmenu.cpp:83 90 | msgctxt "mainmenu/order_info" 91 | msgid "Ordering info" 92 | msgstr "Bestellinformationen" 93 | 94 | #: mainmenu.cpp:85 95 | msgctxt "mainmenu/not" 96 | msgid "(not!)" 97 | msgstr "(nicht!)" 98 | 99 | #: mainmenu.cpp:86 100 | msgctxt "mainmenu/instructions" 101 | msgid "Instructions" 102 | msgstr "Anleitung" 103 | 104 | #: mainmenu.cpp:87 105 | msgctxt "mainmenu/redefine_keys" 106 | msgid "Redefine keys" 107 | msgstr "Tasten neu belegen" 108 | 109 | #: mainmenu.cpp:88 110 | msgctxt "mainmenu/high_scores" 111 | msgid "High scores" 112 | msgstr "Highscores" 113 | 114 | #: mainmenu.cpp:89 115 | msgctxt "mainmenu/credits" 116 | msgid "Credits" 117 | msgstr "Credits" 118 | 119 | #: mainmenu.cpp:90 120 | msgctxt "mainmenu/about" 121 | msgid "About" 122 | msgstr "Über" 123 | 124 | #: mainmenu.cpp:91 125 | msgctxt "mainmenu/language" 126 | msgid "Choose language" 127 | msgstr "Sprache wählen" 128 | 129 | #: mainmenu.cpp:92 130 | msgctxt "mainmenu/settings" 131 | msgid "Settings" 132 | msgstr "Einstellungen" 133 | 134 | #: mainmenu.cpp:93 135 | msgctxt "mainmenu/settings_retro" 136 | msgid "Retro Settings" 137 | msgstr "Retro-Einstellungen" 138 | 139 | #: mainmenu.cpp:95 140 | msgctxt "mainmenu/dont_quit" 141 | msgid "Don't quit" 142 | msgstr "Nicht beenden" 143 | 144 | #: mainmenu.cpp:97 145 | msgctxt "mainmenu/quit" 146 | msgid "Quit" 147 | msgstr "Beenden" 148 | 149 | -------------------------------------------------------------------------------- /locale/es.po: -------------------------------------------------------------------------------- 1 | # DAVE GNUKEM SPANISH TRANSLATIONS 2 | # Copyright (C) 1995-2023 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-17 20:10+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: Spanish \n" 14 | "Language: es\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 20 | #. If a similar pun works in your language, feel free to use it. Otherwise, 21 | #. translate as "Start new game". 22 | #: mainmenu.cpp:53 23 | msgctxt "mainmenu/start" 24 | msgid "Start gnu game" 25 | msgstr "Iniciar juego gnu" 26 | 27 | #. mainmenu.addmenuitem(pgettext("mainmenu", "Start gnu game")); 28 | #: mainmenu.cpp:55 29 | msgctxt "mainmenu/restore" 30 | msgid "Restore game" 31 | msgstr "Restaurar juego" 32 | 33 | #: mainmenu.cpp:56 34 | msgctxt "mainmenu" 35 | msgid "Select Mission" 36 | msgstr "Seleccionar Misión" 37 | 38 | #: mainmenu.cpp:57 39 | msgctxt "mainmenu" 40 | msgid "Ordering info" 41 | msgstr "Información de pedido" 42 | 43 | #: mainmenu.cpp:58 44 | msgctxt "mainmenu" 45 | msgid "(not!)" 46 | msgstr "(¡no!)" 47 | 48 | #. { true, pgettext("mainmenu", "Select language") }, //?todo add 'select language'? 49 | #: mainmenu.cpp:60 50 | msgctxt "mainmenu" 51 | msgid "Instructions" 52 | msgstr "Instrucciones" 53 | 54 | #: mainmenu.cpp:61 55 | msgctxt "mainmenu" 56 | msgid "Redefine keys" 57 | msgstr "Redefinir teclas" 58 | 59 | #: mainmenu.cpp:62 60 | msgctxt "mainmenu" 61 | msgid "High scores" 62 | msgstr "Puntuaciones altas" 63 | 64 | #: mainmenu.cpp:63 65 | msgctxt "mainmenu" 66 | msgid "Credits" 67 | msgstr "Créditos" 68 | 69 | #: mainmenu.cpp:64 70 | msgctxt "mainmenu" 71 | msgid "About" 72 | msgstr "Acerca de" 73 | 74 | #: mainmenu.cpp:65 75 | msgctxt "mainmenu" 76 | msgid "Settings" 77 | msgstr "Configuraciones" 78 | 79 | #: mainmenu.cpp:66 80 | msgctxt "mainmenu" 81 | msgid "Retro Settings" 82 | msgstr "Configuraciones Retro" 83 | 84 | #. todo make general Settings? 85 | #: mainmenu.cpp:67 86 | msgctxt "mainmenu" 87 | msgid "Don't quit" 88 | msgstr "No salir" 89 | 90 | #: mainmenu.cpp:68 91 | msgctxt "mainmenu" 92 | msgid "Quit" 93 | msgstr "Salir" 94 | -------------------------------------------------------------------------------- /locale/et.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/eu.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/fi.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/fr.po: -------------------------------------------------------------------------------- 1 | # DAVE GNUKEM FRENCH 2 | # Copyright (C) 1995-2023 3 | # 4 | # SPDX-FileCopyrightText: 2023 Max le Fou 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2023-11-17 20:10+0200\n" 10 | "PO-Revision-Date: 2023-11-26 13:32+0100\n" 11 | "Last-Translator: Max le Fou \n" 12 | "Language-Team: French \n" 13 | "Language: fr\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 18 | "X-Generator: Lokalize 23.08.3\n" 19 | 20 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 21 | #. If a similar pun works in your language, feel free to use it. Otherwise, 22 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 23 | #: mainmenu.cpp:79 24 | msgctxt "mainmenu/start_new_game" 25 | msgid "Start gnu game" 26 | msgstr "Nouvelle partie" 27 | 28 | #: mainmenu.cpp:80 29 | msgctxt "mainmenu/restore_game" 30 | msgid "Restore game" 31 | msgstr "Charger une partie" 32 | 33 | #: mainmenu.cpp:81 34 | msgctxt "mainmenu/select_mission" 35 | msgid "Select Mission" 36 | msgstr "Choisir mission" 37 | 38 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 39 | #: mainmenu.cpp:83 40 | msgctxt "mainmenu/order_info" 41 | msgid "Ordering info" 42 | msgstr "Infos sur la commande" 43 | 44 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 45 | #: mainmenu.cpp:85 46 | msgctxt "mainmenu/not" 47 | msgid "(not!)" 48 | msgstr "(ou pas !)" 49 | 50 | #: mainmenu.cpp:86 51 | msgctxt "mainmenu/instructions" 52 | msgid "Instructions" 53 | msgstr "Mode d'emploi" 54 | 55 | #: mainmenu.cpp:87 56 | msgctxt "mainmenu/redefine_keys" 57 | msgid "Redefine keys" 58 | msgstr "Configurations des touches" 59 | 60 | #: mainmenu.cpp:88 61 | msgctxt "mainmenu/high_scores" 62 | msgid "High scores" 63 | msgstr "Meilleurs scores" 64 | 65 | #: mainmenu.cpp:89 66 | msgctxt "mainmenu/credits" 67 | msgid "Credits" 68 | msgstr "Crédits" 69 | 70 | #: mainmenu.cpp:90 71 | msgctxt "mainmenu/about" 72 | msgid "About" 73 | msgstr "A propos" 74 | 75 | #: mainmenu.cpp:91 76 | msgctxt "mainmenu/language" 77 | msgid "Choose language" 78 | msgstr "Choisir une langue" 79 | 80 | #: mainmenu.cpp:92 81 | msgctxt "mainmenu/settings" 82 | msgid "Settings" 83 | msgstr "Options" 84 | 85 | #: mainmenu.cpp:93 86 | msgctxt "mainmenu/settings_retro" 87 | msgid "Retro Settings" 88 | msgstr "Options rétro" 89 | 90 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 91 | #: mainmenu.cpp:95 92 | msgctxt "mainmenu/dont_quit" 93 | msgid "Don't quit" 94 | msgstr "Ne pas quitter" 95 | 96 | #. Quit/exit the game 97 | #: mainmenu.cpp:97 98 | msgctxt "mainmenu/quit" 99 | msgid "Quit" 100 | msgstr "Quitter" 101 | 102 | -------------------------------------------------------------------------------- /locale/ga.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/gl.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/hr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/id.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/ig.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/is.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/it.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/lb.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/lt.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/lv.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /locale/mg.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # FIRST AUTHOR , YEAR. 4 | # 5 | #, fuzzy 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-11-24 05:15+0200\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=CHARSET\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: game.cpp:2644 20 | msgctxt "ingame" 21 | msgid "Health" 22 | msgstr "" 23 | 24 | #: game.cpp:2646 25 | msgctxt "ingame" 26 | msgid "Score" 27 | msgstr "" 28 | 29 | #: game.cpp:2648 30 | msgctxt "ingame" 31 | msgid "Firepower" 32 | msgstr "" 33 | 34 | #: game.cpp:2650 35 | msgctxt "ingame" 36 | msgid "Inventory" 37 | msgstr "" 38 | 39 | #: game.cpp:3208 40 | msgctxt "ingamemenu" 41 | msgid "Continue" 42 | msgstr "" 43 | 44 | #: game.cpp:3209 45 | msgctxt "ingamemenu" 46 | msgid "Save Game" 47 | msgstr "" 48 | 49 | #: game.cpp:3210 50 | msgctxt "ingamemenu" 51 | msgid "Restore Game" 52 | msgstr "" 53 | 54 | #: game.cpp:3211 55 | msgctxt "ingamemenu" 56 | msgid "Instructions" 57 | msgstr "" 58 | 59 | #: game.cpp:3212 60 | msgctxt "ingamemenu" 61 | msgid "Retro Settings" 62 | msgstr "" 63 | 64 | #: game.cpp:3223 65 | msgctxt "ingamemenu" 66 | msgid "Fullscreen" 67 | msgstr "" 68 | 69 | #: game.cpp:3226 70 | msgctxt "ingamemenu" 71 | msgid "Abort Game" 72 | msgstr "" 73 | 74 | #. TRANSLATORS: This is a pun on "Start new game". "Gnu" is an open-source reference. 75 | #. If a similar pun works in your language, feel free to use it. Otherwise, 76 | #. preferably translate as "Start new game", which has the advantage of being potentially more re-usable for other games 77 | #: mainmenu.cpp:79 78 | msgctxt "mainmenu/start_new_game" 79 | msgid "Start gnu game" 80 | msgstr "" 81 | 82 | #: mainmenu.cpp:80 83 | msgctxt "mainmenu/restore_game" 84 | msgid "Restore game" 85 | msgstr "" 86 | 87 | #: mainmenu.cpp:81 88 | msgctxt "mainmenu/select_mission" 89 | msgid "Select Mission" 90 | msgstr "" 91 | 92 | #. Humor menu item (but might not be if this is re-use in future for orderable games) 93 | #: mainmenu.cpp:83 94 | msgctxt "mainmenu/order_info" 95 | msgid "Ordering info" 96 | msgstr "" 97 | 98 | #. Humor menu item. TRANSLATORS: This is a negation of 'ordering info' (a joke menu item since it's open source) but also since it's a retro game, it's another retro 90s reference to 90's 'not!', while the joke 'Ordering info' menu item is there in the first place as a parody reference to the Shareware games like the original Duke Nukem we're parodying here, which had 'ordering info' 99 | #: mainmenu.cpp:85 100 | msgctxt "mainmenu/not" 101 | msgid "(not!)" 102 | msgstr "" 103 | 104 | #: mainmenu.cpp:86 105 | msgctxt "mainmenu/instructions" 106 | msgid "Instructions" 107 | msgstr "" 108 | 109 | #: mainmenu.cpp:87 110 | msgctxt "mainmenu/redefine_keys" 111 | msgid "Redefine keys" 112 | msgstr "" 113 | 114 | #: mainmenu.cpp:88 115 | msgctxt "mainmenu/high_scores" 116 | msgid "High scores" 117 | msgstr "" 118 | 119 | #: mainmenu.cpp:89 120 | msgctxt "mainmenu/credits" 121 | msgid "Credits" 122 | msgstr "" 123 | 124 | #: mainmenu.cpp:90 125 | msgctxt "mainmenu/about" 126 | msgid "About" 127 | msgstr "" 128 | 129 | #: mainmenu.cpp:91 130 | msgctxt "mainmenu/language" 131 | msgid "Choose language" 132 | msgstr "" 133 | 134 | #: mainmenu.cpp:92 135 | msgctxt "mainmenu/settings" 136 | msgid "Settings" 137 | msgstr "" 138 | 139 | #: mainmenu.cpp:93 140 | msgctxt "mainmenu/settings_retro" 141 | msgid "Retro Settings" 142 | msgstr "" 143 | 144 | #. Humor menu item. TRANSLATORS: Note this is/was meant to mean "Don't quit the game" (or "Don't exit the game") (not "Don't give up") i.e. it's a humor joke menu item that does nothing 145 | #: mainmenu.cpp:95 146 | msgctxt "mainmenu/dont_quit" 147 | msgid "Don't quit" 148 | msgstr "" 149 | 150 | #. Quit/exit the game 151 | #: mainmenu.cpp:97 152 | msgctxt "mainmenu/quit" 153 | msgid "Quit" 154 | msgstr "" 155 | -------------------------------------------------------------------------------- /src/block.cpp: -------------------------------------------------------------------------------- 1 | /********* 2 | block.cpp 3 | 4 | Copyright (C) 2000-2024 David Joffe 5 | *********/ 6 | #include "block.h" 7 | 8 | const char * block_type_names[TYPE_LASTONE+1] = 9 | { 10 | "Nothing", 11 | "Generic sprite/block", 12 | "(2)", 13 | "SoftSolid", 14 | "(4)", 15 | "Water", 16 | "Dust", 17 | "Lift", 18 | "Teleporter", 19 | "Rocket", 20 | "(10)", 21 | "Firepower", 22 | "Crumbling Floor", 23 | "Conveyor", 24 | "Letter", 25 | "Box", 26 | "(16)", 27 | "Pickup", 28 | "(18)", 29 | "PowerBoots", 30 | "Soda Can", 31 | "Full Health [Molecule]", 32 | "(22)", 33 | "Dynamite", 34 | "FlameThrow", 35 | "Key", 36 | "Door", 37 | "DoorActivator", 38 | "Fan", 39 | "AccessCard", 40 | "Antivirus", 41 | "Exit", 42 | "HeroStart", 43 | "Main Computer", 44 | "(34)", 45 | "Acme", 46 | "Balloon", 47 | "Spike", 48 | "CrawlerMonster", 49 | "Banana", 50 | "Camera", 51 | "SoftBlock", 52 | "(42)", 53 | "SpikeBall", 54 | "Robot", 55 | "Flying Robot", 56 | "Rabbit(ish)", 57 | "HighVoltage barrier", 58 | "Cannon-ish Thing", 59 | "Jumping Monster", 60 | "Dr Proton", 61 | "LastOne(UnusedNextID)"//51 62 | }; 63 | 64 | std::string GetBlockTypeName(EBlockType eType) 65 | { 66 | if ((int)eType < 0) return ""; 67 | if ((int)eType >= TYPE_LASTONE+1) return ""; 68 | 69 | return block_type_names[ eType ]; 70 | } 71 | -------------------------------------------------------------------------------- /src/block.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file block.h 3 | \brief Level block types 4 | \author David Joffe 5 | 6 | Copyright (C) 2000-2024 David Joffe 7 | */ 8 | #ifndef _BLOCK_H_ 9 | #define _BLOCK_H_ 10 | 11 | #include 12 | 13 | //! Block type enumeration (NB: If add more here, remember to also extend \ref block_type_names) 14 | enum EBlockType 15 | { 16 | TYPE_NOTHING = 0, 17 | TYPE_BLOCK,//[dj2018-01-22] 18 | TYPE_2, 19 | //! 03 Solid, but can come up from underneath 20 | TYPE_SOFTSOLID, 21 | TYPE_4, 22 | //! 05 Simple water effect [dj2017-08] 23 | TYPE_WATER, 24 | //! 06 Dust 25 | TYPE_DUST, 26 | //! 07 Lift 27 | TYPE_LIFT, 28 | //! 08 Teleporter 29 | TYPE_TELEPORTER, 30 | //! 09 Rocket [dj2017-08] 31 | TYPE_ROCKET, 32 | TYPE_10, 33 | //! 11 Firepower 34 | TYPE_FIREPOWER, 35 | //! 12 Crumbling floor (crumbles slightly explosively after hero walks on it a couple of times) [dj2017-07] 36 | TYPE_CRUMBLINGFLOOR, 37 | //! 13 Conveyor belt 38 | TYPE_CONVEYOR, 39 | //! 14 Letter (G,N,U,K,E,M) 40 | TYPE_LETTER, 41 | //! 15 Box that opens when shot 42 | TYPE_BOX, 43 | TYPE_16, 44 | //! 17 Generic pickup (food, points etc) 45 | TYPE_PICKUP, 46 | TYPE_18, 47 | //! 19 Power boots 48 | TYPE_POWERBOOTS, 49 | //! 20 Soda can 50 | TYPE_SODACAN, 51 | //! 21 Full health pickup (DN1 molecule) [dj2017-06-26] 52 | TYPE_FULLHEALTH, 53 | TYPE_22, 54 | //! 23 Dynamite 55 | TYPE_DYNAMITE, 56 | //! 24 Flame throw thingy 57 | TYPE_FLAMETHROW, 58 | //! 25 Key. Extra[0]==ID 59 | TYPE_KEY, 60 | //! 26 Door. Extra[0]==ID 61 | TYPE_DOOR, 62 | //! 27 Door activator. Extra[0]==ID 63 | TYPE_DOORACTIVATOR, 64 | //! 28 Fan 65 | TYPE_FAN, 66 | //! 29 Access card 67 | TYPE_ACCESSCARD, 68 | //! 30 Antivirus 69 | TYPE_ANTIVIRUS, 70 | //! 31 Level exit 71 | TYPE_EXIT, 72 | //! 32 Hero starting position 73 | TYPE_HEROSTART, 74 | //! 33 Main Computer 75 | TYPE_MAINCOMPUTER, 76 | TYPE_34, 77 | //! 35 Acme falling block 78 | TYPE_ACME, 79 | //! 36 Balloon 80 | TYPE_BALLOON, 81 | //! 37 Spike 82 | TYPE_SPIKE, 83 | //! 38 Monster - Green crawly thing 84 | TYPE_CRAWLER, 85 | //! 39 Banana 86 | TYPE_BANANA, 87 | //! 40 Security camera 88 | TYPE_CAMERA, 89 | //! 41 Solid block which disappears when gets shot 90 | TYPE_SOFTBLOCK, 91 | //! 42 Unused [This used to be TYPE_TEST (CTest) - reclaiming it and making it unused - dj2017-08] 92 | TYPE_42, 93 | //! 43 Bouncing spiked ball 94 | TYPE_SPIKEBALL, 95 | //! 44 Monster - Dumb robot 96 | TYPE_ROBOT, 97 | //! 45 Monster - Small flying robot that follows you slowly-ish [dj2017-06-30] 98 | TYPE_FLYINGROBOT, 99 | //! 46 Rabbit-equivalent (disclaimer: may or may not be a rabbit) [dj2017-07-29] 100 | TYPE_RABBIT, 101 | //! 47 High-voltage "barrier" that must be shot multiple times to destroy before hero can pass through. Touching it results in immediate death. 102 | TYPE_HIGHVOLTAGE, 103 | //! 48 Cannon-on-wheels-ish-type-thing 104 | TYPE_CANNON, 105 | //! 49 Jumping monster [dj2017-08] 106 | TYPE_JUMPINGMONSTER, 107 | //! 50 Dr Proton [dj2017-08] 108 | TYPE_DRPROTON, 109 | //! Highest used block value (UNUSED VALUE) 110 | TYPE_LASTONE 111 | }; 112 | 113 | //! Friendly strings for block types \ref EBlockType, used by editor. 114 | extern const char * block_type_names[TYPE_LASTONE+1]; 115 | 116 | //! Friendly strings for block types \ref EBlockType, used by editor. Gets the block_type_names value, but safer, as returns empty string if out of bounds. 117 | extern std::string GetBlockTypeName(EBlockType eType); 118 | 119 | #endif 120 | -------------------------------------------------------------------------------- /src/bullet.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | bullet.cpp 3 | 4 | Copyright (C) 2002-2024 David Joffe 5 | */ 6 | 7 | #include "config.h" 8 | #include "bullet.h" 9 | #include "djgraph.h" 10 | #include "graph.h" 11 | #include "mission.h" 12 | #include "thing.h" 13 | #ifdef djSPRITE_AUTO_DROPSHADOWS 14 | #include "graph.h"//DRAW_SPRITEA_SHADOW 15 | #endif 16 | 17 | CBullet::CBullet() 18 | { 19 | x = 0; 20 | y = 0; 21 | dx = 0; 22 | dy = 0; 23 | nAnim = 0; 24 | bDrawnOnce = false; 25 | eType = BULLET_HERO; 26 | } 27 | 28 | CBullet::~CBullet() 29 | { 30 | } 31 | 32 | void CBullet::Tick(float fDeltaTime_ms) 33 | { 34 | // NB, NOTE [dj2018-01] In theory the bullet move belongs in here, 35 | // but it's no longer in here due to refactoring - see the new 36 | // UpdateBullets() function. Could later try move things in here 37 | // but not a priority. 38 | nAnim = (nAnim+1)%4; 39 | } 40 | 41 | void CBullet::Draw(float fDeltaTime_ms) 42 | { 43 | // Draw 'fire animation' if just shot, else draw bullet 44 | if (bDrawnOnce) 45 | { 46 | //dj2019-07: The simplest/quickest/only way to understand all these offsets etc. for the sprites is to look at the sprite image: 47 | if (eType==BULLET_HERO) 48 | { 49 | #ifdef djSPRITE_AUTO_DROPSHADOWS 50 | DRAW_SPRITEA_SHADOW(pVisView, 51 | 5, 52 | nAnim, 53 | 1 + WORLDX2VIEW(x), 54 | 1 + WORLDY2VIEW(y)-4, 55 | BLOCKW,BLOCKH 56 | ); 57 | #endif 58 | djgDrawImageAlpha(pVisView, 59 | g_pCurMission->GetSpriteData(5)->m_pImage, 60 | /*bDrawnOnce ? */((nAnim)%16)*BLOCKW,// : (dx<0 ? 4 : 5)*16, 61 | 0, 62 | WORLDX2VIEW(x), 63 | WORLDY2VIEW(y)-4, 64 | BLOCKW, 65 | BLOCKH); 66 | } 67 | else 68 | { 69 | djgDrawImageAlpha(pVisView, 70 | g_pCurMission->GetSpriteData(5)->m_pImage, 71 | /*bDrawnOnce ? */0,// : (dx<0 ? 4 : 5)*16, 72 | /*bDrawnOnce ? */BLOCKH*2,// : ((0)/16)*16, 73 | WORLDX2VIEW(x), 74 | WORLDY2VIEW(y)-4, 75 | BLOCKW, 76 | BLOCKH); 77 | } 78 | } 79 | else 80 | { 81 | if (eType==BULLET_HERO) 82 | { 83 | djgDrawImageAlpha(pVisView, 84 | g_pCurMission->GetSpriteData(5)->m_pImage, 85 | (dx<0 ? 4 : 5)*BLOCKW, 86 | 0, 87 | //? why the offset here?(dj2019-07) 88 | WORLDX2VIEW(dx < 0 ? x - 16 : x + 16), 89 | // why -4? seems a fudgy offset to fudge-offset another offset that's wrong elsewhere? not sure - check - dj2019-07 90 | WORLDY2VIEW(y)-4, 91 | BLOCKW, 92 | BLOCKH); 93 | } 94 | else 95 | { 96 | djgDrawImageAlpha(pVisView, 97 | g_pCurMission->GetSpriteData(5)->m_pImage, 98 | (dx<0 ? 4 : 5)*BLOCKW, 99 | 0, 100 | WORLDX2VIEW(x), 101 | WORLDY2VIEW(y)-4, 102 | BLOCKW, 103 | BLOCKH); 104 | } 105 | } 106 | 107 | bDrawnOnce = true; 108 | } 109 | -------------------------------------------------------------------------------- /src/bullet.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file bullets.h 3 | \brief Bullet class 4 | \author David Joffe 5 | 6 | Copyright (C) 2002-2024 David Joffe 7 | */ 8 | #ifndef _BULLET_H_ 9 | #define _BULLET_H_ 10 | 11 | // In DG1 bullet is 16x8, but we let this scale up/down if using different custom blocksize. 12 | #define BULLET_WIDTH BLOCKW 13 | #define BULLET_HEIGHT HALFBLOCKH 14 | 15 | class CBullet 16 | { 17 | public: 18 | enum EType 19 | { 20 | BULLET_HERO, 21 | BULLET_MONSTER 22 | }; 23 | CBullet(); 24 | virtual ~CBullet(); 25 | 26 | virtual void Tick(float fDeltaTime_ms); 27 | virtual void Draw(float fDeltaTime_ms); 28 | 29 | int x; // World (pixel) X coordinate 30 | int y; // World (pixel) Y coordinate 31 | int dx; 32 | int dy; 33 | bool bDrawnOnce; 34 | int nAnim; 35 | EType eType; 36 | }; 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /src/console.cpp: -------------------------------------------------------------------------------- 1 | //Copyright (C) 1995-2025 David Joffe / Dave Gnukem project 2 | // 3 | //dj2022-11 just refactoring crude simple console message (or ingame message) stuff into own .h/cpp 4 | //[low prio thoughts]: Not quite sure if this is a 'console' or a 'game message' and maybe in future there might be two distint things (in-game messages vs an actual console where e.g. one might type commands say) 5 | 6 | // Note the phrase 'console' here is not to be confused with 'console command line text output' of the application e.g. stout/stderr 7 | // Here we are talking about a 'console' in the sense of a 'console message' or 'in-game message' (e.g. "You picked up the key" or "You died" or "You won the game" etc) 8 | 9 | /*--------------------------------------------------------------------------*/ 10 | #include "config.h" 11 | #include "console.h" 12 | 13 | //Very simple pseudo 'console message' [dj2016-10] 14 | //dj2022-11 some small refactoring 15 | 16 | std::string djConsoleMessage::m_sMsg; 17 | float djConsoleMessage::m_fTimer = 0.f; 18 | 19 | void djConsoleMessage::SetConsoleMessage(const std::string& sMsg) 20 | { 21 | m_sMsg = sMsg; 22 | m_fTimer = 0.f;// Reset timer 23 | } 24 | 25 | void djConsoleMessage::Update(float fDeltaTime) 26 | { 27 | if (m_sMsg.empty()) return; 28 | 29 | // Display message for about ~2s then it disappears (though m_fTimer and fDeltaTime are in milliseconds) 30 | m_fTimer += fDeltaTime; 31 | if (m_fTimer >= 2200.f) 32 | { 33 | m_sMsg.clear(); 34 | m_fTimer = 0.f; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/console.h: -------------------------------------------------------------------------------- 1 | //Copyright (C) 1995-2025 David Joffe / Dave Gnukem project 2 | // 3 | //dj2022-11 just refactoring crude simple console message (or ingame message) stuff into own .h/cpp 4 | //[low prio thoughts]: Not quite sure if this is a 'console' or a 'game message' and maybe in future there might be two distint things (in-game messages vs an actual console where e.g. one might type commands say) 5 | 6 | /*--------------------------------------------------------------------------*/ 7 | #ifndef _dj_CONSOLE_H_ 8 | #define _dj_CONSOLE_H_ 9 | 10 | #include "config.h" 11 | 12 | //dj todo low - const char* rather? hmm debatable 13 | #include 14 | 15 | //Very simple pseudo 'console message' [dj2016-10] 16 | //dj2022-11 some small refactoring 17 | 18 | class djConsoleMessage 19 | { 20 | public: 21 | static void SetConsoleMessage(const std::string& sMsg); 22 | // fDT = floating point deltatime [milliseconds] 23 | static void Update(float fDeltaTime); 24 | 25 | // Internal timer to help control how long the message will be displayed (in milliseconds) 26 | static float m_fTimer; 27 | static std::string m_sMsg; 28 | }; 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /src/credits.cpp: -------------------------------------------------------------------------------- 1 | /********* 2 | credits.cpp 3 | 4 | Copyright (C) 1999-2024 David Joffe 5 | *********/ 6 | 7 | #include // for NULL 8 | #include "djtypes.h" 9 | #include "credits.h" 10 | #include "menu.h" 11 | #include "graph.h" 12 | 13 | djImage *pImageCredits = NULL; 14 | 15 | // todo this should just be a generic "DoOK" or "DoDialog" or something? 16 | const struct SMenuItem creditsMenuItems[] = 17 | { 18 | { false, " " }, 19 | { true, " OK " }, 20 | { false, " " }, 21 | { false, "" } 22 | }; 23 | unsigned char creditsMenuCursor[] = { 128, 129, 130, 131, 0 }; 24 | CMenu creditsMenu ( "credits.cpp:creditsMenu" ); 25 | 26 | void InitCredits() 27 | { 28 | // Load credits bitmap 29 | pImageCredits = new djImage; 30 | pImageCredits->Load(djDATAPATHc(DATAFILE_IMG_CREDITS)); 31 | djCreateImageHWSurface( pImageCredits ); 32 | 33 | creditsMenu.setSize ( 0 ); 34 | creditsMenu.setItems ( creditsMenuItems ); 35 | creditsMenu.setMenuCursor (creditsMenuCursor); 36 | creditsMenu.setClrBack( djColor(0,0,0) ); 37 | creditsMenu.setXOffset (240); 38 | creditsMenu.setYOffset (92); 39 | } 40 | 41 | void KillCredits() 42 | { 43 | djDestroyImageHWSurface(pImageCredits); 44 | djDEL(pImageCredits); 45 | } 46 | 47 | void ShowCredits() 48 | { 49 | // First time? 50 | if ( !pImageCredits ) 51 | InitCredits(); 52 | 53 | // Display credits bitmap 54 | djgDrawImage( pVisBack, pImageCredits, 0, 0, pImageCredits->Width(), pImageCredits->Height() ); 55 | GraphFlip(true); 56 | 57 | // Pop up credits menu 58 | do_menu( &creditsMenu ); 59 | } 60 | -------------------------------------------------------------------------------- /src/credits.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file credits.h 3 | \brief Credits screen 4 | \author David Joffe 5 | 6 | Copyright (C) 1999-2024 David Joffe 7 | */ 8 | #ifndef _CREDITS_H_ 9 | #define _CREDITS_H_ 10 | 11 | //! Show credits screen 12 | extern void ShowCredits(); 13 | extern void KillCredits(); 14 | 15 | //! Credits "skin" (image file) 16 | #define DATAFILE_IMG_CREDITS "credits.tga" 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /src/datadir.cpp: -------------------------------------------------------------------------------- 1 | //Copyright (C) 1995-2024 David Joffe 2 | // 3 | 4 | //dj2022-11 adding datadir.cpp to corresponding to old datadir.h to extend this functionality 5 | //dj2022-11 Adding new helper djDataDir() (and corresponding set) to make this more flexible (e.g. make it easier either for porters to override, or add functionality like checking fallback folders - e.g. check /usr/share but if not found e.g. check relative say to the executable path) 6 | 7 | #include "config.h" 8 | #include "datadir.h" 9 | 10 | #include 11 | 12 | // [dj2022-11] Slightly experimental but the idea here is to set the default g_sDataDir based on the DATA_DIR (which e.g. comes from Makefile) but this allows dynamic overriding (or selecting fallbacks) 13 | // NOTE we don't currently 'expose' this g_sDataDir (for now?) as it's sort of the 'backend' - use the get/set functions below 14 | std::string g_sDataDir = DATA_DIR; 15 | 16 | const char* djDataDir() 17 | { 18 | //if (g_sDataDir.empty()) 19 | // g_sDataDir = DATA_DIR; 20 | 21 | return g_sDataDir.c_str(); 22 | } 23 | 24 | const std::string& djDataDirS() 25 | { 26 | return g_sDataDir; 27 | } 28 | 29 | void djSetDataDir(const char* szDataDir) 30 | { 31 | if (szDataDir==nullptr) 32 | g_sDataDir.clear(); 33 | else 34 | g_sDataDir = szDataDir; 35 | 36 | if (!g_sDataDir.empty() && g_sDataDir.back() != '/') 37 | g_sDataDir += '/'; // add trailing slash if not present? 38 | } 39 | 40 | void djDATAPATH(std::string& sStr, const char* szPathToAppend) 41 | { 42 | sStr = g_sDataDir; 43 | // todo append trailing slash if not present 44 | if (szPathToAppend != nullptr) 45 | sStr += szPathToAppend; 46 | } 47 | 48 | std::string djDATAPATH(const char* szPathToAppend) 49 | { 50 | std::string sStr = g_sDataDir; 51 | // todo append trailing slash if not present 52 | if (szPathToAppend != nullptr) 53 | sStr += szPathToAppend; 54 | return sStr; 55 | } 56 | 57 | std::string djDATAPATH(const std::string& sPathToAppend) 58 | { 59 | return g_sDataDir + sPathToAppend; 60 | } 61 | -------------------------------------------------------------------------------- /src/datadir.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file datadir.h 3 | \brief Data directory 4 | \author David Joffe 5 | 6 | Copyright (C) 1999-2024 David Joffe 7 | */ 8 | //dj2022-11 adding datadir.cpp to corresponding to old datadir.h to extend this functionality 9 | //dj2022-11 Adding new helper djDataDir() (and corresponding set) to make this more flexible (e.g. make it easier either for porters to override, or add functionality like checking fallback folders - e.g. check /usr/share but if not found e.g. check relative say to the executable path) 10 | 11 | // TODO maybe make this an actual potential list of paths, so on initialization it can e.g. go through several of specified options and select one that exists? 12 | // e.g. "/usr/local/share/blahblah;data/;gnukem_data/" 13 | // Then one could still pass the above in a Makefile or whatever .. also we could make it passable by commandline maybe e.g. "--datadir=XXXX" 14 | // also should have some way to maybe say 'check relative to executable path'? 15 | // e.g. "/usr/local/share/blahblah;data/;gnukem_data/;{execpath}data/;" 16 | // ALSO for Mac we need it to be able to specify e.g. things like: 17 | // "/Applications/DaveGnukem.app/Contents/Resources/data" etc. 18 | // but if running dev mode should look locally e.g. "data/" or whatever 19 | 20 | // also [low] in future mabye want mlutiple datapaths? eg specify different datapath for eg music or something? not sure. [low prio definitely not needed now] 21 | 22 | #include 23 | 24 | #ifndef _dj_DATADIR_H_ 25 | #define _dj_DATADIR_H_ 26 | 27 | //! Data directory [dj2017-08 should this move to config.h?] 28 | #ifndef DATA_DIR 29 | #define DATA_DIR "data/" 30 | #endif 31 | 32 | //[dj2022-11] 33 | extern const char* djDataDir(); 34 | // [I use a different name to above as I we don't want function overloading with the same signature but differing return type especially when the return type is potentially ambiguously matchable] 35 | extern const std::string& djDataDirS(); 36 | 37 | //[dj2022-11] 38 | extern void djSetDataDir(const char* szDataDir); 39 | 40 | //dj2022-11 datadir path append helpers 41 | extern void djDATAPATH(std::string& sStr, const char* szPathToAppend); 42 | extern std::string djDATAPATH(const char* szPathToAppend); 43 | extern std::string djDATAPATH(const std::string& sPathToAppend); 44 | 45 | #define djDATAPATHc(sPathToAppend) djDATAPATH(sPathToAppend).c_str() 46 | #define djDATAPATHs(sPathToAppend) djDATAPATH(sPathToAppend) 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /src/davegnukem.cfg: -------------------------------------------------------------------------------- 1 | KeyAction=273 2 | KeyLeft=276 3 | KeyRight=275 4 | KeyJump=305 5 | KeyShoot=307 6 | -------------------------------------------------------------------------------- /src/djfile.h: -------------------------------------------------------------------------------- 1 | //Copyright (C) 1995-2024 David Joffe / Dave Gnukem project 2 | // 3 | //dj2022-11 refactoring some file stuff into new djfile.h/cpp and maybe adding some more file- and path-related helpers and maybe some 4 | 5 | // [dj2022-11] fixing these etc. on my win32 visual studio build system .. 6 | // "warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead" 7 | // "warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead" 8 | // 9 | // https://learn.microsoft.com/en-us/cpp/c-runtime-library/secure-template-overloads?view=msvc-170 10 | 11 | /*--------------------------------------------------------------------------*/ 12 | #ifndef _dj_DJFILE_H_ 13 | #define _dj_DJFILE_H_ 14 | 15 | #include "config.h" 16 | 17 | // [dj2022-11] want safer versions of file-related functions where available 18 | #ifdef __STDC_LIB_EXT1__ 19 | #define __STDC_WANT_LIB_EXT1__ 1 20 | #endif 21 | 22 | #if defined(WIN32) && defined(_MSC_VER) 23 | #ifndef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 24 | #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 25 | #endif 26 | #endif// {{ Windows / Microsoft compiler }} 27 | 28 | #if defined(WIN32) && defined(_MSC_VER) 29 | #define djHAVE_SAFER_FUNCTIONS 30 | #elif __STDC_LIB_EXT1__ 31 | #define djHAVE_SAFER_FUNCTIONS 32 | #endif 33 | 34 | #include 35 | 36 | class djFile 37 | { 38 | public: 39 | // Returns 0 on success, else sets pFile to nullptr and returns an error code 40 | static int dj_fopen_s(FILE** ppFile, const char* szFilename, const char* szMode); 41 | 42 | static FILE* dj_fopen(const char* szFilename, const char* szMode); 43 | }; 44 | 45 | 46 | // these globals should probably not be globals [low] 47 | 48 | extern bool djFolderExists(const char* szPath); 49 | extern bool djFileExists(const char* szPath); 50 | extern bool djEnsureFolderTreeExists(const char* szPath); 51 | 52 | 53 | // some of these feel a little gross and arbitrary, rethink a little some of these 'helpers' .. it's a start though 54 | 55 | // [dj2022-11] This feels slightly dodgy to me like I feel like on some platforms this might just not compile .. 56 | #ifdef djHAVE_SAFER_FUNCTIONS 57 | #define dj_fscanf fscanf_s 58 | #define dj_sscanf sscanf_s 59 | // From https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/fscanf-s-fscanf-s-l-fwscanf-s-fwscanf-s-l?view=msvc-170 : 60 | // "the more secure functions require the size in characters of each c, C, s, S, and [ type field to be passed as an argument immediately following the variable" 61 | // but NB note also we get: warning C4477: 'fscanf_s' : format string '%s' requires an argument of type 'unsigned int', but variadic argument 2 has type 'size_t' 62 | #define dj_fscanf_intline(pStream, nInt) fscanf_s((pStream), "%d\n", &nInt) 63 | #define dj_fscanf_int(pStream, nInt) fscanf_s((pStream), "%d", &nInt) 64 | #define dj_fscanf_line(pStream, szBuf) fscanf_s((pStream), "%s\n", szBuf, (unsigned int)sizeof(szBuf)) 65 | #else 66 | #define dj_fscanf fscanf 67 | #define dj_sscanf sscanf 68 | #define dj_fscanf_intline(pStream,nInt) fscanf(pStream, "%d\n", &nInt) 69 | #define dj_fscanf_int(pStream,nInt) fscanf(pStream, "%d", &nInt) 70 | #define dj_fscanf_line(pStream, szBuf) fscanf((pStream), "%s\n", szBuf) 71 | #endif 72 | 73 | #endif 74 | -------------------------------------------------------------------------------- /src/djgamelib.h: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------*/ 2 | // This is just here for convenience 3 | // [dj2022-11 not a fan of this type of convenience helper anymore as over years can lead to slow compiles as projects get larger etc. .. only include what you need when you need it] 4 | /*--------------------------------------------------------------------------*/ 5 | /* 6 | #include "djgraph.h" 7 | #include "djimage.h" 8 | #include "djinput.h" 9 | #include "djlog.h" 10 | #include "djsound.h" 11 | #include "djstring.h" 12 | #include "djtime.h" 13 | #include "djtypes.h" 14 | */ 15 | /*--------------------------------------------------------------------------*/ 16 | -------------------------------------------------------------------------------- /src/djimageload.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file djimageload.h 3 | \brief Image load/save helpers 4 | \author David Joffe 5 | */ 6 | /*--------------------------------------------------------------------------*/ 7 | #ifndef _DJIMAGELOAD_H_ 8 | #define _DJIMAGELOAD_H_ 9 | 10 | class djImage; 11 | 12 | // loaders should be separate file? tho needs access to procected members - either a friend class, or e.g. maybe rather just expose protected members with set variables etc. 13 | // should we bother or just transition to sdl_image etc.? 14 | // (dj2022 note: Our TGA image loading code literally harkens from the 90s and was some of the earliest game code, and also because we were on LibSDL1 for a long time we just stuck with it .. I felt for a long time maybe once we're on SDL2 we could start maybe using e.g. libsdl_image to load more modern formats like .png which offer mainly compression) 15 | class djImageLoad 16 | { 17 | public: 18 | static int LoadImage(djImage* pImg, const char *szFilename); 19 | static djImage* LoadImage(const char *szFilename); 20 | }; 21 | 22 | #endif -------------------------------------------------------------------------------- /src/djlang.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file djlang.h 3 | \brief Localization / languages 4 | \author David Joffe 5 | 6 | Copyright (C) 2024 David Joffe 7 | */ 8 | 9 | //#include 10 | 11 | /* 12 | //dj2023-11 to generate initial strings, do something like: 13 | cd src 14 | xgettext --force-po -c -C *.cpp -o ../lang/locale/en.po 15 | */ 16 | 17 | 18 | //--------------------------------------------------------------------------- 19 | #ifndef _dj_LANG_H_ 20 | #define _dj_LANG_H_ 21 | //--------------------------------------------------------------------------- 22 | 23 | //--------------------------------------------------------------------------- 24 | //extern std::string g_sCurLang; 25 | //--------------------------------------------------------------------------- 26 | 27 | void djSelectLanguage(const char* szNewLang="en"); 28 | // Doesn't return nullptr always returns a string 29 | const char* djGetLanguage(); 30 | 31 | class djLang 32 | { 33 | public: 34 | // Returns true if translations are enabled and a language for localization is selected 35 | static bool DoTranslations(); 36 | 37 | // 1=left-to-right, -1=right-to-left (e.g. Arabic "ar" or Hebrew "he"). Cached value for speed and update the value only when lang code changes 38 | // Return value negative means right to left language e.g. Hebrew or Arabic 39 | static int GetCurLangDirection(); 40 | // 1=left-to-right, -1=right-to-left (e.g. Arabic "ar" or Hebrew "he") 41 | // Return value negative means right to left language e.g. Hebrew or Arabic 42 | static int GetLangDirection(const char* szCode, int nLen=-1); 43 | }; 44 | //--------------------------------------------------------------------------- 45 | #endif 46 | //--------------------------------------------------------------------------- 47 | -------------------------------------------------------------------------------- /src/djlog.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | djlog.cpp 3 | 4 | Copyright (C) 1998-2024 David Joffe 5 | */ 6 | 7 | #include "config.h" 8 | #include "djlog.h" 9 | -------------------------------------------------------------------------------- /src/djlog.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file djlog.h 3 | \brief Debugging message "trace" helpers 4 | \author David Joffe 5 | 6 | modified by Vytautas Shaltenis, a.k.a. rtfb 7 | 8 | Copyright (C) 1998-2024 David Joffe 9 | */ 10 | /*--------------------------------------------------------------------------*/ 11 | #ifndef _DJLOG_H_ 12 | #define _DJLOG_H_ 13 | 14 | #define TRACE SYS_Debug 15 | #define djMSG SYS_Debug 16 | 17 | #include "sys_error.h" 18 | 19 | /* 20 | #if defined(DEBUG) || defined(NDEBUG) || defined(_DEBUG) 21 | #define TRACE log_message 22 | #else 23 | #define TRACE ;; 24 | #endif 25 | */ 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /src/djpoly.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2024 David Joffe 3 | djpoly.cpp 4 | 5 | Template polygon class (ordered vector of points, for example to represent a polygon) 6 | */ 7 | #include "djpoly.h" 8 | -------------------------------------------------------------------------------- /src/djpoly.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2024 David Joffe 3 | djpoly.h 4 | 5 | Template polygon class (ordered vector of points, for example to represent a polygon) 6 | */ 7 | #pragma once 8 | #ifndef DJPOLY_H 9 | #define DJPOLY_H 10 | 11 | #include "djvec2d.h" 12 | #include 13 | 14 | template 15 | class djVecList { 16 | public: 17 | std::vector> vecList; 18 | 19 | djVecList() {} 20 | }; 21 | 22 | #endif // DJPOLY_H 23 | -------------------------------------------------------------------------------- /src/djrect.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 1995-2024 David Joffe 3 | djrect.cpp 4 | 5 | Template rectangle class 6 | */ 7 | #include "djrect.h" 8 | -------------------------------------------------------------------------------- /src/djrect.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 1995-2024 David Joffe 3 | djrect.h 4 | 5 | Template rectangle class 6 | */ 7 | #pragma once 8 | #ifndef _DJRECT_H_ 9 | #define _DJRECT_H_ 10 | 11 | // For performance reasons we may want an initialized version of this for graphics stuff? Should we (for safety so programmers are aware) give it a name that indicates such? [low] 12 | template 13 | class djRect { 14 | public: 15 | T x; 16 | T y; 17 | T w; 18 | T h; 19 | 20 | djRect() : x(0), y(0), w(0), h(0) {} 21 | djRect(T x, T y, T w, T h) : x(x), y(y), w(w), h(h) {} 22 | }; 23 | 24 | typedef djRect djRectI; 25 | typedef djRect djRectF; 26 | typedef djRect djRectD; 27 | 28 | #endif // _DJRECT_H_ 29 | -------------------------------------------------------------------------------- /src/djsound.h: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------*/ 2 | // djsound.h 3 | // 4 | // Sound interface 5 | // 6 | // Copyright (C) 1999-2024 David Joffe 7 | /*--------------------------------------------------------------------------*/ 8 | #ifndef _DJSOUND_H_ 9 | #define _DJSOUND_H_ 10 | /*--------------------------------------------------------------------------*/ 11 | 12 | typedef unsigned int SOUND_HANDLE; 13 | #define SOUNDHANDLE_INVALID ((unsigned int)~0) 14 | 15 | //gross globals .. 16 | 17 | extern int djSoundInit(); 18 | extern void djSoundDone(); 19 | extern void djSoundEnable(); 20 | extern void djSoundDisable(); 21 | extern bool djSoundEnabled(); 22 | extern SOUND_HANDLE djSoundLoad( const char *szFilename ); 23 | extern bool djSoundPlay( SOUND_HANDLE iHandle/*, bool bLoop=false*/ ); 24 | 25 | //! Get current volume [0..128] 26 | extern int djSoundGetVolume(); 27 | //! Set current volume setting [0..128] 28 | extern void djSoundSetVolume(int nVolume,bool bApply); 29 | //! Return true if volume change occurred (for purposes of e.g. on-screen message display or whatever) 30 | extern bool djSoundAdjustVolume(int nDiff); 31 | 32 | #endif 33 | -------------------------------------------------------------------------------- /src/djsprite.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | djsprite.cpp 3 | 4 | Copyright (C) 1998-2024 David Joffe 5 | */ 6 | 7 | #include "config.h" 8 | #include "djsprite.h" 9 | #include "djimage.h" 10 | #include "djimageload.h" 11 | 12 | //--------------------------------------------------------------------------- 13 | 14 | bool djSprite::LoadSpriteImage( const char * szFilename, int nSpriteW, int nSpriteH ) 15 | { 16 | m_pImage=nullptr; 17 | m_nSpritesX = 0; 18 | m_nSpritesY = 0; 19 | m_nSpriteW = 0; 20 | m_nSpriteH = 0; 21 | 22 | if (szFilename==nullptr||szFilename[0]==0) 23 | return false; 24 | 25 | m_pImage = djImageLoad::LoadImage( szFilename ); 26 | if (m_pImage==nullptr) 27 | return false; 28 | 29 | m_nSpriteW = nSpriteW; 30 | m_nSpriteH = nSpriteH; 31 | m_nSpritesX = (m_pImage->Width() / m_nSpriteW); 32 | m_nSpritesY = (m_pImage->Height() / m_nSpriteH); 33 | 34 | return true; 35 | } 36 | 37 | //--------------------------------------------------------------------------- 38 | -------------------------------------------------------------------------------- /src/djsprite.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file djsprite.h 3 | \brief Helper 4 | \author David Joffe 5 | 6 | Copyright (C) 1998-2024 David Joffe 7 | */ 8 | /*--------------------------------------------------------------------------*/ 9 | #ifndef _DJSPRITE_H_ 10 | #define _DJSPRITE_H_ 11 | 12 | class djImage; 13 | 14 | //---------------------------------------------------------------------------- 15 | // Should this be renamed spritegrid? 16 | // This corresponds to a single physical image (for now, or maybe always .. depends how this evolves in future) 17 | class djSprite 18 | { 19 | public: 20 | djSprite() { } 21 | virtual ~djSprite() { } 22 | 23 | virtual bool LoadSpriteImage( const char * szFilename, int nSpriteW, int nSpriteH ); 24 | virtual djImage* GetImage() { return m_pImage; } 25 | 26 | virtual bool IsLoaded() const { return m_pImage!=nullptr; } 27 | 28 | int GetSpriteW() const { return m_nSpriteW; } 29 | int GetSpriteH() const { return m_nSpriteH; } 30 | 31 | int GetNumSpritesX() const { return m_nSpritesX; } 32 | int GetNumSpritesY() const { return m_nSpritesY; } 33 | 34 | djImage* m_pImage=nullptr; 35 | 36 | //! Number of actual sprites on horizontal axis, this is derived automatically when loading the image 37 | int m_nSpritesX=0; 38 | //! Number of actual sprites on vertical axis, this is derived automatically when loading the image 39 | int m_nSpritesY=0; 40 | int m_nSpriteW=0; 41 | int m_nSpriteH=0; 42 | }; 43 | //---------------------------------------------------------------------------- 44 | #endif 45 | -------------------------------------------------------------------------------- /src/djstring.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file djstring.h 3 | \brief Some string helper functions 4 | \author David Joffe 5 | 6 | Copyright (C) 1998-2024 David Joffe 7 | */ 8 | /*--------------------------------------------------------------------------*/ 9 | #ifndef _DJSTRING_H_ 10 | #define _DJSTRING_H_ 11 | 12 | #include 13 | 14 | //! Make a deep copy of string. Must be deleted with "delete[]". 15 | extern char * djStrDeepCopy( const char * src ); 16 | //! Make a deep copy of string. Must be deleted with "delete[]". 17 | extern char * djStrDup( const char * src ); 18 | extern char * djStrDeepCopy( const char * src, int n ); 19 | 20 | //! Convert string in-place to uppercase 21 | extern void djStrToLower( char * str ); 22 | 23 | //! For returning sections of strings using given delimiters. i is 1-based 24 | //! eg djStrPart("a,b;c,d", 3, ",;") should return "c" 25 | //! You are responsible for deleting the string it returns 26 | extern char * djStrPart( const char *str, int i, const char *delim ); 27 | 28 | 29 | 30 | // Some quick n dirty file/path helpers [dj2017-08] 31 | 32 | extern void djAppendPathS(std::string& sPath,const char* szAppend); 33 | extern void djAppendPath(char* szPath,const char* szAppend); 34 | extern std::string djAppendPathStr(const char* szBase,const char* szAppend); 35 | 36 | 37 | // This doesn't belong in djstring.h[dj2018-03] 38 | extern std::string djGetFolderUserSettings(); 39 | 40 | extern std::string djIntToString(int n); 41 | 42 | //! Strip newline character from string (to handle both UNIX and stupid DOS text file formats) 43 | extern void djStripCRLF(char* buf); 44 | 45 | #endif 46 | -------------------------------------------------------------------------------- /src/djtime.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file djtime.h 3 | \brief Some timing functions 4 | \author David Joffe 5 | 6 | Copyright (C) 1999-2024 David Joffe 7 | */ 8 | #ifndef _DJTIME_H_ 9 | #define _DJTIME_H_ 10 | 11 | #include //uint64_t 12 | 13 | //! Initialize the time system 14 | extern void djTimeInit(); 15 | 16 | //! Shut down the time system 17 | extern void djTimeDone(); 18 | 19 | //! return time of day in seconds 20 | //! return time since djTime started in seconds 21 | extern float djTimeGetTime(); 22 | 23 | //! dj2022-11 new helper return ticks in milliseconds since start of app (depending on SDL version, if at least 2.0.18, should solve 49-day wraparound on Windows) 24 | extern uint64_t djTimeGetTicks64(); 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /src/djtypes.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | djtypes.cpp 3 | 4 | Copyright (C) 2002-2024 David Joffe 5 | 6 | */ 7 | 8 | #include "config.h"//hmm should the 'gamelib' parts have a 'dependency' up to the main "config.h"? not sure? or their own config.h maybe. 9 | #include "djtypes.h" 10 | 11 | -------------------------------------------------------------------------------- /src/djtypes.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file djtypes.h 3 | \brief Basic types and macros 4 | \author David Joffe 5 | 6 | Copyright (C) 1998-2024 David Joffe 7 | 8 | Try keep this file as 'small and light as possible' with few includes a reasonably pragmatically possible.. 9 | Also some of these names are just itching to clash with other projects in global namespace .. starting to change some of them to reduce risk .. dj2022-11 10 | */ 11 | 12 | #ifndef _DJTYPES_H_ 13 | #define _DJTYPES_H_ 14 | 15 | /*! 16 | \class djColor 17 | \nosubgrouping 18 | 19 | Basic color type. Consists of four single-byte members for red, green, blue and 20 | alpha (values ranging each from 0 to 255). 21 | */ 22 | class djColor 23 | { 24 | public: 25 | djColor() : r(0), g(0), b(0), a(255) { } 26 | djColor(unsigned char ir, unsigned char ig, unsigned char ib) 27 | : r(ir), g(ig), b(ib), a(255) { } 28 | djColor(unsigned char ir, unsigned char ig, unsigned char ib, unsigned char ia) 29 | : r(ir), g(ig), b(ib), a(ia) { } 30 | 31 | // [dj2016-10] These were 'unsigned short' which is [now] 16-bit, I'm not 100% sure if these were somewhere along the way of the code history 'intended' 32 | // to be 16-bit, or if maybe when I started back in the 90s a short was 8-bit or something, I don't know (it's possible as early dev target for this game was 16-bit); 33 | // changing this to 'byte' to get rid of some compiler warnings and to make it consistent with the class documentation (which says 'byte' for RGBA etc.) - have 34 | // checked through all uses of djColor and didn't immediately see anything that should break. 35 | 36 | unsigned char r; 37 | unsigned char g; 38 | unsigned char b; 39 | unsigned char a; 40 | }; 41 | 42 | 43 | //! Make 16 bit integer from low and high 8-bit components 44 | #define MAKEINT16(lo,hi) ((lo) | ((hi)<<8)) 45 | 46 | 47 | //! Helper for "delete" operator that also sets the pointer to null for safety to help avoid dangling pointers 48 | #define djDEL(x) if (x) { delete (x); x = NULL; } 49 | 50 | //! Helper for "delete[]" operator that also sets the pointer to null for safety to help avoid dangling pointers 51 | #define djDELV(x) if (x) { delete[] (x); x = NULL; } 52 | 53 | //! Return true if point (x,y) is (inclusively) inside the rectangle (x1, y1, x2, y2) 54 | #define INBOUNDS(x,y,x1,y1,x2,y2) ( (x)>=(x1) && (x)<=(x2) && (y)>=(y1) && (y)<=(y2) ) 55 | 56 | //! Return true if value x is in the range [x1, x2] 57 | #define INBOUNDS2(x,x1,x2) ( (x)>=(x1) && (x)<=(x2) ) 58 | 59 | //! Test if rectangle (x0, y0, x1, y1) overlaps rectangle (x2, y2, x3, y3) 60 | #define OVERLAPS(x0,y0,x1,y1,x2,y2,x3,y3) ( (!( ((x0)<(x2) && (x1)<(x2)) || ((x0)>(x3) && (x1)>(x3)) || ((y0)<(y2) && (y1)<(y2)) || ((y0)>(y3) && (y1)>(y3)) )) ) 61 | 62 | //! Return smaller of (a, b) 63 | #define djMIN(a,b) ((a) < (b) ? (a) : (b)) 64 | 65 | //! Return larger of (a, b) 66 | #define djMAX(a,b) ((a) > (b) ? (a) : (b)) 67 | 68 | //! Return val clamped to within the range [a, b], where a <= b 69 | #define djCLAMP(val,a,b) ( (val) < (a) ? (a) : ( (val) > (b) ? (b) : (val) ) ) 70 | 71 | 72 | #ifndef djABS 73 | //! Return absolute value of (a) 74 | #define djABS(a) ((a) < 0 ? -(a) : (a)) 75 | #endif 76 | 77 | // [dj2022-11] is 'SGN' useful enough to be herre? probaby not .. 78 | 79 | //! Return -1 if (a) is negative or 1 if a is positive 80 | #define djSGN(a) ((a) < 0 ? -1 : 1) 81 | 82 | #ifndef NULL 83 | #ifdef __cplusplus 84 | #define NULL 0 85 | #else 86 | #define NULL ((void *)0) 87 | #endif 88 | #endif 89 | 90 | #endif 91 | -------------------------------------------------------------------------------- /src/djutf8.h: -------------------------------------------------------------------------------- 1 | // Copyright (C) 2022-2024 David Joffe / Dave Gnukem project 2 | // 3 | //dj2022-11-30 new utf8 helper(s) (and possibly later other encoding or string conversion helpers or wrappers if/as needed in future) 4 | //NB Design-wise this is conceptually part of the generic reusable code so shouldn't have dependencies to any Dave Gnukem specific parts of the codebase 5 | 6 | /*--------------------------------------------------------------------------*/ 7 | #ifndef _DJUTF8_H_ 8 | #define _DJUTF8_H_ 9 | #include "config.h" 10 | 11 | //! Simple utf8 string iterator (pass over characters in multi-byte and variable-length-byte utf8 encoding and return 32-bit Unicode codepoint in c) 12 | extern int djutf8iterate(const char* sz, unsigned int uLen, int& c); 13 | 14 | //! Encode a single 32-bit Unicode character codepoint as utf8 and store into buffer szBufUTF8, appending at uLen and incrementing uLen depending on how many characters it must append to the buffer. NB! Doesn't add null-terminator. NB doesn't do any safety-checks, this is just meant to be 'fast and unsafe' - so make sure the buffer you pass is long enough. 15 | //! If we ever have to do insane amounts of text such that it becomes a bottleneck then this should perhaps be inlined also but doesn't seem likely at this stage. 16 | extern void djutf8_encode(unsigned int nUnicodeChar32, char *szBufUTF8, int &uLen); 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /src/djvec2d.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2023-2024 David Joffe 3 | djvec2d.cpp 4 | 5 | Template 2D vector class 6 | */ 7 | #include "djvec2d.h" 8 | 9 | // Implementation of the template class should be in the header file 10 | -------------------------------------------------------------------------------- /src/djvec2d.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2024 David Joffe 3 | djvec2d.h 4 | 5 | Template 2D vector class 6 | */ 7 | #pragma once 8 | #ifndef _DJVEC2D_H_ 9 | #define _DJVEC2D_H_ 10 | 11 | template 12 | class djVec2d { 13 | public: 14 | T x; 15 | T y; 16 | 17 | djVec2d() : x(0), y(0) {} 18 | djVec2d(T x, T y) : x(x), y(y) {} 19 | }; 20 | 21 | typedef djVec2d djVec2dI; 22 | typedef djVec2d djVec2dF; 23 | typedef djVec2d djVec2dD; 24 | 25 | #endif // _DJVEC2D_H_ 26 | -------------------------------------------------------------------------------- /src/docs/DesignNotes.md: -------------------------------------------------------------------------------- 1 | # Source Code Design Notes 2 | 3 | Source files starting with "dj" are intended to indicate code that is part of the potentially re-usable parts of the codebase, that could potentially be re-used for other games or applications (one could think of these parts almost as a library or mini- basic engine/framework), for example djimage.h/cpp is design-wise general, not game-specific, and potentially re-usable. 4 | 5 | (Although the code doesn't currently 100% neatly stick to this due its long and winding history and origins, that's one of the design intentions and directions/goals.) 6 | 7 | ## Abbreviations used in the code 8 | 9 | * ed: Editor 10 | * djg: "dj game" (David Joffe game), the earliest working title for the game around ~1993-ish before it had a proper name 11 | 12 | -------------------------------------------------------------------------------- /src/docs/openbsd/BUILD.md: -------------------------------------------------------------------------------- 1 | # Building on OpenBSD 2 | 3 | ## Install dependencies 4 | ```sh 5 | $ doas pkg_add git gmake sdl2-gfx sdl2-image sdl2-mixer sdl2-ttf 6 | ``` 7 | 8 | ## Get a copy of the code 9 | ```sh 10 | $ git clone https://github.com/davidjoffe/dave_gnukem 11 | $ cd dave_gnukem 12 | $ git clone https://github.com/davidjoffe/gnukem_data 13 | ``` 14 | 15 | ## Build 16 | ```sh 17 | $ gmake -f Makefile.bsd 18 | ``` 19 | 20 | ## Running 21 | ```sh 22 | $ ./davegnukem 23 | ``` 24 | 25 | ## As an alternative to building yourself, install the package 26 | ```sh 27 | $ doas pkg_add gnukem 28 | ``` 29 | -------------------------------------------------------------------------------- /src/ed.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 1998-2024 David Joffe 3 | New level editor started: 1998/12/31 4 | */ 5 | 6 | #include "config.h" 7 | #include "ed.h" 8 | #include "ed_spred.h" 9 | #include "ed_lvled.h" 10 | #include "ed_common.h" 11 | #include "ed_DrawBoxContents.h" 12 | #include "sys_error.h" 13 | 14 | #include // printf: DEBUG 15 | 16 | #include "game.h" 17 | //#include "level.h" 18 | 19 | //dj2022-11 removing the 'static' here somehow seems to have fixed Visual Studio internal compiler error kept getting :/ probably a compiler bug 20 | switch_e switch_to = SWITCH_NONE; 21 | 22 | 23 | void EditorMainLoop (); 24 | 25 | 26 | 27 | void ED_Main () 28 | { 29 | printf ( "ED_Main() start\n" ); // DEBUG 30 | 31 | // init everything 32 | ED_CommonInit (); 33 | 34 | // jump to main looop 35 | EditorMainLoop (); 36 | 37 | // deinit everything 38 | ED_CommonKill (); 39 | 40 | printf ( "ED_Main() end\n" ); // DEBUG 41 | } 42 | 43 | 44 | 45 | /* 46 | =============================== 47 | EditorMainLoop 48 | 49 | Handles switches among different edit modes. 50 | =============================== 51 | */ 52 | void EditorMainLoop() 53 | { 54 | while ( 1 ) 55 | { 56 | switch ( switch_to ) 57 | { 58 | case SWITCH_NONE: // TODO: put some error message here 59 | { 60 | SYS_Error ( "EditorMainLoop: SWITCH_NONE hit!\n" ); 61 | break; 62 | } 63 | case SWITCH_SPRED: 64 | { 65 | SPRED_Init(); 66 | switch_e eNewMode = SPRED_MainLoop(); 67 | SwitchMode( eNewMode ); 68 | //SPRED_Kill(); 69 | break; 70 | } 71 | case SWITCH_LVLED: 72 | { 73 | LVLED_Init(GetCurrentLevel()); 74 | 75 | switch_e eNewMode = LVLED_MainLoop(); 76 | SwitchMode(eNewMode); 77 | 78 | LVLED_Kill(); 79 | 80 | //DJ2017-06-19 THERE'S SOME SORT OF SERIOUS BUG HERE .. this isn't right .. when we exit the level editor we immediately continue with that 'heartbeat' 81 | // processing, however, we've destroyed everything during PerLevelSetup(), so we're basically playing one frame out with corrupted/deleted 82 | // /dangling objects, or something along those lines. I'm not sure if that's directly the cause of the subsequent font corruption in 83 | // subsequent level editor invocations or if that is something separate/different. Need more testing. 84 | // We had a similar problem recently with the "Dying in the pungee sticks will often cause a crash" issue, which was fixed - I think 85 | // this is basically along the lines of the same sort of problem, so look at how we solved it there also. 86 | // dj2017-06-20 I think the above turned out to be a texture manager issue, 87 | // and should be fixed now. 88 | // However, I replaced this PerLevelSetup() with a call in the return to 89 | // RestartLevel(), which I think is probably more 'correct' anyway? 90 | //PerLevelSetup(); 91 | break; 92 | } 93 | case SWITCH_EXIT: 94 | { 95 | return; 96 | break; // for clarity :) 97 | } 98 | } 99 | } 100 | } 101 | 102 | 103 | 104 | void SwitchMode ( switch_e new_mode ) 105 | { 106 | switch_to = new_mode; 107 | DBC_OnSwitchMode ( new_mode ); 108 | } 109 | 110 | -------------------------------------------------------------------------------- /src/ed.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __EDITOR_STUFF_H__ 3 | #define __EDITOR_STUFF_H__ 4 | 5 | 6 | enum switch_e 7 | { 8 | SWITCH_NONE = 0, // error 9 | //! Sprite editor: 10 | SWITCH_SPRED, 11 | //! Level editor: 12 | SWITCH_LVLED, 13 | SWITCH_EXIT//, // exit edit mode 14 | 15 | //NUM_SWITCHES 16 | }; 17 | 18 | 19 | void SwitchMode ( switch_e new_mode ); 20 | void ED_Main (); 21 | 22 | 23 | #endif // #ifndef __EDITOR_STUFF_H__ 24 | 25 | -------------------------------------------------------------------------------- /src/ed_DrawBoxContents.cpp: -------------------------------------------------------------------------------- 1 | // Dave Gnukem level editor 2 | 3 | /* 4 | TODO: 5 | (-) Find out what the hell is going on here with 6 | editor-dependancy. I know that it should draw box 7 | contents in different places for LVLED and SPRED, 8 | but that difference in what does it draw looks silly 9 | for me. 10 | 11 | // dj2022-11 not sure anymore who wrote above question? not me but yes someday clean this stuff up a bit 12 | */ 13 | 14 | #include "config.h" 15 | #include "ed_DrawBoxContents.h" 16 | #include "ed_common.h" 17 | #include "block.h" 18 | 19 | #include // printf: DEBUG 20 | 21 | 22 | // !!!!!!!!!!!!!!! 23 | // if these two change, change them in ed_spred.cpp too!!! 24 | // sprite editor position 25 | #define DBC_POS_SPRITES_X 0 26 | #define DBC_POS_SPRITES_Y 272 27 | // !!!!!!!! 28 | 29 | // level editor positon 30 | #define DBC_POS_LEVELSPRITES_X 0 31 | #define DBC_POS_LEVELSPRITES_Y 336 32 | 33 | // drawboxcontents(?) 'offset x' and 'offset y' (may be different depending on whether we're in level editor or sprite editor) 34 | int g_dbc_drawposx = 0, g_dbc_drawposy = 0; 35 | 36 | void DBC_DrawBoxContents () 37 | { 38 | // sprite a and b values (a is the selected spriteset index, b is the selected sprite index in that spriteset) 39 | const int dbc_a = ED_GetCurrSpriteSet (); // FIXME: may be a bug in LVLED 40 | const int dbc_b = ED_GetCurrSprite (); 41 | 42 | const int nType = ED_GetSpriteType ( dbc_a, dbc_b ); 43 | if (nType==TYPE_BOX) 44 | { 45 | ED_DrawString(g_dbc_drawposx + 16*16 - 48, g_dbc_drawposy+16*8, "Box:"); 46 | // If it's e.g. a box try show what's in the box ('c' and 'd' values which are analogous to the 'a' and 'b values above to reference the sprite info for what's in the box): 47 | const int c = ED_GetSpriteExtra(dbc_a, dbc_b, 10); 48 | const int d = ED_GetSpriteExtra(dbc_a, dbc_b, 11); 49 | ED_DrawSprite(g_dbc_drawposx + 16*16 - 16, g_dbc_drawposy+16*8, c, d); 50 | } 51 | else 52 | { 53 | ED_DrawStringClear(g_dbc_drawposx + 16*16 - 48, g_dbc_drawposy+16*8, "Box: "); 54 | ED_DrawStringClear(g_dbc_drawposx + 16*16 - 48, g_dbc_drawposy+16*8+8, "Box: "); 55 | } 56 | } 57 | 58 | 59 | 60 | void DBC_OnSwitchMode ( switch_e mode ) 61 | { 62 | printf ( "switching editor mode...\n" ); 63 | switch ( mode ) 64 | { 65 | case SWITCH_SPRED: 66 | { 67 | printf ( "sprite editor...\n" ); 68 | // set draw position (different if in sprite editor vs level editor) for this 69 | g_dbc_drawposx = DBC_POS_SPRITES_X; 70 | g_dbc_drawposy = DBC_POS_SPRITES_Y; 71 | break; 72 | } 73 | case SWITCH_LVLED: 74 | { 75 | printf ( "level editor...\n" ); 76 | // set draw position (different if in sprite editor vs level editor) for this 77 | g_dbc_drawposx = DBC_POS_LEVELSPRITES_X; 78 | g_dbc_drawposy = DBC_POS_LEVELSPRITES_Y; 79 | break; 80 | } 81 | default: 82 | break; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/ed_DrawBoxContents.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __ED_DRAW_BOX_CONTENTS_H__ 3 | #define __ED_DRAW_BOX_CONTENTS_H__ 4 | 5 | #include "ed.h" 6 | 7 | //dj2022-11 hm "DBC" sounds like something esoteric/complex but I assume just stands for 'drawboxcontents' though this is part of someone else's refactoring of my original ed_standalone_original stuff and could maybe use a bit of refactoring/cleanup and re-thinking here and there) 8 | 9 | void DBC_DrawBoxContents (); 10 | void DBC_OnSwitchMode ( switch_e mode ); 11 | 12 | #endif // #ifndef __ED_DRAW_BOX_CONTENTS_H__ 13 | -------------------------------------------------------------------------------- /src/ed_common.h: -------------------------------------------------------------------------------- 1 | // Copyright (C) 1995-2024 David Joffe 2 | #pragma once 3 | #ifndef __EDITOR_COMMON_STUFF_H__ 4 | #define __EDITOR_COMMON_STUFF_H__ 5 | #include 6 | 7 | // !!!!!!!!!!! 8 | // If these two change, change them in ed_DrawBoxContents too!!! 9 | #define POS_SPRITES_X 0 10 | #define POS_SPRITES_Y 272 11 | // !!!!!!!!! 12 | 13 | 14 | //! Set or clear 'unsaved-changes' statue on the document (level being edited) 15 | extern void SetDocumentDirty(bool bDirty=true); 16 | 17 | class djColor; // forward 18 | 19 | 20 | 21 | void ED_CommonInit (); 22 | void ED_CommonKill (); 23 | 24 | 25 | int ED_GetCurrSprite (); 26 | /* 27 | ==================== 28 | ED_IncCurrSprite 29 | 30 | increments current sprite by `amount', which may also 31 | be negative, then it decrements, of course. Returns a new value 32 | of current sprite. 33 | ==================== 34 | */ 35 | int ED_IncCurrSprite ( int amount ); 36 | int ED_GetCurrSpriteSet (); 37 | int ED_SetCurrSpriteSet ( int new_spriteset ); 38 | /* 39 | ==================== 40 | ED_IncCurrSpriteSet 41 | 42 | increments current spriteset by `amount', which may also 43 | be negative, then it decrements, of course. Returns a new value 44 | of current spriteset. 45 | ==================== 46 | */ 47 | int ED_IncCurrSpriteSet ( int amount ); 48 | 49 | 50 | /* 51 | ============================================================= 52 | Common Stuff 53 | ============================================================= 54 | */ 55 | // Actual drawers (relate on djg*): 56 | void ED_DrawSprite( int x, int y, int a, int b ); 57 | // void ED_DrawSprites(); 58 | void ED_ClearScreen(); 59 | 60 | // dj2024 not really clear to me why editor NEEDS its own special drawstring ultimately - should combine and consolidate with reusable helpers in djgraph? 61 | 62 | //! Editor draw-string helper 63 | void ED_DrawString( int x, int y, const std::string& sStr ); 64 | //! Editor draw-string helper for pre background clear 65 | void ED_DrawStringClear( int x, int y, const std::string& sStr ); 66 | 67 | // 2nd level drawers/visual-related: 68 | //void ED_DrawBoxContents(); 69 | 70 | 71 | void ED_FlipBuffers (); 72 | 73 | 74 | 75 | // 3rd level drawers (depend on 2nd level drawers): 76 | /* 77 | ==================== 78 | ED_SetSprite 79 | ==================== 80 | */ 81 | //void ED_SetSprite( int ispritenew ); 82 | void ED_SetSprite( int ispritenew, int ox, int oy ); 83 | void ED_SetSpriteSet ( int ispritesetnew ); 84 | 85 | 86 | 87 | 88 | // "show"-functions: 89 | void ED_SpriteShowType( bool bClear ); // DrawString, DrawBoxContents. 90 | // refers to sprite as an object, 91 | // not as a sprite editor. hence, 92 | // it is common function 93 | void ED_SpriteShowExtra( int i ); // DrawString 94 | // refers to sprite as an object, 95 | // not as a sprite editor. hence, 96 | // it is common function 97 | 98 | 99 | 100 | // accessors (needed for both SPRED and LVLED): 101 | int ED_GetSpriteType( int spriteset, int sprite ); 102 | int ED_GetSpriteExtra( int spriteset, int sprite, int i ); 103 | void ED_SetSpriteExtra( int spriteset, int sprite, int i, int value ); 104 | void ED_SetSpriteType( int spriteset, int sprite, int value ); 105 | djColor& ED_GetSpriteColor( int a, int b ); 106 | 107 | 108 | 109 | // misc: 110 | void ED_LevelFill( int ax, int ay ); // what does this do?? 111 | void ED_LevelSet( int x, int y, int a, int b, bool bforeground ); // // in ed.cpp 112 | 113 | #endif // #ifndef __EDITOR_COMMON_STUFF_H__ 114 | 115 | -------------------------------------------------------------------------------- /src/ed_lvled.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __EDITOR_LEVEL_ED_H__ 3 | #define __EDITOR_LEVEL_ED_H__ 4 | 5 | #include "ed.h" 6 | 7 | 8 | 9 | extern void LVLED_Init(int curr_level); 10 | extern void LVLED_Kill(); 11 | 12 | 13 | extern switch_e LVLED_MainLoop(); 14 | extern bool LVLED_GetLevelFore(); 15 | 16 | 17 | #endif // #ifndef __EDITOR_LEVEL_ED_H__ 18 | 19 | -------------------------------------------------------------------------------- /src/ed_macros.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __MACROS_H__ 3 | #define __MACROS_H__ 4 | 5 | #include 6 | #include 7 | 8 | // Macro stuff 9 | struct SMacro 10 | { 11 | SMacro():szName(NULL){}; 12 | char *szName; 13 | std::vector m_aiBlocks[4]; 14 | }; 15 | 16 | extern int g_iAssignedMacros[9]; // Keys 1 to 9 to place assigned macros 17 | extern std::vector g_apMacros; 18 | extern bool blevelfore; // in ed.cpp 19 | 20 | //void level_set( int x, int y, int a, int b, bool bforeground ); 21 | //void DrawString( int x, int y, char *szStr ); // in ed.cpp 22 | //void DrawStringClear( int x, int y, char *szStr ); // in ed.cpp 23 | 24 | bool LoadMacros(); 25 | bool DeleteMacros(); 26 | void PlaceMacro(int x, int y, int iMacroIndex); 27 | void ShowMacros(); 28 | 29 | #define MACROS_X 270 30 | 31 | 32 | #endif // #ifndef __MACROS_H__ 33 | 34 | -------------------------------------------------------------------------------- /src/ed_spred.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __EDITOR_SPRITE_ED_H__ 3 | #define __EDITOR_SPRITE_ED_H__ 4 | 5 | #include "ed.h" 6 | 7 | 8 | 9 | 10 | 11 | void SPRED_Init (); 12 | void SPRED_Kill (); 13 | 14 | 15 | /* 16 | ============================================================= 17 | Sprite Editor Stuff 18 | ============================================================= 19 | */ 20 | 21 | switch_e SPRED_MainLoop (); 22 | 23 | 24 | #endif // #ifndef __EDITOR_SPRITE_ED_H__ 25 | 26 | -------------------------------------------------------------------------------- /src/hiscores.dat: -------------------------------------------------------------------------------- 1 | 0 2 | -------------------------------------------------------------------------------- /src/hiscores.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file hiscores.h 3 | \brief High score list 4 | \author David Joffe 5 | 6 | Copyright (C) 2000-2024 David Joffe 7 | */ 8 | /*--------------------------------------------------------------------------*/ 9 | #ifndef _HISCORES_H_ 10 | #define _HISCORES_H_ 11 | 12 | //! Default high score list file 13 | #define USERFILE_HIGHSCORES "hiscores.dat" 14 | 15 | //! Maximum size of high score list 16 | #define MAX_HIGHSCORES 12 17 | 18 | /* 19 | class CHighScoreList 20 | { 21 | public: 22 | */ 23 | //! A single entry on the high score list 24 | struct SScore 25 | { 26 | SScore(); 27 | 28 | //! Adding 'set' helper function that's safer [dj2022-11] 29 | void SetName(const char* szNameNew); 30 | 31 | //! Person's name for high score list entry (dj2022-11 note: if we assume later we try globalized Unicode support then perhaps this would become utf8, so 'effective length' may be shorter than this length of a person's name in that case as it's multibyte so just keep that in mind, but as of 2022/11 we don't support Unicode) 32 | char szName[1024] = { 0 }; 33 | //! Score achieved 34 | int nScore = 0; 35 | }; 36 | /* 37 | protected: 38 | }; 39 | */ 40 | 41 | // per-application init/kill for highscore system 42 | extern void InitHighScores(); 43 | extern void KillHighScores(); 44 | 45 | 46 | //! High-scores background "skin" (image file) 47 | #define DATAFILE_IMG_HIGHSCORES "hiscores.tga" 48 | //! Display high scores 49 | extern void ShowHighScores(); 50 | 51 | //! Load high scores from given file 52 | extern bool LoadHighScores(const char *szFilename/*=USERFILE_HIGHSCORES*/); 53 | //! Save high scores to given file 54 | extern bool SaveHighScores(const char *szFilename/*=USERFILE_HIGHSCORES*/); 55 | 56 | //! Test if the given score will make the high score list 57 | extern bool IsNewHighScore(int nScore); 58 | //! Add a new entry to the list, automatically sorted. Before calling this, use IsNewHighScore() to see if you should. 59 | extern void AddHighScore(const char *szName, int nScore); 60 | 61 | //! Get high score at a particular index. Always succeeds if index is in range [0, MAX_HIGHSCORES) 62 | extern void GetHighScore(int nIndex, SScore &Score); 63 | 64 | 65 | #endif 66 | -------------------------------------------------------------------------------- /src/installer/gnukem.iss: -------------------------------------------------------------------------------- 1 | ; Script generated by the Inno Script Studio Wizard. 2 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 3 | 4 | ; dj2022-11 added new fullscreen shortcut 5 | 6 | #define MyAppName "Dave Gnukem" 7 | #define MyAppNameFullscreen "Dave Gnukem (Fullscreen)" 8 | #define MyAppVersion "1.0.3" 9 | #define MyAppPublisher "TshwaneDJe" 10 | #define MyAppURL "https://djoffe.com/gnukem" 11 | #define MyAppExeName "DaveGnukem.exe" 12 | 13 | [Setup] 14 | ; NOTE: The value of AppId uniquely identifies this application. 15 | ; Do not use the same AppId value in installers for other applications. 16 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 17 | AppId={{E801DB1B-1597-466B-A80B-3F70D5368B78} 18 | AppName={#MyAppName} 19 | AppVersion={#MyAppVersion} 20 | ;AppVerName={#MyAppName} {#MyAppVersion} 21 | AppPublisher={#MyAppPublisher} 22 | AppPublisherURL={#MyAppURL} 23 | AppSupportURL={#MyAppURL} 24 | AppUpdatesURL={#MyAppURL} 25 | DefaultDirName={pf}\{#MyAppName} 26 | DefaultGroupName={#MyAppName} 27 | InfoBeforeFile=C:\src\gnukem\README.md 28 | OutputDir=C:\src\gnukem\src\installer 29 | OutputBaseFilename=Dave_Gnukem_Setup 30 | UninstallDisplayIcon={app}\{#MyAppExeName} 31 | SetupIconFile=C:\src\gnukem\data\icon\application_icon.ico 32 | Compression=lzma 33 | SolidCompression=yes 34 | 35 | [Languages] 36 | Name: "english"; MessagesFile: "compiler:..\..\src\gnukem\src\installer\GnukemEnglish.isl" 37 | 38 | [Tasks] 39 | Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked 40 | Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 41 | 42 | [Files] 43 | Source: "C:\src\gnukem\src\installer\ApplicationFolder\DaveGnukem.exe"; DestDir: "{app}"; Flags: ignoreversion 44 | Source: "C:\src\gnukem\src\installer\ApplicationFolder\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs 45 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files 46 | 47 | [Icons] 48 | Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" 49 | Name: "{group}\{#MyAppNameFullscreen}"; Filename: "{app}\{#MyAppExeName}"; Parameters: "-f" 50 | Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" 51 | Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 52 | Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon 53 | 54 | [Run] 55 | Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 56 | Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppNameFullscreen, '&', '&&')}}"; Flags: nowait postinstall skipifsilent unchecked; Parameters: "-f" 57 | 58 | -------------------------------------------------------------------------------- /src/instructions.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file instructions.h 3 | \brief Instructions screen 4 | \author David Joffe 5 | 6 | Copyright (C) 1999-2024 David Joffe 7 | */ 8 | /*--------------------------------------------------------------------------*/ 9 | #ifndef _INSTRUCTIONS_H_ 10 | #define _INSTRUCTIONS_H_ 11 | 12 | //! Show instructions screen 13 | extern void ShowInstructions(); 14 | extern void ShowAbout(); 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /src/inventory.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file inventory.h 3 | \brief The hero's inventory 4 | \author David Joffe 5 | 6 | Copyright (C) 2001-2024 David Joffe 7 | */ 8 | 9 | #include "config.h" 10 | #include 11 | 12 | ///\name Inventory functions 13 | //@{ 14 | 15 | class CThing; 16 | 17 | #define INV_MAXSIZE 10 18 | 19 | //! Clear the inventory out at beginning of level. Some objects 20 | //! may remain in inventory, such as power boots. 21 | extern void InvClear(); 22 | //! When we advance to next level, all stored objects become "persisent", 23 | //! i.e. we can't lose them just by dying. 24 | extern void InvMakeAllPersistent(); 25 | //! Empty the inventory out completely, deleting all objects. 26 | extern void InvEmpty(); 27 | //! Add an item to the inventory. Return false if failed (e.g. if inventory full) 28 | extern bool InvAdd(CThing *pThing); 29 | //! Draw the inventory 30 | extern void InvDraw(); 31 | //! Get number of items in inventory 32 | extern int InvGetSize(); 33 | //! Get item at index n 34 | extern CThing *InvGetItem(int n); 35 | //! Remove (and delete) an item from the inventory 36 | extern void InvRemove(CThing *pThing); 37 | 38 | //! Save inventory to file for save-game (only saves items marked as persistent) 39 | extern void InvSave(FILE *pOut); 40 | //! Load game: load inventory 41 | extern bool InvLoad(FILE *pIn); 42 | 43 | 44 | //@} 45 | -------------------------------------------------------------------------------- /src/keys.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file keys.h 3 | \brief Game keys 4 | \author David Joffe 5 | 6 | Copyright (C) 2001-2024 David Joffe 7 | 8 | We want these headers as small and light as possible, not including lots of stuff, for fast compile speeds. 9 | 10 | 09/2001 11 | */ 12 | #ifndef _KEYS_H_ 13 | #define _KEYS_H_ 14 | 15 | //! Game key indices. NB NB if you add more here, also change g_aszKeys! 16 | enum 17 | { 18 | KEY_ACTION = 0, 19 | KEY_LEFT, 20 | KEY_RIGHT, 21 | KEY_JUMP, 22 | KEY_SHOOT, 23 | KEY_NUM_MAIN_REDEFINABLE_KEYS 24 | }; 25 | 26 | //! Main redefinable game keys (e.g. SDLK_LEFT) 27 | extern int g_anKeys[KEY_NUM_MAIN_REDEFINABLE_KEYS]; 28 | //! Game key descriptions 29 | extern const char *g_aszKeys[KEY_NUM_MAIN_REDEFINABLE_KEYS]; 30 | 31 | //! Initialise game key system 32 | extern void InitialiseGameKeySystem(); 33 | 34 | 35 | // dj2022-11 A few off-the-cuff thoughts on "IsGameKey()" and "std::vector g_anValidGameKeys": 36 | // (1) I don't remember exactly the thinking behind having some specific closed list of so-called 'valid game keys' and I wonder if it's really a 37 | // good idea to have this 'restriction' in the code as it may make porting to special platforms (e.g. maybe consoles with special custom scancodes 38 | // for keys) a bit more difficult? But maybe there was some good reason - I don't know remember this was written long ago. 39 | // I guess some keys we may want to avoid using but not sure what's the best way (though maybe porters to other platforms could have a configurable file with custom scancodes or something they could add somewhere etc.) 40 | // (2) A vector is 'std::vector g_anValidGameKeys' is a bad performance choice, but, it seems it's "only" used in redefining the keys so not a priority 41 | 42 | 43 | //! Return true if given key is an allowable game-play key 44 | extern bool IsGameKey(int nKeyCode); 45 | // Is there really a good reason for this function to exist? [dj2023-11] 46 | // I don't remember exactly why/what etc. but it looks like it's used during redefining keys 47 | // But, looks like a good way to possibly exclude potentially important (and maybe new) keycodes for niche platforms e.g. retro handhelds 48 | // Why not just accept any keycode during redefining? This could at best be used to check for supported ones to display correctly or something 49 | // and then have some fallback code e.g. if some platform returns a new 'unknown' keycode just show the keycode and allow it to be defined and used in the game? 50 | // but 51 | // I mean, then instead of a vector, maybe an unordered_map (unordered for faster lookups) that just map keycode to name 52 | // and then we don't exclude any key accepted during redefining OR playing, but just do something like: 53 | // if (map.find(nkeyCode)!=map.end()) 54 | // sKeyName = map[nKeyCode]; 55 | // else 56 | // sKeyName = std::string("<") + std::to_string(nkeyCode) + ">"; 57 | // e.g. if you press Up then it displays "Up" but if an unknown keycode comes in from some future or niche device still accept it 58 | // but just display e.g. "<143>" or whatever the internal code is. 59 | // Or am I remembering wrong why this is here? I wrote this really long ago 60 | // The above would also be more 'future-proof' e.g. say in a few years new keyboards come out with lots of new keycode, or 61 | // different languages or something - or odd joysticks or mice that map arbitrary keycodes - make this 'future-proof' so 62 | // it automatically supports anything, and not have a moving target we have to chase to keep adding so-called 'valid' keys. 63 | // If SDL_input stuff sends a keycode it's surely "valid" whether we have it this list 64 | // If there are keycodes we should explicitly not allow redefining in a game (are there? I don't think so) then rather 65 | // have an 'IsInvalidGameKey' with an exclusion list (or just take this out entirely and allow anything, unless it causes problems) 66 | 67 | 68 | //! Store current game keys into the settings object 69 | extern void StoreGameKeys(); 70 | 71 | //! Helper to check if the given (SDL) keycode has been assigned to a game action under 'redefine keys' 72 | extern bool IsGameKeyAssigned(int nKeyCode); 73 | 74 | #endif 75 | -------------------------------------------------------------------------------- /src/loadedlevel.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | \file loadedlevel.cpp 3 | \brief Some data and metadata of current level being played or loaded for editor 4 | \author David Joffe 5 | 6 | Copyright (C) 1995-2024 David Joffe 7 | */ 8 | /*--------------------------------------------------------------------------*/ 9 | // Refactoring some stuff from game.h/cpp and extending .. 10 | /*--------------------------------------------------------------------------*/ 11 | 12 | #include "config.h" 13 | #include "loadedlevel.h" 14 | #include "djimage.h" 15 | #include "djsprite.h" 16 | 17 | //--------------------------------------------------------------------------- 18 | tsLoadedLevel g_Level; 19 | //--------------------------------------------------------------------------- 20 | 21 | -------------------------------------------------------------------------------- /src/loadedlevel.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file loadedlevel.h 3 | \brief Some data and metadata of current level being played or loaded for editor 4 | \author David Joffe 5 | 6 | Copyright (C) 1995-2024 David Joffe 7 | */ 8 | /*--------------------------------------------------------------------------*/ 9 | // Refactoring some stuff from game.h and extending .. 10 | /*--------------------------------------------------------------------------*/ 11 | #ifndef _LOADEDLEVEL_H_ 12 | #define _LOADEDLEVEL_H_ 13 | 14 | #include 15 | #include "djrect.h" // Include the rectangle template class 16 | //#include "config.h" 17 | 18 | // Forward declarations (don't include actual headers here for compile speed reasons etc.) 19 | class djImage; 20 | class djSprite; 21 | 22 | struct tsLoadedLevel 23 | { 24 | //djSprite* pSkinGame; // Main game view skin (while playing) 25 | //djSprite* pBackground = nullptr; // Level background image 26 | // Main game backing sprite (while playing) - new [dj2023-11] 27 | djSprite* pBack1 = nullptr; 28 | djSprite* Back1() const { return pBack1; } 29 | 30 | // Vector of rectangles (specific case of polygons, but slightly faster collision detection if we do it this way) for collision detection [dj2024] 31 | // NB this was not used in the main version 1 Dave Gnukem release, it's a possible new feature for the 2024 or later versions 32 | std::vector collisionRects; 33 | //std::vector collisionPolys; 34 | 35 | // For speed reasons an extra copy of pBack1->GetImage() (if loaded) or nullptr if not 36 | djImage* pImgBack1 = nullptr; 37 | //djImage* ImgBack1() const { return pBack1!=nullptr && pBack1->IsLoaded() ? pBack1->GetImage() : nullptr; } 38 | djImage* ImgBack1() const { return pImgBack1; } 39 | }; 40 | 41 | //--------------------------------------------------------------------------- 42 | extern tsLoadedLevel g_Level; 43 | //--------------------------------------------------------------------------- 44 | 45 | #endif 46 | -------------------------------------------------------------------------------- /src/localization/djgettext.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file djgettext.h 3 | \brief Localization / languages: gettext() and pgettext() etc. 4 | \author David Joffe 5 | 6 | Copyright (C) 1995-2024 David Joffe 7 | */ 8 | //#include "../config.h" 9 | 10 | // dj2023-11 for now disabling LoadAllPOFiles as it's causing issues on older C++ on some platforms (and not really needed yet anyway) 11 | 12 | #define djLOCALIZE_ON 13 | #define djLOCALIZE_USE_OWN 14 | 15 | ////#define djLOCALIZE_USE_GETTEXT 16 | 17 | #ifdef djLOCALIZE_ON 18 | 19 | #ifdef djLOCALIZE_USE_OWN 20 | 21 | #include 22 | 23 | // TO KEEP IN MIND - we may want multiple sets of translations 24 | 25 | // Either have our own here, or use 3rd party e.g. gettext lib ... 26 | //const char* pgettext(const char* /*context*/, const char* msgid); 27 | //const char* npgettext(const char* /*context*/, const char* msgid_singular, const char* msgid_plural, unsigned long n); 28 | // The names of these are so they work xgettext etc. (see https://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html) 29 | extern std::string gettext(const std::string& msgID); 30 | extern std::string pgettext(const std::string& contextStr, const std::string& msgID); 31 | extern std::string select_locale(const std::string& lang); 32 | extern std::string djGetText_GetLang(); 33 | //extern std::string bindcurrentdomain(const std::string& lang); 34 | extern void loadPOFile(const std::string& filename, const std::string& lang); 35 | 36 | //extern void LoadAllPOFiles(const std::string& sPath); 37 | 38 | #else 39 | 40 | // Add the necessary include code for gettext headers 41 | #include 42 | 43 | #endif//djLOCALIZE_USE_OWN 44 | 45 | #else//#ifdef djLOCALIZE_ON 46 | // If localization is not enabled we want simple stubs/wrappers to just return the passed-in strings e.g.: 47 | // pgettext("mainmenu", "Exit"); => return "Exit" 48 | 49 | #include 50 | std::string select_locale(const std::string& lang); 51 | //extern void LoadAllPOFiles(const std::string& sPath); 52 | extern void loadPOFile(const std::string& filename, const std::string& lang); 53 | 54 | // Define gettext stub 55 | const char* gettext(const char* msgid); 56 | // Define pgettext stub 57 | const char* pgettext(const char* /*context*/, const char* msgid); 58 | // Define ngettext stub 59 | const char* ngettext(const char* msgid_singular, const char* msgid_plural, unsigned long n); 60 | // Define npgettext stub 61 | const char* npgettext(const char* /*context*/, const char* msgid_singular, const char* msgid_plural, unsigned long n); 62 | 63 | // Common convention to use _ for gettext() 64 | //#define _(szStr) gettext(szStr) 65 | 66 | #endif //djLOCALIZE_ON 67 | -------------------------------------------------------------------------------- /src/m_aliases.h: -------------------------------------------------------------------------------- 1 | /* 2 | * File: aliases.h 3 | * Created: 2002-07-01 (Monday), 21:00 4 | * Author: Vytautas Shaltenis, a.k.a. rtfb 5 | * 6 | * Project: Dave Gnukem 7 | * 8 | * Desciption: a definition of few aliasing typenames. Removed from 9 | * sys_defs.h by request of YvL. 10 | * 11 | * dj2022-01 Removing unused aliases as some e.g. byte were unused anyway in our codebase and cause conflicts with e.g. std::byte on newer c++ versions e.g. c++17 .. if we need similar things again we can create new ones and/or rather use the newer c++ types 12 | */ 13 | 14 | 15 | 16 | #ifndef ALIASES_H__KRANKLYS__ 17 | #define ALIASES_H__KRANKLYS__ 18 | 19 | 20 | //#define dword unsigned long int 21 | 22 | 23 | #endif // #ifndef ALIASES_H__KRANKLYS__ 24 | -------------------------------------------------------------------------------- /src/m_misc.h: -------------------------------------------------------------------------------- 1 | /* 2 | * File: m_misc.h 3 | * Created: 2002-06-29 (Saturday), 15:01 4 | * Modified: 2002-07-22 (Monday), 04:13 5 | * Author: Vytautas Shaltenis, a.k.a. rtfb 6 | * 7 | * Project: Dave Gnukem 8 | * 9 | * Description: Miscellaneous utility functions. 10 | * 11 | */ 12 | 13 | #ifndef M_MISC_H_KRANKLYS__ 14 | #define M_MISC_H_KRANKLYS__ 15 | 16 | 17 | 18 | #define SETBIT(x) (((unsigned int)1)< // For NULL 18 | 19 | CNamed::CNamed() 20 | : m_szName(NULL) 21 | { 22 | } 23 | 24 | CNamed::~CNamed() 25 | { 26 | djDELV(m_szName); 27 | } 28 | 29 | void CNamed::SetName( const char *szName ) 30 | { 31 | djDELV(m_szName); 32 | m_szName = djStrDup(szName); 33 | } 34 | -------------------------------------------------------------------------------- /src/mixins.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file mixins.h 3 | \brief Some simple "mixin" helper classes. 4 | \author David Joffe 5 | 6 | Copyright (C) 2000-2024 David Joffe 7 | */ 8 | /*--------------------------------------------------------------------------*/ 9 | #ifndef _MIXINS_H_ 10 | #define _MIXINS_H_ 11 | 12 | class CNamed 13 | { 14 | public: 15 | CNamed(); 16 | virtual ~CNamed(); 17 | 18 | void SetName( const char *szName ); 19 | const char *GetName() const { return m_szName; } 20 | 21 | protected: 22 | char * m_szName; 23 | }; 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /src/sdl/djinclude_sdlmixer.h: -------------------------------------------------------------------------------- 1 | // Helper for including SDL mixer stuff 2 | // This is turning into something a bit gross and really C++-ish ... 3 | // This may I'm sure need tweaking further 4 | #ifndef _DJINCLUDE_SDLMIXER_H_ 5 | #define _DJINCLUDE_SDLMIXER_H_ 6 | 7 | //#include "config.h"//For NOSOUND 8 | 9 | //#ifndef NOSOUND 10 | 11 | #ifdef __OS2__ 12 | #include 13 | #else 14 | 15 | #if defined(__has_include) 16 | 17 | #ifdef WIN32 18 | 19 | // [dj2023-11] vcpkg starts to have this new sdl2-mixer-ext instead of the usual sdl2-mixer (for libvorbis especially I think we may need it) but I don't see it in Ubuntu WSL etc. so for now just on Windows start trying to sort of auto-figure out whether to use sdl2-mixer-ext or sdl2-mixer 20 | #if __has_include() 21 | // [dj2023] add this define so we know we are using the ext lib for things like #pragma link setting on MSVC platforms 22 | #define djUSING_SDL_MIXER_EXT 23 | #include 24 | #elif __has_include() 25 | #define djUSING_SDL_MIXER_EXT 26 | #include 27 | #elif __has_include() 28 | #include 29 | #else 30 | #include 31 | #endif 32 | 33 | #else 34 | 35 | #if __has_include() 36 | #include 37 | //#if __has_include() 38 | // #include 39 | #else 40 | #include 41 | #endif 42 | 43 | #endif 44 | 45 | #else 46 | // No __has_include, just go the old way (except __OS2__ path which we already set up) .. this may all have to change and be tweaked again I'm sure .. 47 | #include 48 | #endif 49 | 50 | #endif//#ifdef __OS2__ 51 | //#endif//#ifndef NOSOUND 52 | 53 | #endif//_DJINCLUDE_SDLMIXER_H_ 54 | -------------------------------------------------------------------------------- /src/sdl/djtime.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | djtime.cpp 3 | 4 | Copyright (C) 1999-2024 David Joffe 5 | */ 6 | 7 | #include "../config.h" 8 | #include "../djtime.h" 9 | #ifdef __OS2__ 10 | #include 11 | #else 12 | #include "SDL.h" 13 | #endif 14 | #ifdef WIN32 15 | #include 16 | #include 17 | #endif 18 | /*--------------------------------------------------------------------------*/ 19 | // 20 | // SDL version 21 | // 22 | /*--------------------------------------------------------------------------*/ 23 | // Initialize the time system 24 | void djTimeInit() 25 | { 26 | #ifdef WIN32 27 | // Windows NT / 2000 have a default timer resolution of 5 ms 28 | //timeBeginPeriod(1); 29 | #endif 30 | } 31 | 32 | // Shut down the time system 33 | void djTimeDone() 34 | { 35 | #ifdef WIN32 36 | //timeEndPeriod(1); 37 | #endif 38 | } 39 | 40 | // return time of day in seconds 41 | float djTimeGetTime() 42 | { 43 | return (float)SDL_GetTicks() / 1000; 44 | } 45 | 46 | uint64_t djTimeGetTicks64() 47 | { 48 | #if SDL_VERSION_ATLEAST(2, 0, 18) 49 | return SDL_GetTicks64(); 50 | #else 51 | // Re "SDL_GetTicks": *This function is not recommended as of SDL 2.0.18; use SDL_GetTicks64() instead, where the value doesn't wrap every ~49 days" 52 | return SDL_GetTicks(); 53 | #endif 54 | } 55 | -------------------------------------------------------------------------------- /src/settings.h: -------------------------------------------------------------------------------- 1 | /*! 2 | \file settings.h 3 | \brief Game configuration file 4 | \author David Joffe 5 | 6 | Copyright (C) 2001-2024 David Joffe 7 | 8 | 09/2001 9 | */ 10 | #ifndef _SETTINGS_H_ 11 | #define _SETTINGS_H_ 12 | 13 | #include 14 | #include 15 | #include 16 | 17 | //! Configuration class 18 | class CSettings 19 | { 20 | public: 21 | //! Constructor 22 | CSettings(); 23 | //! Destructor 24 | ~CSettings(); 25 | 26 | //! Load settings from file 27 | bool Load(const char *szFilename); 28 | //! Save settings to file 29 | bool Save(const char *szFilename); 30 | 31 | //! Return string value associated with given key 32 | const char *FindSetting(const char *szKey); 33 | 34 | //! Set the value of the given key 35 | void SetSetting(const char *szKey, const char *szValue); 36 | //! Set the "default" setting. The given value will only be associated with this key 37 | //! if this key does not already exist in the settings database. 38 | void SetDefaultSetting(const char *szKey, const char *szValue); 39 | 40 | //! Delete a specific setting given its key 41 | void DeleteSetting(const char *szKey); 42 | //! Delete all settings 43 | void DeleteAllSettings(); 44 | 45 | //! Return integer value associated with given key 46 | int FindSettingInt(const char *szKey); 47 | //! Set default setting, but with integer value 48 | void SetDefaultSettingInt(const char *szKey, int nValue); 49 | //! Set the integer value of the given key 50 | void SetSettingInt(const char *szKey, int nValue); 51 | 52 | protected: 53 | struct SSetting 54 | { 55 | // Setting "key" 56 | char *szKey = nullptr; 57 | // Value associated with key 58 | char *szValue = nullptr; 59 | }; 60 | std::vector m_aSettings; 61 | }; 62 | 63 | //! Global game settings 64 | extern CSettings g_Settings; 65 | 66 | //[todo: make more configurable: USERFILE_CONFIG_FILE /] 67 | #define USERFILE_CONFIG_FILE "davegnukem.cfg" 68 | 69 | #endif 70 | -------------------------------------------------------------------------------- /src/sys_defs.h: -------------------------------------------------------------------------------- 1 | /* 2 | * File: sys_defs.h 3 | * Created: 2002-06-29 (Saturday), 11:15 4 | * Author: Vytautas Shaltenis, a.k.a. rtfb 5 | * 6 | * Project: Dave Gnukem 7 | * 8 | * Description: Main system definitions. 9 | * 10 | */ 11 | 12 | #ifndef SYS_DEFS_H_KRANKLYS__ 13 | #define SYS_DEFS_H_KRANKLYS__ 14 | 15 | // todo clean up and refactor away below? 16 | 17 | //dj2022-11 [low] some of these aren't used anymore, and I think 'core' headers (i.e. included indirectly by many other things, e.g. logging code) should only include the *minimum* necessary for compile speed reasons 18 | // Also where reasonably possibly should ojnly include in the .cpp code where's it's necessary (rather than the .h) e.g. getcwd used only in a couple of places 19 | // Also not sure if we should even use 'malloc' anymore, personally I don't use it and rather just use 'new' operator where possible (except certain specific APIs may need malloc in the old days) 20 | // 'clean up clean out' this below list a bit? 21 | 22 | 23 | //dj2022-11 tentatively commenting out various includes in this file and trying to refactor to clean up and simplify and reduce this list a bit .. see above comments 24 | 25 | 26 | 27 | // fixme high these are too low - but many probably aren't used anymore? clean up .. [dj2022-11 at least making 4096 which is more reasonable for 2022 FOR NOW but this is not the right way to do things ..] 28 | #define SYS_MAX_FULL_PATH 4096 // Don't forget these are with 29 | #define SYS_MAX_PATH 4096 // terminating zeroes. So the real 30 | #define SYS_MAX_FILE 4096 // length is (SYS_MAX_* -1) 31 | #define SYS_MAX_EXT 64 32 | 33 | 34 | #endif // #ifndef SYS_DEFS_H_KRANKLYS__ 35 | -------------------------------------------------------------------------------- /src/sys_error.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * File: sys_error.cc 3 | * Created: 2002-08-30 (Friday), 22:38 4 | * Modified: 2002-08-30 (Friday), 22:38 5 | * Author: Vytautas Shaltenis, a.k.a. rtfb 6 | * 7 | * Project: Dave Gnukem 8 | * 9 | * Description: Error, warning and debug output. 10 | * 11 | * NOTE: I use quite an intensive and dangerous perprocessor hackery here. 12 | * Kids, do not try this at home :) 13 | */ 14 | 15 | #include "sys_log.h" 16 | #include "sys_defs.h" 17 | #include 18 | #include //va_start etc. 19 | 20 | void _SYS_Error ( const char *file, int line, const char *fmt, ... ) 21 | { 22 | if (NULL == fmt) 23 | return; 24 | 25 | // todo deprecate these kinds of printf buffers 26 | static thread_local char text[8192]={0}; 27 | static thread_local char text2[8192+1024]={0}; 28 | 29 | //todo-deprecate:// See issue "Move away from printf-style formatting" 30 | va_list args; 31 | va_start ( args, fmt ); 32 | vsnprintf ( text, sizeof(text), fmt, args ); 33 | va_end ( args ); 34 | 35 | snprintf ( text2, sizeof(text2), "[Error] %s line %d: %s", file, line, text); 36 | 37 | djLog::LogStr( text2 ); 38 | //DaveCleanup (); // main application cleanup 39 | //exit ( 0 ); 40 | } 41 | 42 | 43 | void _SYS_Warning ( const char *file, int line, const char *fmt, ... ) 44 | { 45 | if (NULL == fmt) 46 | return; 47 | 48 | // todo deprecate these kinds of printf buffers 49 | static thread_local char text[8192] = { 0 }; 50 | static thread_local char text2[8192+1024] = { 0 }; 51 | 52 | //todo-deprecate:// See issue "Move away from printf-style formatting" 53 | va_list args; 54 | va_start ( args, fmt ); 55 | vsnprintf ( text, sizeof(text), fmt, args ); 56 | va_end ( args ); 57 | 58 | snprintf ( text2, sizeof(text2), "[Warning] %s line %d: %s", file, line, text); 59 | 60 | djLog::LogStr(text2); 61 | } 62 | 63 | 64 | void _SYS_Debug ( const char *file, int line, const char *fmt, ... ) 65 | { 66 | if (NULL == fmt) 67 | return; 68 | 69 | // todo deprecate these kinds of printf buffers 70 | static thread_local char text[8192]={0}; 71 | 72 | //todo-deprecate:// See issue "Move away from printf-style formatting" 73 | va_list args; 74 | va_start ( args, fmt ); 75 | vsnprintf ( text, sizeof(text), fmt, args ); 76 | va_end ( args ); 77 | 78 | const std::string text2 = std::string("[Debug] ") + file + " line " + std::to_string(line) + ": " + text; 79 | 80 | djLog::LogStr(text2); 81 | } 82 | -------------------------------------------------------------------------------- /src/sys_error.h: -------------------------------------------------------------------------------- 1 | /* 2 | * File: sys_error.h 3 | * Created: 2002-08-30 (Friday), 22:38 4 | * Modified: 2002-08-30 (Friday), 22:38 5 | * Author: Vytautas Shaltenis, a.k.a. rtfb 6 | * 7 | * Project: Dave Gnukem 8 | * 9 | * Description: Error, warning and debug output. 10 | * 11 | * NOTE: I use quite an intensive and dangerous perprocessor 12 | * hackery here. The idea of how to do this __FILE__ and __LINE__ 13 | * workaround is taken from Paul "Midnight" Nettle's memory 14 | * manager. As he states, 15 | * 16 | * Macros -- "Kids, please don't try this at home. 17 | * We're trained professionals here." :) 18 | * 19 | * 20 | * :)) 21 | * 22 | * Update: It's toned down now - we couldn't handle the danger. 23 | * 24 | * dj2022-11 note that comment about using "quite an intensive and dangerous perprocessor hackery" was not mine and I agree all this code must be simpler/safter more robust and easier to maintain. 25 | */ 26 | 27 | #ifndef __SYS_ERROR_H_RTFB__ 28 | #define __SYS_ERROR_H_RTFB__ 29 | 30 | 31 | inline void the_void ( const char*, ... ){ return; } 32 | 33 | #define SYS_Error(...) (_SYS_Error(__FILE__, __LINE__, __VA_ARGS__)) 34 | #define SYS_Warning(...) (_SYS_Warning(__FILE__, __LINE__, __VA_ARGS__)) 35 | #define SYS_Debug(...) (_SYS_Debug(__FILE__, __LINE__, __VA_ARGS__)) 36 | 37 | 38 | void _SYS_Error ( const char *file, int line, const char *fmt, ... ); 39 | void _SYS_Warning ( const char *file, int line, const char *fmt, ... ); 40 | void _SYS_Debug ( const char *file, int line, const char *fmt, ... ); 41 | 42 | 43 | #endif // #ifndef __SYS_ERROR_H_RTFB__ 44 | 45 | -------------------------------------------------------------------------------- /src/sys_log.h: -------------------------------------------------------------------------------- 1 | /* 2 | * File: sys_log.h 3 | * Created: 2002-06-29 (Saturday), 11:40 4 | * Modified: 2002-07-22 (Monday), 04:13 5 | * Author: Vytautas Shaltenis, a.k.a. rtfb 6 | * 7 | * Project: Dave Gnukem 8 | * 9 | * Description: System logger 10 | */ 11 | 12 | #ifndef SYS_LOG_H_KRANKLYS__ 13 | #define SYS_LOG_H_KRANKLYS__ 14 | 15 | #include 16 | 17 | // Init/Kill 18 | void InitLog (); 19 | void KillLog (); 20 | 21 | 22 | #define USERFILE_LOGFILE "DaveGnukem.log" 23 | //#define USERFILE_ERRORLOGFILE "DaveGnukemError.log" 24 | 25 | // creates log file and returns log id 26 | // Filename parameter may be NULL. Then defaults to `game.log' 27 | unsigned long CreateLog ( const char *filename, const char *descr ); 28 | void DisposeLog ( unsigned long lg_id ); 29 | 30 | //unsigned int SysLog(); 31 | 32 | 33 | //dj2022 these are 'risky' names for global namespace :/ .. fix all that 34 | class djLog 35 | { 36 | public: 37 | // The logger itself. Shall be more overloads on demand 38 | // dj2022 making these names longer LogFormatStr() to make it semantically CLEAR you are calling a printf-style formatting thing (which is thus riskier i.e. extra risk of introducing bugs of mismatched printf strings and parameters) (rather use LogStr when don't need formatting) 39 | static void LogFormatStr(const char* fmt, ...); 40 | 41 | //dj2022-11 RENAMING THIS as using function overloading creates risk of ambiguously calling wrong version of this function .. should we phase out below also, not sure 42 | //static void LogFormatStr2(unsigned long log_mask, const char* fmt, ...); 43 | 44 | // Log plain string (no printf formatting) - safer than printf so lean towards using this when you don't need printf style formatting [dj2022-11] 45 | static void LogStr(const char* szStr); 46 | // Log plain std::string (utf8) (no printf formatting) - safer than printf 47 | static void LogStr(const std::string& sText); 48 | }; 49 | //dj2022-11 convenience helper for new log of plain string (with no printf style formatting) 50 | #define djLOGSTR(sz) djLog::LogStr(sz) 51 | 52 | // This tells logger whether or not to log to system console 53 | void LogToScreen ( const bool l2s ); 54 | // This tells logger whether or not to log to game console 55 | void LogToConsole ( const bool l2c ); 56 | 57 | 58 | #endif // #ifndef SYS_LOG_H_KRANKLYS__ 59 | 60 | -------------------------------------------------------------------------------- /src/vcDave/application_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidjoffe/dave_gnukem/2255bd4bba31d3a95bc6a850a10c1e9220baee61/src/vcDave/application_icon.ico -------------------------------------------------------------------------------- /src/vcDave/djVSPropertySheetIncludeFolders.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | c:\v22\installed\x86-windows\include\;c:\v22\installed\x86-windows\include\SDL2;$(VC_IncludePath);$(WindowsSDK_IncludePath); 8 | c:\v22\installed\x86-windows\lib\;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86) 9 | 10 | 11 | 12 | c:\v22\installed\x86-windows\include\;c:\v22\installed\x86-windows\include\SDL2;$(VC_IncludePath);$(WindowsSDK_IncludePath); 13 | c:\v22\installed\x86-windows\debug\lib\;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86) 14 | 15 | 16 | 17 | c:\v22\installed\x64-windows\include\;c:\v22\installed\x64-windows\include\SDL2;$(VC_IncludePath);$(WindowsSDK_IncludePath); 18 | c:\v22\installed\x64-windows\lib\;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) 19 | 20 | 21 | 22 | c:\v22\installed\x64-windows\include\;c:\v22\installed\x64-windows\include\SDL2;$(VC_IncludePath);$(WindowsSDK_IncludePath); 23 | c:\v22\installed\x64-windows\debug\lib\;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) 24 | 25 | 26 | 27 | c:\v22\installed\arm64-windows\include\;c:\v22\installed\arm64-windows\include\SDL2;$(VC_IncludePath);$(WindowsSDK_IncludePath); 28 | c:\v22\installed\arm64-windows\lib\;$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) 29 | 30 | 31 | 32 | c:\v22\installed\arm64-windows\include\;c:\v22\installed\arm64-windows\include\SDL2;$(VC_IncludePath);$(WindowsSDK_IncludePath); 33 | c:\v22\installed\arm64-windows\debug\lib\;$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/vcDave/djVSPropertySheetIncludeFoldersD.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | e:\vdave\vcpkg\installed\x86-windows\include\SDL2\;$(VC_IncludePath);$(WindowsSDK_IncludePath); 7 | e:\vdave\vcpkg\installed\x86-windows\debug\lib\;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86) 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/vcDave/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by vcDave.rc 4 | // 5 | #define IDI_ICON1 101 6 | 7 | // Next default values for new objects 8 | // 9 | #ifdef APSTUDIO_INVOKED 10 | #ifndef APSTUDIO_READONLY_SYMBOLS 11 | #define _APS_NEXT_RESOURCE_VALUE 102 12 | #define _APS_NEXT_COMMAND_VALUE 40001 13 | #define _APS_NEXT_CONTROL_VALUE 1001 14 | #define _APS_NEXT_SYMED_VALUE 101 15 | #endif 16 | #endif 17 | -------------------------------------------------------------------------------- /src/vcDave/vcDave.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidjoffe/dave_gnukem/2255bd4bba31d3a95bc6a850a10c1e9220baee61/src/vcDave/vcDave.rc -------------------------------------------------------------------------------- /src/vcDave/vcDave.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcDave", "vcDave.vcxproj", "{45DE4EBB-B94A-243F-DA39-1095092C6566}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Win32 = Debug|Win32 9 | Release|Win32 = Release|Win32 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {45DE4EBB-B94A-243F-DA39-1095092C6566}.Debug|Win32.ActiveCfg = Debug|Win32 13 | {45DE4EBB-B94A-243F-DA39-1095092C6566}.Debug|Win32.Build.0 = Debug|Win32 14 | {45DE4EBB-B94A-243F-DA39-1095092C6566}.Release|Win32.ActiveCfg = Release|Win32 15 | {45DE4EBB-B94A-243F-DA39-1095092C6566}.Release|Win32.Build.0 = Release|Win32 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /src/version.h: -------------------------------------------------------------------------------- 1 | 2 | //dj2022-11 adding this small file for non-Makefile builds e.g. MSVS / Visual Studio etc. due to new Makefile now passing this in .. might re-do this differently later .. 3 | /* 4 | # 'version string history' here: 5 | # "v1.0 - 3 Apr 2018" [version 1] 6 | # "v1.0.1 - 25 Apr 2020" 7 | # "v1.0.2 - 19 Nov 2022" [<- last version on SDL1 - about to update to SDL2] 8 | # "v1.0.3 - 19 Nov 2022" [New version number for SDL2 version with Matteo Bini SDL2 commit merged in] (1.0.3-dev, working towards official new 1.0.3 stable) 9 | # "v1.0.3 - 29 Nov 2022" First official stable version with Matteo Bini's updates to SDL2, and new improved Debian packaging files by Matteo Bini 10 | */ 11 | 12 | #ifndef _djVERSION_H_ 13 | #define _djVERSION_H_ 14 | 15 | // See also Makefile .. 16 | 17 | #ifndef V_NUM 18 | #define V_NUM "1.0.3" 19 | #endif 20 | #ifndef V_DATE 21 | #define V_DATE "29 Nov 2022" 22 | #endif 23 | #ifndef VERSION 24 | #define VERSION "v" V_NUM " - " V_DATE 25 | #endif 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /src/win32/winmain.cpp: -------------------------------------------------------------------------------- 1 | 2 | //dj2022-11 add this "#ifdef WIN32" so we can in theory more 'safely' possibly do things like scan the src folder for all .cpp files for the Makefile, so if a Linux or Unix-style system tries to compile this file it should just quietly do nothing instead of give an error 3 | #ifdef WIN32 4 | 5 | #include "../config.h" 6 | #include "../djgraph.h" 7 | #include "../sys_error.h" 8 | #include 9 | 10 | 11 | extern int main( int argc, char ** argv ); 12 | 13 | // On Windows this is basically the main application entry point; it calls main() which is perhaps slightly unorthodox but seems to be working OK all these years (though decades ago the Intel compiler seemed to not like calling main() from WinMain()) 14 | int WINAPI WinMain(HINSTANCE hInstance, 15 | HINSTANCE hPrevInstance, 16 | PSTR szCmdLine, 17 | int iCmdShow) 18 | { 19 | // FIXME: The intel compiler thinks that you cannot do this .. ??? 20 | // Run the standard "main" function 21 | return main(__argc, __argv); 22 | } 23 | 24 | #endif//WIN32 25 | --------------------------------------------------------------------------------