diff --git a/core/src/com/riiablo/save/CharData.java b/core/src/com/riiablo/save/CharData.java index 5f95185b..85db2c69 100644 --- a/core/src/com/riiablo/save/CharData.java +++ b/core/src/com/riiablo/save/CharData.java @@ -46,7 +46,6 @@ public class CharData { public String name; public byte charClass; - public int alternate; public int flags; public byte level; public final int hotkeys[] = new int[D2S.NUM_HOTKEYS]; @@ -102,7 +101,6 @@ public class CharData { this.name = name; this.charClass = charClass; classId = CharacterClass.get(charClass); - alternate = D2S.PRIMARY; flags = D2S.FLAG_EXPANSION; level = 1; Arrays.fill(hotkeys, D2S.HOTKEY_UNASSIGNED); @@ -127,7 +125,6 @@ public class CharData { name = null; charClass = -1; classId = null; - alternate = 0; flags = 0; level = 0; Arrays.fill(hotkeys, D2S.HOTKEY_UNASSIGNED); @@ -165,6 +162,20 @@ public class CharData { skills.clear(); chargedSkills.clear(); skillListeners.clear(); + + DifficultyLevels.Entry diff = Riiablo.files.DifficultyLevels.get(this.diff); + PropertyList base = statData.base(); + base.put(Stat.armorclass, 0); + base.put(Stat.damageresist, 0); + base.put(Stat.magicresist, 0); + base.put(Stat.fireresist, diff.ResistPenalty); + base.put(Stat.lightresist, diff.ResistPenalty); + base.put(Stat.coldresist, diff.ResistPenalty); + base.put(Stat.poisonresist, diff.ResistPenalty); + base.put(Stat.maxfireresist, 75); + base.put(Stat.maxlightresist, 75); + base.put(Stat.maxcoldresist, 75); + base.put(Stat.maxpoisonresist, 75); } public boolean isManaged() { @@ -185,7 +196,7 @@ public class CharData { } public int getAction(int button) { - return getAction(alternate, button); + return getAction(itemData.alternate, button); } public int getAction(int alternate, int button) { @@ -233,45 +244,31 @@ public class CharData { } public void updateStats() { - DifficultyLevels.Entry diff = Riiablo.files.DifficultyLevels.get(this.diff); - PropertyList base = statData.base(); - base.put(Stat.armorclass, 0); - base.put(Stat.damageresist, 0); - base.put(Stat.magicresist, 0); - base.put(Stat.fireresist, diff.ResistPenalty); - base.put(Stat.lightresist, diff.ResistPenalty); - base.put(Stat.coldresist, diff.ResistPenalty); - base.put(Stat.poisonresist, diff.ResistPenalty); - base.put(Stat.maxfireresist, 75); - base.put(Stat.maxlightresist, 75); - base.put(Stat.maxcoldresist, 75); - base.put(Stat.maxpoisonresist, 75); - - statData.reset(); - int[] equippedItems = itemData.equipped.values(); - for (int i = 0, s = equippedItems.length, j; i < s; i++) { - j = equippedItems[i]; - if (j == ItemData.INVALID_ITEM) continue; - Item item = itemData.getItem(j); - if (isActive(item)) { - statData.add(item.props.remaining()); - Stat stat; - if ((stat = item.props.get(Stat.armorclass)) != null) { - statData.aggregate().addCopy(stat); - } - } - } +// statData.reset(); +// int[] equippedItems = itemData.equipped.values(); +// for (int i = 0, s = equippedItems.length, j; i < s; i++) { +// j = equippedItems[i]; +// if (j == ItemData.INVALID_ITEM) continue; +// Item item = itemData.getItem(j); +// if (isActive(item)) { +// statData.add(item.props.remaining()); +// Stat stat; +// if ((stat = item.props.get(Stat.armorclass)) != null) { +// statData.aggregate().addCopy(stat); +// } +// } +// } IntArray inventoryItems = itemData.getStore(StoreLoc.INVENTORY); int[] inventoryItemsCache = inventoryItems.items; - for (int i = 0, s = inventoryItems.size, j; i < s; i++) { - j = inventoryItemsCache[i]; - if (j == ItemData.INVALID_ITEM) continue; - Item item = itemData.getItem(j); - if (item.type.is(Type.CHAR)) { - statData.add(item.props.remaining()); - } - } -// statData.update(this); // TODO: uncomment +// for (int i = 0, s = inventoryItems.size, j; i < s; i++) { +// j = inventoryItemsCache[i]; +// if (j == ItemData.INVALID_ITEM) continue; +// Item item = itemData.getItem(j); +// if (item.type.is(Type.CHAR)) { +// statData.add(item.props.remaining()); +// } +// } +//// statData.update(this); // TODO: uncomment // FIXME: This corrects a mismatch between max and current, algorithm should be tested later for correctness in other cases statData.get(Stat.maxstamina).set(statData.get(Stat.stamina)); @@ -287,8 +284,8 @@ public class CharData { skills.clear(); skills.putAll(skillData); skills.putAll(defaultSkills); - Item LARM = getEquipped(BodyLoc.LARM); - Item RARM = getEquipped(BodyLoc.RARM); + Item LARM = itemData.getEquipped(BodyLoc.LARM); + Item RARM = itemData.getEquipped(BodyLoc.RARM); if ((LARM != null && LARM.typeEntry.Throwable) || (RARM != null && RARM.typeEntry.Throwable)) { skills.put(throw_, 1); @@ -296,8 +293,9 @@ public class CharData { skills.put(left_hand_throw, 1); } } - for (int i = 0, s = inventoryItems.size; i < s; i++) { - Item item = itemData.getItem(inventoryItemsCache[i]); + for (int i = 0, s = inventoryItems.size, j; i < s; i++) { + j = inventoryItemsCache[i]; + Item item = itemData.getItem(j); if (item.type.is(Type.BOOK) || item.type.is(Type.SCRO)) { if (item.base.code.equalsIgnoreCase("ibk")) { skills.getAndIncrement(book_of_identify, 0, item.props.get(Stat.quantity).value()); @@ -334,31 +332,6 @@ public class CharData { return itemData; } - public Item getItem(int i) { - return itemData.getItem(i); - } - - public Item getCursor() { - return itemData.getCursor(); - } - - public Item getSlot(BodyLoc bodyLoc) { - return itemData.getSlot(bodyLoc); - } - - public Item getEquipped(BodyLoc bodyLoc) { - return getEquipped(bodyLoc, alternate); - } - - public Item getEquipped(BodyLoc bodyLoc, int alternate) { - return itemData.getEquipped(bodyLoc, alternate); - } - - public boolean isActive(Item item) { - if (item == null) return false; - return item.bodyLoc == BodyLoc.getAlternate(item.bodyLoc, alternate); - } - public void itemToCursor(int i) { assert itemData.cursor == ItemData.INVALID_ITEM; itemData.cursor = i; @@ -459,14 +432,14 @@ public class CharData { } public int getAlternate() { - return alternate; + return itemData.alternate; } public void setAlternate(int alternate) { - if (this.alternate != alternate) { - this.alternate = alternate; - Item LH = getEquipped(BodyLoc.LARM); - Item RH = getEquipped(BodyLoc.RARM); + if (itemData.alternate != alternate) { + itemData.alternate = alternate; + Item LH = itemData.getEquipped(BodyLoc.LARM); + Item RH = itemData.getEquipped(BodyLoc.RARM); updateStats(); notifyAlternated(alternate, LH, RH); } diff --git a/core/src/com/riiablo/save/D2S.java b/core/src/com/riiablo/save/D2S.java index 67fdb95f..89a569f3 100644 --- a/core/src/com/riiablo/save/D2S.java +++ b/core/src/com/riiablo/save/D2S.java @@ -151,7 +151,6 @@ public class D2S { data.name = header.name; data.charClass = header.charClass; data.classId = CharacterClass.get(header.charClass); - data.alternate = header.alternate; data.flags = header.flags; data.level = header.level; System.arraycopy(header.hotkeys, 0, data.hotkeys, 0, D2S.NUM_HOTKEYS); @@ -214,6 +213,7 @@ public class D2S { data.itemData.clear(); data.itemData.addAll(items.items); + data.itemData.alternate = header.alternate; data.golemItemData = golem.item; return data; } diff --git a/core/src/com/riiablo/save/ItemData.java b/core/src/com/riiablo/save/ItemData.java index 9bfeb126..14e85ffd 100644 --- a/core/src/com/riiablo/save/ItemData.java +++ b/core/src/com/riiablo/save/ItemData.java @@ -10,7 +10,9 @@ import com.riiablo.item.BodyLoc; import com.riiablo.item.Item; import com.riiablo.item.Location; import com.riiablo.item.Quality; +import com.riiablo.item.Stat; import com.riiablo.item.StoreLoc; +import com.riiablo.item.Type; import com.riiablo.util.EnumIntMap; public class ItemData { @@ -20,7 +22,8 @@ public class ItemData { final Array itemData = new Array<>(Item.class); - int cursor; + int cursor = INVALID_ITEM; + int alternate = D2S.PRIMARY; final EnumIntMap equipped = new EnumIntMap<>(BodyLoc.class, INVALID_ITEM); final Array equipListeners = new Array<>(false, 16); @@ -34,6 +37,7 @@ public class ItemData { public void clear() { cursor = INVALID_ITEM; + alternate = D2S.PRIMARY; itemData.clear(); equipped.clear(); equipListeners.clear(); @@ -81,10 +85,19 @@ public class ItemData { return i == ItemData.INVALID_ITEM ? null : getItem(i); } + public Item getEquipped(BodyLoc bodyLoc) { + return getEquipped(bodyLoc, alternate); + } + public Item getEquipped(BodyLoc bodyLoc, int alternate) { return getSlot(BodyLoc.getAlternate(bodyLoc, alternate)); } + public boolean isActive(Item item) { + if (item == null) return false; + return item.bodyLoc == BodyLoc.getAlternate(item.bodyLoc, alternate); + } + public int add(Item item) { int i = itemData.size; itemData.add(item); @@ -159,7 +172,35 @@ public class ItemData { void update(int i) { Item item = itemData.get(i); // if (item != null) item.update(this); -// updateStats(); + } + + private void updateStats() { + Stat stat; + stats.reset(); + int[] cache = equipped.values(); + for (int i = 0, s = cache.length, j; i < s; i++) { + j = cache[i]; + if (j == ItemData.INVALID_ITEM) continue; + Item item = itemData.get(j); + if (isActive(item)) { + stats.add(item.props.remaining()); + if ((stat = item.props.get(Stat.armorclass)) != null) { + stats.aggregate().addCopy(stat); + } + } + } + + IntArray inventoryItems = getStore(StoreLoc.INVENTORY); + cache = inventoryItems.items; + for (int i = 0, s = cache.length, j; i < s; i++) { + j = cache[i]; + if (j == ItemData.INVALID_ITEM) continue; + Item item = itemData.get(j); + if (item.type.is(Type.CHAR)) { + stats.add(item.props.remaining()); + } + } +// stats.update(this); // TODO: uncomment } private void updateSet(Item item, int add) {