From 24d8d4c06a9c4520896d20a77a15de41bd6200f9 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Mon, 23 Dec 2002 15:06:13 +0000 Subject: [PATCH] * better handling of special weapon timeout. * the bomb is now part of the standard fire button effect. * overlay for life and special weapon jauges. --- src/Makefile.am | 9 ++-- src/common.h | 110 ++++++++++++++++++++++++++++++++++++------------ src/main.c | 68 ++++++++++++++++-------------- src/overlay.c | 86 +++++++++++++++++++++++++++++++++++++ src/player.c | 8 ++-- 5 files changed, 216 insertions(+), 65 deletions(-) create mode 100644 src/overlay.c diff --git a/src/Makefile.am b/src/Makefile.am index 1913174..dd81679 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,16 +22,17 @@ ttyvaders_SOURCES = \ aliens.c \ bonus.c \ ceo.c \ + collide.c \ common.h \ explosions.c \ + graphics.c \ main.c \ math.c \ - starfield.c \ - weapons.c \ - collide.c \ - graphics.c \ + overlay.c \ player.c \ + starfield.c \ tunnel.c \ + weapons.c \ $(NULL) ttyvaders_CPPFLAGS = $(CPPFLAGS_slang) $(CPPFLAGS_ncurses) diff --git a/src/common.h b/src/common.h index c970524..af624a2 100644 --- a/src/common.h +++ b/src/common.h @@ -3,7 +3,7 @@ * Copyright (c) 2002 Sam Hocevar * All Rights Reserved * - * $Id: common.h,v 1.13 2002/12/23 13:46:27 sam Exp $ + * $Id: common.h,v 1.14 2002/12/23 15:06:13 sam Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,14 +20,28 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#define MAX_LIFE 1000 - +/* + * Compile-time limits + */ #define STARS 50 #define WEAPONS 200 #define BONUS 30 #define ALIENS 30 #define EXPLOSIONS 200 +/* + * Game defines + */ +#define MAX_LIFE 1000 +#define MAX_SPECIAL 200 + +#define COST_NUKE (100*MAX_SPECIAL/100) +#define COST_BEAM (75*MAX_SPECIAL/100) +#define COST_FRAGBOMB (50*MAX_SPECIAL/100) + +/* + * Graphics primitives + */ #ifdef USE_SLANG # include # define gfx_color(x) SLsmg_set_color(x) @@ -49,10 +63,16 @@ #define gfx_putcharTO(x,y,c) do{ gfx_goto(x,y); gfx_putchar(c); }while(0) +/* + * Useful macros + */ #define GET_RAND(p,q) ((p)+(int)((1.0*((q)-(p)))*rand()/(RAND_MAX+1.0))) #define GET_MAX(a,b) ((a)>(b)?(a):(b)) #define GET_MIN(a,b) ((a)<(b)?(a):(b)) +/* + * Game structures + */ typedef struct { int w, h, *left, *right; @@ -105,7 +125,7 @@ typedef struct { int x, y; int vx, vy; - int weapon, nuke; + int weapon, special; int life, dead; } player; @@ -145,15 +165,45 @@ typedef struct #define CYAN 9 #define MAGENTA 10 -void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex ); -void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ); -void collide_player_tunnel( game *g, player *p, tunnel *t, explosions *ex ); - +/* + * From aliens.c + */ void init_aliens( game *g, aliens *al ); void draw_aliens( game *g, aliens *al ); void update_aliens( game *g, aliens *al ); void add_alien( game *g, aliens *al, int x, int y, int type ); +/* + * From bonus.c + */ +void init_bonus( game *g, bonus *bo ); +void draw_bonus( game *g, bonus *bo ); +void update_bonus( game *g, bonus *bo ); +void add_bonus( game *g, bonus *bo, int x, int y, int type ); + +/* + * From ceo.c + */ +void ceo_alert( void ); + +/* + * From collide.c + */ +void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex ); +void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ); +void collide_player_tunnel( game *g, player *p, tunnel *t, explosions *ex ); + +/* + * From explosions.c + */ +void init_explosions( game *g, explosions *ex ); +void add_explosion( game *g, explosions *ex, int x, int y, int vx, int vy, int type ); +void draw_explosions( game *g, explosions *ex ); +void update_explosions( game *g, explosions *ex ); + +/* + * From graphics.c + */ int init_graphics( void ); void init_game( game *g ); char get_key( void ); @@ -161,37 +211,45 @@ void clear_graphics( void ); void refresh_graphics( void ); void end_graphics( void ); +/* + * From math.c + */ +int r00t( int a ); + +/* + * From overlay.c + */ +void draw_overlay( game *g ); + +/* + * From player.c + */ player * create_player( game *g ); void free_player( player *p ); void draw_player( game *g, player *p ); void update_player( game *g, player *p ); -void init_weapons( game *g, weapons *wp ); -void draw_weapons( game *g, weapons *wp ); -void update_weapons( game *g, weapons *wp ); -void add_weapon( game *g, weapons *wp, int x, int y, int vx, int vy, int type ); - -void init_bonus( game *g, bonus *bo ); -void draw_bonus( game *g, bonus *bo ); -void update_bonus( game *g, bonus *bo ); -void add_bonus( game *g, bonus *bo, int x, int y, int type ); - +/* + * From starfield.c + */ starfield * create_starfield( game *g ); void draw_starfield( game *g, starfield *s ); void update_starfield( game *g, starfield *s ); void free_starfield( game *g, starfield *s ); +/* + * From tunnel.c + */ tunnel * create_tunnel( game *g, int w, int h ); void free_tunnel( tunnel *t ); void draw_tunnel( game *g, tunnel *t ); void update_tunnel( game *g, tunnel *t ); -void init_explosions( game *g, explosions *ex ); -void add_explosion( game *g, explosions *ex, int x, int y, int vx, int vy, int type ); -void draw_explosions( game *g, explosions *ex ); -void update_explosions( game *g, explosions *ex ); - -void ceo_alert( void ); - -int r00t( int a ); +/* + * From weapons.c + */ +void init_weapons( game *g, weapons *wp ); +void draw_weapons( game *g, weapons *wp ); +void update_weapons( game *g, weapons *wp ); +void add_weapon( game *g, weapons *wp, int x, int y, int vx, int vy, int type ); diff --git a/src/main.c b/src/main.c index 955a724..1a912ae 100644 --- a/src/main.c +++ b/src/main.c @@ -3,7 +3,7 @@ * Copyright (c) 2002 Sam Hocevar * All Rights Reserved * - * $Id: main.c,v 1.14 2002/12/23 13:46:27 sam Exp $ + * $Id: main.c,v 1.15 2002/12/23 15:06:13 sam Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -84,19 +84,27 @@ static void start_game (game *g) { switch( key ) { - case 'q': - quit = 1; - break; - case 'p': - poz = !poz; - break; - case '\t': - ceo_alert(); - poz = 1; - break; - case 's': - skip = 1; + case 'q': + quit = 1; + break; + case 'p': + poz = !poz; + break; + case '\t': + ceo_alert(); + poz = 1; + break; + case 's': + skip = 1; + break; + default: + if( g->p->dead ) + { break; + } + + switch( key ) + { case 'h': g->p->vx = -2; break; @@ -110,52 +118,49 @@ static void start_game (game *g) g->p->vx = 2; break; case 'n': - if( g->p->nuke == 0 ) + if( g->p->special >= COST_NUKE ) { - g->p->nuke = 40; + g->p->special -= COST_NUKE; add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, 0, WEAPON_NUKE ); } break; - case '\r': - if( g->p->nuke == 0 ) - { - g->p->nuke = 40; - add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, 0, WEAPON_BEAM ); - } - break; case 'f': - if( g->p->nuke == 0 ) + if( g->p->special >= COST_FRAGBOMB ) { - g->p->nuke = 40; + g->p->special -= COST_FRAGBOMB; add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, -16, WEAPON_FRAGBOMB ); } break; case 'b': - if( g->p->weapon == 0 ) + if( g->p->special >= COST_BEAM ) { - g->p->weapon = 4; - add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, -16, WEAPON_BOMB ); + g->p->special -= COST_BEAM; + add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, 0, WEAPON_BEAM ); } + break; case ' ': if( g->p->weapon == 0 ) { g->p->weapon = 4; add_weapon( g, g->wp, g->p->x << 4, g->p->y << 4, 0, -32, WEAPON_LASER ); add_weapon( g, g->wp, (g->p->x + 5) << 4, g->p->y << 4, 0, -32, WEAPON_LASER ); - /* Extra shtuph */ + /* Extra schtuph */ add_weapon( g, g->wp, g->p->x << 4, g->p->y << 4, -24, -16, WEAPON_SEEKER ); add_weapon( g, g->wp, (g->p->x + 5) << 4, g->p->y << 4, 24, -16, WEAPON_SEEKER ); - /* More shtuph */ + /* More schtuph */ add_weapon( g, g->wp, (g->p->x + 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER ); add_weapon( g, g->wp, (g->p->x + 4) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER ); - /* Even more shtuph */ + /* Even more schtuph */ add_weapon( g, g->wp, (g->p->x + 2) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER ); add_weapon( g, g->wp, (g->p->x + 3) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER ); - /* Extra shtuph */ + /* Extra schtuph */ add_weapon( g, g->wp, g->p->x << 4, g->p->y << 4, -32, 0, WEAPON_SEEKER ); add_weapon( g, g->wp, (g->p->x + 5) << 4, g->p->y << 4, 32, 0, WEAPON_SEEKER ); + /* MORE SCHTUPH! */ + add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, -16, WEAPON_BOMB ); } break; + } } } @@ -209,6 +214,7 @@ static void start_game (game *g) draw_explosions( g, g->ex ); draw_weapons( g, g->wp ); draw_player( g, g->p ); + draw_overlay( g ); /* Refresh */ refresh_graphics(); diff --git a/src/overlay.c b/src/overlay.c new file mode 100644 index 0000000..3cc1f5f --- /dev/null +++ b/src/overlay.c @@ -0,0 +1,86 @@ +/* + * ttyvaders Textmode shoot'em up + * Copyright (c) 2002 Sam Hocevar + * All Rights Reserved + * + * $Id: overlay.c,v 1.1 2002/12/23 15:06:13 sam Exp $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include "common.h" + +void draw_overlay( game *g ) +{ + static char dots30[] = "------------------------------"; + static char dashes30[] = "=============================="; + + /* Draw life jauge */ + gfx_color( GRAY ); + gfx_goto( 2, 1 ); + gfx_putstr( dots30 ); + + if( g->p->life > MAX_LIFE * 7 / 10 ) + { + gfx_color( GREEN ); + } + else if( g->p->life > MAX_LIFE * 3 / 10 ) + { + gfx_color( YELLOW ); + } + else + { + gfx_color( RED ); + } + + gfx_goto( 2, 1 ); + gfx_putstr( dashes30 + ( MAX_LIFE - g->p->life ) * 30 / MAX_LIFE ); + + gfx_color( WHITE ); + gfx_goto( 1, 1 ); + gfx_putstr( "|" ); + gfx_goto( 32, 1 ); + gfx_putstr( "| L" ); + + /* Draw weapon jauge */ + gfx_color( GRAY ); + gfx_goto( 38, 1 ); + gfx_putstr( dots30 + 10 ); + + if( g->p->special > MAX_SPECIAL * 9 / 10 ) + { + gfx_color( WHITE ); + } + else if( g->p->special > MAX_SPECIAL * 3 / 10 ) + { + gfx_color( CYAN ); + } + else + { + gfx_color( BLUE ); + } + + gfx_goto( 38, 1 ); + gfx_putstr( dashes30 + 10 + ( MAX_SPECIAL - g->p->special ) * 20 / MAX_SPECIAL ); + + gfx_color( WHITE ); + gfx_goto( 37, 1 ); + gfx_putstr( "|" ); + gfx_goto( 58, 1 ); + gfx_putstr( "| S" ); +} + diff --git a/src/player.c b/src/player.c index 4da5751..494f9c9 100644 --- a/src/player.c +++ b/src/player.c @@ -3,7 +3,7 @@ * Copyright (c) 2002 Sam Hocevar * All Rights Reserved * - * $Id: player.c,v 1.6 2002/12/23 13:46:27 sam Exp $ + * $Id: player.c,v 1.7 2002/12/23 15:06:13 sam Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,7 +34,7 @@ player * create_player( game *g ) p->vx = 0; p->vy = 0; p->weapon = 0; - p->nuke = 0; + p->special = MAX_SPECIAL; p->life = MAX_LIFE; return p; @@ -86,9 +86,9 @@ void update_player( game *g, player *p ) p->weapon--; } - if( p->nuke ) + if( p->special < MAX_SPECIAL ) { - p->nuke--; + p->special++; } /* Update life */