Skip to content

Commit

Permalink
split units when embarking feature
Browse files Browse the repository at this point in the history
  • Loading branch information
Lizzie841 committed Apr 7, 2024
1 parent 5adbd51 commit 69e0a90
Showing 1 changed file with 59 additions and 9 deletions.
68 changes: 59 additions & 9 deletions src/gui/gui_unit_panel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -792,17 +792,67 @@ class unit_details_load_army_button : public button_element_base {
bool visible = false;

void button_action(sys::state& state) noexcept override {
auto n = retrieve<dcon::army_id>(state, parent);
command::embark_army(state, state.local_player_nation, n);
auto a = retrieve<dcon::army_id>(state, parent);
auto n = state.world.army_get_navy_from_army_transport(a);
auto from = state.world.army_get_location_from_army_location(a);

int32_t max_cap = 0;
for(auto n : state.world.province_get_navy_location(p)) {
if(n.get_navy().get_controller_from_navy_control() == from &&
!bool(n.get_navy().get_battle_from_navy_battle_participation())) {
max_cap = std::max(military::free_transport_capacity(state, n.get_navy()), max_cap);
}
}
disabled = max_cap <= 0;
if(!military::can_embark_onto_sea_tile(state, state.local_player_nation, from, a)
&& max_cap > 0) { //require splitting
auto regs = state.world.army_get_army_membership(a);
int32_t army_cap = int32_t(regs.end() - regs.begin());
int32_t to_split = army_cap - max_cap;
//can mark 10 regiments to be split at a time
std::array<dcon::regiment_id, 10U> data;
int32_t i = 0;
data.fill(dcon::regiment_id{});
for(auto reg : state.world.army_get_army_membership(a)) {
if(to_split == 0)
break;
data[i] = reg.get_regiment();
if(i >= int32_t(data.size())) { //reached max allowed
command::mark_regiments_to_split(state, state.local_player_nation, data);
data.fill(dcon::regiment_id{});
}
--to_split;
}
if(i > 0) { //leftovers
command::mark_regiments_to_split(state, state.local_player_nation, data);
}
command::split_army(state, state.local_player_nation, a);
command::embark_army(state, state.local_player_nation, a);
} else { //no split
command::embark_army(state, state.local_player_nation, a);
}
}
void on_update(sys::state& state) noexcept override {
auto n = retrieve<dcon::army_id>(state, parent);
auto tprted = state.world.army_get_navy_from_army_transport(n);
auto loc = state.world.army_get_location_from_army_location(n);

visible = !bool(tprted);

disabled = !military::can_embark_onto_sea_tile(state, state.local_player_nation, loc, n);
auto a = retrieve<dcon::army_id>(state, parent);
auto n = state.world.army_get_navy_from_army_transport(a);
auto from = state.world.army_get_location_from_army_location(a);
visible = !bool(n);
disabled = true;
if(visible) {
int32_t max_cap = 0;
for(auto n : state.world.province_get_navy_location(p)) {
if(n.get_navy().get_controller_from_navy_control() == from &&
!bool(n.get_navy().get_battle_from_navy_battle_participation())) {
max_cap = std::max(military::free_transport_capacity(state, n.get_navy()), max_cap);
}
}
disabled = max_cap <= 0;
//require splitting
if(!military::can_embark_onto_sea_tile(state, state.local_player_nation, from, a)
&& max_cap > 0) {
frame = 1;
}
}
}
tooltip_behavior has_tooltip(sys::state& state) noexcept override {
return tooltip_behavior::variable_tooltip;
Expand Down

0 comments on commit 69e0a90

Please sign in to comment.