mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-06 16:27:34 +07:00
Replaced Attributes in com.riiablo.item with com.riiablo.attributes for D2SReader
This commit is contained in:
@ -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();
|
||||
|
@ -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 {
|
||||
|
@ -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:
|
||||
|
@ -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++) {
|
||||
|
@ -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();
|
||||
|
Reference in New Issue
Block a user