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

Last change on this file since 2990 was 2990, checked in by Sam Hocevar, 11 years ago

Port ttyvaders to the unified libcaca 0.99.beta15 API.

  • 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 2990 2008-10-18 21:42:24Z sam $
7 *
8 *  This program is free software. It comes without any warranty, to
9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
13 */
14
15#include "config.h"
16
17#include <stdio.h>
18#include <stdlib.h>
19
20#include <string.h>
21
22#include <time.h>
23
24#include "common.h"
25
26static void start_game (game *);
27
28int _main (int argc, char **argv)
29{
30    game *g = malloc(sizeof(game));
31    if(g == NULL)
32        exit(1);
33
34    srand(time(NULL));
35
36    g->cv = caca_create_canvas(0, 0);
37    if(!g->cv)
38        return 1;
39
40    g->dp = caca_create_display(g->cv);
41    if(!g->dp)
42        return 1;
43
44    caca_set_display_time(g->dp, 40000);
45
46    /* Initialize our program */
47    g->w = caca_get_canvas_width(g->cv);
48    g->h = caca_get_canvas_height(g->cv);
49
50intro(g);
51
52    /* Go ! */
53    start_game(g);
54
55    /* Clean up */
56    caca_free_display(g->dp);
57    caca_free_canvas(g->cv);
58
59    return 0;
60}
61
62static void start_game (game *g)
63{
64    int quit = 0;
65    int poz = 0;
66    int skip = 0;
67    int purcompteur = 0;
68
69    box *pausebox = NULL;
70
71    g->sf = create_starfield(g);
72    g->wp = malloc(sizeof(weapons));
73    if(g->wp == NULL)
74        exit(1);
75    g->ex = malloc(sizeof(explosions));
76    if(g->ex == NULL)
77        exit(1);
78    g->bo = malloc(sizeof(bonus));
79    if(g->bo == NULL)
80        exit(1);
81    g->t = create_tunnel(g, g->w, g->h);
82    g->p = create_player(g);
83    g->al = malloc(sizeof(aliens));
84    if(g->al == NULL)
85        exit(1);
86
87    init_bonus(g, g->bo);
88    init_weapons(g, g->wp);
89    init_explosions(g, g->ex);
90    init_aliens(g, g->al);
91
92    /* Temporary stuff */
93    g->t->w = 25;
94
95    while(!quit)
96    {
97        caca_event_t ev;
98
99        while(caca_get_event(g->dp, CACA_EVENT_KEY_PRESS, &ev, 0))
100        {
101            switch(ev.data.key.ch)
102            {
103            case 'q':
104                quit = 1;
105                break;
106            case 'p':
107                poz = !poz;
108                if(poz)
109                {
110                    pausebox = create_box(g, g->w / 2, g->h / 2,
111                                              g->w - 16, 8);
112                }
113                else
114                {
115                    free_box(pausebox);
116                }
117                break;
118            case '\t':
119                ceo_alert(g);
120                poz = 1;
121                break;
122            case 's':
123                skip = 1;
124                break;
125            default:
126                if(g->p->dead)
127                {
128                    break;
129                }
130
131                switch(ev.data.key.ch)
132                {
133                case 'h':
134                    g->p->vx = -2;
135                    break;
136                case 'j':
137                    if(g->p->y < g->h - 3) g->p->y += 1;
138                    break;
139                case 'k':
140                    if(g->p->y > 2) g->p->y -= 1;
141                    break;
142                case 'l':
143                    g->p->vx = 2;
144                    break;
145                case 'n':
146                    if(g->p->special >= COST_NUKE)
147                    {
148                        g->p->special -= COST_NUKE;
149                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, 0, WEAPON_NUKE);
150                    }
151                    break;
152                case 'f':
153                    if(g->p->special >= COST_FRAGBOMB)
154                    {
155                        g->p->special -= COST_FRAGBOMB;
156                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_FRAGBOMB);
157                    }
158                    break;
159                case 'b':
160                    if(g->p->special >= COST_BEAM)
161                    {
162                        g->p->special -= COST_BEAM;
163                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, 0, WEAPON_BEAM);
164                    }
165                    break;
166                case ' ':
167                    if(g->p->weapon == 0)
168                    {
169                        g->p->weapon = 4;
170                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, 0, -32, WEAPON_LASER);
171                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 0, -32, WEAPON_LASER);
172                        /* Extra schtuph */
173                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, -24, -16, WEAPON_SEEKER);
174                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 24, -16, WEAPON_SEEKER);
175                        /* More schtuph */
176                        add_weapon(g, g->wp, (g->p->x - 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
177                        add_weapon(g, g->wp, (g->p->x + 2) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
178                        /* Even more schtuph */
179                        add_weapon(g, g->wp, g->p->x << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
180                        add_weapon(g, g->wp, (g->p->x + 1) << 4, (g->p->y - 1) << 4, 0, -32, WEAPON_LASER);
181                        /* Extra schtuph */
182                        add_weapon(g, g->wp, (g->p->x - 2) << 4, g->p->y << 4, -32, 0, WEAPON_SEEKER);
183                        add_weapon(g, g->wp, (g->p->x + 3) << 4, g->p->y << 4, 32, 0, WEAPON_SEEKER);
184                        /* MORE SCHTUPH! */
185                        add_weapon(g, g->wp, g->p->x << 4, g->p->y << 4, 0, -16, WEAPON_BOMB);
186                    }
187                    break;
188                }
189            }
190        }
191
192        if(!poz || skip)
193        {
194            skip = 0;
195
196            /* XXX: to be removed */
197            if(caca_rand(0, 9) == 0)
198            {
199                int list[3] = { ALIEN_FOO, ALIEN_BAR, ALIEN_BAZ };
200
201                add_alien(g, g->al, 0, rand() % g->h / 2, list[caca_rand(0,2)]);
202            }
203
204            /* Update game rules */
205            if(g->t->right[1] - g->t->left[1] == g->t->w)
206            {
207                g->t->w = 85 - g->t->w;
208            }
209
210            /* Scroll and update positions */
211            collide_player_tunnel(g, g->p, g->t, g->ex);
212            update_player(g, g->p);
213            collide_player_tunnel(g, g->p, g->t, g->ex);
214
215            update_starfield(g, g->sf);
216            update_bonus(g, g->bo);
217            update_aliens(g, g->al);
218
219            collide_weapons_tunnel(g, g->wp, g->t, g->ex);
220            collide_weapons_aliens(g, g->wp, g->al, g->ex);
221            update_weapons(g, g->wp);
222            collide_weapons_tunnel(g, g->wp, g->t, g->ex);
223            collide_weapons_aliens(g, g->wp, g->al, g->ex);
224
225            update_explosions(g, g->ex);
226            update_tunnel(g, g->t);
227        }
228
229        /* Clear screen */
230        caca_clear_canvas(g->cv);
231
232        /* Print starfield, tunnel, aliens, player and explosions */
233        draw_starfield(g, g->sf);
234        draw_aliens(g, g->al);
235        draw_tunnel(g, g->t);
236        draw_bonus(g, g->bo);
237        draw_explosions(g, g->ex);
238        draw_weapons(g, g->wp);
239        draw_player(g, g->p);
240        draw_status(g);
241
242        /* Print pause box if needed */
243        if(poz)
244        {
245            pausebox->frame++;
246            draw_box(g, pausebox);
247        }
248
249        /* Refresh */
250        caca_refresh_display(g->dp);
251
252        purcompteur++;
253    }
254
255    if(pausebox)
256    {
257        free_box(pausebox);
258    }
259
260    free_starfield(g, g->sf);
261    free_tunnel(g->t);
262    free_player(g->p);
263}
264
Note: See TracBrowser for help on using the repository browser.