Fix fix-armory constantly trying to store ammo already stored in chest.

develop
Alexander Gavrilov 2012-11-07 22:49:40 +04:00
parent ff982dcf73
commit f6b6d730a0
1 changed files with 37 additions and 5 deletions

@ -160,7 +160,7 @@ static bool is_assigned_item(df::item *item)
} }
// Check if this ammo item is assigned to this squad with one of the specified uses // Check if this ammo item is assigned to this squad with one of the specified uses
static bool is_squad_ammo(df::item *item, df::squad *squad, bool train, bool combat) static bool is_squad_ammo(df::item *item, df::squad *squad, bool combat, bool train)
{ {
for (size_t i = 0; i < squad->ammunition.size(); i++) for (size_t i = 0; i < squad->ammunition.size(); i++)
{ {
@ -186,8 +186,6 @@ static bool can_store_ammo_rec(df::item *item, df::building *holder, int squad_i
if (squads) if (squads)
{ {
bool target = holder->getType() == building_type::ArcheryTarget;
for (size_t i = 0; i < squads->size(); i++) for (size_t i = 0; i < squads->size(); i++)
{ {
auto use = (*squads)[i]; auto use = (*squads)[i];
@ -198,8 +196,7 @@ static bool can_store_ammo_rec(df::item *item, df::building *holder, int squad_i
// Squad Equipment -> combat // Squad Equipment -> combat
bool combat = use->mode.bits.squad_eq; bool combat = use->mode.bits.squad_eq;
// Archery target with Train -> training bool train = false;
bool train = target && use->mode.bits.train;
if (combat || train) if (combat || train)
{ {
@ -210,6 +207,41 @@ static bool can_store_ammo_rec(df::item *item, df::building *holder, int squad_i
} }
} }
} }
// Ugh, archery targets don't actually have a squad use vector
else if (holder->getType() == building_type::ArcheryTarget)
{
auto &squads = df::global::world->squads.all;
for (size_t si = 0; si < squads.size(); si++)
{
auto squad = squads[si];
// For containers assigned to a squad, only consider that squad
if (squad_id >= 0 && squad->id != squad_id)
continue;
for (size_t j = 0; j < squad->rooms.size(); j++)
{
auto use = squad->rooms[j];
if (use->building_id != holder->id)
continue;
// Squad Equipment -> combat
bool combat = use->mode.bits.squad_eq;
// Archery target with Train -> training
bool train = use->mode.bits.train;
if (combat || train)
{
if (is_squad_ammo(item, squad, combat, train))
return true;
}
break;
}
}
}
for (size_t i = 0; i < holder->parents.size(); i++) for (size_t i = 0; i < holder->parents.size(); i++)
if (can_store_ammo_rec(item, holder->parents[i], squad_id)) if (can_store_ammo_rec(item, holder->parents[i], squad_id))