From 974a6155c06071293f7a51bab4d902d9dae76bc3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 31 May 2023 18:48:08 -0700 Subject: [PATCH] reinstated Buildings.setOwner --- docs/dev/Lua API.rst | 4 ++-- library/include/modules/Buildings.h | 4 ++-- library/modules/Buildings.cpp | 29 ++++++++++++++--------------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index e5167a531..d07cb045e 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -1944,9 +1944,9 @@ General Searches for a specific_ref with the given type. -* ``dfhack.buildings.setOwner(item,unit)`` +* ``dfhack.buildings.setOwner(civzone,unit)`` - Replaces the owner of the building. If unit is *nil*, removes ownership. + Replaces the owner of the civzone. If unit is *nil*, removes ownership. Returns *false* in case of error. * ``dfhack.buildings.getSize(building)`` diff --git a/library/include/modules/Buildings.h b/library/include/modules/Buildings.h index 66745abe6..78163108e 100644 --- a/library/include/modules/Buildings.h +++ b/library/include/modules/Buildings.h @@ -108,9 +108,9 @@ DFHACK_EXPORT df::general_ref *getGeneralRef(df::building *building, df::general DFHACK_EXPORT df::specific_ref *getSpecificRef(df::building *building, df::specific_ref_type type); /** - * Sets the owner unit for the building. + * Sets the owner unit for the zone. */ -DFHACK_EXPORT bool setOwner(df::building *building, df::unit *owner); +DFHACK_EXPORT bool setOwner(df::building_civzonest *building, df::unit *owner); /** * Find the building located at the specified tile. diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index dca8010da..3d0d89c49 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -350,46 +350,45 @@ df::specific_ref *Buildings::getSpecificRef(df::building *building, df::specific return findRef(building->specific_refs, type); } -bool Buildings::setOwner(df::building *bld, df::unit *unit) +bool Buildings::setOwner(df::building_civzonest *bld, df::unit *unit) { CHECK_NULL_POINTER(bld); -/* TODO: understand how this changes for v50 - if (!bld->is_room) - return false; - if (bld->owner == unit) + + if (bld->assigned_unit == unit) return true; - if (bld->owner) + df::building * pbld = dynamic_cast(bld); + + if (bld->assigned_unit) { - auto &blist = bld->owner->owned_buildings; - vector_erase_at(blist, linear_index(blist, bld)); + auto &blist = bld->assigned_unit->owned_buildings; + vector_erase_at(blist, linear_index(blist, pbld)); - if (auto spouse = df::unit::find(bld->owner->relationship_ids[df::unit_relationship_type::Spouse])) + if (auto spouse = df::unit::find(bld->assigned_unit->relationship_ids[df::unit_relationship_type::Spouse])) { auto &blist = spouse->owned_buildings; - vector_erase_at(blist, linear_index(blist, bld)); + vector_erase_at(blist, linear_index(blist, pbld)); } } - bld->owner = unit; + bld->assigned_unit = unit; if (unit) { - bld->owner_id = unit->id; + bld->assigned_unit_id = unit->id; unit->owned_buildings.push_back(bld); if (auto spouse = df::unit::find(unit->relationship_ids[df::unit_relationship_type::Spouse])) { auto &blist = spouse->owned_buildings; - if (bld->canUseSpouseRoom() && linear_index(blist, bld) < 0) + if (bld->canUseSpouseRoom() && linear_index(blist, pbld) < 0) blist.push_back(bld); } } else { - bld->owner_id = -1; + bld->assigned_unit_id = -1; } -*/ return true; }