/* * ttyvaders Textmode shoot'em up * Copyright (c) 2002 Sam Hocevar * All Rights Reserved * * $Id$ * * 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 2 of the License, 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 "config.h" #include #include #include #include #include "common.h" static void start_game (game *); int main (int argc, char **argv) { game *g = malloc(sizeof(game)); if(g == NULL) exit(1); srand(time(NULL)); if(ee_init()) { return 1; } ee_set_delay(100000); /* Initialize our program */ g->w = ee_get_width(); g->h = ee_get_height(); intro(); /* Go ! */ start_game(g); /* Clean up */ ee_end(); return 0; } static void start_game (game *g) { int quit = 0; int poz = 0; int skip = 0; int purcompteur = 0; box *pausebox = NULL; g->sf = create_starfield(g); g->wp = malloc(sizeof(weapons)); if(g->wp == NULL) exit(1); g->ex = malloc(sizeof(explosions)); if(g->ex == NULL) exit(1); g->bo = malloc(sizeof(bonus)); if(g->bo == NULL) exit(1); g->t = create_tunnel(g, g->w, g->h); g->p = create_player(g); g->al = malloc(sizeof(aliens)); if(g->al == NULL) exit(1); init_bonus(g, g->bo); init_weapons(g, g->wp); init_explosions(g, g->ex); init_aliens(g, g->al); /* Temporary stuff */ g->t->w = 25; while(!quit) { char key; while((key = ee_get_key())) { switch(key) { case 'q': quit = 1; break; case 'p': poz = !poz; if(poz) { pausebox = create_box(g, g->w / 2, g->h / 2, g->w - 16, 8); } else { free_box(pausebox); } break; case '\t': ceo_alert(g); poz = 1; break; case 's': skip = 1; break; default: if(g->p->dead) { break; } switch(key) { case 'h': g->p->vx = -2; break; case 'j': if(g->p->y < g->h - 3) g->p->y += 1; break; case 'k': if(g->p->y > 2) g->p->y -= 1; break; case 'l': g->p->vx = 2; break; case 'n': if(g->p->special >= COST_NUKE) { g->p->special -= COST_NUKE; add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, 0, WEAPON_NUKE); } break; case 'f': if(g->p->special >= COST_FRAGBOMB) { g->p->special -= COST_FRAGBOMB; add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_FRAGBOMB); } break; case 'b': if(g->p->special >= COST_BEAM) { g->p->special -= COST_BEAM; add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, 0, WEAPON_BEAM); } break; case ' ': if(g->p->weapon == 0) { g->p->weapon = 4; add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, 0, -32, WEAPON_LASER); add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 0, -32, WEAPON_LASER); /* Extra schtuph */ add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, -24, -16, WEAPON_SEEKER); add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 24, -16, WEAPON_SEEKER); /* More schtuph */ add_weapon(g, g->wp, (g->p->x - 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER); add_weapon(g, g->wp, (g->p->x + 2) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER); /* Even more schtuph */ add_weapon(g, g->wp, g->p->x << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER); add_weapon(g, g->wp, (g->p->x + 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER); /* Extra schtuph */ add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, -32, 0, WEAPON_SEEKER); add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 32, 0, WEAPON_SEEKER); /* MORE SCHTUPH! */ add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_BOMB); } break; } } } if(!poz || skip) { skip = 0; /* XXX: to be removed */ if(ee_rand(0, 9) == 0) { int list[3] = { ALIEN_FOO, ALIEN_BAR, ALIEN_BAZ }; add_alien(g, g->al, 0, rand() % g->h / 2, list[ee_rand(0,2)]); } /* 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); 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); update_explosions(g, g->ex); update_tunnel(g, g->t); } /* Clear screen */ ee_clear(); /* Print starfield, tunnel, aliens, player and explosions */ draw_starfield(g, g->sf); draw_aliens(g, g->al); draw_tunnel(g, g->t); draw_bonus(g, g->bo); draw_explosions(g, g->ex); draw_weapons(g, g->wp); draw_player(g, g->p); draw_status(g); /* Print pause box if needed */ if(poz) { pausebox->frame++; draw_box(g, pausebox); } /* Refresh */ ee_refresh(); purcompteur++; } if(pausebox) { free_box(pausebox); } free_starfield(g, g->sf); free_tunnel(g->t); free_player(g->p); }