From 2cbbed6750f3d441335af14f368f55dadbbe5dae Mon Sep 17 00:00:00 2001 From: Tachytaenius Date: Wed, 9 Nov 2022 21:13:23 +0000 Subject: [PATCH] Use df-structures XML enums for action timer API --- library/modules/Units.cpp | 106 ++++++++++---------------------------- 1 file changed, 27 insertions(+), 79 deletions(-) diff --git a/library/modules/Units.cpp b/library/modules/Units.cpp index fe9a79fa7..58d70d01f 100644 --- a/library/modules/Units.cpp +++ b/library/modules/Units.cpp @@ -1952,70 +1952,6 @@ int Units::getStressCategoryRaw(int32_t stress_level) return level; } -struct AffectedActionTypesGroupContainer -{ - std::vector> groups; - - AffectedActionTypesGroupContainer() - { - const int NUM_ACTION_TYPES = ENUM_LAST_ITEM(unit_action_type) - ENUM_FIRST_ITEM(unit_action_type) + 1; - // Length of df::unit_action_type, including unknowns - const int NUM_ACTION_TYPE_GROUPS = ENUM_LAST_ITEM(action_type_group) - ENUM_FIRST_ITEM(action_type_group) + 1; - // Length of df::action_type_group - groups = std::vector>(NUM_ACTION_TYPE_GROUPS, std::vector(NUM_ACTION_TYPES, false)); - - // "None" category can be left alone - - // "All" category - std::vector & allVector = groups[df::action_type_group::All]; - allVector[df::unit_action_type::Move] = true; - allVector[df::unit_action_type::Attack] = true; - allVector[df::unit_action_type::HoldTerrain] = true; - allVector[df::unit_action_type::Climb] = true; - allVector[df::unit_action_type::Job] = true; - allVector[df::unit_action_type::Talk] = true; - allVector[df::unit_action_type::Unsteady] = true; - allVector[df::unit_action_type::Dodge] = true; - allVector[df::unit_action_type::Recover] = true; - allVector[df::unit_action_type::StandUp] = true; - allVector[df::unit_action_type::LieDown] = true; - allVector[df::unit_action_type::Job2] = true; - allVector[df::unit_action_type::PushObject] = true; - allVector[df::unit_action_type::SuckBlood] = true; - - // "Movement" category - std::vector & movementVector = groups[df::action_type_group::Movement]; - movementVector[df::unit_action_type::Move] = true; - movementVector[df::unit_action_type::HoldTerrain] = true; - movementVector[df::unit_action_type::Climb] = true; - // Include Unsteady? - movementVector[df::unit_action_type::Dodge] = true; - movementVector[df::unit_action_type::Recover] = true; - movementVector[df::unit_action_type::StandUp] = true; - movementVector[df::unit_action_type::LieDown] = true; - movementVector[df::unit_action_type::PushObject] = true; - - // "MovementFeet" category - std::vector & movementFeetVector = groups[df::action_type_group::MovementFeet]; - movementFeetVector[df::unit_action_type::Move] = true; - // Include Unsteady? - movementFeetVector[df::unit_action_type::Dodge] = true; - movementFeetVector[df::unit_action_type::Recover] = true; - movementFeetVector[df::unit_action_type::PushObject] = true; - - // "Offensive" category - std::vector & offensiveVector = groups[df::action_type_group::Offensive]; - offensiveVector[df::unit_action_type::Attack] = true; - offensiveVector[df::unit_action_type::SuckBlood] = true; - - // "Work" category - std::vector & workVector = groups[df::action_type_group::Work]; - workVector[df::unit_action_type::Job] = true; - workVector[df::unit_action_type::Job2] = true; - workVector[df::unit_action_type::PushObject] = true; - } -}; - int *getActionTimerPointer(df::unit_action *action) { switch (action->type) { @@ -2084,12 +2020,16 @@ void Units::subtractActionTimer(df::unit *unit, int amount, df::unit_action_type void Units::subtractActionTimerCategory(df::unit *unit, int amount, df::action_type_group affectedActionTypes) { CHECK_NULL_POINTER(unit); - static AffectedActionTypesGroupContainer groupContainer; for (auto action : unit->actions) { - if (!groupContainer.groups[affectedActionTypes][action->type]) continue; - int *timer = getActionTimerPointer(action); - if (timer != nullptr && *timer != 0) { - *timer = max(*timer - amount, 1); + auto list = ENUM_ATTR(unit_action_type, group, action->type); + for (size_t i = 0; i < list.size; i++) { + if (list.items[i] == affectedActionTypes) { + int *timer = getActionTimerPointer(action); + if (timer != nullptr && *timer != 0) { + *timer = max(*timer - amount, 1); + } + break; + } } } } @@ -2109,12 +2049,16 @@ void Units::multiplyActionTimer(df::unit *unit, float amount, df::unit_action_ty void Units::multiplyActionTimerCategory(df::unit *unit, float amount, df::action_type_group affectedActionTypes) { CHECK_NULL_POINTER(unit); - static AffectedActionTypesGroupContainer groupContainer; for (auto action : unit->actions) { - if (!groupContainer.groups[affectedActionTypes][action->type]) continue; - int *timer = getActionTimerPointer(action); - if (timer != nullptr && *timer != 0) { - *timer = max(int(*timer * amount), 1); + auto list = ENUM_ATTR(unit_action_type, group, action->type); + for (size_t i = 0; i < list.size; i++) { + if (list.items[i] == affectedActionTypes) { + int *timer = getActionTimerPointer(action); + if (timer != nullptr && *timer != 0) { + *timer = max(int(*timer * amount), 1); + } + break; + } } } } @@ -2134,12 +2078,16 @@ void Units::setActionTimer(df::unit *unit, int amount, df::unit_action_type affe void Units::setActionTimerCategory(df::unit *unit, int amount, df::action_type_group affectedActionTypes) { CHECK_NULL_POINTER(unit); - static AffectedActionTypesGroupContainer groupContainer; for (auto action : unit->actions) { - if (!groupContainer.groups[affectedActionTypes][action->type]) continue; - int *timer = getActionTimerPointer(action); - if (timer != nullptr && *timer != 0) { - *timer = amount; + auto list = ENUM_ATTR(unit_action_type, group, action->type); + for (size_t i = 0; i < list.size; i++) { + if (list.items[i] == affectedActionTypes) { + int *timer = getActionTimerPointer(action); + if (timer != nullptr && *timer != 0) { + *timer = amount; + } + break; + } } } }