Quellcode durchsuchen

* new weapon: bomb.

* beam now collides with aliens.


git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/ttyvaders/trunk@24 92316355-f0b4-4df1-b90c-862c8a59935f
master
sam vor 22 Jahren
Ursprung
Commit
fe21f4a9c9
6 geänderte Dateien mit 291 neuen und 55 gelöschten Zeilen
  1. +32
    -0
      doc/shapes.txt
  2. +3
    -3
      src/aliens.c
  3. +49
    -14
      src/collide.c
  4. +3
    -3
      src/common.h
  5. +40
    -35
      src/main.c
  6. +164
    -0
      src/weapons.c

+ 32
- 0
doc/shapes.txt Datei anzeigen

@@ -26,6 +26,10 @@ Aliens
_o|o_
T|T

_
,(|). / \
/,-'-.\ ,(_X_).

Bonus
-----
_ _ _
@@ -61,12 +65,40 @@ Shots
\ __ __ /
| \ / |

___ _, ._ ,^. _, ._
. o |___> / | | \ | | ,-' / \ `-.
/ / \ \ |_| \,-' `-./
`' `'
___ ,. ,. _
<___| \ \ / / | | /`-. ,-'\
\_| |_/ | | `-._\ /_,-'
`v' ` '

| | | |||| |/\|
|| || || |||||| ||/\||
| | | | | | |

:%%:
:%%: :%##%:
__ __ __ ____ :%%: :%##%: :%####%:
' ` -' `- ,-' `-. ,-' `-. ,-' `-. ,-' `-. ,-' `-.

,--.
( )
`--'
o O
o °
. °
.

,--.
( )
||||
||||
||
|

Explosions
----------



+ 3
- 3
src/aliens.c Datei anzeigen

@@ -81,13 +81,13 @@ void add_alien( game *g, aliens *al, int x, int y, int type )
switch( al->type[i] )
{
case ALIEN_POOLP:
al->life[i] = 2;
al->life[i] = 3;
break;
case ALIEN_BOOL:
al->life[i] = 2;
al->life[i] = 3;
break;
case ALIEN_BRAH:
al->life[i] = 2;
al->life[i] = 3;
break;
case ALIEN_NONE:
break;


+ 49
- 14
src/collide.c Datei anzeigen

@@ -17,22 +17,29 @@ void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex )
case WEAPON_NONE:
break;
case WEAPON_SEEKER:
case WEAPON_BOMB:
if( x <= t->left[y]
|| x >= t->right[y] )
{
add_explosion( g, ex, x, y, 0, 1, EXPLOSION_SMALL );
int damage = wp->type[i] == WEAPON_SEEKER ? 1 : 2;

add_explosion( g, ex, x, y, 0, 1, wp->type[i] == WEAPON_SEEKER ? EXPLOSION_SMALL : EXPLOSION_MEDIUM );

if( x <= t->left[y] )
{
t->left[y-1]--;
t->left[y]-=2;
t->left[y+1]--;
t->right[y-2] -= damage - 1;
t->left[y-1] -= damage;
t->left[y] -= damage + 1;
t->left[y+1] -= damage;
t->right[y+2] -= damage - 1;
}
else
{
t->right[y-1]++;
t->right[y]+=2;
t->right[y+1]++;
t->right[y-2] += damage - 1;
t->right[y-1] += damage;
t->right[y] += damage + 1;
t->right[y+1] += damage;
t->right[y+2] += damage - 1;
}

wp->type[i] = WEAPON_NONE;
@@ -81,7 +88,8 @@ void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex )
}
break;
case WEAPON_NUKE:
/* The nuke does not break the tunnel */
case WEAPON_BEAM:
/* The nuke and the laser do not break the tunnel */
break;
}
}
@@ -126,6 +134,30 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex )
}
}
break;
case WEAPON_BEAM:
r = (29 - wp->n[i]) * (29 - wp->n[i]) / 8;

for( j = 0; j < ALIENS; j++ )
{
if( al->type[j] == ALIEN_NONE )
{
continue;
}

if( x >= al->x[j] && x <= al->x[j] + 4
&& y >= al->y[j] + 2 && y-5-r <= al->y[j] )
{
al->life[j] -= 4;
if( al->life[j] <= 0 )
{
al->type[j] = ALIEN_NONE;
add_explosion( g, ex, al->x[j], al->y[j], 0, 0, EXPLOSION_MEDIUM );
add_bonus( g, g->bo, al->x[j], al->y[j], GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
}
}
}
break;

case WEAPON_LASER:
for( j = 0; j < ALIENS; j++ )
{
@@ -141,8 +173,8 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex )
if( al->life[j] <= 0 )
{
al->type[j] = ALIEN_NONE;
add_explosion( g, ex, x, y, 0, 0, EXPLOSION_MEDIUM );
add_bonus( g, g->bo, x, y, GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
add_explosion( g, ex, al->x[j], al->y[j], 0, 0, EXPLOSION_MEDIUM );
add_bonus( g, g->bo, al->x[j], al->y[j], GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
}
ok = 1;
}
@@ -153,8 +185,8 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex )
if( al->life[j] <= 0 )
{
al->type[j] = ALIEN_NONE;
add_explosion( g, ex, x, y+1, 0, 0, EXPLOSION_MEDIUM );
add_bonus( g, g->bo, x, y+1, GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
add_explosion( g, ex, al->x[j], al->y[j]+1, 0, 0, EXPLOSION_MEDIUM );
add_bonus( g, g->bo, al->x[j], al->y[j]+1, GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
}
ok = 1;
}
@@ -162,11 +194,13 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex )

if( ok )
{
add_explosion( g, ex, x, y+1, 0, 0, EXPLOSION_SMALL );
wp->type[i] = WEAPON_NONE;
}
break;

case WEAPON_SEEKER:
case WEAPON_BOMB:
for( j = 0; j < ALIENS; j++ )
{
if( al->type[j] == ALIEN_NONE )
@@ -181,8 +215,8 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex )
if( al->life[j] <= 0 )
{
al->type[j] = ALIEN_NONE;
add_explosion( g, ex, x, y, 0, 0, EXPLOSION_MEDIUM );
add_bonus( g, g->bo, x, y, GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
add_explosion( g, ex, al->x[j], al->y[j], 0, 0, EXPLOSION_MEDIUM );
add_bonus( g, g->bo, al->x[j], al->y[j], GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
}
ok = 1;
}
@@ -190,6 +224,7 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex )

if( ok )
{
add_explosion( g, ex, x, y+1, 0, 0, wp->type[i] == WEAPON_SEEKER ? EXPLOSION_SMALL : EXPLOSION_MEDIUM );
wp->type[i] = WEAPON_NONE;
}
break;


+ 3
- 3
src/common.h Datei anzeigen

@@ -1,9 +1,9 @@

#define STARS 50
#define WEAPONS 50
#define WEAPONS 100
#define BONUS 30
#define ALIENS 30
#define EXPLOSIONS 20
#define EXPLOSIONS 100

#ifdef USE_SLANG
# include <slang.h>
@@ -52,7 +52,7 @@ typedef struct

typedef struct
{
enum { WEAPON_NONE, WEAPON_LASER, WEAPON_SEEKER, WEAPON_NUKE, WEAPON_BEAM } type[WEAPONS];
enum { WEAPON_NONE, WEAPON_LASER, WEAPON_SEEKER, WEAPON_NUKE, WEAPON_BEAM, WEAPON_LIGHTNING, WEAPON_BOMB } type[WEAPONS];
int x[WEAPONS];
int y[WEAPONS];
int x2[WEAPONS];


+ 40
- 35
src/main.c Datei anzeigen

@@ -127,8 +127,7 @@ static void start_game (game *g)
if( g->p->weapon == 0 )
{
g->p->weapon = 4;
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 + 2) << 4, g->p->y << 4, 0, -16, WEAPON_BOMB );
}
case ' ':
if( g->p->weapon == 0 )
@@ -136,6 +135,18 @@ static void start_game (game *g)
g->p->weapon = 4;
add_weapon( g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_LASER );
add_weapon( g, g->wp, (g->p->x + 5) << 4, g->p->y << 4, 0, -16, WEAPON_LASER );
/* Extra shtuph */
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 */
add_weapon( g, g->wp, (g->p->x + 1) << 4, (g->p->y - 1) << 4, 0, -16, WEAPON_LASER );
add_weapon( g, g->wp, (g->p->x + 4) << 4, (g->p->y - 1) << 4, 0, -16, WEAPON_LASER );
/* Even more shtuph */
add_weapon( g, g->wp, (g->p->x + 2) << 4, (g->p->y - 1) << 4, 0, -16, WEAPON_LASER );
add_weapon( g, g->wp, (g->p->x + 3) << 4, (g->p->y - 1) << 4, 0, -16, WEAPON_LASER );
/* Extra shtuph */
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 );
}
break;
}
@@ -143,48 +154,42 @@ static void start_game (game *g)

usleep(40000);

if( GET_RAND(0,10) == 0 )
if( !poz || skip )
{
int list[3] = { ALIEN_POOLP, ALIEN_BOOL, ALIEN_BRAH };
skip = 0;

add_alien( g, g->al, 0, rand() % g->h / 2, list[GET_RAND(0,3)] );
}

if( poz )
{
if( skip )
/* XXX: to be removed */
if( GET_RAND(0,10) == 0 )
{
skip = 0;
int list[3] = { ALIEN_POOLP, ALIEN_BOOL, ALIEN_BRAH };

add_alien( g, g->al, 0, rand() % g->h / 2, list[GET_RAND(0,3)] );
}
else

/* Update game rules */
if( g->t->right[1] - g->t->left[1] == g->t->w )
{
continue;
g->t->w = 85 - g->t->w;
}
}

/* Update game rules */
if( g->t->right[1] - g->t->left[1] == g->t->w )
{
g->t->w = 85 - g->t->w;
}

/* Scroll and update positions */
collide_player_tunnel( g, g->p, g->t, g->ex );
update_player( g, g->p );
collide_player_tunnel( g, g->p, g->t, g->ex );
/* Scroll and update positions */
collide_player_tunnel( g, g->p, g->t, g->ex );
update_player( g, g->p );
collide_player_tunnel( g, g->p, g->t, g->ex );

update_starfield( g, g->sf );
update_bonus( g, g->bo );
update_aliens( g, g->al );
update_starfield( g, g->sf );
update_bonus( g, g->bo );
update_aliens( g, g->al );

collide_weapons_tunnel( g, g->wp, g->t, g->ex );
collide_weapons_aliens( g, g->wp, g->al, g->ex );
update_weapons( g, g->wp );
collide_weapons_tunnel( g, g->wp, g->t, g->ex );
collide_weapons_aliens( g, g->wp, g->al, g->ex );
collide_weapons_tunnel( g, g->wp, g->t, g->ex );
collide_weapons_aliens( g, g->wp, g->al, g->ex );
update_weapons( g, g->wp );
collide_weapons_tunnel( g, g->wp, g->t, g->ex );
collide_weapons_aliens( g, g->wp, g->al, g->ex );

update_explosions( g, g->ex );
/*if(purcompteur%2)*/ update_tunnel( g, g->t );
update_explosions( g, g->ex );
/*if(purcompteur%2)*/ update_tunnel( g, g->t );
}

/* Clear screen */
clear_graphics();
@@ -195,8 +200,8 @@ static void start_game (game *g)
draw_bonus( g, g->bo );
draw_aliens( g, g->al );
draw_player( g, g->p );
draw_weapons( g, g->wp );
draw_explosions( g, g->ex );
draw_weapons( g, g->wp );

/* Refresh */
refresh_graphics();


+ 164
- 0
src/weapons.c Datei anzeigen

@@ -4,6 +4,7 @@

#include "common.h"

static void draw_bomb( int x, int y, int vx, int vy );
static void draw_nuke( int x, int y, int frame );
static void draw_beam( int x, int y, int frame );
static void draw_circle( int x, int y, int r, char c );
@@ -44,6 +45,20 @@ void draw_weapons( game *g, weapons *wp )
gfx_goto( wp->x[i] >> 4, wp->y[i] >> 4 );
gfx_putchar( '@' );
break;
case WEAPON_BOMB:
gfx_color( GRAY );
gfx_goto( (wp->x[i] - wp->vx[i]) >> 4, (wp->y[i] - wp->vy[i]) >> 4 );
gfx_putchar( '.' );
gfx_goto( (wp->x3[i] - wp->vx[i]) >> 4, (wp->y3[i] - wp->vy[i]) >> 4 );
gfx_putchar( '.' );
gfx_goto( (wp->x2[i] - wp->vx[i]) >> 4, (wp->y2[i] - wp->vy[i]) >> 4 );
gfx_putchar( '.' );
gfx_goto( wp->x3[i] >> 4, wp->y3[i] >> 4 );
gfx_putchar( '.' );
gfx_goto( wp->x2[i] >> 4, wp->y2[i] >> 4 );
gfx_putchar( '.' );
draw_bomb( wp->x[i] >> 4, wp->y[i] >> 4, wp->vx[i], wp->vy[i] );
break;
case WEAPON_BEAM:
draw_beam( wp->x[i] >> 4, wp->y[i] >> 4, wp->n[i] );
break;
@@ -72,6 +87,7 @@ void update_weapons( game *g, weapons *wp )
wp->type[i] = WEAPON_NONE;
}
break;
case WEAPON_BOMB:
case WEAPON_SEEKER:
/* Update tail */
wp->x3[i] = wp->x2[i];
@@ -175,6 +191,7 @@ void add_weapon( game *g, weapons *wp, int x, int y, int vx, int vy, int type )
case WEAPON_LASER:
break;
case WEAPON_SEEKER:
case WEAPON_BOMB:
wp->x2[i] = x;
wp->y2[i] = y;
wp->x3[i] = x;
@@ -195,6 +212,153 @@ void add_weapon( game *g, weapons *wp, int x, int y, int vx, int vy, int type )
}
}

static void draw_bomb( int x, int y, int vx, int vy )
{
vy *= 2;
gfx_color( CYAN );

if( vx > vy )
{
if( vx > -vy ) /* right quarter */
{
if( vy > vx/4 )
{
/* -1pi/6 */
gfx_goto( x-4, y-1 );
gfx_putstr( "/`-." );
gfx_goto( x-4, y );
gfx_putstr( "`-._\\" );
gfx_goto( x, y+1 );
gfx_putchar( '`' );
}
else if( vy < -vx/4 )
{
/* 1pi/6 */
gfx_goto( x-1, y-1 );
gfx_putstr( "_," );
gfx_goto( x-4, y );
gfx_putstr( ",-' /" );
gfx_goto( x-4, y+1 );
gfx_putstr( "\\,-'" );
}
else
{
/* 0pi/6 */
gfx_goto( x-4, y-1 );
gfx_putstr( "____" );
gfx_goto( x-5, y );
gfx_putstr( "|____>" );
}
}
else /* top quarter */
{
if( vx > -vy/4 )
{
/* 2pi/6 */
gfx_goto( x-1, y-1 );
gfx_putstr( "_," );
gfx_goto( x-2, y );
gfx_putstr( "/ |" );
gfx_goto( x-3, y+1 );
gfx_putstr( "/ /" );
gfx_goto( x-3, y+2 );
gfx_putstr( "`'" );
}
else if( vx < vy/4 )
{
/* 4pi/6 */
gfx_goto( x, y-1 );
gfx_putstr( "._" );
gfx_goto( x, y );
gfx_putstr( "| \\" );
gfx_goto( x+1, y+1 );
gfx_putstr( "\\ \\" );
gfx_goto( x+2, y+2 );
gfx_putstr( "`'" );
}
else
{
/* 3pi/6 */
gfx_goto( x-1, y );
gfx_putstr( ",^." );
gfx_goto( x-1, y+1 );
gfx_putstr( "| |" );
gfx_goto( x-1, y+2 );
gfx_putstr( "|_|" );
}
}
}
else
{
if( vx > -vy ) /* bottom quarter */
{
if( vx > vy/4 )
{
/* -2pi/6 */
gfx_goto( x-2, y-2 );
gfx_putstr( ",." );
gfx_goto( x-2, y-1 );
gfx_putstr( "\\ \\" );
gfx_goto( x-1, y );
gfx_putstr( "\\_|" );
}
else if( vx < -vy/4 )
{
/* -4pi/6 */
gfx_goto( x+1, y-2 );
gfx_putstr( ",." );
gfx_goto( x, y-1 );
gfx_putstr( "/ /" );
gfx_goto( x-1, y );
gfx_putstr( "|_/" );
}
else
{
/* -3pi/6 */
gfx_goto( x, y-3 );
gfx_putchar( '_' );
gfx_goto( x-1, y-2 );
gfx_putstr( "| |" );
gfx_goto( x-1, y-1 );
gfx_putstr( "| |" );
gfx_goto( x-1, y );
gfx_putstr( "`v'" );
}
}
else /* left quarter */
{
if( vy > -vx/4 )
{
/* -5pi/6 */
gfx_goto( x+1, y-1 );
gfx_putstr( ",-'\\" );
gfx_goto( x, y );
gfx_putstr( "/_,-'" );
gfx_goto( x, y+1 );
gfx_putchar( '\'' );
}
else if( vy < vx/4 )
{
/* 5pi/6 */
gfx_goto( x, y-1 );
gfx_putstr( "._" );
gfx_goto( x, y );
gfx_putstr( "\\ `-." );
gfx_goto( x+1, y+1 );
gfx_putstr( "`-./" );
}
else
{
/* 6pi/6 */
gfx_goto( x+1, y-1 );
gfx_putstr( "____" );
gfx_goto( x, y );
gfx_putstr( "<____|" );
}
}
}
}

static void draw_beam( int x, int y, int frame )
{
int r = (29 - frame) * (29 - frame) / 8;


Laden…
Abbrechen
Speichern