* beam now collides with aliens. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/ttyvaders/trunk@24 92316355-f0b4-4df1-b90c-862c8a59935fmaster
| @@ -26,6 +26,10 @@ Aliens | |||||
| _o|o_ | _o|o_ | ||||
| T|T | T|T | ||||
| _ | |||||
| ,(|). / \ | |||||
| /,-'-.\ ,(_X_). | |||||
| Bonus | Bonus | ||||
| ----- | ----- | ||||
| _ _ _ | _ _ _ | ||||
| @@ -61,12 +65,40 @@ Shots | |||||
| \ __ __ / | \ __ __ / | ||||
| | \ / | | | \ / | | ||||
| ___ _, ._ ,^. _, ._ | |||||
| . o |___> / | | \ | | ,-' / \ `-. | |||||
| / / \ \ |_| \,-' `-./ | |||||
| `' `' | |||||
| ___ ,. ,. _ | |||||
| <___| \ \ / / | | /`-. ,-'\ | |||||
| \_| |_/ | | `-._\ /_,-' | |||||
| `v' ` ' | |||||
| | | | |||| |/\| | |||||
| || || || |||||| ||/\|| | |||||
| | | | | | | | | |||||
| :%%: | :%%: | ||||
| :%%: :%##%: | :%%: :%##%: | ||||
| __ __ __ ____ :%%: :%##%: :%####%: | __ __ __ ____ :%%: :%##%: :%####%: | ||||
| ' ` -' `- ,-' `-. ,-' `-. ,-' `-. ,-' `-. ,-' `-. | ' ` -' `- ,-' `-. ,-' `-. ,-' `-. ,-' `-. ,-' `-. | ||||
| ,--. | |||||
| ( ) | |||||
| `--' | |||||
| o O | |||||
| o ° | |||||
| . ° | |||||
| . | |||||
| ,--. | |||||
| ( ) | |||||
| |||| | |||||
| |||| | |||||
| || | |||||
| | | |||||
| Explosions | Explosions | ||||
| ---------- | ---------- | ||||
| @@ -81,13 +81,13 @@ void add_alien( game *g, aliens *al, int x, int y, int type ) | |||||
| switch( al->type[i] ) | switch( al->type[i] ) | ||||
| { | { | ||||
| case ALIEN_POOLP: | case ALIEN_POOLP: | ||||
| al->life[i] = 2; | |||||
| al->life[i] = 3; | |||||
| break; | break; | ||||
| case ALIEN_BOOL: | case ALIEN_BOOL: | ||||
| al->life[i] = 2; | |||||
| al->life[i] = 3; | |||||
| break; | break; | ||||
| case ALIEN_BRAH: | case ALIEN_BRAH: | ||||
| al->life[i] = 2; | |||||
| al->life[i] = 3; | |||||
| break; | break; | ||||
| case ALIEN_NONE: | case ALIEN_NONE: | ||||
| break; | break; | ||||
| @@ -17,22 +17,29 @@ void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex ) | |||||
| case WEAPON_NONE: | case WEAPON_NONE: | ||||
| break; | break; | ||||
| case WEAPON_SEEKER: | case WEAPON_SEEKER: | ||||
| case WEAPON_BOMB: | |||||
| if( x <= t->left[y] | if( x <= t->left[y] | ||||
| || x >= t->right[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] ) | 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 | 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; | wp->type[i] = WEAPON_NONE; | ||||
| @@ -81,7 +88,8 @@ void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex ) | |||||
| } | } | ||||
| break; | break; | ||||
| case WEAPON_NUKE: | case WEAPON_NUKE: | ||||
| /* The nuke does not break the tunnel */ | |||||
| case WEAPON_BEAM: | |||||
| /* The nuke and the laser do not break the tunnel */ | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -126,6 +134,30 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ) | |||||
| } | } | ||||
| } | } | ||||
| break; | 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: | case WEAPON_LASER: | ||||
| for( j = 0; j < ALIENS; j++ ) | 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 ) | if( al->life[j] <= 0 ) | ||||
| { | { | ||||
| al->type[j] = ALIEN_NONE; | 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; | ok = 1; | ||||
| } | } | ||||
| @@ -153,8 +185,8 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ) | |||||
| if( al->life[j] <= 0 ) | if( al->life[j] <= 0 ) | ||||
| { | { | ||||
| al->type[j] = ALIEN_NONE; | 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; | ok = 1; | ||||
| } | } | ||||
| @@ -162,11 +194,13 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ) | |||||
| if( ok ) | if( ok ) | ||||
| { | { | ||||
| add_explosion( g, ex, x, y+1, 0, 0, EXPLOSION_SMALL ); | |||||
| wp->type[i] = WEAPON_NONE; | wp->type[i] = WEAPON_NONE; | ||||
| } | } | ||||
| break; | break; | ||||
| case WEAPON_SEEKER: | case WEAPON_SEEKER: | ||||
| case WEAPON_BOMB: | |||||
| for( j = 0; j < ALIENS; j++ ) | for( j = 0; j < ALIENS; j++ ) | ||||
| { | { | ||||
| if( al->type[j] == ALIEN_NONE ) | 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 ) | if( al->life[j] <= 0 ) | ||||
| { | { | ||||
| al->type[j] = ALIEN_NONE; | 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; | ok = 1; | ||||
| } | } | ||||
| @@ -190,6 +224,7 @@ void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ) | |||||
| if( ok ) | 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; | wp->type[i] = WEAPON_NONE; | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -1,9 +1,9 @@ | |||||
| #define STARS 50 | #define STARS 50 | ||||
| #define WEAPONS 50 | |||||
| #define WEAPONS 100 | |||||
| #define BONUS 30 | #define BONUS 30 | ||||
| #define ALIENS 30 | #define ALIENS 30 | ||||
| #define EXPLOSIONS 20 | |||||
| #define EXPLOSIONS 100 | |||||
| #ifdef USE_SLANG | #ifdef USE_SLANG | ||||
| # include <slang.h> | # include <slang.h> | ||||
| @@ -52,7 +52,7 @@ typedef struct | |||||
| 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 x[WEAPONS]; | ||||
| int y[WEAPONS]; | int y[WEAPONS]; | ||||
| int x2[WEAPONS]; | int x2[WEAPONS]; | ||||
| @@ -127,8 +127,7 @@ static void start_game (game *g) | |||||
| 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, -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 ' ': | case ' ': | ||||
| if( g->p->weapon == 0 ) | if( g->p->weapon == 0 ) | ||||
| @@ -136,6 +135,18 @@ static void start_game (game *g) | |||||
| g->p->weapon = 4; | 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 << 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 ); | 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; | break; | ||||
| } | } | ||||
| @@ -143,48 +154,42 @@ static void start_game (game *g) | |||||
| usleep(40000); | 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 screen */ | ||||
| clear_graphics(); | clear_graphics(); | ||||
| @@ -195,8 +200,8 @@ static void start_game (game *g) | |||||
| 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_player( g, g->p ); | ||||
| draw_weapons( g, g->wp ); | |||||
| draw_explosions( g, g->ex ); | draw_explosions( g, g->ex ); | ||||
| draw_weapons( g, g->wp ); | |||||
| /* Refresh */ | /* Refresh */ | ||||
| refresh_graphics(); | refresh_graphics(); | ||||
| @@ -4,6 +4,7 @@ | |||||
| #include "common.h" | #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_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 ); | ||||
| @@ -44,6 +45,20 @@ void draw_weapons( game *g, weapons *wp ) | |||||
| gfx_goto( wp->x[i] >> 4, wp->y[i] >> 4 ); | gfx_goto( wp->x[i] >> 4, wp->y[i] >> 4 ); | ||||
| gfx_putchar( '@' ); | gfx_putchar( '@' ); | ||||
| break; | 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: | 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; | ||||
| @@ -72,6 +87,7 @@ void update_weapons( game *g, weapons *wp ) | |||||
| wp->type[i] = WEAPON_NONE; | wp->type[i] = WEAPON_NONE; | ||||
| } | } | ||||
| break; | break; | ||||
| case WEAPON_BOMB: | |||||
| case WEAPON_SEEKER: | case WEAPON_SEEKER: | ||||
| /* Update tail */ | /* Update tail */ | ||||
| wp->x3[i] = wp->x2[i]; | 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: | case WEAPON_LASER: | ||||
| break; | break; | ||||
| case WEAPON_SEEKER: | case WEAPON_SEEKER: | ||||
| case WEAPON_BOMB: | |||||
| wp->x2[i] = x; | wp->x2[i] = x; | ||||
| wp->y2[i] = y; | wp->y2[i] = y; | ||||
| wp->x3[i] = x; | 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 ) | static void draw_beam( int x, int y, int frame ) | ||||
| { | { | ||||
| int r = (29 - frame) * (29 - frame) / 8; | int r = (29 - frame) * (29 - frame) / 8; | ||||