source: ttyvaders/trunk/src/main.c @ 174

Last change on this file since 174 was 174, checked in by Sam Hocevar, 16 years ago
  • Sanity checks after each malloc() call.
  • Property svn:keywords set to Id
File size: 7.5 KB
Line 
1/*
2 *   ttyvaders     Textmode shoot'em up
3 *   Copyright (c) 2002 Sam Hocevar <sam@zoy.org>
4 *                 All Rights Reserved
5 *
6 *   $Id: main.c 174 2003-11-14 17:02:36Z sam $
7 *
8 *   This program is free software; you can redistribute it and/or modify
9 *   it under the terms of the GNU General Public License as published by
10 *   the Free Software Foundation; either version 2 of the License, or
11 *   (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include "config.h"
24
25#include <stdio.h>
26#include <stdlib.h>
27
28#include <string.h>
29
30#include <time.h>
31
32#include "common.h"
33
34static void start_game (game *);
35
36int main (int argc, char **argv)
37{
38    game *g = malloc(sizeof(game));
39    if(g == NULL)
40        exit(1);
41
42    srand(time(NULL));
43
44    if(ee_init())
45    {
46        return 1;
47    }
48
49    /* Initialize our program */
50    g->w = ee_get_width();
51    g->h = ee_get_height();
52
53intro();
54
55    /* Go ! */
56    start_game(g);
57
58    /* Clean up */
59    ee_end();
60
61    return 0;
62}
63
64static void start_game (game *g)
65{
66    int quit = 0;
67    int poz = 0;
68    int skip = 0;
69    int purcompteur = 0;
70
71    box *pausebox = NULL;
72
73    g->sf = create_starfield(g);
74    g->wp = malloc(sizeof(weapons));
75    if(g->wp == NULL)
76        exit(1);
77    g->ex = malloc(sizeof(explosions));
78    if(g->ex == NULL)
79        exit(1);
80    g->bo = malloc(sizeof(bonus));
81    if(g->bo == NULL)
82        exit(1);
83    g->t = create_tunnel(g, g->w, g->h);
84    g->p = create_player(g);
85    g->al = malloc(sizeof(aliens));
86    if(g->al == NULL)
87        exit(1);
88
89    init_bonus(g, g->bo);
90    init_weapons(g, g->wp);
91    init_explosions(g, g->ex);
92    init_aliens(g, g->al);
93
94    /* Temporary stuff */
95    g->t->w = 25;
96
97    while(!quit)
98    {
99        char key;
100
101        while((key = ee_get_key()))
102        {
103            switch(key)
104            {
105            case 'q':
106                quit = 1;
107                break;
108            case 'p':
109                poz = !poz;
110                if(poz)
111                {
112                    pausebox = create_box(g, g->w / 2, g->h / 2,
113                                              g->w - 16, 8);
114                }
115                else
116                {
117                    free_box(pausebox);
118                }
119                break;
120            case '\t':
121                ceo_alert(g);
122                poz = 1;
123                break;
124            case 's':
125                skip = 1;
126                break;
127            default:
128                if(g->p->dead)
129                {
130                    break;
131                }
132
133                switch(key)
134                {
135                case 'h':
136                    g->p->vx = -2;
137                    break;
138                case 'j':
139                    if(g->p->y < g->h - 3) g->p->y += 1;
140                    break;
141                case 'k':
142                    if(g->p->y > 2) g->p->y -= 1;
143                    break;
144                case 'l':
145                    g->p->vx = 2;
146                    break;
147                case 'n':
148                    if(g->p->special >= COST_NUKE)
149                    {
150                        g->p->special -= COST_NUKE;
151                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, 0, WEAPON_NUKE);
152                    }
153                    break;
154                case 'f':
155                    if(g->p->special >= COST_FRAGBOMB)
156                    {
157                        g->p->special -= COST_FRAGBOMB;
158                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_FRAGBOMB);
159                    }
160                    break;
161                case 'b':
162                    if(g->p->special >= COST_BEAM)
163                    {
164                        g->p->special -= COST_BEAM;
165                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, 0, WEAPON_BEAM);
166                    }
167                    break;
168                case ' ':
169                    if(g->p->weapon == 0)
170                    {
171                        g->p->weapon = 4;
172                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, 0, -32, WEAPON_LASER);
173                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 0, -32, WEAPON_LASER);
174                        /* Extra schtuph */
175                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, -24, -16, WEAPON_SEEKER);
176                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 24, -16, WEAPON_SEEKER);
177                        /* More schtuph */
178                        add_weapon(g, g->wp, (g->p->x - 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
179                        add_weapon(g, g->wp, (g->p->x + 2) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
180                        /* Even more schtuph */
181                        add_weapon(g, g->wp, g->p->x << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
182                        add_weapon(g, g->wp, (g->p->x + 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
183                        /* Extra schtuph */
184                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, -32, 0, WEAPON_SEEKER);
185                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 32, 0, WEAPON_SEEKER);
186                        /* MORE SCHTUPH! */
187                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_BOMB);
188                    }
189                    break;
190                }
191            }
192        }
193
194        if(!poz || skip)
195        {
196            skip = 0;
197
198            /* XXX: to be removed */
199            if(ee_rand(0, 9) == 0)
200            {
201                int list[3] = { ALIEN_FOO, ALIEN_BAR, ALIEN_BAZ };
202
203                add_alien(g, g->al, 0, rand() % g->h / 2, list[ee_rand(0,2)]);
204            }
205
206            /* Update game rules */
207            if(g->t->right[1] - g->t->left[1] == g->t->w)
208            {
209                g->t->w = 85 - g->t->w;
210            }
211
212            /* Scroll and update positions */
213            collide_player_tunnel(g, g->p, g->t, g->ex);
214            update_player(g, g->p);
215            collide_player_tunnel(g, g->p, g->t, g->ex);
216
217            update_starfield(g, g->sf);
218            update_bonus(g, g->bo);
219            update_aliens(g, g->al);
220
221            collide_weapons_tunnel(g, g->wp, g->t, g->ex);
222            collide_weapons_aliens(g, g->wp, g->al, g->ex);
223            update_weapons(g, g->wp);
224            collide_weapons_tunnel(g, g->wp, g->t, g->ex);
225            collide_weapons_aliens(g, g->wp, g->al, g->ex);
226
227            update_explosions(g, g->ex);
228            update_tunnel(g, g->t);
229        }
230
231        /* Clear screen */
232        ee_clear();
233
234        /* Print starfield, tunnel, aliens, player and explosions */
235        draw_starfield(g, g->sf);
236        draw_aliens(g, g->al);
237        draw_tunnel(g, g->t);
238        draw_bonus(g, g->bo);
239        draw_explosions(g, g->ex);
240        draw_weapons(g, g->wp);
241        draw_player(g, g->p);
242        draw_status(g);
243
244        /* Print pause box if needed */
245        if(poz)
246        {
247            pausebox->frame++;
248            draw_box(g, pausebox);
249        }
250
251        /* Refresh */
252        ee_refresh();
253
254        purcompteur++;
255    }
256
257    if(pausebox)
258    {
259        free_box(pausebox);
260    }
261
262    free_starfield(g, g->sf);
263    free_tunnel(g->t);
264    free_player(g->p);
265}
266
Note: See TracBrowser for help on using the repository browser.