mirror of
https://github.com/OpenMW/openmw.git
synced 2025-06-25 10:11:33 +00:00
Clean up the slotlist struct
This commit is contained in:
parent
274f3c7b77
commit
55ee4e65a9
1 changed files with 47 additions and 85 deletions
|
@ -158,84 +158,31 @@ void NpcAnimation::setViewMode(NpcAnimation::ViewMode viewMode)
|
||||||
void NpcAnimation::updateParts(bool forceupdate)
|
void NpcAnimation::updateParts(bool forceupdate)
|
||||||
{
|
{
|
||||||
static const struct {
|
static const struct {
|
||||||
int numRemoveParts; // Max: 1
|
MWWorld::ContainerStoreIterator NpcAnimation::*mPart;
|
||||||
ESM::PartReferenceType removeParts[1];
|
int mSlot;
|
||||||
|
int mBasePriority;
|
||||||
MWWorld::ContainerStoreIterator NpcAnimation::*part;
|
|
||||||
int slot;
|
|
||||||
|
|
||||||
int numReserveParts; // Max: 12
|
|
||||||
ESM::PartReferenceType reserveParts[12];
|
|
||||||
} slotlist[] = {
|
} slotlist[] = {
|
||||||
{ 0, { },
|
// FIXME: Priority is based on the number of reserved slots. There should be a better way.
|
||||||
&NpcAnimation::mRobe, MWWorld::InventoryStore::Slot_Robe,
|
{ &NpcAnimation::mRobe, MWWorld::InventoryStore::Slot_Robe, 12 },
|
||||||
12, { ESM::PRT_Groin, ESM::PRT_Skirt, ESM::PRT_RLeg, ESM::PRT_LLeg,
|
{ &NpcAnimation::mSkirtIter, MWWorld::InventoryStore::Slot_Skirt, 3 },
|
||||||
ESM::PRT_RUpperarm, ESM::PRT_LUpperarm, ESM::PRT_RKnee, ESM::PRT_LKnee,
|
{ &NpcAnimation::mHelmet, MWWorld::InventoryStore::Slot_Helmet, 0 },
|
||||||
ESM::PRT_RForearm, ESM::PRT_LForearm, ESM::PRT_RPauldron, ESM::PRT_LPauldron }
|
{ &NpcAnimation::mCuirass, MWWorld::InventoryStore::Slot_Cuirass, 0 },
|
||||||
},
|
{ &NpcAnimation::mGreaves, MWWorld::InventoryStore::Slot_Greaves, 0 },
|
||||||
|
{ &NpcAnimation::mPauldronL, MWWorld::InventoryStore::Slot_LeftPauldron, 0 },
|
||||||
{ 0, { },
|
{ &NpcAnimation::mPauldronR, MWWorld::InventoryStore::Slot_RightPauldron, 0 },
|
||||||
&NpcAnimation::mSkirtIter, MWWorld::InventoryStore::Slot_Skirt,
|
{ &NpcAnimation::mBoots, MWWorld::InventoryStore::Slot_Boots, 0 },
|
||||||
3, { ESM::PRT_Groin, ESM::PRT_RLeg, ESM::PRT_LLeg }
|
{ &NpcAnimation::mGloveL, MWWorld::InventoryStore::Slot_LeftGauntlet, 0 },
|
||||||
},
|
{ &NpcAnimation::mGloveR, MWWorld::InventoryStore::Slot_RightGauntlet, 0 },
|
||||||
|
{ &NpcAnimation::mShirt, MWWorld::InventoryStore::Slot_Shirt, 0 },
|
||||||
{ 1, { ESM::PRT_Hair },
|
{ &NpcAnimation::mPants, MWWorld::InventoryStore::Slot_Pants, 0 },
|
||||||
&NpcAnimation::mHelmet, MWWorld::InventoryStore::Slot_Helmet,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mCuirass, MWWorld::InventoryStore::Slot_Cuirass,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mGreaves, MWWorld::InventoryStore::Slot_Greaves,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mPauldronL, MWWorld::InventoryStore::Slot_LeftPauldron,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mPauldronR, MWWorld::InventoryStore::Slot_RightPauldron,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mBoots, MWWorld::InventoryStore::Slot_Boots,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mGloveL, MWWorld::InventoryStore::Slot_LeftGauntlet,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mGloveR, MWWorld::InventoryStore::Slot_RightGauntlet,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mShirt, MWWorld::InventoryStore::Slot_Shirt,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
|
|
||||||
{ 0, { },
|
|
||||||
&NpcAnimation::mPants, MWWorld::InventoryStore::Slot_Pants,
|
|
||||||
0, { }
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
static const size_t slotlistsize = sizeof(slotlist)/sizeof(slotlist[0]);
|
static const size_t slotlistsize = sizeof(slotlist)/sizeof(slotlist[0]);
|
||||||
|
|
||||||
MWWorld::InventoryStore &inv = MWWorld::Class::get(mPtr).getInventoryStore(mPtr);
|
MWWorld::InventoryStore &inv = MWWorld::Class::get(mPtr).getInventoryStore(mPtr);
|
||||||
for(size_t i = 0;!forceupdate && i < slotlistsize;i++)
|
for(size_t i = 0;!forceupdate && i < slotlistsize;i++)
|
||||||
{
|
{
|
||||||
MWWorld::ContainerStoreIterator iter = inv.getSlot(slotlist[i].slot);
|
MWWorld::ContainerStoreIterator iter = inv.getSlot(slotlist[i].mSlot);
|
||||||
if(this->*slotlist[i].part != iter)
|
if(this->*slotlist[i].mPart != iter)
|
||||||
{
|
{
|
||||||
forceupdate = true;
|
forceupdate = true;
|
||||||
break;
|
break;
|
||||||
|
@ -248,40 +195,55 @@ void NpcAnimation::updateParts(bool forceupdate)
|
||||||
if(mViewMode == VM_FirstPerson)
|
if(mViewMode == VM_FirstPerson)
|
||||||
{
|
{
|
||||||
for(size_t i = 0;i < slotlistsize;i++)
|
for(size_t i = 0;i < slotlistsize;i++)
|
||||||
this->*slotlist[i].part = inv.getSlot(slotlist[i].slot);
|
this->*slotlist[i].mPart = inv.getSlot(slotlist[i].mSlot);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(size_t i = 0;i < slotlistsize && mViewMode != VM_HeadOnly;i++)
|
for(size_t i = 0;i < slotlistsize && mViewMode != VM_HeadOnly;i++)
|
||||||
{
|
{
|
||||||
MWWorld::ContainerStoreIterator iter = inv.getSlot(slotlist[i].slot);
|
MWWorld::ContainerStoreIterator iter = inv.getSlot(slotlist[i].mSlot);
|
||||||
|
|
||||||
this->*slotlist[i].part = iter;
|
this->*slotlist[i].mPart = iter;
|
||||||
removePartGroup(slotlist[i].slot);
|
removePartGroup(slotlist[i].mSlot);
|
||||||
|
|
||||||
if(this->*slotlist[i].part == inv.end())
|
if(this->*slotlist[i].mPart == inv.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for(int rem = 0;rem < slotlist[i].numRemoveParts;rem++)
|
if(slotlist[i].mSlot == MWWorld::InventoryStore::Slot_Helmet)
|
||||||
removeIndividualPart(slotlist[i].removeParts[rem]);
|
removeIndividualPart(ESM::PRT_Hair);
|
||||||
|
|
||||||
int prio = 1;
|
int prio = 1;
|
||||||
MWWorld::ContainerStoreIterator &store = this->*slotlist[i].part;
|
MWWorld::ContainerStoreIterator &store = this->*slotlist[i].mPart;
|
||||||
if(store->getTypeName() == typeid(ESM::Clothing).name())
|
if(store->getTypeName() == typeid(ESM::Clothing).name())
|
||||||
{
|
{
|
||||||
prio = ((slotlist[i].numReserveParts+1)<<1) + 0;
|
prio = ((slotlist[i].mBasePriority+1)<<1) + 0;
|
||||||
const ESM::Clothing *clothes = store->get<ESM::Clothing>()->mBase;
|
const ESM::Clothing *clothes = store->get<ESM::Clothing>()->mBase;
|
||||||
addPartGroup(slotlist[i].slot, prio, clothes->mParts.mParts);
|
addPartGroup(slotlist[i].mSlot, prio, clothes->mParts.mParts);
|
||||||
}
|
}
|
||||||
else if(store->getTypeName() == typeid(ESM::Armor).name())
|
else if(store->getTypeName() == typeid(ESM::Armor).name())
|
||||||
{
|
{
|
||||||
prio = ((slotlist[i].numReserveParts+1)<<1) + 1;
|
prio = ((slotlist[i].mBasePriority+1)<<1) + 1;
|
||||||
const ESM::Armor *armor = store->get<ESM::Armor>()->mBase;
|
const ESM::Armor *armor = store->get<ESM::Armor>()->mBase;
|
||||||
addPartGroup(slotlist[i].slot, prio, armor->mParts.mParts);
|
addPartGroup(slotlist[i].mSlot, prio, armor->mParts.mParts);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int res = 0;res < slotlist[i].numReserveParts;res++)
|
if(slotlist[i].mSlot == MWWorld::InventoryStore::Slot_Robe)
|
||||||
reserveIndividualPart(slotlist[i].reserveParts[res], slotlist[i].slot, prio);
|
{
|
||||||
|
ESM::PartReferenceType parts[] = {
|
||||||
|
ESM::PRT_Groin, ESM::PRT_Skirt, ESM::PRT_RLeg, ESM::PRT_LLeg,
|
||||||
|
ESM::PRT_RUpperarm, ESM::PRT_LUpperarm, ESM::PRT_RKnee, ESM::PRT_LKnee,
|
||||||
|
ESM::PRT_RForearm, ESM::PRT_LForearm, ESM::PRT_RPauldron, ESM::PRT_LPauldron
|
||||||
|
};
|
||||||
|
size_t parts_size = sizeof(parts)/sizeof(parts[0]);
|
||||||
|
for(int p = 0;p < parts_size;p++)
|
||||||
|
reserveIndividualPart(parts[p], slotlist[i].mSlot, prio);
|
||||||
|
}
|
||||||
|
else if(slotlist[i].mSlot == MWWorld::InventoryStore::Slot_Skirt)
|
||||||
|
{
|
||||||
|
reserveIndividualPart(ESM::PRT_Groin, slotlist[i].mSlot, prio);
|
||||||
|
reserveIndividualPart(ESM::PRT_RLeg, slotlist[i].mSlot, prio);
|
||||||
|
reserveIndividualPart(ESM::PRT_LLeg, slotlist[i].mSlot, prio);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mViewMode != VM_FirstPerson)
|
if(mViewMode != VM_FirstPerson)
|
||||||
|
|
Loading…
Reference in a new issue