|
|
@ -51,8 +51,8 @@ struct Entity { |
|
|
|
|
|
|
|
|
|
|
|
struct Entity player = {.type="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 Entity *zombies[MAX_ZOMBIES]; |
|
|
|
struct Entity zombies[MAX_ZOMBIES]; |
|
|
|
struct Entity *allEntities[MAX_ALIVE]; |
|
|
|
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='Z', .curYpos=5, .curXpos=5, .nextYpos=5, .nextXpos=5 ,.isAlive=1}; |
|
|
|
|
|
|
|
|
|
|
|
struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; |
|
|
|
struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; |
|
|
@ -62,9 +62,9 @@ struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity= |
|
|
|
struct Entity * collisionDetect(int objYpos, int objXpos){ |
|
|
|
struct Entity * collisionDetect(int objYpos, int objXpos){ |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
for(i=0; i<MAX_ALIVE; i++){ |
|
|
|
for(i=0; i<MAX_ALIVE; i++){ |
|
|
|
if(allEntities[i] && allEntities[i]->isAlive){ |
|
|
|
if(allEntities[i].isAlive){ |
|
|
|
if(objYpos==allEntities[i]->curYpos && objXpos==allEntities[i]->curXpos){ |
|
|
|
if(objYpos==allEntities[i].curYpos && objXpos==allEntities[i].curXpos){ |
|
|
|
return allEntities[i]; |
|
|
|
return &allEntities[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}
|
|
|
|
}
|
|
|
@ -107,7 +107,7 @@ void moveProjectiles(){ |
|
|
|
if(hitEntity->type=="zombie"){ |
|
|
|
if(hitEntity->type=="zombie"){ |
|
|
|
projectiles[i].isAlive=0; |
|
|
|
projectiles[i].isAlive=0; |
|
|
|
hitEntity->isAlive=0; |
|
|
|
hitEntity->isAlive=0; |
|
|
|
mvwaddch(viewportWin, allEntities[i]->curYpos, allEntities[i]->curXpos, ' '); |
|
|
|
mvwaddch(viewportWin, allEntities[i].curYpos, allEntities[i].curXpos, ' '); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if(mvwinch(viewportWin,projectiles[i].prevYpos, projectiles[i].prevXpos)==projectiles[i].symbol){ |
|
|
|
if(mvwinch(viewportWin,projectiles[i].prevYpos, projectiles[i].prevXpos)==projectiles[i].symbol){ |
|
|
@ -132,8 +132,8 @@ void fireWeapon(struct Weapon *weaponRef, char *direction){ |
|
|
|
} |
|
|
|
} |
|
|
|
projectile.isAlive=1; |
|
|
|
projectile.isAlive=1; |
|
|
|
projectile.distanceTraveled=0; |
|
|
|
projectile.distanceTraveled=0; |
|
|
|
projectile.curYpos=player.curYpos; |
|
|
|
projectile.curYpos=allEntities[0].curYpos; |
|
|
|
projectile.curXpos=player.curXpos; |
|
|
|
projectile.curXpos=allEntities[0].curXpos; |
|
|
|
if(direction=="up"){ |
|
|
|
if(direction=="up"){ |
|
|
|
projectile.range*=.4; |
|
|
|
projectile.range*=.4; |
|
|
|
projectile.direction='w'; |
|
|
|
projectile.direction='w'; |
|
|
@ -156,7 +156,7 @@ void fireWeapon(struct Weapon *weaponRef, char *direction){ |
|
|
|
for(i=0;i<MAX_PROJECTILES;i++){ |
|
|
|
for(i=0;i<MAX_PROJECTILES;i++){ |
|
|
|
if(!projectiles[i].isAlive && !projectiles[i+1].isAlive){ |
|
|
|
if(!projectiles[i].isAlive && !projectiles[i+1].isAlive){ |
|
|
|
projectiles[i]=projectile; |
|
|
|
projectiles[i]=projectile; |
|
|
|
player.weapons[player.curWeapon].curCapacity--; |
|
|
|
allEntities[0].weapons[allEntities[0].curWeapon].curCapacity--; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
}
|
|
|
|
}
|
|
|
@ -165,8 +165,8 @@ void fireWeapon(struct Weapon *weaponRef, char *direction){ |
|
|
|
void drawScore(){ |
|
|
|
void drawScore(){ |
|
|
|
werase(scoreWin); |
|
|
|
werase(scoreWin); |
|
|
|
box(scoreWin, 0, 0); |
|
|
|
box(scoreWin, 0, 0); |
|
|
|
mvwprintw(scoreWin, 1, 1, "Current Weapon: %s",player.weapons[player.curWeapon].name); |
|
|
|
mvwprintw(scoreWin, 1, 1, "Current Weapon: %s",allEntities[0].weapons[allEntities[0].curWeapon].name); |
|
|
|
mvwprintw(scoreWin, 2, 1, "Ammo: %d/%d",player.weapons[player.curWeapon].curCapacity,player.weapons[player.curWeapon].maxCapacity); |
|
|
|
mvwprintw(scoreWin, 2, 1, "Ammo: %d/%d",allEntities[0].weapons[allEntities[0].curWeapon].curCapacity,allEntities[0].weapons[allEntities[0].curWeapon].maxCapacity); |
|
|
|
wnoutrefresh(scoreWin); |
|
|
|
wnoutrefresh(scoreWin); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -174,11 +174,11 @@ void drawViewport(){ |
|
|
|
box(viewportWin,0,0); |
|
|
|
box(viewportWin,0,0); |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
for(i=0; i<MAX_ALIVE; i++){ |
|
|
|
for(i=0; i<MAX_ALIVE; i++){ |
|
|
|
if(allEntities[i] && allEntities[i]->isAlive){ |
|
|
|
if(allEntities[i].isAlive){ |
|
|
|
mvwaddch(viewportWin, allEntities[i]->curYpos, allEntities[i]->curXpos, ' '); |
|
|
|
mvwaddch(viewportWin, allEntities[i].curYpos, allEntities[i].curXpos, ' '); |
|
|
|
mvwaddch(viewportWin, allEntities[i]->nextYpos, allEntities[i]->nextXpos, allEntities[i]->symbol); |
|
|
|
mvwaddch(viewportWin, allEntities[i].nextYpos, allEntities[i].nextXpos, allEntities[i].symbol); |
|
|
|
allEntities[i]->curYpos = allEntities[i]->nextYpos; |
|
|
|
allEntities[i].curYpos = allEntities[i].nextYpos; |
|
|
|
allEntities[i]->curXpos = allEntities[i]->nextXpos; } |
|
|
|
allEntities[i].curXpos = allEntities[i].nextXpos; } |
|
|
|
} |
|
|
|
} |
|
|
|
wnoutrefresh(viewportWin); |
|
|
|
wnoutrefresh(viewportWin); |
|
|
|
doupdate(); |
|
|
|
doupdate(); |
|
|
@ -191,10 +191,10 @@ void initializeWorld() { |
|
|
|
getmaxyx(viewportWin,viewportWinRows,viewportWinCols); |
|
|
|
getmaxyx(viewportWin,viewportWinRows,viewportWinCols); |
|
|
|
scoreWin=newwin(10,scrCols,scrRows-10,0); |
|
|
|
scoreWin=newwin(10,scrCols,scrRows-10,0); |
|
|
|
|
|
|
|
|
|
|
|
allEntities[0]=&player; |
|
|
|
allEntities[0]=player; |
|
|
|
allEntities[1]=&zombie; |
|
|
|
allEntities[1]=zombie; |
|
|
|
player.curYpos=10; |
|
|
|
allEntities[0].curYpos=10; |
|
|
|
player.curXpos=10; |
|
|
|
allEntities[0].curXpos=10; |
|
|
|
zombie.curYpos=rand()%viewportWinRows; |
|
|
|
zombie.curYpos=rand()%viewportWinRows; |
|
|
|
zombie.curYpos=rand()%viewportWinCols; |
|
|
|
zombie.curYpos=rand()%viewportWinCols; |
|
|
|
} |
|
|
|
} |
|
|
@ -209,9 +209,8 @@ int main() { |
|
|
|
initializeWorld(); |
|
|
|
initializeWorld(); |
|
|
|
nodelay(stdscr, TRUE); |
|
|
|
nodelay(stdscr, TRUE); |
|
|
|
int ch; |
|
|
|
int ch; |
|
|
|
|
|
|
|
allEntities[0].weapons[0]=pistol; |
|
|
|
player.weapons[0]=pistol; |
|
|
|
allEntities[0].curWeapon=0;
|
|
|
|
player.curWeapon=0;
|
|
|
|
|
|
|
|
while(1) { |
|
|
|
while(1) { |
|
|
|
drawScore(); |
|
|
|
drawScore(); |
|
|
|
drawViewport(); |
|
|
|
drawViewport(); |
|
|
@ -221,64 +220,64 @@ int main() { |
|
|
|
switch(ch){ |
|
|
|
switch(ch){ |
|
|
|
case 'w': |
|
|
|
case 'w': |
|
|
|
case 'W':{ |
|
|
|
case 'W':{ |
|
|
|
if(player.curYpos > 1){ |
|
|
|
if(allEntities[0].curYpos > 1){ |
|
|
|
player.nextYpos--; |
|
|
|
allEntities[0].nextYpos--; |
|
|
|
if(player.nextYpos < 0){ |
|
|
|
if(allEntities[0].nextYpos < 0){ |
|
|
|
player.nextYpos = 0; |
|
|
|
allEntities[0].nextYpos = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case 's':
|
|
|
|
case 's':
|
|
|
|
case 'S':{ |
|
|
|
case 'S':{ |
|
|
|
if(player.curYpos < viewportWinRows - 2){ |
|
|
|
if(allEntities[0].curYpos < viewportWinRows - 2){ |
|
|
|
player.nextYpos++; |
|
|
|
allEntities[0].nextYpos++; |
|
|
|
if(player.nextYpos > viewportWinRows-1){ |
|
|
|
if(allEntities[0].nextYpos > viewportWinRows-1){ |
|
|
|
player.nextYpos = viewportWinRows-1; |
|
|
|
allEntities[0].nextYpos = viewportWinRows-1; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case 'a': |
|
|
|
case 'a': |
|
|
|
case 'A':{ |
|
|
|
case 'A':{ |
|
|
|
if(player.curXpos > 1){ |
|
|
|
if(allEntities[0].curXpos > 1){ |
|
|
|
player.nextXpos--; |
|
|
|
allEntities[0].nextXpos--; |
|
|
|
if(player.nextXpos < 0){ |
|
|
|
if(allEntities[0].nextXpos < 0){ |
|
|
|
player.nextXpos = 0; |
|
|
|
allEntities[0].nextXpos = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case 'd': |
|
|
|
case 'd': |
|
|
|
case 'D':{ |
|
|
|
case 'D':{ |
|
|
|
if(player.curXpos < scrCols-2){ |
|
|
|
if(allEntities[0].curXpos < scrCols-2){ |
|
|
|
player.nextXpos++; |
|
|
|
allEntities[0].nextXpos++; |
|
|
|
if(player.nextXpos > viewportWinCols-1){ |
|
|
|
if(allEntities[0].nextXpos > viewportWinCols-1){ |
|
|
|
player.nextXpos = viewportWinCols-1; |
|
|
|
allEntities[0].nextXpos = viewportWinCols-1; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case KEY_UP:{ |
|
|
|
case KEY_UP:{ |
|
|
|
if(player.weapons[player.curWeapon].curCapacity>0){ |
|
|
|
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
|
|
|
fireWeapon(&pistol, "up"); |
|
|
|
fireWeapon(&pistol, "up"); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case KEY_LEFT:{ |
|
|
|
case KEY_LEFT:{ |
|
|
|
if(player.weapons[player.curWeapon].curCapacity>0){ |
|
|
|
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
|
|
|
fireWeapon(&pistol, "left"); |
|
|
|
fireWeapon(&pistol, "left"); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case KEY_DOWN:{ |
|
|
|
case KEY_DOWN:{ |
|
|
|
if(player.weapons[player.curWeapon].curCapacity>0){ |
|
|
|
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
|
|
|
fireWeapon(&pistol, "down"); |
|
|
|
fireWeapon(&pistol, "down"); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case KEY_RIGHT:{ |
|
|
|
case KEY_RIGHT:{ |
|
|
|
if(player.weapons[player.curWeapon].curCapacity>0){ |
|
|
|
if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ |
|
|
|
fireWeapon(&pistol, "right"); |
|
|
|
fireWeapon(&pistol, "right"); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|