# Dave GnukemDave Gnukem is a retro-style 2D scrolling platform shooter similar to, and inspired by, Duke Nukem 1 (~1991). The source code is cross-platform and open source. It runs on Windows, Linux, Mac OS X and more. (The original Duke Nukem 1 had 16-color EGA 320x200 graphics; the aim here is 'similar but different' gameplay and 'look and feel'. It is kind of a parody of the original. Please note it is not a 'clone', and not a 're-make'.)

The project was originally created and maintained by David Joffe (~1994 to 2004, and Oct 2016 to present). It was maintained by EMH (Evil Mr Henry http://www.emhsoft.com/) from 2004 to 2008. Additional contributions by: [T.O.G](http://www.nuke24.net/ "T.O.G."), [Vytautas Shaltenis](https://rtfb.lt/), Kent Mein, Steve Merrifield, Felix Richter, Kevin Joffe. See also 'Additional Credits' below.

As of 8 Oct 2016, this project is under 'properly' active development again, and on 3 Apr 2018, 'version 1.0' has been released. (Note - this game wasn't 'retro genre' when I started it - it just took so long to complete that it's now 'de facto' "retro"! - David)

### About Duke Nukem 1

Duke Nukem 1 was a famous original 16-color 320x200 'classic' game released by Apogee Software in 1991 that launched the Duke Nukem series: https://goo.gl/yP4PbS The original Duke Nukem 1 was created by Todd Replogle (co-creator of the Duke Nukem series), John Carmack (of id Software), Scott Miller (founder of 3D Realms), Allen H. Blum III, George Broussard, and Jim Norwood.

Note the aim of Dave Gnukem is not to be a 'clone', nor to try match DN1 gameplay precisely - the goal is to be 'similar but different', sort of a parody though not terribly funny. It's not the purpose or intention of this project to produce a 'clone', nor is it the intention to try load actual original level or sprite data into this 'engine'. The included levels have been created from scratch by users. The included sprites (apart from a few small exceptions mentioned at the bottom of this README) have been drawn by hand from scratch. The game is sort of a hat tip to the original. - David Joffe

To open doors, find the correct color key, and press the action key on the 'lock' nearby the door(s).

Power boots allow you to jump higher. The special molecule pickup gives you full health.

### Storyline/Plot:

The year is $CURRENTYEAR+8. An evil genius, Dr Proetton, has been hired by the CIA to infect the world's computers with a virus called SystemD, crippling them. Only you can stop him. You must find the floppy disk with the Devuan Antivirus on it, and install it on the master computer, which is hidden in Vault7.

*Any resemblance to actual persons or entities is purely coincidental*

* [3 Apr 2018] Change it so that you must first turn cheat/debugging stuff (Ctrl+Shift+G) on before using F4 or F5 for sprite/level editor* [1 Apr 2018] Add Shift+F10 to start/stop auto-save screenshot-per-frame sequence (warning, eats disk space very fast)

2018/03/31 - Version 0.96

* [30 Mar 2018] Change volume control keys from PgUp/PgDn to 7/6 (as PgUp/PgDn conflict on some keyboards, e.g. Pandora, and also some laptops don't have 'actual' PgUp/PgDn etc.)* [30 Mar 2018] Add 'About' page to main menu* [30 Mar 2018] Add new F10 save screenshot function (saves on Windows under \Users\USERNAME\AppData\Roaming\DaveGnukem\screenshots and on Linux under $HOME/.gnukem/screenshots)* [26 Mar 2018] Bugfixes and level improvements (also fixed a level bug where one of the levels was impossible to complete)* [22 Mar 2018] Boot sprite; Improve Dr Proetton (Dr Proton) sprite and behavior* [20 Mar 2018] Fix overly-large window if Windows DPI scaling settings are enabled (unfortunately the fix breaks Windows XP support - but you can enable djWINXP_SUPPORT in config.h if you want to generate a build that supports Windows XP)

* Add new 'sort of looks like a cannon on wheels' monster type* Implemented new inventory pickup item 'antivirus disk' and corresponding 'master computer' (when we insert AV disk into master computer we save the world) (should only be one of each of these, and in last level of a 'mission')* Add new high-voltage "barrier" that must be shot multiple times to destroy before hero can pass through (touching it results in immediate death)* Add new monster that constitutes the approximate equivalent of DN1 rabbits (for now, or maybe permanently, this is just a sort of 'evil Tux' - not sure yet if placeholder sprite, or part of plot)* Add new floor type that auto-crumbles after hero walks or jumps twice on it (2nd spriteset, position 5x4 - place only 1 block per segment)* Re-do instructions screens to display storyline/plot* Basic more proper/correct implementation of the CAcme falling blocks* Fixed: Bullets go through doors

* Add shortcut key to toggle sounds on/off (Insert)* Fix: On Windows, game window often starts slightly off bottom of screen* Fix: Restore Game from main menu doesn't work* Fix: Save/Restore game doesn't save "mission" (i.e. selected "game")* New proper exit sound (is "PowerUp13.mp3" by Eric Matyas http://soundimage.org/)* Fixed: A monster could kill you in the moments after you entered the exit* Better hero shooting sound

2016/10/22 - Version 0.63 / 0.64 / 0.65

* Add background music. So far, have only added music by Eric Matyas http://soundimage.org/* Add game volume controls (use 7 and 6 keys to increase/decrease volume from menus or in-game)* Level Editor: New feature: Hold in Ctrl+Alt and click with the mouse to automatically start level with hero 'dropped in' to the clicked position as starting position (to help with level editing / testing)

* Fix: "Dying in the pungee sticks will often cause a crash" (thank you to porter who pointed that out)* Fix a segfault in Linux (possibly VNC only?) when navigating in-game menus and other sub-menus* Add semi-experimental 'big viewport mode' (Backspace + B in game to toggle) to make level creation/testing easier for level editors

2016/10/09 - Version 0.6 (0.60)

* Use last EMH release; create github project https://github.com/davidjoffe/dave_gnukem* Fixed 'tiny game window'* Fix some Linux compile issues, make a few other fixes/improvements (streamed on LiveCoding), call it v0.6 ('un-abandoning' project - DJ)

# Developer Info / Build Info

Dependencies: LibSDL1.2, LibSDL-Mixer 1.2

## Windows Build Instructions

* Visual Studio 2010 project is included.* **NB** You must set your Visual Studio 'Working Directory' to ../../ in order to run this (under Project / Properties / Configure Properties / Debugging) or it won't find the data files and just immediately exit on run* If you get an error about not finding SDL DLL(s) when running, set 'Project / Properties / Configure Properties / Environment' to: PATH=c:\your\path\to\DLLs;%PATH%

## Linux Build Instructions

Type 'make'

Run with ./davegnukem if it built correctly

Installing dependencies on Debian etc.:

apt-get install libsdl1.2-dev

apt-get install libsdl-mixer1.2-dev

## Mac OS X Build Instructions

Same as Linux - type 'make'. Run with ./davegnukem if it built correctly.

Dependencies: You may have to first install LibSDL1.2 and LibSDL-Mixer1.2 (these can be installed by downloading the source code and doing 'make' and 'make install' (as root) for each of these first).

Note there is currently no 'undo', so be careful. If happy with a set of work, save your changes.

NB: All in-game cheat/debugging keys (eg level up) must first be turned on by pressing Ctrl+Shift+G

* NB: As of Apr 2018, you must first turn cheat/debugging stuff (Ctrl+Shift+G) on before using F4 or F5 for sprite/level editor* F5 from within the game invokes the level editor* F1: Save current changes (NB: there is currently no 'unsaved changes' warning, so remember to save your changes, if desired)* Escape: Exit level editor and start playing current level* Hold in Ctrl+Alt and click with the mouse to drop in hero and start playing/testing level at the clicked position* X: Toggle display/editing of 'foreground layer' (there are two 'layers', the background layer primarily for solid stuff, e.g. walls, and the foreground layer generally for e.g. objects or monsters, or other semi-transparent objects)* Z: Toggle display/editing of 'background layer'* M,N: Previous/Next spriteset. There is a left-click and right-click "sprite palette"; clicking the left or right mouse button in the map preview area places an object from the left-click or right-click palette, respectively. Click in the spriteset with the left or mouse button to select that sprite object to either the left or right-click "sprite palette".* To select the hero start position in the map, select and place either the 2nd-last or 3rd-last object in the first spriteset (it looks like a figure with a left or right arrow, which indicates the start direction). There should only be one of these per level.* To place the exit position in the map, select and place the last object in the first spritset. There should only be one of these per level.* 1-9: Macros: Float the mouse cursor in the map preview area and press one of these shortcuts to place from a few pre-defined complex objects, e.g. crates.* F: Do a 'horizontal fill' of the current selected sprite (on the current layer)* To choose the desired level, use the Up+L 'cheat' from within the game* To choose the desired 'game' i.e. 'mission' (i.e. set of levels), use the main game menu 'Select mission'* Ctrl+F6: Show level sprite instance statistics* Ctrl+F7: Show overview of all levels, with some basic stats on 'important' gameplay items

Note that for active animated objects that consist in the spriteset of multiple sprites (e.g. each conveyor belt piece has 4 sprites, for its animation), you *must* place the *first* of the four in the map for the object to work correctly.

Keep in mind that once the hero has the powerboots, he'll be able to jump higher. So there is a sort of logical progression if you place powerboots in a level, i.e. they should be placed once per 'mission' (i.e. set of levels), and levels prior to that should assume the default lower jump height, levels after that point might possibly assume the higher jump height.

To add a new 'mission' (i.e. set of levels), edit the missions.txt file and add a new line containing the name of your .gam file, e.g. "mygame/mygame.gam" (without quotes). (You should try keep all files associated with a particular game/mission in its own subfolder.) To add/remove levels for that game/mission, edit the .gam file (see the included .gam files to see the format).

# TODOs (To Sort):

* Create 'Roadmap' to "version 1"? E.g. starter list below:* Videos?* Check through code for possible buffer over-runs and * v0.7 [stil issue with ctrl jump keypress story]* v0.7 linux segfault* 'Texture Manager': * Clean up of 'textures' * Actual hardware accel if available [todo: proper blending] * Restoring hardware surfaces on toggle fullscreen with DirectX* Explosion sound doesn't always play (fixed 2016-10-22 but fix could use more testing, cf. channel -1 story)* DEV * Update TargetName to DaveGnukem in VS2010 * Set up working folders to work 'out the box', so to speak * Add a dev readme.txt to help devs get set up

* [med] Level Editor is hogging CPU [check sprite editor, does it also?]* Finalize sprites and other graphics to at least reasonable ready state* Finalize a basic playable set of levels* Check for all possible hardcoded keys that may be interfering with redefined keys (e.g. Ctrl, H, backspace+G etc.)* [After redefine keys] Ctrl *both* shoot and jump* H to damage health should not be on by default [likewise other things]* Better colors for menu* Some more / better sounds* CREDITS: Add Vytautas Shaltenis, a.k.a. rtfb, EMH, etc. [who else?]* Some better graphics* Fix up and update credits etc.* Signed executables in binary release?* [check] Dying seems to reset score to 0 - is that right? Cf. DN1 behavior* Is the -640 flag now basically obsolete? Remove? Or change to do something else useful? E.g. to make window maximum size e.g. same as monitor could be useful for level editing.

## Sprite TODOs:

* Some of the background brick colors should be a bit darker* Some smoothing on some of hard pixely 'lines' (e.g. on shadow edges)* Finish conveyor belt* Un-EGA-ish sprites that still look a bit too EGA-ish (some of the especially ones look a bit too 16-color-ish perhaps, though the original DN1 was 16 colors)* Red background pipes look a bit .. I dunno what .. chromatic? Maybe desaturate slightly .. or something

## Level TODOs:

* ? Make a list of 'level TODOs' that are must-have for a 'version 1'?

# Notes

The name is a pun on 'Duke Nukem' and 'Gnu' as a sort of 'hat-tip'/reference to the open source license/model.

The game took forever to complete to mimic the Duke Nukem Forever model of taking forever to be released.

The underlying 'engine' supports high frame rates and smooth scrolling etc.; the reason the frame rate is artificially capped to 18fps is that the earliest versions (~1994/1995-ish) were written for 16-bit 8086/80286, which used hardware timer interrupts that ran at around 18Hz. (Though it's possible to uncap the frame-rate, the CThing's are unfortunately currently hardcoded for 18Hz, so they just run silly-fast if one uncaps the frame rate ... if writing a new game or a 'version 2' it should be easy to use a higher frame rate and write new CThing's movement code to be based on time-passed-since-last-frame or some-such. Likewise the blocky viewport scrolling itself should be easy to replace with smooth viewport-scrolling.)

# License and Additional Credits

The source code itself (and most of the data/sprites) for Dave Gnukem are dual-licensed under MIT license or GPL.

With respect to particular data items, the following license conditions apply: