From 91529fa5fcb6cd1da426e8e5a24169f25dd0edb7 Mon Sep 17 00:00:00 2001 From: yg-ong Date: Fri, 31 Jan 2025 15:59:07 +0800 Subject: [PATCH 01/10] Edit military module --- library/include/modules/Military.h | 1 + library/modules/Military.cpp | 101 +++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/library/include/modules/Military.h b/library/include/modules/Military.h index 013f804415..dc69dac52b 100644 --- a/library/include/modules/Military.h +++ b/library/include/modules/Military.h @@ -17,6 +17,7 @@ namespace Military DFHACK_EXPORT std::string getSquadName(int32_t squad_id); DFHACK_EXPORT df::squad* makeSquad(int32_t assignment_id); DFHACK_EXPORT void updateRoomAssignments(int32_t squad_id, int32_t civzone_id, df::squad_use_flags flags); +DFHACK_EXPORT bool removeFromSquad(int32_t unit_id); } } diff --git a/library/modules/Military.cpp b/library/modules/Military.cpp index 0477c366b0..23fc15a871 100644 --- a/library/modules/Military.cpp +++ b/library/modules/Military.cpp @@ -4,6 +4,7 @@ #include "MiscUtils.h" #include "modules/Military.h" #include "modules/Translation.h" +#include "modules/Units.h" #include "df/building.h" #include "df/building_civzonest.h" #include "df/historical_figure.h" @@ -289,3 +290,103 @@ void Military::updateRoomAssignments(int32_t squad_id, int32_t civzone_id, df::s } } } + +static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squad) +{ + int32_t start_year = -1; + for (size_t i = 0; i < hf->entity_links.size(); i++) + { + auto link = strict_virtual_cast(hf->entity_links[i]); + if (link == nullptr) continue; + if (link->squad_id != squad->id) continue; + + hf->entity_links.erase(hf->entity_links.begin() + i); + delete link; + + start_year = link->start_year; + break; + } + if (start_year == -1) return false; + + auto former_squad = new df::histfig_entity_link_former_squadst(); + former_squad->squad_id = squad->id; + former_squad->entity_id = squad->entity_id; + former_squad->start_year = start_year; + former_squad->end_year = *df::global::cur_year; + former_squad->link_strength = 100; + + hf->entity_links.push_back(former_pos); + return true; +} + +static bool remove_captain_entity_link(df::historical_figure* hf, df::squad* squad) +{ + std::vector nps; + if (! Units::getNoblePositions(&nps, hf)) return false; + + int32_t assignment_id = -1; + for (auto& np : nps) + { + if (np.entity.id != squad->entity_id) continue; + if (np.assignment.squad_id != squad.id) continue; + + np.assignment->histfig = -1; + np.assignment->histfig2 = -1; + + assignment_id = np.assignment->id; + break; + } + if (assignment_id == -1) return false; + + int32_t start_year = -1; + for (size_t i = 0; i < hf->entity_links.size(); i++) + { + auto link = strict_virtual_cast(hf->entity_links[i]); + if (link == nullptr) continue; + if (link->assignment_id != assignment_id && link->entity_id != squad->entity_id) continue; + + hf->entity_links.erase(hf->entity_links.begin() + i); + delete link; + + start_year = link->start_year; + break; + } + if (start_year == -1) return false; + + auto former_pos = new df::histfig_entity_link_former_positionst(); + former_pos->assignment_id = assignment_id; + former_pos->entity_id = squad->entity_id; + former_pos->start_year = start_year; + former_pos->end_year = *df::global::cur_year; + former_pos->link_strength = 100; + + hf->entity_links.push_back(former_pos); + return true; +} + +bool Military::removeFromSquad(int32_t unit_id) +{ + df::unit* unit = df::unit::find(unit_id); + if (unit == nullptr) return false; + if (unit->military.squad_id == -1 || unit->military.squad_position == -1) return false; + + int32_t squad_id = unit->military.squad_id; + df::squad* squad = df::squad::find(squad_id); + if (squad == nullptr) return false; + + // remove from squad information + int32_t squad_pos = unit->military.squad_position; + df::squad_position* pos = squad->positions.at(squad_pos); + pos->occupant = -1; + + // remove from unit information + unit->military.squad_id = -1; + unit->military.squad_position = -1; + + df::historical_figure* hf = df::historical_figure::find(unit->hist_figure_id); + if (hf == nullptr) return false; + + return squad_pos == 0 // is unit a commander? + ? remove_captain_entity_link(hf, squad) + : remove_soldier_entity_link(hf, squad); +} From aa6fdb41fc4ee5330ba907a9960dde05cb34d2b1 Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Fri, 7 Feb 2025 22:48:31 +0800 Subject: [PATCH 02/10] Add Military::removeFromSquad --- library/modules/Military.cpp | 64 ++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/library/modules/Military.cpp b/library/modules/Military.cpp index 23fc15a871..929285a761 100644 --- a/library/modules/Military.cpp +++ b/library/modules/Military.cpp @@ -7,6 +7,10 @@ #include "modules/Units.h" #include "df/building.h" #include "df/building_civzonest.h" +#include "df/histfig_entity_link_former_positionst.h" +#include "df/histfig_entity_link_former_squadst.h" +#include "df/histfig_entity_link_positionst.h" +#include "df/histfig_entity_link_squadst.h" #include "df/historical_figure.h" #include "df/historical_entity.h" #include "df/entity_position.h" @@ -17,6 +21,7 @@ #include "df/squad_schedule_order.h" #include "df/squad_order.h" #include "df/squad_order_trainst.h" +#include "df/unit.h" #include "df/world.h" using namespace DFHack; @@ -297,46 +302,51 @@ static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squ for (size_t i = 0; i < hf->entity_links.size(); i++) { auto link = strict_virtual_cast(hf->entity_links[i]); - if (link == nullptr) continue; - if (link->squad_id != squad->id) continue; - + if (link == nullptr || link->squad_id != squad->id) + continue; + hf->entity_links.erase(hf->entity_links.begin() + i); - delete link; - start_year = link->start_year; + + delete link; break; } - if (start_year == -1) return false; + + if (start_year == -1) + return false; - auto former_squad = new df::histfig_entity_link_former_squadst(); + auto former_squad = df::allocate(); former_squad->squad_id = squad->id; former_squad->entity_id = squad->entity_id; former_squad->start_year = start_year; former_squad->end_year = *df::global::cur_year; former_squad->link_strength = 100; - hf->entity_links.push_back(former_pos); + hf->entity_links.push_back(former_squad); return true; } -static bool remove_captain_entity_link(df::historical_figure* hf, df::squad* squad) +static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squad) { std::vector nps; - if (! Units::getNoblePositions(&nps, hf)) return false; + if (! Units::getNoblePositions(&nps, hf)) + return false; int32_t assignment_id = -1; for (auto& np : nps) { - if (np.entity.id != squad->entity_id) continue; - if (np.assignment.squad_id != squad.id) continue; - + if (np.entity->id != squad->entity_id || np.assignment->squad_id != squad->id) + continue; + np.assignment->histfig = -1; np.assignment->histfig2 = -1; assignment_id = np.assignment->id; break; } - if (assignment_id == -1) return false; + + if (assignment_id == -1) + return false; int32_t start_year = -1; for (size_t i = 0; i < hf->entity_links.size(); i++) @@ -346,14 +356,16 @@ static bool remove_captain_entity_link(df::historical_figure* hf, df::squad* squ if (link->assignment_id != assignment_id && link->entity_id != squad->entity_id) continue; hf->entity_links.erase(hf->entity_links.begin() + i); - delete link; - start_year = link->start_year; + + delete link; break; } - if (start_year == -1) return false; + + if (start_year == -1) + return false; - auto former_pos = new df::histfig_entity_link_former_positionst(); + auto former_pos = df::allocate(); former_pos->assignment_id = assignment_id; former_pos->entity_id = squad->entity_id; former_pos->start_year = start_year; @@ -366,13 +378,16 @@ static bool remove_captain_entity_link(df::historical_figure* hf, df::squad* squ bool Military::removeFromSquad(int32_t unit_id) { - df::unit* unit = df::unit::find(unit_id); - if (unit == nullptr) return false; - if (unit->military.squad_id == -1 || unit->military.squad_position == -1) return false; + df::unit *unit = df::unit::find(unit_id); + if (unit == nullptr) + return false; + if (unit->military.squad_id == -1 || unit->military.squad_position == -1) + return false; int32_t squad_id = unit->military.squad_id; df::squad* squad = df::squad::find(squad_id); - if (squad == nullptr) return false; + if (squad == nullptr) + return false; // remove from squad information int32_t squad_pos = unit->military.squad_position; @@ -384,9 +399,10 @@ bool Military::removeFromSquad(int32_t unit_id) unit->military.squad_position = -1; df::historical_figure* hf = df::historical_figure::find(unit->hist_figure_id); - if (hf == nullptr) return false; + if (hf == nullptr) + return false; return squad_pos == 0 // is unit a commander? - ? remove_captain_entity_link(hf, squad) + ? remove_officer_entity_link(hf, squad) : remove_soldier_entity_link(hf, squad); } From 872cc7cba5a2e599c6e2f081b4ee2a8333d5d9ff Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Fri, 7 Feb 2025 23:01:49 +0800 Subject: [PATCH 03/10] Fix style --- library/modules/Military.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/library/modules/Military.cpp b/library/modules/Military.cpp index 929285a761..d569250167 100644 --- a/library/modules/Military.cpp +++ b/library/modules/Military.cpp @@ -312,7 +312,7 @@ static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squ break; } - if (start_year == -1) + if (start_year == -1) return false; auto former_squad = df::allocate(); @@ -335,7 +335,7 @@ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squ int32_t assignment_id = -1; for (auto& np : nps) { - if (np.entity->id != squad->entity_id || np.assignment->squad_id != squad->id) + if (np.entity->id != squad->entity_id || np.assignment->squad_id != squad->id) continue; np.assignment->histfig = -1; @@ -352,8 +352,10 @@ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squ for (size_t i = 0; i < hf->entity_links.size(); i++) { auto link = strict_virtual_cast(hf->entity_links[i]); - if (link == nullptr) continue; - if (link->assignment_id != assignment_id && link->entity_id != squad->entity_id) continue; + if (link == nullptr) + continue; + if (link->assignment_id != assignment_id && link->entity_id != squad->entity_id) + continue; hf->entity_links.erase(hf->entity_links.begin() + i); start_year = link->start_year; From 84370629900dcfca95a984cae8284d11e3d9678b Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Fri, 7 Feb 2025 23:09:19 +0800 Subject: [PATCH 04/10] Attempt to fix trailing whitespace --- library/modules/Military.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/modules/Military.cpp b/library/modules/Military.cpp index d569250167..d1322735db 100644 --- a/library/modules/Military.cpp +++ b/library/modules/Military.cpp @@ -329,7 +329,7 @@ static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squad) { std::vector nps; - if (! Units::getNoblePositions(&nps, hf)) + if (!Units::getNoblePositions(&nps, hf)) return false; int32_t assignment_id = -1; From 7eb27ef350963ebdac9a136bcc291ef989df99aa Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Fri, 7 Feb 2025 23:12:44 +0800 Subject: [PATCH 05/10] Remove trailing whitespace --- library/modules/Military.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/library/modules/Military.cpp b/library/modules/Military.cpp index d1322735db..8292c6227b 100644 --- a/library/modules/Military.cpp +++ b/library/modules/Military.cpp @@ -304,14 +304,14 @@ static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squ auto link = strict_virtual_cast(hf->entity_links[i]); if (link == nullptr || link->squad_id != squad->id) continue; - + hf->entity_links.erase(hf->entity_links.begin() + i); start_year = link->start_year; delete link; break; } - + if (start_year == -1) return false; @@ -337,14 +337,14 @@ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squ { if (np.entity->id != squad->entity_id || np.assignment->squad_id != squad->id) continue; - + np.assignment->histfig = -1; np.assignment->histfig2 = -1; assignment_id = np.assignment->id; break; } - + if (assignment_id == -1) return false; @@ -359,11 +359,11 @@ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squ hf->entity_links.erase(hf->entity_links.begin() + i); start_year = link->start_year; - + delete link; break; } - + if (start_year == -1) return false; From 9a06a27222538bf4cd7536453e0d9e851858a8c2 Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Sat, 8 Feb 2025 02:43:23 +0800 Subject: [PATCH 06/10] Add Lua bindings --- docs/dev/Lua API.rst | 8 ++++++++ library/LuaApi.cpp | 1 + 2 files changed, 9 insertions(+) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 000840c76b..4cc2c35d06 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -1986,6 +1986,14 @@ Military module Returns the name of a squad as a string. +* ``dfhack.military.removeFromSquad(unit_id)`` + + Removes a unit from its squad and returns true if successful. Unsets the unit's + military information (i.e., ``unit.military.squad_id`` and + ``unit.military.squad_pos``), the squad's position information (i.e., + ``squad.positions[squad_pos].occupant``), and modifies the unit's entity links + to indicate former squad membership or command. + Items module ------------ diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 4b82dddc17..6e251dbfcf 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -2341,6 +2341,7 @@ static const LuaWrapper::FunctionReg dfhack_military_module[] = { WRAPM(Military, makeSquad), WRAPM(Military, updateRoomAssignments), WRAPM(Military, getSquadName), + WRAPM(Military, removeFromSquad), { NULL, NULL } }; From c9e2dcc2812247cb4f9d1f3a4e3410f70d2172b3 Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Sat, 8 Feb 2025 02:44:26 +0800 Subject: [PATCH 07/10] Modify Military.cpp --- library/modules/Military.cpp | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/library/modules/Military.cpp b/library/modules/Military.cpp index 8292c6227b..62d189c4d7 100644 --- a/library/modules/Military.cpp +++ b/library/modules/Military.cpp @@ -301,14 +301,18 @@ static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squ int32_t start_year = -1; for (size_t i = 0; i < hf->entity_links.size(); i++) { - auto link = strict_virtual_cast(hf->entity_links[i]); - if (link == nullptr || link->squad_id != squad->id) + df::histfig_entity_link* link = hf->entity_links[i]; + if (link->getType() != df::enums::histfig_entity_link_type::SQUAD) + continue; + + auto squad_link = strict_virtual_cast(link); + if (squad_link == nullptr || squad_link->squad_id != squad->id) continue; hf->entity_links.erase(hf->entity_links.begin() + i); - start_year = link->start_year; + start_year = squad_link->start_year; - delete link; + delete squad_link; break; } @@ -351,16 +355,20 @@ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squ int32_t start_year = -1; for (size_t i = 0; i < hf->entity_links.size(); i++) { - auto link = strict_virtual_cast(hf->entity_links[i]); - if (link == nullptr) + df::histfig_entity_link* link = hf->entity_links[i]; + if (link->getType() != df::enums::histfig_entity_link_type::POSITION) + continue; + + auto pos_link = strict_virtual_cast(link); + if (pos_link == nullptr) continue; - if (link->assignment_id != assignment_id && link->entity_id != squad->entity_id) + if (pos_link->assignment_id != assignment_id && pos_link->entity_id != squad->entity_id) continue; hf->entity_links.erase(hf->entity_links.begin() + i); - start_year = link->start_year; + start_year = pos_link->start_year; - delete link; + delete pos_link; break; } @@ -393,9 +401,12 @@ bool Military::removeFromSquad(int32_t unit_id) // remove from squad information int32_t squad_pos = unit->military.squad_position; - df::squad_position* pos = squad->positions.at(squad_pos); - pos->occupant = -1; + df::squad_position* pos = vector_get(squad->positions, squad_pos); + if (pos == nullptr) + return false; + // remove from squad information + pos->occupant = -1; // remove from unit information unit->military.squad_id = -1; unit->military.squad_position = -1; From cfe1dbb79b6b53e3d1f4e03bf92a6b2807b6a9de Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Sat, 8 Feb 2025 03:14:43 +0800 Subject: [PATCH 08/10] Update changelog --- docs/changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index b8d28decc8..e8340baeac 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -35,9 +35,11 @@ Template for new versions: ## Documentation ## API +- ``Military::removeFromSquad``: removes unit from any squad assignments ## Lua - ``dfhack.units.setAutomaticProfessions``: sets unit labors according to current work detail settings +- ``dfhack.military.removeFromSquad``: Lua API for ``Military::removeFromSquad`` ## Removed From 5a6de1fc928ecc067267064fab2fd443a36643c8 Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Sat, 8 Feb 2025 19:15:03 +0800 Subject: [PATCH 09/10] Remove return val --- docs/dev/Lua API.rst | 2 +- library/include/modules/Military.h | 2 +- library/modules/Military.cpp | 35 ++++++++++++++---------------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 4cc2c35d06..66516642a9 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -1988,7 +1988,7 @@ Military module * ``dfhack.military.removeFromSquad(unit_id)`` - Removes a unit from its squad and returns true if successful. Unsets the unit's + Removes a unit from its squad. Unsets the unit's military information (i.e., ``unit.military.squad_id`` and ``unit.military.squad_pos``), the squad's position information (i.e., ``squad.positions[squad_pos].occupant``), and modifies the unit's entity links diff --git a/library/include/modules/Military.h b/library/include/modules/Military.h index dc69dac52b..37855d94db 100644 --- a/library/include/modules/Military.h +++ b/library/include/modules/Military.h @@ -17,7 +17,7 @@ namespace Military DFHACK_EXPORT std::string getSquadName(int32_t squad_id); DFHACK_EXPORT df::squad* makeSquad(int32_t assignment_id); DFHACK_EXPORT void updateRoomAssignments(int32_t squad_id, int32_t civzone_id, df::squad_use_flags flags); -DFHACK_EXPORT bool removeFromSquad(int32_t unit_id); +DFHACK_EXPORT void removeFromSquad(int32_t unit_id); } } diff --git a/library/modules/Military.cpp b/library/modules/Military.cpp index 62d189c4d7..9e507a99aa 100644 --- a/library/modules/Military.cpp +++ b/library/modules/Military.cpp @@ -296,7 +296,7 @@ void Military::updateRoomAssignments(int32_t squad_id, int32_t civzone_id, df::s } } -static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squad) +static void remove_soldier_entity_link(df::historical_figure* hf, df::squad* squad) { int32_t start_year = -1; for (size_t i = 0; i < hf->entity_links.size(); i++) @@ -317,7 +317,7 @@ static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squ } if (start_year == -1) - return false; + return; auto former_squad = df::allocate(); former_squad->squad_id = squad->id; @@ -327,14 +327,13 @@ static bool remove_soldier_entity_link(df::historical_figure* hf, df::squad* squ former_squad->link_strength = 100; hf->entity_links.push_back(former_squad); - return true; } -static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squad) +static void remove_officer_entity_link(df::historical_figure* hf, df::squad* squad) { std::vector nps; if (!Units::getNoblePositions(&nps, hf)) - return false; + return; int32_t assignment_id = -1; for (auto& np : nps) @@ -350,7 +349,7 @@ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squ } if (assignment_id == -1) - return false; + return; int32_t start_year = -1; for (size_t i = 0; i < hf->entity_links.size(); i++) @@ -373,7 +372,7 @@ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squ } if (start_year == -1) - return false; + return; auto former_pos = df::allocate(); former_pos->assignment_id = assignment_id; @@ -383,27 +382,24 @@ static bool remove_officer_entity_link(df::historical_figure* hf, df::squad* squ former_pos->link_strength = 100; hf->entity_links.push_back(former_pos); - return true; } -bool Military::removeFromSquad(int32_t unit_id) +void Military::removeFromSquad(int32_t unit_id) { df::unit *unit = df::unit::find(unit_id); - if (unit == nullptr) - return false; - if (unit->military.squad_id == -1 || unit->military.squad_position == -1) - return false; + if (unit == nullptr || unit->military.squad_id == -1 || unit->military.squad_position == -1) + return; int32_t squad_id = unit->military.squad_id; df::squad* squad = df::squad::find(squad_id); if (squad == nullptr) - return false; + return; // remove from squad information int32_t squad_pos = unit->military.squad_position; df::squad_position* pos = vector_get(squad->positions, squad_pos); if (pos == nullptr) - return false; + return; // remove from squad information pos->occupant = -1; @@ -413,9 +409,10 @@ bool Military::removeFromSquad(int32_t unit_id) df::historical_figure* hf = df::historical_figure::find(unit->hist_figure_id); if (hf == nullptr) - return false; + return;; - return squad_pos == 0 // is unit a commander? - ? remove_officer_entity_link(hf, squad) - : remove_soldier_entity_link(hf, squad); + if (squad_pos == 0) // is unit a commander? + remove_officer_entity_link(hf, squad); + else + remove_soldier_entity_link(hf, squad); } From 6d44e8f8f0e1eb0cd7b9a42c29dbfa8309d081f5 Mon Sep 17 00:00:00 2001 From: Ying Gao Date: Sun, 9 Feb 2025 12:51:12 +0800 Subject: [PATCH 10/10] Change return type of Military::removeFromSquad --- library/include/modules/Military.h | 2 +- library/modules/Military.cpp | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/library/include/modules/Military.h b/library/include/modules/Military.h index 37855d94db..dc69dac52b 100644 --- a/library/include/modules/Military.h +++ b/library/include/modules/Military.h @@ -17,7 +17,7 @@ namespace Military DFHACK_EXPORT std::string getSquadName(int32_t squad_id); DFHACK_EXPORT df::squad* makeSquad(int32_t assignment_id); DFHACK_EXPORT void updateRoomAssignments(int32_t squad_id, int32_t civzone_id, df::squad_use_flags flags); -DFHACK_EXPORT void removeFromSquad(int32_t unit_id); +DFHACK_EXPORT bool removeFromSquad(int32_t unit_id); } } diff --git a/library/modules/Military.cpp b/library/modules/Military.cpp index 9e507a99aa..3c5708d75e 100644 --- a/library/modules/Military.cpp +++ b/library/modules/Military.cpp @@ -384,22 +384,25 @@ static void remove_officer_entity_link(df::historical_figure* hf, df::squad* squ hf->entity_links.push_back(former_pos); } -void Military::removeFromSquad(int32_t unit_id) +bool Military::removeFromSquad(int32_t unit_id) { df::unit *unit = df::unit::find(unit_id); if (unit == nullptr || unit->military.squad_id == -1 || unit->military.squad_position == -1) - return; + return false; int32_t squad_id = unit->military.squad_id; df::squad* squad = df::squad::find(squad_id); if (squad == nullptr) - return; + return false; - // remove from squad information int32_t squad_pos = unit->military.squad_position; df::squad_position* pos = vector_get(squad->positions, squad_pos); if (pos == nullptr) - return; + return false; + + df::historical_figure* hf = df::historical_figure::find(unit->hist_figure_id); + if (hf == nullptr) + return false; // remove from squad information pos->occupant = -1; @@ -407,12 +410,10 @@ void Military::removeFromSquad(int32_t unit_id) unit->military.squad_id = -1; unit->military.squad_position = -1; - df::historical_figure* hf = df::historical_figure::find(unit->hist_figure_id); - if (hf == nullptr) - return;; - if (squad_pos == 0) // is unit a commander? remove_officer_entity_link(hf, squad); else remove_soldier_entity_link(hf, squad); + + return true; }