parent
307309e8a3
commit
0ce6b2ef3d
8 changed files with 408 additions and 436 deletions
@ -0,0 +1,12 @@ |
||||
#include <world.h> |
||||
struct Entity * collisionDetect(int objYpos, int objXpos){ |
||||
int i; |
||||
for(i=1; i<MAX_ALIVE; i++){ |
||||
if(allEntities[i].isAlive){ |
||||
if(objYpos==allEntities[i].curYpos && objXpos==allEntities[i].curXpos){ |
||||
return &allEntities[i]; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
@ -0,0 +1,37 @@ |
||||
#include <world.h> |
||||
#include <screen.h> |
||||
#include <stdlib.h> |
||||
void drawScore(){ |
||||
werase(scoreWin); |
||||
box(scoreWin, 0, 0); |
||||
mvwprintw(scoreWin, 1, 1, "Current Weapon: %s",allEntities[0].weapons[allEntities[0].curWeapon].name); |
||||
mvwprintw(scoreWin, 2, 1, "Ammo: %d/%d",allEntities[0].weapons[allEntities[0].curWeapon].curCapacity,allEntities[0].weapons[allEntities[0].curWeapon].maxCapacity); |
||||
wnoutrefresh(scoreWin); |
||||
} |
||||
|
||||
void drawGameOverWin(){ |
||||
getmaxyx(stdscr,scrRows,scrCols); |
||||
gameOverWin=newwin(scrRows/2,scrCols/2,scrRows/4,scrCols/4); |
||||
nodelay(stdscr, FALSE); |
||||
box(gameOverWin,0,0); |
||||
wnoutrefresh(gameOverWin); |
||||
doupdate(); |
||||
getch(); |
||||
endwin(); |
||||
exit(0); |
||||
} |
||||
|
||||
void drawViewport(){ |
||||
box(viewportWin,0,0); |
||||
int i; |
||||
for(i=0; i<MAX_ALIVE; i++){ |
||||
if(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; |
||||
} |
||||
} |
||||
wnoutrefresh(viewportWin); |
||||
doupdate(); |
||||
} |
@ -0,0 +1,100 @@ |
||||
#include <world.h> |
||||
#include <screen.h> |
||||
#include <collisionDetection.h> |
||||
void gameLoop(){ |
||||
int lastPressed; |
||||
while(1) { |
||||
drawScore(); |
||||
drawViewport(); |
||||
//addZombie();
|
||||
moveProjectiles(); |
||||
moveZombies(); |
||||
doupdate(); |
||||
|
||||
int ch; |
||||
ch = getch(); |
||||
switch(ch){ |
||||
case 'w': |
||||
case 'W':{ |
||||
if(allEntities[0].curYpos > 1){ |
||||
allEntities[0].nextYpos--; |
||||
if(allEntities[0].nextYpos < 0){ |
||||
allEntities[0].nextYpos = 0; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
case 's':
|
||||
case 'S':{ |
||||
if(allEntities[0].curYpos < viewportWinRows - 2){ |
||||
allEntities[0].nextYpos++; |
||||
if(allEntities[0].nextYpos > viewportWinRows-1){ |
||||
allEntities[0].nextYpos = viewportWinRows-1; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
case 'a': |
||||
case 'A':{ |
||||
if(allEntities[0].curXpos > 1){ |
||||
allEntities[0].nextXpos--; |
||||
if(allEntities[0].nextXpos < 0){ |
||||
allEntities[0].nextXpos = 0; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
case 'd': |
||||
case 'D':{ |
||||
if(allEntities[0].curXpos < scrCols-2){ |
||||
allEntities[0].nextXpos++; |
||||
if(allEntities[0].nextXpos > viewportWinCols-1){ |
||||
allEntities[0].nextXpos = viewportWinCols-1; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
case 'z': |
||||
case 'Z':{ |
||||
addZombie(); |
||||
break; |
||||
} |
||||
case KEY_UP:{ |
||||
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
||||
fireWeapon(&allEntities[0].weapons[allEntities[0].curWeapon], "up"); |
||||
} |
||||
break; |
||||
} |
||||
case KEY_LEFT:{ |
||||
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
||||
fireWeapon(&allEntities[0].weapons[allEntities[0].curWeapon], "left"); |
||||
} |
||||
break; |
||||
} |
||||
case KEY_DOWN:{ |
||||
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
||||
fireWeapon(&allEntities[0].weapons[allEntities[0].curWeapon], "down"); |
||||
} |
||||
break; |
||||
} |
||||
case KEY_RIGHT:{ |
||||
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
||||
fireWeapon(&allEntities[0].weapons[allEntities[0].curWeapon], "right"); |
||||
} |
||||
break; |
||||
} |
||||
|
||||
default: |
||||
if (ch != ERR) {lastPressed=ch;}; |
||||
break; |
||||
} |
||||
struct Entity * hitEntity = (struct Entity *)collisionDetect(allEntities[0].curYpos, allEntities[0].curXpos); |
||||
if(hitEntity){ |
||||
if(!strcmp(hitEntity->type,"zombie")){ |
||||
allEntities[0].isAlive=0; |
||||
mvwaddch(viewportWin, allEntities[0].curYpos, allEntities[0].curXpos, ' '); |
||||
drawGameOverWin(); |
||||
}
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,84 @@ |
||||
#include <screen.h> |
||||
#include <world.h> |
||||
#include <getPos.h> |
||||
int getOpenPos(){ |
||||
int chooseAnother=1; |
||||
while(chooseAnother){ |
||||
spaceExists: |
||||
openPos.y=(rand()%(viewportWinRows-1)+1); |
||||
openPos.x=(rand()%(viewportWinCols-1)+1); |
||||
if(mvwinch(viewportWin,openPos.y,openPos.x)==' '){ |
||||
int i; |
||||
for(i=1;i<MAX_ALIVE;i++){ |
||||
if(allEntities[i].isAlive && allEntities[i].curYpos==openPos.y && allEntities[i].curXpos==openPos.x){ |
||||
chooseAnother=1; |
||||
} |
||||
else{ |
||||
chooseAnother=0; |
||||
} |
||||
} |
||||
} |
||||
else{ |
||||
int x,y; |
||||
for(y=0;y<viewportWinRows;y++){ |
||||
for(x=0;x<viewportWinCols;x++){ |
||||
if(mvwinch(viewportWin,y,x)==' '){
|
||||
chooseAnother=1; |
||||
goto spaceExists; |
||||
} |
||||
} |
||||
} |
||||
return 0; |
||||
} |
||||
} |
||||
return 1; |
||||
} |
||||
|
||||
void getNextPos(int y, int x, int y2, int x2){ |
||||
int w = x2 - x; |
||||
int h = y2 - y; |
||||
int dx1 = 0, dy1 = 0, dx2 = 0, dy2 =0; |
||||
if (w<0){
|
||||
dx1 = -1; |
||||
}
|
||||
else if(w>0){
|
||||
dx1 = 1; |
||||
} |
||||
if (h<0){
|
||||
dy1 = -1; |
||||
}
|
||||
else if(h>0){
|
||||
dy1 = 1; |
||||
} |
||||
if (w<0){
|
||||
dx2 = -1; |
||||
}
|
||||
else if(w>0){
|
||||
dx2 = 1; |
||||
} |
||||
int longest = abs(w); |
||||
int shortest = abs(h); |
||||
if (!(longest>shortest)) { |
||||
longest = abs(h); |
||||
shortest = abs(w); |
||||
if (h<0){ |
||||
dy2 = -1; |
||||
} |
||||
else if (h>0){ |
||||
dy2 = 1; |
||||
} |
||||
dx2 = 0;
|
||||
} |
||||
int numerator = longest >> 1; |
||||
numerator += shortest; |
||||
if (!(numerator<longest)) { |
||||
numerator -= longest; |
||||
x += dx1; |
||||
y += dy1; |
||||
} else { |
||||
x += dx2; |
||||
y += dy2; |
||||
} |
||||
nextPos.x = x; |
||||
nextPos.y = y; |
||||
} |
@ -0,0 +1,34 @@ |
||||
#include <structs.h> |
||||
#include <string.h> |
||||
#include <ncurses.h> |
||||
#include <world.h> |
||||
#include <screen.h> |
||||
|
||||
|
||||
void initializeWorld() { |
||||
struct Entity player = {.type="player",.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; |
||||
struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; |
||||
|
||||
srand(time(NULL)); |
||||
initscr(); |
||||
curs_set(0); |
||||
cbreak(); |
||||
nodelay(stdscr, TRUE); |
||||
keypad(stdscr, TRUE); |
||||
noecho(); |
||||
getmaxyx(stdscr,scrRows,scrCols); |
||||
viewportWin=newwin(scrRows-10,scrCols,0,0); |
||||
getmaxyx(viewportWin,viewportWinRows,viewportWinCols); |
||||
scoreWin=newwin(10,scrCols,scrRows-10,0); |
||||
|
||||
allEntities[0]=player; |
||||
allEntities[0].curYpos=(rand()%(viewportWinRows-2))+1; |
||||
allEntities[0].curXpos=(rand()%(viewportWinCols-2))+1; |
||||
allEntities[0].nextYpos=allEntities[0].curYpos; |
||||
allEntities[0].nextXpos=allEntities[0].curXpos; |
||||
allEntities[0].weapons[0]=pistol; |
||||
allEntities[0].curWeapon=0; |
||||
|
||||
|
||||
} |
||||
|
@ -1,439 +1,4 @@ |
||||
#include <ncurses.h> |
||||
#include <string.h> |
||||
#include <math.h> |
||||
#define MAX_PROJECTILES 2 |
||||
#define MAX_ZOMBIES 1000 |
||||
#define MAX_ALIVE 10 |
||||
|
||||
int scrRows,scrCols; |
||||
int viewportWinRows,viewportWinCols; |
||||
int lastPressed; |
||||
|
||||
WINDOW* viewportWin; |
||||
|
||||
WINDOW* scoreWin; |
||||
|
||||
struct Projectile{ |
||||
int isAlive; |
||||
char symbol; |
||||
int curXpos; |
||||
int curYpos; |
||||
int prevYpos; |
||||
int prevXpos; |
||||
int nextYpos; |
||||
int nextXpos; |
||||
int range; |
||||
char direction; |
||||
int distanceTraveled; |
||||
}; |
||||
struct Projectile projectiles[MAX_PROJECTILES]; |
||||
|
||||
struct Weapon{ |
||||
char name[10]; |
||||
int range; |
||||
int maxCapacity; |
||||
int curCapacity; |
||||
char projectileSymbol; |
||||
char symbols[8]; |
||||
}; |
||||
|
||||
struct Entity { |
||||
char *type; |
||||
char symbol; |
||||
int curYpos, curXpos; |
||||
int nextYpos, nextXpos; |
||||
struct Weapon weapons[8]; |
||||
int curWeapon; |
||||
int isAlive; |
||||
}; |
||||
|
||||
|
||||
struct Entity player = {.type="player",.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; |
||||
struct Entity allEntities[MAX_ALIVE]; |
||||
|
||||
struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; |
||||
|
||||
|
||||
struct Entity * collisionDetect(int objYpos, int objXpos){ |
||||
int i; |
||||
for(i=1; i<MAX_ALIVE; i++){ |
||||
if(allEntities[i].isAlive){ |
||||
if(objYpos==allEntities[i].curYpos && objXpos==allEntities[i].curXpos){ |
||||
return &allEntities[i]; |
||||
} |
||||
} |
||||
} |
||||
return NULL;
|
||||
} |
||||
|
||||
|
||||
void moveProjectiles(){ |
||||
int i; |
||||
for(i=0; i<MAX_PROJECTILES; i++){ |
||||
if(projectiles[i].isAlive){ |
||||
projectiles[i].prevYpos=projectiles[i].curYpos; |
||||
projectiles[i].prevXpos=projectiles[i].curXpos; |
||||
|
||||
switch(projectiles[i].direction){ |
||||
case 'w':{ |
||||
projectiles[i].curYpos--; |
||||
break; |
||||
} |
||||
|
||||
case 'a':{ |
||||
projectiles[i].curXpos--; |
||||
break; |
||||
} |
||||
|
||||
case 's':{ |
||||
projectiles[i].curYpos++; |
||||
break; |
||||
} |
||||
|
||||
case 'd':{ |
||||
projectiles[i].curXpos++; |
||||
break; |
||||
} |
||||
|
||||
} |
||||
projectiles[i].distanceTraveled++; |
||||
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, projectiles[i].symbol); |
||||
struct Entity * hitEntity = collisionDetect(projectiles[i].curYpos, projectiles[i].curXpos); |
||||
if(hitEntity){ |
||||
if(!strcmp(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, ' '); |
||||
}
|
||||
if(projectiles[i].distanceTraveled>=projectiles[i].range || projectiles[i].curYpos > viewportWinRows || projectiles[i].curYpos < 0 || projectiles[i].curXpos > viewportWinCols || projectiles[i].curXpos < 0){ |
||||
projectiles[i].isAlive=0; |
||||
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); |
||||
} |
||||
usleep(30000); |
||||
} |
||||
else{ |
||||
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void fireWeapon(struct Weapon *weaponRef, char *direction){ |
||||
struct Projectile projectile; |
||||
if (!strcmp(weaponRef->name,"Pistol")){ |
||||
projectile.range=20; |
||||
} |
||||
projectile.isAlive=1; |
||||
projectile.distanceTraveled=0; |
||||
projectile.curYpos=allEntities[0].curYpos; |
||||
projectile.curXpos=allEntities[0].curXpos; |
||||
if(!strcmp(direction,"up")){ |
||||
projectile.range*=.4; |
||||
projectile.direction='w'; |
||||
projectile.symbol=weaponRef->symbols[2]; |
||||
} |
||||
if(!strcmp(direction,"left")){ |
||||
projectile.direction='a'; |
||||
projectile.symbol=weaponRef->symbols[0]; |
||||
}
|
||||
if(!strcmp(direction,"down")){ |
||||
projectile.range*=.4; |
||||
projectile.direction='s'; |
||||
projectile.symbol=weaponRef->symbols[6]; |
||||
}
|
||||
if(!strcmp(direction,"right")){ |
||||
projectile.direction='d'; |
||||
projectile.symbol=weaponRef->symbols[4]; |
||||
}
|
||||
int i; |
||||
for(i=0;i<MAX_PROJECTILES;i++){ |
||||
if(!projectiles[i].isAlive && !projectiles[i+1].isAlive){ |
||||
projectiles[i]=projectile; |
||||
allEntities[0].weapons[allEntities[0].curWeapon].curCapacity--; |
||||
break; |
||||
} |
||||
}
|
||||
} |
||||
|
||||
void drawScore(){ |
||||
werase(scoreWin); |
||||
box(scoreWin, 0, 0); |
||||
mvwprintw(scoreWin, 1, 1, "Current Weapon: %s",allEntities[0].weapons[allEntities[0].curWeapon].name); |
||||
mvwprintw(scoreWin, 2, 1, "Ammo: %d/%d",allEntities[0].weapons[allEntities[0].curWeapon].curCapacity,allEntities[0].weapons[allEntities[0].curWeapon].maxCapacity); |
||||
wnoutrefresh(scoreWin); |
||||
} |
||||
|
||||
void drawViewport(){ |
||||
box(viewportWin,0,0); |
||||
int i; |
||||
for(i=0; i<MAX_ALIVE; i++){ |
||||
if(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; |
||||
} |
||||
} |
||||
wnoutrefresh(viewportWin); |
||||
doupdate(); |
||||
} |
||||
|
||||
struct possiblePos{ |
||||
int x; |
||||
int y; |
||||
}openPos; |
||||
|
||||
int getOpenPos(){ |
||||
int chooseAnother=1; |
||||
while(chooseAnother){ |
||||
spaceExists: |
||||
openPos.y=(rand()%(viewportWinRows-1)+1); |
||||
openPos.x=(rand()%(viewportWinCols-1)+1); |
||||
if(mvwinch(viewportWin,openPos.y,openPos.x)==' '){ |
||||
int i; |
||||
for(i=1;i<MAX_ALIVE;i++){ |
||||
if(allEntities[i].isAlive && allEntities[i].curYpos==openPos.y && allEntities[i].curXpos==openPos.x){ |
||||
chooseAnother=1; |
||||
} |
||||
else{ |
||||
chooseAnother=0; |
||||
} |
||||
} |
||||
} |
||||
else{ |
||||
int x,y; |
||||
for(y=0;y<viewportWinRows;y++){ |
||||
for(x=0;x<viewportWinCols;x++){ |
||||
if(mvwinch(viewportWin,y,x)==' '){
|
||||
chooseAnother=1; |
||||
goto spaceExists; |
||||
} |
||||
} |
||||
} |
||||
return 0; |
||||
} |
||||
} |
||||
return 1; |
||||
} |
||||
|
||||
|
||||
void addZombie(){ |
||||
if(getOpenPos()){ |
||||
int i; |
||||
for(i=0;i<MAX_ALIVE-1;i++){ |
||||
if(!allEntities[i].isAlive){ |
||||
struct Entity zombie; |
||||
zombie.curYpos=openPos.y; |
||||
zombie.curXpos=openPos.x; |
||||
zombie.nextYpos=openPos.y; |
||||
zombie.nextXpos=openPos.x; |
||||
zombie.type="zombie"; |
||||
zombie.symbol='Z'; |
||||
zombie.isAlive=1; |
||||
allEntities[i]=zombie; |
||||
mvwaddch(viewportWin, allEntities[i].curYpos, allEntities[i].curXpos, allEntities[i].symbol); |
||||
wnoutrefresh(viewportWin); |
||||
doupdate(); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
void initializeWorld() { |
||||
curs_set(0); |
||||
getmaxyx(stdscr,scrRows,scrCols); |
||||
viewportWin=newwin(scrRows-10,scrCols,0,0); |
||||
getmaxyx(viewportWin,viewportWinRows,viewportWinCols); |
||||
scoreWin=newwin(10,scrCols,scrRows-10,0); |
||||
|
||||
allEntities[0]=player; |
||||
allEntities[0].curYpos=(rand()%(viewportWinRows-2))+1; |
||||
allEntities[0].curXpos=(rand()%(viewportWinCols-2))+1; |
||||
allEntities[0].nextYpos=allEntities[0].curYpos; |
||||
allEntities[0].nextXpos=allEntities[0].curXpos; |
||||
} |
||||
|
||||
struct NextPos{ |
||||
int x; |
||||
int y; |
||||
}nextPos; |
||||
|
||||
void getNextPos(int y, int x, int y2, int x2){ |
||||
int w = x2 - x; |
||||
int h = y2 - y; |
||||
int dx1 = 0, dy1 = 0, dx2 = 0, dy2 =0; |
||||
if (w<0){
|
||||
dx1 = -1; |
||||
}
|
||||
else if(w>0){
|
||||
dx1 = 1; |
||||
} |
||||
if (h<0){
|
||||
dy1 = -1; |
||||
}
|
||||
else if(h>0){
|
||||
dy1 = 1; |
||||
} |
||||
if (w<0){
|
||||
dx2 = -1; |
||||
}
|
||||
else if(w>0){
|
||||
dx2 = 1; |
||||
} |
||||
int longest = abs(w); |
||||
int shortest = abs(h); |
||||
if (!(longest>shortest)) { |
||||
longest = abs(h); |
||||
shortest = abs(w); |
||||
if (h<0){ |
||||
dy2 = -1; |
||||
} |
||||
else if (h>0){ |
||||
dy2 = 1; |
||||
} |
||||
dx2 = 0;
|
||||
} |
||||
int numerator = longest >> 1; |
||||
numerator += shortest; |
||||
if (!(numerator<longest)) { |
||||
numerator -= longest; |
||||
x += dx1; |
||||
y += dy1; |
||||
} else { |
||||
x += dx2; |
||||
y += dy2; |
||||
} |
||||
nextPos.x = x; |
||||
nextPos.y = y; |
||||
} |
||||
|
||||
void moveZombies(){ |
||||
int i; |
||||
for(i=1;i<MAX_ALIVE;i++){ |
||||
if(allEntities[i].isAlive){ |
||||
int moveCheck = rand()%10000; |
||||
if(moveCheck==1){ |
||||
getNextPos(allEntities[i].curYpos,allEntities[i].curXpos,allEntities[0].curYpos,allEntities[0].curXpos); |
||||
allEntities[i].nextYpos = nextPos.y; |
||||
allEntities[i].nextXpos = nextPos.x; |
||||
if(allEntities[i].nextYpos < 1 || allEntities[i].nextYpos>viewportWinRows-2){ |
||||
allEntities[i].nextYpos = allEntities[i].curYpos; |
||||
} |
||||
if(allEntities[i].nextXpos < 1 || allEntities[i].nextXpos>viewportWinCols-2){ |
||||
allEntities[i].nextXpos = allEntities[i].curXpos; |
||||
} |
||||
}
|
||||
} |
||||
} |
||||
} |
||||
|
||||
int main() { |
||||
srand(time(NULL)); |
||||
initscr(); |
||||
cbreak(); |
||||
keypad(stdscr, TRUE); |
||||
noecho(); |
||||
initializeWorld(); |
||||
nodelay(stdscr, TRUE); |
||||
int ch; |
||||
allEntities[0].weapons[0]=pistol; |
||||
allEntities[0].curWeapon=0; |
||||
while(1) { |
||||
drawScore(); |
||||
drawViewport(); |
||||
//addZombie();
|
||||
moveProjectiles(); |
||||
moveZombies(); |
||||
doupdate(); |
||||
|
||||
ch = getch(); |
||||
switch(ch){ |
||||
case 'w': |
||||
case 'W':{ |
||||
if(allEntities[0].curYpos > 1){ |
||||
allEntities[0].nextYpos--; |
||||
if(allEntities[0].nextYpos < 0){ |
||||
allEntities[0].nextYpos = 0; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
case 's':
|
||||
case 'S':{ |
||||
if(allEntities[0].curYpos < viewportWinRows - 2){ |
||||
allEntities[0].nextYpos++; |
||||
if(allEntities[0].nextYpos > viewportWinRows-1){ |
||||
allEntities[0].nextYpos = viewportWinRows-1; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
case 'a': |
||||
case 'A':{ |
||||
if(allEntities[0].curXpos > 1){ |
||||
allEntities[0].nextXpos--; |
||||
if(allEntities[0].nextXpos < 0){ |
||||
allEntities[0].nextXpos = 0; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
case 'd': |
||||
case 'D':{ |
||||
if(allEntities[0].curXpos < scrCols-2){ |
||||
allEntities[0].nextXpos++; |
||||
if(allEntities[0].nextXpos > viewportWinCols-1){ |
||||
allEntities[0].nextXpos = viewportWinCols-1; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
case 'z': |
||||
case 'Z':{ |
||||
addZombie(); |
||||
break; |
||||
} |
||||
case KEY_UP:{ |
||||
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
||||
fireWeapon(&pistol, "up"); |
||||
} |
||||
break; |
||||
} |
||||
case KEY_LEFT:{ |
||||
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
||||
fireWeapon(&pistol, "left"); |
||||
} |
||||
break; |
||||
} |
||||
case KEY_DOWN:{ |
||||
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
||||
fireWeapon(&pistol, "down"); |
||||
} |
||||
break; |
||||
} |
||||
case KEY_RIGHT:{ |
||||
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
||||
fireWeapon(&pistol, "right"); |
||||
} |
||||
break; |
||||
} |
||||
|
||||
default: |
||||
if (ch != ERR) {lastPressed=ch;}; |
||||
break; |
||||
} |
||||
struct Entity * hitEntity = collisionDetect(allEntities[0].curYpos, allEntities[0].curXpos); |
||||
if(hitEntity){ |
||||
if(!strcmp(hitEntity->type,"zombie")){ |
||||
mvwprintw(viewportWin,1,10,"TEST");
|
||||
allEntities[0].isAlive=0; |
||||
mvwaddch(viewportWin, allEntities[0].curYpos, allEntities[0].curXpos, ' '); |
||||
} |
||||
} |
||||
|
||||
}
|
||||
return 0;
|
||||
gameLoop(); |
||||
} |
||||
|
@ -0,0 +1,94 @@ |
||||
#include <weaponsSystem.h> |
||||
#include <screen.h> |
||||
#include <world.h> |
||||
#include <collisionDetection.h> |
||||
void moveProjectiles(){ |
||||
int i; |
||||
for(i=0; i<MAX_PROJECTILES; i++){ |
||||
if(projectiles[i].isAlive){ |
||||
projectiles[i].prevYpos=projectiles[i].curYpos; |
||||
projectiles[i].prevXpos=projectiles[i].curXpos; |
||||
|
||||
switch(projectiles[i].direction){ |
||||
case 'w':{ |
||||
projectiles[i].curYpos--; |
||||
break; |
||||
} |
||||
|
||||
case 'a':{ |
||||
projectiles[i].curXpos--; |
||||
break; |
||||
} |
||||
|
||||
case 's':{ |
||||
projectiles[i].curYpos++; |
||||
break; |
||||
} |
||||
|
||||
case 'd':{ |
||||
projectiles[i].curXpos++; |
||||
break; |
||||
} |
||||
|
||||
} |
||||
projectiles[i].distanceTraveled++; |
||||
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, projectiles[i].symbol); |
||||
struct Entity * hitEntity = collisionDetect(projectiles[i].curYpos, projectiles[i].curXpos); |
||||
if(hitEntity){ |
||||
if(!strcmp(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, ' '); |
||||
}
|
||||
if(projectiles[i].distanceTraveled>=projectiles[i].range || projectiles[i].curYpos > viewportWinRows || projectiles[i].curYpos < 0 || projectiles[i].curXpos > viewportWinCols || projectiles[i].curXpos < 0){ |
||||
projectiles[i].isAlive=0; |
||||
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); |
||||
} |
||||
usleep(30000); |
||||
} |
||||
else{ |
||||
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void fireWeapon(struct Weapon *weaponRef, char *direction){ |
||||
struct Projectile projectile; |
||||
if (!strcmp(weaponRef->name,"Pistol")){ |
||||
projectile.range=20; |
||||
} |
||||
projectile.isAlive=1; |
||||
projectile.distanceTraveled=0; |
||||
projectile.curYpos=allEntities[0].curYpos; |
||||
projectile.curXpos=allEntities[0].curXpos; |
||||
if(!strcmp(direction,"up")){ |
||||
projectile.range*=.4; |
||||
projectile.direction='w'; |
||||
projectile.symbol=weaponRef->symbols[2]; |
||||
} |
||||
if(!strcmp(direction,"left")){ |
||||
projectile.direction='a'; |
||||
projectile.symbol=weaponRef->symbols[0]; |
||||
}
|
||||
if(!strcmp(direction,"down")){ |
||||
projectile.range*=.4; |
||||
projectile.direction='s'; |
||||
projectile.symbol=weaponRef->symbols[6]; |
||||
}
|
||||
if(!strcmp(direction,"right")){ |
||||
projectile.direction='d'; |
||||
projectile.symbol=weaponRef->symbols[4]; |
||||
}
|
||||
int i; |
||||
for(i=0;i<MAX_PROJECTILES;i++){ |
||||
if(!projectiles[i].isAlive && !projectiles[i+1].isAlive){ |
||||
projectiles[i]=projectile; |
||||
allEntities[0].weapons[allEntities[0].curWeapon].curCapacity--; |
||||
break; |
||||
} |
||||
}
|
||||
} |
@ -0,0 +1,46 @@ |
||||
#include <world.h> |
||||
#include <getPos.h> |
||||
#include <screen.h> |
||||
|
||||
void addZombie(){ |
||||
if(getOpenPos()){ |
||||
int i; |
||||
for(i=0;i<MAX_ALIVE-1;i++){ |
||||
if(!allEntities[i].isAlive){ |
||||
struct Entity zombie; |
||||
zombie.curYpos=openPos.y; |
||||
zombie.curXpos=openPos.x; |
||||
zombie.nextYpos=openPos.y; |
||||
zombie.nextXpos=openPos.x; |
||||
zombie.type="zombie"; |
||||
zombie.symbol='Z'; |
||||
zombie.isAlive=1; |
||||
allEntities[i]=zombie; |
||||
mvwaddch(viewportWin, allEntities[i].curYpos, allEntities[i].curXpos, allEntities[i].symbol); |
||||
wnoutrefresh(viewportWin); |
||||
doupdate(); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
void moveZombies(){ |
||||
int i; |
||||
for(i=1;i<MAX_ALIVE;i++){ |
||||
if(allEntities[i].isAlive){ |
||||
int moveCheck = rand()%10000; |
||||
if(moveCheck==1){ |
||||
getNextPos(allEntities[i].curYpos,allEntities[i].curXpos,allEntities[0].curYpos,allEntities[0].curXpos); |
||||
allEntities[i].nextYpos = nextPos.y; |
||||
allEntities[i].nextXpos = nextPos.x; |
||||
if(allEntities[i].nextYpos < 1 || allEntities[i].nextYpos>viewportWinRows-2){ |
||||
allEntities[i].nextYpos = allEntities[i].curYpos; |
||||
} |
||||
if(allEntities[i].nextXpos < 1 || allEntities[i].nextXpos>viewportWinCols-2){ |
||||
allEntities[i].nextXpos = allEntities[i].curXpos; |
||||
} |
||||
}
|
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue