From a0a09d1a1a334ec7e7a04cf1a16cf1c85a48b7af Mon Sep 17 00:00:00 2001 From: Collin Smith Date: Fri, 29 Mar 2019 01:53:08 -0700 Subject: [PATCH] Added set detection on item loading (See #21, #24) Added set detection on item loading Added Player owner reference to Item Added Player owner to format methods for stats --- core/src/com/riiablo/entity/Player.java | 22 ++++++++++++++++++++- core/src/com/riiablo/item/Item.java | 26 +++++++++++++++++++------ core/src/com/riiablo/item/Stat.java | 18 +++++++++-------- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/core/src/com/riiablo/entity/Player.java b/core/src/com/riiablo/entity/Player.java index 3f5eb598..330463b6 100644 --- a/core/src/com/riiablo/entity/Player.java +++ b/core/src/com/riiablo/entity/Player.java @@ -6,14 +6,17 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.IntIntMap; import com.riiablo.CharacterClass; import com.riiablo.Riiablo; import com.riiablo.codec.COF; import com.riiablo.codec.D2S; import com.riiablo.codec.excel.Armor; +import com.riiablo.codec.excel.Sets; import com.riiablo.codec.excel.Weapons; import com.riiablo.item.BodyLoc; import com.riiablo.item.Item; +import com.riiablo.item.Quality; import com.riiablo.map.DT1.Tile; import com.riiablo.map.Map; import com.riiablo.server.Connect; @@ -104,6 +107,11 @@ public class Player extends Entity { EnumMap equipped = new EnumMap<>(BodyLoc.class); final Set SLOT_LISTENERS = new CopyOnWriteArraySet<>(); + /** total number of items equipped for each set */ + public final IntIntMap SETS_EQUIP = new IntIntMap(); + /** total number of owned items for each set item */ + public final IntIntMap SETS_OWNS = new IntIntMap(); + public Player(String name, CharacterClass characterClass) { this(name, characterClass.id); stats = new StatsImpl(name, characterClass.id); @@ -144,7 +152,15 @@ public class Player extends Entity { private void loadEquipped(EnumMap items) { equipped.putAll(items); for (java.util.Map.Entry entry : items.entrySet()) { - entry.getValue().load(); + Item item = entry.getValue(); + item.setOwner(this); + if (item.quality == Quality.SET) { + SETS_OWNS.getAndIncrement(item.qualityId, 0, 1); + Sets.Entry set = Riiablo.files.SetItems.get(item.qualityId).getSet(); + int id = Riiablo.files.Sets.index(set.index); + SETS_EQUIP.getAndIncrement(id, 0, 1); + } + item.load(); if (DEBUG_EQUIP) Gdx.app.debug(TAG, entry.getKey() + ": " + entry.getValue()); } } @@ -152,6 +168,10 @@ public class Player extends Entity { private void loadInventory(Array items) { inventory.addAll(items); for (Item item : items) { + item.setOwner(this); + if (item.quality == Quality.SET) { + SETS_OWNS.getAndIncrement(item.qualityId, 0, 1); + } item.load(); if (DEBUG_INV) Gdx.app.debug(TAG, item.gridX + "," + item.gridY + ": " + item); } diff --git a/core/src/com/riiablo/item/Item.java b/core/src/com/riiablo/item/Item.java index c2bb361c..f3fcc9bc 100644 --- a/core/src/com/riiablo/item/Item.java +++ b/core/src/com/riiablo/item/Item.java @@ -152,6 +152,8 @@ public class Item extends Actor implements Disposable { public Details details; + public Player owner; + public static Item loadFromStream(BitStream bitStream) { return new Item().read(bitStream); } @@ -362,6 +364,16 @@ public class Item extends Actor implements Disposable { return (T) base; } + public void setOwner(Player owner) { + if (this.owner != owner) { + this.owner = owner; + } + } + + public Player getOwner() { + return owner; + } + @Override public String toString() { ToStringBuilder builder = new ToStringBuilder(this); @@ -862,11 +874,11 @@ public class Item extends Actor implements Disposable { if (Item.this.type.is(Type.GEM) || Item.this.type.is(Type.RUNE)) { assert stats.length == NUM_GEM_PROPS; add().height(font.getLineHeight()).space(SPACING).row(); - add(new Label(Riiablo.string.lookup("GemXp3") + " " + stats[WEAPON_PROPS].copy().reduce().get().format(), font, Riiablo.colors.white)).center().space(SPACING).row(); - String tmp = stats[ARMOR_PROPS].copy().reduce().get().format(); + add(new Label(Riiablo.string.lookup("GemXp3") + " " + stats[WEAPON_PROPS].copy().reduce().get().format(owner), font, Riiablo.colors.white)).center().space(SPACING).row(); + String tmp = stats[ARMOR_PROPS].copy().reduce().get().format(owner); add(new Label(Riiablo.string.lookup("GemXp4") + " " + tmp, font, Riiablo.colors.white)).center().space(SPACING).row(); add(new Label(Riiablo.string.lookup("GemXp1") + " " + tmp, font, Riiablo.colors.white)).center().space(SPACING).row(); - add(new Label(Riiablo.string.lookup("GemXp2") + " " + stats[SHIELD_PROPS].copy().reduce().get().format(), font, Riiablo.colors.white)).center().space(SPACING).row(); + add(new Label(Riiablo.string.lookup("GemXp2") + " " + stats[SHIELD_PROPS].copy().reduce().get().format(owner), font, Riiablo.colors.white)).center().space(SPACING).row(); add().height(font.getLineHeight()).space(SPACING).row(); } @@ -953,7 +965,7 @@ public class Item extends Actor implements Disposable { } }); for (Stat.Instance stat : aggregate) { - String text = stat.format(); + String text = stat.format(owner); if (text == null) continue; add(new Label(text, font, Riiablo.colors.blue)).center().space(SPACING).row(); } @@ -983,13 +995,15 @@ public class Item extends Actor implements Disposable { add(new Label(itemFlags.toString(), font, Riiablo.colors.blue)).center().space(SPACING).row(); } - // TODO: This can be cleaned up later -- add support for set detection if (quality == SET) { add().height(font.getLineHeight()).space(SPACING).row(); Sets.Entry set = Riiablo.files.SetItems.get(qualityId).getSet(); add(new Label(Riiablo.string.lookup(set.name), font, Riiablo.colors.gold)).space(SPACING).row(); for (SetItems.Entry item : set.getItems()) { - add(new Label(Riiablo.string.lookup(item.index), font, Riiablo.colors.red)).space(SPACING).row(); + int numOwned = owner.SETS_OWNS.get(Riiablo.files.SetItems.index(item.index), 0); + Label label = new Label(Riiablo.string.lookup(item.index), font, + numOwned > 0 ? Riiablo.colors.green : Riiablo.colors.red); + add(label).space(SPACING).row(); } } diff --git a/core/src/com/riiablo/item/Stat.java b/core/src/com/riiablo/item/Stat.java index da4923b6..99ae92ab 100644 --- a/core/src/com/riiablo/item/Stat.java +++ b/core/src/com/riiablo/item/Stat.java @@ -7,6 +7,7 @@ import com.riiablo.codec.excel.ItemStatCost; import com.riiablo.codec.excel.SkillDesc; import com.riiablo.codec.excel.Skills; import com.riiablo.codec.util.BitStream; +import com.riiablo.entity.Player; import java.util.Arrays; @@ -532,17 +533,18 @@ public class Stat { "ModStre9e", "ModStre9g", "ModStre9d", "ModStre9f", }; - public String format() { - return format(false); + public String format(Player owner) { + return format(owner, entry.descfunc, entry.descval, entry.descstrpos, entry.descstrneg, entry.descstr2); } - public String format(boolean group) { + @Deprecated + public String format(Player owner, boolean group) { return group - ? format(entry.dgrpfunc, entry.dgrpval, entry.dgrpstrpos, entry.dgrpstrneg, entry.dgrpstr2) - : format(entry.descfunc, entry.descval, entry.descstrpos, entry.descstrneg, entry.descstr2); + ? format(owner, entry.dgrpfunc, entry.dgrpval, entry.dgrpstrpos, entry.dgrpstrneg, entry.dgrpstr2) + : format(owner, entry.descfunc, entry.descval, entry.descstrpos, entry.descstrneg, entry.descstr2); } - public String format(int func, int valmode, String strpos, String strneg, String str2) { + public String format(Player owner, int func, int valmode, String strpos, String strneg, String str2) { int value; CharStats.Entry entry; Skills.Entry skill; @@ -827,7 +829,7 @@ public class Stat { } @Override - public String format(int unused1, int unused2, String unused3, String unused4, String unused5) { + public String format(Player unused0, int unused1, int unused2, String unused3, String unused4, String unused5) { if (stats.length == 2) { if (stats[0].value == stats[1].value) { return Riiablo.string.format(str, stats[1].value); @@ -846,7 +848,7 @@ public class Stat { @Override public String toString() { - return stat + "(" + entry + ")" + "=" + Arrays.toString(stats) + " : " + format(0, 0, null, null, null); + return stat + "(" + entry + ")" + "=" + Arrays.toString(stats) + " : " + format(null, 0, 0, null, null, null); } } }