diff options
Diffstat (limited to 'src/game/game.cpp')
-rw-r--r-- | src/game/game.cpp | 170 |
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; |