Commit 8e1b403a0aa37d40c6d8149bb0e81a18eec1b324
1 parent
022e6030
ajout des sources du jeu ninvaders
Showing
30 changed files
with
3221 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,320 @@ | @@ -0,0 +1,320 @@ | ||
1 | + | ||
2 | +****** Release 0.1.1 ****** | ||
3 | + | ||
4 | +2003-04-22 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
5 | + | ||
6 | + * globas.c: changed version from 0.0.11 to 0.1.1 | ||
7 | + | ||
8 | +2003-05-06 Sebastian Gutsfeld <segoh@gmx.net> | ||
9 | + | ||
10 | + * aliens.c (aliensMissileMove): added test if there is an alien | ||
11 | + ship left when starting a new missile; this was the bug which is | ||
12 | + responsible for freezing the game when shooting at the last alien | ||
13 | + | ||
14 | +2003-05-05 Sebastian Gutsfeld <segoh@gmx.net> | ||
15 | + | ||
16 | + * nInvaders.c (readInput): updated readInput for reading input in | ||
17 | + different states (see status var) | ||
18 | + | ||
19 | + * nInvaders.c (handleTimer): added code for status GAME_HIGHSCORE | ||
20 | + so a title screen with animation is shown; updated status | ||
21 | + GAME_OVER | ||
22 | + | ||
23 | + * nInvaders.c (main): updated status initialisation from | ||
24 | + GAME_NEXTLEVEL to GAME_HIGHSCORE | ||
25 | + | ||
26 | + * view.c: added WINDOW wTitleScreen; added titleScreenInit; added | ||
27 | + titleScreenDisplay; added titleScreenClear; added battleFieldClear | ||
28 | + | ||
29 | + * view.c (aliensRefresh): formatted some code | ||
30 | + | ||
31 | + * view.c (ufoRefresh): fixed array length | ||
32 | + | ||
33 | + * view.c (gameOverDisplay): simpified function | ||
34 | + | ||
35 | + * view.c (graphicEngineInit): updated with titleScreenInit | ||
36 | + | ||
37 | + * view.h: sorted function declarations; updated gameOverDisplay, | ||
38 | + titleScreenClear, titleScreenDisplay and battleFieldClear | ||
39 | + | ||
40 | +2003-04-22 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
41 | + | ||
42 | + * globals.c (doSleep): added again. still needed in | ||
43 | + view.c. added "#ifdef win32" instruction again. | ||
44 | + | ||
45 | +2003-04-22 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
46 | + | ||
47 | + * globals.c (doSleep): deleted method. not used any more. | ||
48 | + | ||
49 | + * globals.c: incremented version number from 0.0.10 to 0.0.11 | ||
50 | + | ||
51 | + * globals.c: removed '#ifdef win32' instruction. | ||
52 | + | ||
53 | + * *.c, *.h: added license notice to each file | ||
54 | + | ||
55 | + * renamed ToDo to TODO | ||
56 | + | ||
57 | +2003-04-18 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
58 | + | ||
59 | + * nInvaders.c (finish): "barely mediocre" and "show promise" | ||
60 | + both "< 10000". Changed latter to "< 12500" | ||
61 | + | ||
62 | +2003-04-17 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
63 | + | ||
64 | + * view.c (statusDisplay): modified so that buffer is written | ||
65 | + to wBattleField. new variable WINDOW* wStatus. added method | ||
66 | + (statusInit) which does initialisation of WINDOW wStatus. | ||
67 | + Problem: Alien missiles go right to the bottom of screen, | ||
68 | + where status is located and overwritten with missile sprite. | ||
69 | + Fix: see next point | ||
70 | + Changed behaviour of display of lives. Now the _remaining_ | ||
71 | + lives are displayed. i.e. at the beginning you will see | ||
72 | + two little spaceshuttles, because you have two lives left. | ||
73 | + | ||
74 | + * aliens.c (aliensMissileMove): added some checking, if missile | ||
75 | + reached bottom where player moves. if so, do not move further | ||
76 | + and reload missile. this reduces number of missiles which have | ||
77 | + to be hit-tested each round, yet made it necessary to change | ||
78 | + the shot-threshold otherwise too many missiles would have been | ||
79 | + coming down. Not limiting ALIENS_MAX_MISSILES from 50 to 10 is | ||
80 | + possible, because missiles are reloaded when they reach the | ||
81 | + bottom. 10 concurrent missiles should be quite hard to manage.. | ||
82 | + Removed ALIENS_MAX_MISSILES-definition from view.h. Was defined | ||
83 | + twice, now only in aliens.h. | ||
84 | + optimized threshold-checking. calculation outside for- | ||
85 | + instruction, and only comparison within. | ||
86 | + | ||
87 | + | ||
88 | +2003-04-17 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
89 | + | ||
90 | + * nInvaders.c (readInput): removed (ch==27) for exit | ||
91 | + sequence. as dettus pointed out there would be problems | ||
92 | + on some terminals. pressing some keys too long will send | ||
93 | + an KEY_ESC and quit the game. | ||
94 | + | ||
95 | +2003-04-17 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
96 | + | ||
97 | + * nInvaders.c (setUpTimer): changed method to call handleTimer. | ||
98 | + The call signal(SIG_ALRM, handleTimer) didn't work on irix. | ||
99 | + There, the timer was only fired once and then the programm | ||
100 | + exited. Now using call to sigaction() with flag SA_RESTART. | ||
101 | + | ||
102 | +2003-04-16 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
103 | + | ||
104 | + * nInvaders.c: added a real-time timer that does 50 fps. if you | ||
105 | + want it slower toggle the constant FPS. the higher the slower. | ||
106 | + A timer is created and does all the gaming stuff while key | ||
107 | + checking is still done in (main). Gamehandling is done by | ||
108 | + simulating a deterministic finite automaton by setting the | ||
109 | + 'status'-attribute to e.g. GAME_LOOP, GAME_PAUSED, GAME_EXIT. | ||
110 | + the following methods were modified/ added: | ||
111 | + (setUpTimer): creates and initializes timer | ||
112 | + (handleTimer): this method is called every 1/FPS seconds and | ||
113 | + contains most code from old (main) | ||
114 | + (readInput): changed so that the 'status'-variable is affected. | ||
115 | + pressing of 'p' now changes 'status' | ||
116 | + (main): most code moved to (handleTimer), calls setUpTimer and | ||
117 | + sets 'status' to GAME_NEXTLEVEL | ||
118 | + (gameOver): completely moved to handleTimer | ||
119 | + | ||
120 | + * view.c (graphicEngineInit): removed 'timeout(0);' no longer | ||
121 | + needed as we now hava a timer. another advantage: call to | ||
122 | + (readInput) in nInvaders.c no longer called permanently. | ||
123 | + in (readInput) the getch()-call waits till a key is pressed. | ||
124 | + doSleep(1) no longer needed in nInvaders.c (readInput). | ||
125 | + | ||
126 | +2003-04-08 Sebastian Gutsfeld <segoh@gmx.net> | ||
127 | + | ||
128 | + * ufo.c:replaced 'u' with 'ufo' (see ufo.h) and 'a' with 'aliens' | ||
129 | + | ||
130 | + * ufo.h: added typedef for Ufo and renamed 'u' into 'ufo', | ||
131 | + | ||
132 | + * player.c: added typedef for Player and renamed 'p' into 'player', | ||
133 | + replaced 'p' with 'player and 'a' with 'aliens' | ||
134 | + | ||
135 | + * aliens.c: replaced 'a' with 'aliens' (see aliens.h) | ||
136 | + | ||
137 | + * aliens.h: added typedef for Aliens and renamed 'a' into 'aliens' | ||
138 | + | ||
139 | + * globals.c (RELEASE): updated release number | ||
140 | + | ||
141 | +2003-04-07 Sebastian Gutsfeld <segoh@gmx.net> | ||
142 | + | ||
143 | + * view.c (ufoRefresh): reverted 'frame' assignement | ||
144 | + | ||
145 | + * nInvaders.c (main): reverted to old ufo speed from revision 1.3 | ||
146 | + | ||
147 | +2003-04-06 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
148 | + | ||
149 | + * nInvaders.c (resetPlayer): added a call to playerMisisleClear(); | ||
150 | + | ||
151 | + * view.c (aliensRefresh): fully encapsulated. access to aliens-Array | ||
152 | + by pointer. | ||
153 | + | ||
154 | + * aliens.c (*HitCheck): moved hit_alien_test and hit_bunker_test to | ||
155 | + aliens.c and renamed to aliensHitCheck and bunkersHitCheck. Added | ||
156 | + comments and did improvement of bunkersHitCheck-Algorithm | ||
157 | + (shoty < BUNKERY + BUNKERHEIGHT instead of <=). | ||
158 | + | ||
159 | + * nInvaders.c (finish): moved short version of GPL to globals.c | ||
160 | + (showGplShort) | ||
161 | + | ||
162 | + * view.c (gameOverInit): fixed color code | ||
163 | + | ||
164 | + * player.h: removed lives from structPlayer. This variable belongs | ||
165 | + more to the gamehandling in nInvaders.c that to the model of the | ||
166 | + player in player.c. This is done because of better encapsulation | ||
167 | + of player.c. | ||
168 | + | ||
169 | + * player.c (playerReset): added a playerDisplay. Removed playerDisplay | ||
170 | + from nInvaders.c just before refreshScreen() and added another | ||
171 | + playerDisplay in the player.c (playerMissileMove) so that the | ||
172 | + playerMissileClear does not clear the middle of the player when | ||
173 | + a new shot is fired. | ||
174 | + | ||
175 | + * aliens.c (aliensHitCheck): added support for return of alienType so | ||
176 | + that different scoring according to type of aliens is possible. | ||
177 | + had to change values für alien_type constants in nInvaders.h and | ||
178 | + the order of scores in the points-array in nInvaders.c (doScoring). | ||
179 | + ufo gets 500pt, aliens 100pt, 150pt or 200pt. | ||
180 | + | ||
181 | + * aliens.c (aliensReset): clears missiles of aliens, if any | ||
182 | + | ||
183 | + * nInvaders.c (main): changed some variable names (*_counter) and | ||
184 | + contracted some if-statements. | ||
185 | + | ||
186 | + * view.c (playerExplosionDisplay): renamed from playerExplode. Added | ||
187 | + player.c (playerExplode) which calls playerExplosionDisplay and | ||
188 | + playerDisplay. Thus, I could remove the playerExplode(p.posX, p.posY) | ||
189 | + from nInvaders.c and add a playerExplode(). All Elements of the | ||
190 | + structure structPlayer now are "private". | ||
191 | + | ||
192 | + | ||
193 | +2003-04-05 Sebastian Gutsfeld <segoh@gmx.net> | ||
194 | + | ||
195 | + * Makefile: Updated file for ufo | ||
196 | + | ||
197 | + * aliens.c (aliensMissileMove): fixed comment | ||
198 | + | ||
199 | + * aliens.h: fixed indentation | ||
200 | + | ||
201 | + * globals.h: fixed indentation | ||
202 | + | ||
203 | + * nInvaders.c: included ufo.h, fixed some comments and linebreaks | ||
204 | + | ||
205 | + * nInvaders.c (initlevel): added initialisation for ufo | ||
206 | + | ||
207 | + * nInvaders.c (main): added code for ufo | ||
208 | + | ||
209 | + * nInvaders.c (doScoring): different score for different alien types | ||
210 | + | ||
211 | + * nInvaders.h: added constants for alien types needed by | ||
212 | + nInvaders.c (doScoring), fixed declaration of doScoring, fixed | ||
213 | + Indentation | ||
214 | + | ||
215 | + * player.c: included ufo.h (needed for playerMoveMissile) | ||
216 | + | ||
217 | + * player.c (playerMoveMissile): added code needed for ufo, fixed | ||
218 | + doScoring for alien type | ||
219 | + | ||
220 | + * player.h: fixed indentation, fixed declaration of doScoring | ||
221 | + | ||
222 | + * view.c: added WINDOW *wUfo, void ufoRefresh, static void ufoInit, | ||
223 | + void ufoDisplay and void ufoClear | ||
224 | + | ||
225 | + * view.c (aliensRefresh): fixed indentation and color codes | ||
226 | + | ||
227 | + * view.c (graphicEngineInit): added ufoInit to last init section | ||
228 | + | ||
229 | + * view.h: fixed indentation, added constans UFOWIDTH and UFOPOSY, added | ||
230 | + declarations of ufoDisplay, ufoRefresh and ufoClear | ||
231 | + | ||
232 | + * ufo.c: files for ufo handling (initial import into cvs) | ||
233 | + | ||
234 | + * ufo.h: header file for ufo.c (initial import into cvs) | ||
235 | + | ||
236 | +2003-04-04 Sebastian Gutsfeld <segoh@gmx.net> | ||
237 | + | ||
238 | + * nInvaders.h, player.c: updated every occurance of hit_player_test | ||
239 | + to hit_alientest | ||
240 | + | ||
241 | + * nInvaders.c (hit_alien_test): renamed from 'hit_player_test' | ||
242 | + | ||
243 | +2003-04-05 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
244 | + | ||
245 | + * [view.c] (bunkersDisplay): now fully encapsulated using pointer | ||
246 | + *pBunker to get access to bunker-array. Method is called from | ||
247 | + [aliens.c] (bunkersReset) instead of [aliens.c] (render) thus | ||
248 | + saving some cpu-time. The bunker has to be displayed only at the | ||
249 | + beginning of a new level. Then we use bunkerClearElement or | ||
250 | + bunkerClear to remove bunker elements. No need why it was in | ||
251 | + [aliens.c] (render). | ||
252 | + | ||
253 | +2003-04-04 Sebastian Gutsfeld <segoh@gmx.net> | ||
254 | + | ||
255 | + * nInvaders.c (readInput): draw new number of lives in live-cheat | ||
256 | + | ||
257 | + * aliens.c (aliensReset): put declaration of 'level' at | ||
258 | + beginning of function | ||
259 | + | ||
260 | +2003-04-04 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
261 | + | ||
262 | + * [nInvaders.c] added a new cheat: "L" gives player one new life | ||
263 | + for better testing | ||
264 | + * [aliens.c, player.c] (*Reset) forgot to reset alien-block and | ||
265 | + bunkers-block. Now there is a bunkersReset in aliens.c | ||
266 | + * [view.c] added method graphicEngineInit() | ||
267 | + * [view.c] (refreshScreen) fixed problem with graphic display on some | ||
268 | + terminals. bunker and player are now displayed at startup. | ||
269 | + * removed init.c and init.h from project | ||
270 | + * [globals.c] some minor changes to names of methods. moved code for | ||
271 | + displaying version from nInvaders.c to globals.c. Added code to | ||
272 | + redefine usleep for WIN32-platforms, this should hopefully fix the | ||
273 | + bug that the game was too fast there. | ||
274 | + | ||
275 | +2003-04-03 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
276 | + | ||
277 | + * removed deprecated multi-line-strings in globals.c and nInvaders.c | ||
278 | + | ||
279 | +2003-04-02 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
280 | + | ||
281 | + * view.c now contains all methods which do graphical display | ||
282 | + (by using ncurses) | ||
283 | + | ||
284 | + * added file aliens.c and aliens.h. Perhaps these can later melt | ||
285 | + with player.c and player.h. | ||
286 | + | ||
287 | +2003-04-01 Sebastian Gutsfeld <segoh@gmx.net> | ||
288 | + | ||
289 | + * *.c (*): formatted with 'indent -kr -i8 -l90' and fixed | ||
290 | + some linebreaks | ||
291 | + | ||
292 | +2003-03-30 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
293 | + | ||
294 | + * added file "ToDo": put feature-requests and alike in here | ||
295 | + | ||
296 | + * player.c (player*Missile*): processing of missiles moved to these | ||
297 | + functions to reduce size of main(). | ||
298 | + | ||
299 | + | ||
300 | +2003-03-29 Sebastian Gutsfeld <segoh@gmx.net> | ||
301 | + | ||
302 | + * init.c (initplayer): fixed comment | ||
303 | + | ||
304 | + * player.c (playerInit): put declaration of 'playerSprite' at beginning | ||
305 | + of function | ||
306 | + | ||
307 | + * init.c (initshots): put declaration of 'a' at beginning of function | ||
308 | + | ||
309 | +2003-03-29 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
310 | + | ||
311 | + * added more comments and added player.c which is intended to hold all | ||
312 | + functions concearning the player | ||
313 | + | ||
314 | + * added method playerLaunchMissile in player.c | ||
315 | + | ||
316 | +2003-03-28 Alexander Hollinger <alexander.hollinger@gmx.net> | ||
317 | + | ||
318 | + * added some comments and split up some functions, especially in init.c. | ||
319 | + | ||
320 | + |
@@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
1 | +CC=gcc | ||
2 | +CFLAGS=-O3 -Wall | ||
3 | +LIBS=-lncurses | ||
4 | + | ||
5 | +CFILES=globals.c view.c aliens.c ufo.c player.c nInvaders.c | ||
6 | +HFILES=globals.h view.h aliens.h ufo.h player.h nInvaders.h | ||
7 | +OFILES=globals.o view.o aliens.o ufo.o player.o nInvaders.o | ||
8 | +all: nInvaders | ||
9 | + | ||
10 | +nInvaders: $(OFILES) $(HFILES) | ||
11 | + $(CC) $(LDFLAGS) -o$@ $(OFILES) $(LIBS) | ||
12 | + | ||
13 | +.c.o: | ||
14 | + $(CC) -c -I. $(CFLAGS) $(OPTIONS) $< | ||
15 | +clean: | ||
16 | + rm -f nInvaders $(OFILES) |
@@ -0,0 +1,52 @@ | @@ -0,0 +1,52 @@ | ||
1 | +*** nInvaders | ||
2 | +*** (C)opyleft 2k2 by dettus | ||
3 | +*** dettus@matrixx-bielefeld.de | ||
4 | + | ||
5 | +Hello and welcome to nInvaders! Right now you are earth's only hope to save | ||
6 | +it from alien invaders from space. Make your job, and make it good, mankind | ||
7 | +believes in you... | ||
8 | + | ||
9 | +1. INSTALLING | ||
10 | +------------- | ||
11 | +Compiling and installing should be really straightforward, just type in | ||
12 | +"make" on your command prompt and you'll get the binary file. If not, please | ||
13 | +edit the makefile. Once you have compiled it, copy it (as root) to your | ||
14 | +/usr/bin directory, or /usr/local/games, or just run it by typeing | ||
15 | +./nInvaders. | ||
16 | + | ||
17 | +2. REQUIREMENTS | ||
18 | +--------------- | ||
19 | +nInvaders is known to compile and run on Solaris, Linux and OpenBSD. On all of | ||
20 | +them were ncurses 5.2 installed. If you are capable of running it on other | ||
21 | +platforms, tell me! | ||
22 | + | ||
23 | +3. CONTROL KEYS | ||
24 | +--------------- | ||
25 | +Controlling nInvaders is really simple. Just press the cursor left/right keys | ||
26 | +to move it left or right, and press space to fire. The esc-key lets you quit | ||
27 | +at any time you want. | ||
28 | + | ||
29 | +4. COMMAND LINE OPTIONS | ||
30 | +----------------------- | ||
31 | +nInvaders accepts the following command line options | ||
32 | +-l x where x is your skill as a number between 0(nightmare) and 9(may i play | ||
33 | + daddy) | ||
34 | +-gpl prints out the license information. | ||
35 | + | ||
36 | +Any other option gives you a help screen. | ||
37 | + | ||
38 | +5. LICENSING | ||
39 | +------------ | ||
40 | +nInvaders is protected under the laws of the GPL and other countries. Any re- | ||
41 | +distribution, reselling or copying is strictly allowed. You should have received | ||
42 | +a copy of it with this package, if not, write to the Free Software | ||
43 | +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
44 | +Or just start nInvaders with the -gpl option to learn more. | ||
45 | + | ||
46 | +6. GREETZ | ||
47 | +--------- | ||
48 | +hello mom, hello dad, hello katja, hello there, hello elitza, hello wizzard, | ||
49 | +hello walli, hello melanie, hello judith, hello you folks at freshmeat, hello | ||
50 | +skyper, hello gamma, hello sunfreeware, hello abuse, hello linus, hello alan, | ||
51 | +hello herr von boedefeld, hello god, hello world. | ||
52 | +and thank you Mike Saarna for adding ANIMATION! |
@@ -0,0 +1,308 @@ | @@ -0,0 +1,308 @@ | ||
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 "aliens.h" | ||
26 | +#include "player.h" | ||
27 | +#include "nInvaders.h" | ||
28 | + | ||
29 | +/** | ||
30 | + * initialize aliens attributes | ||
31 | + */ | ||
32 | +void aliensReset() | ||
33 | +{ | ||
34 | + int i,j; | ||
35 | + | ||
36 | + // three different types of aliens [5], [10] | ||
37 | + int level[ALIENS_MAX_NUMBER_Y][ALIENS_MAX_NUMBER_X]={ | ||
38 | + {1,1,1,1,1,1,1,1,1,1}, | ||
39 | + {2,2,2,2,2,2,2,2,2,2}, | ||
40 | + {2,2,2,2,2,2,2,2,2,2}, | ||
41 | + {3,3,3,3,3,3,3,3,3,3}, | ||
42 | + {3,3,3,3,3,3,3,3,3,3} | ||
43 | + }; | ||
44 | + | ||
45 | + aliensClear(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // clear old position of aliens | ||
46 | + | ||
47 | + // reset alien position | ||
48 | + aliens.posX = 0; | ||
49 | + aliens.posY = 0; | ||
50 | + aliens.right = 0; | ||
51 | + aliens.bottom = 0; | ||
52 | + aliens.left = 0; | ||
53 | + aliens.speed = 1; | ||
54 | + | ||
55 | + // copy level-array to enemy-array | ||
56 | + for (i=0;i<ALIENS_MAX_NUMBER_X;i++) { | ||
57 | + for (j=0;j<ALIENS_MAX_NUMBER_Y;j++) { | ||
58 | + alienBlock[j][i]=level[j][i]; | ||
59 | + } | ||
60 | + } | ||
61 | + | ||
62 | + // reset missiles | ||
63 | + for (i = 0; i < ALIENS_MAX_MISSILES; i++) { | ||
64 | + if (alienshotx[i] != 0) { | ||
65 | + aliensMissileClear(alienshotx[i],alienshoty[i]); // clear old position | ||
66 | + } | ||
67 | + alienshotx[i] = 0; // start with zero values | ||
68 | + alienshoty[i] = 0; // start with zero values | ||
69 | + } | ||
70 | + alienshotnum = 1; // one missile at the same time | ||
71 | + alienshotx[0] = 5; // x position of first alienshot | ||
72 | + alienshoty[0] = 1; // y position of first alienshot | ||
73 | + | ||
74 | +} | ||
75 | + | ||
76 | +/** | ||
77 | + * initialize bunkers attributes | ||
78 | + */ | ||
79 | +void bunkersReset() | ||
80 | +{ | ||
81 | + int a, b; | ||
82 | + | ||
83 | + // set position of bunker sprites. user graphical char bunkerd for better visual overview | ||
84 | + // and set according to this the bunker-array | ||
85 | + char bunkerd[BUNKERHEIGHT][BUNKERWIDTH+1] = { | ||
86 | + " ### ### ### ### ", | ||
87 | + " ##### ##### ##### ##### ", | ||
88 | + " ####### ####### ####### ####### ", | ||
89 | + " ## ## ## ## ## ## ## ## " | ||
90 | + }; | ||
91 | + // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 | ||
92 | + // 80 characters wide | ||
93 | + | ||
94 | + // copy graphical "bunkerd" to binary "bunker" | ||
95 | + for (a = 0; a < BUNKERWIDTH; a++) { | ||
96 | + for (b = 0; b < BUNKERHEIGHT; b++) { | ||
97 | + if (bunkerd[b][a] == '#') | ||
98 | + bunker[b][a] = 1; | ||
99 | + else | ||
100 | + bunker[b][a] = 0; | ||
101 | + } | ||
102 | + } | ||
103 | + | ||
104 | + // display bunkers sprite | ||
105 | + bunkersDisplay(&bunker[0][0]); | ||
106 | +} | ||
107 | + | ||
108 | +/** | ||
109 | + * move aliens and test if they've reached the | ||
110 | + * bottom of the windows or the bunkers. | ||
111 | + */ | ||
112 | +int aliensMove() | ||
113 | +{ | ||
114 | + | ||
115 | + int cx,cy; | ||
116 | + int fReachedPlayer=0; // return value | ||
117 | + | ||
118 | + render(); | ||
119 | + aliensClear(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // clear old position of aliens | ||
120 | + | ||
121 | + aliens.posX = aliens.posX + aliens.speed; // move aliens left/ right | ||
122 | + | ||
123 | + // when aliens reached left or right screen-border | ||
124 | + if (aliens.posX == (BUNKERWIDTH + BUNKERX - 5 - aliens.right) || aliens.posX == (BUNKERX + aliens.left)) { | ||
125 | + | ||
126 | + aliens.posY++; // move aliens downwards | ||
127 | + | ||
128 | + // aliens reached player | ||
129 | + if (aliens.posY == SCREENHEIGHT - 2 - aliens.bottom) { | ||
130 | + fReachedPlayer = 1; // set return value | ||
131 | + } | ||
132 | + | ||
133 | + // aliens reached bunkers //funzt nicht ganz: todo | ||
134 | + if (aliens.posY == BUNKERY - aliens.bottom) { | ||
135 | + // clear bunkers | ||
136 | + for(cx=0;cx<BUNKERWIDTH;cx++) { | ||
137 | + for(cy=0;cy<BUNKERHEIGHT;cy++) { | ||
138 | + bunker[cy][cx]=0; | ||
139 | + } | ||
140 | + } | ||
141 | + bunkersClear(); // clear bunkers sprites | ||
142 | + } | ||
143 | + | ||
144 | + aliens.speed = aliens.speed * (-1); // change direction of aliens' movements | ||
145 | + } | ||
146 | + | ||
147 | + aliensDisplay(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // display aliens at new position | ||
148 | + | ||
149 | + return fReachedPlayer; // return if aliens reached player | ||
150 | +} | ||
151 | + | ||
152 | + | ||
153 | +/** | ||
154 | + * display alien animation, display remaining parts of aliens and bunker | ||
155 | + */ | ||
156 | +void render() | ||
157 | +{ | ||
158 | + int k,row; | ||
159 | + int c=0; | ||
160 | + | ||
161 | + // calculate left, right, bottom, lowest_ship | ||
162 | + aliens.left=1; | ||
163 | + aliens.right=-1; | ||
164 | + aliens.bottom=-1; | ||
165 | + shipnum=0; | ||
166 | + for (k=0;k<ALIENS_MAX_NUMBER_X;k++) { | ||
167 | + lowest_ship[k]=-1; | ||
168 | + } | ||
169 | + | ||
170 | + for (row=0;row<ALIENS_MAX_NUMBER_Y*2;row++) { | ||
171 | + if ((row%2)==0){ | ||
172 | + for (k=0;k<ALIENS_MAX_NUMBER_X;k++) { | ||
173 | + if (alienBlock[c][k] != 0) { | ||
174 | + lowest_ship[k]=row; | ||
175 | + shipnum++; | ||
176 | + if (aliens.left==1 || -k>aliens.left) {aliens.left=-k;} | ||
177 | + if (aliens.right==-1 || k>aliens.right) {aliens.right=k;} | ||
178 | + if (aliens.bottom==-1 || c>aliens.bottom) {aliens.bottom=c;} | ||
179 | + } | ||
180 | + } | ||
181 | + } else { | ||
182 | + c++; | ||
183 | + } | ||
184 | + } | ||
185 | + aliens.bottom=aliens.bottom*2; // every 2nd row is an empty row | ||
186 | + aliens.left=aliens.left*3; // alien sprite is 3 chars wide | ||
187 | + aliens.right=aliens.right*3; // alien sprite is 3 chars wide | ||
188 | + | ||
189 | + // display remaining aliens with animation | ||
190 | + aliensRefresh(level, &alienBlock[0][0]); | ||
191 | + | ||
192 | +} | ||
193 | + | ||
194 | + | ||
195 | +/** | ||
196 | + * move aliens' missiles and do player/bunker hit testing | ||
197 | + * a zero value in alienshotx indicates that the appropriate missile is loaded, but not fired | ||
198 | + */ | ||
199 | +int aliensMissileMove() | ||
200 | +{ | ||
201 | + int i, tmp; | ||
202 | + int fPlayerWasHit = 0; | ||
203 | + int shootThreshold; | ||
204 | + static int alienshot_counter = 0; | ||
205 | + | ||
206 | + | ||
207 | + // calculate threshold when next missile should be fired | ||
208 | + // it is done here to save calculation time in for-instruction | ||
209 | + shootThreshold = (skill_level * 8) * (shipnum + 2); | ||
210 | + alienshot_counter = alienshot_counter + 10 ; | ||
211 | + | ||
212 | + // loop all possible missiles | ||
213 | + for (i = 0; i < ALIENS_MAX_MISSILES; i++) { | ||
214 | + | ||
215 | + // if the current missile is flying we should do movements | ||
216 | + if (alienshotx[i] != 0) { | ||
217 | + | ||
218 | + aliensMissileClear(alienshotx[i],alienshoty[i]); // clear old position | ||
219 | + | ||
220 | + // if missile hit the bunkers | ||
221 | + if (bunkersHitCheck(alienshotx[i], alienshoty[i]) == 1) { | ||
222 | + alienshotx[i] = 0; // value of zero reloads missile | ||
223 | + } | ||
224 | + | ||
225 | + alienshoty[i]++; // move missile downwards | ||
226 | + | ||
227 | + // check if player was hit by an alien missile | ||
228 | + if (playerHitCheck(alienshotx[i], alienshoty[i]) == 1) { | ||
229 | + alienshotx[i] = 0; // value of zero reloads missile | ||
230 | + fPlayerWasHit = 1; | ||
231 | + } | ||
232 | + | ||
233 | + | ||
234 | + } else { // missile not launched yet | ||
235 | + | ||
236 | + // start new missile if counter says so | ||
237 | + if (alienshot_counter > shootThreshold && shipnum > 0) {// only shot if there's an alien left | ||
238 | + alienshot_counter = 0; // reset counter | ||
239 | + tmp = random() % ALIENS_MAX_NUMBER_X; // randomly select one of the ... | ||
240 | + while (lowest_ship[tmp] == -1) { // ...aliens at the bottom of ... | ||
241 | + tmp = random() % ALIENS_MAX_NUMBER_X; // ...a column to launch missile | ||
242 | + } | ||
243 | + alienshoty[i]=aliens.posY+lowest_ship[tmp]; // set y position of missile | ||
244 | + alienshotx[i]=aliens.posX+tmp*3; // set x position of missile | ||
245 | + } | ||
246 | + } // if | ||
247 | + | ||
248 | + // display missiles if still running or just launched; could have been modified in the above code | ||
249 | + if (alienshotx[i] != 0) { | ||
250 | + // if missile is out of battlefield | ||
251 | + if (alienshoty[i] == SCREENHEIGHT - 1) { | ||
252 | + alienshotx[i] = 0; // reload missile | ||
253 | + } else { | ||
254 | + aliensMissileDisplay(alienshotx[i], alienshoty[i]); // display Missile at new position | ||
255 | + } | ||
256 | + } | ||
257 | + | ||
258 | + } // for | ||
259 | + | ||
260 | + | ||
261 | + return fPlayerWasHit; | ||
262 | +} | ||
263 | + | ||
264 | + | ||
265 | + | ||
266 | +/** | ||
267 | + * check if missile hit an alien | ||
268 | + */ | ||
269 | +int aliensHitCheck(int shotx, int shoty) | ||
270 | +{ | ||
271 | + int alienType = 0; | ||
272 | + int shipx, shipy; | ||
273 | + // if missile is within alien-rectangle | ||
274 | + if (shotx >= aliens.posX && shotx <= aliens.posX + ALIENS_MAX_NUMBER_X * 3 - 1 | ||
275 | + && shoty >= aliens.posY && shoty <= aliens.posY + (ALIENS_MAX_NUMBER_Y - 1) * 2) { | ||
276 | + // calculate the ship that was hit | ||
277 | + shipx = (shotx - aliens.posX) / 3; | ||
278 | + shipy = (shoty - aliens.posY) / 2; | ||
279 | + // if there is still a ship at this position | ||
280 | + alienType = alienBlock[shipy][shipx]; | ||
281 | + if (alienType != 0) { | ||
282 | + alienBlock[shipy][shipx] = 0; // delete alien ship | ||
283 | + } | ||
284 | + } | ||
285 | + return alienType; // returns 0 if no alien was hit, else returns type-code of alien | ||
286 | +} | ||
287 | + | ||
288 | +/** | ||
289 | + * check if missile hit an element of bunker | ||
290 | + */ | ||
291 | +int bunkersHitCheck(int shotx, int shoty) | ||
292 | +{ | ||
293 | + int adjx, adjy; | ||
294 | + int fBunkerWasHit = 0; | ||
295 | + // if missile is within bunker-rectangle | ||
296 | + if (shotx >= BUNKERX && shotx < BUNKERX + BUNKERWIDTH | ||
297 | + && shoty >= BUNKERY && shoty < BUNKERY + BUNKERHEIGHT) { | ||
298 | + // calculate the element of the bunker that was hit | ||
299 | + adjy = shoty - BUNKERY; | ||
300 | + adjx = shotx - BUNKERX; | ||
301 | + // if there is still an element | ||
302 | + if(bunker[adjy][adjx] == 1){ | ||
303 | + bunker[adjy][adjx] = 0; // delete element | ||
304 | + fBunkerWasHit = 1; // bunker was hit! | ||
305 | + } | ||
306 | + } | ||
307 | + return fBunkerWasHit; | ||
308 | +} |
@@ -0,0 +1,78 @@ | @@ -0,0 +1,78 @@ | ||
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 | + | ||
27 | +#ifndef ALIENS | ||
28 | +#define ALIENS | ||
29 | + | ||
30 | +typedef struct Aliens Aliens; | ||
31 | + | ||
32 | +struct Aliens { | ||
33 | + int posX; // horizontal position of aliens | ||
34 | + int posY; // vertical position of aliens | ||
35 | + int right; | ||
36 | + int left; | ||
37 | + int bottom; | ||
38 | + int speed; // 0: no movement; 1: one per turn; etc. | ||
39 | +}; | ||
40 | + | ||
41 | +Aliens aliens; | ||
42 | + | ||
43 | +int shipnum; | ||
44 | + | ||
45 | +#define ALIENS_MAX_NUMBER_X 10 | ||
46 | +#define ALIENS_MAX_NUMBER_Y 5 | ||
47 | +#define ALIENS_MAX_MISSILES 10 | ||
48 | + | ||
49 | +// todo: move to structure | ||
50 | +int lowest_ship[ALIENS_MAX_NUMBER_X]; | ||
51 | +int alienshotx[ALIENS_MAX_MISSILES]; | ||
52 | +int alienshoty[ALIENS_MAX_MISSILES]; | ||
53 | +int alienshotnum; | ||
54 | +int alienBlock[ALIENS_MAX_NUMBER_Y][ALIENS_MAX_NUMBER_X]; | ||
55 | + | ||
56 | +int bunker[BUNKERHEIGHT][BUNKERWIDTH + 1]; | ||
57 | + | ||
58 | + | ||
59 | +void aliensReset(); | ||
60 | +void bunkersReset(); | ||
61 | +int aliensMove(); | ||
62 | +int aliensMissileMove(); | ||
63 | +void render(); | ||
64 | +int aliensHitCheck(int shotx, int shoty); | ||
65 | +int bunkersHitCheck(int shotx, int shoty); | ||
66 | + | ||
67 | + | ||
68 | +// methods that handle graphic display, from view.c | ||
69 | +extern void aliensDisplay(int x, int y, int wid, int hgt); | ||
70 | +extern void aliensClear(int x, int y, int wid, int hgt); | ||
71 | +extern void aliensRefresh(int level, int *pAliens); | ||
72 | +extern void aliensMissileDisplay(int x, int y); | ||
73 | +extern void aliensMissileClear(int x, int y); | ||
74 | +extern void bunkersClearElement(int x, int y); | ||
75 | +extern void bunkersClear(); | ||
76 | +extern void bunkersRefresh(); | ||
77 | + | ||
78 | +#endif |
@@ -0,0 +1,75 @@ | @@ -0,0 +1,75 @@ | ||
1 | +ninvaders (0.1.1-3) unstable; urgency=low | ||
2 | + | ||
3 | + * Fix overflow in lowest_ship array. Closes: #597036 | ||
4 | + Thanks to Matt Chapman for the bug report and patch. | ||
5 | + * Time for a packaging overhaul: | ||
6 | + - Bump to dh compat level 7. | ||
7 | + - Bump standards-version to 3.9.1; no specific changes required. | ||
8 | + - Add the now-necessary misc:Depends. | ||
9 | + - Strip DH_COMPAT from debian/rules; move it to debian/compat. | ||
10 | + - Move menu entry to Games/Action, and quote all values. | ||
11 | + - Use dh_prep instead of dh_clean -k. | ||
12 | + - Don't ignore make clean errors in the clean target. | ||
13 | + - Enhance the copyright file. | ||
14 | + | ||
15 | + -- Matthew Palmer <mpalmer@debian.org> Tue, 05 Oct 2010 13:21:26 +1100 | ||
16 | + | ||
17 | +ninvaders (0.1.1-2) unstable; urgency=low | ||
18 | + | ||
19 | + * Convert everything in the package to refer to the binary and related | ||
20 | + materials (manpage) in the lowercase form (ninvaders). Closes: #300508. | ||
21 | + | ||
22 | + -- Matthew Palmer <mpalmer@debian.org> Thu, 29 Sep 2005 20:26:34 +1000 | ||
23 | + | ||
24 | +ninvaders (0.1.1-1) unstable; urgency=low | ||
25 | + | ||
26 | + * New upstream release. | ||
27 | + * Standards version bumped to 3.6.0. | ||
28 | + * Build-depends on debhelper 4. | ||
29 | + | ||
30 | + -- Matthew Palmer <mpalmer@debian.org> Sun, 13 Jul 2003 22:57:37 +1000 | ||
31 | + | ||
32 | +ninvaders (0.0.8-6) unstable; urgency=low | ||
33 | + | ||
34 | + * Converted great honking multi-line strings into something which GCC 3.3 | ||
35 | + can (hopefully) handle. Whoever thought that new feature was an | ||
36 | + improvement should be hanged. Closes: #195161. | ||
37 | + * Changed strings.h to string.h, because strings.h is not what was wanted. | ||
38 | + | ||
39 | + -- Matthew Palmer <mpalmer@debian.org> Sun, 1 Jun 2003 17:48:04 +1000 | ||
40 | + | ||
41 | +ninvaders (0.0.8-5) unstable; urgency=low | ||
42 | + | ||
43 | + * Bumped standards-version to 3.5.7. | ||
44 | + | ||
45 | + -- Matthew Palmer <mpalmer@debian.org> Sun, 22 Sep 2002 16:57:47 +1000 | ||
46 | + | ||
47 | +ninvaders (0.0.8-4) unstable; urgency=low | ||
48 | + | ||
49 | + * Developed patch to make the bunkers disappear one line at a time. Due | ||
50 | + to the code, it will not be easily possible to make the bunkers | ||
51 | + disappear as the aliens reach them, so this will have to do. | ||
52 | + (Closes: #154330) | ||
53 | + | ||
54 | + -- Matthew Palmer <mpalmer@debian.org> Sun, 22 Sep 2002 16:33:45 +1000 | ||
55 | + | ||
56 | +ninvaders (0.0.8-3) unstable; urgency=low | ||
57 | + | ||
58 | + * Patched to replace the whole text of the GPL (!) with a function to | ||
59 | + print the GPL based on the text in /usr/share/common-licenses/GPL. | ||
60 | + Thanks to Pete de Zwart for the patch. | ||
61 | + | ||
62 | + -- Matthew Palmer <mpalmer@debian.org> Tue, 30 Jul 2002 17:00:19 +1000 | ||
63 | + | ||
64 | +ninvaders (0.0.8-2) unstable; urgency=low | ||
65 | + | ||
66 | + * Changed description in line with bug #154330. | ||
67 | + | ||
68 | + -- Matthew Palmer <mpalmer@debian.org> Fri, 26 Jul 2002 18:53:58 +1000 | ||
69 | + | ||
70 | +ninvaders (0.0.8-1) unstable; urgency=low | ||
71 | + | ||
72 | + * Initial Release. (Closes: #153703) | ||
73 | + | ||
74 | + -- Matthew Palmer <mpalmer@debian.org> Sun, 21 Jul 2002 09:59:21 +1000 | ||
75 | + |
@@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
1 | +7 |
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +Source: ninvaders | ||
2 | +Section: games | ||
3 | +Priority: optional | ||
4 | +Maintainer: Matthew Palmer <mpalmer@debian.org> | ||
5 | +Build-Depends: debhelper (>= 7), libncurses5-dev | ||
6 | +Standards-Version: 3.9.1 | ||
7 | + | ||
8 | +Package: ninvaders | ||
9 | +Architecture: any | ||
10 | +Depends: ${shlibs:Depends}, ${misc:Depends} | ||
11 | +Description: A space invaders-like game using ncurses | ||
12 | + A Space Invaders type game with text-only graphics. Ever wanted to play | ||
13 | + space invaders when you can't find a GUI? Now you can. |
@@ -0,0 +1,30 @@ | @@ -0,0 +1,30 @@ | ||
1 | +Upstream: http://ninvaders.sourceforge.net/ | ||
2 | + | ||
3 | +Upstream Authors: Thomas Dettbarn <dettus@matrixx-bielefeld.de>, with | ||
4 | +contributions by others (see nInvaders -help for full details). | ||
5 | + | ||
6 | +Copyright: | ||
7 | + | ||
8 | +From nInvaders.c: | ||
9 | + | ||
10 | + * Copyright (C) 2002-2003 Dettus | ||
11 | + * | ||
12 | + * This program is free software; you can redistribute it and/or modify | ||
13 | + * it under the terms of the GNU General Public License as published by | ||
14 | + * the Free Software Foundation; either version 2 of the License, or | ||
15 | + * (at your option) any later version. | ||
16 | + * | ||
17 | + * This program is distributed in the hope that it will be useful, | ||
18 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
19 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
20 | + * GNU General Public License for more details. | ||
21 | + * | ||
22 | + * You should have received a copy of the GNU General Public License | ||
23 | + * along with this program; if not, write to the Free Software | ||
24 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
25 | + * | ||
26 | + * homepage: http://ninvaders.sourceforge.net | ||
27 | + * mailto: ninvaders-devel@lists.sourceforge.net | ||
28 | + | ||
29 | +Released under the terms of the GPL. See /usr/share/common-licenses/GPL, or | ||
30 | +nInvaders -gpl. |
@@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
1 | +usr/games |
@@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
1 | +README |
@@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
1 | +usr/games/ninvaders usr/games/nInvaders |
@@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
1 | +.\" Hey, EMACS: -*- nroff -*- | ||
2 | +.\" First parameter, NAME, should be all caps | ||
3 | +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection | ||
4 | +.\" other parameters are allowed: see man(7), man(1) | ||
5 | +.TH NINVADERS 6 "July 21, 2002" | ||
6 | +.\" Please adjust this date whenever revising the manpage. | ||
7 | +.\" | ||
8 | +.\" Some roff macros, for reference: | ||
9 | +.\" .nh disable hyphenation | ||
10 | +.\" .hy enable hyphenation | ||
11 | +.\" .ad l left justify | ||
12 | +.\" .ad b justify to both left and right margins | ||
13 | +.\" .nf disable filling | ||
14 | +.\" .fi enable filling | ||
15 | +.\" .br insert line break | ||
16 | +.\" .sp <n> insert n+1 empty lines | ||
17 | +.\" for manpage-specific macros, see man(7) | ||
18 | +.SH NAME | ||
19 | +ninvaders \- ncurses version of space invaders | ||
20 | +.SH SYNOPSIS | ||
21 | +.B ninvaders | ||
22 | +.SH DESCRIPTION | ||
23 | +In short, this is a space invaders game written for the ncurses terminal | ||
24 | +control library. It uses ASCII art to draw everything, and you can play it | ||
25 | +just about anywhere. Space Invaders over dialup! | ||
26 | +.PP | ||
27 | +To play the game, simply run the program. You will be placed in the game | ||
28 | +arena with a large block of aliens. To move your gun pod (at the bottom of | ||
29 | +the screen) use the left and right arrow keys. To shoot, press space. You | ||
30 | +can move faster if you hold the arrow keys down. | ||
31 | +.PP | ||
32 | +The object of the game is to shoot all the aliens (the multi-coloured moving | ||
33 | +things) before they reach the ground. Since these aliens aren't friendly | ||
34 | +(which is why you're trying to stop them) they will shoot back. Dodge the | ||
35 | +descending bullets or hang about under the large stationary blocks for | ||
36 | +cover. | ||
37 | +.SH AUTHOR | ||
38 | +This manual page was written by Matthew Palmer <mpalmer@debian.org>, | ||
39 | +for the Debian GNU/Linux system (but may be used by others). | ||
40 | +.PP | ||
41 | +The ninvaders program was written by Thomas Dettbarn | ||
42 | +<dettus@matrixx-bielefeld.de> and is released under the GPL. |
@@ -0,0 +1,71 @@ | @@ -0,0 +1,71 @@ | ||
1 | +#!/usr/bin/make -f | ||
2 | +# Sample debian/rules that uses debhelper. | ||
3 | +# GNU copyright 1997 to 1999 by Joey Hess. | ||
4 | + | ||
5 | +# Uncomment this to turn on verbose mode. | ||
6 | +#export DH_VERBOSE=1 | ||
7 | + | ||
8 | +ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) | ||
9 | + CFLAGS += -g | ||
10 | +endif | ||
11 | +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) | ||
12 | + INSTALL_PROGRAM += -s | ||
13 | +endif | ||
14 | + | ||
15 | +configure: configure-stamp | ||
16 | +configure-stamp: | ||
17 | + dh_testdir | ||
18 | + # Add here commands to configure the package. | ||
19 | + touch configure-stamp | ||
20 | + | ||
21 | +build: build-stamp | ||
22 | + | ||
23 | +build-stamp: configure-stamp | ||
24 | + dh_testdir | ||
25 | + $(MAKE) | ||
26 | + touch build-stamp | ||
27 | + | ||
28 | +clean: | ||
29 | + dh_testdir | ||
30 | + dh_testroot | ||
31 | + rm -f build-stamp configure-stamp | ||
32 | + | ||
33 | + # Add here commands to clean up after the build process. | ||
34 | + $(MAKE) clean | ||
35 | + | ||
36 | + dh_clean | ||
37 | + | ||
38 | +install: build | ||
39 | + dh_testdir | ||
40 | + dh_testroot | ||
41 | + dh_prep | ||
42 | + dh_installdirs | ||
43 | + | ||
44 | + # Add here commands to install the package into debian/ninvaders. | ||
45 | + cp nInvaders $(CURDIR)/debian/ninvaders/usr/games/ninvaders | ||
46 | + | ||
47 | +# Build architecture-independent files here. | ||
48 | +binary-indep: build install | ||
49 | +# We have nothing to do here. | ||
50 | + | ||
51 | +# Build architecture-dependent files here. | ||
52 | +binary-arch: build install | ||
53 | + dh_testdir | ||
54 | + dh_testroot | ||
55 | + dh_installdirs | ||
56 | + dh_installdocs | ||
57 | + dh_installmenu | ||
58 | + dh_installman debian/ninvaders.1 | ||
59 | + dh_link | ||
60 | + dh_installchangelogs | ||
61 | + dh_strip | ||
62 | + dh_compress | ||
63 | + dh_fixperms | ||
64 | + dh_installdeb | ||
65 | + dh_shlibdeps | ||
66 | + dh_gencontrol | ||
67 | + dh_md5sums | ||
68 | + dh_builddeb | ||
69 | + | ||
70 | +binary: binary-indep binary-arch | ||
71 | +.PHONY: build clean binary-indep binary-arch binary install configure |
@@ -0,0 +1,157 @@ | @@ -0,0 +1,157 @@ | ||
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 <stdio.h> | ||
26 | +#include <unistd.h> | ||
27 | +#include <stdlib.h> | ||
28 | + | ||
29 | +#include "globals.h" | ||
30 | + | ||
31 | + | ||
32 | +#define MAJOR 0 | ||
33 | +#define MINOR 1 | ||
34 | +#define RELEASE 1 | ||
35 | + | ||
36 | + | ||
37 | + | ||
38 | +#ifdef WIN32 | ||
39 | +#define usleep(x) Sleep(x/1000) | ||
40 | +#endif | ||
41 | + | ||
42 | + | ||
43 | +/** | ||
44 | + * sleep for specified time | ||
45 | + */ | ||
46 | +void doSleep(int microseconds) | ||
47 | +{ | ||
48 | + usleep(microseconds); | ||
49 | +} | ||
50 | + | ||
51 | + | ||
52 | +/** | ||
53 | + * show version information | ||
54 | + */ | ||
55 | +void showVersion() | ||
56 | +{ | ||
57 | + fprintf(stderr, "*** nInvaders %i.%i.%i\n", MAJOR, MINOR, RELEASE); | ||
58 | + fprintf(stderr, "*** (C)opyleft 2k2 by Dettus\n"); | ||
59 | + fprintf(stderr, "*** dettus@matrixx-bielefeld.de\n"); | ||
60 | + fprintf(stderr, "Additional code by Mike Saarna,\n"); | ||
61 | + fprintf(stderr, "Sebastian Gutsfeld -> segoh@gmx.net,\n"); | ||
62 | + fprintf(stderr, "Alexander Hollinger -> alexander.hollinger@gmx.net and\n"); | ||
63 | + fprintf(stderr, "Matthias Thar -> hiast2@compuserve.de\n"); | ||
64 | +} | ||
65 | + | ||
66 | + | ||
67 | +/** | ||
68 | + * show usage of command line parameters | ||
69 | + */ | ||
70 | +void showUsage() | ||
71 | +{ | ||
72 | + | ||
73 | + fprintf(stderr, "\n\nUsage: nInvaders [-l skill] [-gpl]\n"); | ||
74 | + fprintf(stderr, " where -l 0=NIGHTMARE\n"); | ||
75 | + fprintf(stderr, " -l 1=okay\n"); | ||
76 | + fprintf(stderr, " -l 9=May I play daddy?!\n"); | ||
77 | + fprintf(stderr, "\n -gpl shows you the license file\n"); | ||
78 | +} | ||
79 | + | ||
80 | + | ||
81 | +/** | ||
82 | + * wait for input of return to continue | ||
83 | + */ | ||
84 | +void waitForReturn() | ||
85 | +{ | ||
86 | + char b[2]; | ||
87 | + fprintf(stderr, "...Please press <Enter> to read on..."); | ||
88 | + fgets(b, sizeof(b), stdin); | ||
89 | +} | ||
90 | + | ||
91 | +/** | ||
92 | + * show short version of Gnu GPL | ||
93 | + */ | ||
94 | +void showGplShort() | ||
95 | +{ | ||
96 | + fprintf(stderr,"\n"); | ||
97 | + fprintf(stderr,"This program is free software; you can redistribute it and/or modify\n"); | ||
98 | + fprintf(stderr,"it under the terms of the GNU General Public License as published by\n"); | ||
99 | + fprintf(stderr,"the Free Software Foundation; either version 2 of the License, or\n"); | ||
100 | + fprintf(stderr,"(at your option) any later version.\n"); | ||
101 | + fprintf(stderr,"\n"); | ||
102 | + fprintf(stderr,"This program is distributed in the hope that it will be useful,\n"); | ||
103 | + fprintf(stderr,"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); | ||
104 | + fprintf(stderr,"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); | ||
105 | + fprintf(stderr,"GNU General Public License for more details.\n"); | ||
106 | + fprintf(stderr,"\n"); | ||
107 | + fprintf(stderr,"You should have received a copy of the GNU General Public License\n"); | ||
108 | + fprintf(stderr,"along with this program; if not, write to the Free Software\n"); | ||
109 | + fprintf(stderr,"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"); | ||
110 | + fprintf(stderr,"\n"); | ||
111 | + fprintf(stderr,"Use the -gpl command line switch to see the full license of this program\n"); | ||
112 | + fprintf(stderr,"Use the -help command line switch to see who wrote this program \n"); | ||
113 | + fprintf(stderr,"\n"); | ||
114 | +} | ||
115 | + | ||
116 | +/** | ||
117 | + * show GNU GENERAL PUBLIC LICENSE | ||
118 | + */ | ||
119 | +void showGpl() | ||
120 | +{ | ||
121 | + /* Fix fuxored GPL display */ | ||
122 | + | ||
123 | + FILE *GPL; | ||
124 | + | ||
125 | + char gpl_file[] = "/usr/share/common-licenses/GPL"; | ||
126 | + char *buff = NULL; | ||
127 | + char *check = NULL; | ||
128 | + | ||
129 | + int lines = 23; | ||
130 | + int buff_size = 4096; | ||
131 | + int count = 0; | ||
132 | + | ||
133 | + if (!(GPL = fopen(gpl_file, "r"))) { | ||
134 | + perror("gpl():\t"); | ||
135 | + return; | ||
136 | + } | ||
137 | + | ||
138 | + if (!(buff = calloc(buff_size, sizeof(char)))) { | ||
139 | + perror("gpl():\t"); | ||
140 | + fclose(GPL); | ||
141 | + return; | ||
142 | + } | ||
143 | + | ||
144 | + do { | ||
145 | + while (count < lines && (check = fgets(buff, buff_size, GPL))) { | ||
146 | + fputs(buff, stderr); | ||
147 | + count++; | ||
148 | + } | ||
149 | + | ||
150 | + /* Pause */ | ||
151 | + waitForReturn(); | ||
152 | + count = 0; | ||
153 | + } while (check); | ||
154 | + | ||
155 | + fclose(GPL); | ||
156 | + free(buff); | ||
157 | +} |
@@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
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 | +#ifndef GLOBALS | ||
26 | +#define GLOBALS | ||
27 | + | ||
28 | +extern void doSleep(); | ||
29 | + | ||
30 | +extern void showUsage(); | ||
31 | +extern void showVersion(); | ||
32 | +extern void showGplShort(); | ||
33 | +extern void showGpl(); | ||
34 | + | ||
35 | +#endif |
@@ -0,0 +1,340 @@ | @@ -0,0 +1,340 @@ | ||
1 | + GNU GENERAL PUBLIC LICENSE | ||
2 | + Version 2, June 1991 | ||
3 | + | ||
4 | + Copyright (C) 1989, 1991 Free Software Foundation, Inc. | ||
5 | + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
6 | + Everyone is permitted to copy and distribute verbatim copies | ||
7 | + of this license document, but changing it is not allowed. | ||
8 | + | ||
9 | + Preamble | ||
10 | + | ||
11 | + The licenses for most software are designed to take away your | ||
12 | +freedom to share and change it. By contrast, the GNU General Public | ||
13 | +License is intended to guarantee your freedom to share and change free | ||
14 | +software--to make sure the software is free for all its users. This | ||
15 | +General Public License applies to most of the Free Software | ||
16 | +Foundation's software and to any other program whose authors commit to | ||
17 | +using it. (Some other Free Software Foundation software is covered by | ||
18 | +the GNU Library General Public License instead.) You can apply it to | ||
19 | +your programs, too. | ||
20 | + | ||
21 | + When we speak of free software, we are referring to freedom, not | ||
22 | +price. Our General Public Licenses are designed to make sure that you | ||
23 | +have the freedom to distribute copies of free software (and charge for | ||
24 | +this service if you wish), that you receive source code or can get it | ||
25 | +if you want it, that you can change the software or use pieces of it | ||
26 | +in new free programs; and that you know you can do these things. | ||
27 | + | ||
28 | + To protect your rights, we need to make restrictions that forbid | ||
29 | +anyone to deny you these rights or to ask you to surrender the rights. | ||
30 | +These restrictions translate to certain responsibilities for you if you | ||
31 | +distribute copies of the software, or if you modify it. | ||
32 | + | ||
33 | + For example, if you distribute copies of such a program, whether | ||
34 | +gratis or for a fee, you must give the recipients all the rights that | ||
35 | +you have. You must make sure that they, too, receive or can get the | ||
36 | +source code. And you must show them these terms so they know their | ||
37 | +rights. | ||
38 | + | ||
39 | + We protect your rights with two steps: (1) copyright the software, and | ||
40 | +(2) offer you this license which gives you legal permission to copy, | ||
41 | +distribute and/or modify the software. | ||
42 | + | ||
43 | + Also, for each author's protection and ours, we want to make certain | ||
44 | +that everyone understands that there is no warranty for this free | ||
45 | +software. If the software is modified by someone else and passed on, we | ||
46 | +want its recipients to know that what they have is not the original, so | ||
47 | +that any problems introduced by others will not reflect on the original | ||
48 | +authors' reputations. | ||
49 | + | ||
50 | + Finally, any free program is threatened constantly by software | ||
51 | +patents. We wish to avoid the danger that redistributors of a free | ||
52 | +program will individually obtain patent licenses, in effect making the | ||
53 | +program proprietary. To prevent this, we have made it clear that any | ||
54 | +patent must be licensed for everyone's free use or not licensed at all. | ||
55 | + | ||
56 | + The precise terms and conditions for copying, distribution and | ||
57 | +modification follow. | ||
58 | + | ||
59 | + GNU GENERAL PUBLIC LICENSE | ||
60 | + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||
61 | + | ||
62 | + 0. This License applies to any program or other work which contains | ||
63 | +a notice placed by the copyright holder saying it may be distributed | ||
64 | +under the terms of this General Public License. The "Program", below, | ||
65 | +refers to any such program or work, and a "work based on the Program" | ||
66 | +means either the Program or any derivative work under copyright law: | ||
67 | +that is to say, a work containing the Program or a portion of it, | ||
68 | +either verbatim or with modifications and/or translated into another | ||
69 | +language. (Hereinafter, translation is included without limitation in | ||
70 | +the term "modification".) Each licensee is addressed as "you". | ||
71 | + | ||
72 | +Activities other than copying, distribution and modification are not | ||
73 | +covered by this License; they are outside its scope. The act of | ||
74 | +running the Program is not restricted, and the output from the Program | ||
75 | +is covered only if its contents constitute a work based on the | ||
76 | +Program (independent of having been made by running the Program). | ||
77 | +Whether that is true depends on what the Program does. | ||
78 | + | ||
79 | + 1. You may copy and distribute verbatim copies of the Program's | ||
80 | +source code as you receive it, in any medium, provided that you | ||
81 | +conspicuously and appropriately publish on each copy an appropriate | ||
82 | +copyright notice and disclaimer of warranty; keep intact all the | ||
83 | +notices that refer to this License and to the absence of any warranty; | ||
84 | +and give any other recipients of the Program a copy of this License | ||
85 | +along with the Program. | ||
86 | + | ||
87 | +You may charge a fee for the physical act of transferring a copy, and | ||
88 | +you may at your option offer warranty protection in exchange for a fee. | ||
89 | + | ||
90 | + 2. You may modify your copy or copies of the Program or any portion | ||
91 | +of it, thus forming a work based on the Program, and copy and | ||
92 | +distribute such modifications or work under the terms of Section 1 | ||
93 | +above, provided that you also meet all of these conditions: | ||
94 | + | ||
95 | + a) You must cause the modified files to carry prominent notices | ||
96 | + stating that you changed the files and the date of any change. | ||
97 | + | ||
98 | + b) You must cause any work that you distribute or publish, that in | ||
99 | + whole or in part contains or is derived from the Program or any | ||
100 | + part thereof, to be licensed as a whole at no charge to all third | ||
101 | + parties under the terms of this License. | ||
102 | + | ||
103 | + c) If the modified program normally reads commands interactively | ||
104 | + when run, you must cause it, when started running for such | ||
105 | + interactive use in the most ordinary way, to print or display an | ||
106 | + announcement including an appropriate copyright notice and a | ||
107 | + notice that there is no warranty (or else, saying that you provide | ||
108 | + a warranty) and that users may redistribute the program under | ||
109 | + these conditions, and telling the user how to view a copy of this | ||
110 | + License. (Exception: if the Program itself is interactive but | ||
111 | + does not normally print such an announcement, your work based on | ||
112 | + the Program is not required to print an announcement.) | ||
113 | + | ||
114 | +These requirements apply to the modified work as a whole. If | ||
115 | +identifiable sections of that work are not derived from the Program, | ||
116 | +and can be reasonably considered independent and separate works in | ||
117 | +themselves, then this License, and its terms, do not apply to those | ||
118 | +sections when you distribute them as separate works. But when you | ||
119 | +distribute the same sections as part of a whole which is a work based | ||
120 | +on the Program, the distribution of the whole must be on the terms of | ||
121 | +this License, whose permissions for other licensees extend to the | ||
122 | +entire whole, and thus to each and every part regardless of who wrote it. | ||
123 | + | ||
124 | +Thus, it is not the intent of this section to claim rights or contest | ||
125 | +your rights to work written entirely by you; rather, the intent is to | ||
126 | +exercise the right to control the distribution of derivative or | ||
127 | +collective works based on the Program. | ||
128 | + | ||
129 | +In addition, mere aggregation of another work not based on the Program | ||
130 | +with the Program (or with a work based on the Program) on a volume of | ||
131 | +a storage or distribution medium does not bring the other work under | ||
132 | +the scope of this License. | ||
133 | + | ||
134 | + 3. You may copy and distribute the Program (or a work based on it, | ||
135 | +under Section 2) in object code or executable form under the terms of | ||
136 | +Sections 1 and 2 above provided that you also do one of the following: | ||
137 | + | ||
138 | + a) Accompany it with the complete corresponding machine-readable | ||
139 | + source code, which must be distributed under the terms of Sections | ||
140 | + 1 and 2 above on a medium customarily used for software interchange; or, | ||
141 | + | ||
142 | + b) Accompany it with a written offer, valid for at least three | ||
143 | + years, to give any third party, for a charge no more than your | ||
144 | + cost of physically performing source distribution, a complete | ||
145 | + machine-readable copy of the corresponding source code, to be | ||
146 | + distributed under the terms of Sections 1 and 2 above on a medium | ||
147 | + customarily used for software interchange; or, | ||
148 | + | ||
149 | + c) Accompany it with the information you received as to the offer | ||
150 | + to distribute corresponding source code. (This alternative is | ||
151 | + allowed only for noncommercial distribution and only if you | ||
152 | + received the program in object code or executable form with such | ||
153 | + an offer, in accord with Subsection b above.) | ||
154 | + | ||
155 | +The source code for a work means the preferred form of the work for | ||
156 | +making modifications to it. For an executable work, complete source | ||
157 | +code means all the source code for all modules it contains, plus any | ||
158 | +associated interface definition files, plus the scripts used to | ||
159 | +control compilation and installation of the executable. However, as a | ||
160 | +special exception, the source code distributed need not include | ||
161 | +anything that is normally distributed (in either source or binary | ||
162 | +form) with the major components (compiler, kernel, and so on) of the | ||
163 | +operating system on which the executable runs, unless that component | ||
164 | +itself accompanies the executable. | ||
165 | + | ||
166 | +If distribution of executable or object code is made by offering | ||
167 | +access to copy from a designated place, then offering equivalent | ||
168 | +access to copy the source code from the same place counts as | ||
169 | +distribution of the source code, even though third parties are not | ||
170 | +compelled to copy the source along with the object code. | ||
171 | + | ||
172 | + 4. You may not copy, modify, sublicense, or distribute the Program | ||
173 | +except as expressly provided under this License. Any attempt | ||
174 | +otherwise to copy, modify, sublicense or distribute the Program is | ||
175 | +void, and will automatically terminate your rights under this License. | ||
176 | +However, parties who have received copies, or rights, from you under | ||
177 | +this License will not have their licenses terminated so long as such | ||
178 | +parties remain in full compliance. | ||
179 | + | ||
180 | + 5. You are not required to accept this License, since you have not | ||
181 | +signed it. However, nothing else grants you permission to modify or | ||
182 | +distribute the Program or its derivative works. These actions are | ||
183 | +prohibited by law if you do not accept this License. Therefore, by | ||
184 | +modifying or distributing the Program (or any work based on the | ||
185 | +Program), you indicate your acceptance of this License to do so, and | ||
186 | +all its terms and conditions for copying, distributing or modifying | ||
187 | +the Program or works based on it. | ||
188 | + | ||
189 | + 6. Each time you redistribute the Program (or any work based on the | ||
190 | +Program), the recipient automatically receives a license from the | ||
191 | +original licensor to copy, distribute or modify the Program subject to | ||
192 | +these terms and conditions. You may not impose any further | ||
193 | +restrictions on the recipients' exercise of the rights granted herein. | ||
194 | +You are not responsible for enforcing compliance by third parties to | ||
195 | +this License. | ||
196 | + | ||
197 | + 7. If, as a consequence of a court judgment or allegation of patent | ||
198 | +infringement or for any other reason (not limited to patent issues), | ||
199 | +conditions are imposed on you (whether by court order, agreement or | ||
200 | +otherwise) that contradict the conditions of this License, they do not | ||
201 | +excuse you from the conditions of this License. If you cannot | ||
202 | +distribute so as to satisfy simultaneously your obligations under this | ||
203 | +License and any other pertinent obligations, then as a consequence you | ||
204 | +may not distribute the Program at all. For example, if a patent | ||
205 | +license would not permit royalty-free redistribution of the Program by | ||
206 | +all those who receive copies directly or indirectly through you, then | ||
207 | +the only way you could satisfy both it and this License would be to | ||
208 | +refrain entirely from distribution of the Program. | ||
209 | + | ||
210 | +If any portion of this section is held invalid or unenforceable under | ||
211 | +any particular circumstance, the balance of the section is intended to | ||
212 | +apply and the section as a whole is intended to apply in other | ||
213 | +circumstances. | ||
214 | + | ||
215 | +It is not the purpose of this section to induce you to infringe any | ||
216 | +patents or other property right claims or to contest validity of any | ||
217 | +such claims; this section has the sole purpose of protecting the | ||
218 | +integrity of the free software distribution system, which is | ||
219 | +implemented by public license practices. Many people have made | ||
220 | +generous contributions to the wide range of software distributed | ||
221 | +through that system in reliance on consistent application of that | ||
222 | +system; it is up to the author/donor to decide if he or she is willing | ||
223 | +to distribute software through any other system and a licensee cannot | ||
224 | +impose that choice. | ||
225 | + | ||
226 | +This section is intended to make thoroughly clear what is believed to | ||
227 | +be a consequence of the rest of this License. | ||
228 | + | ||
229 | + 8. If the distribution and/or use of the Program is restricted in | ||
230 | +certain countries either by patents or by copyrighted interfaces, the | ||
231 | +original copyright holder who places the Program under this License | ||
232 | +may add an explicit geographical distribution limitation excluding | ||
233 | +those countries, so that distribution is permitted only in or among | ||
234 | +countries not thus excluded. In such case, this License incorporates | ||
235 | +the limitation as if written in the body of this License. | ||
236 | + | ||
237 | + 9. The Free Software Foundation may publish revised and/or new versions | ||
238 | +of the General Public License from time to time. Such new versions will | ||
239 | +be similar in spirit to the present version, but may differ in detail to | ||
240 | +address new problems or concerns. | ||
241 | + | ||
242 | +Each version is given a distinguishing version number. If the Program | ||
243 | +specifies a version number of this License which applies to it and "any | ||
244 | +later version", you have the option of following the terms and conditions | ||
245 | +either of that version or of any later version published by the Free | ||
246 | +Software Foundation. If the Program does not specify a version number of | ||
247 | +this License, you may choose any version ever published by the Free Software | ||
248 | +Foundation. | ||
249 | + | ||
250 | + 10. If you wish to incorporate parts of the Program into other free | ||
251 | +programs whose distribution conditions are different, write to the author | ||
252 | +to ask for permission. For software which is copyrighted by the Free | ||
253 | +Software Foundation, write to the Free Software Foundation; we sometimes | ||
254 | +make exceptions for this. Our decision will be guided by the two goals | ||
255 | +of preserving the free status of all derivatives of our free software and | ||
256 | +of promoting the sharing and reuse of software generally. | ||
257 | + | ||
258 | + NO WARRANTY | ||
259 | + | ||
260 | + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||
261 | +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | ||
262 | +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||
263 | +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||
264 | +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
265 | +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | ||
266 | +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | ||
267 | +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||
268 | +REPAIR OR CORRECTION. | ||
269 | + | ||
270 | + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||
271 | +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||
272 | +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||
273 | +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||
274 | +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||
275 | +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||
276 | +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||
277 | +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||
278 | +POSSIBILITY OF SUCH DAMAGES. | ||
279 | + | ||
280 | + END OF TERMS AND CONDITIONS | ||
281 | + | ||
282 | + How to Apply These Terms to Your New Programs | ||
283 | + | ||
284 | + If you develop a new program, and you want it to be of the greatest | ||
285 | +possible use to the public, the best way to achieve this is to make it | ||
286 | +free software which everyone can redistribute and change under these terms. | ||
287 | + | ||
288 | + To do so, attach the following notices to the program. It is safest | ||
289 | +to attach them to the start of each source file to most effectively | ||
290 | +convey the exclusion of warranty; and each file should have at least | ||
291 | +the "copyright" line and a pointer to where the full notice is found. | ||
292 | + | ||
293 | + <one line to give the program's name and a brief idea of what it does.> | ||
294 | + Copyright (C) <year> <name of author> | ||
295 | + | ||
296 | + This program is free software; you can redistribute it and/or modify | ||
297 | + it under the terms of the GNU General Public License as published by | ||
298 | + the Free Software Foundation; either version 2 of the License, or | ||
299 | + (at your option) any later version. | ||
300 | + | ||
301 | + This program is distributed in the hope that it will be useful, | ||
302 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
303 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
304 | + GNU General Public License for more details. | ||
305 | + | ||
306 | + You should have received a copy of the GNU General Public License | ||
307 | + along with this program; if not, write to the Free Software | ||
308 | + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
309 | + | ||
310 | + | ||
311 | +Also add information on how to contact you by electronic and paper mail. | ||
312 | + | ||
313 | +If the program is interactive, make it output a short notice like this | ||
314 | +when it starts in an interactive mode: | ||
315 | + | ||
316 | + Gnomovision version 69, Copyright (C) year name of author | ||
317 | + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||
318 | + This is free software, and you are welcome to redistribute it | ||
319 | + under certain conditions; type `show c' for details. | ||
320 | + | ||
321 | +The hypothetical commands `show w' and `show c' should show the appropriate | ||
322 | +parts of the General Public License. Of course, the commands you use may | ||
323 | +be called something other than `show w' and `show c'; they could even be | ||
324 | +mouse-clicks or menu items--whatever suits your program. | ||
325 | + | ||
326 | +You should also get your employer (if you work as a programmer) or your | ||
327 | +school, if any, to sign a "copyright disclaimer" for the program, if | ||
328 | +necessary. Here is a sample; alter the names: | ||
329 | + | ||
330 | + Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||
331 | + `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||
332 | + | ||
333 | + <signature of Ty Coon>, 1 April 1989 | ||
334 | + Ty Coon, President of Vice | ||
335 | + | ||
336 | +This General Public License does not permit incorporating your program into | ||
337 | +proprietary programs. If your program is a subroutine library, you may | ||
338 | +consider it more useful to permit linking proprietary applications with the | ||
339 | +library. If this is what you want to do, use the GNU Library General | ||
340 | +Public License instead of this License. |
@@ -0,0 +1,111 @@ | @@ -0,0 +1,111 @@ | ||
1 | +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> | ||
2 | +<HTML> | ||
3 | +<HEAD> | ||
4 | + <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> | ||
5 | + <META NAME="GENERATOR" CONTENT="Mozilla/4.05 [en] (X11; I; Linux 2.3.99-pre3 i686) [Netscape]"> | ||
6 | + <META NAME="Author" CONTENT="johnie@debian.org (Johnie Ingram)"> | ||
7 | + <META NAME="Description" CONTENT="The initial installation of Debian/GNU Apache."> | ||
8 | + <TITLE>Welcome to Your New Home Page!</TITLE> | ||
9 | +</HEAD> | ||
10 | +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EF" VLINK="#55188A" ALINK="#FF0000"> | ||
11 | + | ||
12 | +<BR> | ||
13 | + | ||
14 | +<H1>Welcome to Your New Home in Cyberspace!</H1> | ||
15 | + | ||
16 | +<HR NOSHADE> | ||
17 | +<BR> | ||
18 | + | ||
19 | +<IMG ALIGN="right" ALT="" HEIGHT="247" WIDTH="278" SRC="icons/jhe061.gif"> | ||
20 | + | ||
21 | +<P>This is a placeholder page installed by the <A HREF="http://www.debian.org/">Debian</A> | ||
22 | +release of the <A HREF="http://www.apache.org/">Apache</A> Web server package, | ||
23 | +because no home page was installed on this host. You may want to replace | ||
24 | +this as soon as possible with your own web pages, of course.... | ||
25 | + | ||
26 | +<BLOCKQUOTE> | ||
27 | +This computer has installed the Debian GNU/Linux operating system but has | ||
28 | +nothing to do with the Debian GNU/Linux project. If you want to | ||
29 | +report something about this host's behavior or domain, please contact the | ||
30 | +ISPs involved directly, <strong>not</strong> the Debian Project. | ||
31 | +<P>See the <A HREF="http://www.abuse.net/">Network Abuse Clearinghouse</A> | ||
32 | +for how to do this. | ||
33 | +</BLOCKQUOTE> | ||
34 | + | ||
35 | +<P>Unless you changed its configuration, your new server is configured as follows: | ||
36 | +<UL> | ||
37 | +<LI> | ||
38 | +Configuration files can be found in <TT>/etc/apache</TT>.</LI> | ||
39 | + | ||
40 | +<LI> | ||
41 | +The <TT>DocumentRoot</TT>, which is the directory under which all your | ||
42 | +HTML files should exist, is set to <TT>/var/www</TT>.</LI> | ||
43 | + | ||
44 | +<LI> | ||
45 | +CGI scripts are looked for in <TT>/usr/lib/cgi-bin</TT>, which is where | ||
46 | +Debian packages will place their scripts.</LI> | ||
47 | + | ||
48 | +<LI> | ||
49 | +Log files are placed in <TT>/var/log/apache</TT>, and will be rotated | ||
50 | +daily. The frequency of rotation can be easily changed by editing | ||
51 | +<TT>/etc/apache/cron.conf</TT>.</LI> | ||
52 | + | ||
53 | +<LI> | ||
54 | +The default directory index is <TT>index.html</TT>, meaning that requests | ||
55 | +for a directory <TT>/foo/bar/</TT> will give the contents of the file <TT>/var/www/foo/bar/index.html</TT> | ||
56 | +if it exists (assuming that <TT>/var/www</TT> is your <TT>DocumentRoot</TT>).</LI> | ||
57 | + | ||
58 | +<LI> | ||
59 | +User directories are enabled, and user documents will be looked for in | ||
60 | +the <TT>public_html</TT> directory of the users' homes. These dirs | ||
61 | +should be under /home, and users will not be able to symlink to files | ||
62 | +they don't own.</LI> | ||
63 | + | ||
64 | +</UL> | ||
65 | +All standard Apache modules are available with this release and can be | ||
66 | +chosen with the <TT>apacheconfig</TT> script. Installing a new module on | ||
67 | +your system is just a matter of compiling it (with the apache-dev package) | ||
68 | +and adding a line to your <TT>httpd.conf</TT> configuration file. | ||
69 | + | ||
70 | +<P>More documentation on Apache can be found on: | ||
71 | +<UL> | ||
72 | +<LI> | ||
73 | +The <A HREF="/doc/apache/">Apache documentation</A> stored on your server.</LI> | ||
74 | + | ||
75 | +<LI> | ||
76 | +The <A HREF="http://www.apache.org/">Apache Project</A> home site.</LI> | ||
77 | + | ||
78 | +<LI> | ||
79 | +The <A HREF="http://www.apacheweek.com/">ApacheWeek</A> newsletter.</LI> | ||
80 | + | ||
81 | +<LI> | ||
82 | +The <A HREF="http://www.debian.org/doc/">Debian Project | ||
83 | +Documentation</A> which contains HOWTOs, FAQs, and software updates.</LI> | ||
84 | +</UL> | ||
85 | + | ||
86 | +<P>You can also consult the list of <A HREF="http://www.boutell.com/faq/">World | ||
87 | +Wide Web Frequently Asked Questions</A> for information. | ||
88 | + | ||
89 | +<P>If you find a bug in this Apache package, or in Apache itself, | ||
90 | +please file a bug report on it. Instructions on doing this, and the | ||
91 | +list of <A HREF="http://bugs.debian.org/apache">known bugs</A> of this | ||
92 | +package, can be found in the <A | ||
93 | +HREF="http://www.debian.org/Bugs/">Debian Bug Tracking System</A>. | ||
94 | + | ||
95 | +<P>Thanks for using this package, and congratulations for your choice of | ||
96 | +a Debian system! | ||
97 | + | ||
98 | +<BR> | ||
99 | +<P ALIGN="CENTER"> | ||
100 | +<IMG HEIGHT="30" WIDTH="25" SRC="icons/debian/openlogo-25.jpg" ALT="Debian"> | ||
101 | +<IMG HEIGHT="32" WIDTH="259" SRC="icons/apache_pb.gif" ALT="Apache"></P> | ||
102 | + | ||
103 | +<BR> | ||
104 | + | ||
105 | +<P> | ||
106 | +<HR NOSHADE> | ||
107 | +<FONT SIZE=-1><A HREF="http://netgod.net/">Johnie Ingram</A>, | ||
108 | +Treasure Island, California 13 October 2001.</FONT> | ||
109 | + | ||
110 | +</BODY> | ||
111 | +</HTML> |
@@ -0,0 +1,367 @@ | @@ -0,0 +1,367 @@ | ||
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 <stdio.h> | ||
26 | +#include <string.h> | ||
27 | +#include <sys/time.h> | ||
28 | +#include "nInvaders.h" | ||
29 | +#include "player.h" | ||
30 | +#include "aliens.h" | ||
31 | +#include "ufo.h" | ||
32 | + | ||
33 | +#define FPS 50 | ||
34 | + | ||
35 | +int lives; | ||
36 | +long score; | ||
37 | +int status; // status handled in timer | ||
38 | + | ||
39 | +#define GAME_LOOP 1 | ||
40 | +#define GAME_NEXTLEVEL 2 | ||
41 | +#define GAME_PAUSED 3 | ||
42 | +#define GAME_OVER 4 | ||
43 | +#define GAME_EXIT 5 | ||
44 | +#define GAME_HIGHSCORE 6 | ||
45 | + | ||
46 | + | ||
47 | + | ||
48 | + | ||
49 | +/** | ||
50 | + * initialize level: reset attributes of most units | ||
51 | + */ | ||
52 | +static void initLevel() | ||
53 | +{ | ||
54 | + playerReset(); | ||
55 | + aliensReset(); | ||
56 | + ufoReset(); | ||
57 | + bunkersReset(); | ||
58 | + render(); | ||
59 | + drawscore(); | ||
60 | +} | ||
61 | + | ||
62 | + | ||
63 | +/** | ||
64 | + * evaluate command line parameters | ||
65 | + */ | ||
66 | +static void evaluateCommandLine(int argc, char **argv) | ||
67 | +{ | ||
68 | + | ||
69 | + // -l : set skill level | ||
70 | + if (argc == 3 && strcmp(argv[1], "-l") == 0) { | ||
71 | + if (argv[2][0] >= '0' && argv[2][0] <= '9') { | ||
72 | + skill_level = argv[2][0] - 48; | ||
73 | + } else { | ||
74 | + argc = 2; | ||
75 | + } | ||
76 | + } | ||
77 | + | ||
78 | + // -gpl : show GNU GPL | ||
79 | + if (argc == 2 && strcmp(argv[1], "-gpl") == 0) { | ||
80 | + showGpl(); | ||
81 | + } | ||
82 | + | ||
83 | + // wrong command line: show usage | ||
84 | + if (argc == 2 || (argc == 3 && strcmp(argv[1], "-l") != 0)) { | ||
85 | + showVersion(); | ||
86 | + showUsage(); | ||
87 | + exit(1); | ||
88 | + } | ||
89 | +} | ||
90 | + | ||
91 | + | ||
92 | +static void finish(int sig) | ||
93 | +{ | ||
94 | + endwin(); | ||
95 | + showGplShort(); | ||
96 | + | ||
97 | + fprintf(stderr,"\n"); | ||
98 | + fprintf(stderr,"\n"); | ||
99 | + fprintf(stderr,"=========================================================================\n"); | ||
100 | + fprintf(stderr,"\n"); | ||
101 | + | ||
102 | + fprintf(stderr,"Final score: %7.7ld, Final level: %2.2d\nFinal rating... ",score,level); | ||
103 | + if (lives>0) | ||
104 | + fprintf(stderr,"Quitter\n\n"); | ||
105 | + else if(score<5000) | ||
106 | + fprintf(stderr,"Alien Fodder\n\n"); | ||
107 | + else if(score<7500) | ||
108 | + fprintf(stderr,"Easy Target\n\n"); | ||
109 | + else if(score<10000) | ||
110 | + fprintf(stderr,"Barely Mediocre\n\n"); | ||
111 | + else if(score<12500) | ||
112 | + fprintf(stderr,"Shows Promise\n\n"); | ||
113 | + else if(score<15000) | ||
114 | + fprintf(stderr,"Alien Blaster\n\n"); | ||
115 | + else if(score<20000) | ||
116 | + fprintf(stderr,"Earth Defender\n\n"); | ||
117 | + else if(score>19999) | ||
118 | + fprintf(stderr,"Supreme Protector\n\n"); | ||
119 | + | ||
120 | + showVersion(); | ||
121 | + exit(0); | ||
122 | +} | ||
123 | + | ||
124 | + | ||
125 | +void drawscore() | ||
126 | +{ | ||
127 | + statusDisplay(level, score, lives); | ||
128 | +} | ||
129 | + | ||
130 | + | ||
131 | +/** | ||
132 | + * reads input from keyboard and do action | ||
133 | + */ | ||
134 | +void readInput() | ||
135 | +{ | ||
136 | + int ch; | ||
137 | + static int lastmove; | ||
138 | + | ||
139 | + ch = getch(); // get key pressed | ||
140 | + | ||
141 | + switch (status) { | ||
142 | + | ||
143 | + case GAME_PAUSED: | ||
144 | + | ||
145 | + if (ch == 'p') { | ||
146 | + status = GAME_LOOP; | ||
147 | + } | ||
148 | + break; | ||
149 | + | ||
150 | + case GAME_HIGHSCORE: | ||
151 | + | ||
152 | + if (ch == ' ') { | ||
153 | + titleScreenClear(); | ||
154 | + level = 0; // reset level | ||
155 | + score = 0; // reset score | ||
156 | + lives = 3; // restore lives | ||
157 | + status = GAME_NEXTLEVEL; | ||
158 | + } else if (ch == 'q') { // quit game | ||
159 | + status = GAME_EXIT; | ||
160 | + } | ||
161 | + break; | ||
162 | + | ||
163 | + case GAME_OVER: | ||
164 | + break; // don't do anything | ||
165 | + | ||
166 | + default: | ||
167 | + | ||
168 | + if (ch == 'l' || ch == KEY_RIGHT) { // move player right | ||
169 | + if (lastmove == 'l') { | ||
170 | + playerTurboOn(); // enable Turbo | ||
171 | + } else { | ||
172 | + playerTurboOff(); // disable Turbo | ||
173 | + } | ||
174 | + playerMoveRight(); // move player | ||
175 | + lastmove = 'l'; // remember last move for turbo mode | ||
176 | + } else if (ch == 'h' || ch == KEY_LEFT) { // move player left | ||
177 | + if (lastmove == 'h') { | ||
178 | + playerTurboOn(); // enable Turbo | ||
179 | + } else { | ||
180 | + playerTurboOff(); // disable Turbo | ||
181 | + } | ||
182 | + playerMoveLeft(); // move player | ||
183 | + lastmove = 'h'; // remember last move for turbo mode | ||
184 | + } else if (ch == 'k' || ch == ' ') { // shoot missile | ||
185 | + playerLaunchMissile(); | ||
186 | + } else if (ch == 'p') { // pause game until 'p' pressed again | ||
187 | + // set status to game paused | ||
188 | + status = GAME_PAUSED; | ||
189 | + } else if (ch == 'W') { // cheat: goto next level | ||
190 | + status = GAME_NEXTLEVEL; | ||
191 | + } else if (ch == 'L') { // cheat: one more live | ||
192 | + lives++; | ||
193 | + drawscore(); | ||
194 | + } else if (ch == 'q') { // quit game | ||
195 | + status = GAME_EXIT; | ||
196 | + } else { // disable turbo mode if key is not kept pressed | ||
197 | + lastmove = ' '; | ||
198 | + } | ||
199 | + | ||
200 | + } // switch | ||
201 | + | ||
202 | +} | ||
203 | + | ||
204 | + | ||
205 | +/** | ||
206 | + * timer | ||
207 | + * this method is executed every 1 / FPS seconds | ||
208 | + */ | ||
209 | +void handleTimer() | ||
210 | +{ | ||
211 | + static int aliens_move_counter = 0; | ||
212 | + static int aliens_shot_counter = 0; | ||
213 | + static int player_shot_counter = 0; | ||
214 | + static int ufo_move_counter = 0; | ||
215 | + static int title_animation_counter = 0; | ||
216 | + static int game_over_counter = 0; | ||
217 | + | ||
218 | + switch (status) { | ||
219 | + | ||
220 | + case GAME_NEXTLEVEL: // go to next level | ||
221 | + | ||
222 | + level++; // increase level | ||
223 | + | ||
224 | + initLevel(); // initialize level | ||
225 | + | ||
226 | + aliens_move_counter = 0; | ||
227 | + aliens_shot_counter = 0; | ||
228 | + player_shot_counter = 0; | ||
229 | + ufo_move_counter = 0; | ||
230 | + | ||
231 | + weite = (shipnum+(skill_level*10)-(level*5)+5)/10; | ||
232 | + | ||
233 | + if (weite < 0) { | ||
234 | + weite = 0; | ||
235 | + } | ||
236 | + | ||
237 | + // change status and start game! | ||
238 | + status = GAME_LOOP; | ||
239 | + | ||
240 | + case GAME_LOOP: // do game handling | ||
241 | + | ||
242 | + // move aliens | ||
243 | + if (aliens_move_counter == 0 && aliensMove() == 1) { | ||
244 | + // aliens reached player | ||
245 | + lives = 0; | ||
246 | + status = GAME_OVER; | ||
247 | + } | ||
248 | + | ||
249 | + // move player missile | ||
250 | + if (player_shot_counter == 0 && playerMoveMissile() == 1) { | ||
251 | + // no aliens left | ||
252 | + status = GAME_NEXTLEVEL; | ||
253 | + } | ||
254 | + | ||
255 | + // move aliens' missiles | ||
256 | + if (aliens_shot_counter == 0 && aliensMissileMove() == 1) { | ||
257 | + // player was hit | ||
258 | + lives--; // player looses one life | ||
259 | + drawscore(); // draw score | ||
260 | + playerExplode(); // display some explosion graphics | ||
261 | + if (lives == 0) { // if no lives left ... | ||
262 | + status = GAME_OVER; // ... exit game | ||
263 | + } | ||
264 | + } | ||
265 | + | ||
266 | + // move ufo | ||
267 | + if (ufo_move_counter == 0 && ufoShowUfo() == 1) { | ||
268 | + ufoMoveLeft(); // move it one position to the left | ||
269 | + } | ||
270 | + | ||
271 | + | ||
272 | + if (aliens_shot_counter++ >= 5) {aliens_shot_counter=0;} // speed of alien shot | ||
273 | + if (player_shot_counter++ >= 1) {player_shot_counter=0;} // speed of player shot | ||
274 | + if (aliens_move_counter++ >= weite) {aliens_move_counter=0;} // speed of aliend | ||
275 | + if (ufo_move_counter++ >= 3) {ufo_move_counter=0;} // speed of ufo | ||
276 | + | ||
277 | + refreshScreen(); | ||
278 | + break; | ||
279 | + | ||
280 | + case GAME_PAUSED: // game is paused | ||
281 | + break; | ||
282 | + | ||
283 | + case GAME_OVER: // game over | ||
284 | + if (game_over_counter == 100) { | ||
285 | + battleFieldClear(); | ||
286 | + status = GAME_HIGHSCORE; | ||
287 | + game_over_counter = 0; | ||
288 | + } else { | ||
289 | + gameOverDisplay(); | ||
290 | + game_over_counter++; | ||
291 | + } | ||
292 | + break; | ||
293 | + | ||
294 | + case GAME_EXIT: // exit game | ||
295 | + finish(0); | ||
296 | + break; | ||
297 | + | ||
298 | + case GAME_HIGHSCORE: // display highscore | ||
299 | + if (title_animation_counter == 0) { | ||
300 | + titleScreenDisplay(); | ||
301 | + } | ||
302 | + | ||
303 | + if (title_animation_counter++ >= 6) {title_animation_counter = 0;} // speed of animation | ||
304 | + break; | ||
305 | + | ||
306 | + } | ||
307 | +} | ||
308 | + | ||
309 | + | ||
310 | +/** | ||
311 | + * set up timer | ||
312 | + */ | ||
313 | +void setUpTimer() | ||
314 | +{ | ||
315 | + struct itimerval myTimer; | ||
316 | + struct sigaction myAction; | ||
317 | + myTimer.it_value.tv_sec = 0; | ||
318 | + myTimer.it_value.tv_usec = 1000000 / FPS; | ||
319 | + myTimer.it_interval.tv_sec = 0; | ||
320 | + myTimer.it_interval.tv_usec = 1000000 / FPS; | ||
321 | + setitimer(ITIMER_REAL, &myTimer, NULL); | ||
322 | + | ||
323 | + myAction.sa_handler = &handleTimer; | ||
324 | + myAction.sa_flags = SA_RESTART; | ||
325 | + sigaction(SIGALRM, &myAction, NULL); | ||
326 | +} | ||
327 | + | ||
328 | + | ||
329 | +int main(int argc, char **argv) | ||
330 | +{ | ||
331 | + weite = 0; | ||
332 | + score = 0; | ||
333 | + lives = 3; | ||
334 | + level = 0; | ||
335 | + skill_level = 1; | ||
336 | + | ||
337 | + evaluateCommandLine(argc, argv); // evaluate command line parameters | ||
338 | + graphicEngineInit(); // initialize graphic engine | ||
339 | + | ||
340 | + // set up timer/ game handling | ||
341 | + setUpTimer(); | ||
342 | + status = GAME_HIGHSCORE; | ||
343 | + | ||
344 | + // read keyboard input | ||
345 | + do { | ||
346 | + // do movements and key-checking | ||
347 | + readInput(); | ||
348 | + } while (0 == 0); | ||
349 | + | ||
350 | + return 0; | ||
351 | +} | ||
352 | + | ||
353 | + | ||
354 | +void doScoring(int alienType) | ||
355 | +{ | ||
356 | + int points[4] = {500, 200, 150, 100}; // 0: ufo, 1:red, 2:green, 3:blue | ||
357 | + | ||
358 | + score += points[alienType]; // every alien type does different scoring points | ||
359 | + | ||
360 | + // every 6000 pts player gets a new live | ||
361 | + if (score % 6000 == 0){ | ||
362 | + lives++; | ||
363 | + } | ||
364 | + | ||
365 | + drawscore(); // display score | ||
366 | +} | ||
367 | + |
@@ -0,0 +1,60 @@ | @@ -0,0 +1,60 @@ | ||
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 <stdio.h> | ||
26 | +#include <stdlib.h> | ||
27 | +#include "view.h" | ||
28 | +#include "globals.h" | ||
29 | + | ||
30 | + | ||
31 | +#ifndef NINVADERS | ||
32 | +#define NINVADERS | ||
33 | + | ||
34 | +#define UFO_ALIEN_TYPE 0 | ||
35 | +#define RED_ALIEN_TYPE 1 | ||
36 | +#define GREEN_ALIEN_TYPE 2 | ||
37 | +#define BLUE_ALIEN_TYPE 3 | ||
38 | + | ||
39 | +int main(int argv, char **argc); // hey! it has to start somewhere! | ||
40 | + | ||
41 | +extern void render(void); | ||
42 | + | ||
43 | +void game_over(int a); | ||
44 | +void drawscore(); | ||
45 | + | ||
46 | +void doScoring(int alienType); | ||
47 | + | ||
48 | +// todo: let's try to not having to declare these "public" | ||
49 | +int weite; | ||
50 | +int level; | ||
51 | +int skill_level; | ||
52 | + | ||
53 | +// included from globals.h | ||
54 | +extern void doSleep(); | ||
55 | +extern void showUsage(); | ||
56 | +extern void showVersion(); | ||
57 | +extern void showGplShort(); | ||
58 | +extern void showGpl(); | ||
59 | + | ||
60 | +#endif |
@@ -0,0 +1,240 @@ | @@ -0,0 +1,240 @@ | ||
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 "player.h" | ||
26 | +#include "aliens.h" | ||
27 | +#include "ufo.h" | ||
28 | +#include "nInvaders.h" | ||
29 | + | ||
30 | +typedef struct Player Player; | ||
31 | + | ||
32 | +struct Player { | ||
33 | + int posX; // horizontal position of player | ||
34 | + int posY; // vertical position of player | ||
35 | + int speed; // 0: no movement; 1: one per turn; etc. | ||
36 | + int missileFired; // 0: missile not running; 1: missile running | ||
37 | + int missileX; // horizontal position of missile | ||
38 | + int missileY; // vertical position of missile | ||
39 | +}; | ||
40 | + | ||
41 | +Player player; | ||
42 | + | ||
43 | +/** | ||
44 | + * initialize player attributes | ||
45 | + */ | ||
46 | +void playerReset() | ||
47 | +{ | ||
48 | + // if missile was fired clear that position | ||
49 | + if (player.missileFired == 1) { | ||
50 | + playerMissileClear(player.missileX, player.missileY); | ||
51 | + } | ||
52 | + | ||
53 | + playerClear(player.posX, player.posY); // clear old position of player | ||
54 | + | ||
55 | + player.posY = PLAYERPOSY; // set vertical Position | ||
56 | + player.posX = 0; // set horizontal Position | ||
57 | + player.speed = 1; | ||
58 | + player.missileFired = 0; | ||
59 | + player.missileX=0; | ||
60 | + player.missileY=0; | ||
61 | + | ||
62 | + playerDisplay(player.posX, player.posY); // display new position of player | ||
63 | +} | ||
64 | + | ||
65 | + | ||
66 | +/** | ||
67 | + * move player horizontally to position newPosX | ||
68 | + */ | ||
69 | +static void playerMove(int newPosX) | ||
70 | +{ | ||
71 | + playerClear(player.posX, player.posY); // clear sprite | ||
72 | + player.posX = newPosX; // make movement | ||
73 | + playerDisplay(player.posX, player.posY); // display sprite | ||
74 | +} | ||
75 | + | ||
76 | + | ||
77 | +/** | ||
78 | + * move player left | ||
79 | + */ | ||
80 | +void playerMoveLeft() | ||
81 | +{ | ||
82 | + // check if space between player and border of screen is big enough | ||
83 | + if (player.posX > 0 + player.speed) { | ||
84 | + // desired movement is possible | ||
85 | + playerMove(player.posX - player.speed); | ||
86 | + } else { | ||
87 | + // space too small, move to left-most position | ||
88 | + playerMove(0); | ||
89 | + } | ||
90 | +} | ||
91 | + | ||
92 | + | ||
93 | +/** | ||
94 | + * move player right | ||
95 | + */ | ||
96 | +void playerMoveRight() | ||
97 | +{ | ||
98 | + // check if space between player and border of screen is big enough | ||
99 | + if (player.posX < SCREENWIDTH - PLAYERWIDTH - player.speed) { | ||
100 | + // desired movement is possible | ||
101 | + playerMove(player.posX + player.speed); | ||
102 | + } else { | ||
103 | + // space too small, move to right-most position | ||
104 | + playerMove(SCREENWIDTH - PLAYERWIDTH); | ||
105 | + } | ||
106 | +} | ||
107 | + | ||
108 | + | ||
109 | +/** | ||
110 | + * toggle turbo mode on (if key is kept pressed) | ||
111 | + */ | ||
112 | +void playerTurboOn() | ||
113 | +{ | ||
114 | + player.speed = 2; | ||
115 | +} | ||
116 | + | ||
117 | + | ||
118 | +/** | ||
119 | + * toggle turbo mode off (if key is kept pressed) | ||
120 | + */ | ||
121 | +void playerTurboOff() | ||
122 | +{ | ||
123 | + player.speed = 1; | ||
124 | +} | ||
125 | + | ||
126 | + | ||
127 | +/** | ||
128 | + * player was hit by an alien shot | ||
129 | + */ | ||
130 | +int playerHitCheck(int hostileShotX, int hostileShotY) | ||
131 | +{ | ||
132 | + int fPlayerWasHit = 0; | ||
133 | + | ||
134 | + // if shot reached vertikal position of player | ||
135 | + if (hostileShotY == PLAYERPOSY) { | ||
136 | + // if shot hits player | ||
137 | + if (hostileShotX >= player.posX && hostileShotX <= player.posX + PLAYERWIDTH -1) { | ||
138 | + fPlayerWasHit = 1; // set return value | ||
139 | + } | ||
140 | + } | ||
141 | + | ||
142 | + return fPlayerWasHit; // return if player was hit | ||
143 | +} | ||
144 | + | ||
145 | + | ||
146 | +/** | ||
147 | + * Launch Missile | ||
148 | + */ | ||
149 | +void playerLaunchMissile() | ||
150 | +{ | ||
151 | + // only launch missile if no other is on its way | ||
152 | + if (player.missileFired == 0) { | ||
153 | + player.missileFired = 1; // missile is on its way | ||
154 | + player.missileX = player.posX + PLAYERWIDTH / 2; // launched from the middle of player... | ||
155 | + player.missileY = PLAYERPOSY; // ...at same horizontal position | ||
156 | + } | ||
157 | +} | ||
158 | + | ||
159 | + | ||
160 | +/** | ||
161 | + * Reload Missile | ||
162 | + */ | ||
163 | +static void playerReloadMissile() | ||
164 | +{ | ||
165 | + player.missileFired = 0; // no player missile flying | ||
166 | +} | ||
167 | + | ||
168 | + | ||
169 | +/** | ||
170 | + * move player missile and do alien/bunker hit testing | ||
171 | + * return value - 0: still some aliens left, 1: no aliens left | ||
172 | + */ | ||
173 | +int playerMoveMissile() | ||
174 | +{ | ||
175 | + int fNoAliensLeft = 0; // return value | ||
176 | + int alienTypeHit = 0; | ||
177 | + | ||
178 | + // only do movements if there is a missile to move | ||
179 | + if (player.missileFired == 1) { | ||
180 | + | ||
181 | + playerMissileClear(player.missileX, player.missileY); // clear old missile position | ||
182 | + playerDisplay(player.posX, player.posY); // todo: check if this can be removed later if missiled is fired, | ||
183 | + //the middle of player is cleared | ||
184 | + player.missileY--; // move missile | ||
185 | + | ||
186 | + // if missile out of battlefield | ||
187 | + if (player.missileY < 0) { | ||
188 | + playerReloadMissile(); // reload missile | ||
189 | + } else { | ||
190 | + playerMissileDisplay(player.missileX, player.missileY); // display missile at new position | ||
191 | + } | ||
192 | + | ||
193 | + // if missile hits an alien (TODO) | ||
194 | + alienTypeHit = aliensHitCheck(player.missileX, player.missileY); | ||
195 | + if (alienTypeHit != 0) { | ||
196 | + | ||
197 | + doScoring(alienTypeHit); // increase score | ||
198 | + playerReloadMissile(); // reload missile | ||
199 | + | ||
200 | + aliensClear(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // clear old posiiton of aliens | ||
201 | + | ||
202 | + render(); | ||
203 | + if (shipnum == 0) { | ||
204 | + fNoAliensLeft = 1; | ||
205 | + } | ||
206 | + | ||
207 | + // speed of aliens | ||
208 | + weite = (shipnum + (skill_level * 10) - (level * 5) + 5) / 10; | ||
209 | + if (weite < 0) { | ||
210 | + weite = 0; | ||
211 | + } | ||
212 | + | ||
213 | + playerMissileClear(player.missileX, player.missileY); // clear old missile position | ||
214 | + aliensDisplay(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // display aliens | ||
215 | + } | ||
216 | + | ||
217 | + // if missile hits a bunker | ||
218 | + if (bunkersHitCheck(player.missileX, player.missileY) == 1) { | ||
219 | + bunkersClearElement(player.missileX, player.missileY); // clear element of bunker | ||
220 | + playerReloadMissile(); // reload player missile | ||
221 | + } | ||
222 | + | ||
223 | + // if missile hits ufo | ||
224 | + if (ufoHitCheck(player.missileX, player.missileY) == 1) { | ||
225 | + doScoring(UFO_ALIEN_TYPE); | ||
226 | + playerReloadMissile(); | ||
227 | + } | ||
228 | + } | ||
229 | + | ||
230 | + return fNoAliensLeft; | ||
231 | + | ||
232 | +} | ||
233 | + | ||
234 | +/** | ||
235 | + * let player explode | ||
236 | + */ | ||
237 | +void playerExplode(){ | ||
238 | + playerExplosionDisplay(player.posX, player.posY); | ||
239 | + playerDisplay(player.posX, player.posY); | ||
240 | +} |
@@ -0,0 +1,55 @@ | @@ -0,0 +1,55 @@ | ||
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 | +#ifndef PLAYER | ||
26 | +#define PLAYER | ||
27 | + | ||
28 | +#include "view.h" | ||
29 | + | ||
30 | + | ||
31 | +void playerReset(); | ||
32 | + | ||
33 | +void playerMoveLeft(); | ||
34 | +void playerMoveRight(); | ||
35 | +void playerTurboOn(); | ||
36 | +void playerTurboOff(); | ||
37 | +int playerHitCheck(int hostileShotX, int hostileShotY); | ||
38 | +void playerLaunchMissile(); | ||
39 | +int playerMoveMissile(); | ||
40 | +void playerExplode(); | ||
41 | + | ||
42 | +// methods that handle graphic display, from view.c | ||
43 | +extern void playerInit(); | ||
44 | +extern void playerDisplay(int x, int y); | ||
45 | +extern void playerClear(int x, int y); | ||
46 | +extern void playerMissileInit(); | ||
47 | +extern void playerMissileDisplay(int x, int y); | ||
48 | +extern void playerMissileClear(int x, int y); | ||
49 | +extern void playerExplosionDisplay(int x, int y); | ||
50 | +extern void bunkersClearElement(int x, int y); | ||
51 | + | ||
52 | +extern void doScoring(int alienType); | ||
53 | + | ||
54 | +#endif | ||
55 | + |
@@ -0,0 +1,101 @@ | @@ -0,0 +1,101 @@ | ||
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 "ufo.h" | ||
26 | +#include "aliens.h" | ||
27 | +#include "nInvaders.h" | ||
28 | + | ||
29 | +static int fShowUfo = 0; | ||
30 | + | ||
31 | +/** | ||
32 | + * initialize ufo attributes | ||
33 | + */ | ||
34 | +void ufoReset() | ||
35 | +{ | ||
36 | + ufoClear(ufo.posX, ufo.posY); // clear old position of player | ||
37 | + | ||
38 | + fShowUfo = 0; // do not show ufo | ||
39 | + ufo.posY = UFOPOSY; // set vertical Position | ||
40 | + ufo.posX = SCREENWIDTH - UFOWIDTH;// set horizontal Position | ||
41 | +} | ||
42 | + | ||
43 | +/** | ||
44 | + * move ufo horizontally to position posX | ||
45 | + */ | ||
46 | +static void ufoMove(int posX) | ||
47 | +{ | ||
48 | + ufoClear(ufo.posX, ufo.posY); // clear sprite | ||
49 | + ufo.posX = posX; | ||
50 | + ufoRefresh(); | ||
51 | + ufoDisplay(ufo.posX, ufo.posY); | ||
52 | +} | ||
53 | + | ||
54 | + | ||
55 | +/** | ||
56 | + * move ufo and check if it reached the left screen border | ||
57 | + */ | ||
58 | +void ufoMoveLeft() | ||
59 | +{ | ||
60 | + // check if space between ufo and screen border is big enough | ||
61 | + if (ufo.posX > 1) { | ||
62 | + // desired movement is possible | ||
63 | + ufoMove(ufo.posX - 1); | ||
64 | + } else { | ||
65 | + ufoReset(); | ||
66 | + } | ||
67 | +} | ||
68 | + | ||
69 | +/** | ||
70 | + * check if the first screen line is free for the ufo and | ||
71 | + * display it randomly | ||
72 | + */ | ||
73 | +int ufoShowUfo() | ||
74 | +{ | ||
75 | + if (aliens.posY > 0 && fShowUfo == 0) { // aliens one line down | ||
76 | + if ((random() % 200) == 0) { | ||
77 | + fShowUfo = 1; | ||
78 | + } | ||
79 | + } | ||
80 | + | ||
81 | + return fShowUfo; | ||
82 | +} | ||
83 | + | ||
84 | +/** | ||
85 | + * check if ufo was hit by player and delete it from screen | ||
86 | + */ | ||
87 | +int ufoHitCheck(int shotX, int shotY) | ||
88 | +{ | ||
89 | + int fUfoWasHit = 0; | ||
90 | + | ||
91 | + // if shot reached vertikal position of ufo | ||
92 | + if (shotY == UFOPOSY) { | ||
93 | + // if shot hits ufo | ||
94 | + if (shotX >= ufo.posX && shotX <= ufo.posX + UFOWIDTH -1) { | ||
95 | + ufoReset(); | ||
96 | + fUfoWasHit = 1; | ||
97 | + } | ||
98 | + } | ||
99 | + | ||
100 | + return fUfoWasHit; | ||
101 | +} |
@@ -0,0 +1,49 @@ | @@ -0,0 +1,49 @@ | ||
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 | + | ||
27 | +#ifndef UFO | ||
28 | +#define UFO | ||
29 | + | ||
30 | +typedef struct Ufo Ufo; | ||
31 | + | ||
32 | +struct Ufo { | ||
33 | + int posX; // horizontal position of aliens | ||
34 | + int posY; // vertical position of aliens | ||
35 | +}; | ||
36 | + | ||
37 | +Ufo ufo; | ||
38 | + | ||
39 | +void ufoReset(); | ||
40 | +int ufoShowUfo(); | ||
41 | +void ufoMoveLeft(); | ||
42 | +int ufoHitCheck(int shotX, int shotY); | ||
43 | + | ||
44 | +// methods that handle graphic display, from view.c | ||
45 | +extern void ufoDisplay(int x, int y); | ||
46 | +extern void ufoRefresh(); | ||
47 | +extern void ufoClear(int x, int y); | ||
48 | + | ||
49 | +#endif |
@@ -0,0 +1,589 @@ | @@ -0,0 +1,589 @@ | ||
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 | + |
@@ -0,0 +1,78 @@ | @@ -0,0 +1,78 @@ | ||
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 <ncurses.h> | ||
26 | +#include <unistd.h> | ||
27 | +#include <signal.h> | ||
28 | + | ||
29 | +#ifndef VIEW | ||
30 | +#define VIEW | ||
31 | + | ||
32 | +#include "globals.h" | ||
33 | + | ||
34 | +#define SCREENHEIGHT 24 | ||
35 | +#define SCREENWIDTH 80 | ||
36 | + | ||
37 | +#define PLAYERWIDTH 5 | ||
38 | +#define PLAYERPOSY (SCREENHEIGHT-2) | ||
39 | + | ||
40 | +#define BUNKERWIDTH 80 | ||
41 | +#define BUNKERHEIGHT 4 | ||
42 | +#define BUNKERX 0 | ||
43 | +#define BUNKERY (SCREENHEIGHT-8) | ||
44 | + | ||
45 | +#define ALIENS_MAX_NUMBER_X 10 | ||
46 | +#define ALIENS_MAX_NUMBER_Y 5 | ||
47 | + | ||
48 | +#define UFOWIDTH 5 | ||
49 | +#define UFOPOSY 0 | ||
50 | + | ||
51 | + | ||
52 | +void graphicEngineInit(); | ||
53 | + | ||
54 | +void aliensClear(int x, int y, int wid, int hgt); | ||
55 | +void aliensDisplay(int x, int y, int wid, int hgt); | ||
56 | +void aliensMissileClear(int x, int y); | ||
57 | +void aliensMissileDisplay(int x, int y); | ||
58 | +void aliensRefresh(int level, int *pAliens); | ||
59 | +void battleFieldClear(); | ||
60 | +void bunkersClear(); | ||
61 | +void bunkersClearElement(int x, int y); | ||
62 | +void bunkersDisplay(int *pBunker); | ||
63 | +void gameOverDisplay(); | ||
64 | +void playerClear(int x, int y); | ||
65 | +void playerDisplay(int x, int y); | ||
66 | +void playerExplosionDisplay(int x, int y); | ||
67 | +void playerMissileClear(int x, int y); | ||
68 | +void playerMissileDisplay(int x, int y); | ||
69 | +void titleScreenClear(); | ||
70 | +void titleScreenDisplay(); | ||
71 | +void ufoClear(int x, int y); | ||
72 | +void ufoDisplay(int x, int y); | ||
73 | +void ufoRefresh(); | ||
74 | + | ||
75 | +void statusDisplay(int level, int score, int lives); | ||
76 | +void refreshScreen(); | ||
77 | + | ||
78 | +#endif |
No preview for this file type
@@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
1 | +-----BEGIN PGP SIGNED MESSAGE----- | ||
2 | +Hash: SHA1 | ||
3 | + | ||
4 | +Format: 1.0 | ||
5 | +Source: ninvaders | ||
6 | +Binary: ninvaders | ||
7 | +Architecture: any | ||
8 | +Version: 0.1.1-3 | ||
9 | +Maintainer: Matthew Palmer <mpalmer@debian.org> | ||
10 | +Standards-Version: 3.9.1 | ||
11 | +Build-Depends: debhelper (>= 7), libncurses5-dev | ||
12 | +Checksums-Sha1: | ||
13 | + 5ab825694b108cbfa988377ca216188fa9a76e89 31275 ninvaders_0.1.1.orig.tar.gz | ||
14 | + 38760243b3404fecb143f1b372f7c2cad76696f2 12831 ninvaders_0.1.1-3.diff.gz | ||
15 | +Checksums-Sha256: | ||
16 | + bfbc5c378704d9cf5e7fed288dac88859149bee5ed0850175759d310b61fd30b 31275 ninvaders_0.1.1.orig.tar.gz | ||
17 | + 30297a890afd6ea21b11c514d55ebbfe26ab5e9dcbee3499f0f223a3fd52de4c 12831 ninvaders_0.1.1-3.diff.gz | ||
18 | +Files: | ||
19 | + 97b2c3fb082241ab5c56ab728522622b 31275 ninvaders_0.1.1.orig.tar.gz | ||
20 | + 56a98ddce225b5f9f9302f64209916f0 12831 ninvaders_0.1.1-3.diff.gz | ||
21 | + | ||
22 | +-----BEGIN PGP SIGNATURE----- | ||
23 | +Version: GnuPG v1.4.9 (GNU/Linux) | ||
24 | + | ||
25 | +iD8DBQFMqpNMBEnrTWk1E4cRAl63AJ0bMEmA1mEyY2qE/1FJ5MPJ0wnppQCgo8F0 | ||
26 | +fPFphbmDT6OBCUb7xtk++QQ= | ||
27 | +=AcHr | ||
28 | +-----END PGP SIGNATURE----- |
No preview for this file type