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
This commit is contained in:
Collin Smith 2020-07-18 02:05:21 -07:00
parent 90971e57b8
commit 0306c60850
3 changed files with 191 additions and 11 deletions

View File

@ -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<DC6> invFileDescriptor;
DC6 invFile;
Index invColormap;
int invColorIndex;
Index charColormap;
int charColorIndex;
Item() {}
void reset() {

View File

@ -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;
}
}
}

View File

@ -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<DC6> 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() {
}
}