From fe21f4a9c90b535c0406170c092eb027de6707d4 Mon Sep 17 00:00:00 2001 From: sam Date: Sun, 15 Dec 2002 17:16:45 +0000 Subject: [PATCH] * 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 --- doc/shapes.txt | 32 ++++++++++ src/aliens.c | 6 +- src/collide.c | 63 ++++++++++++++----- src/common.h | 6 +- src/main.c | 75 +++++++++++----------- src/weapons.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 291 insertions(+), 55 deletions(-) diff --git a/doc/shapes.txt b/doc/shapes.txt index 259a7b5..75153c4 100644 --- a/doc/shapes.txt +++ b/doc/shapes.txt @@ -26,6 +26,10 @@ Aliens _o|o_ T|T + _ + ,(|). / \ + /,-'-.\ ,(_X_). + Bonus ----- _ _ _ @@ -61,12 +65,40 @@ Shots \ __ __ / | \ / | + ___ _, ._ ,^. _, ._ + . o |___> / | | \ | | ,-' / \ `-. + / / \ \ |_| \,-' `-./ + `' `' + ___ ,. ,. _ + <___| \ \ / / | | /`-. ,-'\ + \_| |_/ | | `-._\ /_,-' + `v' ` ' + + | | | |||| |/\| + || || || |||||| ||/\|| + | | | | | | | :%%: :%%: :%##%: __ __ __ ____ :%%: :%##%: :%####%: ' ` -' `- ,-' `-. ,-' `-. ,-' `-. ,-' `-. ,-' `-. + ,--. + ( ) + `--' + o O + o ° + . ° + . + + ,--. + ( ) + |||| + |||| + || + | + + Explosions ---------- diff --git a/src/aliens.c b/src/aliens.c index 8a15b51..a8d1f2b 100644 --- a/src/aliens.c +++ b/src/aliens.c @@ -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; diff --git a/src/collide.c b/src/collide.c index 6e4fb4d..1efd32d 100644 --- a/src/collide.c +++ b/src/collide.c @@ -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; diff --git a/src/common.h b/src/common.h index fafd1ab..0a442ec 100644 --- a/src/common.h +++ b/src/common.h @@ -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 @@ -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]; diff --git a/src/main.c b/src/main.c index d874b96..4ce3dc5 100644 --- a/src/main.c +++ b/src/main.c @@ -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(); diff --git a/src/weapons.c b/src/weapons.c index 28c588d..792568d 100644 --- a/src/weapons.c +++ b/src/weapons.c @@ -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;