the nuke is still ugly, almost no collision detection. Nice demo :)tags/v0.99.beta14
| @@ -0,0 +1,35 @@ | |||||
| # Fallback to ncurses if this is set to 0 | |||||
| USE_SLANG = 1 | |||||
| CC = gcc | |||||
| CFLAGS = -g -O6 -fno-strength-reduce -fomit-frame-pointer | |||||
| # Code qui fait des warnings == code de porc == deux baffes dans ta gueule | |||||
| CFLAGS += -Wall -Wpointer-arith -Wcast-align -Wcast-qual -Wstrict-prototypes -Wshadow -Waggregate-return -Wmissing-prototypes -Wnested-externs | |||||
| ifeq (1,$(USE_SLANG)) | |||||
| CFLAGS += -DUSE_SLANG | |||||
| EXECLIBS = -lslang -lm | |||||
| else | |||||
| CFLAGS += -DUSE_NCURSES | |||||
| EXECLIBS = -lncurses -lm | |||||
| endif | |||||
| COMPILE_CMD = $(CC) -c $(ALL_CFLAGS) | |||||
| PROGRAM = ttyvaders | |||||
| SOURCES = main.c graphics.c tunnel.c starfield.c player.c weapons.c collide.c explosions.c aliens.c | |||||
| HEADERS = common.h | |||||
| OBJECTS = $(SOURCES:%.c=%.o) | |||||
| all: $(PROGRAM) | |||||
| ttyvaders: $(OBJECTS) | |||||
| $(CC) -o $@ $(LDFLAGS) $^ $(EXECLIBS) | |||||
| $(OBJECTS): Makefile $(HEADERS) | |||||
| clean: | |||||
| -/bin/rm -f $(PROGRAM) $(OBJECTS) | |||||
| @@ -0,0 +1,176 @@ | |||||
| #include <stdlib.h> | |||||
| #include "common.h" | |||||
| static void draw_alien( game *g, int x, int y, int type ); | |||||
| void init_aliens( game *g, aliens *al ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < ALIENS; i++ ) | |||||
| { | |||||
| al->x[i] = -1; | |||||
| al->y[i] = -1; | |||||
| al->img[i] = 0; | |||||
| al->life[i] = 0; | |||||
| } | |||||
| } | |||||
| void draw_aliens( game *g, aliens *al ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < ALIENS; i++ ) | |||||
| { | |||||
| if( al->y[i] >= 0 ) | |||||
| { | |||||
| draw_alien( g, al->x[i], al->y[i], al->img[i] % 2 ); | |||||
| } | |||||
| } | |||||
| } | |||||
| void update_aliens( game *g, aliens *al ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < ALIENS; i++ ) | |||||
| { | |||||
| if( al->y[i] < 0 ) | |||||
| { | |||||
| //al->x[i] = g->w; | |||||
| } | |||||
| else | |||||
| { | |||||
| al->x[i] = ((al->x[i] + 5) % (g->w + 3)) - 3; | |||||
| al->y[i] = al->y[i] + (rand() % 8) / 7 - (rand() % 8) / 7; | |||||
| al->img[i] = al->img[i] + rand() % 4; | |||||
| /* Check collisions */ | |||||
| if( al->y[i] < 0 ) al->y[i] = 0; | |||||
| if( al->y[i] > g->w - 1 ) al->y[i] = g->w - 1; | |||||
| } | |||||
| } | |||||
| } | |||||
| void add_alien( game *g, aliens *al, int x, int y ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < ALIENS; i++ ) | |||||
| { | |||||
| if( al->y[i] < 0 ) | |||||
| { | |||||
| al->x[i] = x; | |||||
| al->y[i] = y; | |||||
| al->img[i] = 0; | |||||
| al->life[i] = 2; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| static void draw_alien( game *g, int x, int y, int type ) | |||||
| { | |||||
| switch( type ) | |||||
| { | |||||
| case 0: | |||||
| GFX_COLOR( MAGENTA ); | |||||
| GFX_GOTO( x, y ); | |||||
| GFX_WRITE( ',' ); | |||||
| GFX_WRITE( '-' ); | |||||
| GFX_WRITE( '-' ); | |||||
| GFX_WRITE( '-' ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_GOTO( x, y+1 ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_COLOR( WHITE ); | |||||
| GFX_WRITE( 'o' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( 'O' ); | |||||
| GFX_COLOR( MAGENTA ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_GOTO( x, y+2 ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '^' ); | |||||
| break; | |||||
| case 1: | |||||
| GFX_COLOR( MAGENTA ); | |||||
| GFX_GOTO( x, y ); | |||||
| GFX_WRITE( ',' ); | |||||
| GFX_WRITE( '-' ); | |||||
| GFX_WRITE( '-' ); | |||||
| GFX_WRITE( '-' ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_GOTO( x, y+1 ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_COLOR( WHITE ); | |||||
| GFX_WRITE( 'O' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( 'o' ); | |||||
| GFX_COLOR( MAGENTA ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_GOTO( x, y+2 ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '^' ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| #if 0 | |||||
| void draw_rock( int x, int y, int type ) | |||||
| { | |||||
| switch( type ) | |||||
| { | |||||
| case 0: | |||||
| GFX_COLOR( RED ); | |||||
| GFX_GOTO( x, y ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_GOTO( x, y+1 ); | |||||
| GFX_WRITE( '>' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_GOTO( x, y+2 ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '>' ); | |||||
| break; | |||||
| case 1: | |||||
| GFX_COLOR( RED ); | |||||
| GFX_GOTO( x, y ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '>' ); | |||||
| GFX_GOTO( x, y+1 ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_GOTO( x, y+2 ); | |||||
| GFX_WRITE( '<' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( '/' ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,121 @@ | |||||
| #include <stdlib.h> | |||||
| #include "common.h" | |||||
| void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < SHOTS; i++ ) | |||||
| { | |||||
| if( wp->y[i] >= 0 ) | |||||
| { | |||||
| if( wp->x[i] <= t->left[wp->y[i]+1] | |||||
| || wp->x[i] >= t->right[wp->y[i]+1] ) | |||||
| { | |||||
| add_explosion( g, ex, wp->x[i], wp->y[i]+1, 0, 1, 0 ); | |||||
| if( wp->x[i] <= t->left[wp->y[i]+1] ) | |||||
| { | |||||
| t->left[wp->y[i]]--; | |||||
| t->left[wp->y[i]+1]-=2; | |||||
| t->left[wp->y[i]+2]--; | |||||
| } | |||||
| else | |||||
| { | |||||
| t->right[wp->y[i]]++; | |||||
| t->right[wp->y[i]+1]+=2; | |||||
| t->right[wp->y[i]+2]++; | |||||
| } | |||||
| wp->y[i] = -1; | |||||
| } | |||||
| else if( wp->x[i] <= t->left[wp->y[i]] | |||||
| || wp->x[i] >= t->right[wp->y[i]] ) | |||||
| { | |||||
| add_explosion( g, ex, wp->x[i], wp->y[i], 0, 1, 0 ); | |||||
| if( wp->x[i] <= t->left[wp->y[i]] ) | |||||
| { | |||||
| t->left[wp->y[i]-1]--; | |||||
| t->left[wp->y[i]]-=2; | |||||
| t->left[wp->y[i]+1]--; | |||||
| } | |||||
| else | |||||
| { | |||||
| t->right[wp->y[i]-1]++; | |||||
| t->right[wp->y[i]]+=2; | |||||
| t->right[wp->y[i]+1]++; | |||||
| } | |||||
| wp->y[i] = -1; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ) | |||||
| { | |||||
| int i, j; | |||||
| for( i = 0; i < SHOTS; i++ ) | |||||
| { | |||||
| if( wp->y[i] >= 0 ) | |||||
| { | |||||
| int ok = 0; | |||||
| for( j = 0; j < ALIENS; j++ ) | |||||
| { | |||||
| if( wp->x[i] >= al->x[j] | |||||
| && wp->x[i] <= al->x[j] + 4 | |||||
| && wp->y[i] >= al->y[j] | |||||
| && wp->y[i] <= al->y[j] + 2 ) | |||||
| { | |||||
| al->life[j]--; | |||||
| if( al->life[j] == 0 ) | |||||
| { | |||||
| al->x[j] = -1; | |||||
| al->y[j] = -1; | |||||
| add_explosion( g, ex, wp->x[i], wp->y[i], 0, 0, 1 ); | |||||
| } | |||||
| ok = 1; | |||||
| } | |||||
| else if( wp->x[i] >= al->x[j] | |||||
| && wp->x[i] <= al->x[j] + 4 | |||||
| && wp->y[i]+1 >= al->y[j] | |||||
| && wp->y[i]+1 <= al->y[j] + 2 ) | |||||
| { | |||||
| al->life[j]--; | |||||
| if( al->life[j] == 0 ) | |||||
| { | |||||
| al->x[j] = -1; | |||||
| al->y[j] = -1; | |||||
| add_explosion( g, ex, wp->x[i], wp->y[i]+1, 0, 0, 1 ); | |||||
| } | |||||
| ok = 1; | |||||
| } | |||||
| } | |||||
| if( ok ) | |||||
| { | |||||
| wp->y[i] = -1; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| void collide_player_tunnel( game *g, player *p, tunnel *t, explosions *ex ) | |||||
| { | |||||
| if( p->x <= t->left[p->y] ) | |||||
| { | |||||
| p->x += 3; | |||||
| //add_explosion( g, ex, x+1, y-2, 0, 1, 0 ); | |||||
| } | |||||
| else if( p->x + 5 >= t->right[p->y] ) | |||||
| { | |||||
| p->x -= 3; | |||||
| //add_explosion( g, ex, x+4, y-2, 0, 1, 0 ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,130 @@ | |||||
| #define STARS 50 | |||||
| #define SHOTS 50 | |||||
| #define ROCKS 10 | |||||
| #define ALIENS 10 | |||||
| #define EXPLOSIONS 20 | |||||
| #ifdef USE_SLANG | |||||
| # include <slang.h> | |||||
| # define GFX_COLOR(x) SLsmg_set_color(x) | |||||
| # define GFX_GOTO(x,y) SLsmg_gotorc(y,x) | |||||
| # define GFX_WRITE(x) SLsmg_write_char(x) | |||||
| #else | |||||
| # include <curses.h> | |||||
| # define GFX_COLOR(x) attrset(COLOR_PAIR(x)) | |||||
| # define GFX_GOTO(x,y) move(y,x) | |||||
| # define GFX_WRITE(x) addch(x) | |||||
| #endif | |||||
| #define GET_RAND(p,q) ((p)+(int)((1.0*((q)-(p)))*rand()/(RAND_MAX+1.0))) | |||||
| typedef struct | |||||
| { | |||||
| int w, h; | |||||
| } game; | |||||
| typedef struct | |||||
| { | |||||
| int w, h, *left, *right; | |||||
| } tunnel; | |||||
| typedef struct | |||||
| { | |||||
| int x[STARS]; | |||||
| int y[STARS]; | |||||
| int z[STARS]; | |||||
| char ch[STARS]; | |||||
| int c[STARS]; | |||||
| } starfield; | |||||
| typedef struct | |||||
| { | |||||
| int x[EXPLOSIONS]; | |||||
| int y[EXPLOSIONS]; | |||||
| int vx[EXPLOSIONS]; | |||||
| int vy[EXPLOSIONS]; | |||||
| int type[EXPLOSIONS]; | |||||
| int n[EXPLOSIONS]; | |||||
| } explosions; | |||||
| typedef struct | |||||
| { | |||||
| int x[SHOTS]; | |||||
| int y[SHOTS]; | |||||
| int v[SHOTS]; | |||||
| } weapons; | |||||
| typedef struct | |||||
| { | |||||
| int x, y; | |||||
| int dir; | |||||
| int weapon; | |||||
| } player; | |||||
| typedef struct | |||||
| { | |||||
| int x[ALIENS]; | |||||
| int y[ALIENS]; | |||||
| int life[ALIENS]; | |||||
| int img[ALIENS]; | |||||
| } aliens; | |||||
| #define BLACK 1 | |||||
| #define GREEN 2 | |||||
| #define YELLOW 3 | |||||
| #define WHITE 4 | |||||
| #define RED 5 | |||||
| #define GRAY 6 | |||||
| #define LIGHTGRAY 7 | |||||
| #define BLUE 8 | |||||
| #define CYAN 9 | |||||
| #define MAGENTA 10 | |||||
| void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex ); | |||||
| void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex ); | |||||
| void collide_player_tunnel( game *g, player *p, tunnel *t, explosions *ex ); | |||||
| void init_aliens( game *g, aliens *al ); | |||||
| void draw_aliens( game *g, aliens *al ); | |||||
| void update_aliens( game *g, aliens *al ); | |||||
| void add_alien( game *g, aliens *al, int x, int y ); | |||||
| int init_graphics( void ); | |||||
| void init_game( game *g ); | |||||
| char get_key( void ); | |||||
| void clear_graphics( void ); | |||||
| void refresh_graphics( void ); | |||||
| void end_graphics( void ); | |||||
| player * create_player( game *g ); | |||||
| void free_player( player *p ); | |||||
| void draw_player( game *g, player *p ); | |||||
| void update_player( game *g, player *p ); | |||||
| void init_weapons( game *g, weapons *wp ); | |||||
| void draw_weapons( game *g, weapons *wp ); | |||||
| void update_weapons( game *g, weapons *wp ); | |||||
| void add_weapon( game *g, weapons *wp, int x, int y ); | |||||
| void init_starfield( game *g, starfield *s ); | |||||
| void draw_starfield( game *g, starfield *s ); | |||||
| void update_starfield( game *g, starfield *s ); | |||||
| tunnel * create_tunnel( game *g, int w, int h ); | |||||
| void free_tunnel( tunnel *t ); | |||||
| void draw_tunnel( game *g, tunnel *t ); | |||||
| void update_tunnel( game *g, tunnel *t ); | |||||
| void init_explosions( game *g, explosions *ex ); | |||||
| void add_explosion( game *g, explosions *ex, int x, int y, int vx, int vy, int type ); | |||||
| void draw_explosions( game *g, explosions *ex ); | |||||
| void update_explosions( game *g, explosions *ex ); | |||||
| @@ -0,0 +1,405 @@ | |||||
| #include <stdlib.h> | |||||
| #include <math.h> | |||||
| #include "common.h" | |||||
| static void draw_small_explosion( int x, int y, int frame ); | |||||
| static void draw_big_explosion( int x, int y, int frame ); | |||||
| static void draw_huge_explosion( int x, int y, int frame ); | |||||
| void init_explosions( game *g, explosions *ex ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < EXPLOSIONS; i++ ) | |||||
| { | |||||
| ex->n[i] = 0; | |||||
| ex->x[i] = -1; | |||||
| ex->y[i] = -1; | |||||
| ex->vx[i] = -1; | |||||
| ex->vy[i] = -1; | |||||
| ex->type[i] = 0; | |||||
| } | |||||
| } | |||||
| void add_explosion( game *g, explosions *ex, int x, int y, int vx, int vy, int type ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < EXPLOSIONS; i++ ) | |||||
| { | |||||
| if( ex->n[i] <= 0 ) | |||||
| { | |||||
| ex->x[i] = x; | |||||
| ex->y[i] = y; | |||||
| ex->vx[i] = vx; | |||||
| ex->vy[i] = vy; | |||||
| switch( type ) | |||||
| { | |||||
| case 1: ex->n[i] = 13; break; | |||||
| case 2: ex->n[i] = 30; break; | |||||
| case 0: default: ex->n[i] = 7; break; | |||||
| } | |||||
| ex->type[i] = type; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| void draw_explosions( game *g, explosions *ex ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < EXPLOSIONS; i++ ) | |||||
| { | |||||
| if( ex->n[i] <= 0 ) | |||||
| { | |||||
| continue; | |||||
| } | |||||
| #if 0 | |||||
| GFX_COLOR( GREEN ); | |||||
| GFX_GOTO( ex->x[i] + 3, ex->y[i] ); | |||||
| switch( GET_RAND(0,3) ) | |||||
| { | |||||
| case 0: | |||||
| GFX_WRITE( 'p' ); | |||||
| GFX_WRITE( 'i' ); | |||||
| GFX_WRITE( 'f' ); | |||||
| break; | |||||
| case 1: | |||||
| GFX_WRITE( 'p' ); | |||||
| GFX_WRITE( 'a' ); | |||||
| GFX_WRITE( 'f' ); | |||||
| break; | |||||
| case 2: | |||||
| GFX_WRITE( 'p' ); | |||||
| GFX_WRITE( 'o' ); | |||||
| GFX_WRITE( 'u' ); | |||||
| GFX_WRITE( 'f' ); | |||||
| break; | |||||
| } | |||||
| GFX_WRITE( '!' ); | |||||
| #endif | |||||
| switch( ex->type[i] ) | |||||
| { | |||||
| case 2: | |||||
| draw_huge_explosion( ex->x[i], ex->y[i], ex->n[i] ); | |||||
| break; | |||||
| case 1: | |||||
| draw_big_explosion( ex->x[i], ex->y[i], ex->n[i] ); | |||||
| break; | |||||
| case 0: | |||||
| default: | |||||
| draw_small_explosion( ex->x[i], ex->y[i], ex->n[i] ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| void update_explosions( game *g, explosions *ex ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < EXPLOSIONS; i++ ) | |||||
| { | |||||
| if( ex->n[i] > 0 ) | |||||
| { | |||||
| ex->x[i] += ex->vx[i]; | |||||
| ex->y[i] += ex->vy[i]; | |||||
| ex->n[i]--; | |||||
| } | |||||
| } | |||||
| } | |||||
| static void draw_small_explosion( int x, int y, int frame ) | |||||
| { | |||||
| switch( frame ) | |||||
| { | |||||
| default: | |||||
| case 6: | |||||
| GFX_COLOR( YELLOW ); | |||||
| GFX_GOTO( x, y ); | |||||
| GFX_WRITE( '+' ); | |||||
| break; | |||||
| case 5: | |||||
| GFX_COLOR( YELLOW ); | |||||
| GFX_GOTO( x, y ); | |||||
| GFX_WRITE( 'o' ); | |||||
| break; | |||||
| case 4: | |||||
| GFX_COLOR( YELLOW ); | |||||
| GFX_GOTO( x, y-1 ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_GOTO( x-1, y ); | |||||
| GFX_WRITE( ')' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '(' ); | |||||
| break; | |||||
| case 3: | |||||
| GFX_COLOR( YELLOW ); | |||||
| GFX_GOTO( x-1, y-1 ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( ',' ); | |||||
| GFX_GOTO( x-1, y ); | |||||
| GFX_WRITE( ')' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '(' ); | |||||
| GFX_GOTO( x-1, y+1 ); | |||||
| GFX_WRITE( '\'' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '`' ); | |||||
| break; | |||||
| case 2: | |||||
| GFX_COLOR( YELLOW ); | |||||
| GFX_GOTO( x-1, y-1 ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_WRITE( 'v' ); | |||||
| GFX_WRITE( ',' ); | |||||
| GFX_GOTO( x-1, y ); | |||||
| GFX_WRITE( '>' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '<' ); | |||||
| GFX_GOTO( x-1, y+1 ); | |||||
| GFX_WRITE( '\'' ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '`' ); | |||||
| break; | |||||
| case 1: | |||||
| GFX_COLOR( WHITE ); | |||||
| GFX_GOTO( x-1, y-1 ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ',' ); | |||||
| GFX_GOTO( x-1, y ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_GOTO( x-1, y+1 ); | |||||
| GFX_WRITE( '\'' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '`' ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| static void draw_big_explosion( int x, int y, int frame ) | |||||
| { | |||||
| GFX_COLOR( YELLOW ); | |||||
| switch( frame ) | |||||
| { | |||||
| default: | |||||
| case 12: | |||||
| GFX_GOTO( x, y ); | |||||
| GFX_WRITE( '+' ); | |||||
| break; | |||||
| case 11: | |||||
| GFX_GOTO( x, y ); | |||||
| GFX_WRITE( 'o' ); | |||||
| break; | |||||
| case 10: | |||||
| GFX_GOTO( x, y-1 ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_GOTO( x-1, y ); | |||||
| GFX_WRITE( ')' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '(' ); | |||||
| break; | |||||
| case 9: | |||||
| GFX_GOTO( x-1, y-1 ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( ',' ); | |||||
| GFX_GOTO( x-1, y ); | |||||
| GFX_WRITE( ')' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '(' ); | |||||
| GFX_GOTO( x-1, y+1 ); | |||||
| GFX_WRITE( '\'' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '`' ); | |||||
| break; | |||||
| case 8: | |||||
| GFX_GOTO( x-1, y-1 ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_WRITE( 'v' ); | |||||
| GFX_WRITE( ',' ); | |||||
| GFX_GOTO( x-1, y ); | |||||
| GFX_WRITE( '>' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '<' ); | |||||
| GFX_GOTO( x-1, y+1 ); | |||||
| GFX_WRITE( '\'' ); | |||||
| GFX_WRITE( '^' ); | |||||
| GFX_WRITE( '`' ); | |||||
| break; | |||||
| case 6: | |||||
| GFX_COLOR( RED ); | |||||
| case 7: | |||||
| case 5: | |||||
| GFX_GOTO( x-2, y-1 ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( '~' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_GOTO( x-2, y ); | |||||
| GFX_WRITE( '>' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '<' ); | |||||
| GFX_GOTO( x-2, y+1 ); | |||||
| GFX_WRITE( '~' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( '~' ); | |||||
| break; | |||||
| case 3: | |||||
| GFX_COLOR( RED ); | |||||
| case 4: | |||||
| case 2: | |||||
| GFX_GOTO( x-2, y-1 ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_GOTO( x-2, y ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_GOTO( x-2, y+1 ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| break; | |||||
| case 1: | |||||
| GFX_COLOR( WHITE ); | |||||
| GFX_GOTO( x-2, y-1 ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '\'' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ',' ); | |||||
| GFX_GOTO( x-2, y ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_GOTO( x-2, y+1 ); | |||||
| GFX_WRITE( '\'' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '.' ); | |||||
| GFX_WRITE( ' ' ); | |||||
| GFX_WRITE( '`' ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| static void draw_circle( int x, int y, float r ); | |||||
| static void draw_huge_explosion( int x, int y, int frame ) | |||||
| { | |||||
| float r = 1.5 * (30 - frame); | |||||
| GFX_COLOR( BLUE ); | |||||
| draw_circle( x, y, r ); | |||||
| r += 0.7; | |||||
| GFX_COLOR( CYAN ); | |||||
| draw_circle( x, y, r ); | |||||
| r += 0.7; | |||||
| GFX_COLOR( WHITE ); | |||||
| draw_circle( x, y, r ); | |||||
| } | |||||
| static void draw_circle( int x, int y, float r ) | |||||
| { | |||||
| #if 1 | |||||
| float c; | |||||
| for( c = 0 ; c <= 90 ; c += 1 ) | |||||
| { | |||||
| float dx = 0.5 + r * 2.0 * sin( c * M_PI / 180.0 ); | |||||
| float dy = 0.5 + r * cos( c * M_PI / 180.0 ); | |||||
| GFX_GOTO( x + dx, y + dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x - dx, y + dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x + dx, y - dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x - dx, y - dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| } | |||||
| #endif | |||||
| #if 0 | |||||
| int dx,dy,a2,b2, S, T; | |||||
| float a = r*8, b = r*2; | |||||
| a2 = a*a; | |||||
| b2 = b*b; | |||||
| dx = 0; | |||||
| dy = b; | |||||
| S = a2*(1-2*b) + 2*b2; | |||||
| T = b2 - 2*a2*(2*b-1); | |||||
| GFX_GOTO( x + dx, y + dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x - dx, y + dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x + dx, y - dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x - dx, y - dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| do | |||||
| { | |||||
| if (S<0) | |||||
| { | |||||
| S += 2*b2*(2*x+3); | |||||
| T += 4*b2*(x+1); | |||||
| dx++; | |||||
| } | |||||
| else if (T<0) | |||||
| { | |||||
| S += 2*b2*(2*x+3) - 4*a2*(dy-1); | |||||
| T += 4*b2*(x+1) - 2*a2*(2*dy-3); | |||||
| dx++; | |||||
| dy--; | |||||
| } | |||||
| else | |||||
| { | |||||
| S -= 4*a2*(dy-1); | |||||
| T -= 2*a2*(2*dy-3); | |||||
| dy--; | |||||
| } | |||||
| GFX_GOTO( x + dx, y + dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x - dx, y + dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x + dx, y - dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_GOTO( x - dx, y - dy ); | |||||
| GFX_WRITE( '#' ); | |||||
| } | |||||
| while (dy>0); | |||||
| #endif | |||||
| } | |||||
| @@ -0,0 +1,129 @@ | |||||
| #include <stdlib.h> | |||||
| #include "common.h" | |||||
| int init_graphics( void ) | |||||
| { | |||||
| #ifdef USE_SLANG | |||||
| /* Initialize slang library */ | |||||
| SLsig_block_signals(); | |||||
| SLtt_get_terminfo(); | |||||
| if( SLkp_init() == -1 ) | |||||
| { | |||||
| SLsig_unblock_signals(); | |||||
| return 1; | |||||
| } | |||||
| SLang_init_tty (-1, 0, 1); | |||||
| if( SLsmg_init_smg() == -1 ) | |||||
| { | |||||
| SLsig_unblock_signals(); | |||||
| return 1; | |||||
| } | |||||
| SLsig_unblock_signals(); | |||||
| SLsmg_cls(); | |||||
| SLsmg_refresh(); | |||||
| #else | |||||
| /* Initialize ncurses library */ | |||||
| initscr(); | |||||
| keypad(stdscr, TRUE); | |||||
| nonl(); | |||||
| cbreak(); | |||||
| noecho(); | |||||
| nodelay(stdscr, TRUE); | |||||
| #endif | |||||
| return 0; | |||||
| } | |||||
| void init_game( game *g ) | |||||
| { | |||||
| #ifdef USE_SLANG | |||||
| static char * const colors[] = | |||||
| { | |||||
| "black", "green", "yellow", "white", | |||||
| "red", "gray", "lightgray", "blue", "cyan", "magenta", NULL | |||||
| }; | |||||
| int i; | |||||
| for( i = 0; colors[i] ; i++ ) | |||||
| { | |||||
| SLtt_set_color( i+1, NULL, colors[i], "black" ); | |||||
| } | |||||
| g->w = SLtt_Screen_Cols; | |||||
| g->h = SLtt_Screen_Rows; | |||||
| #else | |||||
| start_color(); | |||||
| init_pair( BLACK, COLOR_BLACK, COLOR_BLACK ); | |||||
| init_pair( GREEN, COLOR_GREEN, COLOR_BLACK ); | |||||
| init_pair( YELLOW, COLOR_YELLOW, COLOR_BLACK ); | |||||
| init_pair( WHITE, COLOR_WHITE, COLOR_BLACK ); | |||||
| init_pair( RED, COLOR_RED, COLOR_BLACK ); | |||||
| init_pair( GRAY, COLOR_WHITE, COLOR_BLACK ); // XXX | |||||
| init_pair( LIGHTGRAY, COLOR_WHITE, COLOR_BLACK ); // XXX | |||||
| init_pair( BLUE, COLOR_BLUE, COLOR_BLACK ); | |||||
| init_pair( CYAN, COLOR_CYAN, COLOR_BLACK ); | |||||
| init_pair( MAGENTA, COLOR_MAGENTA, COLOR_BLACK ); | |||||
| g->w = COLS; | |||||
| g->h = LINES; | |||||
| #endif | |||||
| } | |||||
| char get_key( void ) | |||||
| { | |||||
| #ifdef USE_SLANG | |||||
| if( SLang_input_pending (0) ) | |||||
| { | |||||
| return SLang_getkey(); | |||||
| } | |||||
| #else | |||||
| char key; | |||||
| if( ( key = getch() ) != ERR ) | |||||
| { | |||||
| return key; | |||||
| } | |||||
| #endif | |||||
| return 0; | |||||
| } | |||||
| void clear_graphics( void ) | |||||
| { | |||||
| #ifdef USE_SLANG | |||||
| SLsmg_cls(); | |||||
| #else | |||||
| clear(); | |||||
| #endif | |||||
| } | |||||
| void refresh_graphics( void ) | |||||
| { | |||||
| GFX_GOTO( 0, 0 ); | |||||
| #ifdef USE_SLANG | |||||
| SLsmg_refresh(); | |||||
| #else | |||||
| refresh(); | |||||
| #endif | |||||
| } | |||||
| void end_graphics( void ) | |||||
| { | |||||
| #ifdef USE_SLANG | |||||
| SLang_reset_tty(); | |||||
| SLsmg_reset_smg(); | |||||
| #else | |||||
| endwin(); | |||||
| #endif | |||||
| } | |||||
| @@ -0,0 +1,179 @@ | |||||
| /* | |||||
| * ttyvaders - a tty based shoot'em'up | |||||
| * Copyright (C) 2002 Sam Hocevar <sam@zoy.org> | |||||
| * | |||||
| * 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 | |||||
| * the Free Software Foundation; either version 1, or (at your option) | |||||
| * any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
| * | |||||
| */ | |||||
| #include <stdio.h> | |||||
| #include <stdlib.h> | |||||
| #include <string.h> | |||||
| #include <unistd.h> | |||||
| #include "common.h" | |||||
| static void start_game (game *); | |||||
| int main (int argc, char **argv) | |||||
| { | |||||
| game *g = malloc(sizeof(game)); | |||||
| // srand(time(NULL)); | |||||
| if( init_graphics() ) | |||||
| { | |||||
| return 1; | |||||
| } | |||||
| /* Initialize our program */ | |||||
| init_game(g); | |||||
| /* Go ! */ | |||||
| start_game(g); | |||||
| /* Clean up */ | |||||
| end_graphics(); | |||||
| return 0; | |||||
| } | |||||
| static void start_game (game *g) | |||||
| { | |||||
| int i; | |||||
| int quit = 0; | |||||
| int poz = 0; | |||||
| int skip = 0; | |||||
| starfield *sf = malloc(sizeof(starfield)); | |||||
| weapons *wp = malloc(sizeof(weapons)); | |||||
| explosions *ex = malloc(sizeof(explosions)); | |||||
| tunnel *t = create_tunnel( g, g->w, g->h ); | |||||
| player *p = create_player( g ); | |||||
| aliens *al = malloc(sizeof(aliens)); | |||||
| init_starfield( g, sf ); | |||||
| init_weapons( g, wp ); | |||||
| init_explosions( g, ex ); | |||||
| init_aliens( g, al ); | |||||
| /* Temporary stuff */ | |||||
| for( i = 0; i < 5; i++ ) | |||||
| { | |||||
| add_alien( g, al, rand() % g->w, rand() % g->h / 2 ); | |||||
| } | |||||
| t->w = 25; | |||||
| while( !quit ) | |||||
| { | |||||
| char key; | |||||
| while( ( key = get_key() ) ) | |||||
| { | |||||
| switch( key ) | |||||
| { | |||||
| case 'q': | |||||
| quit = 1; | |||||
| break; | |||||
| case 'p': | |||||
| poz = !poz; | |||||
| break; | |||||
| case 's': | |||||
| skip = 1; | |||||
| break; | |||||
| case 'h': | |||||
| p->dir = -3; | |||||
| break; | |||||
| case 'j': | |||||
| //if( p->y < g->h - 2 ) p->y += 1; | |||||
| break; | |||||
| case 'k': | |||||
| //if( p->y > 1 ) p->y -= 1; | |||||
| break; | |||||
| case 'l': | |||||
| p->dir = 3; | |||||
| break; | |||||
| case '\r': | |||||
| add_explosion( g, ex, p->x + 2, p->y, 0, 0, 2 ); | |||||
| break; | |||||
| case ' ': | |||||
| if( p->weapon == 0 ) | |||||
| { | |||||
| p->weapon = 4; | |||||
| add_weapon( g, wp, p->x, p->y ); | |||||
| add_weapon( g, wp, p->x + 5, p->y ); | |||||
| } | |||||
| break; | |||||
| } | |||||
| } | |||||
| usleep(40000); | |||||
| if( GET_RAND(0,10) == 0 ) | |||||
| { | |||||
| add_alien( g, al, 0, rand() % g->h / 2 ); | |||||
| } | |||||
| if( poz ) | |||||
| { | |||||
| if( skip ) | |||||
| { | |||||
| skip = 0; | |||||
| } | |||||
| else | |||||
| { | |||||
| continue; | |||||
| } | |||||
| } | |||||
| /* Scroll and update positions */ | |||||
| collide_player_tunnel( g, p, t, ex ); | |||||
| update_player( g, p ); | |||||
| collide_player_tunnel( g, p, t, ex ); | |||||
| update_starfield( g, sf ); | |||||
| update_aliens( g, al ); | |||||
| collide_weapons_tunnel( g, wp, t, ex ); | |||||
| collide_weapons_aliens( g, wp, al, ex ); | |||||
| update_weapons( g, wp ); | |||||
| collide_weapons_tunnel( g, wp, t, ex ); | |||||
| collide_weapons_aliens( g, wp, al, ex ); | |||||
| update_explosions( g, ex ); | |||||
| update_tunnel( g, t ); | |||||
| /* Clear screen */ | |||||
| clear_graphics(); | |||||
| /* Print starfield, tunnel, aliens, player and explosions */ | |||||
| draw_starfield( g, sf ); | |||||
| draw_tunnel( g, t ); | |||||
| draw_aliens( g, al ); | |||||
| draw_player( g, p ); | |||||
| draw_weapons( g, wp ); | |||||
| draw_explosions( g, ex ); | |||||
| /* Refresh */ | |||||
| refresh_graphics(); | |||||
| } | |||||
| #if 0 | |||||
| free_player( p ); | |||||
| free_tunnel( t ); | |||||
| #endif | |||||
| } | |||||
| @@ -0,0 +1,68 @@ | |||||
| #include <stdlib.h> | |||||
| #include "common.h" | |||||
| /* Init tunnel */ | |||||
| player * create_player( game *g ) | |||||
| { | |||||
| player *p = malloc(sizeof(player)); | |||||
| p->x = g->w / 2; | |||||
| p->y = g->h - 3; | |||||
| p->dir = 0; | |||||
| p->weapon = 0; | |||||
| return p; | |||||
| } | |||||
| void free_player( player *p ) | |||||
| { | |||||
| free( p ); | |||||
| } | |||||
| void draw_player( game *g, player *p ) | |||||
| { | |||||
| GFX_GOTO( p->x + 2, p->y - 2 ); | |||||
| GFX_COLOR( GREEN ); | |||||
| GFX_WRITE( '/' ); | |||||
| GFX_WRITE( '\\' ); | |||||
| GFX_GOTO( p->x + 1, p->y - 1 ); | |||||
| GFX_WRITE( '(' ); | |||||
| GFX_COLOR( YELLOW ); | |||||
| GFX_WRITE( '(' ); | |||||
| GFX_WRITE( ')' ); | |||||
| GFX_COLOR( GREEN ); | |||||
| GFX_WRITE( ')' ); | |||||
| GFX_GOTO( p->x, p->y ); | |||||
| GFX_COLOR( GREEN ); | |||||
| GFX_WRITE( 'I' ); | |||||
| GFX_WRITE( '<' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '_' ); | |||||
| GFX_WRITE( '>' ); | |||||
| GFX_WRITE( 'I' ); | |||||
| } | |||||
| void update_player( game *g, player *p ) | |||||
| { | |||||
| if( p->weapon ) | |||||
| { | |||||
| p->weapon--; | |||||
| } | |||||
| if( p->dir < 0 ) | |||||
| { | |||||
| if( p->dir == -3 && p->x > -2 ) p->x -= 1; | |||||
| else if( p->x > -1 ) p->x -= 1; | |||||
| p->dir++; | |||||
| } | |||||
| else if( p->dir > 0 ) | |||||
| { | |||||
| if( p->dir == 3 && p->x < g->w - 8 ) p->x += 1; | |||||
| else if( p->x < g->w - 7 ) p->x += 1; | |||||
| p->dir--; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,135 @@ | |||||
| Starship | |||||
| -------- | |||||
| /\ | |||||
| (()) | |||||
| I<__>I | |||||
| Aliens | |||||
| ------ | |||||
| ,---. ,---. | |||||
| \O o/ \o O/ | |||||
| ^^^^^ ^^^^^ | |||||
| Shots | |||||
| ----- | |||||
| | / _, ___ \ | |||||
| | / ' \ | |||||
| | __/ \__ | | |||||
| / \ | |||||
| \ __ __ / | |||||
| | \ / | | |||||
| Explosions | |||||
| ---------- | |||||
| | .v, .v, .v, .v, .v, .v, . , | |||||
| + o -o- >o< >o< >o< >o< > < > < | |||||
| | '^` '^` '^` '^` '^` '^` ' ` | |||||
| .|, .v, .v, .v, .v, .v, . , | |||||
| + o -o- --o-- > o < >( )< > < > o < >( )< - - | |||||
| '|` '^` '^` '^` '^` '^` ' ` | |||||
| _ ._, .v, _\~/_ _\ /_ . ' , | |||||
| + o )_( )_( > < > < _ _ | |||||
| ' ` '^` ~/_\~ / \ ' . ` | |||||
| _ ._, .v, . , | |||||
| + o )_( )_( > < | |||||
| ' ` '^` ' ` | |||||
| ####### | |||||
| ### ### | |||||
| ## ## | |||||
| # # | |||||
| # # | |||||
| # # | |||||
| ## ## | |||||
| ### ### | |||||
| ####### | |||||
| _______ | |||||
| ,-'_______`-. | |||||
| ,',-' _____ `-.`. | |||||
| / / ,' ___ `. \ \ | |||||
| | | / ,' _ `. \ | | | |||||
| | | | | |_| | | | | | |||||
| | | \ `.___,' / | | | |||||
| \ \ `._____,' / / | |||||
| `.`-._______,-',' | |||||
| `-._______,-' | |||||
| @@ -0,0 +1,59 @@ | |||||
| #include <stdlib.h> | |||||
| #include "common.h" | |||||
| void init_starfield( game *g, starfield *s ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < STARS; i++ ) | |||||
| { | |||||
| s->x[i] = rand() % g->w; | |||||
| s->y[i] = rand() % g->h; | |||||
| s->z[i] = 1 + rand() % 3; | |||||
| s->ch[i] = (rand() % 2) ? '.' : '\''; | |||||
| s->c[i] = 6 + rand() % 2; | |||||
| } | |||||
| } | |||||
| void draw_starfield( game *g, starfield *s ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < STARS; i++ ) | |||||
| { | |||||
| if( s->x[i] >= 0 ) | |||||
| { | |||||
| GFX_COLOR( s->c[i] ); | |||||
| GFX_GOTO( s->x[i], s->y[i] ); | |||||
| GFX_WRITE( s->ch[i] ); | |||||
| } | |||||
| } | |||||
| } | |||||
| void update_starfield( game *g, starfield *s ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < STARS; i++ ) | |||||
| { | |||||
| if( s->x[i] < 0 ) | |||||
| { | |||||
| s->x[i] = rand() % g->w; | |||||
| s->y[i] = 0; | |||||
| s->z[i] = 1 + rand() % 2; | |||||
| s->ch[i] = (rand() % 2) ? '.' : '\''; | |||||
| s->c[i] = 6 + rand() % 2; | |||||
| } | |||||
| else if( s->y[i] < g->h-1 ) | |||||
| { | |||||
| s->y[i] += s->z[i]; | |||||
| } | |||||
| else | |||||
| { | |||||
| s->x[i] = -1; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,171 @@ | |||||
| #include <stdlib.h> | |||||
| #include "common.h" | |||||
| static void draw_wall( game *g, int *wall ); | |||||
| /* Init tunnel */ | |||||
| tunnel * create_tunnel( game *g, int w, int h ) | |||||
| { | |||||
| int i; | |||||
| tunnel *t = malloc(sizeof(tunnel)); | |||||
| t->left = malloc(h*sizeof(int)); | |||||
| t->right = malloc(h*sizeof(int)); | |||||
| t->w = w; | |||||
| t->h = h; | |||||
| if( t->w >= g->w ) | |||||
| { | |||||
| t->left[0] = -1; | |||||
| t->right[0] = g->w; | |||||
| for( i = 0; i < g->h; i++ ) | |||||
| { | |||||
| t->left[i] = -1; | |||||
| t->right[i] = g->w; | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| t->left[0] = (g->w - w) / 2; | |||||
| t->right[0] = (g->w + w) / 2; | |||||
| /* Yeah, sub-efficient, but less code to do :-) */ | |||||
| for( i = 0; i < g->h; i++ ) | |||||
| { | |||||
| update_tunnel( g, t ); | |||||
| } | |||||
| } | |||||
| return t; | |||||
| } | |||||
| void free_tunnel( tunnel *t ) | |||||
| { | |||||
| free( t->left ); | |||||
| free( t->right ); | |||||
| free( t ); | |||||
| } | |||||
| void draw_tunnel( game *g, tunnel *t ) | |||||
| { | |||||
| /* Print tunnel */ | |||||
| draw_wall( g, t->left ); | |||||
| draw_wall( g, t->right ); | |||||
| } | |||||
| void update_tunnel( game *g, tunnel *t ) | |||||
| { | |||||
| static int const delta[] = { -2, -1, 1, 2 }; | |||||
| int i,j,k; | |||||
| /* Slide tunnel one block vertically */ | |||||
| for( i = t->h; i--; ) | |||||
| { | |||||
| t->left[i+1] = t->left[i]; | |||||
| t->right[i+1] = t->right[i]; | |||||
| } | |||||
| /* Generate new values */ | |||||
| i = delta[GET_RAND(0,4)]; | |||||
| j = delta[GET_RAND(0,4)]; | |||||
| /* Check in which direction we need to alter tunnel */ | |||||
| if( t->right[1] - t->left[1] < t->w ) | |||||
| { | |||||
| /* Not wide enough */ | |||||
| if( i > j ) | |||||
| { | |||||
| k = j; j = i; i = k; | |||||
| } | |||||
| } | |||||
| else if( t->right[1] - t->left[1] - 2 > t->w ) | |||||
| { | |||||
| /* Too wide */ | |||||
| if( i < j ) | |||||
| { | |||||
| k = j; j = i; i = k; | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| /* No need to mess with i and j: width is OK */ | |||||
| } | |||||
| /* If width doesn't exceed game size, update coords */ | |||||
| if( t->w <= g->w || t->right[1] - t->left[1] < t->w ) | |||||
| { | |||||
| t->left[0] = t->left[1] + i; | |||||
| t->right[0] = t->right[1] + j; | |||||
| } | |||||
| else | |||||
| { | |||||
| t->left[0] = -1; | |||||
| t->right[0] = g->w; | |||||
| } | |||||
| if( t->w > g->w ) | |||||
| { | |||||
| if( t->left[0] < 0 && t->right[0] < g->w - 2 ) | |||||
| { | |||||
| t->left[0] = t->left[1] + 1; | |||||
| } | |||||
| if( t->left[0] > 1 && t->right[0] > g->w - 1 ) | |||||
| { | |||||
| t->right[0] = t->right[1] - 1; | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| if( t->left[0] < 0 ) | |||||
| { | |||||
| t->left[0] = t->left[1] + 1; | |||||
| } | |||||
| if( t->right[0] > g->w - 1 ) | |||||
| { | |||||
| t->right[0] = t->right[1] - 1; | |||||
| } | |||||
| } | |||||
| } | |||||
| static void draw_wall( game *g, int *wall ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < g->h ; i++ ) | |||||
| { | |||||
| char c; | |||||
| if( wall[i] < 0 || wall[i] >= g->w ) | |||||
| { | |||||
| continue; | |||||
| } | |||||
| if( wall[i] > wall[i+1] ) | |||||
| { | |||||
| c = wall[i] > wall[i-1] ? '>' : '/'; | |||||
| } | |||||
| else | |||||
| { | |||||
| c = wall[i] > wall[i-1] ? '\\' : '<'; | |||||
| } | |||||
| GFX_COLOR( RED ); | |||||
| if( wall[i] == wall[i+1] + 2 ) | |||||
| { | |||||
| GFX_GOTO( wall[i] - 1, i ); | |||||
| GFX_WRITE( '_' ); | |||||
| } | |||||
| else | |||||
| { | |||||
| GFX_GOTO( wall[i], i ); | |||||
| } | |||||
| GFX_WRITE( c ); | |||||
| GFX_WRITE( '#' ); | |||||
| GFX_WRITE( c ); | |||||
| if( wall[i] == wall[i+1] - 2 ) GFX_WRITE( '_' ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,71 @@ | |||||
| #include <stdlib.h> | |||||
| #include "common.h" | |||||
| void init_weapons( game *g, weapons *wp ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < SHOTS; i++ ) | |||||
| { | |||||
| wp->x[i] = -1; | |||||
| wp->y[i] = -1; | |||||
| wp->v[i] = 0; | |||||
| } | |||||
| } | |||||
| void draw_weapons( game *g, weapons *wp ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < SHOTS; i++ ) | |||||
| { | |||||
| if( wp->x[i] >= 0 ) | |||||
| { | |||||
| GFX_COLOR( WHITE ); | |||||
| GFX_GOTO( wp->x[i], wp->y[i] ); | |||||
| GFX_WRITE( '|' ); | |||||
| GFX_COLOR( CYAN ); | |||||
| GFX_GOTO( wp->x[i], wp->y[i] + 1 ); | |||||
| GFX_WRITE( '|' ); | |||||
| } | |||||
| } | |||||
| } | |||||
| void update_weapons( game *g, weapons *wp ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < SHOTS; i++ ) | |||||
| { | |||||
| if( wp->y[i] < 0 ) | |||||
| { | |||||
| wp->x[i] = -1; | |||||
| wp->y[i] = -1; | |||||
| } | |||||
| else | |||||
| { | |||||
| wp->y[i] += wp->v[i]; | |||||
| /* Check collisions */ | |||||
| } | |||||
| } | |||||
| } | |||||
| void add_weapon( game *g, weapons *wp, int x, int y ) | |||||
| { | |||||
| int i; | |||||
| for( i = 0; i < SHOTS; i++ ) | |||||
| { | |||||
| if( wp->y[i] < 0 ) | |||||
| { | |||||
| wp->x[i] = x; | |||||
| wp->y[i] = y; | |||||
| wp->v[i] = -2; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||