summaryrefslogtreecommitdiff
path: root/src/game/game.cpp
diff options
context:
space:
mode:
authorPaweł Redman <pawel.redman@gmail.com>2018-04-01 13:46:47 +0200
committerPaweł Redman <pawel.redman@gmail.com>2018-04-01 13:46:47 +0200
commitbe628dc7f9c32ca84674c8717f07cc15a40f333c (patch)
tree09c54df1ce9e5905a1a3d90434b8c9fea021eb1b /src/game/game.cpp
parent6c46e70e3576ae9d27c3ad5c8c95c3198c9be501 (diff)
Improve selecting.
Diffstat (limited to 'src/game/game.cpp')
-rw-r--r--src/game/game.cpp65
1 files changed, 54 insertions, 11 deletions
diff --git a/src/game/game.cpp b/src/game/game.cpp
index f21bccd..27db5e5 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -91,7 +91,6 @@ void state_t::start(void)
soldier->place(&world, v2f_t(1.5, 0.5));
soldier = new unit_soldier_t(this);
soldier->place(&world, v2f_t(2.5, 0.5));
- select(rectf_t(v2f_t(0.5, 0.5), v2f_t(2.5, 0.5)));
resume();
}
@@ -105,12 +104,53 @@ void state_t::group_say(std::string text)
interface->print(text::get(text::SAY_GROUP) + ": " + text);
}
-void state_t::select(rectf_t x)
+void state_t::select_unit(unit_t *unit, int type)
{
- selection_cookie++;
- selected_units.clear();
+ switch (type) {
+ case SELECT_NEW:
+ case SELECT_OR:
+ if (unit->selected == selection_cookie)
+ return;
+ else
+ goto do_select;
+
+ case SELECT_XOR:
+ if (unit->selected == selection_cookie)
+ goto do_deselect;
+ else
+ goto do_select;
+ }
+
+do_select:
+ unit->selected = selection_cookie;
+ selected_units.insert(unit);
+ return;
+
+do_deselect:
+ unit->selected = selection_cookie - 1;
+ selected_units.erase(unit);
+}
+
+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();
- for (world::entity_t *ent : world.get_render_entities(x)) {
+ if (type == SELECT_NEW) {
+ selection_cookie++;
+ selected_units.clear();
+ }
+
+ select_one = rect.area() < 0.2f;
+
+ ents = world.get_render_entities(rect);
+ if (select_one)
+ ents.sort(render::visibility_order);
+
+ for (world::entity_t *ent : ents) {
unit_t *unit;
if (ent->type != ET_UNIT)
@@ -121,14 +161,17 @@ void state_t::select(rectf_t x)
if (!unit->controllable)
continue;
- unit->selected = selection_cookie;
- selected_units.insert(unit);
+ select_unit(unit, type);
+ if (select_one)
+ break;
}
- 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));
+ 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 {