:|
This commit is contained in:
commit
fd2f7f494a
10
include/Chaser.hpp
Normal file
10
include/Chaser.hpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#ifndef _CHASER_HPP_
|
||||||
|
#define _CHASER_HPP_
|
||||||
|
|
||||||
|
class Chaser: public Enemy
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Chaser(int posx, int posy);
|
||||||
|
virtual void action(int px, int py);
|
||||||
|
};
|
||||||
|
#endif
|
14
include/Enemy.hpp
Normal file
14
include/Enemy.hpp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef _ENEMY_HPP_
|
||||||
|
#define _ENEMY_HPP_
|
||||||
|
#include "../include/Entity.hpp"
|
||||||
|
|
||||||
|
class Enemy: public Entity
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void action(int px, int py) = 0;
|
||||||
|
virtual bool damage(int dmg);
|
||||||
|
protected:
|
||||||
|
int hp;
|
||||||
|
int dmg;
|
||||||
|
};
|
||||||
|
#endif
|
25
include/Entity.hpp
Normal file
25
include/Entity.hpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef _ENTITY_HPP_
|
||||||
|
#define _ENTITY_HPP_
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Entity
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Entity();
|
||||||
|
~Entity();
|
||||||
|
virtual void action(int px, int py) = 0;
|
||||||
|
virtual bool damage(int dmg) = 0;
|
||||||
|
static Entity* getById(int id);
|
||||||
|
int getId();
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
char symbol;
|
||||||
|
static void InitAction(int px, int py);
|
||||||
|
protected:
|
||||||
|
int id;
|
||||||
|
private:
|
||||||
|
static int nextId;
|
||||||
|
static vector<Entity*> entities;
|
||||||
|
};
|
||||||
|
#endif
|
19
include/Game.hpp
Normal file
19
include/Game.hpp
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef _GAME_HPP_
|
||||||
|
#define _GAME_HPP_
|
||||||
|
|
||||||
|
class Map;
|
||||||
|
class Entity;
|
||||||
|
|
||||||
|
class Game
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Game();
|
||||||
|
bool run(int key);
|
||||||
|
void loadMap();
|
||||||
|
private:
|
||||||
|
void render();
|
||||||
|
void uncover();
|
||||||
|
Player* p;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
21
include/Player.hpp
Normal file
21
include/Player.hpp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#ifndef _PLAYER_HPP_
|
||||||
|
#define _PLAYER_HPP_
|
||||||
|
|
||||||
|
class Player: public Entity
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Player(int posx, int posy);
|
||||||
|
bool driver(int key);
|
||||||
|
bool displayStats();
|
||||||
|
virtual void action(int px, int py){};
|
||||||
|
virtual bool damage(int dmg);
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int perc;
|
||||||
|
int dmg;
|
||||||
|
private:
|
||||||
|
int hp;
|
||||||
|
int max_hp;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
16
include/Projectile.hpp
Normal file
16
include/Projectile.hpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef _PROJECTILE_HPP_
|
||||||
|
#define _PROJECTILE_HPP_
|
||||||
|
|
||||||
|
class Projectile: public Entity
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Projectile(int posx, int posy, int dir, int dam);
|
||||||
|
virtual void action(int px, int py);
|
||||||
|
virtual bool damage(int dmg);
|
||||||
|
int dir;
|
||||||
|
private:
|
||||||
|
int dmg;
|
||||||
|
friend class LiveForm;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
BIN
include/Projectile.hpp.gch
Normal file
BIN
include/Projectile.hpp.gch
Normal file
Binary file not shown.
13
include/Sentry.hpp
Normal file
13
include/Sentry.hpp
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef _SENTRY_HPP_
|
||||||
|
#define _SENTRY_HPP_
|
||||||
|
|
||||||
|
class Sentry: public Enemy
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Sentry(int posx, int posy);
|
||||||
|
virtual void action(int px, int py);
|
||||||
|
private:
|
||||||
|
int proximity;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
38
src/Chaser.cpp
Normal file
38
src/Chaser.cpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include "../include/Chaser.hpp"
|
||||||
|
|
||||||
|
extern int map[32][32];
|
||||||
|
extern bool u_map[32][32];
|
||||||
|
|
||||||
|
Chaser::Chaser(int posx, int posy)
|
||||||
|
{
|
||||||
|
x = posx;
|
||||||
|
y = posy;
|
||||||
|
symbol = 'e';
|
||||||
|
srand (time(NULL));
|
||||||
|
hp = (rand() % 30) + 1;
|
||||||
|
dmg = (rand() % 25) + 1;
|
||||||
|
map[posx][posy] = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Chaser::action(int px, int py)
|
||||||
|
{
|
||||||
|
if((px == x + 1 || px == x - 1) && (py == y + 1 || py == y - 1))
|
||||||
|
Entity::getById(128)->damage(dmg);
|
||||||
|
else if(px > x && (map[x + 1][y] == 32)){
|
||||||
|
map[x][y] = ' ';
|
||||||
|
x++;
|
||||||
|
map[x][y] = id;
|
||||||
|
} else if(px < x && (map[x + 1][y] == 32)){
|
||||||
|
map[x][y] = ' ';
|
||||||
|
x--;
|
||||||
|
map[x][y] = id;
|
||||||
|
} else if(py > y && (map[x][y + 1] == 32)){
|
||||||
|
map[x][y] = ' ';
|
||||||
|
y++;
|
||||||
|
map[x][y] = id;
|
||||||
|
} else if(px < y && (map[x][y - 1] == 32)){
|
||||||
|
map[x][y] = ' ';
|
||||||
|
y--;
|
||||||
|
map[x][y] = id;
|
||||||
|
}
|
||||||
|
}
|
12
src/Enemy.cpp
Normal file
12
src/Enemy.cpp
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include "../include/Enemy.hpp"
|
||||||
|
|
||||||
|
extern int map[32][32];
|
||||||
|
extern bool u_map[32][32];
|
||||||
|
|
||||||
|
bool Enemy::damage(int dmg)
|
||||||
|
{
|
||||||
|
hp = hp - dmg;
|
||||||
|
if(hp <= 0)
|
||||||
|
map[x][y] = '#';
|
||||||
|
return true;
|
||||||
|
}
|
3
src/Enemy.d
Normal file
3
src/Enemy.d
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
src/Enemy.o: src/Enemy.cpp src/../include/Enemy.hpp
|
||||||
|
|
||||||
|
src/../include/Enemy.hpp:
|
42
src/Entity.cpp
Normal file
42
src/Entity.cpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#include "../include/Entity.hpp"
|
||||||
|
|
||||||
|
extern int map[32][32];
|
||||||
|
extern bool u_map[32][32];
|
||||||
|
|
||||||
|
Entity::Entity()
|
||||||
|
{
|
||||||
|
id = nextId++;
|
||||||
|
entities.push_back(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Entity::~Entity()
|
||||||
|
{
|
||||||
|
for (size_t i=0; i<entities.size(); i++) {
|
||||||
|
if (entities[i] == this) {
|
||||||
|
entities[i] = entities.back();
|
||||||
|
entities.pop_back();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Entity::getId(){ return id; }
|
||||||
|
|
||||||
|
Entity* Entity::getById(int id)
|
||||||
|
{
|
||||||
|
for (Entity* e : entities) {
|
||||||
|
if (e->getId() == id) return e;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Entity::InitAction(int px, int py)
|
||||||
|
{
|
||||||
|
for (Entity* e : entities) {
|
||||||
|
//if(u_map[e->x][e->y])
|
||||||
|
e->action(px, py);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Entity::nextId = 128;
|
||||||
|
vector<Entity*> Entity::entities;
|
125
src/Game.cpp
Normal file
125
src/Game.cpp
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
#include "../include/Game.hpp"
|
||||||
|
|
||||||
|
extern int map[32][32];
|
||||||
|
extern bool u_map[32][32];
|
||||||
|
|
||||||
|
Game::Game()
|
||||||
|
{
|
||||||
|
p = new Player(1, 15);
|
||||||
|
loadMap();
|
||||||
|
uncover();
|
||||||
|
render();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Game::loadMap()
|
||||||
|
{
|
||||||
|
char buf;
|
||||||
|
stringstream ss;
|
||||||
|
fstream indexfile;
|
||||||
|
int map_count = 0;
|
||||||
|
int map_num;
|
||||||
|
|
||||||
|
// READ NUMBER OF MAPS
|
||||||
|
indexfile.open("../maps/_index", ios::in);
|
||||||
|
string bufs;
|
||||||
|
while(!indexfile.eof()) {
|
||||||
|
map_count++;
|
||||||
|
getline(indexfile, bufs);
|
||||||
|
}
|
||||||
|
indexfile.close();
|
||||||
|
|
||||||
|
// RANDOMIZING MAP CHOICE
|
||||||
|
srand (time(NULL));
|
||||||
|
map_num = rand() % (map_count - 1);
|
||||||
|
|
||||||
|
// READ MAP FROM FILE
|
||||||
|
fstream file;
|
||||||
|
ss << "../maps/map" << map_num;
|
||||||
|
file.open(ss.str(), ios::in);
|
||||||
|
for(int y=0; y<32; y++){
|
||||||
|
for(int x=0; x<32; x++){
|
||||||
|
file.get(buf);
|
||||||
|
switch(buf){
|
||||||
|
case 'e':
|
||||||
|
srand (time(NULL));
|
||||||
|
//if((rand() % 2))
|
||||||
|
new Sentry(x, y);
|
||||||
|
//else
|
||||||
|
//new Chaser(x, y);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
map[x][y] = buf;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file.get(buf);
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
// ZEROING UNCOVER MAP (SETTING WHOLE MAP AS UNDISCOVERED)
|
||||||
|
for(int y=0; y<32; y++){
|
||||||
|
for(int x=0; x<32; x++)
|
||||||
|
u_map[x][y] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Game::uncover()
|
||||||
|
{
|
||||||
|
int startx, endx, starty, endy;
|
||||||
|
startx = p->x - p->perc;
|
||||||
|
if(startx < 0)
|
||||||
|
startx = 0;
|
||||||
|
starty = p->y - p->perc;
|
||||||
|
if(startx < 0)
|
||||||
|
startx = 0;
|
||||||
|
endx = p->x + p->perc;
|
||||||
|
if(endx > 32)
|
||||||
|
endx = 32;
|
||||||
|
endy = p->y + p->perc;
|
||||||
|
if(endy > 32)
|
||||||
|
endy = 32;
|
||||||
|
|
||||||
|
for(int y = starty; y < endy; y++)
|
||||||
|
for(int x = startx; x< endx; x++)
|
||||||
|
u_map[x][y] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Game::render()
|
||||||
|
{
|
||||||
|
// CLEANING SCREEN
|
||||||
|
system("cls");
|
||||||
|
for(int y=0; y<32; y++){
|
||||||
|
for(int x=0; x<32; x++)
|
||||||
|
if(!u_map[x][y])
|
||||||
|
cout << '*';
|
||||||
|
else if(map[x][y] < 128)
|
||||||
|
cout << char(map[x][y]);
|
||||||
|
else {
|
||||||
|
cout << Entity::getById(map[x][y])->symbol;
|
||||||
|
}
|
||||||
|
cout << '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Game::run(int key)
|
||||||
|
{
|
||||||
|
if(p->driver(key)){
|
||||||
|
Entity::InitAction(p->x, p->y);
|
||||||
|
uncover();
|
||||||
|
render();
|
||||||
|
if(!p->displayStats())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(p->x == 0 || p->x == 31 || p->y == 0 || p->y == 31){
|
||||||
|
loadMap();
|
||||||
|
if(p->x == 0)
|
||||||
|
p->x = 30;
|
||||||
|
else if(p->y == 0)
|
||||||
|
p->y = 30;
|
||||||
|
else if(p->x == 31)
|
||||||
|
p->x = 1;
|
||||||
|
else
|
||||||
|
p->y = 1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
82
src/Player.cpp
Normal file
82
src/Player.cpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#include "../include/Player.hpp"
|
||||||
|
|
||||||
|
extern int map[32][32];
|
||||||
|
extern bool u_map[32][32];
|
||||||
|
|
||||||
|
Player::Player(int posx, int posy)
|
||||||
|
{
|
||||||
|
x = posx;
|
||||||
|
y = posy;
|
||||||
|
hp = 100;
|
||||||
|
max_hp = 100;
|
||||||
|
perc = 7;
|
||||||
|
dmg = 10;
|
||||||
|
map[x][y] = id;
|
||||||
|
symbol = 'O';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Player::displayStats()
|
||||||
|
{
|
||||||
|
if(hp > 0){
|
||||||
|
cout << "HP: " << hp << '/' << max_hp << '\n';
|
||||||
|
return true;
|
||||||
|
} else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Player::damage(int dmg){
|
||||||
|
hp = hp - dmg;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Player::driver(int key)
|
||||||
|
{
|
||||||
|
switch(key){
|
||||||
|
case 'w':
|
||||||
|
if(map[x][y-1] == 32){
|
||||||
|
map[x][y] = 32;
|
||||||
|
y--;
|
||||||
|
map[x][y] = id;
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
if(map[x][y+1] == 32){
|
||||||
|
map[x][y] = 32;
|
||||||
|
y++;
|
||||||
|
map[x][y] = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
else return false;
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
if(map[x-1][y] == 32){
|
||||||
|
map[x][y] = 32;
|
||||||
|
x--;
|
||||||
|
map[x][y] = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
else return false;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
if(map[x+1][y] == 32){
|
||||||
|
map[x][y] = 32;
|
||||||
|
x++;
|
||||||
|
map[x][y] = id;
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
new Projectile(x, y, 0, dmg);
|
||||||
|
break;
|
||||||
|
case 'k':
|
||||||
|
new Projectile(x, y, 1, dmg);
|
||||||
|
break;
|
||||||
|
case 'j':
|
||||||
|
new Projectile(x, y, 2, dmg);
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
new Projectile(x, y, 3, dmg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
57
src/Projectile.cpp
Normal file
57
src/Projectile.cpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#include "../include/Entity.hpp"
|
||||||
|
#include "../include/Projectile.hpp"
|
||||||
|
|
||||||
|
extern int map[32][32];
|
||||||
|
extern bool u_map[32][32];
|
||||||
|
|
||||||
|
Projectile::Projectile(int posx, int posy, int _dir, int _dmg)
|
||||||
|
{
|
||||||
|
x = posx;
|
||||||
|
y = posy;
|
||||||
|
dmg = _dmg;
|
||||||
|
dir = _dir;
|
||||||
|
switch(dir){
|
||||||
|
case 0:
|
||||||
|
symbol = 'A';
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
symbol = 'V';
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
symbol = '<';
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
symbol = '>';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
map[x][y] = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Projectile::action(int x, int y)
|
||||||
|
{
|
||||||
|
map[x][y] = 32;
|
||||||
|
switch(dir){
|
||||||
|
case 0:
|
||||||
|
y--;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
y++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
x--;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
x++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(map[x][y] != 32){
|
||||||
|
if(map[x][y] > 128)
|
||||||
|
if(Entity::getById(map[x][y])->damage(dmg))
|
||||||
|
delete Entity::getById(map[x][y]);
|
||||||
|
delete this;
|
||||||
|
} else
|
||||||
|
map[x][y] = id;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Projectile::damage(int dmg) { return true; };
|
23
src/Sentry.cpp
Normal file
23
src/Sentry.cpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include "../include/Sentry.hpp"
|
||||||
|
|
||||||
|
extern int map[32][32];
|
||||||
|
extern bool u_map[32][32];
|
||||||
|
|
||||||
|
Sentry::Sentry(int posx, int posy)
|
||||||
|
{
|
||||||
|
x = posx;
|
||||||
|
y = posy;
|
||||||
|
symbol = '=';
|
||||||
|
srand (time(NULL));
|
||||||
|
hp = (rand() % 30) + 1;
|
||||||
|
dmg = (rand() % 25) + 1;
|
||||||
|
proximity = (rand() % 3) + 1;
|
||||||
|
map[posx][posy] = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sentry::action(int px, int py)
|
||||||
|
{
|
||||||
|
if(abs(px - x) < proximity && abs(y - py) < proximity)
|
||||||
|
Entity::getById(128)->damage(dmg);
|
||||||
|
}
|
||||||
|
|
36
src/main.cpp
Normal file
36
src/main.cpp
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ncurses.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "Entity.cpp"
|
||||||
|
#include "Projectile.cpp"
|
||||||
|
#include "Player.cpp"
|
||||||
|
#include "Enemy.cpp"
|
||||||
|
#include "Sentry.cpp"
|
||||||
|
#include "Chaser.cpp"
|
||||||
|
#include "Game.cpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int map[32][32];
|
||||||
|
bool u_map[32][32];
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
initscr();
|
||||||
|
Game g;
|
||||||
|
int key;
|
||||||
|
for(;;){
|
||||||
|
key = getch();
|
||||||
|
if(key == 27 || !g.run(key)){
|
||||||
|
endwin();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user