DEATH is an arena-based shoot 'em up inspired by Jeff Minter's unfinished Atari ST game Hardcore. Hardcore was in development around 1992, but halfway through YaK was hired by Atari to produce games for the Jaguar. Because of this, Hardcore was only released as an unfinished five-level demo. In 1997, aged about 19, I tried to create a similar game.
Update - Feb 2018: After making a few tweaks to this unfinished game, I have released it as it stands. Note that the game is not well-balanced; although I have added some extra powerups given at random when you are low on lives, it is probably impossible to reach the end without cheating. Hold down 'L' to give yourself extra lives. There are many things I'd change if I were to do any significant work on the game today.
Update - Apr 2005: It is unlikely that I will spend any more time working on this game, what with my full time job at Frontier, and the fact that I've got a lot more game ideas which are much more interesting than DEATH. However, I did learn a lot about game development. Particularly that it's a lot harder than one might expect to develop even a relatively simple game and make it fun. I might upload an unfinished version of the game sometime, if anyone wants it.
Update - Feb 2004: The game is at a fairly advanced stage of development, but is not currently good or finished enough to be released. I rarely work on it these days, so it's unlikely to be released anytime soon.
Started on: 13th June 1997
0.94 28th Feburary 2000 - Improved load_mod() error message handling. Adapted command line stuff for non-DOS platforms. Changed all instances of printf() to allegro_message(). - Added error checking for command line parameter arguments. - New alien behaviour - pausing. Alien pauses for a set amount of time before starting to move. Added pause_time to sprite, teleport and level structs. New dstruct overload: level_directive_struct get_dstruct (unsigned char action_directive, short action_parameter, short xpos, short ypos, int pause_time); Added pause_time to create_teleport() and create_object(). Implemented on everything except fungus, mirrors and laser killers. Has only been tested with grunts. - Added ability to skip intros using mouse button. - Added simulatenous teleportation level mode. - Made some amendments to clipping stuff in screen_swap(). - Great, it's started crashing (when clearing visual_page at start of intermission_screen()), and the arena has a small area missing. The latter has been confirmed as an Allegro bug. - Changed some DRAW_COMPILEDs to other things. - Implemented new behaviour for Evil Puck enemy type, for S******n (wouldn't want to spoil the surprise). - Increased screen area covered by fireworks. - Added error checking (write to log) for failed teleport initiations due to lack of teleport space. - Made it so that secondary/corner explosions are not displayed if explosion/ teleport space is running low (95 out of 114 teleports active). - Made it so that generators with speed of 0 don't do their initial move - they stay where they teleported. - Made it so that WAIT_ENEMIES(or ALL)_DESTROYED doesn't apply to explosions. - Made it so that DEATH music sample doesn't play if a DEATH sequence is already happening. Exception is if the death sequence is about to end (7/8ths of the way through). - Made it so that firework intensity can be customized. fireworks_active changed to firework_intensity. Zero is maximum intensity, higher numbers mean less intensity. Original default value was 3. -1 means inactive. - Made it so that end_it_all() writes to the log file. - Removed page flipping. - Improved error messages such as no mouse for non-DOS platforms - removed 'Press a key to exit' on such errors. - No mouse error detection doesn't seem to work. There seems to be a bug in Allegro - install_mouse() is returning 0 on failure instead of -1. Changed error detection accordingly. Technically, the game should work on a one button mouse - it doesn't use the right mouse button. - Upgraded to Allegro 3.9.30. Changed instances of printf to allegro_message(). - Added /timerspeed command line argument, which allows the player to set the game's internal timer speed. This can be used to put the game into fast or slow motion mode. High scores obtained in slow motion should be marked as such. - Fixed it so that turret explosions come from the centre of the turret instead of the origin. - Removed a lot of superfluous { } blocks from move_objects(). This is a good way of avoiding real work... - Added generic kill_turret() function to reduce hideous code repetition. Added a central non-diagonal explosion to turret explosions. - Game has been hanging on exit for a while. Seems to be happening on destroy_mod(). After doing quite a few alterations which failed to fix it, I moved destroy_mod() at the end to the top of the de-allocation bit (i.e. it is the first bit of memory which is de-allocated). And now it doesn't seem to crash. Eventually I worked out that it was caused by destroying the page1/page2 bitmaps, and also destroying the active_page/visual_page bitmaps (which point to the same objects). - Created CREATE_EXPLOSION level directive. Moved teleport action defines to shared.h - Moved #define LOGICAL char (a relic from when it was just C) to shared.h - Implemented ability of level definitions to detect second_time status. - Made it so that number of rezzed bonus rewards can be defined. (y_pos is used for number). This is used on Barrage levels for lives (mostly useless for other bonuses). - Fixed intermission text whizzer sine wave so that it is fully initialised to a full wave from the start. - Implemented facility for aliens to leave trails. Groovy! - Made it so that small enemies (those with an area of less than 1024 pixels) have two central explosions and no corner explosions. Explosion array is back to more normal levels of usage. - Thanks to all the extra explosion usage, the explosion array is becoming full. Changed particle to a list<>. Added function push_particle() to help implement new system. I am unsure as to whether deleting elements from the vector will mess up the processing order for it slightly. - Special effect: Particles on shielded turrets. Changed do_puck_trail() into a generic function which creates particles under a specified sprite. Intensity can be set when calling the function. Woohoo! This means I can have enemies which leave trails! Rockets would be especially cool for this. 0.93 13th December 1999 - Implemented Play and Exit buttons on main menu. - Made it so that draw_sidebar_stuff() is called at start of new level intermission. - Make it so that particle structure is cleared inside intermission_screen(). Hmm, it already is. So why am I still clearing it before going into intermission_screen()? Commented out the instance where this is happened. I expect I failed to realise that this initialisation was not needed. - Having munged the program code with the three items below, I have now been able to make it so that stay alive failure sound plays at the exact moment of a turret being killed, rather than when lives is decremented. This is achieved by cancelling stay_alive variable whenever a turret dies while stay_alive is true, and playing the failure sound at the same time. - Made stay_alive a global variable which is directly altered as needed. God, what a mess this program is... Got rid of stay_alive parameter to draw_sidebar_stuff(). - Made lives_at_start a global variable. Added every level initialisation for it. - Made it so that if player dies but then picks up extra lives during bonus period, it counts as a failure. - Added "Stay Alive!" graphic. lives_at_start has been modified so that it can always be used to detect the presence of a bonus period. If it is -1, there is no bonus period, otherwise there is one. Bonus period is considered to have ended if player dies before it is finished. Added parameter bool stay_alive to draw_sidebar_stuff(). Added sound for stay alive failure. - Implemented death_explosion() on things other than grunts. Critical thing to remember: always call death_explosion before deleting the sprite ID. Also added for collisions with turrets (in addition to current explosions there). - Added new teleport type - DESTROY_CENTRE. Used it to beef up explosions. Added destroy_type parameter to create_explosion(). Now I have to update the 40 or so calls to that function. Whoopee. - Made it so that grunt zombieing works properly for grunts with a speed of 1. - Turned getrandom into a function and made it accessible from levels.cpp - Made laser lines flash. Turned colour 255 into a flickering red - will change robotron eyes to that colour. - Added get_dstruct(action_directive) and one without y_pos. - Tested new level loading system for the first time. At the end of the first level, it ground the hard disk for ages, creating a 10Mb log file, which consisted almost entirely of "Level 1 not found, skipping". It seems I forgot to increment the level in the "Level x not found, skipping" loop. - Now that I've got it to compile for the first time in ages, the arsing thing is hanging on exit - tests show that JGMOD's destroy_mod is where it happens. Added some debugging code to JGMOD. In DEATH, made it so that text mode was set near the end of the program, so that the debugging code can print to the screen. - Got rid of machine speed evaluation report. The speed is still calculated, but it is only displayed in the log file. - Change to gcc 2.9.5 caused some things to stop compiling due to more pedantic error checking which causes problems with Allegro and C++. Added casts to (char *) to messages displayed using textout and c_str(). Changed const_iterators for splines to non-const iterators. - Added extra diagnostic info (including video/sound driver) to log file. Also added a supposedly humourous error message in log file if no mouse is detected. - Make it so that instead of storing all levels in a vector, there is just the level_directive_struct vector, and each level is 'loaded' only when you are on it. This would allow the new load_level() to be able to detect second_time, and allow it to adjust accordingly. Put level definitions (and definitions of get_dstruct()) in their own source file. Get rid of level_iterator. - Changed end_it_all so that it was passed a bool instead of LOGICAL for output_error_code. - Made it so that it writes the performance speed value to the log file. - Added a slight delay after video mode is set, so that monitor has time to adjust before intro plays. Achieved this by moving the performance evaluation to before the intro. - Spent two full days trying to find the reason for a crash occuring when the game moved onto a new level. Traced it to the new vector-based message system - an invalid iterator which was causing the program to believe there was a message to be displayed, when there wasn't. In the process, I created a 30Mb log file at one point. Never managed to load it, though. Wordpad ground away at the hard disk (creating a 180Mb swap file) for twenty minutes before I aborted it. - What the fuck is time_counter doing in play_the_game()? There is code which looks important, but it doesn't seem to do anything. - Made it so that explosions happen at each corner of a dead alien. Added function death_explosion(unsigned short sprite_num). Found another bug which was almost the same kind of thing as the nuke shrapnel bug I fixed a few days ago - the new explosions weren't working because the sprite's width cannot be accessed using the normal method if the sprite's ID has been deleted. As with nuke shrapnel bug, fixed by moving explosion creation before deletion of the sprite ID. Effect of having five explosions per alien instead of one is a bit excessive for the tiny Robotron aliens, maybe only have it so that this happens for larger aliens. - Changed firework chance per frame from 1/5 to 1/4. - Copied colour cycling code into pageflip part of screen_swap(). Not yet tested, as the levels with DEATHs in them haven't yet been converted to vector form. - Converted message_id system to work with vector levels - changed message_id to an iterator. - Changed all floats to doubles. - Made level a vector. Renamed level_struct to level_directive_struct. Made new level_struct which contained a vector of level_directive_struct. Got rid of level_name[][]. Added function get_dstruct (overloaded) for inputting data into directive vectors. Moved function declarations below structure definitions. I was absolutely stunned to find that the changes - which consisted of programming techniques I was almost entirely unfamiliar with - worked first time except for a slight glitch, which I fixed by moving the second_time detection below the bit which increments the level. Only aspect of levels not converted yet is messages. - Fixed flickering death sequence colours - it was due to a stupid oversight when I had originally tried to speed up the flashing. There was still one glitch left - an unused part of the array was being accessed for colour information at the end of the sequence. Fixed by increasing size of array from 191 to 192. - Tidied sprite/teleport/particle initialisations (they were happening in disorganised places). - Moved death sequence colour cycling to screen_swap(), to fix timing discrepancy which had arisen when I changed the default mode to double buffered. Death sequence colours will no longer display in pageflip mode. Reset death_counter to 0 after main game loop is exited. - Out of interest, made it so that splines appeared during DEATH sequences. - Implemented OMNIVISION on main menu. Got rid of redraw_counter, I spit on the old frame dropping method. Moved mouse click detection from graphical part to processing part (what was it doing there in the first place)? Made time_waiting (part of OMNIVISION) a global variable. - Changed spline into a vector, allowing multiple splines. Effect is totally kickass. - Nuke shrapnel wasn't working properly. After hours and hours of searching, found the error. The shrapnel code is fundamentally flawed - because the shrapnel code is run AFTER the old sprite was destroyed. This is okay for the first piece of shrapnel because the data for the old sprite is still there. However, because the original sprite no longer exists, this data is liable to be overwritten by the new sprite. If this happens, the second piece of shrapnel won't be created properly because the information required to create it is no longer there. To fix this, I will move the shrapnel code to the beginning of the nuke (and other types which do shrapnel) death code - before the original sprite is deleted. - Added two line spaces to log file at start of each game. - Made it so that colour 0 was always set to black whenever the game returned to the menu. - Fixed bug where Super Grunts, Mines, Nukes and Aggressive Generators were being scored wrongly (as if they had been hit by a bullet) when they were killed by the lasers. - Added error detection to create_object() - writes error to log file if all sprite slots are filled. - Changed all instances of _putpixel to putpixel. - Added pageflip/double buffer option. Some things on sidebar now don't work properly. Replaced instances page1/page2 in non-setup code with active_page/visual_page. Didn't work. Fixed by setting clip of visual_page to full screen in screen_swap(). - Changed message1,2,3 in level_struct to C++ strings. This reduced the memory usage of level by about 850k. - Added mouse detection. - Switched to C++. Do some tidying up of loop variables. - Added explosions for super grunts hit by bullets, after noticing an oversight from when I orignally wrote that routine. - Changed message_id from char to short. - Lots of other changes between 0.91/0.92 were done before the creation of this list. 0.92 Sometime in late summer or autumn of 1998
Recent progress: Circlular attack waves, module player, more flexible reward system (now you can be awarded by things other than a free DEATH).
Even more recently (29/8/98), some extra enemies have been added. Work on the main menu has started, and it looks and sounds very nice. I am starting to think of how I am going to deal with making the levels.
Latest news (3/10/98) - DEATH has been delayed by eight months due to the difficulty of creating levels.
Latest news (18/1/99) - No progress has been made since the last announcement - I've been concentrating on PSector, which will now be my first released game (instead of DEATH).
6/5/99 - I have now written down the concepts for 33 out of 50 levels. When I have designed all 50, I will start programming the levels, which will take a very long time.
1/2/2000 - Much progress has been made since the top of the revision history you see above you. Several more levels have been made, but there are a massive number to go. It is fairly unlikely that the game will be finished by the summer.
Go back to the ARGnet index...
Copyright 1997-2018 Andrew R. Gillett.