* new super weapon, the fragmentation bomb.tags/v0.99.beta14
@@ -104,7 +104,7 @@ Shots | |||||
' ` -' `- ,-' `-. ,-' `-. ,-' `-. ,-' `-. ,-' `-. | ' ` -' `- ,-' `-. ,-' `-. ,-' `-. ,-' `-. ,-' `-. | ||||
,--. | ,--. | ||||
( () ) | |||||
( ', ) | |||||
`--' | `--' | ||||
o O | o O | ||||
o ° | o ° | ||||
@@ -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: aliens.c,v 1.6 2002/12/22 18:44:12 sam Exp $ | |||||
* $Id: aliens.c,v 1.7 2002/12/22 22:17:41 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 | ||||
@@ -67,6 +67,15 @@ void update_aliens( game *g, aliens *al ) | |||||
for( i = 0; i < ALIENS; i++ ) | for( i = 0; i < ALIENS; i++ ) | ||||
{ | { | ||||
/* If alien died, make it explode */ | |||||
if( al->type[i] != ALIEN_NONE && al->life[i] < 0 ) | |||||
{ | |||||
add_explosion( g, g->ex, al->x[i], al->y[i], 0, 0, EXPLOSION_MEDIUM ); | |||||
al->type[i] = ALIEN_NONE; | |||||
add_bonus( g, g->bo, al->x[i], al->y[i], GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE ); | |||||
} | |||||
/* Update coordinates */ | |||||
switch( al->type[i] ) | switch( al->type[i] ) | ||||
{ | { | ||||
case ALIEN_POOLP: | case ALIEN_POOLP: | ||||
@@ -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: ceo.c,v 1.3 2002/12/22 18:44:12 sam Exp $ | |||||
* $Id: ceo.c,v 1.4 2002/12/22 22:17:41 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,12 +20,15 @@ | |||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
*/ | */ | ||||
#include "config.h" | |||||
#include <unistd.h> | |||||
#include "common.h" | #include "common.h" | ||||
void ceo_alert( void ) | void ceo_alert( void ) | ||||
{ | { | ||||
char key; | |||||
int end = 0; | |||||
int end = 0; | |||||
while( !end ) | while( !end ) | ||||
{ | { | ||||
@@ -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: collide.c,v 1.6 2002/12/22 18:44:12 sam Exp $ | |||||
* $Id: collide.c,v 1.7 2002/12/22 22:17:41 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 | ||||
@@ -35,83 +35,92 @@ void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex ) | |||||
switch( wp->type[i] ) | switch( wp->type[i] ) | ||||
{ | { | ||||
case WEAPON_NONE: | |||||
break; | |||||
case WEAPON_SEEKER: | |||||
case WEAPON_BOMB: | |||||
if( x <= t->left[y] | |||||
|| x >= t->right[y] ) | |||||
{ | |||||
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 ); | |||||
case WEAPON_LIGHTNING: | |||||
case WEAPON_NONE: | |||||
break; | |||||
case WEAPON_SEEKER: | |||||
case WEAPON_BOMB: | |||||
case WEAPON_FRAGBOMB: | |||||
if( x <= t->left[y] | |||||
|| x >= t->right[y] ) | |||||
{ | |||||
int damage = wp->type[i] == WEAPON_SEEKER ? 1 : 2; | |||||
if( x <= t->left[y] ) | |||||
{ | |||||
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-2] += damage - 1; | |||||
t->right[y-1] += damage; | |||||
t->right[y] += damage + 1; | |||||
t->right[y+1] += damage; | |||||
t->right[y+2] += damage - 1; | |||||
} | |||||
add_explosion( g, ex, x, y, 0, 1, wp->type[i] == WEAPON_SEEKER ? EXPLOSION_SMALL : EXPLOSION_MEDIUM ); | |||||
wp->type[i] = WEAPON_NONE; | |||||
if( x <= t->left[y] ) | |||||
{ | |||||
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; | |||||
} | } | ||||
break; | |||||
case WEAPON_LASER: | |||||
if( x <= t->left[y+1] | |||||
|| x >= t->right[y+1] ) | |||||
else | |||||
{ | { | ||||
add_explosion( g, ex, x, y+1, 0, 1, EXPLOSION_SMALL ); | |||||
if( x <= t->left[y+1] ) | |||||
{ | |||||
t->left[y]--; | |||||
t->left[y+1]-=2; | |||||
t->left[y+2]--; | |||||
} | |||||
else | |||||
{ | |||||
t->right[y]++; | |||||
t->right[y+1]+=2; | |||||
t->right[y+2]++; | |||||
} | |||||
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; | |||||
} | |||||
if( wp->type[i] == WEAPON_FRAGBOMB ) | |||||
{ | |||||
wp->n[i] = -1; | |||||
} | |||||
else | |||||
{ | |||||
wp->type[i] = WEAPON_NONE; | wp->type[i] = WEAPON_NONE; | ||||
} | } | ||||
else if( x <= t->left[y] | |||||
|| x >= t->right[y] ) | |||||
} | |||||
break; | |||||
case WEAPON_LASER: | |||||
if( x <= t->left[y+1] | |||||
|| x >= t->right[y+1] ) | |||||
{ | |||||
add_explosion( g, ex, x, y+1, 0, 1, EXPLOSION_SMALL ); | |||||
if( x <= t->left[y+1] ) | |||||
{ | |||||
t->left[y]--; | |||||
t->left[y+1]-=2; | |||||
t->left[y+2]--; | |||||
} | |||||
else | |||||
{ | { | ||||
add_explosion( g, ex, x, y, 0, 1, EXPLOSION_SMALL ); | |||||
t->right[y]++; | |||||
t->right[y+1]+=2; | |||||
t->right[y+2]++; | |||||
} | |||||
if( x <= t->left[y] ) | |||||
{ | |||||
t->left[y-1]--; | |||||
t->left[y]-=2; | |||||
t->left[y+1]--; | |||||
} | |||||
else | |||||
{ | |||||
t->right[y-1]++; | |||||
t->right[y]+=2; | |||||
t->right[y+1]++; | |||||
} | |||||
wp->type[i] = WEAPON_NONE; | |||||
} | |||||
else if( x <= t->left[y] | |||||
|| x >= t->right[y] ) | |||||
{ | |||||
add_explosion( g, ex, x, y, 0, 1, EXPLOSION_SMALL ); | |||||
wp->type[i] = WEAPON_NONE; | |||||
if( x <= t->left[y] ) | |||||
{ | |||||
t->left[y-1]--; | |||||
t->left[y]-=2; | |||||
t->left[y+1]--; | |||||
} | |||||
else | |||||
{ | |||||
t->right[y-1]++; | |||||
t->right[y]+=2; | |||||
t->right[y+1]++; | |||||
} | } | ||||
break; | |||||
case WEAPON_NUKE: | |||||
case WEAPON_BEAM: | |||||
/* The nuke and the laser do not break the tunnel */ | |||||
break; | |||||
wp->type[i] = WEAPON_NONE; | |||||
} | |||||
break; | |||||
case WEAPON_NUKE: | |||||
case WEAPON_BEAM: | |||||
/* The nuke and the laser do not break the tunnel */ | |||||
break; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -130,125 +139,110 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ) | |||||
switch( wp->type[i] ) | switch( wp->type[i] ) | ||||
{ | { | ||||
case WEAPON_NONE: | |||||
break; | |||||
case WEAPON_NUKE: | |||||
/* Big nuke */ | |||||
r = (29 - wp->n[i]) * (29 - wp->n[i]) / 8; | |||||
case WEAPON_LIGHTNING: | |||||
case WEAPON_NONE: | |||||
break; | |||||
case WEAPON_NUKE: | |||||
/* Big nuke */ | |||||
r = (29 - wp->n[i]) * (29 - wp->n[i]) / 8; | |||||
for( j = 0; j < ALIENS; j++ ) | |||||
for( j = 0; j < ALIENS; j++ ) | |||||
{ | |||||
if( al->type[j] == ALIEN_NONE || al->life[j] < 0 ) | |||||
{ | { | ||||
if( al->type[j] == ALIEN_NONE ) | |||||
{ | |||||
continue; | |||||
} | |||||
if( wp->n[i] == 0 /* Nuke destroys _everything_ */ || | |||||
(al->x[j] - x) * (al->x[j] - x) | |||||
+ 4 * (al->y[j] - y) * (al->y[j] - y) | |||||
<= r * r ) | |||||
{ | |||||
/* Kill alien, not nuke */ | |||||
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 ); | |||||
} | |||||
continue; | |||||
} | } | ||||
break; | |||||
case WEAPON_BEAM: | |||||
r = (29 - wp->n[i]) * (29 - wp->n[i]) / 8; | |||||
for( j = 0; j < ALIENS; j++ ) | |||||
if( wp->n[i] == 0 /* Nuke destroys _everything_ */ || | |||||
(al->x[j] - x) * (al->x[j] - x) | |||||
+ 4 * (al->y[j] - y) * (al->y[j] - y) | |||||
<= r * r ) | |||||
{ | { | ||||
if( al->type[j] == ALIEN_NONE ) | |||||
{ | |||||
continue; | |||||
} | |||||
/* Kill alien, not nuke */ | |||||
al->life[j] -= 10; | |||||
} | |||||
} | |||||
break; | |||||
case WEAPON_BEAM: | |||||
r = (29 - wp->n[i]) * (29 - wp->n[i]) / 8; | |||||
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 ); | |||||
} | |||||
} | |||||
for( j = 0; j < ALIENS; j++ ) | |||||
{ | |||||
if( al->type[j] == ALIEN_NONE || al->life[j] < 0 ) | |||||
{ | |||||
continue; | |||||
} | } | ||||
break; | |||||
case WEAPON_LASER: | |||||
for( j = 0; j < ALIENS; j++ ) | |||||
if( x >= al->x[j] && x <= al->x[j] + 4 | |||||
&& y >= al->y[j] + 2 && y-5-r <= al->y[j] ) | |||||
{ | { | ||||
if( al->type[j] == ALIEN_NONE ) | |||||
{ | |||||
continue; | |||||
} | |||||
al->life[j] -= 4; | |||||
} | |||||
} | |||||
break; | |||||
if( x >= al->x[j] && x <= al->x[j] + 4 | |||||
&& y >= al->y[j] && y <= al->y[j] + 2 ) | |||||
{ | |||||
al->life[j]--; | |||||
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 ); | |||||
} | |||||
ok = 1; | |||||
} | |||||
else if( x >= al->x[j] && x <= al->x[j] + 4 | |||||
&& y+1 >= al->y[j] && y+1 <= al->y[j] + 2 ) | |||||
{ | |||||
al->life[j]--; | |||||
if( al->life[j] <= 0 ) | |||||
{ | |||||
al->type[j] = ALIEN_NONE; | |||||
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; | |||||
} | |||||
case WEAPON_LASER: | |||||
for( j = 0; j < ALIENS; j++ ) | |||||
{ | |||||
if( al->type[j] == ALIEN_NONE || al->life[j] < 0 ) | |||||
{ | |||||
continue; | |||||
} | } | ||||
if( ok ) | |||||
if( x >= al->x[j] && x <= al->x[j] + 4 | |||||
&& y >= al->y[j] && y <= al->y[j] + 2 ) | |||||
{ | { | ||||
add_explosion( g, ex, x, y+1, 0, 0, EXPLOSION_SMALL ); | |||||
wp->type[i] = WEAPON_NONE; | |||||
al->life[j]--; | |||||
ok = 1; | |||||
} | } | ||||
break; | |||||
else if( x >= al->x[j] && x <= al->x[j] + 4 | |||||
&& y+1 >= al->y[j] && y+1 <= al->y[j] + 2 ) | |||||
{ | |||||
al->life[j]--; | |||||
ok = 1; | |||||
} | |||||
} | |||||
case WEAPON_SEEKER: | |||||
case WEAPON_BOMB: | |||||
for( j = 0; j < ALIENS; j++ ) | |||||
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: | |||||
case WEAPON_FRAGBOMB: | |||||
for( j = 0; j < ALIENS; j++ ) | |||||
{ | |||||
if( al->type[j] == ALIEN_NONE || al->life[j] < 0 ) | |||||
{ | { | ||||
if( al->type[j] == ALIEN_NONE ) | |||||
{ | |||||
continue; | |||||
} | |||||
continue; | |||||
} | |||||
if( x >= al->x[j] && x <= al->x[j] + 4 | |||||
&& y >= al->y[j] && y <= al->y[j] + 2 ) | |||||
{ | |||||
al->life[j] -= wp->type[i] == WEAPON_BOMB ? 5 : 1; | |||||
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 ); | |||||
} | |||||
ok = 1; | |||||
} | |||||
if( x >= al->x[j] && x <= al->x[j] + 4 | |||||
&& y >= al->y[j] && y <= al->y[j] + 2 ) | |||||
{ | |||||
al->life[j] -= wp->type[i] == WEAPON_SEEKER ? 1 : 5; | |||||
ok = 1; | |||||
} | } | ||||
} | |||||
if( ok ) | |||||
{ | |||||
add_explosion( g, ex, x, y+1, 0, 0, wp->type[i] == WEAPON_SEEKER ? EXPLOSION_SMALL : EXPLOSION_MEDIUM ); | |||||
if( ok ) | |||||
if( wp->type[i] == WEAPON_FRAGBOMB ) | |||||
{ | |||||
wp->n[i] = -1; | |||||
} | |||||
else | |||||
{ | { | ||||
add_explosion( g, ex, x, y+1, 0, 0, wp->type[i] == WEAPON_SEEKER ? EXPLOSION_SMALL : EXPLOSION_MEDIUM ); | |||||
wp->type[i] = WEAPON_NONE; | wp->type[i] = WEAPON_NONE; | ||||
} | } | ||||
break; | |||||
} | |||||
break; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -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.7 2002/12/22 18:44:12 sam Exp $ | |||||
* $Id: common.h,v 1.8 2002/12/22 22:17:41 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 | ||||
@@ -73,7 +73,7 @@ typedef struct | |||||
typedef struct | typedef struct | ||||
{ | { | ||||
enum { WEAPON_NONE, WEAPON_LASER, WEAPON_SEEKER, WEAPON_NUKE, WEAPON_BEAM, WEAPON_LIGHTNING, WEAPON_BOMB } type[WEAPONS]; | |||||
enum { WEAPON_NONE, WEAPON_LASER, WEAPON_SEEKER, WEAPON_NUKE, WEAPON_BEAM, WEAPON_LIGHTNING, WEAPON_BOMB, WEAPON_FRAGBOMB } type[WEAPONS]; | |||||
int x[WEAPONS]; | int x[WEAPONS]; | ||||
int y[WEAPONS]; | int y[WEAPONS]; | ||||
int x2[WEAPONS]; | int x2[WEAPONS]; | ||||
@@ -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.7 2002/12/22 18:44:12 sam Exp $ | |||||
* $Id: main.c,v 1.8 2002/12/22 22:17:41 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 | ||||
@@ -129,6 +129,13 @@ static void start_game (game *g) | |||||
add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, 0, WEAPON_BEAM ); | add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, 0, WEAPON_BEAM ); | ||||
} | } | ||||
break; | break; | ||||
case 'd': | |||||
if( g->p->nuke == 0 ) | |||||
{ | |||||
g->p->nuke = 40; | |||||
add_weapon( g, g->wp, (g->p->x + 2) << 4, g->p->y << 4, 0, -16, WEAPON_FRAGBOMB ); | |||||
} | |||||
break; | |||||
case 'b': | case 'b': | ||||
if( g->p->weapon == 0 ) | if( g->p->weapon == 0 ) | ||||
{ | { | ||||
@@ -205,9 +212,9 @@ static void start_game (game *g) | |||||
draw_tunnel( g, g->t ); | draw_tunnel( g, g->t ); | ||||
draw_bonus( g, g->bo ); | draw_bonus( g, g->bo ); | ||||
draw_aliens( g, g->al ); | draw_aliens( g, g->al ); | ||||
draw_player( g, g->p ); | |||||
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 ); | |||||
/* Refresh */ | /* Refresh */ | ||||
refresh_graphics(); | refresh_graphics(); | ||||
@@ -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: weapons.c,v 1.7 2002/12/22 18:44:12 sam Exp $ | |||||
* $Id: weapons.c,v 1.8 2002/12/22 22:17:41 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 | ||||
@@ -29,6 +29,7 @@ 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_nuke( int x, int y, int frame ); | ||||
static void draw_beam( 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 ); | static void draw_circle( int x, int y, int r, char c ); | ||||
static void draw_fragbomb( int x, int y, int frame ); | |||||
void init_weapons( game *g, weapons *wp ) | void init_weapons( game *g, weapons *wp ) | ||||
{ | { | ||||
@@ -80,12 +81,16 @@ void draw_weapons( game *g, weapons *wp ) | |||||
gfx_putchar( '.' ); | gfx_putchar( '.' ); | ||||
draw_bomb( wp->x[i] >> 4, wp->y[i] >> 4, wp->vx[i], wp->vy[i] ); | draw_bomb( wp->x[i] >> 4, wp->y[i] >> 4, wp->vx[i], wp->vy[i] ); | ||||
break; | break; | ||||
case WEAPON_FRAGBOMB: | |||||
draw_fragbomb( wp->x[i] >> 4, wp->y[i] >> 4, wp->n[i] ); | |||||
break; | |||||
case WEAPON_BEAM: | case WEAPON_BEAM: | ||||
draw_beam( wp->x[i] >> 4, wp->y[i] >> 4, wp->n[i] ); | draw_beam( wp->x[i] >> 4, wp->y[i] >> 4, wp->n[i] ); | ||||
break; | break; | ||||
case WEAPON_NUKE: | case WEAPON_NUKE: | ||||
draw_nuke( wp->x[i] >> 4, wp->y[i] >> 4, wp->n[i] ); | draw_nuke( wp->x[i] >> 4, wp->y[i] >> 4, wp->n[i] ); | ||||
break; | break; | ||||
case WEAPON_LIGHTNING: | |||||
case WEAPON_NONE: | case WEAPON_NONE: | ||||
break; | break; | ||||
} | } | ||||
@@ -171,6 +176,33 @@ void update_weapons( game *g, weapons *wp ) | |||||
wp->vy[i] = (7 * wp->vy[i] | wp->vy[i] = (7 * wp->vy[i] | ||||
+ (dy * 24) / sqrt(dx*dx+dy*dy) ) / 8; | + (dy * 24) / sqrt(dx*dx+dy*dy) ) / 8; | ||||
break; | |||||
case WEAPON_FRAGBOMB: | |||||
/* If n was set to -1, the fragbomb exploded */ | |||||
if( wp->n[i] == -1 ) | |||||
{ | |||||
add_weapon( g, g->wp, wp->x[i] + 24, wp->y[i], 24, 0, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] - 24, wp->y[i], -24, 0, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i], wp->y[i] + 24, 0, 24, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i], wp->y[i] - 24, 0, -24, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] + 24, wp->y[i] + 8, 24, 8, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] - 24, wp->y[i] + 8, -24, 8, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] + 24, wp->y[i] - 8, 24, -8, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] - 24, wp->y[i] - 8, -24, -8, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] + 16, wp->y[i] + 16, 16, 16, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] - 16, wp->y[i] + 16, -16, 16, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] + 16, wp->y[i] - 16, 16, -16, WEAPON_SEEKER ); | |||||
add_weapon( g, g->wp, wp->x[i] - 16, wp->y[i] - 16, -16, -16, WEAPON_SEEKER ); | |||||
wp->type[i] = WEAPON_NONE; | |||||
} | |||||
wp->x[i] += wp->vx[i]; | |||||
wp->y[i] += wp->vy[i]; | |||||
wp->n[i]++; | |||||
if( wp->y[i] < 0 ) | |||||
{ | |||||
wp->type[i] = WEAPON_NONE; | |||||
} | |||||
break; | break; | ||||
case WEAPON_BEAM: | case WEAPON_BEAM: | ||||
wp->x[i] = (g->p->x + 2) << 4; | wp->x[i] = (g->p->x + 2) << 4; | ||||
@@ -188,6 +220,7 @@ void update_weapons( game *g, weapons *wp ) | |||||
wp->type[i] = WEAPON_NONE; | wp->type[i] = WEAPON_NONE; | ||||
} | } | ||||
break; | break; | ||||
case WEAPON_LIGHTNING: | |||||
case WEAPON_NONE: | case WEAPON_NONE: | ||||
break; | break; | ||||
} | } | ||||
@@ -207,10 +240,13 @@ void add_weapon( game *g, weapons *wp, int x, int y, int vx, int vy, int type ) | |||||
wp->vx[i] = vx; | wp->vx[i] = vx; | ||||
wp->vy[i] = vy; | wp->vy[i] = vy; | ||||
wp->type[i] = type; | wp->type[i] = type; | ||||
wp->n[i] = 0; | |||||
switch( type ) | switch( type ) | ||||
{ | { | ||||
case WEAPON_LASER: | case WEAPON_LASER: | ||||
break; | break; | ||||
case WEAPON_FRAGBOMB: | |||||
break; | |||||
case WEAPON_SEEKER: | case WEAPON_SEEKER: | ||||
case WEAPON_BOMB: | case WEAPON_BOMB: | ||||
wp->x2[i] = x; | wp->x2[i] = x; | ||||
@@ -412,6 +448,99 @@ static void draw_bomb( int x, int y, int vx, int vy ) | |||||
} | } | ||||
} | } | ||||
static void draw_fragbomb( int x, int y, int frame ) | |||||
{ | |||||
gfx_color( WHITE ); | |||||
gfx_color( frame & 1 ? CYAN : WHITE ); | |||||
gfx_goto( x-2, y ); | |||||
gfx_putstr( "( )" ); | |||||
gfx_goto( x-1, y+1 ); | |||||
gfx_putstr( "`--'" ); | |||||
gfx_color( frame & 1 ? WHITE : CYAN ); | |||||
gfx_goto( x-1, y-1 ); | |||||
gfx_putstr( ",--." ); | |||||
gfx_goto( x, y ); | |||||
gfx_putstr( "'," ); | |||||
switch( frame % 4 ) | |||||
{ | |||||
case 0: | |||||
gfx_color( CYAN ); | |||||
gfx_goto( x, y + 2 ); | |||||
gfx_putchar( 'O' ); | |||||
gfx_goto( x + 2, y + 2 ); | |||||
gfx_putchar( 'o' ); | |||||
gfx_goto( x + 1, y + 3 ); | |||||
gfx_putchar( 'o' ); | |||||
gfx_color( GRAY ); | |||||
gfx_goto( x - 1, y + 3 ); | |||||
gfx_putchar( '°' ); | |||||
gfx_goto( x + 2, y + 4 ); | |||||
gfx_putchar( '°' ); | |||||
gfx_goto( x, y + 4 ); | |||||
gfx_putchar( '.' ); | |||||
gfx_goto( x + 1, y + 5 ); | |||||
gfx_putchar( '.' ); | |||||
break; | |||||
case 1: | |||||
gfx_color( CYAN ); | |||||
//gfx_goto( x, y + 1 ); | |||||
//gfx_putchar( 'O' ); | |||||
gfx_goto( x + 1, y + 2 ); | |||||
gfx_putchar( 'O' ); | |||||
gfx_goto( x, y + 3 ); | |||||
gfx_putchar( 'o' ); | |||||
gfx_color( GRAY ); | |||||
gfx_goto( x + 2, y + 3 ); | |||||
gfx_putchar( '°' ); | |||||
gfx_goto( x + 1, y + 4 ); | |||||
gfx_putchar( '°' ); | |||||
gfx_goto( x - 1, y + 4 ); | |||||
gfx_putchar( '.' ); | |||||
gfx_goto( x + 2, y + 5 ); | |||||
gfx_putchar( '.' ); | |||||
break; | |||||
case 2: | |||||
gfx_color( CYAN ); | |||||
//gfx_goto( x - 1, y + 1 ); | |||||
//gfx_putchar( 'O' ); | |||||
gfx_goto( x + 2, y + 2 ); | |||||
gfx_putchar( 'O' ); | |||||
gfx_goto( x, y + 2 ); | |||||
gfx_putchar( 'o' ); | |||||
gfx_goto( x + 1, y + 3 ); | |||||
gfx_putchar( 'o' ); | |||||
gfx_color( GRAY ); | |||||
gfx_goto( x, y + 4 ); | |||||
gfx_putchar( '°' ); | |||||
gfx_goto( x + 2, y + 4 ); | |||||
gfx_putchar( '.' ); | |||||
gfx_goto( x + 1, y + 5 ); | |||||
gfx_putchar( '.' ); | |||||
break; | |||||
case 3: | |||||
gfx_color( CYAN ); | |||||
//gfx_goto( x + 2, y + 1 ); | |||||
//gfx_putchar( 'O' ); | |||||
gfx_goto( x + 1, y + 2 ); | |||||
gfx_putchar( 'O' ); | |||||
gfx_goto( x - 1, y + 2 ); | |||||
gfx_putchar( 'o' ); | |||||
gfx_goto( x + 2, y + 3 ); | |||||
gfx_putchar( 'o' ); | |||||
gfx_color( GRAY ); | |||||
gfx_goto( x, y + 3 ); | |||||
gfx_putchar( '°' ); | |||||
gfx_goto( x + 1, y + 4 ); | |||||
gfx_putchar( '°' ); | |||||
gfx_goto( x, y + 5 ); | |||||
gfx_putchar( '.' ); | |||||
break; | |||||
} | |||||
} | |||||
static void draw_beam( int x, int y, int frame ) | static void draw_beam( int x, int y, int frame ) | ||||
{ | { | ||||
int r = (29 - frame) * (29 - frame) / 8; | int r = (29 - frame) * (29 - frame) / 8; | ||||