Skip to content

Commit 4cd45ce

Browse files
committed
LH mod: basic shields support
1 parent cca2e8b commit 4cd45ce

7 files changed

Lines changed: 69 additions & 25 deletions

File tree

game/game/inventory.cpp

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
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

8786
Inventory::~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

490503
void 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+
503529
void 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
}

game/game/inventory.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class Inventory final {
8989
void updateArmourView(Npc& owner);
9090
void updateSwordView (Npc& owner);
9191
void updateBowView (Npc& owner);
92+
void updateShieldView(Npc& owner);
9293
void updateRuneView (Npc& owner);
9394
void updateView (Npc& owner);
9495

@@ -152,16 +153,17 @@ class Inventory final {
152153
uint32_t indexOf(const Item* it) const;
153154
Item* readPtr(Serialize& fin);
154155

155-
Item* armour=nullptr;
156-
Item* belt =nullptr;
157-
Item* amulet=nullptr;
158-
Item* ringL =nullptr;
159-
Item* ringR =nullptr;
160-
161-
Item** active=nullptr;
162-
Item* mele =nullptr;
163-
Item* range =nullptr;
164-
Item* numslot[8]={};
156+
Item* armour = nullptr;
157+
Item* belt = nullptr;
158+
Item* amulet = nullptr;
159+
Item* ringL = nullptr;
160+
Item* ringR = nullptr;
161+
162+
Item** active = nullptr;
163+
Item* mele = nullptr;
164+
Item* range = nullptr;
165+
Item* shield = nullptr;
166+
Item* numslot[8] = {};
165167
std::vector<MdlSlot> mdlSlots;
166168
MdlSlot ammotSlot, stateSlot;
167169
int32_t curItem=0;

game/game/serialize.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class SaveGameHeader;
3434
class Serialize {
3535
public:
3636
enum Version : uint16_t {
37-
Current = 45
37+
Current = 46
3838
};
3939
Serialize(Tempest::ODevice& fout);
4040
Serialize(Tempest::IDevice& fin);

game/graphics/mdlvisual.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
#include "mdlvisual.h"
2-
#include "objvisual.h"
32

4-
#include "graphics/pfx/particlefx.h"
53
#include "graphics/mesh/skeleton.h"
64
#include "game/serialize.h"
75
#include "utils/string_frm.h"
86
#include "world/objects/npc.h"
97
#include "world/objects/interactive.h"
108
#include "world/objects/item.h"
119
#include "world/world.h"
10+
#include "objvisual.h"
1211
#include "gothic.h"
1312

1413
using namespace Tempest;
@@ -170,6 +169,10 @@ void MdlVisual::setRangeWeapon(MeshObjects::Mesh &&b) {
170169
bind(bow,std::move(b),"ZS_BOW");
171170
}
172171

172+
void MdlVisual::setShield(MeshObjects::Mesh&& s) {
173+
bind(shield,std::move(s),"ZS_SHIELD");
174+
}
175+
173176
void MdlVisual::setAmmoItem(MeshObjects::Mesh&& a, std::string_view bone) {
174177
bind(ammunition,std::move(a),bone);
175178
}
@@ -425,7 +428,7 @@ Vec2 MdlVisual::headRotation() const {
425428
void MdlVisual::updateWeaponSkeleton(const Item* weapon, const Item* range) {
426429
auto st = fgtMode;
427430
if(st==WeaponState::W1H || st==WeaponState::W2H){
428-
bind(sword,"ZS_RIGHTHAND");
431+
bind(sword, "ZS_RIGHTHAND");
429432
} else {
430433
bool twoHands = weapon!=nullptr && weapon->is2H();
431434
bind(sword,twoHands ? "ZS_LONGSWORD" : "ZS_SWORD");
@@ -440,6 +443,8 @@ void MdlVisual::updateWeaponSkeleton(const Item* weapon, const Item* range) {
440443
bind(bow,cbow ? "ZS_CROSSBOW" : "ZS_BOW");
441444
}
442445

446+
bind(shield, st==WeaponState::W1H ? "ZS_LEFTARM" : "ZS_SHIELD");
447+
443448
pfx.view.setActive(st==WeaponState::Mage);
444449
syncAttaches();
445450
}
@@ -816,7 +821,7 @@ void MdlVisual::rebindAttaches(Attach<View>& mesh, const Skeleton& to) {
816821
}
817822

818823
void MdlVisual::syncAttaches() {
819-
MdlVisual::MeshAttach* mesh[] = {&head, &sword,&bow,&ammunition,&stateItm};
824+
MdlVisual::MeshAttach* mesh[] = {&head, &sword,&shield,&bow,&ammunition,&stateItm};
820825
for(auto i:mesh)
821826
syncAttaches(*i);
822827
for(auto& i:item)
@@ -898,7 +903,7 @@ bool MdlVisual::startAnimDialog(Npc &npc) {
898903
}
899904

900905
void MdlVisual::startMMAnim(Npc&, std::string_view anim, std::string_view bone) {
901-
MdlVisual::MeshAttach* mesh[] = {&head,&sword,&bow,&ammunition,&stateItm};
906+
MdlVisual::MeshAttach* mesh[] = {&head,&sword,&shield,&bow,&ammunition,&stateItm};
902907
for(auto i:mesh) {
903908
if(i->bone!=bone)
904909
continue;

game/graphics/mdlvisual.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class MdlVisual final {
4949
void setBody (Npc& npc, MeshObjects::Mesh&& body, const int32_t version);
5050
void setSword (MeshObjects::Mesh&& sword);
5151
void setRangeWeapon(MeshObjects::Mesh&& bow);
52+
void setShield (MeshObjects::Mesh&& shield);
5253
void setAmmoItem (MeshObjects::Mesh&& ammo, std::string_view bone);
5354
void setSlotItem (MeshObjects::Mesh&& itm, std::string_view bone);
5455
void setStateItem (MeshObjects::Mesh&& itm, std::string_view bone);
@@ -151,7 +152,7 @@ class MdlVisual final {
151152
Tempest::Matrix4x4 pos;
152153
MeshObjects::Mesh view;
153154

154-
MeshAttach head, sword, bow;
155+
MeshAttach head, sword, bow, shield;
155156
MeshAttach ammunition, stateItm;
156157
std::vector<MeshAttach> item;
157158
std::vector<MeshAttach> attach;

game/world/objects/npc.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,11 @@ void Npc::setRangeWeapon(MeshObjects::Mesh&& b) {
887887
updateWeaponSkeleton();
888888
}
889889

890+
void Npc::setShield(MeshObjects::Mesh&& s) {
891+
visual.setShield(std::move(s));
892+
updateWeaponSkeleton();
893+
}
894+
890895
void Npc::setMagicWeapon(Effect&& s) {
891896
s.setOrigin(this);
892897
visual.setMagicWeapon(std::move(s),owner);

game/world/objects/npc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ class Npc final {
151151
void updateArmour ();
152152
void setSword (MeshObjects::Mesh&& sword);
153153
void setRangeWeapon(MeshObjects::Mesh&& bow);
154+
void setShield (MeshObjects::Mesh&& shield);
154155
void setMagicWeapon(Effect&& spell);
155156
void setSlotItem (MeshObjects::Mesh&& itm, std::string_view slot);
156157
void setStateItem (MeshObjects::Mesh&& itm, std::string_view slot);

0 commit comments

Comments
 (0)