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

Last change on this file since 1057 was 1057, checked in by Sam Hocevar, 14 years ago
  • Bring the tree back in sync with the new libcaca API.
  • Property svn:keywords set to Id
File size: 7.8 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 1057 2006-09-18 16:54:08Z 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    g->cv = cucul_create_canvas(0, 0);
45    if(!g->cv)
46        return 1;
47
48    g->dp = caca_create_display(g->cv);
49    if(!g->dp)
50        return 1;
51
52    caca_set_display_time(g->dp, 40000);
53
54    /* Initialize our program */
55    g->w = cucul_get_canvas_width(g->cv);
56    g->h = cucul_get_canvas_height(g->cv);
57
58intro(g);
59
60    /* Go ! */
61    start_game(g);
62
63    /* Clean up */
64    caca_free_display(g->dp);
65    cucul_free_canvas(g->cv);
66
67    return 0;
68}
69
70static void start_game (game *g)
71{
72    int quit = 0;
73    int poz = 0;
74    int skip = 0;
75    int purcompteur = 0;
76
77    box *pausebox = NULL;
78
79    g->sf = create_starfield(g);
80    g->wp = malloc(sizeof(weapons));
81    if(g->wp == NULL)
82        exit(1);
83    g->ex = malloc(sizeof(explosions));
84    if(g->ex == NULL)
85        exit(1);
86    g->bo = malloc(sizeof(bonus));
87    if(g->bo == NULL)
88        exit(1);
89    g->t = create_tunnel(g, g->w, g->h);
90    g->p = create_player(g);
91    g->al = malloc(sizeof(aliens));
92    if(g->al == NULL)
93        exit(1);
94
95    init_bonus(g, g->bo);
96    init_weapons(g, g->wp);
97    init_explosions(g, g->ex);
98    init_aliens(g, g->al);
99
100    /* Temporary stuff */
101    g->t->w = 25;
102
103    while(!quit)
104    {
105        caca_event_t ev;
106
107        while(caca_get_event(g->dp, CACA_EVENT_KEY_PRESS, &ev, 0))
108        {
109            switch(ev.data.key.ch)
110            {
111            case 'q':
112                quit = 1;
113                break;
114            case 'p':
115                poz = !poz;
116                if(poz)
117                {
118                    pausebox = create_box(g, g->w / 2, g->h / 2,
119                                              g->w - 16, 8);
120                }
121                else
122                {
123                    free_box(pausebox);
124                }
125                break;
126            case '\t':
127                ceo_alert(g);
128                poz = 1;
129                break;
130            case 's':
131                skip = 1;
132                break;
133            default:
134                if(g->p->dead)
135                {
136                    break;
137                }
138
139                switch(ev.data.key.ch)
140                {
141                case 'h':
142                    g->p->vx = -2;
143                    break;
144                case 'j':
145                    if(g->p->y < g->h - 3) g->p->y += 1;
146                    break;
147                case 'k':
148                    if(g->p->y > 2) g->p->y -= 1;
149                    break;
150                case 'l':
151                    g->p->vx = 2;
152                    break;
153                case 'n':
154                    if(g->p->special >= COST_NUKE)
155                    {
156                        g->p->special -= COST_NUKE;
157                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, 0, WEAPON_NUKE);
158                    }
159                    break;
160                case 'f':
161                    if(g->p->special >= COST_FRAGBOMB)
162                    {
163                        g->p->special -= COST_FRAGBOMB;
164                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_FRAGBOMB);
165                    }
166                    break;
167                case 'b':
168                    if(g->p->special >= COST_BEAM)
169                    {
170                        g->p->special -= COST_BEAM;
171                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, 0, WEAPON_BEAM);
172                    }
173                    break;
174                case ' ':
175                    if(g->p->weapon == 0)
176                    {
177                        g->p->weapon = 4;
178                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, 0, -32, WEAPON_LASER);
179                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 0, -32, WEAPON_LASER);
180                        /* Extra schtuph */
181                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, -24, -16, WEAPON_SEEKER);
182                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 24, -16, WEAPON_SEEKER);
183                        /* More schtuph */
184                        add_weapon(g, g->wp, (g->p->x - 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
185                        add_weapon(g, g->wp, (g->p->x + 2) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
186                        /* Even more schtuph */
187                        add_weapon(g, g->wp, g->p->x << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
188                        add_weapon(g, g->wp, (g->p->x + 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
189                        /* Extra schtuph */
190                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, -32, 0, WEAPON_SEEKER);
191                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 32, 0, WEAPON_SEEKER);
192                        /* MORE SCHTUPH! */
193                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_BOMB);
194                    }
195                    break;
196                }
197            }
198        }
199
200        if(!poz || skip)
201        {
202            skip = 0;
203
204            /* XXX: to be removed */
205            if(cucul_rand(0, 9) == 0)
206            {
207                int list[3] = { ALIEN_FOO, ALIEN_BAR, ALIEN_BAZ };
208
209                add_alien(g, g->al, 0, rand() % g->h / 2, list[cucul_rand(0,2)]);
210            }
211
212            /* Update game rules */
213            if(g->t->right[1] - g->t->left[1] == g->t->w)
214            {
215                g->t->w = 85 - g->t->w;
216            }
217
218            /* Scroll and update positions */
219            collide_player_tunnel(g, g->p, g->t, g->ex);
220            update_player(g, g->p);
221            collide_player_tunnel(g, g->p, g->t, g->ex);
222
223            update_starfield(g, g->sf);
224            update_bonus(g, g->bo);
225            update_aliens(g, g->al);
226
227            collide_weapons_tunnel(g, g->wp, g->t, g->ex);
228            collide_weapons_aliens(g, g->wp, g->al, g->ex);
229            update_weapons(g, g->wp);
230            collide_weapons_tunnel(g, g->wp, g->t, g->ex);
231            collide_weapons_aliens(g, g->wp, g->al, g->ex);
232
233            update_explosions(g, g->ex);
234            update_tunnel(g, g->t);
235        }
236
237        /* Clear screen */
238        cucul_clear_canvas(g->cv);
239
240        /* Print starfield, tunnel, aliens, player and explosions */
241        draw_starfield(g, g->sf);
242        draw_aliens(g, g->al);
243        draw_tunnel(g, g->t);
244        draw_bonus(g, g->bo);
245        draw_explosions(g, g->ex);
246        draw_weapons(g, g->wp);
247        draw_player(g, g->p);
248        draw_status(g);
249
250        /* Print pause box if needed */
251        if(poz)
252        {
253            pausebox->frame++;
254            draw_box(g, pausebox);
255        }
256
257        /* Refresh */
258        caca_refresh_display(g->dp);
259
260        purcompteur++;
261    }
262
263    if(pausebox)
264    {
265        free_box(pausebox);
266    }
267
268    free_starfield(g, g->sf);
269    free_tunnel(g->t);
270    free_player(g->p);
271}
272
Note: See TracBrowser for help on using the repository browser.