--- /dev/null
+
+****** Release 0.1.1 ******
+
+2003-04-22 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * globas.c: changed version from 0.0.11 to 0.1.1
+
+2003-05-06 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * aliens.c (aliensMissileMove): added test if there is an alien
+ ship left when starting a new missile; this was the bug which is
+ responsible for freezing the game when shooting at the last alien
+
+2003-05-05 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * nInvaders.c (readInput): updated readInput for reading input in
+ different states (see status var)
+
+ * nInvaders.c (handleTimer): added code for status GAME_HIGHSCORE
+ so a title screen with animation is shown; updated status
+ GAME_OVER
+
+ * nInvaders.c (main): updated status initialisation from
+ GAME_NEXTLEVEL to GAME_HIGHSCORE
+
+ * view.c: added WINDOW wTitleScreen; added titleScreenInit; added
+ titleScreenDisplay; added titleScreenClear; added battleFieldClear
+
+ * view.c (aliensRefresh): formatted some code
+
+ * view.c (ufoRefresh): fixed array length
+
+ * view.c (gameOverDisplay): simpified function
+
+ * view.c (graphicEngineInit): updated with titleScreenInit
+
+ * view.h: sorted function declarations; updated gameOverDisplay,
+ titleScreenClear, titleScreenDisplay and battleFieldClear
+
+2003-04-22 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * globals.c (doSleep): added again. still needed in
+ view.c. added "#ifdef win32" instruction again.
+
+2003-04-22 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * globals.c (doSleep): deleted method. not used any more.
+
+ * globals.c: incremented version number from 0.0.10 to 0.0.11
+
+ * globals.c: removed '#ifdef win32' instruction.
+
+ * *.c, *.h: added license notice to each file
+
+ * renamed ToDo to TODO
+
+2003-04-18 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * nInvaders.c (finish): "barely mediocre" and "show promise"
+ both "< 10000". Changed latter to "< 12500"
+
+2003-04-17 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * view.c (statusDisplay): modified so that buffer is written
+ to wBattleField. new variable WINDOW* wStatus. added method
+ (statusInit) which does initialisation of WINDOW wStatus.
+ Problem: Alien missiles go right to the bottom of screen,
+ where status is located and overwritten with missile sprite.
+ Fix: see next point
+ Changed behaviour of display of lives. Now the _remaining_
+ lives are displayed. i.e. at the beginning you will see
+ two little spaceshuttles, because you have two lives left.
+
+ * aliens.c (aliensMissileMove): added some checking, if missile
+ reached bottom where player moves. if so, do not move further
+ and reload missile. this reduces number of missiles which have
+ to be hit-tested each round, yet made it necessary to change
+ the shot-threshold otherwise too many missiles would have been
+ coming down. Not limiting ALIENS_MAX_MISSILES from 50 to 10 is
+ possible, because missiles are reloaded when they reach the
+ bottom. 10 concurrent missiles should be quite hard to manage..
+ Removed ALIENS_MAX_MISSILES-definition from view.h. Was defined
+ twice, now only in aliens.h.
+ optimized threshold-checking. calculation outside for-
+ instruction, and only comparison within.
+
+
+2003-04-17 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * nInvaders.c (readInput): removed (ch==27) for exit
+ sequence. as dettus pointed out there would be problems
+ on some terminals. pressing some keys too long will send
+ an KEY_ESC and quit the game.
+
+2003-04-17 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * nInvaders.c (setUpTimer): changed method to call handleTimer.
+ The call signal(SIG_ALRM, handleTimer) didn't work on irix.
+ There, the timer was only fired once and then the programm
+ exited. Now using call to sigaction() with flag SA_RESTART.
+
+2003-04-16 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * nInvaders.c: added a real-time timer that does 50 fps. if you
+ want it slower toggle the constant FPS. the higher the slower.
+ A timer is created and does all the gaming stuff while key
+ checking is still done in (main). Gamehandling is done by
+ simulating a deterministic finite automaton by setting the
+ 'status'-attribute to e.g. GAME_LOOP, GAME_PAUSED, GAME_EXIT.
+ the following methods were modified/ added:
+ (setUpTimer): creates and initializes timer
+ (handleTimer): this method is called every 1/FPS seconds and
+ contains most code from old (main)
+ (readInput): changed so that the 'status'-variable is affected.
+ pressing of 'p' now changes 'status'
+ (main): most code moved to (handleTimer), calls setUpTimer and
+ sets 'status' to GAME_NEXTLEVEL
+ (gameOver): completely moved to handleTimer
+
+ * view.c (graphicEngineInit): removed 'timeout(0);' no longer
+ needed as we now hava a timer. another advantage: call to
+ (readInput) in nInvaders.c no longer called permanently.
+ in (readInput) the getch()-call waits till a key is pressed.
+ doSleep(1) no longer needed in nInvaders.c (readInput).
+
+2003-04-08 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * ufo.c:replaced 'u' with 'ufo' (see ufo.h) and 'a' with 'aliens'
+
+ * ufo.h: added typedef for Ufo and renamed 'u' into 'ufo',
+
+ * player.c: added typedef for Player and renamed 'p' into 'player',
+ replaced 'p' with 'player and 'a' with 'aliens'
+
+ * aliens.c: replaced 'a' with 'aliens' (see aliens.h)
+
+ * aliens.h: added typedef for Aliens and renamed 'a' into 'aliens'
+
+ * globals.c (RELEASE): updated release number
+
+2003-04-07 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * view.c (ufoRefresh): reverted 'frame' assignement
+
+ * nInvaders.c (main): reverted to old ufo speed from revision 1.3
+
+2003-04-06 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * nInvaders.c (resetPlayer): added a call to playerMisisleClear();
+
+ * view.c (aliensRefresh): fully encapsulated. access to aliens-Array
+ by pointer.
+
+ * aliens.c (*HitCheck): moved hit_alien_test and hit_bunker_test to
+ aliens.c and renamed to aliensHitCheck and bunkersHitCheck. Added
+ comments and did improvement of bunkersHitCheck-Algorithm
+ (shoty < BUNKERY + BUNKERHEIGHT instead of <=).
+
+ * nInvaders.c (finish): moved short version of GPL to globals.c
+ (showGplShort)
+
+ * view.c (gameOverInit): fixed color code
+
+ * player.h: removed lives from structPlayer. This variable belongs
+ more to the gamehandling in nInvaders.c that to the model of the
+ player in player.c. This is done because of better encapsulation
+ of player.c.
+
+ * player.c (playerReset): added a playerDisplay. Removed playerDisplay
+ from nInvaders.c just before refreshScreen() and added another
+ playerDisplay in the player.c (playerMissileMove) so that the
+ playerMissileClear does not clear the middle of the player when
+ a new shot is fired.
+
+ * aliens.c (aliensHitCheck): added support for return of alienType so
+ that different scoring according to type of aliens is possible.
+ had to change values für alien_type constants in nInvaders.h and
+ the order of scores in the points-array in nInvaders.c (doScoring).
+ ufo gets 500pt, aliens 100pt, 150pt or 200pt.
+
+ * aliens.c (aliensReset): clears missiles of aliens, if any
+
+ * nInvaders.c (main): changed some variable names (*_counter) and
+ contracted some if-statements.
+
+ * view.c (playerExplosionDisplay): renamed from playerExplode. Added
+ player.c (playerExplode) which calls playerExplosionDisplay and
+ playerDisplay. Thus, I could remove the playerExplode(p.posX, p.posY)
+ from nInvaders.c and add a playerExplode(). All Elements of the
+ structure structPlayer now are "private".
+
+
+2003-04-05 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * Makefile: Updated file for ufo
+
+ * aliens.c (aliensMissileMove): fixed comment
+
+ * aliens.h: fixed indentation
+
+ * globals.h: fixed indentation
+
+ * nInvaders.c: included ufo.h, fixed some comments and linebreaks
+
+ * nInvaders.c (initlevel): added initialisation for ufo
+
+ * nInvaders.c (main): added code for ufo
+
+ * nInvaders.c (doScoring): different score for different alien types
+
+ * nInvaders.h: added constants for alien types needed by
+ nInvaders.c (doScoring), fixed declaration of doScoring, fixed
+ Indentation
+
+ * player.c: included ufo.h (needed for playerMoveMissile)
+
+ * player.c (playerMoveMissile): added code needed for ufo, fixed
+ doScoring for alien type
+
+ * player.h: fixed indentation, fixed declaration of doScoring
+
+ * view.c: added WINDOW *wUfo, void ufoRefresh, static void ufoInit,
+ void ufoDisplay and void ufoClear
+
+ * view.c (aliensRefresh): fixed indentation and color codes
+
+ * view.c (graphicEngineInit): added ufoInit to last init section
+
+ * view.h: fixed indentation, added constans UFOWIDTH and UFOPOSY, added
+ declarations of ufoDisplay, ufoRefresh and ufoClear
+
+ * ufo.c: files for ufo handling (initial import into cvs)
+
+ * ufo.h: header file for ufo.c (initial import into cvs)
+
+2003-04-04 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * nInvaders.h, player.c: updated every occurance of hit_player_test
+ to hit_alientest
+
+ * nInvaders.c (hit_alien_test): renamed from 'hit_player_test'
+
+2003-04-05 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * [view.c] (bunkersDisplay): now fully encapsulated using pointer
+ *pBunker to get access to bunker-array. Method is called from
+ [aliens.c] (bunkersReset) instead of [aliens.c] (render) thus
+ saving some cpu-time. The bunker has to be displayed only at the
+ beginning of a new level. Then we use bunkerClearElement or
+ bunkerClear to remove bunker elements. No need why it was in
+ [aliens.c] (render).
+
+2003-04-04 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * nInvaders.c (readInput): draw new number of lives in live-cheat
+
+ * aliens.c (aliensReset): put declaration of 'level' at
+ beginning of function
+
+2003-04-04 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * [nInvaders.c] added a new cheat: "L" gives player one new life
+ for better testing
+ * [aliens.c, player.c] (*Reset) forgot to reset alien-block and
+ bunkers-block. Now there is a bunkersReset in aliens.c
+ * [view.c] added method graphicEngineInit()
+ * [view.c] (refreshScreen) fixed problem with graphic display on some
+ terminals. bunker and player are now displayed at startup.
+ * removed init.c and init.h from project
+ * [globals.c] some minor changes to names of methods. moved code for
+ displaying version from nInvaders.c to globals.c. Added code to
+ redefine usleep for WIN32-platforms, this should hopefully fix the
+ bug that the game was too fast there.
+
+2003-04-03 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * removed deprecated multi-line-strings in globals.c and nInvaders.c
+
+2003-04-02 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * view.c now contains all methods which do graphical display
+ (by using ncurses)
+
+ * added file aliens.c and aliens.h. Perhaps these can later melt
+ with player.c and player.h.
+
+2003-04-01 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * *.c (*): formatted with 'indent -kr -i8 -l90' and fixed
+ some linebreaks
+
+2003-03-30 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * added file "ToDo": put feature-requests and alike in here
+
+ * player.c (player*Missile*): processing of missiles moved to these
+ functions to reduce size of main().
+
+
+2003-03-29 Sebastian Gutsfeld <segoh@gmx.net>
+
+ * init.c (initplayer): fixed comment
+
+ * player.c (playerInit): put declaration of 'playerSprite' at beginning
+ of function
+
+ * init.c (initshots): put declaration of 'a' at beginning of function
+
+2003-03-29 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * added more comments and added player.c which is intended to hold all
+ functions concearning the player
+
+ * added method playerLaunchMissile in player.c
+
+2003-03-28 Alexander Hollinger <alexander.hollinger@gmx.net>
+
+ * added some comments and split up some functions, especially in init.c.
+
+
--- /dev/null
+CC=gcc
+CFLAGS=-O3 -Wall
+LIBS=-lncurses
+
+CFILES=globals.c view.c aliens.c ufo.c player.c nInvaders.c
+HFILES=globals.h view.h aliens.h ufo.h player.h nInvaders.h
+OFILES=globals.o view.o aliens.o ufo.o player.o nInvaders.o
+all: nInvaders
+
+nInvaders: $(OFILES) $(HFILES)
+ $(CC) $(LDFLAGS) -o$@ $(OFILES) $(LIBS)
+
+.c.o:
+ $(CC) -c -I. $(CFLAGS) $(OPTIONS) $<
+clean:
+ rm -f nInvaders $(OFILES)
--- /dev/null
+*** nInvaders
+*** (C)opyleft 2k2 by dettus
+*** dettus@matrixx-bielefeld.de
+
+Hello and welcome to nInvaders! Right now you are earth's only hope to save
+it from alien invaders from space. Make your job, and make it good, mankind
+believes in you...
+
+1. INSTALLING
+-------------
+Compiling and installing should be really straightforward, just type in
+"make" on your command prompt and you'll get the binary file. If not, please
+edit the makefile. Once you have compiled it, copy it (as root) to your
+/usr/bin directory, or /usr/local/games, or just run it by typeing
+./nInvaders.
+
+2. REQUIREMENTS
+---------------
+nInvaders is known to compile and run on Solaris, Linux and OpenBSD. On all of
+them were ncurses 5.2 installed. If you are capable of running it on other
+platforms, tell me!
+
+3. CONTROL KEYS
+---------------
+Controlling nInvaders is really simple. Just press the cursor left/right keys
+to move it left or right, and press space to fire. The esc-key lets you quit
+at any time you want.
+
+4. COMMAND LINE OPTIONS
+-----------------------
+nInvaders accepts the following command line options
+-l x where x is your skill as a number between 0(nightmare) and 9(may i play
+ daddy)
+-gpl prints out the license information.
+
+Any other option gives you a help screen.
+
+5. LICENSING
+------------
+nInvaders is protected under the laws of the GPL and other countries. Any re-
+distribution, reselling or copying is strictly allowed. You should have received
+a copy of it with this package, if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+Or just start nInvaders with the -gpl option to learn more.
+
+6. GREETZ
+---------
+hello mom, hello dad, hello katja, hello there, hello elitza, hello wizzard,
+hello walli, hello melanie, hello judith, hello you folks at freshmeat, hello
+skyper, hello gamma, hello sunfreeware, hello abuse, hello linus, hello alan,
+hello herr von boedefeld, hello god, hello world.
+and thank you Mike Saarna for adding ANIMATION!
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include "aliens.h"
+#include "player.h"
+#include "nInvaders.h"
+
+/**
+ * initialize aliens attributes
+ */
+void aliensReset()
+{
+ int i,j;
+
+ // three different types of aliens [5], [10]
+ int level[ALIENS_MAX_NUMBER_Y][ALIENS_MAX_NUMBER_X]={
+ {1,1,1,1,1,1,1,1,1,1},
+ {2,2,2,2,2,2,2,2,2,2},
+ {2,2,2,2,2,2,2,2,2,2},
+ {3,3,3,3,3,3,3,3,3,3},
+ {3,3,3,3,3,3,3,3,3,3}
+ };
+
+ aliensClear(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // clear old position of aliens
+
+ // reset alien position
+ aliens.posX = 0;
+ aliens.posY = 0;
+ aliens.right = 0;
+ aliens.bottom = 0;
+ aliens.left = 0;
+ aliens.speed = 1;
+
+ // copy level-array to enemy-array
+ for (i=0;i<ALIENS_MAX_NUMBER_X;i++) {
+ for (j=0;j<ALIENS_MAX_NUMBER_Y;j++) {
+ alienBlock[j][i]=level[j][i];
+ }
+ }
+
+ // reset missiles
+ for (i = 0; i < ALIENS_MAX_MISSILES; i++) {
+ if (alienshotx[i] != 0) {
+ aliensMissileClear(alienshotx[i],alienshoty[i]); // clear old position
+ }
+ alienshotx[i] = 0; // start with zero values
+ alienshoty[i] = 0; // start with zero values
+ }
+ alienshotnum = 1; // one missile at the same time
+ alienshotx[0] = 5; // x position of first alienshot
+ alienshoty[0] = 1; // y position of first alienshot
+
+}
+
+/**
+ * initialize bunkers attributes
+ */
+void bunkersReset()
+{
+ int a, b;
+
+ // set position of bunker sprites. user graphical char bunkerd for better visual overview
+ // and set according to this the bunker-array
+ char bunkerd[BUNKERHEIGHT][BUNKERWIDTH+1] = {
+ " ### ### ### ### ",
+ " ##### ##### ##### ##### ",
+ " ####### ####### ####### ####### ",
+ " ## ## ## ## ## ## ## ## "
+ };
+ // 12345678901234567890123456789012345678901234567890123456789012345678901234567890
+ // 80 characters wide
+
+ // copy graphical "bunkerd" to binary "bunker"
+ for (a = 0; a < BUNKERWIDTH; a++) {
+ for (b = 0; b < BUNKERHEIGHT; b++) {
+ if (bunkerd[b][a] == '#')
+ bunker[b][a] = 1;
+ else
+ bunker[b][a] = 0;
+ }
+ }
+
+ // display bunkers sprite
+ bunkersDisplay(&bunker[0][0]);
+}
+
+/**
+ * move aliens and test if they've reached the
+ * bottom of the windows or the bunkers.
+ */
+int aliensMove()
+{
+
+ int cx,cy;
+ int fReachedPlayer=0; // return value
+
+ render();
+ aliensClear(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // clear old position of aliens
+
+ aliens.posX = aliens.posX + aliens.speed; // move aliens left/ right
+
+ // when aliens reached left or right screen-border
+ if (aliens.posX == (BUNKERWIDTH + BUNKERX - 5 - aliens.right) || aliens.posX == (BUNKERX + aliens.left)) {
+
+ aliens.posY++; // move aliens downwards
+
+ // aliens reached player
+ if (aliens.posY == SCREENHEIGHT - 2 - aliens.bottom) {
+ fReachedPlayer = 1; // set return value
+ }
+
+ // aliens reached bunkers //funzt nicht ganz: todo
+ if (aliens.posY == BUNKERY - aliens.bottom) {
+ // clear bunkers
+ for(cx=0;cx<BUNKERWIDTH;cx++) {
+ for(cy=0;cy<BUNKERHEIGHT;cy++) {
+ bunker[cy][cx]=0;
+ }
+ }
+ bunkersClear(); // clear bunkers sprites
+ }
+
+ aliens.speed = aliens.speed * (-1); // change direction of aliens' movements
+ }
+
+ aliensDisplay(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // display aliens at new position
+
+ return fReachedPlayer; // return if aliens reached player
+}
+
+
+/**
+ * display alien animation, display remaining parts of aliens and bunker
+ */
+void render()
+{
+ int k,row;
+ int c=0;
+
+ // calculate left, right, bottom, lowest_ship
+ aliens.left=1;
+ aliens.right=-1;
+ aliens.bottom=-1;
+ shipnum=0;
+ for (k=0;k<11;k++) {
+ lowest_ship[k]=-1;
+ }
+
+ for (row=0;row<ALIENS_MAX_NUMBER_Y*2;row++) {
+ if ((row%2)==0){
+ for (k=0;k<ALIENS_MAX_NUMBER_X;k++) {
+ if (alienBlock[c][k] != 0) {
+ lowest_ship[k]=row;
+ shipnum++;
+ if (aliens.left==1 || -k>aliens.left) {aliens.left=-k;}
+ if (aliens.right==-1 || k>aliens.right) {aliens.right=k;}
+ if (aliens.bottom==-1 || c>aliens.bottom) {aliens.bottom=c;}
+ }
+ }
+ } else {
+ c++;
+ }
+ }
+ aliens.bottom=aliens.bottom*2; // every 2nd row is an empty row
+ aliens.left=aliens.left*3; // alien sprite is 3 chars wide
+ aliens.right=aliens.right*3; // alien sprite is 3 chars wide
+
+ // display remaining aliens with animation
+ aliensRefresh(level, &alienBlock[0][0]);
+
+}
+
+
+/**
+ * move aliens' missiles and do player/bunker hit testing
+ * a zero value in alienshotx indicates that the appropriate missile is loaded, but not fired
+ */
+int aliensMissileMove()
+{
+ int i, tmp;
+ int fPlayerWasHit = 0;
+ int shootThreshold;
+ static int alienshot_counter = 0;
+
+
+ // calculate threshold when next missile should be fired
+ // it is done here to save calculation time in for-instruction
+ shootThreshold = (skill_level * 8) * (shipnum + 2);
+ alienshot_counter = alienshot_counter + 10 ;
+
+ // loop all possible missiles
+ for (i = 0; i < ALIENS_MAX_MISSILES; i++) {
+
+ // if the current missile is flying we should do movements
+ if (alienshotx[i] != 0) {
+
+ aliensMissileClear(alienshotx[i],alienshoty[i]); // clear old position
+
+ // if missile hit the bunkers
+ if (bunkersHitCheck(alienshotx[i], alienshoty[i]) == 1) {
+ alienshotx[i] = 0; // value of zero reloads missile
+ }
+
+ alienshoty[i]++; // move missile downwards
+
+ // check if player was hit by an alien missile
+ if (playerHitCheck(alienshotx[i], alienshoty[i]) == 1) {
+ alienshotx[i] = 0; // value of zero reloads missile
+ fPlayerWasHit = 1;
+ }
+
+
+ } else { // missile not launched yet
+
+ // start new missile if counter says so
+ if (alienshot_counter > shootThreshold && shipnum > 0) {// only shot if there's an alien left
+ alienshot_counter = 0; // reset counter
+ tmp = random() % ALIENS_MAX_NUMBER_X; // randomly select one of the ...
+ while (lowest_ship[tmp] == -1) { // ...aliens at the bottom of ...
+ tmp = random() % ALIENS_MAX_NUMBER_X; // ...a column to launch missile
+ }
+ alienshoty[i]=aliens.posY+lowest_ship[tmp]; // set y position of missile
+ alienshotx[i]=aliens.posX+tmp*3; // set x position of missile
+ }
+ } // if
+
+ // display missiles if still running or just launched; could have been modified in the above code
+ if (alienshotx[i] != 0) {
+ // if missile is out of battlefield
+ if (alienshoty[i] == SCREENHEIGHT - 1) {
+ alienshotx[i] = 0; // reload missile
+ } else {
+ aliensMissileDisplay(alienshotx[i], alienshoty[i]); // display Missile at new position
+ }
+ }
+
+ } // for
+
+
+ return fPlayerWasHit;
+}
+
+
+
+/**
+ * check if missile hit an alien
+ */
+int aliensHitCheck(int shotx, int shoty)
+{
+ int alienType = 0;
+ int shipx, shipy;
+ // if missile is within alien-rectangle
+ if (shotx >= aliens.posX && shotx <= aliens.posX + ALIENS_MAX_NUMBER_X * 3 - 1
+ && shoty >= aliens.posY && shoty <= aliens.posY + (ALIENS_MAX_NUMBER_Y - 1) * 2) {
+ // calculate the ship that was hit
+ shipx = (shotx - aliens.posX) / 3;
+ shipy = (shoty - aliens.posY) / 2;
+ // if there is still a ship at this position
+ alienType = alienBlock[shipy][shipx];
+ if (alienType != 0) {
+ alienBlock[shipy][shipx] = 0; // delete alien ship
+ }
+ }
+ return alienType; // returns 0 if no alien was hit, else returns type-code of alien
+}
+
+/**
+ * check if missile hit an element of bunker
+ */
+int bunkersHitCheck(int shotx, int shoty)
+{
+ int adjx, adjy;
+ int fBunkerWasHit = 0;
+ // if missile is within bunker-rectangle
+ if (shotx >= BUNKERX && shotx < BUNKERX + BUNKERWIDTH
+ && shoty >= BUNKERY && shoty < BUNKERY + BUNKERHEIGHT) {
+ // calculate the element of the bunker that was hit
+ adjy = shoty - BUNKERY;
+ adjx = shotx - BUNKERX;
+ // if there is still an element
+ if(bunker[adjy][adjx] == 1){
+ bunker[adjy][adjx] = 0; // delete element
+ fBunkerWasHit = 1; // bunker was hit!
+ }
+ }
+ return fBunkerWasHit;
+}
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include "view.h"
+
+#ifndef ALIENS
+#define ALIENS
+
+typedef struct Aliens Aliens;
+
+struct Aliens {
+ int posX; // horizontal position of aliens
+ int posY; // vertical position of aliens
+ int right;
+ int left;
+ int bottom;
+ int speed; // 0: no movement; 1: one per turn; etc.
+};
+
+Aliens aliens;
+
+int shipnum;
+
+#define ALIENS_MAX_NUMBER_X 10
+#define ALIENS_MAX_NUMBER_Y 5
+#define ALIENS_MAX_MISSILES 10
+
+// todo: move to structure
+int lowest_ship[ALIENS_MAX_NUMBER_X];
+int alienshotx[ALIENS_MAX_MISSILES];
+int alienshoty[ALIENS_MAX_MISSILES];
+int alienshotnum;
+int alienBlock[ALIENS_MAX_NUMBER_Y][ALIENS_MAX_NUMBER_X];
+
+int bunker[BUNKERHEIGHT][BUNKERWIDTH + 1];
+
+
+void aliensReset();
+void bunkersReset();
+int aliensMove();
+int aliensMissileMove();
+void render();
+int aliensHitCheck(int shotx, int shoty);
+int bunkersHitCheck(int shotx, int shoty);
+
+
+// methods that handle graphic display, from view.c
+extern void aliensDisplay(int x, int y, int wid, int hgt);
+extern void aliensClear(int x, int y, int wid, int hgt);
+extern void aliensRefresh(int level, int *pAliens);
+extern void aliensMissileDisplay(int x, int y);
+extern void aliensMissileClear(int x, int y);
+extern void bunkersClearElement(int x, int y);
+extern void bunkersClear();
+extern void bunkersRefresh();
+
+#endif
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include <stdio.h>
+#include <unistd.h>
+#include "globals.h"
+
+
+#define MAJOR 0
+#define MINOR 1
+#define RELEASE 1
+
+
+
+#ifdef WIN32
+#define usleep(x) Sleep(x/1000)
+#endif
+
+
+/**
+ * sleep for specified time
+ */
+void doSleep(int microseconds)
+{
+ usleep(microseconds);
+}
+
+
+/**
+ * show version information
+ */
+void showVersion()
+{
+ fprintf(stderr, "*** nInvaders %i.%i.%i\n", MAJOR, MINOR, RELEASE);
+ fprintf(stderr, "*** (C)opyleft 2k2 by Dettus\n");
+ fprintf(stderr, "*** dettus@matrixx-bielefeld.de\n");
+ fprintf(stderr, "Additional code by Mike Saarna,\n");
+ fprintf(stderr, "Sebastian Gutsfeld -> segoh@gmx.net,\n");
+ fprintf(stderr, "Alexander Hollinger -> alexander.hollinger@gmx.net and\n");
+ fprintf(stderr, "Matthias Thar -> hiast2@compuserve.de\n");
+}
+
+
+/**
+ * show usage of command line parameters
+ */
+void showUsage()
+{
+
+ fprintf(stderr, "\n\nUsage: nInvaders [-l skill] [-gpl]\n");
+ fprintf(stderr, " where -l 0=NIGHTMARE\n");
+ fprintf(stderr, " -l 1=okay\n");
+ fprintf(stderr, " -l 9=May I play daddy?!\n");
+ fprintf(stderr, "\n -gpl shows you the license file\n");
+}
+
+
+/**
+ * wait for input of return to continue
+ */
+void waitForReturn()
+{
+ char b[2];
+ fprintf(stderr, "...Please press <Enter> to read on...");
+ fgets(b, sizeof(b), stdin);
+}
+
+/**
+ * show short version of Gnu GPL
+ */
+void showGplShort()
+{
+ fprintf(stderr,"\n");
+ fprintf(stderr,"This program is free software; you can redistribute it and/or modify\n");
+ fprintf(stderr,"it under the terms of the GNU General Public License as published by\n");
+ fprintf(stderr,"the Free Software Foundation; either version 2 of the License, or\n");
+ fprintf(stderr,"(at your option) any later version.\n");
+ fprintf(stderr,"\n");
+ fprintf(stderr,"This program is distributed in the hope that it will be useful,\n");
+ fprintf(stderr,"but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf(stderr,"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf(stderr,"GNU General Public License for more details.\n");
+ fprintf(stderr,"\n");
+ fprintf(stderr,"You should have received a copy of the GNU General Public License\n");
+ fprintf(stderr,"along with this program; if not, write to the Free Software\n");
+ fprintf(stderr,"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n");
+ fprintf(stderr,"\n");
+ fprintf(stderr,"Use the -gpl command line switch to see the full license of this program\n");
+ fprintf(stderr,"Use the -help command line switch to see who wrote this program \n");
+ fprintf(stderr,"\n");
+}
+
+/**
+ * show GNU GENERAL PUBLIC LICENSE
+ */
+void showGpl()
+{
+ fprintf(stderr, "\n");
+ fprintf(stderr, " GNU GENERAL PUBLIC LICENSE\n");
+ fprintf(stderr, " Version 2, June 1991\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n");
+ fprintf(stderr, " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n");
+ fprintf(stderr, " Everyone is permitted to copy and distribute verbatim copies\n");
+ fprintf(stderr, " of this license document, but changing it is not allowed.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " Preamble\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " The licenses for most software are designed to take away your\n");
+ fprintf(stderr, "freedom to share and change it. By contrast, the GNU General Public\n");
+ fprintf(stderr, "License is intended to guarantee your freedom to share and change free \n");
+ fprintf(stderr, "software--to make sure the software is free for all its users. This\n");
+ fprintf(stderr, "General Public License applies to most of the Free Software\n");
+ fprintf(stderr, "Foundation's software and to any other program whose authors commit to\n");
+ fprintf(stderr, "using it. (Some other Free Software Foundation software is covered by\n");
+ fprintf(stderr, "the GNU Library General Public License instead.) You can apply it to\n");
+ fprintf(stderr, "your programs, too.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " When we speak of free software, we are referring to freedom, not\n");
+ fprintf(stderr, "price. Our General Public Licenses are designed to make sure that you\n");
+ fprintf(stderr, "have the freedom to distribute copies of free software (and charge for\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "this service if you wish), that you receive source code or can get it\n");
+ fprintf(stderr, "if you want it, that you can change the software or use pieces of it\n");
+ fprintf(stderr, "in new free programs; and that you know you can do these things.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " To protect your rights, we need to make restrictions that forbid\n");
+ fprintf(stderr, "anyone to deny you these rights or to ask you to surrender the rights.\n");
+ fprintf(stderr, "These restrictions translate to certain responsibilities for you if you\n");
+ fprintf(stderr, "distribute copies of the software, or if you modify it.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " For example, if you distribute copies of such a program, whether\n");
+ fprintf(stderr, "gratis or for a fee, you must give the recipients all the rights that\n");
+ fprintf(stderr, "you have. You must make sure that they, too, receive or can get the\n");
+ fprintf(stderr, "source code. And you must show them these terms so they know their\n");
+ fprintf(stderr, "rights.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " We protect your rights with two steps: (1) copyright the software, and\n");
+ fprintf(stderr, "(2) offer you this license which gives you legal permission to copy,\n");
+ fprintf(stderr, "distribute and/or modify the software.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " Also, for each author's protection and ours, we want to make certain\n");
+ fprintf(stderr, "that everyone understands that there is no warranty for this free\n");
+ fprintf(stderr, "software. If the software is modified by someone else and passed on, we\n");
+ fprintf(stderr, "want its recipients to know that what they have is not the original, so\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "that any problems introduced by others will not reflect on the original\n");
+ fprintf(stderr, "authors' reputations.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " Finally, any free program is threatened constantly by software\n");
+ fprintf(stderr, "patents. We wish to avoid the danger that redistributors of a free\n");
+ fprintf(stderr, "program will individually obtain patent licenses, in effect making the\n");
+ fprintf(stderr, "program proprietary. To prevent this, we have made it clear that any\n");
+ fprintf(stderr, "patent must be licensed for everyone's free use or not licensed at all.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " The precise terms and conditions for copying, distribution and\n");
+ fprintf(stderr, "modification follow.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " GNU GENERAL PUBLIC LICENSE\n");
+ fprintf(stderr, " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 0. This License applies to any program or other work which contains\n");
+ fprintf(stderr, "a notice placed by the copyright holder saying it may be distributed\n");
+ fprintf(stderr, "under the terms of this General Public License. The 'Program', below,\n");
+ fprintf(stderr, "refers to any such program or work, and a 'work based on the Program'\n");
+ fprintf(stderr, "means either the Program or any derivative work under copyright law:\n");
+ fprintf(stderr, "that is to say, a work containing the Program or a portion of it,\n");
+ fprintf(stderr, "either verbatim or with modifications and/or translated into another\n");
+ fprintf(stderr, "language. (Hereinafter, translation is included without limitation in\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "the term 'modification'.) Each licensee is addressed as 'you'.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Activities other than copying, distribution and modification are not\n");
+ fprintf(stderr, "covered by this License; they are outside its scope. The act of\n");
+ fprintf(stderr, "running the Program is not restricted, and the output from the Program\n");
+ fprintf(stderr, "is covered only if its contents constitute a work based on the\n");
+ fprintf(stderr, "Program (independent of having been made by running the Program).\n");
+ fprintf(stderr, "Whether that is true depends on what the Program does.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 1. You may copy and distribute verbatim copies of the Program's\n");
+ fprintf(stderr, "source code as you receive it, in any medium, provided that you\n");
+ fprintf(stderr, "conspicuously and appropriately publish on each copy an appropriate\n");
+ fprintf(stderr, "copyright notice and disclaimer of warranty; keep intact all the\n");
+ fprintf(stderr, "notices that refer to this License and to the absence of any warranty;\n");
+ fprintf(stderr, "and give any other recipients of the Program a copy of this License\n");
+ fprintf(stderr, "along with the Program.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "You may charge a fee for the physical act of transferring a copy, and\n");
+ fprintf(stderr, "you may at your option offer warranty protection in exchange for a fee.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 2. You may modify your copy or copies of the Program or any portion\n");
+ fprintf(stderr, "of it, thus forming a work based on the Program, and copy and\n");
+ fprintf(stderr, "distribute such modifications or work under the terms of Section 1\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "above, provided that you also meet all of these conditions:\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " a) You must cause the modified files to carry prominent notices\n");
+ fprintf(stderr, " stating that you changed the files and the date of any change.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " b) You must cause any work that you distribute or publish, that in\n");
+ fprintf(stderr, " whole or in part contains or is derived from the Program or any\n");
+ fprintf(stderr, " part thereof, to be licensed as a whole at no charge to all third\n");
+ fprintf(stderr, " parties under the terms of this License.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " c) If the modified program normally reads commands interactively\n");
+ fprintf(stderr, " when run, you must cause it, when started running for such\n");
+ fprintf(stderr, " interactive use in the most ordinary way, to print or display an\n");
+ fprintf(stderr, " announcement including an appropriate copyright notice and a\n");
+ fprintf(stderr, " notice that there is no warranty (or else, saying that you provide\n");
+ fprintf(stderr, " a warranty) and that users may redistribute the program under\n");
+ fprintf(stderr, " these conditions, and telling the user how to view a copy of this\n");
+ fprintf(stderr, " License. (Exception: if the Program itself is interactive but\n");
+ fprintf(stderr, " does not normally print such an announcement, your work based on\n");
+ fprintf(stderr, " the Program is not required to print an announcement.)\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "These requirements apply to the modified work as a whole. If\n");
+ fprintf(stderr, "identifiable sections of that work are not derived from the Program,\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "and can be reasonably considered independent and separate works in\n");
+ fprintf(stderr, "themselves, then this License, and its terms, do not apply to those\n");
+ fprintf(stderr, "sections when you distribute them as separate works. But when you\n");
+ fprintf(stderr, "distribute the same sections as part of a whole which is a work based\n");
+ fprintf(stderr, "on the Program, the distribution of the whole must be on the terms of\n");
+ fprintf(stderr, "this License, whose permissions for other licensees extend to the\n");
+ fprintf(stderr, "entire whole, and thus to each and every part regardless of who wrote it.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Thus, it is not the intent of this section to claim rights or contest\n");
+ fprintf(stderr, "your rights to work written entirely by you; rather, the intent is to\n");
+ fprintf(stderr, "exercise the right to control the distribution of derivative or\n");
+ fprintf(stderr, "collective works based on the Program.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "In addition, mere aggregation of another work not based on the Program\n");
+ fprintf(stderr, "with the Program (or with a work based on the Program) on a volume of\n");
+ fprintf(stderr, "a storage or distribution medium does not bring the other work under\n");
+ fprintf(stderr, "the scope of this License.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 3. You may copy and distribute the Program (or a work based on it,\n");
+ fprintf(stderr, "under Section 2) in object code or executable form under the terms of\n");
+ fprintf(stderr, "Sections 1 and 2 above provided that you also do one of the following:\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " a) Accompany it with the complete corresponding machine-readable\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, " source code, which must be distributed under the terms of Sections\n");
+ fprintf(stderr, " 1 and 2 above on a medium customarily used for software interchange; or,\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " b) Accompany it with a written offer, valid for at least three\n");
+ fprintf(stderr, " years, to give any third party, for a charge no more than your\n");
+ fprintf(stderr, " cost of physically performing source distribution, a complete\n");
+ fprintf(stderr, " machine-readable copy of the corresponding source code, to be\n");
+ fprintf(stderr, " distributed under the terms of Sections 1 and 2 above on a medium\n");
+ fprintf(stderr, " customarily used for software interchange; or,\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " c) Accompany it with the information you received as to the offer\n");
+ fprintf(stderr, " to distribute corresponding source code. (This alternative is\n");
+ fprintf(stderr, " allowed only for noncommercial distribution and only if you\n");
+ fprintf(stderr, " received the program in object code or executable form with such\n");
+ fprintf(stderr, " an offer, in accord with Subsection b above.)\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "The source code for a work means the preferred form of the work for\n");
+ fprintf(stderr, "making modifications to it. For an executable work, complete source\n");
+ fprintf(stderr, "code means all the source code for all modules it contains, plus any\n");
+ fprintf(stderr, "associated interface definition files, plus the scripts used to\n");
+ fprintf(stderr, "control compilation and installation of the executable. However, as a\n");
+ fprintf(stderr, "special exception, the source code distributed need not include\n");
+ fprintf(stderr, "anything that is normally distributed (in either source or binary\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "form) with the major components (compiler, kernel, and so on) of the\n");
+ fprintf(stderr, "operating system on which the executable runs, unless that component\n");
+ fprintf(stderr, "itself accompanies the executable.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "If distribution of executable or object code is made by offering\n");
+ fprintf(stderr, "access to copy from a designated place, then offering equivalent\n");
+ fprintf(stderr, "access to copy the source code from the same place counts as\n");
+ fprintf(stderr, "distribution of the source code, even though third parties are not\n");
+ fprintf(stderr, "compelled to copy the source along with the object code.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 4. You may not copy, modify, sublicense, or distribute the Program\n");
+ fprintf(stderr, "except as expressly provided under this License. Any attempt\n");
+ fprintf(stderr, "otherwise to copy, modify, sublicense or distribute the Program is\n");
+ fprintf(stderr, "void, and will automatically terminate your rights under this License.\n");
+ fprintf(stderr, "However, parties who have received copies, or rights, from you under\n");
+ fprintf(stderr, "this License will not have their licenses terminated so long as such\n");
+ fprintf(stderr, "parties remain in full compliance.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 5. You are not required to accept this License, since you have not\n");
+ fprintf(stderr, "signed it. However, nothing else grants you permission to modify or\n");
+ fprintf(stderr, "distribute the Program or its derivative works. These actions are\n");
+ fprintf(stderr, "prohibited by law if you do not accept this License. Therefore, by\n");
+ fprintf(stderr, "modifying or distributing the Program (or any work based on the\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Program), you indicate your acceptance of this License to do so, and\n");
+ fprintf(stderr, "all its terms and conditions for copying, distributing or modifying\n");
+ fprintf(stderr, "the Program or works based on it.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 6. Each time you redistribute the Program (or any work based on the\n");
+ fprintf(stderr, "Program), the recipient automatically receives a license from the\n");
+ fprintf(stderr, "original licensor to copy, distribute or modify the Program subject to\n");
+ fprintf(stderr, "these terms and conditions. You may not impose any further\n");
+ fprintf(stderr, "restrictions on the recipients' exercise of the rights granted herein.\n");
+ fprintf(stderr, "You are not responsible for enforcing compliance by third parties to\n");
+ fprintf(stderr, "this License.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 7. If, as a consequence of a court judgment or allegation of patent\n");
+ fprintf(stderr, "infringement or for any other reason (not limited to patent issues),\n");
+ fprintf(stderr, "conditions are imposed on you (whether by court order, agreement or\n");
+ fprintf(stderr, "otherwise) that contradict the conditions of this License, they do not\n");
+ fprintf(stderr, "excuse you from the conditions of this License. If you cannot\n");
+ fprintf(stderr, "distribute so as to satisfy simultaneously your obligations under this\n");
+ fprintf(stderr, "License and any other pertinent obligations, then as a consequence you\n");
+ fprintf(stderr, "may not distribute the Program at all. For example, if a patent\n");
+ fprintf(stderr, "license would not permit royalty-free redistribution of the Program by\n");
+ fprintf(stderr, "all those who receive copies directly or indirectly through you, then\n");
+ fprintf(stderr, "the only way you could satisfy both it and this License would be to\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "refrain entirely from distribution of the Program.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "If any portion of this section is held invalid or unenforceable under\n");
+ fprintf(stderr, "any particular circumstance, the balance of the section is intended to\n");
+ fprintf(stderr, "apply and the section as a whole is intended to apply in other\n");
+ fprintf(stderr, "circumstances.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "It is not the purpose of this section to induce you to infringe any\n");
+ fprintf(stderr, "patents or other property right claims or to contest validity of any\n");
+ fprintf(stderr, "such claims; this section has the sole purpose of protecting the\n");
+ fprintf(stderr, "integrity of the free software distribution system, which is\n");
+ fprintf(stderr, "implemented by public license practices. Many people have made\n");
+ fprintf(stderr, "generous contributions to the wide range of software distributed\n");
+ fprintf(stderr, "through that system in reliance on consistent application of that\n");
+ fprintf(stderr, "system; it is up to the author/donor to decide if he or she is willing\n");
+ fprintf(stderr, "to distribute software through any other system and a licensee cannot\n");
+ fprintf(stderr, "impose that choice.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "This section is intended to make thoroughly clear what is believed to\n");
+ fprintf(stderr, "be a consequence of the rest of this License.\n");
+ fprintf(stderr, " 8. If the distribution and/or use of the Program is restricted in\n");
+ fprintf(stderr, "certain countries either by patents or by copyrighted interfaces, the\n");
+ fprintf(stderr, "original copyright holder who places the Program under this License\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "may add an explicit geographical distribution limitation excluding\n");
+ fprintf(stderr, "those countries, so that distribution is permitted only in or among\n");
+ fprintf(stderr, "countries not thus excluded. In such case, this License incorporates\n");
+ fprintf(stderr, "the limitation as if written in the body of this License.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 9. The Free Software Foundation may publish revised and/or new versions\n");
+ fprintf(stderr, "of the General Public License from time to time. Such new versions will\n");
+ fprintf(stderr, "be similar in spirit to the present version, but may differ in detail to\n");
+ fprintf(stderr, "address new problems or concerns.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Each version is given a distinguishing version number. If the Program\n");
+ fprintf(stderr, "specifies a version number of this License which applies to it and 'any\n");
+ fprintf(stderr, "later version', you have the option of following the terms and conditions\n");
+ fprintf(stderr, "either of that version or of any later version published by the Free\n");
+ fprintf(stderr, "Software Foundation. If the Program does not specify a version number of\n");
+ fprintf(stderr, "this License, you may choose any version ever published by the Free Software\n");
+ fprintf(stderr, "Foundation.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 10. If you wish to incorporate parts of the Program into other free\n");
+ fprintf(stderr, "programs whose distribution conditions are different, write to the author\n");
+ fprintf(stderr, "to ask for permission. For software which is copyrighted by the Free\n");
+ fprintf(stderr, "Software Foundation, write to the Free Software Foundation; we sometimes\n");
+ fprintf(stderr, "make exceptions for this. Our decision will be guided by the two goals\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "of preserving the free status of all derivatives of our free software and\n");
+ fprintf(stderr, "of promoting the sharing and reuse of software generally.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " NO WARRANTY\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n");
+ fprintf(stderr, "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n");
+ fprintf(stderr, "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n");
+ fprintf(stderr, "PROVIDE THE PROGRAM 'AS IS' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n");
+ fprintf(stderr, "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n");
+ fprintf(stderr, "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n");
+ fprintf(stderr, "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n");
+ fprintf(stderr, "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n");
+ fprintf(stderr, "REPAIR OR CORRECTION.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n");
+ fprintf(stderr, "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n");
+ fprintf(stderr, "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n");
+ fprintf(stderr, "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n");
+ fprintf(stderr, "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n");
+ fprintf(stderr, "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n");
+ fprintf(stderr, "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n");
+ fprintf(stderr, "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "POSSIBILITY OF SUCH DAMAGES.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " END OF TERMS AND CONDITIONS\n");
+ fprintf(stderr, " How to Apply These Terms to Your New Programs\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " If you develop a new program, and you want it to be of the greatest\n");
+ fprintf(stderr, "possible use to the public, the best way to achieve this is to make it\n");
+ fprintf(stderr, "free software which everyone can redistribute and change under these terms.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " To do so, attach the following notices to the program. It is safest\n");
+ fprintf(stderr, "to attach them to the start of each source file to most effectively\n");
+ fprintf(stderr, "convey the exclusion of warranty; and each file should have at least\n");
+ fprintf(stderr, "the 'copyright' line and a pointer to where the full notice is found.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " <one line to give the program's name and a brief idea of what it does.>\n");
+ fprintf(stderr, " Copyright (C) <year> <name of author>\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " This program is free software; you can redistribute it and/or modify\n");
+ fprintf(stderr, " it under the terms of the GNU General Public License as published by\n");
+ fprintf(stderr, " the Free Software Foundation; either version 2 of the License, or\n");
+ fprintf(stderr, " (at your option) any later version.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " This program is distributed in the hope that it will be useful,\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf(stderr, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf(stderr, " GNU General Public License for more details.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " You should have received a copy of the GNU General Public License\n");
+ fprintf(stderr, " along with this program; if not, write to the Free Software\n");
+ fprintf(stderr, " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Also add information on how to contact you by electronic and paper mail.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "If the program is interactive, make it output a short notice like this\n");
+ fprintf(stderr, "when it starts in an interactive mode:\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " Gnomovision version 69, Copyright (C) year name of author\n");
+ fprintf(stderr, " Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n");
+ fprintf(stderr, " This is free software, and you are welcome to redistribute it\n");
+ fprintf(stderr, " under certain conditions; type `show c' for details.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "The hypothetical commands `show w' and `show c' should show the appropriate\n");
+ fprintf(stderr, "parts of the General Public License. Of course, the commands you use may\n");
+ fprintf(stderr, "be called something other than `show w' and `show c'; they could even be\n");
+ fprintf(stderr, "mouse-clicks or menu items--whatever suits your program.\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "You should also get your employer (if you work as a programmer) or your\n");
+ fprintf(stderr, "school, if any, to sign a 'copyright disclaimer' for the program, if\n");
+ fprintf(stderr, "necessary. Here is a sample; alter the names:\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n");
+ fprintf(stderr, " `Gnomovision' (which makes passes at compilers) written by James Hacker.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " <signature of Ty Coon>, 1 April 1989\n");
+ fprintf(stderr, " Ty Coon, President of Vice\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "This General Public License does not permit incorporating your program into\n");
+ fprintf(stderr, "proprietary programs. If your program is a subroutine library, you may\n");
+ fprintf(stderr, "consider it more useful to permit linking proprietary applications with the\n");
+ fprintf(stderr, "library. If this is what you want to do, use the GNU Library General\n");
+ fprintf(stderr, "Public License instead of this License.\n");
+ fprintf(stderr, "\n");
+
+ waitForReturn();
+
+}
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#ifndef GLOBALS
+#define GLOBALS
+
+extern void doSleep();
+
+extern void showUsage();
+extern void showVersion();
+extern void showGplShort();
+extern void showGpl();
+
+#endif
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include "nInvaders.h"
+#include "player.h"
+#include "aliens.h"
+#include "ufo.h"
+
+#define FPS 50
+
+int lives;
+long score;
+int status; // status handled in timer
+
+#define GAME_LOOP 1
+#define GAME_NEXTLEVEL 2
+#define GAME_PAUSED 3
+#define GAME_OVER 4
+#define GAME_EXIT 5
+#define GAME_HIGHSCORE 6
+
+
+
+
+/**
+ * initialize level: reset attributes of most units
+ */
+static void initLevel()
+{
+ playerReset();
+ aliensReset();
+ ufoReset();
+ bunkersReset();
+ render();
+ drawscore();
+}
+
+
+/**
+ * evaluate command line parameters
+ */
+static void evaluateCommandLine(int argc, char **argv)
+{
+
+ // -l : set skill level
+ if (argc == 3 && strcmp(argv[1], "-l") == 0) {
+ if (argv[2][0] >= '0' && argv[2][0] <= '9') {
+ skill_level = argv[2][0] - 48;
+ } else {
+ argc = 2;
+ }
+ }
+
+ // -gpl : show GNU GPL
+ if (argc == 2 && strcmp(argv[1], "-gpl") == 0) {
+ showGpl();
+ }
+
+ // wrong command line: show usage
+ if (argc == 2 || (argc == 3 && strcmp(argv[1], "-l") != 0)) {
+ showVersion();
+ showUsage();
+ exit(1);
+ }
+}
+
+
+static void finish(int sig)
+{
+ endwin();
+ showGplShort();
+
+ fprintf(stderr,"\n");
+ fprintf(stderr,"\n");
+ fprintf(stderr,"=========================================================================\n");
+ fprintf(stderr,"\n");
+
+ fprintf(stderr,"Final score: %7.7ld, Final level: %2.2d\nFinal rating... ",score,level);
+ if (lives>0)
+ fprintf(stderr,"Quitter\n\n");
+ else if(score<5000)
+ fprintf(stderr,"Alien Fodder\n\n");
+ else if(score<7500)
+ fprintf(stderr,"Easy Target\n\n");
+ else if(score<10000)
+ fprintf(stderr,"Barely Mediocre\n\n");
+ else if(score<12500)
+ fprintf(stderr,"Shows Promise\n\n");
+ else if(score<15000)
+ fprintf(stderr,"Alien Blaster\n\n");
+ else if(score<20000)
+ fprintf(stderr,"Earth Defender\n\n");
+ else if(score>19999)
+ fprintf(stderr,"Supreme Protector\n\n");
+
+ showVersion();
+ exit(0);
+}
+
+
+void drawscore()
+{
+ statusDisplay(level, score, lives);
+}
+
+
+/**
+ * reads input from keyboard and do action
+ */
+void readInput()
+{
+ int ch;
+ static int lastmove;
+
+ ch = getch(); // get key pressed
+
+ switch (status) {
+
+ case GAME_PAUSED:
+
+ if (ch == 'p') {
+ status = GAME_LOOP;
+ }
+ break;
+
+ case GAME_HIGHSCORE:
+
+ if (ch == ' ') {
+ titleScreenClear();
+ level = 0; // reset level
+ score = 0; // reset score
+ lives = 3; // restore lives
+ status = GAME_NEXTLEVEL;
+ } else if (ch == 'q') { // quit game
+ status = GAME_EXIT;
+ }
+ break;
+
+ case GAME_OVER:
+ break; // don't do anything
+
+ default:
+
+ if (ch == 'l' || ch == KEY_RIGHT) { // move player right
+ if (lastmove == 'l') {
+ playerTurboOn(); // enable Turbo
+ } else {
+ playerTurboOff(); // disable Turbo
+ }
+ playerMoveRight(); // move player
+ lastmove = 'l'; // remember last move for turbo mode
+ } else if (ch == 'h' || ch == KEY_LEFT) { // move player left
+ if (lastmove == 'h') {
+ playerTurboOn(); // enable Turbo
+ } else {
+ playerTurboOff(); // disable Turbo
+ }
+ playerMoveLeft(); // move player
+ lastmove = 'h'; // remember last move for turbo mode
+ } else if (ch == 'k' || ch == ' ') { // shoot missile
+ playerLaunchMissile();
+ } else if (ch == 'p') { // pause game until 'p' pressed again
+ // set status to game paused
+ status = GAME_PAUSED;
+ } else if (ch == 'W') { // cheat: goto next level
+ status = GAME_NEXTLEVEL;
+ } else if (ch == 'L') { // cheat: one more live
+ lives++;
+ drawscore();
+ } else if (ch == 'q') { // quit game
+ status = GAME_EXIT;
+ } else { // disable turbo mode if key is not kept pressed
+ lastmove = ' ';
+ }
+
+ } // switch
+
+}
+
+
+/**
+ * timer
+ * this method is executed every 1 / FPS seconds
+ */
+void handleTimer()
+{
+ static int aliens_move_counter = 0;
+ static int aliens_shot_counter = 0;
+ static int player_shot_counter = 0;
+ static int ufo_move_counter = 0;
+ static int title_animation_counter = 0;
+ static int game_over_counter = 0;
+
+ switch (status) {
+
+ case GAME_NEXTLEVEL: // go to next level
+
+ level++; // increase level
+
+ initLevel(); // initialize level
+
+ aliens_move_counter = 0;
+ aliens_shot_counter = 0;
+ player_shot_counter = 0;
+ ufo_move_counter = 0;
+
+ weite = (shipnum+(skill_level*10)-(level*5)+5)/10;
+
+ if (weite < 0) {
+ weite = 0;
+ }
+
+ // change status and start game!
+ status = GAME_LOOP;
+
+ case GAME_LOOP: // do game handling
+
+ // move aliens
+ if (aliens_move_counter == 0 && aliensMove() == 1) {
+ // aliens reached player
+ lives = 0;
+ status = GAME_OVER;
+ }
+
+ // move player missile
+ if (player_shot_counter == 0 && playerMoveMissile() == 1) {
+ // no aliens left
+ status = GAME_NEXTLEVEL;
+ }
+
+ // move aliens' missiles
+ if (aliens_shot_counter == 0 && aliensMissileMove() == 1) {
+ // player was hit
+ lives--; // player looses one life
+ drawscore(); // draw score
+ playerExplode(); // display some explosion graphics
+ if (lives == 0) { // if no lives left ...
+ status = GAME_OVER; // ... exit game
+ }
+ }
+
+ // move ufo
+ if (ufo_move_counter == 0 && ufoShowUfo() == 1) {
+ ufoMoveLeft(); // move it one position to the left
+ }
+
+
+ if (aliens_shot_counter++ >= 5) {aliens_shot_counter=0;} // speed of alien shot
+ if (player_shot_counter++ >= 1) {player_shot_counter=0;} // speed of player shot
+ if (aliens_move_counter++ >= weite) {aliens_move_counter=0;} // speed of aliend
+ if (ufo_move_counter++ >= 3) {ufo_move_counter=0;} // speed of ufo
+
+ refreshScreen();
+ break;
+
+ case GAME_PAUSED: // game is paused
+ break;
+
+ case GAME_OVER: // game over
+ if (game_over_counter == 100) {
+ battleFieldClear();
+ status = GAME_HIGHSCORE;
+ game_over_counter = 0;
+ } else {
+ gameOverDisplay();
+ game_over_counter++;
+ }
+ break;
+
+ case GAME_EXIT: // exit game
+ finish(0);
+ break;
+
+ case GAME_HIGHSCORE: // display highscore
+ if (title_animation_counter == 0) {
+ titleScreenDisplay();
+ }
+
+ if (title_animation_counter++ >= 6) {title_animation_counter = 0;} // speed of animation
+ break;
+
+ }
+}
+
+
+/**
+ * set up timer
+ */
+void setUpTimer()
+{
+ struct itimerval myTimer;
+ struct sigaction myAction;
+ myTimer.it_value.tv_sec = 0;
+ myTimer.it_value.tv_usec = 1000000 / FPS;
+ myTimer.it_interval.tv_sec = 0;
+ myTimer.it_interval.tv_usec = 1000000 / FPS;
+ setitimer(ITIMER_REAL, &myTimer, NULL);
+
+ myAction.sa_handler = &handleTimer;
+ myAction.sa_flags = SA_RESTART;
+ sigaction(SIGALRM, &myAction, NULL);
+}
+
+
+int main(int argc, char **argv)
+{
+ weite = 0;
+ score = 0;
+ lives = 3;
+ level = 0;
+ skill_level = 1;
+
+ evaluateCommandLine(argc, argv); // evaluate command line parameters
+ graphicEngineInit(); // initialize graphic engine
+
+ // set up timer/ game handling
+ setUpTimer();
+ status = GAME_HIGHSCORE;
+
+ // read keyboard input
+ do {
+ // do movements and key-checking
+ readInput();
+ } while (0 == 0);
+
+ return 0;
+}
+
+
+void doScoring(int alienType)
+{
+ int points[4] = {500, 200, 150, 100}; // 0: ufo, 1:red, 2:green, 3:blue
+
+ score += points[alienType]; // every alien type does different scoring points
+
+ // every 6000 pts player gets a new live
+ if (score % 6000 == 0){
+ lives++;
+ }
+
+ drawscore(); // display score
+}
+
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "view.h"
+#include "globals.h"
+
+
+#ifndef NINVADERS
+#define NINVADERS
+
+#define UFO_ALIEN_TYPE 0
+#define RED_ALIEN_TYPE 1
+#define GREEN_ALIEN_TYPE 2
+#define BLUE_ALIEN_TYPE 3
+
+int main(int argv, char **argc); // hey! it has to start somewhere!
+
+extern void render(void);
+
+void game_over(int a);
+void drawscore();
+
+void doScoring(int alienType);
+
+// todo: let's try to not having to declare these "public"
+int weite;
+int level;
+int skill_level;
+
+// included from globals.h
+extern void doSleep();
+extern void showUsage();
+extern void showVersion();
+extern void showGplShort();
+extern void showGpl();
+
+#endif
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include "player.h"
+#include "aliens.h"
+#include "ufo.h"
+#include "nInvaders.h"
+
+typedef struct Player Player;
+
+struct Player {
+ int posX; // horizontal position of player
+ int posY; // vertical position of player
+ int speed; // 0: no movement; 1: one per turn; etc.
+ int missileFired; // 0: missile not running; 1: missile running
+ int missileX; // horizontal position of missile
+ int missileY; // vertical position of missile
+};
+
+Player player;
+
+/**
+ * initialize player attributes
+ */
+void playerReset()
+{
+ // if missile was fired clear that position
+ if (player.missileFired == 1) {
+ playerMissileClear(player.missileX, player.missileY);
+ }
+
+ playerClear(player.posX, player.posY); // clear old position of player
+
+ player.posY = PLAYERPOSY; // set vertical Position
+ player.posX = 0; // set horizontal Position
+ player.speed = 1;
+ player.missileFired = 0;
+ player.missileX=0;
+ player.missileY=0;
+
+ playerDisplay(player.posX, player.posY); // display new position of player
+}
+
+
+/**
+ * move player horizontally to position newPosX
+ */
+static void playerMove(int newPosX)
+{
+ playerClear(player.posX, player.posY); // clear sprite
+ player.posX = newPosX; // make movement
+ playerDisplay(player.posX, player.posY); // display sprite
+}
+
+
+/**
+ * move player left
+ */
+void playerMoveLeft()
+{
+ // check if space between player and border of screen is big enough
+ if (player.posX > 0 + player.speed) {
+ // desired movement is possible
+ playerMove(player.posX - player.speed);
+ } else {
+ // space too small, move to left-most position
+ playerMove(0);
+ }
+}
+
+
+/**
+ * move player right
+ */
+void playerMoveRight()
+{
+ // check if space between player and border of screen is big enough
+ if (player.posX < SCREENWIDTH - PLAYERWIDTH - player.speed) {
+ // desired movement is possible
+ playerMove(player.posX + player.speed);
+ } else {
+ // space too small, move to right-most position
+ playerMove(SCREENWIDTH - PLAYERWIDTH);
+ }
+}
+
+
+/**
+ * toggle turbo mode on (if key is kept pressed)
+ */
+void playerTurboOn()
+{
+ player.speed = 2;
+}
+
+
+/**
+ * toggle turbo mode off (if key is kept pressed)
+ */
+void playerTurboOff()
+{
+ player.speed = 1;
+}
+
+
+/**
+ * player was hit by an alien shot
+ */
+int playerHitCheck(int hostileShotX, int hostileShotY)
+{
+ int fPlayerWasHit = 0;
+
+ // if shot reached vertikal position of player
+ if (hostileShotY == PLAYERPOSY) {
+ // if shot hits player
+ if (hostileShotX >= player.posX && hostileShotX <= player.posX + PLAYERWIDTH -1) {
+ fPlayerWasHit = 1; // set return value
+ }
+ }
+
+ return fPlayerWasHit; // return if player was hit
+}
+
+
+/**
+ * Launch Missile
+ */
+void playerLaunchMissile()
+{
+ // only launch missile if no other is on its way
+ if (player.missileFired == 0) {
+ player.missileFired = 1; // missile is on its way
+ player.missileX = player.posX + PLAYERWIDTH / 2; // launched from the middle of player...
+ player.missileY = PLAYERPOSY; // ...at same horizontal position
+ }
+}
+
+
+/**
+ * Reload Missile
+ */
+static void playerReloadMissile()
+{
+ player.missileFired = 0; // no player missile flying
+}
+
+
+/**
+ * move player missile and do alien/bunker hit testing
+ * return value - 0: still some aliens left, 1: no aliens left
+ */
+int playerMoveMissile()
+{
+ int fNoAliensLeft = 0; // return value
+ int alienTypeHit = 0;
+
+ // only do movements if there is a missile to move
+ if (player.missileFired == 1) {
+
+ playerMissileClear(player.missileX, player.missileY); // clear old missile position
+ playerDisplay(player.posX, player.posY); // todo: check if this can be removed later if missiled is fired,
+ //the middle of player is cleared
+ player.missileY--; // move missile
+
+ // if missile out of battlefield
+ if (player.missileY < 0) {
+ playerReloadMissile(); // reload missile
+ } else {
+ playerMissileDisplay(player.missileX, player.missileY); // display missile at new position
+ }
+
+ // if missile hits an alien (TODO)
+ alienTypeHit = aliensHitCheck(player.missileX, player.missileY);
+ if (alienTypeHit != 0) {
+
+ doScoring(alienTypeHit); // increase score
+ playerReloadMissile(); // reload missile
+
+ aliensClear(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // clear old posiiton of aliens
+
+ render();
+ if (shipnum == 0) {
+ fNoAliensLeft = 1;
+ }
+
+ // speed of aliens
+ weite = (shipnum + (skill_level * 10) - (level * 5) + 5) / 10;
+ if (weite < 0) {
+ weite = 0;
+ }
+
+ playerMissileClear(player.missileX, player.missileY); // clear old missile position
+ aliensDisplay(aliens.posX, aliens.posY, aliens.right, aliens.bottom); // display aliens
+ }
+
+ // if missile hits a bunker
+ if (bunkersHitCheck(player.missileX, player.missileY) == 1) {
+ bunkersClearElement(player.missileX, player.missileY); // clear element of bunker
+ playerReloadMissile(); // reload player missile
+ }
+
+ // if missile hits ufo
+ if (ufoHitCheck(player.missileX, player.missileY) == 1) {
+ doScoring(UFO_ALIEN_TYPE);
+ playerReloadMissile();
+ }
+ }
+
+ return fNoAliensLeft;
+
+}
+
+/**
+ * let player explode
+ */
+void playerExplode(){
+ playerExplosionDisplay(player.posX, player.posY);
+ playerDisplay(player.posX, player.posY);
+}
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#ifndef PLAYER
+#define PLAYER
+
+#include "view.h"
+
+
+void playerReset();
+
+void playerMoveLeft();
+void playerMoveRight();
+void playerTurboOn();
+void playerTurboOff();
+int playerHitCheck(int hostileShotX, int hostileShotY);
+void playerLaunchMissile();
+int playerMoveMissile();
+void playerExplode();
+
+// methods that handle graphic display, from view.c
+extern void playerInit();
+extern void playerDisplay(int x, int y);
+extern void playerClear(int x, int y);
+extern void playerMissileInit();
+extern void playerMissileDisplay(int x, int y);
+extern void playerMissileClear(int x, int y);
+extern void playerExplosionDisplay(int x, int y);
+extern void bunkersClearElement(int x, int y);
+
+extern void doScoring(int alienType);
+
+#endif
+
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include "ufo.h"
+#include "aliens.h"
+#include "nInvaders.h"
+
+static int fShowUfo = 0;
+
+/**
+ * initialize ufo attributes
+ */
+void ufoReset()
+{
+ ufoClear(ufo.posX, ufo.posY); // clear old position of player
+
+ fShowUfo = 0; // do not show ufo
+ ufo.posY = UFOPOSY; // set vertical Position
+ ufo.posX = SCREENWIDTH - UFOWIDTH;// set horizontal Position
+}
+
+/**
+ * move ufo horizontally to position posX
+ */
+static void ufoMove(int posX)
+{
+ ufoClear(ufo.posX, ufo.posY); // clear sprite
+ ufo.posX = posX;
+ ufoRefresh();
+ ufoDisplay(ufo.posX, ufo.posY);
+}
+
+
+/**
+ * move ufo and check if it reached the left screen border
+ */
+void ufoMoveLeft()
+{
+ // check if space between ufo and screen border is big enough
+ if (ufo.posX > 1) {
+ // desired movement is possible
+ ufoMove(ufo.posX - 1);
+ } else {
+ ufoReset();
+ }
+}
+
+/**
+ * check if the first screen line is free for the ufo and
+ * display it randomly
+ */
+int ufoShowUfo()
+{
+ if (aliens.posY > 0 && fShowUfo == 0) { // aliens one line down
+ if ((random() % 200) == 0) {
+ fShowUfo = 1;
+ }
+ }
+
+ return fShowUfo;
+}
+
+/**
+ * check if ufo was hit by player and delete it from screen
+ */
+int ufoHitCheck(int shotX, int shotY)
+{
+ int fUfoWasHit = 0;
+
+ // if shot reached vertikal position of ufo
+ if (shotY == UFOPOSY) {
+ // if shot hits ufo
+ if (shotX >= ufo.posX && shotX <= ufo.posX + UFOWIDTH -1) {
+ ufoReset();
+ fUfoWasHit = 1;
+ }
+ }
+
+ return fUfoWasHit;
+}
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include "view.h"
+
+#ifndef UFO
+#define UFO
+
+typedef struct Ufo Ufo;
+
+struct Ufo {
+ int posX; // horizontal position of aliens
+ int posY; // vertical position of aliens
+};
+
+Ufo ufo;
+
+void ufoReset();
+int ufoShowUfo();
+void ufoMoveLeft();
+int ufoHitCheck(int shotX, int shotY);
+
+// methods that handle graphic display, from view.c
+extern void ufoDisplay(int x, int y);
+extern void ufoRefresh();
+extern void ufoClear(int x, int y);
+
+#endif
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include "view.h"
+#include "globals.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+
+#define RED 1
+#define GREEN 2
+#define YELLOW 3
+#define BLUE 4
+#define CYAN 5
+#define MAGENTA 6
+#define WHITE 7
+
+WINDOW *wBattleField;
+WINDOW *wEmpty;
+WINDOW *wScores;
+
+WINDOW *wPlayer;
+WINDOW *wPlayerMissile;
+WINDOW *wAliens;
+WINDOW *wAliensMissile;
+WINDOW *wBunkers;
+WINDOW *wGameOver;
+WINDOW *wUfo;
+WINDOW *wStatus;
+WINDOW *wTitleScreen;
+
+/**
+ * initialize player sprites
+ */
+static void playerInit()
+{
+ wPlayer = newpad(1, PLAYERWIDTH); // new pad with appropriate size
+ wclear(wPlayer); // clear pad
+ wattrset(wPlayer,COLOR_PAIR(YELLOW)); // set color
+ waddstr(wPlayer,"/-^-\\"); // set sprite
+}
+
+
+/**
+ * display player sprite
+ */
+void playerDisplay(int x, int y)
+{
+ copywin(wPlayer,wBattleField,0,0,y,x,y,x+PLAYERWIDTH-1,0);
+}
+
+
+/**
+ * clear player sprite
+ */
+void playerClear(int x, int y)
+{
+ copywin(wEmpty,wBattleField,0,0,y,x,y,x+PLAYERWIDTH-1,0);
+}
+
+
+/**
+ * initialize missile sprites
+ */
+static void playerMissileInit()
+{
+ wPlayerMissile = newpad(1, 1); // new pad with appropriate size
+ wclear(wPlayerMissile); // clear pad
+ wattrset(wPlayerMissile,COLOR_PAIR(WHITE)); // set color
+ waddch(wPlayerMissile,'!'); // set sprite
+ wrefresh(wPlayerMissile);
+}
+
+
+/**
+ * display missile sprite
+ */
+void playerMissileDisplay(int x, int y)
+{
+ copywin(wPlayerMissile,wBattleField,0,0,y,x,y,x,0);
+}
+
+
+/**
+ * clear missile sprite
+ */
+void playerMissileClear(int x, int y)
+{
+ copywin(wEmpty,wBattleField,0,0,y,x,y,x,0);
+}
+
+
+/**
+ * some explosion animation
+ */
+void playerExplosionDisplay(int x, int y)
+{
+ WINDOW* wPlayerExplosion;
+ char playerExplosionChars[16+1]="@~`.,^#*-_=\\/%{}";
+ int t,s;
+
+ wPlayerExplosion=newpad(1,PLAYERWIDTH); // new pad
+ wattrset(wPlayerExplosion,COLOR_PAIR(YELLOW)); // set color
+
+ for(t=0;t<5;t++){ // 5 frames
+ wclear(wPlayerExplosion); // clear pad
+ for(s=0;s<PLAYERWIDTH;s++){
+ waddch(wPlayerExplosion,playerExplosionChars[rand()%16]); // sprite
+ }
+
+ copywin(wPlayerExplosion,wBattleField,0,0,y,x,y,x+PLAYERWIDTH-1,0); // display explostion
+ wrefresh(wBattleField); // refresh battelfield to display explosion frames
+ doSleep(100000); // play animation not too fast
+ }
+
+
+} // todo: kann man bestimmt noch besser machen.
+
+
+/**
+ * initialize aliens sprites
+ */
+static void aliensInit()
+{
+ wAliens = newpad(ALIENS_MAX_NUMBER_Y*2,ALIENS_MAX_NUMBER_X*3);
+ wclear(wAliens);
+}
+
+
+/**
+ * display aliens sprite
+ */
+void aliensDisplay(int x, int y, int wid, int hgt)
+{
+ copywin(wAliens,wBattleField,0,0,y,x,y+hgt,x+wid+2,0);
+}
+
+
+/**
+ * clear aliens sprite
+ */
+void aliensClear(int x, int y, int wid, int hgt)
+{
+ copywin(wEmpty,wBattleField,0,0,y,x,y+hgt,x+wid+2,0);
+}
+
+
+/**
+ * initialize missile sprites
+ */
+static void aliensMissileInit()
+{
+ wAliensMissile = newpad(1, 1); // new pad
+ wclear(wAliensMissile); // clear pad
+ wattrset(wAliensMissile, COLOR_PAIR(CYAN)); // set color
+ waddch(wAliensMissile, ':'); // set sprite
+}
+
+
+/**
+ * display missile sprite
+ */
+void aliensMissileDisplay(int x, int y)
+{
+ copywin(wAliensMissile,wBattleField,0,0,y,x,y,x,0);
+}
+
+
+/**
+ * clear missile sprite
+ */
+void aliensMissileClear(int x, int y)
+{
+ copywin(wEmpty,wBattleField,0,0,y,x,y,x,0);
+}
+
+
+/**
+ * refresh aliens sprite
+ */
+void aliensRefresh(int level, int *pAliens)
+{
+ static int frame = 0; // used for animation; mod 2 == 0: frame1, mod2 == 1: frame2
+ int k,row;
+ int c = 0;
+ int alienType = 0;
+ char ships[2][9][3+1] = {
+ {",^,", "_O-", "-o-", "o=o", "<O>", "_x_", "*^*", "\\_/", "o o"},
+ {".-.", "-O_", "/o\\", "o-o", "<o>", "-x-", "o^o", "/~\\", "oo "}
+ };
+ int colors[9] = {RED, GREEN, BLUE, RED, YELLOW, WHITE, WHITE, YELLOW, RED};
+
+ wclear(wAliens); // clear pad
+ wattrset(wAliens,COLOR_PAIR(RED)); // set color
+
+ frame++; // next frame
+
+ // draw alien if there is one
+ for (row = 0; row < ALIENS_MAX_NUMBER_Y*2; row++) {
+ for (k = 0; k < ALIENS_MAX_NUMBER_X; k++) {
+ if ((row % 2) == 0) { // display aliens every even row
+ alienType = *(pAliens + c * (ALIENS_MAX_NUMBER_X) + k); // get type of alien //alienBlock[c][k]
+
+ if (alienType != 0) { // if there is an alien to display
+ wattrset(wAliens,COLOR_PAIR(colors[alienType-1])); // set color
+ waddch(wAliens,ships[frame%2][alienType-1+(3*((level-1)%3))][0]); // set char1
+ waddch(wAliens,ships[frame%2][alienType-1+(3*((level-1)%3))][1]); // set char2
+ waddch(wAliens,ships[frame%2][alienType-1+(3*((level-1)%3))][2]); // set char3
+ if (alienType > 4) {
+ *(pAliens + c * ALIENS_MAX_NUMBER_X + k) = (alienType + 1) % 9;
+ } // todo: what's that? If alien_type > 4 then do a modulo operation???
+ } else {
+ waddstr(wAliens," "); // no alien
+ }
+
+ } else {
+ waddstr(wAliens," "); // no aliens at odd rows
+ }
+ }
+ if ((row % 2) == 1) {c++;} // goto next row at alienblock
+ }
+}
+
+
+/**
+ * initialize bunkers sprites
+ */
+static void bunkersInit()
+{
+ wBunkers = newpad(BUNKERHEIGHT, BUNKERWIDTH); // new pad data
+ wclear(wBunkers);
+}
+
+
+/**
+ * display bunkers sprite
+ * needs pointer to bunker-array
+ */
+void bunkersDisplay(int *pBunker)
+{
+ int l, k;
+ wclear(wBunkers);
+ wattrset(wBunkers,COLOR_PAIR(CYAN));
+ for (l=0;l<BUNKERHEIGHT;l++) {
+ for (k=0;k<BUNKERWIDTH;k++) {
+ if (*(pBunker + (l * (BUNKERWIDTH + 1)) + k) == 1) { //if (pBunker[l][k]==1) {
+ waddch(wBunkers,'#');
+ } else {
+ waddch(wBunkers,' ');
+ }
+ }
+ }
+
+ copywin(wBunkers, wBattleField, 0, 0, BUNKERY, BUNKERX, BUNKERY + BUNKERHEIGHT - 1, BUNKERX + BUNKERWIDTH - 1, 0);
+}
+
+
+/**
+ * clear bunkers sprite
+ */
+void bunkersClear()
+{
+ copywin(wEmpty, wBattleField, 0, 0, BUNKERY, BUNKERX, BUNKERY + BUNKERHEIGHT - 1, BUNKERX + BUNKERWIDTH - 1, 0);
+}
+
+
+/**
+ * clear one element of bunkers sprite at position (x, y)
+ */
+void bunkersClearElement(int x, int y)
+{
+ copywin(wEmpty, wBattleField, 0, 0, y, x, y, x, 0);
+}
+
+
+/**
+ * set actual sprite for ufo animation
+ */
+void ufoRefresh()
+{
+ char ufo[4][6] = {"<o o>", "<oo >", "<o o>", "< oo>"};
+ static int frame = 0;
+
+ wclear(wUfo);
+ wattrset(wUfo, COLOR_PAIR(MAGENTA));
+ waddstr(wUfo, ufo[frame % 4]);
+
+ frame++;
+}
+
+
+/**
+ * initialize ufo sprite
+ */
+static void ufoInit()
+{
+ wUfo = newpad(1, UFOWIDTH); // new pad with appropriate size
+ wclear(wUfo); // clear pad
+ wattrset(wUfo, COLOR_PAIR(MAGENTA)); // set color
+}
+
+
+/**
+ * display ufo sprite
+ */
+void ufoDisplay(int x, int y)
+{
+ copywin(wUfo, wBattleField, 0, 0, y, x, y, x + UFOWIDTH - 1, 0);
+}
+
+
+/**
+ * clear ufo sprite
+ */
+void ufoClear(int x, int y)
+{
+ copywin(wEmpty, wBattleField, 0, 0, y, x, y, x + UFOWIDTH - 1, 0);
+}
+
+
+/**
+ * initialize gameover graphic
+ */
+static void gameOverInit()
+{
+ // init game-over banner
+ wGameOver = newpad(13, 31);
+ wclear(wGameOver);
+ wattrset(wGameOver, COLOR_PAIR(WHITE));
+ waddstr(wGameOver, " ");
+ waddstr(wGameOver, " ##### #### ## ## ###### ");
+ waddstr(wGameOver, " ## ## ## ####### ## ");
+ waddstr(wGameOver, " ## ### ###### ## # ## ##### ");
+ waddstr(wGameOver, " ## ## ## ## ## ## ## ");
+ waddstr(wGameOver, " ##### ## ## ## ## ###### ");
+ waddstr(wGameOver, " ");
+ waddstr(wGameOver, " #### ## ## ###### ###### ");
+ waddstr(wGameOver, " ## ## ## ## ## ## ## ");
+ waddstr(wGameOver, " ## ## ## ## ##### ###### ");
+ waddstr(wGameOver, " ## ## ## ## ## ## ## ");
+ waddstr(wGameOver, " #### ### ###### ## ## ");
+ waddstr(wGameOver, " ");
+}
+
+/**
+ * display game over graphic
+ */
+void gameOverDisplay()
+{
+ int x = (SCREENWIDTH / 2) - (31 / 2);
+ int y = (SCREENHEIGHT / 2) - (13 / 2);
+ copywin(wGameOver, wBattleField, 0, 0, y, x, y + 12, x + 30, 0);
+ wrefresh(wBattleField);
+}
+
+
+/**
+ * initialize title screen
+ */
+static void titleScreenInit()
+{
+ wTitleScreen = newpad(SCREENHEIGHT, SCREENWIDTH);
+ wclear(wTitleScreen);
+}
+
+
+/**
+ * display title screen
+ */
+void titleScreenDisplay()
+{
+ static int frame = 0;
+ int x, y;
+ int i;
+ WINDOW *wTitleText;
+ WINDOW *wAliens;
+ WINDOW *wStartText;
+ char ufo[4][6] = {"<o o>", "<oo >", "<o o>", "< oo>"};
+ char aliens[2][9][3+1] = {
+ {",^,", "_O-", "-o-", "o=o", "<O>", "_x_", "*^*", "\\_/", "o o"},
+ {".-.", "-O_", "/o\\", "o-o", "<o>", "-x-", "o^o", "/~\\", "oo "}
+ };
+ int score[3] = {200, 150, 100};
+ int colors[9] = {RED, GREEN, BLUE, RED, GREEN, BLUE, RED, GREEN, BLUE};
+ char buffer[12];
+ static int alien_type = 0;
+
+ wTitleText = newpad(4, 41);
+ wclear(wTitleText);
+ wattrset(wTitleText, COLOR_PAIR(YELLOW));
+ waddstr(wTitleText, " ____ __ ");
+ waddstr(wTitleText, " ___ / _/__ _ _____ ___/ /__ _______");
+ waddstr(wTitleText, " / _ \\_/ // _ \\ |/ / _ `/ _ / -_) __(_-<");
+ waddstr(wTitleText, "/_//_/___/_//_/___/\\_,_/\\_,_/\\__/_/ /___/");
+
+ frame++;
+ wAliens = newpad(7, 11);
+ wclear(wAliens);
+ snprintf(buffer, sizeof(buffer),"%s = 500", ufo[frame % 4]);
+ wattrset(wAliens, COLOR_PAIR(MAGENTA));
+ waddstr(wAliens, buffer);
+ if ((frame = frame % 60) == 0) {
+ alien_type = 0;
+ } else if (frame == 20) {
+ alien_type = 3;
+ } else if (frame == 40) {
+ alien_type = 6;
+ }
+ for (i = alien_type; i < alien_type + 3; i++) {
+ waddstr(wAliens, " ");
+ snprintf(buffer, sizeof(buffer), "%s = %d", aliens[frame % 2][i], score[i % 3]);
+ wattrset(wAliens, COLOR_PAIR(colors[i]));
+ waddstr(wAliens, buffer);
+ }
+
+ wStartText = newpad(1, 20);
+ wclear(wStartText);
+ wattrset(wStartText, COLOR_PAIR(RED));
+ waddstr(wStartText, "Press SPACE to start");
+
+ x = (SCREENWIDTH / 2) - (41 / 2);
+ y = 0;
+ copywin(wTitleText, wTitleScreen, 0, 0, y, x, y + 3, x + 40, 0);
+
+ x = (SCREENWIDTH / 2) - (11 / 2);
+ y = 8;
+ copywin(wAliens, wTitleScreen, 0, 0, y, x , y + 6, x + 10, 0);
+
+ x = (SCREENWIDTH / 2) - (20 / 2);
+ y = SCREENHEIGHT - 2;
+ copywin(wStartText, wTitleScreen, 0, 0, y, x, y, x + 19, 0);
+
+ copywin(wTitleScreen, wBattleField, 0, 0, 0, 0, SCREENHEIGHT-1, SCREENWIDTH-1, 0);
+
+ wrefresh(wBattleField);
+}
+
+
+/**
+ * clear title screen
+ */
+void titleScreenClear()
+{
+ battleFieldClear();
+}
+
+
+/**
+ * initialize scores
+ */
+void statusInit()
+{
+ wStatus = newpad(1, 55);
+ wclear(wStatus);
+}
+
+
+/**
+ * display scores
+ */
+void statusDisplay(int level, int score, int lives)
+{
+ int t, xOffset;
+ char strStatus[55];
+ // "Level: 01 Score: 0001450 Lives: /-\ /-\ /-\ /-\ /-\ "
+ // "1234567890123456789012345678901234567890123456789012"
+
+
+ xOffset = (SCREENWIDTH / 2) - 24;
+
+
+
+ sprintf (strStatus, "Level: %2.2d Score: %2.7d Lives: ", level, score);
+
+ wclear(wStatus);
+ wattrset(wStatus, COLOR_PAIR(RED));
+ waddstr(wStatus, strStatus);
+
+ // show maximal five lives
+ for (t = 1; ((t <= 5) && (t < lives)); t++){
+ waddstr(wStatus, "/-\\ ");
+ }
+
+ copywin(wStatus, wBattleField, 0, 0, SCREENHEIGHT-1, xOffset, SCREENHEIGHT-1, xOffset + 54, 0);
+
+
+}
+
+
+/**
+ * initialize battlefield
+ */
+static void battleFieldInit()
+{
+ wEmpty = newpad(SCREENHEIGHT, SCREENWIDTH);
+ wclear(wEmpty);
+
+ wBattleField = newwin(SCREENHEIGHT, SCREENWIDTH, 0, 0); // new window
+ wclear(wBattleField); // clear window
+ mvwin(wBattleField, 0, 0); // move window
+}
+
+
+/**
+ * clear battlefield
+ */
+void battleFieldClear()
+{
+ copywin(wEmpty,wBattleField,0,0,0,0,SCREENHEIGHT-1,SCREENWIDTH-1,0);
+}
+
+
+/**
+ * refresh screen so that modified graphic buffers get visible
+ */
+void refreshScreen()
+{
+ redrawwin(wBattleField); // needed to display graphics properly at startup on some terminals
+ wrefresh(wBattleField);
+
+}
+
+
+/**
+ * do proper cleanup
+ */
+static void finish(int sig)
+{
+ endwin(); // <curses.h> reset terminal into proper non-visual mode
+ exit(0);
+}
+
+
+/**
+ * initialize n_courses
+ */
+void graphicEngineInit()
+{
+ (void) signal(SIGINT, finish); // <signal.h> on signal "SIGINT" call method "finish"
+ (void) initscr(); // <curses.h> do initialization work
+ keypad(stdscr, TRUE); // <curses.h> enable keypad for input
+ (void) nonl(); // <curses.h> disable translation return/ newline for detection of return key
+ (void) cbreak(); // <curses.h> do not buffer typed characters, use at once
+ (void) noecho(); // <curses.h> do not echo typed characters
+ start_color(); // <curses.h> use colors
+ init_pair(RED, COLOR_RED, COLOR_BLACK); // <curses.h> define color-pair
+ init_pair(GREEN, COLOR_GREEN, COLOR_BLACK); // <curses.h> define color-pair
+ init_pair(YELLOW, COLOR_YELLOW, COLOR_BLACK); // <curses.h> define color-pair
+ init_pair(BLUE, COLOR_BLUE, COLOR_BLACK); // <curses.h> define color-pair
+ init_pair(CYAN, COLOR_CYAN, COLOR_BLACK); // <curses.h> define color-pair
+ init_pair(MAGENTA, COLOR_MAGENTA, COLOR_BLACK); // <curses.h> define color-pair
+ init_pair(WHITE, COLOR_WHITE, COLOR_BLACK); // <curses.h> define color-pair
+
+ //timeout(0); // <curses.h> do not wait for input
+
+ // initialize sprites
+ battleFieldInit();
+ playerInit();
+ playerMissileInit();
+ aliensInit();
+ aliensMissileInit();
+ bunkersInit();
+ ufoInit();
+ gameOverInit();
+ statusInit();
+ titleScreenInit();
+}
+
--- /dev/null
+/**
+ * nInvaders - a space invaders clone for ncurses
+ * Copyright (C) 2002-2003 Dettus
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * homepage: http://ninvaders.sourceforge.net
+ * mailto: ninvaders-devel@lists.sourceforge.net
+ *
+ */
+
+
+#include <ncurses.h>
+#include <unistd.h>
+#include <signal.h>
+
+#ifndef VIEW
+#define VIEW
+
+#include "globals.h"
+
+#define SCREENHEIGHT 24
+#define SCREENWIDTH 80
+
+#define PLAYERWIDTH 5
+#define PLAYERPOSY (SCREENHEIGHT-2)
+
+#define BUNKERWIDTH 80
+#define BUNKERHEIGHT 4
+#define BUNKERX 0
+#define BUNKERY (SCREENHEIGHT-8)
+
+#define ALIENS_MAX_NUMBER_X 10
+#define ALIENS_MAX_NUMBER_Y 5
+
+#define UFOWIDTH 5
+#define UFOPOSY 0
+
+
+void graphicEngineInit();
+
+void aliensClear(int x, int y, int wid, int hgt);
+void aliensDisplay(int x, int y, int wid, int hgt);
+void aliensMissileClear(int x, int y);
+void aliensMissileDisplay(int x, int y);
+void aliensRefresh(int level, int *pAliens);
+void battleFieldClear();
+void bunkersClear();
+void bunkersClearElement(int x, int y);
+void bunkersDisplay(int *pBunker);
+void gameOverDisplay();
+void playerClear(int x, int y);
+void playerDisplay(int x, int y);
+void playerExplosionDisplay(int x, int y);
+void playerMissileClear(int x, int y);
+void playerMissileDisplay(int x, int y);
+void titleScreenClear();
+void titleScreenDisplay();
+void ufoClear(int x, int y);
+void ufoDisplay(int x, int y);
+void ufoRefresh();
+
+void statusDisplay(int level, int score, int lives);
+void refreshScreen();
+
+#endif