Commit | Line | Data |
---|---|---|
21c4e167 H |
1 | /** |
2 | * nInvaders - a space invaders clone for ncurses | |
3 | * Copyright (C) 2002-2003 Dettus | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation; either version 2 of the License, or | |
8 | * (at your option) any later version. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License | |
16 | * along with this program; if not, write to the Free Software | |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | * | |
19 | * homepage: http://ninvaders.sourceforge.net | |
20 | * mailto: ninvaders-devel@lists.sourceforge.net | |
21 | * | |
22 | */ | |
23 | ||
24 | ||
25 | #include "view.h" | |
26 | #include "globals.h" | |
27 | #include <stdlib.h> | |
28 | #include <unistd.h> | |
29 | #include <signal.h> | |
30 | ||
31 | #define RED 1 | |
32 | #define GREEN 2 | |
33 | #define YELLOW 3 | |
34 | #define BLUE 4 | |
35 | #define CYAN 5 | |
36 | #define MAGENTA 6 | |
37 | #define WHITE 7 | |
38 | ||
39 | WINDOW *wBattleField; | |
40 | WINDOW *wEmpty; | |
41 | WINDOW *wScores; | |
42 | ||
43 | WINDOW *wPlayer; | |
44 | WINDOW *wPlayerMissile; | |
45 | WINDOW *wAliens; | |
46 | WINDOW *wAliensMissile; | |
47 | WINDOW *wBunkers; | |
48 | WINDOW *wGameOver; | |
49 | WINDOW *wUfo; | |
50 | WINDOW *wStatus; | |
51 | WINDOW *wTitleScreen; | |
52 | ||
53 | /** | |
54 | * initialize player sprites | |
55 | */ | |
56 | static void playerInit() | |
57 | { | |
58 | wPlayer = newpad(1, PLAYERWIDTH); // new pad with appropriate size | |
59 | wclear(wPlayer); // clear pad | |
60 | wattrset(wPlayer,COLOR_PAIR(YELLOW)); // set color | |
61 | waddstr(wPlayer,"/-^-\\"); // set sprite | |
62 | } | |
63 | ||
64 | ||
65 | /** | |
66 | * display player sprite | |
67 | */ | |
68 | void playerDisplay(int x, int y) | |
69 | { | |
70 | copywin(wPlayer,wBattleField,0,0,y,x,y,x+PLAYERWIDTH-1,0); | |
71 | } | |
72 | ||
73 | ||
74 | /** | |
75 | * clear player sprite | |
76 | */ | |
77 | void playerClear(int x, int y) | |
78 | { | |
79 | copywin(wEmpty,wBattleField,0,0,y,x,y,x+PLAYERWIDTH-1,0); | |
80 | } | |
81 | ||
82 | ||
83 | /** | |
84 | * initialize missile sprites | |
85 | */ | |
86 | static void playerMissileInit() | |
87 | { | |
88 | wPlayerMissile = newpad(1, 1); // new pad with appropriate size | |
89 | wclear(wPlayerMissile); // clear pad | |
90 | wattrset(wPlayerMissile,COLOR_PAIR(WHITE)); // set color | |
91 | waddch(wPlayerMissile,'!'); // set sprite | |
92 | wrefresh(wPlayerMissile); | |
93 | } | |
94 | ||
95 | ||
96 | /** | |
97 | * display missile sprite | |
98 | */ | |
99 | void playerMissileDisplay(int x, int y) | |
100 | { | |
101 | copywin(wPlayerMissile,wBattleField,0,0,y,x,y,x,0); | |
102 | } | |
103 | ||
104 | ||
105 | /** | |
106 | * clear missile sprite | |
107 | */ | |
108 | void playerMissileClear(int x, int y) | |
109 | { | |
110 | copywin(wEmpty,wBattleField,0,0,y,x,y,x,0); | |
111 | } | |
112 | ||
113 | ||
114 | /** | |
115 | * some explosion animation | |
116 | */ | |
117 | void playerExplosionDisplay(int x, int y) | |
118 | { | |
119 | WINDOW* wPlayerExplosion; | |
120 | char playerExplosionChars[16+1]="@~`.,^#*-_=\\/%{}"; | |
121 | int t,s; | |
122 | ||
123 | wPlayerExplosion=newpad(1,PLAYERWIDTH); // new pad | |
124 | wattrset(wPlayerExplosion,COLOR_PAIR(YELLOW)); // set color | |
125 | ||
126 | for(t=0;t<5;t++){ // 5 frames | |
127 | wclear(wPlayerExplosion); // clear pad | |
128 | for(s=0;s<PLAYERWIDTH;s++){ | |
129 | waddch(wPlayerExplosion,playerExplosionChars[rand()%16]); // sprite | |
130 | } | |
131 | ||
132 | copywin(wPlayerExplosion,wBattleField,0,0,y,x,y,x+PLAYERWIDTH-1,0); // display explostion | |
133 | wrefresh(wBattleField); // refresh battelfield to display explosion frames | |
134 | doSleep(100000); // play animation not too fast | |
135 | } | |
136 | ||
137 | ||
138 | } // todo: kann man bestimmt noch besser machen. | |
139 | ||
140 | ||
141 | /** | |
142 | * initialize aliens sprites | |
143 | */ | |
144 | static void aliensInit() | |
145 | { | |
146 | wAliens = newpad(ALIENS_MAX_NUMBER_Y*2,ALIENS_MAX_NUMBER_X*3); | |
147 | wclear(wAliens); | |
148 | } | |
149 | ||
150 | ||
151 | /** | |
152 | * display aliens sprite | |
153 | */ | |
154 | void aliensDisplay(int x, int y, int wid, int hgt) | |
155 | { | |
156 | copywin(wAliens,wBattleField,0,0,y,x,y+hgt,x+wid+2,0); | |
157 | } | |
158 | ||
159 | ||
160 | /** | |
161 | * clear aliens sprite | |
162 | */ | |
163 | void aliensClear(int x, int y, int wid, int hgt) | |
164 | { | |
165 | copywin(wEmpty,wBattleField,0,0,y,x,y+hgt,x+wid+2,0); | |
166 | } | |
167 | ||
168 | ||
169 | /** | |
170 | * initialize missile sprites | |
171 | */ | |
172 | static void aliensMissileInit() | |
173 | { | |
174 | wAliensMissile = newpad(1, 1); // new pad | |
175 | wclear(wAliensMissile); // clear pad | |
176 | wattrset(wAliensMissile, COLOR_PAIR(CYAN)); // set color | |
177 | waddch(wAliensMissile, ':'); // set sprite | |
178 | } | |
179 | ||
180 | ||
181 | /** | |
182 | * display missile sprite | |
183 | */ | |
184 | void aliensMissileDisplay(int x, int y) | |
185 | { | |
186 | copywin(wAliensMissile,wBattleField,0,0,y,x,y,x,0); | |
187 | } | |
188 | ||
189 | ||
190 | /** | |
191 | * clear missile sprite | |
192 | */ | |
193 | void aliensMissileClear(int x, int y) | |
194 | { | |
195 | copywin(wEmpty,wBattleField,0,0,y,x,y,x,0); | |
196 | } | |
197 | ||
198 | ||
199 | /** | |
200 | * refresh aliens sprite | |
201 | */ | |
202 | void aliensRefresh(int level, int *pAliens) | |
203 | { | |
204 | static int frame = 0; // used for animation; mod 2 == 0: frame1, mod2 == 1: frame2 | |
205 | int k,row; | |
206 | int c = 0; | |
207 | int alienType = 0; | |
208 | char ships[2][9][3+1] = { | |
209 | {",^,", "_O-", "-o-", "o=o", "<O>", "_x_", "*^*", "\\_/", "o o"}, | |
210 | {".-.", "-O_", "/o\\", "o-o", "<o>", "-x-", "o^o", "/~\\", "oo "} | |
211 | }; | |
212 | int colors[9] = {RED, GREEN, BLUE, RED, YELLOW, WHITE, WHITE, YELLOW, RED}; | |
213 | ||
214 | wclear(wAliens); // clear pad | |
215 | wattrset(wAliens,COLOR_PAIR(RED)); // set color | |
216 | ||
217 | frame++; // next frame | |
218 | ||
219 | // draw alien if there is one | |
220 | for (row = 0; row < ALIENS_MAX_NUMBER_Y*2; row++) { | |
221 | for (k = 0; k < ALIENS_MAX_NUMBER_X; k++) { | |
222 | if ((row % 2) == 0) { // display aliens every even row | |
223 | alienType = *(pAliens + c * (ALIENS_MAX_NUMBER_X) + k); // get type of alien //alienBlock[c][k] | |
224 | ||
225 | if (alienType != 0) { // if there is an alien to display | |
226 | wattrset(wAliens,COLOR_PAIR(colors[alienType-1])); // set color | |
227 | waddch(wAliens,ships[frame%2][alienType-1+(3*((level-1)%3))][0]); // set char1 | |
228 | waddch(wAliens,ships[frame%2][alienType-1+(3*((level-1)%3))][1]); // set char2 | |
229 | waddch(wAliens,ships[frame%2][alienType-1+(3*((level-1)%3))][2]); // set char3 | |
230 | if (alienType > 4) { | |
231 | *(pAliens + c * ALIENS_MAX_NUMBER_X + k) = (alienType + 1) % 9; | |
232 | } // todo: what's that? If alien_type > 4 then do a modulo operation??? | |
233 | } else { | |
234 | waddstr(wAliens," "); // no alien | |
235 | } | |
236 | ||
237 | } else { | |
238 | waddstr(wAliens," "); // no aliens at odd rows | |
239 | } | |
240 | } | |
241 | if ((row % 2) == 1) {c++;} // goto next row at alienblock | |
242 | } | |
243 | } | |
244 | ||
245 | ||
246 | /** | |
247 | * initialize bunkers sprites | |
248 | */ | |
249 | static void bunkersInit() | |
250 | { | |
251 | wBunkers = newpad(BUNKERHEIGHT, BUNKERWIDTH); // new pad data | |
252 | wclear(wBunkers); | |
253 | } | |
254 | ||
255 | ||
256 | /** | |
257 | * display bunkers sprite | |
258 | * needs pointer to bunker-array | |
259 | */ | |
260 | void bunkersDisplay(int *pBunker) | |
261 | { | |
262 | int l, k; | |
263 | wclear(wBunkers); | |
264 | wattrset(wBunkers,COLOR_PAIR(CYAN)); | |
265 | for (l=0;l<BUNKERHEIGHT;l++) { | |
266 | for (k=0;k<BUNKERWIDTH;k++) { | |
267 | if (*(pBunker + (l * (BUNKERWIDTH + 1)) + k) == 1) { //if (pBunker[l][k]==1) { | |
268 | waddch(wBunkers,'#'); | |
269 | } else { | |
270 | waddch(wBunkers,' '); | |
271 | } | |
272 | } | |
273 | } | |
274 | ||
275 | copywin(wBunkers, wBattleField, 0, 0, BUNKERY, BUNKERX, BUNKERY + BUNKERHEIGHT - 1, BUNKERX + BUNKERWIDTH - 1, 0); | |
276 | } | |
277 | ||
278 | ||
279 | /** | |
280 | * clear bunkers sprite | |
281 | */ | |
282 | void bunkersClear() | |
283 | { | |
284 | copywin(wEmpty, wBattleField, 0, 0, BUNKERY, BUNKERX, BUNKERY + BUNKERHEIGHT - 1, BUNKERX + BUNKERWIDTH - 1, 0); | |
285 | } | |
286 | ||
287 | ||
288 | /** | |
289 | * clear one element of bunkers sprite at position (x, y) | |
290 | */ | |
291 | void bunkersClearElement(int x, int y) | |
292 | { | |
293 | copywin(wEmpty, wBattleField, 0, 0, y, x, y, x, 0); | |
294 | } | |
295 | ||
296 | ||
297 | /** | |
298 | * set actual sprite for ufo animation | |
299 | */ | |
300 | void ufoRefresh() | |
301 | { | |
302 | char ufo[4][6] = {"<o o>", "<oo >", "<o o>", "< oo>"}; | |
303 | static int frame = 0; | |
304 | ||
305 | wclear(wUfo); | |
306 | wattrset(wUfo, COLOR_PAIR(MAGENTA)); | |
307 | waddstr(wUfo, ufo[frame % 4]); | |
308 | ||
309 | frame++; | |
310 | } | |
311 | ||
312 | ||
313 | /** | |
314 | * initialize ufo sprite | |
315 | */ | |
316 | static void ufoInit() | |
317 | { | |
318 | wUfo = newpad(1, UFOWIDTH); // new pad with appropriate size | |
319 | wclear(wUfo); // clear pad | |
320 | wattrset(wUfo, COLOR_PAIR(MAGENTA)); // set color | |
321 | } | |
322 | ||
323 | ||
324 | /** | |
325 | * display ufo sprite | |
326 | */ | |
327 | void ufoDisplay(int x, int y) | |
328 | { | |
329 | copywin(wUfo, wBattleField, 0, 0, y, x, y, x + UFOWIDTH - 1, 0); | |
330 | } | |
331 | ||
332 | ||
333 | /** | |
334 | * clear ufo sprite | |
335 | */ | |
336 | void ufoClear(int x, int y) | |
337 | { | |
338 | copywin(wEmpty, wBattleField, 0, 0, y, x, y, x + UFOWIDTH - 1, 0); | |
339 | } | |
340 | ||
341 | ||
342 | /** | |
343 | * initialize gameover graphic | |
344 | */ | |
345 | static void gameOverInit() | |
346 | { | |
347 | // init game-over banner | |
348 | wGameOver = newpad(13, 31); | |
349 | wclear(wGameOver); | |
350 | wattrset(wGameOver, COLOR_PAIR(WHITE)); | |
351 | waddstr(wGameOver, " "); | |
352 | waddstr(wGameOver, " ##### #### ## ## ###### "); | |
353 | waddstr(wGameOver, " ## ## ## ####### ## "); | |
354 | waddstr(wGameOver, " ## ### ###### ## # ## ##### "); | |
355 | waddstr(wGameOver, " ## ## ## ## ## ## ## "); | |
356 | waddstr(wGameOver, " ##### ## ## ## ## ###### "); | |
357 | waddstr(wGameOver, " "); | |
358 | waddstr(wGameOver, " #### ## ## ###### ###### "); | |
359 | waddstr(wGameOver, " ## ## ## ## ## ## ## "); | |
360 | waddstr(wGameOver, " ## ## ## ## ##### ###### "); | |
361 | waddstr(wGameOver, " ## ## ## ## ## ## ## "); | |
362 | waddstr(wGameOver, " #### ### ###### ## ## "); | |
363 | waddstr(wGameOver, " "); | |
364 | } | |
365 | ||
366 | /** | |
367 | * display game over graphic | |
368 | */ | |
369 | void gameOverDisplay() | |
370 | { | |
371 | int x = (SCREENWIDTH / 2) - (31 / 2); | |
372 | int y = (SCREENHEIGHT / 2) - (13 / 2); | |
373 | copywin(wGameOver, wBattleField, 0, 0, y, x, y + 12, x + 30, 0); | |
374 | wrefresh(wBattleField); | |
375 | } | |
376 | ||
377 | ||
378 | /** | |
379 | * initialize title screen | |
380 | */ | |
381 | static void titleScreenInit() | |
382 | { | |
383 | wTitleScreen = newpad(SCREENHEIGHT, SCREENWIDTH); | |
384 | wclear(wTitleScreen); | |
385 | } | |
386 | ||
387 | ||
388 | /** | |
389 | * display title screen | |
390 | */ | |
391 | void titleScreenDisplay() | |
392 | { | |
393 | static int frame = 0; | |
394 | int x, y; | |
395 | int i; | |
396 | WINDOW *wTitleText; | |
397 | WINDOW *wAliens; | |
398 | WINDOW *wStartText; | |
399 | char ufo[4][6] = {"<o o>", "<oo >", "<o o>", "< oo>"}; | |
400 | char aliens[2][9][3+1] = { | |
401 | {",^,", "_O-", "-o-", "o=o", "<O>", "_x_", "*^*", "\\_/", "o o"}, | |
402 | {".-.", "-O_", "/o\\", "o-o", "<o>", "-x-", "o^o", "/~\\", "oo "} | |
403 | }; | |
404 | int score[3] = {200, 150, 100}; | |
405 | int colors[9] = {RED, GREEN, BLUE, RED, GREEN, BLUE, RED, GREEN, BLUE}; | |
406 | char buffer[12]; | |
407 | static int alien_type = 0; | |
408 | ||
409 | wTitleText = newpad(4, 41); | |
410 | wclear(wTitleText); | |
411 | wattrset(wTitleText, COLOR_PAIR(YELLOW)); | |
412 | waddstr(wTitleText, " ____ __ "); | |
413 | waddstr(wTitleText, " ___ / _/__ _ _____ ___/ /__ _______"); | |
414 | waddstr(wTitleText, " / _ \\_/ // _ \\ |/ / _ `/ _ / -_) __(_-<"); | |
415 | waddstr(wTitleText, "/_//_/___/_//_/___/\\_,_/\\_,_/\\__/_/ /___/"); | |
416 | ||
417 | frame++; | |
418 | wAliens = newpad(7, 11); | |
419 | wclear(wAliens); | |
420 | snprintf(buffer, sizeof(buffer),"%s = 500", ufo[frame % 4]); | |
421 | wattrset(wAliens, COLOR_PAIR(MAGENTA)); | |
422 | waddstr(wAliens, buffer); | |
423 | if ((frame = frame % 60) == 0) { | |
424 | alien_type = 0; | |
425 | } else if (frame == 20) { | |
426 | alien_type = 3; | |
427 | } else if (frame == 40) { | |
428 | alien_type = 6; | |
429 | } | |
430 | for (i = alien_type; i < alien_type + 3; i++) { | |
431 | waddstr(wAliens, " "); | |
432 | snprintf(buffer, sizeof(buffer), "%s = %d", aliens[frame % 2][i], score[i % 3]); | |
433 | wattrset(wAliens, COLOR_PAIR(colors[i])); | |
434 | waddstr(wAliens, buffer); | |
435 | } | |
436 | ||
437 | wStartText = newpad(1, 20); | |
438 | wclear(wStartText); | |
439 | wattrset(wStartText, COLOR_PAIR(RED)); | |
440 | waddstr(wStartText, "Press SPACE to start"); | |
441 | ||
442 | x = (SCREENWIDTH / 2) - (41 / 2); | |
443 | y = 0; | |
444 | copywin(wTitleText, wTitleScreen, 0, 0, y, x, y + 3, x + 40, 0); | |
445 | ||
446 | x = (SCREENWIDTH / 2) - (11 / 2); | |
447 | y = 8; | |
448 | copywin(wAliens, wTitleScreen, 0, 0, y, x , y + 6, x + 10, 0); | |
449 | ||
450 | x = (SCREENWIDTH / 2) - (20 / 2); | |
451 | y = SCREENHEIGHT - 2; | |
452 | copywin(wStartText, wTitleScreen, 0, 0, y, x, y, x + 19, 0); | |
453 | ||
454 | copywin(wTitleScreen, wBattleField, 0, 0, 0, 0, SCREENHEIGHT-1, SCREENWIDTH-1, 0); | |
455 | ||
456 | wrefresh(wBattleField); | |
457 | } | |
458 | ||
459 | ||
460 | /** | |
461 | * clear title screen | |
462 | */ | |
463 | void titleScreenClear() | |
464 | { | |
465 | battleFieldClear(); | |
466 | } | |
467 | ||
468 | ||
469 | /** | |
470 | * initialize scores | |
471 | */ | |
472 | void statusInit() | |
473 | { | |
474 | wStatus = newpad(1, 55); | |
475 | wclear(wStatus); | |
476 | } | |
477 | ||
478 | ||
479 | /** | |
480 | * display scores | |
481 | */ | |
482 | void statusDisplay(int level, int score, int lives) | |
483 | { | |
484 | int t, xOffset; | |
485 | char strStatus[55]; | |
486 | // "Level: 01 Score: 0001450 Lives: /-\ /-\ /-\ /-\ /-\ " | |
487 | // "1234567890123456789012345678901234567890123456789012" | |
488 | ||
489 | ||
490 | xOffset = (SCREENWIDTH / 2) - 24; | |
491 | ||
492 | ||
493 | ||
494 | sprintf (strStatus, "Level: %2.2d Score: %2.7d Lives: ", level, score); | |
495 | ||
496 | wclear(wStatus); | |
497 | wattrset(wStatus, COLOR_PAIR(RED)); | |
498 | waddstr(wStatus, strStatus); | |
499 | ||
500 | // show maximal five lives | |
501 | for (t = 1; ((t <= 5) && (t < lives)); t++){ | |
502 | waddstr(wStatus, "/-\\ "); | |
503 | } | |
504 | ||
505 | copywin(wStatus, wBattleField, 0, 0, SCREENHEIGHT-1, xOffset, SCREENHEIGHT-1, xOffset + 54, 0); | |
506 | ||
507 | ||
508 | } | |
509 | ||
510 | ||
511 | /** | |
512 | * initialize battlefield | |
513 | */ | |
514 | static void battleFieldInit() | |
515 | { | |
516 | wEmpty = newpad(SCREENHEIGHT, SCREENWIDTH); | |
517 | wclear(wEmpty); | |
518 | ||
519 | wBattleField = newwin(SCREENHEIGHT, SCREENWIDTH, 0, 0); // new window | |
520 | wclear(wBattleField); // clear window | |
521 | mvwin(wBattleField, 0, 0); // move window | |
522 | } | |
523 | ||
524 | ||
525 | /** | |
526 | * clear battlefield | |
527 | */ | |
528 | void battleFieldClear() | |
529 | { | |
530 | copywin(wEmpty,wBattleField,0,0,0,0,SCREENHEIGHT-1,SCREENWIDTH-1,0); | |
531 | } | |
532 | ||
533 | ||
534 | /** | |
535 | * refresh screen so that modified graphic buffers get visible | |
536 | */ | |
537 | void refreshScreen() | |
538 | { | |
539 | redrawwin(wBattleField); // needed to display graphics properly at startup on some terminals | |
540 | wrefresh(wBattleField); | |
541 | ||
542 | } | |
543 | ||
544 | ||
545 | /** | |
546 | * do proper cleanup | |
547 | */ | |
548 | static void finish(int sig) | |
549 | { | |
550 | endwin(); // <curses.h> reset terminal into proper non-visual mode | |
551 | exit(0); | |
552 | } | |
553 | ||
554 | ||
555 | /** | |
556 | * initialize n_courses | |
557 | */ | |
558 | void graphicEngineInit() | |
559 | { | |
560 | (void) signal(SIGINT, finish); // <signal.h> on signal "SIGINT" call method "finish" | |
561 | (void) initscr(); // <curses.h> do initialization work | |
562 | keypad(stdscr, TRUE); // <curses.h> enable keypad for input | |
563 | (void) nonl(); // <curses.h> disable translation return/ newline for detection of return key | |
564 | (void) cbreak(); // <curses.h> do not buffer typed characters, use at once | |
565 | (void) noecho(); // <curses.h> do not echo typed characters | |
566 | start_color(); // <curses.h> use colors | |
567 | init_pair(RED, COLOR_RED, COLOR_BLACK); // <curses.h> define color-pair | |
568 | init_pair(GREEN, COLOR_GREEN, COLOR_BLACK); // <curses.h> define color-pair | |
569 | init_pair(YELLOW, COLOR_YELLOW, COLOR_BLACK); // <curses.h> define color-pair | |
570 | init_pair(BLUE, COLOR_BLUE, COLOR_BLACK); // <curses.h> define color-pair | |
571 | init_pair(CYAN, COLOR_CYAN, COLOR_BLACK); // <curses.h> define color-pair | |
572 | init_pair(MAGENTA, COLOR_MAGENTA, COLOR_BLACK); // <curses.h> define color-pair | |
573 | init_pair(WHITE, COLOR_WHITE, COLOR_BLACK); // <curses.h> define color-pair | |
574 | ||
575 | //timeout(0); // <curses.h> do not wait for input | |
576 | ||
577 | // initialize sprites | |
578 | battleFieldInit(); | |
579 | playerInit(); | |
580 | playerMissileInit(); | |
581 | aliensInit(); | |
582 | aliensMissileInit(); | |
583 | bunkersInit(); | |
584 | ufoInit(); | |
585 | gameOverInit(); | |
586 | statusInit(); | |
587 | titleScreenInit(); | |
588 | } | |
589 |