|
|
|
@ -3,6 +3,8 @@ |
|
|
|
|
|
|
|
|
|
#define MAX_PROJECTILES 2 |
|
|
|
|
#define MAX_ZOMBIES 1000 |
|
|
|
|
#define MAX_ALIVE 10000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int scrRows,scrCols; |
|
|
|
|
int viewportWinRows,viewportWinCols; |
|
|
|
@ -12,8 +14,6 @@ WINDOW* viewportWin; |
|
|
|
|
|
|
|
|
|
WINDOW* scoreWin; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct Projectile{ |
|
|
|
|
int isAlive; |
|
|
|
|
char symbol; |
|
|
|
@ -38,7 +38,8 @@ struct Weapon{ |
|
|
|
|
char symbols[8]; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct Player { |
|
|
|
|
struct Entity { |
|
|
|
|
char *type; |
|
|
|
|
char symbol; |
|
|
|
|
int curYpos, curXpos; |
|
|
|
|
int nextYpos, nextXpos; |
|
|
|
@ -48,20 +49,27 @@ struct Player { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct Player player = {.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; |
|
|
|
|
struct Entity player = {.type="player",.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; |
|
|
|
|
|
|
|
|
|
struct Player zombies[MAX_ZOMBIES]; |
|
|
|
|
struct Player zombie = {.symbol='Z', .curYpos=5, .curXpos=5, .nextYpos=5, .nextXpos=5 ,.isAlive=1}; |
|
|
|
|
struct Entity *zombies[MAX_ZOMBIES]; |
|
|
|
|
struct Entity *allEntities[MAX_ALIVE]; |
|
|
|
|
struct Entity zombie = {.type="zombie", .symbol='Z', .curYpos=5, .curXpos=5, .nextYpos=5, .nextXpos=5 ,.isAlive=1}; |
|
|
|
|
|
|
|
|
|
struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void collisionDetect(int objYpos, int objXpos){ |
|
|
|
|
|
|
|
|
|
struct Entity * collisionDetect(int objYpos, int objXpos){ |
|
|
|
|
int i; |
|
|
|
|
for(i=0; i<MAX_ALIVE; i++){ |
|
|
|
|
if(allEntities[i] && allEntities[i]->isAlive){ |
|
|
|
|
if(objYpos==allEntities[i]->curYpos && objXpos==allEntities[i]->curXpos){ |
|
|
|
|
return allEntities[i]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void movePlayer(struct Player *playerRef); |
|
|
|
|
|
|
|
|
|
void moveProjectiles(){ |
|
|
|
|
int i; |
|
|
|
@ -93,8 +101,15 @@ void moveProjectiles(){ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
projectiles[i].distanceTraveled++; |
|
|
|
|
collisionDetect(projectiles[i].curYpos, projectiles[i].curXpos);
|
|
|
|
|
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, projectiles[i].symbol); |
|
|
|
|
struct Entity * hitEntity = collisionDetect(projectiles[i].curYpos, projectiles[i].curXpos); |
|
|
|
|
if(hitEntity){ |
|
|
|
|
if(hitEntity->type=="zombie"){ |
|
|
|
|
projectiles[i].isAlive=0; |
|
|
|
|
hitEntity->isAlive=0; |
|
|
|
|
mvwaddch(viewportWin, allEntities[i]->curYpos, allEntities[i]->curXpos, ' '); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(mvwinch(viewportWin,projectiles[i].prevYpos, projectiles[i].prevXpos)==projectiles[i].symbol){ |
|
|
|
|
mvwaddch(viewportWin, projectiles[i].prevYpos, projectiles[i].prevXpos, ' '); |
|
|
|
|
}
|
|
|
|
@ -102,9 +117,11 @@ void moveProjectiles(){ |
|
|
|
|
projectiles[i].isAlive=0; |
|
|
|
|
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
usleep(30000); |
|
|
|
|
} |
|
|
|
|
else{ |
|
|
|
|
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -137,7 +154,7 @@ void fireWeapon(struct Weapon *weaponRef, char *direction){ |
|
|
|
|
}
|
|
|
|
|
int i; |
|
|
|
|
for(i=0;i<MAX_PROJECTILES;i++){ |
|
|
|
|
if(projectiles[i].isAlive==0 && projectiles[i+1].isAlive==0){ |
|
|
|
|
if(!projectiles[i].isAlive && !projectiles[i+1].isAlive){ |
|
|
|
|
projectiles[i]=projectile; |
|
|
|
|
player.weapons[player.curWeapon].curCapacity--; |
|
|
|
|
break; |
|
|
|
@ -155,15 +172,16 @@ void drawScore(){ |
|
|
|
|
|
|
|
|
|
void drawViewport(){ |
|
|
|
|
box(viewportWin,0,0); |
|
|
|
|
wnoutrefresh(viewportWin); |
|
|
|
|
int i; |
|
|
|
|
for(i=0; i<MAX_ALIVE; i++){ |
|
|
|
|
if(allEntities[i] && allEntities[i]->isAlive){ |
|
|
|
|
mvwaddch(viewportWin, allEntities[i]->curYpos, allEntities[i]->curXpos, ' '); |
|
|
|
|
mvwaddch(viewportWin, allEntities[i]->nextYpos, allEntities[i]->nextXpos, allEntities[i]->symbol); |
|
|
|
|
allEntities[i]->curYpos = allEntities[i]->nextYpos; |
|
|
|
|
allEntities[i]->curXpos = allEntities[i]->nextXpos; } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void movePlayer( struct Player *playerRef) { |
|
|
|
|
mvwaddch(viewportWin, playerRef->curYpos, playerRef->curXpos, ' '); |
|
|
|
|
mvwaddch(viewportWin, playerRef->nextYpos, playerRef->nextXpos, playerRef->symbol); |
|
|
|
|
playerRef->curYpos = playerRef->nextYpos; |
|
|
|
|
playerRef->curXpos = playerRef->nextXpos; |
|
|
|
|
wnoutrefresh(viewportWin); |
|
|
|
|
doupdate(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void initializeWorld() { |
|
|
|
@ -172,11 +190,18 @@ void initializeWorld() { |
|
|
|
|
viewportWin=newwin(scrRows-10,scrCols,0,0); |
|
|
|
|
getmaxyx(viewportWin,viewportWinRows,viewportWinCols); |
|
|
|
|
scoreWin=newwin(10,scrCols,scrRows-10,0); |
|
|
|
|
mvwaddch(viewportWin, player.curYpos, player.curXpos, player.symbol); |
|
|
|
|
mvwaddch(viewportWin, zombie.curYpos, zombie.curXpos, zombie.symbol); |
|
|
|
|
|
|
|
|
|
allEntities[0]=&player; |
|
|
|
|
allEntities[1]=&zombie; |
|
|
|
|
player.curYpos=10; |
|
|
|
|
player.curXpos=10; |
|
|
|
|
zombie.curYpos=rand()%viewportWinRows; |
|
|
|
|
zombie.curYpos=rand()%viewportWinCols; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int main() { |
|
|
|
|
|
|
|
|
|
srand(time(NULL)); |
|
|
|
|
initscr(); |
|
|
|
|
cbreak(); |
|
|
|
|
keypad(stdscr, TRUE); |
|
|
|
@ -201,7 +226,6 @@ int main() { |
|
|
|
|
if(player.nextYpos < 0){ |
|
|
|
|
player.nextYpos = 0; |
|
|
|
|
} |
|
|
|
|
movePlayer(&player); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -212,7 +236,6 @@ int main() { |
|
|
|
|
if(player.nextYpos > viewportWinRows-1){ |
|
|
|
|
player.nextYpos = viewportWinRows-1; |
|
|
|
|
} |
|
|
|
|
movePlayer(&player); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -223,7 +246,6 @@ int main() { |
|
|
|
|
if(player.nextXpos < 0){ |
|
|
|
|
player.nextXpos = 0; |
|
|
|
|
} |
|
|
|
|
movePlayer(&player); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -234,7 +256,6 @@ int main() { |
|
|
|
|
if(player.nextXpos > viewportWinCols-1){ |
|
|
|
|
player.nextXpos = viewportWinCols-1; |
|
|
|
|
} |
|
|
|
|
movePlayer(&player); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|