summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common.hpp3
-rw-r--r--src/game/game.cpp22
-rw-r--r--src/game/game.hpp41
-rw-r--r--src/game/units.cpp75
4 files changed, 71 insertions, 70 deletions
diff --git a/src/common.hpp b/src/common.hpp
index 8a86482..2d2af4a 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -183,14 +183,13 @@ namespace game {
class unit_t;
class state_t {
- double now, dt;
-
std::unordered_set<unit_t*> units;
std::unordered_set<unit_t*> selected_units;
std::unordered_set<unit_t*> awake_units;
public:
world::world_t world;
+ double now, dt;
void start(void);
void stop(void);
diff --git a/src/game/game.cpp b/src/game/game.cpp
index 5643b3a..c2c2c19 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -11,21 +11,21 @@ void state_t::start(void)
world.generator = worldgen;
- human = new human_t;
+ human = new human_t(this);
human->place(&world, v2f_t(0.5, 0.5));
units.insert(human);
- human = new human_t;
+ human = new human_t(this);
human->place(&world, v2f_t(1.5, 0.5));
units.insert(human);
- human = new human_t;
+ human = new human_t(this);
human->place(&world, v2f_t(2.5, 0.5));
units.insert(human);
- alien = new alien_t;
+ alien = new alien_t(this);
alien->place(&world, v2f_t(15.5, -2.5));
- alien = new alien_t;
+ alien = new alien_t(this);
alien->place(&world, v2f_t(14.5, -2.5));
- alien = new alien_t;
+ alien = new alien_t(this);
alien->place(&world, v2f_t(13.5, -2.5));
}
@@ -70,7 +70,7 @@ void state_t::command(v2f_t x)
if (unit->dead)
continue;
- unit->start_moving(snap, now);
+ unit->start_moving(snap);
}
}
@@ -109,19 +109,19 @@ void state_t::tick(double now_, double dt_)
enemy->awake = true;
awake_units.insert(enemy);
- enemy->wake(now, unit);
+ enemy->wake(unit);
}
- unit->think(now, dt);
+ unit->think();
}
for (auto i = std::begin(awake_units); i != std::end(awake_units);) {
if (now - (*i)->wake_time >= 5.0) {
(*i)->awake = false;
- (*i)->sleep(now);
+ (*i)->sleep();
i = awake_units.erase(i);
} else {
- (*i)->think(now, dt);
+ (*i)->think();
i++;
}
}
diff --git a/src/game/game.hpp b/src/game/game.hpp
index f6687dc..107bfbf 100644
--- a/src/game/game.hpp
+++ b/src/game/game.hpp
@@ -41,6 +41,7 @@ namespace game {
class unit_t : public world::entity_t {
protected:
+ game::state_t *game;
world::world_t *world;
world::cmodel_t make_cmodel(v2f_t at);
@@ -59,9 +60,9 @@ namespace game {
type_t type;
- unit_t(type_t type_);
+ unit_t(game::state_t *game_, type_t type_);
- virtual void think(double now, double dt) = 0;
+ virtual void think(void) = 0;
struct {
bool moving = false;
@@ -76,23 +77,23 @@ namespace game {
} move;
void place(world::world_t *world_, v2f_t x_);
- bool keep_moving(double now, double dt, double speed);
- bool start_moving(v2f_t dst_, double now);
+ bool keep_moving(double speed);
+ bool start_moving(v2f_t dst);
bool awake = false;
double wake_time = -INFINITY;
- virtual void wake(double now, unit_t *by_whom) = 0;
- virtual void sleep(double now) = 0;
+ virtual void wake(unit_t *by_whom) = 0;
+ virtual void sleep(void) = 0;
bool dead = false;
double death_time = -INFINITY;
int health = 1, max_health = 1;
- void damage(double now, int points);
- virtual void die(double now) = 0;
+ void damage(int points);
+ virtual void die() = 0;
const wchar_t *say_text;
double say_time = -INFINITY;
- void say(const wchar_t *wstr, double now);
+ void say(const wchar_t *wstr);
void render_to(render::state_t *render);
@@ -100,27 +101,27 @@ namespace game {
class human_t : public unit_t {
public:
- human_t();
+ human_t(game::state_t *game);
void render_to(render::state_t *render);
- void wake(double now, unit_t *by_whom);
- void sleep(double now);
- void think(double now, double dt);
- void die(double now);
+ void wake(unit_t *by_whom);
+ void sleep(void);
+ void think(void);
+ void die(void);
};
class alien_t : public unit_t {
double next_targetting = -INFINITY;
double next_attack = -INFINITY;
- void attack(double now, unit_t *target, float range);
+ void attack(unit_t *target, float range);
public:
- alien_t();
+ alien_t(game::state_t *game);
void render_to(render::state_t *render);
- void wake(double now, unit_t *by_whom);
- void sleep(double now);
- void think(double now, double dt);
- void die(double now);
+ void wake(unit_t *by_whom);
+ void sleep(void);
+ void think(void);
+ void die(void);
};
};
diff --git a/src/game/units.cpp b/src/game/units.cpp
index b4cb333..5563124 100644
--- a/src/game/units.cpp
+++ b/src/game/units.cpp
@@ -19,9 +19,10 @@ void unit_t::compute_bounds()
render_bounds[1] = x + render_size[1];
}
-unit_t::unit_t(unit_t::type_t type_) : entity_t(ET_UNIT)
+unit_t::unit_t(game::state_t *game_, unit_t::type_t type_) : entity_t(ET_UNIT)
{
type = type_;
+ game = game_;
}
void unit_t::render_to(render::state_t *render)
@@ -59,10 +60,10 @@ void unit_t::render_to(render::state_t *render)
render->debug_path(&move.path);
}
-void unit_t::say(const wchar_t *wstr, double now)
+void unit_t::say(const wchar_t *wstr)
{
say_text = wstr;
- say_time = now;
+ say_time = game->now;
std::cout << (void*)this << ": " << wstr << "\n";
}
@@ -78,17 +79,17 @@ void unit_t::place(world::world_t *world_, v2f_t x_)
link(world);
}
-bool unit_t::keep_moving(double now, double dt, double speed)
+bool unit_t::keep_moving(double speed)
{
float time;
if (!move.moving)
return false;
- if (move.blocked && now < move.next_attempt)
+ if (move.blocked && game->now < move.next_attempt)
return false;
- time = dt * speed;
+ time = game->dt * speed;
while (time > 0.0f) {
v2f_t delta, next, x_new;
@@ -122,10 +123,10 @@ bool unit_t::keep_moving(double now, double dt, double speed)
if (move.attempts_left) {
move.blocked = true;
move.attempts_left--;
- move.next_attempt = now + 0.2f;
+ move.next_attempt = game->now + 0.2f;
} else {
if ((x - move.dst).len() > 1.5f)
- say(text::unit_blocked, now);
+ say(text::unit_blocked);
move.moving = false;
}
break;
@@ -137,18 +138,18 @@ bool unit_t::keep_moving(double now, double dt, double speed)
return true;
}
-bool unit_t::start_moving(v2f_t dst_, double now)
+bool unit_t::start_moving(v2f_t dst)
{
if (!world) {
printf("unit_t::start_moving: entity is not linked\n");
return false;
}
- move.dst = dst_;
+ move.dst = dst;
move.path.clear();
if (!world->find_path(x, move.dst, &cmodel, this, &move.path)) {
- say(text::unit_no_path, now);
+ say(text::unit_no_path);
move.moving = false;
return false;
}
@@ -162,19 +163,19 @@ bool unit_t::start_moving(v2f_t dst_, double now)
return true;
}
-void unit_t::damage(double now, int points)
+void unit_t::damage(int points)
{
health -= points;
if (health < 0) {
printf("%p died\n", this);
dead = true;
- death_time = now;
+ death_time = game->now;
cflags = 0;
- die(now);
+ die();
}
}
-human_t::human_t() : unit_t(UNIT_HUMAN)
+human_t::human_t(game::state_t *game) : unit_t(game, UNIT_HUMAN)
{
cflags = CF_HUMAN;
health = max_health = 20;
@@ -185,20 +186,20 @@ human_t::human_t() : unit_t(UNIT_HUMAN)
render_layer = -1;
}
-void human_t::wake(double now, unit_t *by_whom)
+void human_t::wake(unit_t *by_whom)
{
}
-void human_t::sleep(double now)
+void human_t::sleep(void)
{
}
-void human_t::think(double now, double dt)
+void human_t::think(void)
{
- keep_moving(now, dt, 4.0);
+ keep_moving(4.0);
}
-void human_t::die(double now)
+void human_t::die(void)
{
render_size[0] = v2f_t(-0.75f, -0.5f);
render_size[1] = v2f_t(+0.75f, +0.5f);
@@ -221,7 +222,7 @@ void human_t::render_to(render::state_t *render)
} else
render->render(&assets::human.dead, render_bounds);
- if (say_time + 5.0 > render->now) {
+ if (say_time + 5.0 > game->now) {
v2f_t text_pos;
float height;
@@ -235,7 +236,7 @@ void human_t::render_to(render::state_t *render)
unit_t::render_to(render);
}
-alien_t::alien_t() : unit_t(UNIT_ALIEN)
+alien_t::alien_t(game::state_t *game) : unit_t(game, UNIT_ALIEN)
{
cflags = CF_SOLID;
health = max_health = 4;
@@ -245,17 +246,17 @@ alien_t::alien_t() : unit_t(UNIT_ALIEN)
render_size[1] = v2f_t(+0.3f, +0.3f);
}
-void alien_t::wake(double now, unit_t *by_whom)
+void alien_t::wake(unit_t *by_whom)
{
- start_moving(by_whom->x, now);
- next_targetting = now + 0.4;
+ start_moving(by_whom->x);
+ next_targetting = game->now + 0.4;
}
-void alien_t::sleep(double now)
+void alien_t::sleep(void)
{
}
-void alien_t::die(double now)
+void alien_t::die(void)
{
}
@@ -295,11 +296,11 @@ static unit_t *find_target(world::world_t *world, v2f_t x, float r,
return nearest;
}
-void alien_t::attack(double now, unit_t *target, float range)
+void alien_t::attack(unit_t *target, float range)
{
world::trace_t trace;
- if (now < next_attack)
+ if (game->now < next_attack)
return;
if ((x - target->x).len() > range)
@@ -307,26 +308,26 @@ void alien_t::attack(double now, unit_t *target, float range)
trace = world->trace(x, target->x, CF_SOLID);
if (!trace.hit)
- target->damage(now, rand() % 6 + rand() % 6 + 2);
+ target->damage(rand() % 6 + rand() % 6 + 2);
- next_attack = now + 0.4;
+ next_attack = game->now + 0.4;
}
-void alien_t::think(double now, double dt)
+void alien_t::think(void)
{
- if (now > next_targetting) {
+ if (game->now > next_targetting) {
unit_t *target;
target = find_target(world, x, 5.0f, UNIT_HUMAN);
if (target) {
- attack(now, target, 0.75f);
- start_moving(target->x, now);
+ attack(target, 0.75f);
+ start_moving(target->x);
}
- next_targetting = now + 0.2;
+ next_targetting = game->now + 0.2;
}
- keep_moving(now, dt, 7.0);
+ keep_moving(7.0);
}
void alien_t::render_to(render::state_t *render)