]> git.localhorst.tv Git - l2e.git/commitdiff
added Sort function to Inventory
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 12 Nov 2012 20:42:49 +0000 (21:42 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 12 Nov 2012 20:43:27 +0000 (21:43 +0100)
also specified the equipability of items in test-data

src/common/Inventory.cpp
src/common/Inventory.h
src/common/Item.cpp
src/common/Item.h
test-data/constants.l2h
test-data/constants.l2s
test-data/items.l2s

index d118f2187daeb9bb28f84d2ccd48882bad6c8c58..6a6af81f3b52fe3dd0f94875cde38f00689f016b 100644 (file)
@@ -7,6 +7,11 @@
 
 #include "Inventory.h"
 
+#include "Item.h"
+
+#include <algorithm>
+
+
 namespace common {
 
 Inventory::Inventory() {
@@ -61,4 +66,21 @@ bool Inventory::SloteFree(int offset) const {
        return !ItemAt(offset);
 }
 
+
+void Inventory::Sort() {
+       std::sort(entries, entries + 96, Entry::Less);
+}
+
+bool Inventory::Entry::Less(const Entry &lhs, const Entry &rhs) {
+       if (lhs.item) {
+               if (rhs.item) {
+                       return Item::Less(*lhs.item, *rhs.item);
+               } else {
+                       return true;
+               }
+       } else {
+               return false;
+       }
+}
+
 }
index f60b9abecb49e71817e5c3fe7a4b74fe3d011f3d..f80368c5ca6c1666b8ba2c9f9405ec17117d585c 100644 (file)
@@ -28,11 +28,14 @@ public:
        const Item *ItemAt(int offset) const { return entries[offset].item; }
        int ItemCountAt(int offset) const { return entries[offset].count; }
 
+       void Sort();
+
 private:
        struct Entry {
                Entry() : item(0), count(0) { }
                const Item *item;
                Uint8 count;
+               static bool Less(const Entry &, const Entry &);
        };
 
 private:
index 2bd337d061321d2b3a07de749d65b24be52514b4..259c4b55c449b8b92c6fae38ffed078af0956e83 100644 (file)
@@ -35,7 +35,6 @@ Item::Item()
 , equipability(0)
 
 , mostUseful(false)
-, equipable(false)
 , cursed(false)
 , fruit(false)
 , scenario(false)
@@ -57,7 +56,6 @@ void Item::CreateTypeDescription() {
        td.AddField("menuicon", FieldDescription(((char *)&i.menuIcon) - ((char *)&i), Sprite::TYPE_ID).SetReferenced().SetDescription("icon that is displayed in menus"));
 
        td.AddField("mostUseful", FieldDescription(((char *)&i.mostUseful) - ((char *)&i), Interpreter::BOOLEAN_ID));
-       td.AddField("equipable", FieldDescription(((char *)&i.equipable) - ((char *)&i), Interpreter::BOOLEAN_ID));
        td.AddField("cursed", FieldDescription(((char *)&i.cursed) - ((char *)&i), Interpreter::BOOLEAN_ID));
        td.AddField("fruit", FieldDescription(((char *)&i.fruit) - ((char *)&i), Interpreter::BOOLEAN_ID));
        td.AddField("scenario", FieldDescription(((char *)&i.scenario) - ((char *)&i), Interpreter::BOOLEAN_ID));
@@ -67,10 +65,34 @@ void Item::CreateTypeDescription() {
        td.AddField("targets", FieldDescription(((char *)&i.targettingMode) - ((char *)&i), TargetingMode::TYPE_ID).SetDescription("how target selection is to be performed"));
        td.AddField("ikari", FieldDescription(((char *)&i.ikari) - ((char *)&i), Ikari::TYPE_ID).SetReferenced().SetDescription("ikari attack of the item (sensible only for equipment)"));
        td.AddField("attackanimation", FieldDescription(((char *)&i.attackAnimation) - ((char *)&i), Animation::TYPE_ID).SetReferenced().SetDescription("animation that is run when the item is used for attacking"));
+       td.AddField("equipability", FieldDescription(((char *)&i.equipability) - ((char *)&i), Interpreter::NUMBER_ID).SetDescription("how this item can be equipped"));
 }
 
 void Item::Construct(void *data) {
        new (data) Item;
 }
 
+
+bool Item::Less(const Item &lhs, const Item &rhs) {
+       if (lhs.IsMostUseful()) {
+               return !rhs.IsMostUseful();
+       }
+       if (lhs.IsEquipable()) {
+               if (rhs.IsMostUseful()) {
+                       return false;
+               }
+               if (!rhs.IsEquipable()) {
+                       return true;
+               }
+               return lhs.equipability < rhs.equipability;
+       }
+       if (lhs.IsFruit()) {
+               if (rhs.IsMostUseful() || rhs.IsEquipable()) {
+                       return true;
+               }
+               return !rhs.IsFruit();
+       }
+       return false;
+}
+
 }
index 279235572768662e820ea60b3fd15533f31a099a..7e757ff245095e8f55e81b8c4f86d5b32595b450 100644 (file)
@@ -29,7 +29,7 @@ public:
        const char *Name() const { return name; }
 
        bool IsMostUseful() const { return mostUseful; }
-       bool IsEquipable() const { return equipable; }
+       bool IsEquipable() const { return equipability; }
        bool IsCursed() const { return cursed; }
        bool IsFruit() const { return fruit; }
        bool IsScenario() const { return scenario; }
@@ -78,6 +78,8 @@ public:
        bool HasBattleAnimation() const { return properties & PROPERTY_HAS_BATTLE_ANIMATION; }
        bool HasIkariEffect() const { return properties & PROPERTY_HAS_IKARI_EFFECT; }
 
+       static bool Less(const Item &, const Item &);
+
 // temporary setters
 public:
        void SetName(const char *n) { name = n; }
@@ -129,12 +131,11 @@ private:
        Uint16 properties;
 
        TargetingMode targettingMode;
-       Uint8 equipability;
+       int equipability;
        HeroGroup equipableBy;
 
        // TODO: turn these back into bits as soon as fields are implemented in the loader
        bool mostUseful;
-       bool equipable;
        bool cursed;
        bool fruit;
        bool scenario;
index 5ace629e05f3d0376fa2629fd55a53dfc9f3dd8c..d761fb8eed78087a62be47956decab9e0f1aee41 100644 (file)
@@ -10,6 +10,14 @@ Number multiple
 Boolean magical
 Boolean physical
 
+// Items
+Number weapon
+Number armor
+Number shield
+Number helmet
+Number ring
+Number jewel
+
 // Trigger type
 Number triggerNorth
 Number triggerEast
index fa01f2b2eb9275794c2c7703f988c297fe4b4921..11d5db51e5e61442a2cb536d689909accf09e89f 100644 (file)
@@ -10,6 +10,14 @@ export Number single 2
 export Boolean magical false
 export Boolean physical true
 
+// Items
+export Number weapon 1
+export Number armor 2
+export Number shield 4
+export Number helmet 8
+export Number ring 16
+export Number jewel 32
+
 // Trigger type
 export Number triggerNorth 0
 export Number triggerEast 1
index 4b49dd6dd457fc763860d46c8d1872a01740aef6..d80b5424b4b0d42fd48ac9f912c28d93fac9507a 100644 (file)
@@ -78,26 +78,31 @@ export Item antidoteItem {
        targets: TargetingMode {
                faction: ally,
                mode: single
-       }
+       },
+       mostUseful: true
 }
 export Item eagleRockItem {
        name: "Eagle rock",
        menuicon: jewelIcon,
-       ikari: diveIkari
+       ikari: diveIkari,
+       equipability: jewel
 }
 export Item escapeItem {
        name: "Escape",
-       battle: false
+       battle: false,
+       mostUseful: true
 }
 export Item evilJewelItem {
        name: "Evil jewel",
        menuicon: jewelIcon,
-       ikari: gloomyIkari
+       ikari: gloomyIkari,
+       equipability: jewel
 }
 export Item ghostRingItem {
        name: "Ghost ring",
        menuicon: ringIcon,
-       ikari: destroyIkari
+       ikari: destroyIkari,
+       equipability: ring
 }
 export Item hiPotionItem {
        name: "Hi-Potion",
@@ -106,32 +111,38 @@ export Item hiPotionItem {
        targets: TargetingMode {
                faction: ally,
                mode: single
-       }
+       },
+       mostUseful: true
 }
 export Item holyCapItem {
        name: "Holy cap",
        menuicon: helmetIcon,
-       ikari: vulnerableIkari
+       ikari: vulnerableIkari,
+       equipability: helmet
 }
 export Item holyRobeItem {
        name: "Holy robe",
        menuicon: armorIcon,
-       ikari: crisisCureIkari
+       ikari: crisisCureIkari,
+       equipability: armor
 }
 export Item holyShieldItem {
        name: "Holy shield",
        menuicon: shieldIcon,
-       ikari: lightGuardIkari
+       ikari: lightGuardIkari,
+       equipability: shield
 }
 export Item krakenRockItem {
        name: "Kraken rock",
        menuicon: jewelIcon,
-       ikari: tenLeggerIkari
+       ikari: tenLeggerIkari,
+       equipability: jewel
 }
 export Item legendHelmItem {
        name: "Legend helm",
        menuicon: helmetIcon,
-       ikari: boomerangIkari
+       ikari: boomerangIkari,
+       equipability: helmet
 }
 export Item lizardBlowItem {
        name: "Lizard blow",
@@ -140,7 +151,8 @@ export Item lizardBlowItem {
        targets: TargetingMode {
                faction: enemy,
                mode: single
-       }
+       },
+       equipability: weapon
 }
 export Item magicJarItem {
        name: "Magic jar",
@@ -149,27 +161,32 @@ export Item magicJarItem {
        targets: TargetingMode {
                faction: ally,
                mode: single
-       }
+       },
+       mostUseful: true
 }
 export Item megaShieldItem {
        name: "Mega shield",
        menuicon: shieldIcon,
-       ikari: ironBarrierIkari
+       ikari: ironBarrierIkari,
+       equipability: shield
 }
 export Item powerPotionItem {
        name: "Power potion",
        menuicon: potionIcon,
-       battle: false
+       battle: false,
+       mostUseful: true
 }
 export Item powerRingItem {
        name: "Power ring",
        menuicon: ringIcon,
-       ikari: trickIkari
+       ikari: trickIkari,
+       equipability: ring
 }
 export Item rocketRingItem {
        name: "Rocket ring",
        menuicon: ringIcon,
-       ikari: fakeIkari
+       ikari: fakeIkari,
+       equipability: ring
 }
 export Item sleepBallItem {
        name: "Sleep ball",
@@ -178,12 +195,14 @@ export Item sleepBallItem {
        targets: TargetingMode {
                faction: enemy,
                mode: single
-       }
+       },
+       mostUseful: true
 }
 export Item sProRingItem {
        name: "S-pro ring",
        menuicon: ringIcon,
-       ikari: courageIkari
+       ikari: courageIkari,
+       equipability: ring
 }
 export Item zircoAxItem {
        name: "Zirco ax",
@@ -192,28 +211,33 @@ export Item zircoAxItem {
        targets: TargetingMode {
                faction: enemy,
                mode: single
-       }
+       },
+       equipability: weapon
 }
 export Item zircoGlovesItem {
        name: "Zirco gloves",
        menuicon: shieldIcon,
-       ikari: forcefieldIkari
+       ikari: forcefieldIkari,
+       equipability: shield
 }
 export Item zircoHelmetItem {
        name: "Zirco helmet",
        menuicon: helmetIcon,
-       ikari: slowIkari
+       ikari: slowIkari,
+       equipability: helmet
 }
 export Item zirconArmorItem {
        name: "Zircon armor",
        menuicon: armorIcon,
        battle: false,
-       ikari: magicCureIkari
+       ikari: magicCureIkari,
+       equipability: armor
 }
 export Item zirconPlateItem {
        name: "Zircon plate",
        menuicon: armorIcon,
-       ikari: suddenCureIkari
+       ikari: suddenCureIkari,
+       equipability: armor
 }
 export Item zircoSwordItem {
        name: "Zirco sword",
@@ -224,7 +248,8 @@ export Item zircoSwordItem {
                mode: single
        },
        ikari: firestormIkari,
-       attackanimation: swordAttackAnimation
+       attackanimation: swordAttackAnimation,
+       equipability: weapon
 }
 export Item zircoWhipItem {
        name: "Zirco whip",
@@ -233,5 +258,6 @@ export Item zircoWhipItem {
                faction: enemy,
                mode: single
        },
-       ikari: thundershriekIkari
+       ikari: thundershriekIkari,
+       equipability: weapon
 }