* 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; | ||||