Browse Source

* better handling of special weapon timeout.

* the bomb is now part of the standard fire button effect.
  * overlay for life and special weapon jauges.
tags/v0.99.beta14
Sam Hocevar sam 22 years ago
parent
commit
24d8d4c06a
5 changed files with 216 additions and 65 deletions
  1. +5
    -4
      src/Makefile.am
  2. +84
    -26
      src/common.h
  3. +37
    -31
      src/main.c
  4. +86
    -0
      src/overlay.c
  5. +4
    -4
      src/player.c

+ 5
- 4
src/Makefile.am View File

@@ -22,16 +22,17 @@ ttyvaders_SOURCES = \
aliens.c \ aliens.c \
bonus.c \ bonus.c \
ceo.c \ ceo.c \
collide.c \
common.h \ common.h \
explosions.c \ explosions.c \
graphics.c \
main.c \ main.c \
math.c \ math.c \
starfield.c \
weapons.c \
collide.c \
graphics.c \
overlay.c \
player.c \ player.c \
starfield.c \
tunnel.c \ tunnel.c \
weapons.c \
$(NULL) $(NULL)


ttyvaders_CPPFLAGS = $(CPPFLAGS_slang) $(CPPFLAGS_ncurses) ttyvaders_CPPFLAGS = $(CPPFLAGS_slang) $(CPPFLAGS_ncurses)


+ 84
- 26
src/common.h View File

@@ -3,7 +3,7 @@
* Copyright (c) 2002 Sam Hocevar <sam@zoy.org> * Copyright (c) 2002 Sam Hocevar <sam@zoy.org>
* All Rights Reserved * 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 * 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 * 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. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */


#define MAX_LIFE 1000

/*
* Compile-time limits
*/
#define STARS 50 #define STARS 50
#define WEAPONS 200 #define WEAPONS 200
#define BONUS 30 #define BONUS 30
#define ALIENS 30 #define ALIENS 30
#define EXPLOSIONS 200 #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 #ifdef USE_SLANG
# include <slang.h> # include <slang.h>
# define gfx_color(x) SLsmg_set_color(x) # 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) #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_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_MAX(a,b) ((a)>(b)?(a):(b))
#define GET_MIN(a,b) ((a)<(b)?(a):(b)) #define GET_MIN(a,b) ((a)<(b)?(a):(b))


/*
* Game structures
*/
typedef struct typedef struct
{ {
int w, h, *left, *right; int w, h, *left, *right;
@@ -105,7 +125,7 @@ typedef struct
{ {
int x, y; int x, y;
int vx, vy; int vx, vy;
int weapon, nuke;
int weapon, special;
int life, dead; int life, dead;


} player; } player;
@@ -145,15 +165,45 @@ typedef struct
#define CYAN 9 #define CYAN 9
#define MAGENTA 10 #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 init_aliens( game *g, aliens *al );
void draw_aliens( game *g, aliens *al ); void draw_aliens( game *g, aliens *al );
void update_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 ); 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 ); int init_graphics( void );
void init_game( game *g ); void init_game( game *g );
char get_key( void ); char get_key( void );
@@ -161,37 +211,45 @@ void clear_graphics( void );
void refresh_graphics( void ); void refresh_graphics( void );
void end_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 ); player * create_player( game *g );
void free_player( player *p ); void free_player( player *p );
void draw_player( game *g, player *p ); void draw_player( game *g, player *p );
void update_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 ); starfield * create_starfield( game *g );
void draw_starfield( game *g, starfield *s ); void draw_starfield( game *g, starfield *s );
void update_starfield( game *g, starfield *s ); void update_starfield( game *g, starfield *s );
void free_starfield( game *g, starfield *s ); void free_starfield( game *g, starfield *s );


/*
* From tunnel.c
*/
tunnel * create_tunnel( game *g, int w, int h ); tunnel * create_tunnel( game *g, int w, int h );
void free_tunnel( tunnel *t ); void free_tunnel( tunnel *t );
void draw_tunnel( game *g, tunnel *t ); void draw_tunnel( game *g, tunnel *t );
void update_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 );



+ 37
- 31
src/main.c View File

@@ -3,7 +3,7 @@
* Copyright (c) 2002 Sam Hocevar <sam@zoy.org> * Copyright (c) 2002 Sam Hocevar <sam@zoy.org>
* All Rights Reserved * 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 * 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 * 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 ) 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; break;
}

switch( key )
{
case 'h': case 'h':
g->p->vx = -2; g->p->vx = -2;
break; break;
@@ -110,52 +118,49 @@ static void start_game (game *g)
g->p->vx = 2; g->p->vx = 2;
break; break;
case 'n': 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 ); add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, 0, WEAPON_NUKE );
} }
break; 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': 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 ); add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, -16, WEAPON_FRAGBOMB );
} }
break; break;
case 'b': 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 ' ': case ' ':
if( g->p->weapon == 0 ) if( g->p->weapon == 0 )
{ {
g->p->weapon = 4; 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 << 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 ); 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 << 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 ); 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 + 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 ); 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 + 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 ); 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 << 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 ); 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; break;
}
} }
} }


@@ -209,6 +214,7 @@ static void start_game (game *g)
draw_explosions( g, g->ex ); draw_explosions( g, g->ex );
draw_weapons( g, g->wp ); draw_weapons( g, g->wp );
draw_player( g, g->p ); draw_player( g, g->p );
draw_overlay( g );


/* Refresh */ /* Refresh */
refresh_graphics(); refresh_graphics();


+ 86
- 0
src/overlay.c View File

@@ -0,0 +1,86 @@
/*
* ttyvaders Textmode shoot'em up
* Copyright (c) 2002 Sam Hocevar <sam@zoy.org>
* 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 <stdlib.h>

#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" );
}


+ 4
- 4
src/player.c View File

@@ -3,7 +3,7 @@
* Copyright (c) 2002 Sam Hocevar <sam@zoy.org> * Copyright (c) 2002 Sam Hocevar <sam@zoy.org>
* All Rights Reserved * 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 * 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 * 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->vx = 0;
p->vy = 0; p->vy = 0;
p->weapon = 0; p->weapon = 0;
p->nuke = 0;
p->special = MAX_SPECIAL;
p->life = MAX_LIFE; p->life = MAX_LIFE;


return p; return p;
@@ -86,9 +86,9 @@ void update_player( game *g, player *p )
p->weapon--; p->weapon--;
} }


if( p->nuke )
if( p->special < MAX_SPECIAL )
{ {
p->nuke--;
p->special++;
} }


/* Update life */ /* Update life */


Loading…
Cancel
Save