summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaweł Redman <pawel.redman@gmail.com>2018-04-12 23:17:02 +0200
committerPaweł Redman <pawel.redman@gmail.com>2018-04-12 23:17:02 +0200
commit545b0a1e0870aaf5032d8b2b96dcfc13ae97126f (patch)
tree11ab528d70030e3b89a6b84b09de7ff202c83b28
parentf274f281da32c829e20c5012d67431d6a4348cce (diff)
Misc. gameplay improvements.
-rw-r--r--src/common.hpp2
-rw-r--r--src/game/game.cpp9
-rw-r--r--src/game/game.hpp3
-rw-r--r--src/game/unit_nest.cpp2
-rw-r--r--src/game/unit_spider.cpp6
-rw-r--r--src/game/units.cpp12
6 files changed, 25 insertions, 9 deletions
diff --git a/src/common.hpp b/src/common.hpp
index bb95f0e..3d7483d 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -40,6 +40,8 @@ extern bool debug_AI;
typedef uint64_t ntime_t;
ntime_t nclock(void);
+#define MSEC(x) ((ntime_t)x * 1000000)
+
class freq_counter_t {
ntime_t *samples;
size_t num_samples, collected = 0;
diff --git a/src/game/game.cpp b/src/game/game.cpp
index 4cac4eb..66bf237 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -247,14 +247,9 @@ static void command_repl(unit_repl_t *repl, v2f_t x, int number)
void state_t::command(v2f_t x, int number)
{
- v2f_t snap;
-
if (!selected_units.size())
return;
- snap[0] = std::round(x[0] - 0.5f) + 0.5f;
- snap[1] = std::round(x[1] - 0.5f) + 0.5f;
-
for (unit_t *unit : selected_units) {
if (unit->dead || !unit->controllable)
continue;
@@ -262,12 +257,12 @@ void state_t::command(v2f_t x, int number)
switch (unit->type) {
case unit_t::UNIT_SOLDIER:
command_soldier(dynamic_cast<unit_soldier_t*>(unit),
- snap, number);
+ x, number);
break;
case unit_t::UNIT_REPL:
command_repl(dynamic_cast<unit_repl_t*>(unit),
- snap, number);
+ x, number);
break;
default:;
diff --git a/src/game/game.hpp b/src/game/game.hpp
index 321fc0c..4773f9c 100644
--- a/src/game/game.hpp
+++ b/src/game/game.hpp
@@ -197,11 +197,14 @@ namespace game {
float next_attempt;
v2f_t last_step;
+
+ ntime_t random_walk_time = 0;
} move;
bool keep_moving(double speed);
bool start_moving(v2f_t dst);
void stop_moving(void);
+ void random_walk(void);
bool dead = false;
double death_time = -INFINITY;
diff --git a/src/game/unit_nest.cpp b/src/game/unit_nest.cpp
index ffa551b..30db39f 100644
--- a/src/game/unit_nest.cpp
+++ b/src/game/unit_nest.cpp
@@ -26,7 +26,7 @@ unit_nest_t::unit_nest_t(game::state_t *game_) : unit_t(game_, UNIT_NEST)
size[1] = {+0.6f, +0.6f};
render_size[0] = {-0.6f, -0.6f};
render_size[1] = {+0.6f, +0.6f};
- cmodel.cflags = CF_BACKGROUND;
+ cmodel.cflags = CF_BODY;
name = text::get(text::UNIT_NAME_NEST);
diff --git a/src/game/unit_spider.cpp b/src/game/unit_spider.cpp
index fd69305..9ff8fc1 100644
--- a/src/game/unit_spider.cpp
+++ b/src/game/unit_spider.cpp
@@ -44,8 +44,12 @@ void unit_spider_t::target_and_attack(void)
return;
target = find_target(world, x, 10.0f, true);
- if (!target)
+ if (!target) {
+ if (health < max_health)
+ random_walk();
+
return;
+ }
start_moving(target->x);
next_targetting = game->now + game->prng.next_float(0.2f, 0.4f);
diff --git a/src/game/units.cpp b/src/game/units.cpp
index f777400..fb0ce3c 100644
--- a/src/game/units.cpp
+++ b/src/game/units.cpp
@@ -209,6 +209,8 @@ void unit_t::damage(int points, unit_t *attacker)
health -= points;
if (health <= 0)
die(attacker);
+ else
+ wake();
}
void unit_t::die(unit_t *killer)
@@ -261,4 +263,14 @@ unit_t *find_target(world::world_t *world, v2f_t x, float r,
return nearest;
}
+void unit_t::random_walk(void)
+{
+ if (move.random_walk_time &&
+ game->time - move.random_walk_time < MSEC(1000))
+ return;
+
+ start_moving(x + game->prng.unit_vec2() * 10);
+ move.random_walk_time = game->time;
+}
+
} // namespace game