diff --git a/src/main/java/net/moonlightflower/wc3libs/bin/BinInputStream.java b/src/main/java/net/moonlightflower/wc3libs/bin/BinInputStream.java index 635e1278..6a3963a0 100644 --- a/src/main/java/net/moonlightflower/wc3libs/bin/BinInputStream.java +++ b/src/main/java/net/moonlightflower/wc3libs/bin/BinInputStream.java @@ -25,7 +25,7 @@ public byte[] readBytes(int size) throws StreamException { return vals; } catch (IndexOutOfBoundsException e) { - throw new StreamException(this); + throw new StreamException(this, e.getMessage()); } } diff --git a/src/main/java/net/moonlightflower/wc3libs/bin/BinStream.java b/src/main/java/net/moonlightflower/wc3libs/bin/BinStream.java index cc7f698e..50ed928e 100644 --- a/src/main/java/net/moonlightflower/wc3libs/bin/BinStream.java +++ b/src/main/java/net/moonlightflower/wc3libs/bin/BinStream.java @@ -35,7 +35,7 @@ public BinStream getStream() { } @Override - public String toString() { + public String getMessage() { StringBuilder sb = new StringBuilder(); for (String s : _stream.getLogLines()) { @@ -47,6 +47,11 @@ public String toString() { return sb.toString(); } + @Override + public String toString() { + return getMessage(); + } + public StreamException(@Nonnull BinStream stream, @Nonnull String msg) { this(stream); diff --git a/src/main/java/net/moonlightflower/wc3libs/bin/app/SHD.java b/src/main/java/net/moonlightflower/wc3libs/bin/app/SHD.java index 590b4e4b..087345c1 100644 --- a/src/main/java/net/moonlightflower/wc3libs/bin/app/SHD.java +++ b/src/main/java/net/moonlightflower/wc3libs/bin/app/SHD.java @@ -5,6 +5,7 @@ import net.moonlightflower.wc3libs.bin.Wc3BinInputStream; import net.moonlightflower.wc3libs.bin.Wc3BinOutputStream; import net.moonlightflower.wc3libs.dataTypes.app.Bounds; +import net.moonlightflower.wc3libs.dataTypes.app.Coords2DF; import net.moonlightflower.wc3libs.dataTypes.app.Coords2DI; import net.moonlightflower.wc3libs.misc.ShadowMap; import net.moonlightflower.wc3libs.misc.Size; @@ -72,7 +73,7 @@ private void read_0x0(@Nonnull Wc3BinInputStream stream) throws BinInputStream.S //TODO: long? int sizeI = (int) stream.size(); - _shadowMap.setBounds(new Bounds(new Size(1, sizeI), new Coords2DI(0, 0)), false, false); + _shadowMap.setBounds(new Bounds(new Size(1, sizeI)), false, false); for (int i = 0; i < sizeI; i++) { Boolean val = ((stream.readByte() & 0xFF) == 0xFF); @@ -148,7 +149,7 @@ public SHD clone() throws CloneNotSupportedException { } public SHD(@Nonnull BufferedImage img) { - this(new Bounds(new Size(img.getWidth(), img.getHeight()), new Coords2DI(0, 0))); + this(new Bounds(new Size(img.getWidth(), img.getHeight()))); for (int x = 0; x < img.getWidth(); x++) { for (int y = 0; y < img.getHeight(); y++) { @@ -174,7 +175,7 @@ public SHD(@Nonnull Wc3BinInputStream stream) throws IOException { } public SHD() { - _shadowMap = new ShadowMap(new Bounds(new Size(0, 0), new Coords2DI(0, 0))); + _shadowMap = new ShadowMap(new Bounds(new Size(0, 0))); } @Nonnull diff --git a/src/main/java/net/moonlightflower/wc3libs/bin/app/W3E.java b/src/main/java/net/moonlightflower/wc3libs/bin/app/W3E.java index 16b6a707..508122ed 100644 --- a/src/main/java/net/moonlightflower/wc3libs/bin/app/W3E.java +++ b/src/main/java/net/moonlightflower/wc3libs/bin/app/W3E.java @@ -2,6 +2,7 @@ import net.moonlightflower.wc3libs.bin.*; import net.moonlightflower.wc3libs.dataTypes.app.Bounds; +import net.moonlightflower.wc3libs.dataTypes.app.Coords2DF; import net.moonlightflower.wc3libs.dataTypes.app.Coords2DI; import net.moonlightflower.wc3libs.misc.*; @@ -428,7 +429,7 @@ private void write_0xB(@Nonnull Wc3BinOutputStream stream) throws BinStream.Stre stream.writeInt32(width); stream.writeInt32(height); - Coords2DI center = getCenter(); + Coords2DF center = getCenter(); stream.writeFloat32(center.getX()); stream.writeFloat32(center.getY()); @@ -531,7 +532,7 @@ private W3E read_0xB() throws BinInputStream.StreamException { _w3e.setCliffTile(i, stream.readId("cliffTilesUsed" + i)); } - _w3e.setBounds(new Bounds(new Size(stream.readInt32("width"), stream.readInt32("height")), new Coords2DI(stream.readFloat32("x").intValue(), stream.readFloat32("y").intValue())), false, false); + _w3e.setBounds(new Bounds(new Size(stream.readInt32("width"), stream.readInt32("height")), new Coords2DF(stream.readFloat32("x"), stream.readFloat32("y"))), false, false); int width = _w3e.getWidth(); int height = _w3e.getHeight(); diff --git a/src/main/java/net/moonlightflower/wc3libs/bin/app/W3I.java b/src/main/java/net/moonlightflower/wc3libs/bin/app/W3I.java index b6a17dd1..fc778ef5 100644 --- a/src/main/java/net/moonlightflower/wc3libs/bin/app/W3I.java +++ b/src/main/java/net/moonlightflower/wc3libs/bin/app/W3I.java @@ -42,7 +42,7 @@ public void setFileVersion(int fileVersion) { } public static class State extends BinState { - public static State SAVES_AMOUNT = new State<>("savesAmount", War3Int.class); + public static State SAVES_AMOUNT = new State<>("savesAmount", War3Int.class, War3Int.valueOf(0)); public State(@Nonnull String fieldIdS, @Nonnull DataTypeInfo typeInfo, @Nullable T defVal) { super(fieldIdS, typeInfo, defVal); @@ -232,7 +232,7 @@ public int getHeight() { public Bounds getWorldBounds() { Size size = new Size(getWidth() + getMargins().getMinX() + getMargins().getMaxX(), getHeight() + getMargins().getMinY() + getMargins().getMaxY()); - return new Bounds(size, new Coords2DI(0, 0)); + return new Bounds(size); } public void setDimensions(int width, int height) { @@ -1232,19 +1232,10 @@ public Player getPlayerFromNum(int num) { return null; } - private void addPlayer(@Nonnull Player val) { + public void addPlayer(@Nonnull Player val) { _players.add(val); } - @Nonnull - public Player addPlayer() { - Player player = new Player(); - - addPlayer(player); - - return player; - } - public static class Force { public static class Flags extends FlagsInt { @Override @@ -1368,7 +1359,7 @@ public String toString() { playersS = playersS.substring(playersS.length() - 12).replaceAll(" ", "0"); - return String.format("%s [players=%s, flags=%s]", getName(), playersS, getFlags()); + return String.format("name=%s players=%s flags=%s", getName(), playersS, getFlags()); } private void read_0x12(@Nonnull Wc3BinInputStream stream) throws BinInputStream.StreamException { @@ -1435,19 +1426,10 @@ public List getForces() { return new ArrayList<>(_forces); } - private void addForce(@Nonnull Force val) { + public void addForce(@Nonnull Force val) { _forces.add(val); } - @Nonnull - public Force addForce() { - Force force = new Force(); - - addForce(force); - - return force; - } - public void removeForce(@Nonnull Force force) { _forces.remove(force); } @@ -1497,6 +1479,11 @@ public void setAvail(int val) { _avail = val; } + @Override + public String toString() { + return String.format("avail=%s id=%s level=%s players=%s", _avail, _id, _level, _players); + } + private void read_0x12(@Nonnull Wc3BinInputStream stream) throws BinInputStream.StreamException { setPlayers(stream.readInt32("abilPlayers")); @@ -1559,19 +1546,10 @@ public List getUpgradeMods() { return new ArrayList<>(_upgradeMods); } - private void addUpgradeMod(@Nonnull UpgradeMod val) { + public void addUpgradeMod(@Nonnull UpgradeMod val) { _upgradeMods.add(val); } - @Nonnull - public UpgradeMod addUpgradeMod() { - UpgradeMod upgradeMod = new UpgradeMod(); - - addUpgradeMod(upgradeMod); - - return upgradeMod; - } - public static class TechMod { private int _players = 0; @@ -1594,6 +1572,11 @@ public void setId(@Nonnull Id val) { _id = val; } + @Override + public String toString() { + return String.format("id=%s players=%s", _id, _players); + } + private void read_0x12(@Nonnull Wc3BinInputStream stream) throws BinInputStream.StreamException { setPlayers(stream.readInt32("techPlayers")); @@ -1648,19 +1631,10 @@ public List getTechMods() { return new ArrayList<>(_techMods); } - private void addTechMod(@Nonnull TechMod val) { + public void addTechMod(@Nonnull TechMod val) { _techMods.add(val); } - @Nonnull - public TechMod addTechMod() { - TechMod techMod = new TechMod(); - - addTechMod(techMod); - - return techMod; - } - public static class UnitTable { private int _index = 0; @@ -1746,6 +1720,11 @@ public void setTypeId(int pos, Id val) { _typeIds.put(pos, val); } + @Override + public String toString() { + return String.format("chance=%s typeIds=[%s]", _chance, _typeIds.entrySet().stream().map(entry -> String.format("%s->%s", entry.getKey(), entry.getValue())).collect(Collectors.joining(" "))); + } + private void read_0x12(@Nonnull Wc3BinInputStream stream) throws BinInputStream.StreamException { setChance(stream.readInt32("chance")); @@ -1795,8 +1774,8 @@ public Set(@Nonnull Wc3BinInputStream stream, @Nonnull EncodingFormat format, @N read(stream, format); } - public Set() { - + public Set(int chance) { + _chance = chance; } } @@ -1807,17 +1786,13 @@ public List getSets() { return new ArrayList<>(_sets); } - private void addSet(@Nonnull Set val) { + public void addSet(@Nonnull Set val) { _sets.add(val); } - @Nonnull - public Set addSet() { - Set set = new Set(); - - addSet(set); - - return set; + @Override + public String toString() { + return String.format("index=%s name=%s positionTypes=[%s] sets=[%s]", _index, _name, _positionTypes.entrySet().stream().map(entry -> String.format("%s->%s", entry.getKey(), entry.getValue())).collect(Collectors.joining(" ")), _sets.stream().map(Set::toString).collect(Collectors.joining(" "))); } private void read_0x12(@Nonnull Wc3BinInputStream stream) throws Exception { @@ -1889,7 +1864,9 @@ public UnitTable(@Nonnull Wc3BinInputStream stream, @Nonnull EncodingFormat form read(stream, format); } - public UnitTable() { + public UnitTable(int index, @Nonnull String name) { + _index = index; + _name = name; } } @@ -1900,19 +1877,10 @@ public List getUnitTables() { return new ArrayList<>(_unitTables); } - private void addUnitTable(@Nonnull UnitTable val) { + public void addUnitTable(@Nonnull UnitTable val) { _unitTables.add(val); } - @Nonnull - public UnitTable addUnitTable() { - UnitTable unitTable = new UnitTable(); - - addUnitTable(unitTable); - - return unitTable; - } - public static class ItemTable { private int _index = 0; @@ -1935,37 +1903,110 @@ public void setName(String val) { } public static class Set { - private int _chance = 100; + public static class Item { + private int _chance = 100; - public int getChance() { - return _chance; - } + public int getChance() { + return _chance; + } - public void setChance(int val) { - _chance = val; + public void setChance(int val) { + _chance = val; + } + + private Id _typeId; + + @Nonnull + public Id getTypeId() { + return _typeId; + } + + public void setTypeId(@Nonnull Id val) { + _typeId = val; + } + + @Override + public String toString() { + return String.format("chance=%s typeId=%s", _chance, _typeId); + } + + private void read_0x19(@Nonnull Wc3BinInputStream stream) throws BinInputStream.StreamException { + setChance(stream.readInt32("chance")); + + setTypeId(stream.readId("typeId")); + } + + private void write_0x19(@Nonnull Wc3BinOutputStream stream) { + stream.writeInt32(getChance()); + + stream.writeId(getTypeId()); + } + + private void read(@Nonnull Wc3BinInputStream stream, @Nonnull EncodingFormat format) throws BinInputStream.StreamException { + switch (format.toEnum()) { + case W3I_0x1F: + case W3I_0x1C: + case W3I_0x19: { + read_0x19(stream); + + break; + } + } + } + + private void write(@Nonnull Wc3BinOutputStream stream, @Nonnull EncodingFormat format) { + switch (format.toEnum()) { + case AUTO: + case W3I_0x1F: + case W3I_0x1C: + case W3I_0x19: { + write_0x19(stream); + + break; + } + } + } + + public Item(@Nonnull Wc3BinInputStream stream, @Nonnull EncodingFormat format) throws BinInputStream.StreamException { + read(stream, format); + } + + public Item(@Nonnull Id typeId, int chance) { + _typeId = typeId; + _chance = chance; + } } - private Id _id; + private List _items = new ArrayList<>(); @Nonnull - public Id getTypeId() { - return _id; + public List getItems() { + return new ArrayList<>(_items); } - public void setTypeId(@Nonnull Id val) { - _id = val; + public void addItem(@Nonnull Item val) { + _items.add(val); + } + + @Override + public String toString() { + return String.format("items=[%s]", _items.stream().map(Item::toString).collect(Collectors.joining(" "))); } private void read_0x19(@Nonnull Wc3BinInputStream stream) throws BinInputStream.StreamException { - setChance(stream.readInt32("chance")); + int itemsCount = stream.readInt32("itemsCount"); - setTypeId(stream.readId("typeId")); + for (int i = 0; i < itemsCount; i++) { + addItem(new Item(stream, EncodingFormat.W3I_0x19)); + } } private void write_0x19(@Nonnull Wc3BinOutputStream stream) { - stream.writeInt32(getChance()); + stream.writeInt32(_items.size()); - stream.writeId(getTypeId()); + for (Item item : _items) { + item.write(stream, EncodingFormat.W3I_0x19); + } } private void read(@Nonnull Wc3BinInputStream stream, @Nonnull EncodingFormat format) throws BinInputStream.StreamException { @@ -2008,17 +2049,13 @@ public List getSets() { return new ArrayList<>(_sets); } - private void addSet(@Nonnull Set val) { + public void addSet(@Nonnull Set val) { _sets.add(val); } - @Nonnull - public Set addSet() { - Set set = new Set(); - - addSet(set); - - return set; + @Override + public String toString() { + return String.format("index=%s name=%s sets=[%s]", _index, _name, _sets.stream().map(Set::toString).collect(Collectors.joining(" "))); } private void read_0x19(@Nonnull Wc3BinInputStream stream) throws BinInputStream.StreamException { @@ -2038,6 +2075,8 @@ private void write_0x19(@Nonnull Wc3BinOutputStream stream) { stream.writeString(getName()); + stream.writeInt32(_sets.size()); + for (Set set : _sets) { set.write(stream, EncodingFormat.W3I_0x19); } @@ -2072,7 +2111,9 @@ public ItemTable(@Nonnull Wc3BinInputStream stream, @Nonnull EncodingFormat form read(stream, format); } - public ItemTable() { + public ItemTable(int index, @Nonnull String name) { + _index = index; + _name = name; } } @@ -2083,19 +2124,10 @@ public List getItemTables() { return new ArrayList<>(_itemTables); } - private void addItemTable(@Nonnull ItemTable val) { + public void addItemTable(@Nonnull ItemTable val) { _itemTables.add(val); } - @Nonnull - public ItemTable addItemTable() { - ItemTable itemTable = new ItemTable(); - - addItemTable(itemTable); - - return itemTable; - } - public void print(@Nonnull PrintStream outStream) { outStream.println(String.format("savesAmount: %s", getSavesAmount())); outStream.println(String.format("editorVersion: %d", getEditorVersion())); @@ -2128,6 +2160,13 @@ public void print(@Nonnull PrintStream outStream) { outStream.println(String.format("tilesetLightEnv: %s", getTilesetLightEnv())); outStream.println(String.format("waterColor: %s", getWaterColor())); + + outStream.println(String.format("players: [%s]", getPlayers().stream().map(Player::toString).collect(Collectors.joining(" ")))); + outStream.println(String.format("forces: [%s]", getForces().stream().map(Force::toString).collect(Collectors.joining(" ")))); + outStream.println(String.format("upgradeMods: [%s]", getUpgradeMods().stream().map(UpgradeMod::toString).collect(Collectors.joining(" ")))); + outStream.println(String.format("techMods: [%s]", getTechMods().stream().map(TechMod::toString).collect(Collectors.joining(" ")))); + outStream.println(String.format("unitTables: [%s]", getUnitTables().stream().map(UnitTable::toString).collect(Collectors.joining(" ")))); + outStream.println(String.format("itemTables: [%s]", getItemTables().stream().map(ItemTable::toString).collect(Collectors.joining(" ")))); } public void print() { @@ -2511,7 +2550,11 @@ private void write_0x19(@Nonnull Wc3BinOutputStream stream) { unitTable.write(stream, EncodingFormat.W3I_0x19); } - stream.writeInt32(0); + stream.writeInt32(_itemTables.size()); + + for (ItemTable itemTable : _itemTables) { + itemTable.write(stream, EncodingFormat.W3I_0x19); + } } private void read_0x1C(@Nonnull Wc3BinInputStream stream) throws Exception { @@ -2748,7 +2791,11 @@ private void write_0x1C(@Nonnull Wc3BinOutputStream stream) { unitTable.write(stream, EncodingFormat.W3I_0x1C); } - stream.writeInt32(0); + stream.writeInt32(_itemTables.size()); + + for (ItemTable itemTable : _itemTables) { + itemTable.write(stream, EncodingFormat.W3I_0x1C); + } } private void read_0x1F(@Nonnull Wc3BinInputStream stream) throws Exception { @@ -2999,7 +3046,11 @@ private void write_0x1F(@Nonnull Wc3BinOutputStream stream) { unitTable.write(stream, EncodingFormat.W3I_0x1F); } - stream.writeInt32(0); + stream.writeInt32(_itemTables.size()); + + for (ItemTable itemTable : _itemTables) { + itemTable.write(stream, EncodingFormat.W3I_0x1F); + } } private void read_auto(@Nonnull Wc3BinInputStream stream) throws Exception { @@ -3080,7 +3131,9 @@ public void write(@Nonnull File file) throws IOException { } public W3I() { - + for (State state : State.values(State.class)) { + set(state, state.getDefVal()); + } } public W3I(@Nonnull Wc3BinInputStream stream) throws Exception { diff --git a/src/main/java/net/moonlightflower/wc3libs/bin/app/WPM.java b/src/main/java/net/moonlightflower/wc3libs/bin/app/WPM.java index ea9d9149..356fa91b 100644 --- a/src/main/java/net/moonlightflower/wc3libs/bin/app/WPM.java +++ b/src/main/java/net/moonlightflower/wc3libs/bin/app/WPM.java @@ -137,7 +137,7 @@ public void read_0x0(@Nonnull Wc3BinInputStream stream) throws BinInputStream.St PathMap pathMap = getPathMap(); - pathMap.setBounds(new Bounds(new Size(width, height), new Coords2DI(0, 0)), false, false); + pathMap.setBounds(new Bounds(new Size(width, height)), false, false); int cellsCount = width * height; @@ -219,7 +219,7 @@ public WPM(@Nonnull Wc3BinInputStream stream) throws IOException { public WPM() { super(new Bounds(0, 0, 0, 0)); - _pathMap = new PathMap(new Bounds(new Size(0, 0), new Coords2DI(0, 0))); + _pathMap = new PathMap(new Bounds(new Size(0, 0))); } @Nonnull diff --git a/src/main/java/net/moonlightflower/wc3libs/dataTypes/app/Bounds.java b/src/main/java/net/moonlightflower/wc3libs/dataTypes/app/Bounds.java index 48b957da..7e66bae5 100644 --- a/src/main/java/net/moonlightflower/wc3libs/dataTypes/app/Bounds.java +++ b/src/main/java/net/moonlightflower/wc3libs/dataTypes/app/Bounds.java @@ -6,10 +6,10 @@ import javax.annotation.Nonnull; public class Bounds extends DataType { - private Coords2DI _center; + private Coords2DF _center; @Nonnull - public Coords2DI getCenter() { + public Coords2DF getCenter() { return _center; } @@ -21,19 +21,19 @@ public Size getSize() { } public int getMinX() { - return getCenter().getX() - getSize().getX() / 2; + return (int) (getCenter().getX().toFloat() - getSize().getX() / 2F); } public int getMinY() { - return getCenter().getY() - getSize().getY() / 2; + return (int) (getCenter().getY().toFloat() - getSize().getY() / 2F); } public int getMaxX() { - return getCenter().getX() + getSize().getX() / 2; + return (int) (getCenter().getX().toFloat() + getSize().getX() / 2F); } public int getMaxY() { - return getCenter().getY() + getSize().getY() / 2; + return (int) (getCenter().getY().toFloat() + getSize().getY() / 2F); } @Override @@ -59,13 +59,17 @@ public Bounds scale(double scale) { return new Bounds(_size.scale(scale), _center); } - public Bounds(Size size, Coords2DI center) { + public Bounds(@Nonnull Size size, @Nonnull Coords2DF center) { _center = center; _size = size; } - + + public Bounds(@Nonnull Size size) { + this(size, new Coords2DF(0F, 0F)); + } + public Bounds(int minX, int maxX, int minY, int maxY) { - this(new Size(maxX - minX, maxY - minY), new Coords2DI((maxX + minX) / 2, (maxY + minY) / 2)); + this(new Size(maxX - minX, maxY - minY), new Coords2DF((maxX + minX) / 2F, (maxY + minY) / 2F)); } public static Bounds valueOf(int minX, int maxX, int minY, int maxY) { diff --git a/src/main/java/net/moonlightflower/wc3libs/misc/Boundable.java b/src/main/java/net/moonlightflower/wc3libs/misc/Boundable.java index 9f1b03b7..81ca56fe 100644 --- a/src/main/java/net/moonlightflower/wc3libs/misc/Boundable.java +++ b/src/main/java/net/moonlightflower/wc3libs/misc/Boundable.java @@ -1,15 +1,16 @@ package net.moonlightflower.wc3libs.misc; +import net.moonlightflower.wc3libs.dataTypes.app.Coords2DF; import net.moonlightflower.wc3libs.dataTypes.app.Coords2DI; import javax.annotation.Nonnull; public interface Boundable { @Nonnull - Coords2DI getCenter(); - - int getCenterX(); - int getCenterY(); + Coords2DF getCenter(); + + float getCenterX(); + float getCenterY(); @Nonnull Size getSize(); diff --git a/src/main/java/net/moonlightflower/wc3libs/misc/PathMap.java b/src/main/java/net/moonlightflower/wc3libs/misc/PathMap.java index 5604ada3..f9c3461c 100644 --- a/src/main/java/net/moonlightflower/wc3libs/misc/PathMap.java +++ b/src/main/java/net/moonlightflower/wc3libs/misc/PathMap.java @@ -166,15 +166,15 @@ public void mergeCells(@Nonnull PathMap other) { } public void mergeCellsByPos(@Nonnull PathMap other, boolean additive) { - Coords2DI center = getCenter(); - Coords2DI otherCenter = other.getCenter(); + Coords2DF center = getCenter(); + Coords2DF otherCenter = other.getCenter(); Size size = getSize(); Size otherSize = other.getSize(); - int minX = (otherCenter.getX() - otherSize.getWidth() / 2) - (center.getX() - size.getWidth() / 2); + int minX = (int) ((otherCenter.getX().toFloat() - otherSize.getWidth() / 2) - (center.getX().toFloat() - size.getWidth() / 2)); int maxX = minX + otherSize.getWidth() - 1; - int minY = (otherCenter.getY() - otherSize.getHeight() / 2) - (center.getY() - size.getHeight() / 2); + int minY = (int) ((otherCenter.getY().toFloat() - otherSize.getHeight() / 2) - (center.getY().toFloat() - size.getHeight() / 2)); int maxY = minY + otherSize.getHeight() - 1; for (int y = minY; y <= maxY; y++) { diff --git a/src/main/java/net/moonlightflower/wc3libs/misc/Raster.java b/src/main/java/net/moonlightflower/wc3libs/misc/Raster.java index eaaed91c..5042bbdc 100644 --- a/src/main/java/net/moonlightflower/wc3libs/misc/Raster.java +++ b/src/main/java/net/moonlightflower/wc3libs/misc/Raster.java @@ -18,18 +18,18 @@ public Bounds getBounds() { @Nonnull @Override - public Coords2DI getCenter() { + public Coords2DF getCenter() { return _bounds.getCenter(); } @Override - public int getCenterX() { - return getCenter().getX(); + public float getCenterX() { + return getCenter().getX().toFloat(); } @Override - public int getCenterY() { - return getCenter().getY(); + public float getCenterY() { + return getCenter().getY().toFloat(); } @Nonnull @@ -96,11 +96,11 @@ public T get(int index) { return _cells[index]; } - private int coordsToIndex(Coords2DI pos) { + private int coordsToIndex(@Nonnull Coords2DI pos) { return (pos.getY() * getWidth() + pos.getX()); } - public T get(Coords2DI pos) { + public T get(@Nonnull Coords2DI pos) { return get(coordsToIndex(pos)); } @@ -108,13 +108,14 @@ public void set(int index, T val) { _cells[index] = val; } - public void set(Coords2DI pos, T val) { + public void set(@Nonnull Coords2DI pos, T val) { set(coordsToIndex(pos), val); } - + + @Nonnull public Coords2DI worldToLocalCoords(@Nonnull Coords2DF pos) { - int x = ((int) (pos.getX().toFloat() - getCenterX())) / getCellSize() + getWidth() / 2; - int y = ((int) (pos.getY().toFloat() - getCenterY())) / getCellSize() + getHeight() / 2; + int x = (int) ((pos.getX().toFloat() - getCenterX()) / getCellSize() + getWidth() / 2F); + int y = (int) ((pos.getY().toFloat() - getCenterY()) / getCellSize() + getHeight() / 2F); return new Coords2DI(x, y); } @@ -146,15 +147,15 @@ public void mergeCells(@Nonnull Raster other) { } public void mergeCellsByPos(@Nonnull Raster other, boolean... extra) { - Coords2DI center = getCenter(); - Coords2DI otherCenter = other.getCenter(); + Coords2DF center = getCenter(); + Coords2DF otherCenter = other.getCenter(); Size size = getSize(); Size otherSize = other.getSize(); - int minX = (otherCenter.getX() - otherSize.getWidth() / 2) - (center.getX() - size.getWidth() / 2); + int minX = (int) ((otherCenter.getX().toFloat() - otherSize.getWidth() / 2F) - (center.getX().toFloat() - size.getWidth() / 2F)); int maxX = minX + otherSize.getWidth() - 1; - int minY = (otherCenter.getY() - otherSize.getHeight() / 2) - (center.getY() - size.getHeight() / 2); + int minY = (int) ((otherCenter.getY().toFloat() - otherSize.getHeight() / 2F) - (center.getY().toFloat() - size.getHeight() / 2F)); int maxY = minY + otherSize.getHeight() - 1; for (int y = minY; y <= maxY; y++) { diff --git a/src/test/java/wc3libs/bin/app/W3ITest.java b/src/test/java/wc3libs/bin/app/W3ITest.java index 556e0e3a..2c1dc742 100644 --- a/src/test/java/wc3libs/bin/app/W3ITest.java +++ b/src/test/java/wc3libs/bin/app/W3ITest.java @@ -1,5 +1,6 @@ package wc3libs.bin.app; import net.moonlightflower.wc3libs.bin.app.W3I; +import net.moonlightflower.wc3libs.dataTypes.app.UnitId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; @@ -8,6 +9,7 @@ import wc3libs.misc.Wc3LibTest; import wc3libs.util.MurmurHash; +import javax.annotation.Nonnull; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -34,11 +36,16 @@ public void testRebuild() throws Exception { w3I.write(temp.toFile()); byte[] output = Files.readAllBytes(temp); + log.info("Reading copy"); + W3I w3I2 = new W3I(output); assertEqualsW3I(w3I, w3I2); Assert.assertEquals(MurmurHash.hash64(input, input.length), MurmurHash.hash64(output, output.length)); + + log.info("OK: " + p.getFileName()); + Files.delete(temp); } catch (Exception e) { log.error(e.getMessage(), e); @@ -64,7 +71,7 @@ private static void assertEqualsW3I(W3I w3I, W3I w3I2) { Assert.assertEquals(Arrays.toString(w3I2.getTechMods().toArray()), Arrays.toString(w3I.getTechMods().toArray())); Assert.assertEquals(Arrays.toString(w3I2.getForces().toArray()), Arrays.toString(w3I.getForces().toArray())); Assert.assertEquals(Arrays.toString(w3I2.getItemTables().toArray()), Arrays.toString(w3I.getItemTables().toArray())); - Assert.assertEquals(w3I2.getUnitTables(), w3I.getUnitTables()); + Assert.assertEquals(Arrays.toString(w3I2.getUnitTables().toArray()), Arrays.toString(w3I.getUnitTables().toArray())); Assert.assertEquals(w3I2.getPlayersRecommendedAmount(), w3I.getPlayersRecommendedAmount()); Assert.assertEquals(w3I2.getWorldBounds().toString(), w3I.getWorldBounds().toString()); Assert.assertEquals(w3I2.getCameraBounds1(), w3I.getCameraBounds1()); @@ -75,6 +82,43 @@ private static void assertEqualsW3I(W3I w3I, W3I w3I2) { Assert.assertEquals(w3I2.getGlobalWeatherId(), w3I.getGlobalWeatherId()); } + private static void assertEqualsItemTable(@Nonnull W3I.ItemTable a, @Nonnull W3I.ItemTable b) { + Assert.assertEquals(a.getIndex(), b.getIndex()); + Assert.assertEquals(a.getName(), b.getName()); + Assert.assertEquals(a.getSets().size(), b.getSets().size()); + for (int i = 0; i < a.getSets().size(); i++) { + assertEqualsItemTableSet(a.getSets().get(i), b.getSets().get(i)); + } + } + + private static void assertEqualsItemTableSet(@Nonnull W3I.ItemTable.Set a, @Nonnull W3I.ItemTable.Set b) { + Assert.assertEquals(a.getItems().size(), b.getItems().size()); + + for (int i = 0; i < a.getItems().size(); i++) { + assertEqualsItemTableSetItem(a.getItems().get(i), b.getItems().get(i)); + } + } + + private static void assertEqualsItemTableSetItem(@Nonnull W3I.ItemTable.Set.Item a, @Nonnull W3I.ItemTable.Set.Item b) { + Assert.assertEquals(a.getChance(), b.getChance()); + Assert.assertEquals(a.getTypeId(), b.getTypeId()); + } + + private static void assertEqualsUnitTable(@Nonnull W3I.UnitTable a, @Nonnull W3I.UnitTable b) { + Assert.assertEquals(a.getIndex(), b.getIndex()); + Assert.assertEquals(a.getName(), b.getName()); + // omitted positions + Assert.assertEquals(a.getSets().size(), b.getSets().size()); + for (int i = 0; i < a.getSets().size(); i++) { + assertEqualsUnitTableSet(a.getSets().get(i), b.getSets().get(i)); + } + } + + private static void assertEqualsUnitTableSet(@Nonnull W3I.UnitTable.Set a, @Nonnull W3I.UnitTable.Set b) { + Assert.assertEquals(a.getChance(), b.getChance()); + // omitted typeIds + } + @Test() public void readWriteCycle() throws IOException { readWriteCycle(W3I.class, getFile("wc3data/W3I/war3map.w3i")); diff --git a/src/test/resources/wc3data/Infos/war3map_1F.w3i b/src/test/resources/wc3data/Infos/war3map_1F.w3i new file mode 100644 index 00000000..8b6541d2 Binary files /dev/null and b/src/test/resources/wc3data/Infos/war3map_1F.w3i differ