summaryrefslogtreecommitdiff
path: root/src/game/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/game.cpp')
-rw-r--r--src/game/game.cpp170
1 files changed, 85 insertions, 85 deletions
diff --git a/src/game/game.cpp b/src/game/game.cpp
index d82cff0..8deadd6 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -81,16 +81,15 @@ void entity_t::sleep(void)
void state_t::start(void)
{
unit_soldier_t *soldier;
+ unit_repl_t *repl;
world.generator = worldgen;
world.generator_data = (void*)this;
soldier = new unit_soldier_t(this);
soldier->place(&world, v2f_t(0.5, 0.5));
- soldier = new unit_soldier_t(this);
- soldier->place(&world, v2f_t(1.5, 0.5));
- soldier = new unit_soldier_t(this);
- soldier->place(&world, v2f_t(2.5, 0.5));
+ repl = new unit_repl_t(this);
+ repl->place(&world, v2f_t(1.5, 0.5));
resume();
}
@@ -99,18 +98,13 @@ void state_t::stop(void)
{
}
-void state_t::group_say(std::string text)
-{
- interface->print(text::get(text::SAY_GROUP) + ": " + text);
-}
-
-void state_t::select_unit(unit_t *unit, int type)
+bool state_t::select_unit(unit_t *unit, int type)
{
switch (type) {
case SELECT_NEW:
case SELECT_OR:
if (unit->selected == selection_cookie)
- return;
+ return false;
else
goto do_select;
@@ -124,21 +118,19 @@ void state_t::select_unit(unit_t *unit, int type)
do_select:
unit->selected = selection_cookie;
selected_units.insert(unit);
- return;
+ return true;
do_deselect:
unit->selected = selection_cookie - 1;
selected_units.erase(unit);
+ return false;
}
void state_t::select(rectf_t rect, int type)
{
- size_t before;
bool select_one;
std::list<world::entity_t*> ents;
- before = selected_units.size();
-
if (type == SELECT_NEW) {
selection_cookie++;
selected_units.clear();
@@ -161,119 +153,127 @@ void state_t::select(rectf_t rect, int type)
if (!unit->controllable)
continue;
- select_unit(unit, type);
+ if (select_unit(unit, type)) {
+ if (unit->type == unit_t::UNIT_SOLDIER)
+ unit->say(text::get(text::SAY_READY));
+ }
+
if (select_one)
break;
}
-
- if (selected_units.size() > before) {
- if (selected_units.size() == 1)
- (*selected_units.begin())->say(text::get(text::SAY_READY));
- else if (selected_units.size() > 1)
- group_say(text::get(text::SAY_READY_GROUP));
- }
}
enum {
COMMAND_MOVE,
COMMAND_FIRE,
- COMMAND_STOP
+ COMMAND_STOP,
+
+ COMMAND_REPL
};
bool state_t::populate_pie_menu(std::vector<interface::pie_item_t> &items)
{
+ bool soldiers = false, repls = false;
+
items.clear();
if (selected_units.size() == 0)
return false;
- items.push_back((interface::pie_item_t){"Move", COMMAND_MOVE});
- items.push_back((interface::pie_item_t){"Fire", COMMAND_FIRE});
- items.push_back((interface::pie_item_t){"Stop", COMMAND_STOP});
- return true;
-}
+ for (unit_t *unit : selected_units) {
+ if (unit->dead || !unit->controllable)
+ continue;
-void state_t::command(v2f_t x, int number)
-{
- v2f_t snap;
- bool group;
+ switch (unit->type) {
+ case unit_t::UNIT_SOLDIER:
+ soldiers = true;
+ break;
+ case unit_t::UNIT_REPL:
+ repls = true;
+ break;
- if (!selected_units.size())
- return;
+ default:;
+ }
+ }
- snap[0] = std::round(x[0] - 0.5f) + 0.5f;
- snap[1] = std::round(x[1] - 0.5f) + 0.5f;
+ if (soldiers) {
+ items.push_back((interface::pie_item_t){"Move", COMMAND_MOVE});
+ items.push_back((interface::pie_item_t){"Fire", COMMAND_FIRE});
+ items.push_back((interface::pie_item_t){"Stop", COMMAND_STOP});
+ }
+
+ if (repls) {
+ items.push_back((interface::pie_item_t){"Replicate", COMMAND_REPL});
+ }
- group = selected_units.size() > 1;
- if (group) switch (number) {
+ return true;
+}
+
+static void command_soldier(unit_soldier_t *soldier, v2f_t x, int number)
+{
+ switch (number) {
case COMMAND_MOVE:
- group_say(text::get(text::SAY_MOVING_GROUP));
+ if (!soldier->start_moving(x))
+ soldier->say(text::get(text::SAY_NO_PATH));
+ else {
+ soldier->move_marker = std::make_unique<fx_move_marker_t>(soldier->game, soldier->move.path.back());
+ soldier->say(text::get(text::SAY_MOVING));
+ }
break;
+
case COMMAND_STOP:
- group_say(text::get(text::SAY_STOPPING_GROUP));
+ soldier->stop_moving();
+ soldier->manual_firing = false;
+ soldier->say(text::get(text::SAY_STOPPING));
break;
+
case COMMAND_FIRE:
- group_say(text::get(text::SAY_FIRING_GROUP));
+ soldier->manual_firing = true;
+ soldier->manual_firing_target = x;
+ soldier->say(text::get(text::SAY_FIRING));
break;
}
+}
- for (unit_t *unit : selected_units) {
- unit_soldier_t *soldier;
+static void command_repl(unit_repl_t *repl, v2f_t x, int number)
+{
+ switch (number) {
+ case COMMAND_REPL:
+ repl->activate();
+ break;
+ }
+}
- if (unit->type != unit_t::UNIT_SOLDIER)
- continue;
+void state_t::command(v2f_t x, int number)
+{
+ v2f_t snap;
- soldier = dynamic_cast<unit_soldier_t*>(unit);
+ if (!selected_units.size())
+ return;
- if (soldier->dead)
- continue;
+ snap[0] = std::round(x[0] - 0.5f) + 0.5f;
+ snap[1] = std::round(x[1] - 0.5f) + 0.5f;
- if (!soldier->controllable)
+ for (unit_t *unit : selected_units) {
+ if (unit->dead || !unit->controllable)
continue;
- switch (number) {
- case COMMAND_MOVE:
- if (!soldier->start_moving(snap))
- soldier->say(text::get(text::SAY_NO_PATH));
- else {
- soldier->move_marker = std::make_unique<fx_move_marker_t>(this, soldier->move.path.back());
- if (!group)
- soldier->say(text::get(text::SAY_MOVING));
- }
+ switch (unit->type) {
+ case unit_t::UNIT_SOLDIER:
+ command_soldier(dynamic_cast<unit_soldier_t*>(unit),
+ snap, number);
break;
- case COMMAND_STOP:
- soldier->stop_moving();
- soldier->manual_firing = false;
- if (!group)
- soldier->say(text::get(text::SAY_STOPPING));
+ case unit_t::UNIT_REPL:
+ command_repl(dynamic_cast<unit_repl_t*>(unit),
+ snap, number);
break;
- case COMMAND_FIRE:
- soldier->manual_firing = true;
- soldier->manual_firing_target = x;
- if (!group)
- soldier->say(text::get(text::SAY_FIRING));
- break;
+ default:;
}
}
}
-void state_t::spawn_soldier(v2f_t x)
-{
- unit_soldier_t *soldier;
- world::cmodel_t cmodel;
-
- soldier = new unit_soldier_t(this);
- soldier->place(&world, x);
-
- cmodel.bounds = soldier->cmodel.bounds;
- cmodel.cflags = soldier->move.cflags;
-
- if (world.test_rect(&cmodel, soldier))
- soldier->destroy();
-}
-
void state_t::pause(void)
{
paused = true;