|
|
|
@ -3,7 +3,7 @@ |
|
|
|
|
|
|
|
|
|
#define MAX_PROJECTILES 2 |
|
|
|
|
#define MAX_ZOMBIES 1000 |
|
|
|
|
#define MAX_ALIVE 10000 |
|
|
|
|
#define MAX_ALIVE 10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int scrRows,scrCols; |
|
|
|
@ -50,10 +50,9 @@ struct Entity { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct Entity player = {.type="player",.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.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 Entity zombie = {.type="zombie", .symbol='A', .curYpos=5, .curXpos=5, .nextYpos=5, .nextXpos=5 ,.isAlive=1}; |
|
|
|
|
|
|
|
|
|
struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; |
|
|
|
|
|
|
|
|
@ -178,12 +177,74 @@ void drawViewport(){ |
|
|
|
|
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; } |
|
|
|
|
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); |
|
|
|
@ -192,11 +253,17 @@ void initializeWorld() { |
|
|
|
|
scoreWin=newwin(10,scrCols,scrRows-10,0); |
|
|
|
|
|
|
|
|
|
allEntities[0]=player; |
|
|
|
|
allEntities[0].curYpos=(rand()%(viewportWinRows-2))+1; |
|
|
|
|
allEntities[0].curXpos=(rand()%(viewportWinCols-2))+1; |
|
|
|
|
10; |
|
|
|
|
allEntities[0].nextYpos=allEntities[0].curYpos; |
|
|
|
|
allEntities[0].nextXpos=allEntities[0].curXpos; |
|
|
|
|
allEntities[1]=zombie; |
|
|
|
|
allEntities[0].curYpos=10; |
|
|
|
|
allEntities[0].curXpos=10; |
|
|
|
|
zombie.curYpos=rand()%viewportWinRows; |
|
|
|
|
zombie.curYpos=rand()%viewportWinCols; |
|
|
|
|
allEntities[1].curYpos=(rand()%(viewportWinRows-2))+1; |
|
|
|
|
allEntities[1].curXpos=(rand()%(viewportWinCols-2))+1; |
|
|
|
|
11; |
|
|
|
|
allEntities[1].nextYpos=allEntities[1].curYpos; |
|
|
|
|
allEntities[1].nextXpos=allEntities[1].curXpos; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int main() { |
|
|
|
@ -210,10 +277,11 @@ int main() { |
|
|
|
|
nodelay(stdscr, TRUE); |
|
|
|
|
int ch; |
|
|
|
|
allEntities[0].weapons[0]=pistol; |
|
|
|
|
allEntities[0].curWeapon=0;
|
|
|
|
|
allEntities[0].curWeapon=0; |
|
|
|
|
while(1) { |
|
|
|
|
drawScore(); |
|
|
|
|
drawViewport(); |
|
|
|
|
addZombie(); |
|
|
|
|
moveProjectiles(); |
|
|
|
|
doupdate(); |
|
|
|
|
ch = getch(); |
|
|
|
@ -258,6 +326,11 @@ int main() { |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case 'z': |
|
|
|
|
case 'Z':{ |
|
|
|
|
addZombie(); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case KEY_UP:{ |
|
|
|
|
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
|
|
|
|
fireWeapon(&pistol, "up"); |
|
|
|
@ -290,9 +363,8 @@ int main() { |
|
|
|
|
struct Entity * hitEntity = collisionDetect(allEntities[0].curYpos, allEntities[0].curXpos); |
|
|
|
|
if(hitEntity){ |
|
|
|
|
if(hitEntity->type=="zombie"){ |
|
|
|
|
mvwprintw(viewportWin,1,1,"TEST");
|
|
|
|
|
mvwprintw(viewportWin,1,10,"TEST");
|
|
|
|
|
allEntities[0].isAlive=0; |
|
|
|
|
hitEntity->isAlive=0; |
|
|
|
|
mvwaddch(viewportWin, allEntities[0].curYpos, allEntities[0].curXpos, ' '); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|