From 0306c6085027efd0a7ec9cf6035b8117e3077df9 Mon Sep 17 00:00:00 2001 From: Collin Smith Date: Sat, 18 Jul 2020 02:05:21 -0700 Subject: [PATCH] Created ItemWrapper class which is an Actor that wraps an Item Added static util methods to ItemUtils This is experimental to play with simplifying Item class --- core/src/com/riiablo/item/item4/Item.java | 11 -- .../src/com/riiablo/item/item4/ItemUtils.java | 102 ++++++++++++++++++ .../com/riiablo/item/item4/ItemWrapper.java | 89 +++++++++++++++ 3 files changed, 191 insertions(+), 11 deletions(-) create mode 100644 core/src/com/riiablo/item/item4/ItemWrapper.java diff --git a/core/src/com/riiablo/item/item4/Item.java b/core/src/com/riiablo/item/item4/Item.java index 64d5cbe3..64c48c17 100644 --- a/core/src/com/riiablo/item/item4/Item.java +++ b/core/src/com/riiablo/item/item4/Item.java @@ -3,13 +3,10 @@ package com.riiablo.item.item4; import java.util.Arrays; import org.apache.commons.lang3.builder.ToStringBuilder; -import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.utils.Array; import com.riiablo.Riiablo; -import com.riiablo.codec.DC6; -import com.riiablo.codec.Index; import com.riiablo.codec.excel.Armor; import com.riiablo.codec.excel.ItemEntry; import com.riiablo.codec.excel.ItemTypes; @@ -156,14 +153,6 @@ public class Item { String name; // cache? Table header; // needed? - // Cursor and 2d image stuff - AssetDescriptor invFileDescriptor; - DC6 invFile; - Index invColormap; - int invColorIndex; - Index charColormap; - int charColorIndex; - Item() {} void reset() { diff --git a/core/src/com/riiablo/item/item4/ItemUtils.java b/core/src/com/riiablo/item/item4/ItemUtils.java index f195fcce..771d32f0 100644 --- a/core/src/com/riiablo/item/item4/ItemUtils.java +++ b/core/src/com/riiablo/item/item4/ItemUtils.java @@ -5,6 +5,9 @@ import com.badlogic.gdx.utils.GdxRuntimeException; import com.riiablo.Riiablo; import com.riiablo.codec.excel.Gems; import com.riiablo.codec.excel.ItemEntry; +import com.riiablo.codec.excel.MagicAffix; +import com.riiablo.codec.excel.SetItems; +import com.riiablo.codec.excel.UniqueItems; import com.riiablo.item.PropertyList; public class ItemUtils { @@ -27,4 +30,103 @@ public class ItemUtils { props[Item.GEMPROPS_SHIELD] = PropertyList.obtain().add(gem.shieldModCode, gem.shieldModParam, gem.shieldModMin, gem.shieldModMax); return props; } + + static String getInvFileName(Item item) { + if (item.isIdentified()) { + switch (item.quality) { + case SET: + SetItems.Entry setItem = (SetItems.Entry) item.qualityData; + if (!setItem.invfile.isEmpty()) return setItem.invfile; + break; + case UNIQUE: + UniqueItems.Entry uniqueItem = (UniqueItems.Entry) item.qualityData; + if (!uniqueItem.invfile.isEmpty()) return uniqueItem.invfile; + break; + default: + // do nothing + } + } + + return item.pictureId >= 0 ? item.typeEntry.InvGfx[item.pictureId] : item.base.invfile; + } + + static String getInvColor(Item item) { + if (item.base.InvTrans == 0 || !item.isIdentified()) return null; + switch (item.quality) { + case MAGIC: { + MagicAffix affix; + int prefix = item.qualityId & Item.MAGIC_AFFIX_MASK; + if ((affix = Riiablo.files.MagicPrefix.get(prefix)) != null && affix.transform) + return affix.transformcolor; + int suffix = item.qualityId >>> Item.MAGIC_AFFIX_SIZE; + if ((affix = Riiablo.files.MagicSuffix.get(suffix)) != null && affix.transform) + return affix.transformcolor; + return null; + } + + case RARE: + case CRAFTED: { + MagicAffix affix; + RareQualityData rareQualityData = (RareQualityData) item.qualityData; + for (int i = 0; i < RareQualityData.NUM_AFFIXES; i++) { + int prefix = rareQualityData.prefixes[i]; + if ((affix = Riiablo.files.MagicPrefix.get(prefix)) != null && affix.transform) + return affix.transformcolor; + int suffix = rareQualityData.suffixes[i]; + if ((affix = Riiablo.files.MagicSuffix.get(suffix)) != null && affix.transform) + return affix.transformcolor; + } + return null; + } + + case SET: + return ((SetItems.Entry) item.qualityData).invtransform; + + case UNIQUE: + return ((UniqueItems.Entry) item.qualityData).invtransform; + + default: + return null; + } + } + + static String getCharColor(Item item) { + if (item.base.Transform == 0 || !item.isIdentified()) return null; + switch (item.quality) { + case MAGIC: { + MagicAffix affix; + int prefix = item.qualityId & Item.MAGIC_AFFIX_MASK; + if ((affix = Riiablo.files.MagicPrefix.get(prefix)) != null && affix.transform) + return affix.transformcolor; + int suffix = item.qualityId >>> Item.MAGIC_AFFIX_SIZE; + if ((affix = Riiablo.files.MagicSuffix.get(suffix)) != null && affix.transform) + return affix.transformcolor; + return null; + } + + case RARE: + case CRAFTED: { + MagicAffix affix; + RareQualityData rareQualityData = (RareQualityData) item.qualityData; + for (int i = 0; i < RareQualityData.NUM_AFFIXES; i++) { + int prefix = rareQualityData.prefixes[i]; + if ((affix = Riiablo.files.MagicPrefix.get(prefix)) != null && affix.transform) + return affix.transformcolor; + int suffix = rareQualityData.suffixes[i]; + if ((affix = Riiablo.files.MagicSuffix.get(suffix)) != null && affix.transform) + return affix.transformcolor; + } + return null; + } + + case SET: + return ((SetItems.Entry) item.qualityData).chrtransform; + + case UNIQUE: + return ((UniqueItems.Entry) item.qualityData).chrtransform; + + default: + return null; + } + } } diff --git a/core/src/com/riiablo/item/item4/ItemWrapper.java b/core/src/com/riiablo/item/item4/ItemWrapper.java new file mode 100644 index 00000000..91dd37df --- /dev/null +++ b/core/src/com/riiablo/item/item4/ItemWrapper.java @@ -0,0 +1,89 @@ +package com.riiablo.item.item4; + +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.utils.Disposable; + +import com.riiablo.Riiablo; +import com.riiablo.codec.DC6; +import com.riiablo.codec.Index; +import com.riiablo.codec.excel.Inventory; +import com.riiablo.codec.util.BBox; +import com.riiablo.graphics.PaletteIndexedBatch; + +public class ItemWrapper extends Actor implements Disposable { + final Item item; + + AssetDescriptor invFileDescriptor; + DC6 invFile; + + Index invColormap; + int invColorIndex; + + Index charColormap; + int charColorIndex; + + private ItemWrapper(Item item) { + this.item = item; + } + + @Override + public String getName() { + return item.getNameString(); + } + + public void resize() { + BBox box = invFile.getBox(); + setSize(box.width, box.height); + } + + public void resize(Inventory.Entry inv) { + setSize(item.base.invwidth * inv.gridBoxWidth, item.base.invheight * inv.gridBoxHeight); + } + + + public void load() { + if (invFileDescriptor != null) return; + invFileDescriptor = new AssetDescriptor<>("data\\global\\items\\" + ItemUtils.getInvFileName(item) + '.' + DC6.EXT, DC6.class); + Riiablo.assets.load(invFileDescriptor); + checkLoaded(); + + invColormap = Riiablo.colormaps.get(item.base.InvTrans); + String invColor = ItemUtils.getInvColor(item); + invColorIndex = invColor != null ? Riiablo.files.colors.index(invColor) + 1 : 0; + + charColormap = Riiablo.colormaps.get(item.base.Transform); + String charColor = ItemUtils.getCharColor(item); + charColorIndex = charColor != null ? Riiablo.files.colors.index(charColor) + 1 : 0; + + // TODO: load images of socketed items + } + + public boolean checkLoaded() { + boolean b = Riiablo.assets.isLoaded(invFileDescriptor); + if (b && invFile == null) { + invFile = Riiablo.assets.get(invFileDescriptor); + resize(); + } + + return b; + } + + @Override + public void draw(Batch batch, float a) { + if (invFile == null && !checkLoaded()) return; + PaletteIndexedBatch b = (PaletteIndexedBatch) batch; + boolean ethereal = item.isEthereal(); + if (ethereal) b.setAlpha(Item.ETHEREAL_ALPHA); + if (invColormap != null) b.setColormap(invColormap, invColorIndex); + invFile.draw(b, getX(), getY()); + if (invColormap != null) b.resetColormap(); + if (ethereal) b.resetColor(); + } + + @Override + public void dispose() { + + } +}