1- #include " damagecalculator.h"
21#include " inventory.h"
32
43#include < Tempest/Log>
@@ -81,7 +80,7 @@ void Inventory::Iterator::skipHidden() {
8180 }
8281
8382
84- Inventory::Inventory () {
83+ Inventory::Inventory () {
8584 }
8685
8786Inventory::~Inventory () {
@@ -124,6 +123,8 @@ void Inventory::implLoad(Npc* owner, World& world, Serialize &s) {
124123 ringR = readPtr (s);
125124 mele = readPtr (s);
126125 range = readPtr (s);
126+ if (s.version ()>45 )
127+ shield = readPtr (s);
127128 for (auto & i:numslot)
128129 i = readPtr (s);
129130
@@ -170,6 +171,7 @@ void Inventory::save(Serialize &fout) const {
170171 fout.write (indexOf (ringR) );
171172 fout.write (indexOf (mele) );
172173 fout.write (indexOf (range) );
174+ fout.write (indexOf (shield));
173175 for (auto & i:numslot)
174176 fout.write (indexOf (i));
175177
@@ -376,6 +378,10 @@ void Inventory::unequip(Item *it, Npc &owner) {
376378 setSlot (range,nullptr ,owner,false );
377379 return ;
378380 }
381+ if (shield==it) {
382+ setSlot (shield,nullptr ,owner,false );
383+ return ;
384+ }
379385
380386 for (auto & i:numslot)
381387 if (i==it)
@@ -404,22 +410,27 @@ bool Inventory::setSlot(Item *&slot, Item* next, Npc& owner, bool force) {
404410 }
405411
406412 if (slot!=nullptr ) {
407- auto & itData = slot->handle ();
408- auto flag = ItmFlags (itData.main_flag );
413+ auto & itData = slot->handle ();
414+ auto mainFlag = ItmFlags (itData.main_flag );
415+ auto flag = ItmFlags (itData.flags );
416+
409417 applyArmour (*slot,owner,-1 );
410418 if (slot->isEquiped ())
411419 slot->setAsEquiped (false );
412420 if (&slot==active)
413421 applyWeaponStats (owner,*slot,-1 );
414422 slot=nullptr ;
415423
416- if (flag & ITM_CAT_ARMOR){
424+ if (flag & ITM_SHIELD){
425+ owner.setShield (MeshObjects::Mesh ());
426+ }
427+ else if (mainFlag & ITM_CAT_ARMOR){
417428 owner.updateArmour ();
418429 }
419- else if (flag & ITM_CAT_NF){
430+ else if (mainFlag & ITM_CAT_NF){
420431 owner.setSword (MeshObjects::Mesh ());
421432 }
422- else if (flag & ITM_CAT_FF){
433+ else if (mainFlag & ITM_CAT_FF){
423434 owner.setRangeWeapon (MeshObjects::Mesh ());
424435 }
425436 vm.invokeItem (&owner,uint32_t (itData.on_unequip ));
@@ -437,6 +448,7 @@ bool Inventory::setSlot(Item *&slot, Item* next, Npc& owner, bool force) {
437448 updateArmourView (owner);
438449 updateSwordView (owner);
439450 updateBowView (owner);
451+ updateShieldView (owner);
440452 if (&slot==active) {
441453 updateRuneView (owner);
442454 applyWeaponStats (owner,*slot,1 );
@@ -451,6 +463,7 @@ void Inventory::updateView(Npc& owner) {
451463 updateArmourView (owner);
452464 updateSwordView (owner);
453465 updateBowView (owner);
466+ updateShieldView (owner);
454467 updateRuneView (owner);
455468
456469 for (auto & i:mdlSlots) {
@@ -488,7 +501,7 @@ void Inventory::updateSwordView(Npc &owner) {
488501 }
489502
490503void Inventory::updateBowView (Npc &owner) {
491- if (range==nullptr ){
504+ if (range==nullptr ) {
492505 owner.setRangeWeapon (MeshObjects::Mesh ());
493506 return ;
494507 }
@@ -500,6 +513,19 @@ void Inventory::updateBowView(Npc &owner) {
500513 }
501514 }
502515
516+ void Inventory::updateShieldView (Npc& owner) {
517+ if (shield==nullptr ) {
518+ owner.setShield (MeshObjects::Mesh ());
519+ return ;
520+ }
521+
522+ auto flag = ItmFlags (shield->itemFlag ());
523+ if (flag & ITM_SHIELD){
524+ auto vbody = owner.world ().addView (shield->handle ());
525+ owner.setShield (std::move (vbody));
526+ }
527+ }
528+
503529void Inventory::updateRuneView (Npc &owner) {
504530 if (active==nullptr || *active==nullptr )
505531 return ;
@@ -775,6 +801,9 @@ bool Inventory::use(size_t cls, Npc &owner, uint8_t slotHint, bool force) {
775801 auto mainflag = ItmFlags (itData.main_flag );
776802 auto flag = ItmFlags (itData.flags );
777803
804+ if (flag & ITM_SHIELD)
805+ return setSlot (shield,it,owner,force);
806+
778807 if (mainflag & ITM_CAT_NF)
779808 return setSlot (mele,it,owner,force);
780809
@@ -850,6 +879,7 @@ void Inventory::invalidateCond(Npc &owner) {
850879 invalidateCond (ringR ,owner);
851880 invalidateCond (mele ,owner);
852881 invalidateCond (range ,owner);
882+ invalidateCond (shield,owner);
853883 for (auto & i:numslot)
854884 invalidateCond (i,owner);
855885 }
0 commit comments