+Matthew Mondor's fork:
+- Allow to build against BSD curses
+- Debug function prototype issues causing bugs on x86-64
+- Fix global definitions in headerfiles that should have been in the
+ modules then defined extern in the headerfile as needed
+
****** Release 0.1.1 ******
-CC=gcc
-CFLAGS=-O3 -Wall
-LIBS=-lncurses
+#CFLAGS=-D__USE_NCURSES__ -I/usr/pkg/include -I/usr/pkg/include/ncurses
+#LDFLAGS=-L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib
+#LIBS=-lncurses
+
+CC=cc
+CFLAGS=-O2 -Wall
+LIBS=-lcurses
+
+# This was very useful to correct important bugs
+#CFLAGS+=-Werror=missing-prototypes -Werror=implicit-function-declaration \
+ -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast \
+ -Werror=format-extra-args -Werror=format= -Werror=maybe-uninitialized
+
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
#include "player.h"
#include "nInvaders.h"
+
+Aliens aliens;
+int shipnum;
+
+
/**
* initialize aliens attributes
*/
int speed; // 0: no movement; 1: one per turn; etc.
};
-Aliens aliens;
-
-int shipnum;
+extern Aliens aliens;
+extern int shipnum;
#define ALIENS_MAX_NUMBER_X 10
#define ALIENS_MAX_NUMBER_Y 5
int bunker[BUNKERHEIGHT][BUNKERWIDTH + 1];
-void aliensReset();
-void bunkersReset();
-int aliensMove();
-int aliensMissileMove();
-void render();
+void aliensReset(void);
+void bunkersReset(void);
+int aliensMove(void);
+int aliensMissileMove(void);
+void render(void);
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();
+void aliensDisplay(int x, int y, int wid, int hgt);
+void aliensClear(int x, int y, int wid, int hgt);
+void aliensRefresh(int level, int *pAliens);
+void aliensMissileDisplay(int x, int y);
+void aliensMissileClear(int x, int y);
+void bunkersClearElement(int x, int y);
+void bunkersClear(void);
+void bunkersRefresh(void);
#endif
/**
* show version information
*/
-void showVersion()
+void showVersion(void)
{
fprintf(stderr, "*** nInvaders %i.%i.%i\n", MAJOR, MINOR, RELEASE);
fprintf(stderr, "*** (C)opyleft 2k2 by Dettus\n");
/**
* show usage of command line parameters
*/
-void showUsage()
+void showUsage(void)
{
fprintf(stderr, "\n\nUsage: nInvaders [-l skill] [-gpl]\n");
/**
* wait for input of return to continue
*/
-void waitForReturn()
+void waitForReturn(void)
{
char b[2];
fprintf(stderr, "...Please press <Enter> to read on...");
/**
* show short version of Gnu GPL
*/
-void showGplShort()
+void showGplShort(void)
{
fprintf(stderr,"\n");
fprintf(stderr,"This program is free software; you can redistribute it and/or modify\n");
/**
* show GNU GENERAL PUBLIC LICENSE
*/
-void showGpl()
+void showGpl(void)
{
fprintf(stderr, "\n");
fprintf(stderr, " GNU GENERAL PUBLIC LICENSE\n");
#ifndef GLOBALS
#define GLOBALS
-extern void doSleep();
+void doSleep(int);
-extern void showUsage();
-extern void showVersion();
-extern void showGplShort();
-extern void showGpl();
+void showUsage(void);
+void showVersion(void);
+void waitForReturn(void);
+void showGplShort(void);
+void showGpl(void);
#endif
int lives;
long score;
int status; // status handled in timer
+int weite;
+int level;
+int skill_level;
#define GAME_LOOP 1
#define GAME_NEXTLEVEL 2
/**
* initialize level: reset attributes of most units
*/
-static void initLevel()
+static void initLevel(void)
{
playerReset();
aliensReset();
}
-void drawscore()
+void drawscore(void)
{
statusDisplay(level, score, lives);
}
/**
* reads input from keyboard and do action
*/
-void readInput()
+void readInput(void)
{
int ch;
static int lastmove;
* timer
* this method is executed every 1 / FPS seconds
*/
-void handleTimer()
+void handleTimer(int sig)
{
static int aliens_move_counter = 0;
static int aliens_shot_counter = 0;
/**
* set up timer
*/
-void setUpTimer()
+void setUpTimer(void)
{
struct itimerval myTimer;
struct sigaction myAction;
myTimer.it_interval.tv_usec = 1000000 / FPS;
setitimer(ITIMER_REAL, &myTimer, NULL);
- myAction.sa_handler = &handleTimer;
+ myAction.sa_handler = handleTimer;
myAction.sa_flags = SA_RESTART;
sigaction(SIGALRM, &myAction, NULL);
}
extern void render(void);
void game_over(int a);
-void drawscore();
+void drawscore(void);
void doScoring(int alienType);
+void readInput(void);
+void handleTimer(int);
+void setUpTimer(void);
+
// todo: let's try to not having to declare these "public"
-int weite;
-int level;
-int skill_level;
-
+extern int weite;
+extern int level;
+extern int skill_level;
+
// included from globals.h
-extern void doSleep();
-extern void showUsage();
-extern void showVersion();
-extern void showGplShort();
-extern void showGpl();
+extern void showUsage(void);
+extern void showVersion(void);
+extern void showGplShort(void);
+extern void showGpl(void);
#endif
/**
* initialize player attributes
*/
-void playerReset()
+void playerReset(void)
{
// if missile was fired clear that position
if (player.missileFired == 1) {
/**
* move player left
*/
-void playerMoveLeft()
+void playerMoveLeft(void)
{
// check if space between player and border of screen is big enough
if (player.posX > 0 + player.speed) {
/**
* move player right
*/
-void playerMoveRight()
+void playerMoveRight(void)
{
// check if space between player and border of screen is big enough
if (player.posX < SCREENWIDTH - PLAYERWIDTH - player.speed) {
/**
* toggle turbo mode on (if key is kept pressed)
*/
-void playerTurboOn()
+void playerTurboOn(void)
{
player.speed = 2;
}
/**
* toggle turbo mode off (if key is kept pressed)
*/
-void playerTurboOff()
+void playerTurboOff(void)
{
player.speed = 1;
}
/**
* Launch Missile
*/
-void playerLaunchMissile()
+void playerLaunchMissile(void)
{
// only launch missile if no other is on its way
if (player.missileFired == 0) {
/**
* Reload Missile
*/
-static void playerReloadMissile()
+static void playerReloadMissile(void)
{
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 playerMoveMissile(void)
{
int fNoAliensLeft = 0; // return value
int alienTypeHit = 0;
/**
* let player explode
*/
-void playerExplode(){
+void playerExplode(void){
playerExplosionDisplay(player.posX, player.posY);
playerDisplay(player.posX, player.posY);
}
#include "view.h"
-void playerReset();
+void playerReset(void);
-void playerMoveLeft();
-void playerMoveRight();
-void playerTurboOn();
-void playerTurboOff();
+void playerMoveLeft(void);
+void playerMoveRight(void);
+void playerTurboOn(void);
+void playerTurboOff(void);
int playerHitCheck(int hostileShotX, int hostileShotY);
-void playerLaunchMissile();
-int playerMoveMissile();
-void playerExplode();
+void playerLaunchMissile(void);
+int playerMoveMissile(void);
+void playerExplode(void);
// methods that handle graphic display, from view.c
-extern void playerInit();
+extern void playerInit(void);
extern void playerDisplay(int x, int y);
extern void playerClear(int x, int y);
-extern void playerMissileInit();
+extern void playerMissileInit(void);
extern void playerMissileDisplay(int x, int y);
extern void playerMissileClear(int x, int y);
extern void playerExplosionDisplay(int x, int y);
static int fShowUfo = 0;
+Ufo ufo;
+
+
/**
* initialize ufo attributes
*/
int posY; // vertical position of aliens
};
-Ufo ufo;
+extern Ufo ufo;
-void ufoReset();
-int ufoShowUfo();
-void ufoMoveLeft();
+void ufoReset(void);
+int ufoShowUfo(void);
+void ufoMoveLeft(void);
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 ufoRefresh(void);
extern void ufoClear(int x, int y);
#endif
/**
* initialize player sprites
*/
-static void playerInit()
+static void playerInit(void)
{
wPlayer = newpad(1, PLAYERWIDTH); // new pad with appropriate size
wclear(wPlayer); // clear pad
/**
* initialize missile sprites
*/
-static void playerMissileInit()
+static void playerMissileInit(void)
{
wPlayerMissile = newpad(1, 1); // new pad with appropriate size
wclear(wPlayerMissile); // clear pad
/**
* initialize aliens sprites
*/
-static void aliensInit()
+static void aliensInit(void)
{
wAliens = newpad(ALIENS_MAX_NUMBER_Y*2,ALIENS_MAX_NUMBER_X*3);
wclear(wAliens);
/**
* initialize missile sprites
*/
-static void aliensMissileInit()
+static void aliensMissileInit(void)
{
wAliensMissile = newpad(1, 1); // new pad
wclear(wAliensMissile); // clear pad
/**
* initialize bunkers sprites
*/
-static void bunkersInit()
+static void bunkersInit(void)
{
wBunkers = newpad(BUNKERHEIGHT, BUNKERWIDTH); // new pad data
wclear(wBunkers);
/**
* clear bunkers sprite
*/
-void bunkersClear()
+void bunkersClear(void)
{
copywin(wEmpty, wBattleField, 0, 0, BUNKERY, BUNKERX, BUNKERY + BUNKERHEIGHT - 1, BUNKERX + BUNKERWIDTH - 1, 0);
}
/**
* set actual sprite for ufo animation
*/
-void ufoRefresh()
+void ufoRefresh(void)
{
char ufo[4][6] = {"<o o>", "<oo >", "<o o>", "< oo>"};
static int frame = 0;
/**
* initialize ufo sprite
*/
-static void ufoInit()
+static void ufoInit(void)
{
wUfo = newpad(1, UFOWIDTH); // new pad with appropriate size
wclear(wUfo); // clear pad
/**
* initialize gameover graphic
*/
-static void gameOverInit()
+static void gameOverInit(void)
{
// init game-over banner
wGameOver = newpad(13, 31);
/**
* display game over graphic
*/
-void gameOverDisplay()
+void gameOverDisplay(void)
{
int x = (SCREENWIDTH / 2) - (31 / 2);
int y = (SCREENHEIGHT / 2) - (13 / 2);
/**
* initialize title screen
*/
-static void titleScreenInit()
+static void titleScreenInit(void)
{
wTitleScreen = newpad(SCREENHEIGHT, SCREENWIDTH);
wclear(wTitleScreen);
/**
* display title screen
*/
-void titleScreenDisplay()
+void titleScreenDisplay(void)
{
static int frame = 0;
int x, y;
/**
* clear title screen
*/
-void titleScreenClear()
+void titleScreenClear(void)
{
battleFieldClear();
}
/**
* initialize scores
*/
-void statusInit()
+void statusInit(void)
{
wStatus = newpad(1, 55);
wclear(wStatus);
/**
* initialize battlefield
*/
-static void battleFieldInit()
+static void battleFieldInit(void)
{
wEmpty = newpad(SCREENHEIGHT, SCREENWIDTH);
wclear(wEmpty);
/**
* clear battlefield
*/
-void battleFieldClear()
+void battleFieldClear(void)
{
copywin(wEmpty,wBattleField,0,0,0,0,SCREENHEIGHT-1,SCREENWIDTH-1,0);
}
/**
* refresh screen so that modified graphic buffers get visible
*/
-void refreshScreen()
+void refreshScreen(void)
{
redrawwin(wBattleField); // needed to display graphics properly at startup on some terminals
wrefresh(wBattleField);
*/
static void finish(int sig)
{
+ curs_set(1);
endwin(); // <curses.h> reset terminal into proper non-visual mode
exit(0);
}
/**
* initialize n_courses
*/
-void graphicEngineInit()
+void graphicEngineInit(void)
{
(void) signal(SIGINT, finish); // <signal.h> on signal "SIGINT" call method "finish"
(void) initscr(); // <curses.h> do initialization work
+ curs_set(0);
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
*/
+#ifdef __USE_NCURSES__
#include <ncurses.h>
+#else
+#include <curses.h>
+#endif
#include <unistd.h>
#include <signal.h>
#define UFOPOSY 0
-void graphicEngineInit();
+void graphicEngineInit(void);
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 battleFieldClear(void);
+void bunkersClear(void);
void bunkersClearElement(int x, int y);
void bunkersDisplay(int *pBunker);
-void gameOverDisplay();
+void gameOverDisplay(void);
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 titleScreenClear(void);
+void titleScreenDisplay(void);
void ufoClear(int x, int y);
void ufoDisplay(int x, int y);
-void ufoRefresh();
+void ufoRefresh(void);
+void statusInit(void);
void statusDisplay(int level, int score, int lives);
-void refreshScreen();
+void refreshScreen(void);
#endif