Replaced Attributes in com.riiablo.item with com.riiablo.attributes for D2SReader

This commit is contained in:
Collin Smith
2020-09-06 01:28:31 -07:00
parent a72b317dc9
commit 85303c28cc
5 changed files with 29 additions and 111 deletions

View File

@ -15,6 +15,7 @@ import com.badlogic.gdx.utils.Pool;
import com.riiablo.CharacterClass;
import com.riiablo.Riiablo;
import com.riiablo.attributes.StatListReader;
import com.riiablo.codec.excel.DifficultyLevels;
import com.riiablo.io.ByteInput;
import com.riiablo.item.Attributes;
@ -75,6 +76,8 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable {
@Deprecated
private static final ItemReader ITEM_READER = new ItemReader(); // TODO: inject
@Deprecated
private static final StatListReader STAT_READER = new StatListReader(); // TODO: inject
/** Constructs a managed instance. Used for local players with complete save data */
public static CharData loadFromD2S(int diff, D2S d2s) {
@ -86,7 +89,7 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable {
byte[] bytes = BufferUtils.readRemaining(buffer);
ByteInput in = ByteInput.wrap(bytes);
D2S d2s = D2SReader.INSTANCE.readD2S(in);
D2SReader.INSTANCE.readRemaining(d2s, in, ITEM_READER);
D2SReader.INSTANCE.readRemaining(d2s, in, STAT_READER, ITEM_READER);
D2SWriterStub.put(d2s, bytes);
return new CharData().set(diff, false).load(d2s);
}
@ -154,7 +157,7 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable {
assert data != null : "d2s.bodyRead(" + d2s.bodyRead() + ") but data == null";
ByteInput in = ByteInput.wrap(data);
in.skipBytes(D2SReader96.HEADER_SIZE);
D2SReader.INSTANCE.readRemaining(d2s, in, ITEM_READER);
D2SReader.INSTANCE.readRemaining(d2s, in, STAT_READER, ITEM_READER);
}
D2SReader.INSTANCE.copyTo(d2s, this);
preprocessItems();

View File

@ -3,6 +3,7 @@ package com.riiablo.save;
import com.badlogic.gdx.utils.Array;
import com.riiablo.Riiablo;
import com.riiablo.attributes.Attributes;
import com.riiablo.item.Item;
public class D2S {
@ -226,22 +227,7 @@ public class D2S {
}
public static class StatData {
public int strength;
public int energy;
public int dexterity;
public int vitality;
public int statpts;
public int newskills;
public int hitpoints;
public int maxhp;
public int mana;
public int maxmana;
public int stamina;
public int maxstamina;
public int level;
public long experience;
public int gold;
public int goldbank;
Attributes attrs;
}
public static class SkillData {

View File

@ -4,6 +4,7 @@ import io.netty.util.ByteProcessor;
import com.badlogic.gdx.files.FileHandle;
import com.riiablo.attributes.StatListReader;
import com.riiablo.io.ByteInput;
import com.riiablo.io.InvalidFormat;
import com.riiablo.io.UnsafeNarrowing;
@ -75,12 +76,12 @@ public enum D2SReader {
}
}
public D2S readRemaining(D2S d2s, ByteInput in, ItemReader itemReader) {
public D2S readRemaining(D2S d2s, ByteInput in, StatListReader statReader, ItemReader itemReader) {
try {
MDC.put("d2s.version", d2s.version);
switch (d2s.version) {
case D2S.VERSION_110:
return D2SReader96.readRemaining(d2s, in, itemReader);
return D2SReader96.readRemaining(d2s, in, statReader, itemReader);
case D2S.VERSION_100:
case D2S.VERSION_107:
case D2S.VERSION_108:

View File

@ -7,6 +7,10 @@ import com.badlogic.gdx.utils.Array;
import com.riiablo.CharacterClass;
import com.riiablo.Riiablo;
import com.riiablo.attributes.Attributes;
import com.riiablo.attributes.StatGetter;
import com.riiablo.attributes.StatListGetter;
import com.riiablo.attributes.StatListReader;
import com.riiablo.codec.COF;
import com.riiablo.io.BitInput;
import com.riiablo.io.ByteInput;
@ -151,7 +155,7 @@ public class D2SReader96 {
}
}
static D2S readRemaining(D2S d2s, ByteInput in, ItemReader itemReader) {
static D2S readRemaining(D2S d2s, ByteInput in, StatListReader statReader, ItemReader itemReader) {
try {
MDC.put("d2s.name", d2s.name);
@ -165,7 +169,7 @@ public class D2SReader96 {
d2s.npcs = readNPCData(in);
MDC.put("d2s.section", "stats");
d2s.stats = readStatData(in);
d2s.stats = readStatData(in, statReader);
recover(in, SKILLS_SIGNATURE, "skills");
MDC.put("d2s.section", "skills");
@ -273,82 +277,13 @@ public class D2SReader96 {
return npcs;
}
static D2S.StatData readStatData(ByteInput in) {
static D2S.StatData readStatData(ByteInput in, StatListReader statReader) {
log.trace("Validating stats signature");
in.readSignature(STATS_SIGNATURE);
D2S.StatData stats = new D2S.StatData();
final Attributes attrs = stats.attrs = Attributes.aggregateAttributes();
BitInput bits = in.unalign();
for (short id; (id = bits.read15u(9)) != Stat.NONE;) {
switch (id) {
case 0:
stats.strength = bits.read31u(numStatBits(id));
log.trace("stats.strength: {}", stats.strength);
break;
case 1:
stats.energy = bits.read31u(numStatBits(id));
log.trace("stats.energy: {}", stats.energy);
break;
case 2:
stats.dexterity = bits.read31u(numStatBits(id));
log.trace("stats.dexterity: {}", stats.dexterity);
break;
case 3:
stats.vitality = bits.read31u(numStatBits(id));
log.trace("stats.vitality: {}", stats.vitality);
break;
case 4:
stats.statpts = bits.read31u(numStatBits(id));
log.trace("stats.statpts: {}", stats.statpts);
break;
case 5:
stats.newskills = bits.read31u(numStatBits(id));
log.trace("stats.newskills: {}", stats.newskills);
break;
case 6:
stats.hitpoints = bits.read31u(numStatBits(id));
log.trace("stats.hitpoints: {}", stats.hitpoints);
break;
case 7:
stats.maxhp = bits.read31u(numStatBits(id));
log.trace("stats.maxhp: {}", stats.maxhp);
break;
case 8:
stats.mana = bits.read31u(numStatBits(id));
log.trace("stats.mana: {}", stats.mana);
break;
case 9:
stats.maxmana = bits.read31u(numStatBits(id));
log.trace("stats.maxmana: {}", stats.maxmana);
break;
case 10:
stats.stamina = bits.read31u(numStatBits(id));
log.trace("stats.stamina: {}", stats.stamina);
break;
case 11:
stats.maxstamina = bits.read31u(numStatBits(id));
log.trace("stats.maxstamina: {}", stats.maxstamina);
break;
case 12:
stats.level = bits.read31u(numStatBits(id));
log.trace("stats.level: {}", stats.level);
break;
case 13:
stats.experience = bits.read63u(numStatBits(id));
log.trace("stats.experience: {}", stats.experience);
break;
case 14:
stats.gold = bits.read31u(numStatBits(id));
log.trace("stats.gold: {}", stats.gold);
break;
case 15:
stats.goldbank = bits.read31u(numStatBits(id));
log.trace("stats.goldbank: {}", stats.goldbank);
break;
default:
throw new InvalidFormat(in, "Unexpected stat id: " + id);
}
}
statReader.read(attrs, bits, true);
bits.align();
return stats;
}
@ -495,22 +430,12 @@ public class D2SReader96 {
}
PropertyList base = data.statData.base();
base.put(Stat.strength, d2s.stats.strength);
base.put(Stat.energy, d2s.stats.energy);
base.put(Stat.dexterity, d2s.stats.dexterity);
base.put(Stat.vitality, d2s.stats.vitality);
base.put(Stat.statpts, d2s.stats.statpts);
base.put(Stat.newskills, d2s.stats.newskills);
base.put(Stat.hitpoints, d2s.stats.hitpoints);
base.put(Stat.maxhp, d2s.stats.maxhp);
base.put(Stat.mana, d2s.stats.mana);
base.put(Stat.maxmana, d2s.stats.maxmana);
base.put(Stat.stamina, d2s.stats.stamina);
base.put(Stat.maxstamina, d2s.stats.maxstamina);
base.put(Stat.level, d2s.stats.level);
base.put(Stat.experience, (int) d2s.stats.experience);
base.put(Stat.gold, d2s.stats.gold);
base.put(Stat.goldbank, d2s.stats.goldbank);
StatListGetter stats = d2s.stats.attrs.base();
for (int i = Stat.strength; i <= Stat.goldbank; i++) {
// FIXME: workaround to ensure compat -- I'm not certain if all d2s contain all these stats
StatGetter stat = stats.get((short) i);
base.put(i, stat != null ? stat.asInt() : 0);
}
CharacterClass classId = data.classId;
for (int spellId = classId.firstSpell, s = classId.lastSpell, i = 0; spellId < s; spellId++, i++) {

View File

@ -12,6 +12,7 @@ import com.badlogic.gdx.files.FileHandle;
import com.riiablo.Files;
import com.riiablo.Riiablo;
import com.riiablo.attributes.StatListReader;
import com.riiablo.codec.StringTBLs;
import com.riiablo.io.ByteInput;
import com.riiablo.item.ItemReader;
@ -46,14 +47,16 @@ public class D2SReaderTool extends ApplicationAdapter {
LogManager.setLevel("com.riiablo.save", Level.ALL);
LogManager.setLevel("com.riiablo.item", Level.ALL);
LogManager.setLevel("com.riiablo.attributes", Level.INFO);
ItemReader itemReader = new ItemReader();
StatListReader statReader = new StatListReader();
D2SReader serializer = D2SReader.INSTANCE;
for (String d2ss0 : d2ss) {
FileHandle handle = Riiablo.home.child("Save/" + d2ss0 + '.' + D2S.EXT);
ByteInput byteInput = ByteInput.wrap(handle.readBytes());
D2S d2s = serializer.readD2S(byteInput);
serializer.readRemaining(d2s, byteInput, itemReader);
serializer.readRemaining(d2s, byteInput, statReader, itemReader);
}
Gdx.app.exit();