source: ttyvaders/trunk/src/aliens.c @ 110

Last change on this file since 110 was 110, checked in by Sam Hocevar, 17 years ago
  • src/*.c: + Added missing #include "config.h". + Fixed a nasty bug in ee_rand() calls.
  • Property svn:keywords set to Id
File size: 5.9 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: aliens.c 110 2003-11-09 23:34:24Z 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 <stdlib.h>
26
27#include "common.h"
28
29static void draw_alien_foo(game *, int, int, int);
30static void draw_alien_bar(game *, int, int, int);
31static void draw_alien_baz(game *, int, int, int);
32
33void init_aliens(game *g, aliens *al)
34{
35    int i;
36
37    for(i = 0; i < ALIENS; i++)
38    {
39        al->type[i] = ALIEN_NONE;
40    }
41}
42
43void draw_aliens(game *g, aliens *al)
44{
45    int i;
46
47    for(i = 0; i < ALIENS; i++)
48    {
49        switch(al->type[i])
50        {
51            case ALIEN_FOO:
52                draw_alien_foo(g, al->x[i], al->y[i], al->img[i] % 8);
53                break;
54            case ALIEN_BAR:
55                draw_alien_bar(g, al->x[i], al->y[i], al->img[i] % 2);
56                break;
57            case ALIEN_BAZ:
58                draw_alien_baz(g, al->x[i], al->y[i], al->img[i] % 6);
59                break;
60            case ALIEN_NONE:
61                break;
62        }
63    }
64}
65
66void update_aliens(game *g, aliens *al)
67{
68    int i;
69
70    for(i = 0; i < ALIENS; i++)
71    {
72        /* If alien died, make it explode */
73        if(al->type[i] != ALIEN_NONE && al->life[i] < 0)
74        {
75            add_explosion(g, g->ex, al->x[i], al->y[i], 0, 0, EXPLOSION_MEDIUM);
76            al->type[i] = ALIEN_NONE;
77            add_bonus(g, g->bo, al->x[i], al->y[i], ee_rand(0,4) ? BONUS_GREEN : BONUS_LIFE);
78        }
79
80        /* Update coordinates */
81        switch(al->type[i])
82        {
83            case ALIEN_FOO:
84            case ALIEN_BAR:
85            case ALIEN_BAZ:
86                al->x[i] = ((al->x[i] + 5) % (g->w + 3)) - 3;
87                al->y[i] = al->y[i] + (rand() % 8) / 7 - (rand() % 8) / 7;
88                al->img[i] = al->img[i] + 1;
89
90                /* Check bounds */
91                if(al->y[i] < 0 ) al->y[i] = 0;
92                if(al->y[i] > g->w - 1 ) al->y[i] = g->w - 1;
93                break;
94            case ALIEN_NONE:
95                break;
96        }
97    }
98}
99
100void add_alien(game *g, aliens *al, int x, int y, int type)
101{
102    int i;
103
104    for(i = 0; i < ALIENS; i++)
105    {
106        if(al->type[i] == ALIEN_NONE)
107        {
108            al->type[i] = type;
109            al->x[i] = x;
110            al->y[i] = y;
111            al->img[i] = 0;
112
113            switch(al->type[i])
114            {
115                case ALIEN_FOO:
116                    al->life[i] = 3;
117                    break;
118                case ALIEN_BAR:
119                    al->life[i] = 3;
120                    break;
121                case ALIEN_BAZ:
122                    al->life[i] = 3;
123                    break;
124                case ALIEN_NONE:
125                    break;
126            }
127
128            break;
129        }
130    }
131}
132
133static void draw_alien_bar(game *g, int x, int y, int frame)
134{
135    switch(frame)
136    {
137    case 0:
138        ee_color(EE_MAGENTA);
139        ee_goto(x, y);
140        ee_putstr(",---.");
141        ee_goto(x, y+1);
142        ee_putchar('\\');
143        ee_color(EE_WHITE);
144        ee_putstr("o O");
145        ee_color(EE_MAGENTA);
146        ee_putchar('/');
147        ee_goto(x, y+2);
148        ee_putstr("^^^^^");
149        break;
150    case 1:
151        ee_color(EE_MAGENTA);
152        ee_goto(x, y);
153        ee_putstr(",---.");
154        ee_goto(x, y+1);
155        ee_putchar('\\');
156        ee_color(EE_WHITE);
157        ee_putstr("O o");
158        ee_color(EE_MAGENTA);
159        ee_putchar('/');
160        ee_goto(x, y+2);
161        ee_putstr("^^^^^");
162        break;
163    }
164}
165
166static void draw_alien_baz(game *g, int x, int y, int frame)
167{
168    ee_color(EE_GREEN);
169    ee_goto(x, y-1);
170    ee_putstr("__");
171
172    ee_goto(x-1, y);
173    ee_putchar('/');
174    ee_goto(x+2, y);
175    ee_putchar('\\');
176
177    switch(frame)
178    {
179    case 3:
180        ee_goto(x-2, y+1);
181        ee_putstr("//'`\\\\");
182        break;
183    case 4:
184    case 2:
185        ee_goto(x-2, y+1);
186        ee_putstr("/(~~)\\");
187        break;
188    case 5:
189    case 1:
190        ee_goto(x-2, y+1);
191        ee_putstr("((^^))");
192        break;
193    case 0:
194        ee_goto(x-1, y+1);
195        ee_putstr("\\\\//");
196        break;
197    }
198
199    ee_color(EE_WHITE);
200    ee_goto(x, y);
201    ee_putstr("oo");
202}
203
204static void draw_alien_foo(game *g, int x, int y, int frame)
205{
206    ee_color(EE_YELLOW);
207
208    switch(frame)
209    {
210    case 0:
211        ee_goto(x, y);
212        ee_putchar('.');
213        ee_goto(x+6, y);
214        ee_putchar(',');
215        ee_goto(x+1, y+1);
216        ee_putstr("\\ X /");
217        break;
218    case 7:
219    case 1:
220        ee_goto(x-1, y);
221        ee_putchar('.');
222        ee_goto(x+7, y);
223        ee_putchar(',');
224        ee_goto(x, y+1);
225        ee_putstr("`- X -'");
226        break;
227    case 6:
228    case 2:
229        ee_goto(x-1, y+1);
230        ee_putstr("`-- X --'");
231        break;
232    case 5:
233    case 3:
234        ee_goto(x, y+1);
235        ee_putstr(",- X -.");
236        ee_goto(x-1, y+2);
237        ee_putchar('\'');
238        ee_goto(x+7, y+2);
239        ee_putchar('`');
240        break;
241    case 4:
242        ee_goto(x+1, y+1);
243        ee_putstr(", X .");
244        ee_goto(x, y+2);
245        ee_putchar('/');
246        ee_goto(x+6, y+2);
247        ee_putchar('\\');
248        break;
249    }
250
251    ee_goto(x+2, y+2);
252    ee_putstr("`V'");
253
254    ee_color(EE_WHITE);
255    ee_goto(x+2, y+1);
256    ee_putchar('o');
257    ee_goto(x+4, y+1);
258    ee_putchar('o');
259}
260
261
Note: See TracBrowser for help on using the repository browser.