diff --git a/src/com/bytezone/diskbrowser/wizardry/CharacterV4.java b/src/com/bytezone/diskbrowser/wizardry/CharacterV4.java index e52922c..8772582 100644 --- a/src/com/bytezone/diskbrowser/wizardry/CharacterV4.java +++ b/src/com/bytezone/diskbrowser/wizardry/CharacterV4.java @@ -266,12 +266,13 @@ public class CharacterV4 extends Character if (!party.slogan.isEmpty () || party.characters.size () > 1) { - text.append ("\n"); + for (int i = possessionsCount; i < 9; i++) + text.append ("\n"); text.append (party); } - text.append ("\n\n"); - text.append (HexFormatter.format (buffer, 1, buffer[0] & 0xFF)); + // text.append ("\n\n"); + // text.append (HexFormatter.format (buffer, 1, buffer[0] & 0xFF)); return text.toString (); } diff --git a/src/com/bytezone/diskbrowser/wizardry/Huffman.java b/src/com/bytezone/diskbrowser/wizardry/Huffman.java index c8005a3..0b6a7de 100644 --- a/src/com/bytezone/diskbrowser/wizardry/Huffman.java +++ b/src/com/bytezone/diskbrowser/wizardry/Huffman.java @@ -32,7 +32,7 @@ class Huffman extends AbstractFile } // ---------------------------------------------------------------------------------// - byte[] decodeMessage (byte[] buffer, int offset, int length) + byte[] decodeMessageOld (byte[] buffer, int offset, int length) // ---------------------------------------------------------------------------------// { this.message = buffer; @@ -54,6 +54,27 @@ class Huffman extends AbstractFile return returnBuffer; } + // ---------------------------------------------------------------------------------// + byte[] decodeMessage (byte[] buffer, int offset) + // ---------------------------------------------------------------------------------// + { + this.message = buffer; + + depth = 0; + msgPtr = offset; + currentByte = 0; + + int size = (getChar () & 0xFF) + 1; + byte[] returnBuffer = new byte[size]; + returnBuffer[0] = (byte) size; + int ptr = 1; + + while (ptr < size) + returnBuffer[ptr++] = getChar (); + + return returnBuffer; + } + // ---------------------------------------------------------------------------------// String decodeMessage (byte[] message) // ---------------------------------------------------------------------------------// @@ -93,7 +114,7 @@ class Huffman extends AbstractFile currentByte = message[msgPtr++]; // ...get a new byte int currentBit = currentByte & 0x01; // extract the next bit to process - currentByte >>= 1; // and remove it from the current byte + currentByte >>>= 1; // and remove it from the current byte // use currentBit to determine whether to use the left or right node byte nodeValue = buffer[treePtr + offset[currentBit]]; @@ -118,6 +139,7 @@ class Huffman extends AbstractFile walk (0, "", text); bufferContents = text.toString (); } + return bufferContents; } diff --git a/src/com/bytezone/diskbrowser/wizardry/Item.java b/src/com/bytezone/diskbrowser/wizardry/Item.java index b2ceb82..66765bd 100644 --- a/src/com/bytezone/diskbrowser/wizardry/Item.java +++ b/src/com/bytezone/diskbrowser/wizardry/Item.java @@ -21,9 +21,9 @@ public class Item extends AbstractFile int spellPwr; int classUseFlags; int healPts; - int wepvstyFlags; - int wepvsty2Flags; - int wepvsty3Flags; + int flags1; + int flags2; + int flags3; int wephitmd; boolean crithitm; @@ -32,6 +32,7 @@ public class Item extends AbstractFile Item changeToItem; Spell spell; + String spellName; public enum Alignment { @@ -80,13 +81,15 @@ public class Item extends AbstractFile text.append (String.format ("Boltac ........... %d%n", boltac)); String spellName = spell == null ? "" : spell.getName (); + if (this.spellName != null) + spellName = this.spellName; text.append (String.format ("Spell ............ %s%n", spellName)); text.append (String.format ("Heal ............. %d%n", healPts)); text.append (String.format ("Class use ........ %d%n", classUseFlags)); - text.append (String.format ("Flags ............ %d%n", wepvstyFlags)); - text.append (String.format ("Flags2 ........... %d%n", wepvsty2Flags)); - text.append (String.format ("Flags3 ........... %d%n", wepvsty3Flags)); + text.append (String.format ("Flags ............ %d%n", flags1)); + text.append (String.format ("Flags2 ........... %d%n", flags2)); + text.append (String.format ("Flags3 ........... %d%n", flags3)); return text.toString (); } diff --git a/src/com/bytezone/diskbrowser/wizardry/ItemV1.java b/src/com/bytezone/diskbrowser/wizardry/ItemV1.java index cba9412..5fde3e0 100755 --- a/src/com/bytezone/diskbrowser/wizardry/ItemV1.java +++ b/src/com/bytezone/diskbrowser/wizardry/ItemV1.java @@ -21,14 +21,6 @@ class ItemV1 extends Item // implements Comparable itemId = counter++; genericName = HexFormatter.getPascalString (buffer, 16); - // type = buffer[32]; - // cost = getWizLong (buffer, 44); - // cost = Utility.getShort (buffer, 44) + Utility.getShort (buffer, 46) * 10000 - // + Utility.getShort (buffer, 48) * 100000000L; - // armourClass = buffer[62]; - // wephpdam = new Dice (buffer, 66); - // xtraSwing = buffer[72]; // 14 flags - type = ObjectType.values ()[buffer[32]]; alignment = Alignment.values ()[buffer[34]]; cursed = Utility.signedShort (buffer, 36) == -1; @@ -41,14 +33,14 @@ class ItemV1 extends Item // implements Comparable classUseFlags = Utility.getShort (buffer, 54); // 8 flags healPts = Utility.signedShort (buffer, 56); - wepvsty2Flags = Utility.getShort (buffer, 58); // 16 flags - wepvsty3Flags = Utility.getShort (buffer, 60); // 16 flags + flags2 = Utility.getShort (buffer, 58); // 16 flags + flags3 = Utility.getShort (buffer, 60); // 16 flags armourClass = Utility.signedShort (buffer, 62); wephitmd = Utility.signedShort (buffer, 64); wephpdam = new Dice (buffer, 66); // Dice xtraSwing = Utility.getShort (buffer, 72); crithitm = Utility.getShort (buffer, 74) == 1; // boolean - wepvstyFlags = Utility.getShort (buffer, 76); // 14 flags + flags1 = Utility.getShort (buffer, 76); // 14 flags } // ---------------------------------------------------------------------------------// diff --git a/src/com/bytezone/diskbrowser/wizardry/ItemV4.java b/src/com/bytezone/diskbrowser/wizardry/ItemV4.java index 991e950..74e7864 100644 --- a/src/com/bytezone/diskbrowser/wizardry/ItemV4.java +++ b/src/com/bytezone/diskbrowser/wizardry/ItemV4.java @@ -1,6 +1,8 @@ package com.bytezone.diskbrowser.wizardry; -import com.bytezone.diskbrowser.utilities.HexFormatter; +import java.util.List; + +import com.bytezone.diskbrowser.utilities.Utility; // -----------------------------------------------------------------------------------// public class ItemV4 extends Item @@ -17,8 +19,38 @@ public class ItemV4 extends Item name = names[1]; genericName = names[0]; + type = ObjectType.values ()[buffer[1]]; + alignment = Alignment.values ()[buffer[3]]; + cursed = Utility.signedShort (buffer, 5) == -1; + special = Utility.signedShort (buffer, 7); + changeTo = Utility.getShort (buffer, 9); // decay # + changeChance = Utility.getShort (buffer, 11); price = getWizLong (buffer, 13); + boltac = Utility.signedShort (buffer, 19); + spellPwr = Utility.getShort (buffer, 21); + classUseFlags = Utility.getShort (buffer, 23); // 8 flags + + healPts = Utility.signedShort (buffer, 25); + flags2 = Utility.getShort (buffer, 27); // 16 flags + flags3 = Utility.getShort (buffer, 29); // 16 flags + armourClass = Utility.signedShort (buffer, 31); + wephitmd = Utility.signedShort (buffer, 33); wephpdam = new Dice (buffer, 35); + + xtraSwing = Utility.getShort (buffer, 41); + crithitm = Utility.getShort (buffer, 43) == 1; // boolean + flags1 = Utility.getShort (buffer, 45); // 14 flags + } + + // ---------------------------------------------------------------------------------// + void link (List items, List spellNames) + // ---------------------------------------------------------------------------------// + { + if (changeChance > 0) + changeToItem = items.get (changeTo); + + if (spellPwr > 0) + spellName = spellNames.get (spellPwr); } // ---------------------------------------------------------------------------------// @@ -28,8 +60,8 @@ public class ItemV4 extends Item { StringBuilder text = new StringBuilder (super.getText ()); - text.append ("\n\n"); - text.append (HexFormatter.format (buffer)); + // text.append ("\n\n"); + // text.append (HexFormatter.format (buffer)); return text.toString (); } diff --git a/src/com/bytezone/diskbrowser/wizardry/MonsterV4.java b/src/com/bytezone/diskbrowser/wizardry/MonsterV4.java index 8829fdc..2c4379f 100644 --- a/src/com/bytezone/diskbrowser/wizardry/MonsterV4.java +++ b/src/com/bytezone/diskbrowser/wizardry/MonsterV4.java @@ -1,6 +1,5 @@ package com.bytezone.diskbrowser.wizardry; -import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.Utility; // -----------------------------------------------------------------------------------// @@ -42,18 +41,4 @@ public class MonsterV4 extends Monster resistance = Utility.getShort (buffer, 73); // bit flags abilities = Utility.getShort (buffer, 75); // bit flags } - - // ---------------------------------------------------------------------------------// - @Override - public String getText () - // ---------------------------------------------------------------------------------// - { - StringBuilder text = new StringBuilder (super.getText ()); - - text.append ("\n\n"); - // text.append (HexFormatter.format (buffer, 1, buffer[0] & 0xFF)); - text.append (HexFormatter.format (buffer)); - - return text.toString (); - } } diff --git a/src/com/bytezone/diskbrowser/wizardry/Wizardry4BootDisk.java b/src/com/bytezone/diskbrowser/wizardry/Wizardry4BootDisk.java index ccfe466..43c4a6a 100644 --- a/src/com/bytezone/diskbrowser/wizardry/Wizardry4BootDisk.java +++ b/src/com/bytezone/diskbrowser/wizardry/Wizardry4BootDisk.java @@ -31,6 +31,7 @@ public class Wizardry4BootDisk extends PascalDisk private List parties = new ArrayList<> (); private List items = new ArrayList<> (); private List monsters = new ArrayList<> (); + public List spellNames = new ArrayList<> (); // ---------------------------------------------------------------------------------// public Wizardry4BootDisk (AppleDisk[] dataDisks) @@ -98,6 +99,7 @@ public class Wizardry4BootDisk extends PascalDisk fileEntry.setFile (null); scenarioNode.setAllowsChildren (true); scenarioHeader = new Header (scenarioNode, this); + readSpells (); linkCharacters4 (scenarioNode, fileEntry); linkParties (); linkMazeLevels4 (scenarioNode, fileEntry); @@ -161,7 +163,7 @@ public class Wizardry4BootDisk extends PascalDisk for (int i = 0; i < 500; i++) { - byte[] out = huffman.decodeMessage (buffer, ptr, sd.totalBlocks); + byte[] out = huffman.decodeMessage (buffer, ptr); String name = HexFormatter.getPascalString (out, 1); @@ -201,6 +203,19 @@ public class Wizardry4BootDisk extends PascalDisk } } + // ---------------------------------------------------------------------------------// + private void readSpells () + // ---------------------------------------------------------------------------------// + { + for (int i = 0; i < 51; i++) + { + String spellName = messageBlock.getMessageLine (i + 5000); + if (spellName.startsWith ("*")) + spellName = spellName.substring (1); + spellNames.add (spellName); + } + } + // ---------------------------------------------------------------------------------// private void link (CharacterV4 character, CharacterParty party) // ---------------------------------------------------------------------------------// @@ -232,7 +247,7 @@ public class Wizardry4BootDisk extends PascalDisk for (int i = 0; i < sd.total; i++) { - byte[] out = huffman.decodeMessage (buffer, ptr, sd.totalBlocks); + byte[] out = huffman.decodeMessage (buffer, ptr); int len = out[0] & 0xFF; if (len > out.length) System.out.printf ("Decoded array too short: (#%3d) %3d > %3d%n", i, len, out.length); @@ -242,6 +257,7 @@ public class Wizardry4BootDisk extends PascalDisk MonsterV4 monster = new MonsterV4 (monsterNames, out, i); monsters.add (monster); + // System.out.println (monster.getName ()); List monsterBlocks = new ArrayList<> (); DiskAddress da = blocks.get (ptr / 512); @@ -276,13 +292,13 @@ public class Wizardry4BootDisk extends PascalDisk for (int i = 0; i < sd.total; i++) { - byte[] out = huffman.decodeMessage (buffer, ptr, sd.totalBlocks); + byte[] out = huffman.decodeMessage (buffer, ptr); for (int j = 0; j < itemNames.length; j++) { itemNames[j] = messageBlock.getMessageLine (i * 2 + 14000 + j); if (itemNames[j] == null) - itemNames[j] = "Not found"; + itemNames[j] = "Broken Item"; } ItemV4 item = new ItemV4 (itemNames, out, i); @@ -305,8 +321,11 @@ public class Wizardry4BootDisk extends PascalDisk for (CharacterV4 character : characters) character.addPossessions (items); - // for (ItemV4 item : items) - // item.link (items, spells); + // for (int i = 0; i < items.size (); i++) + // System.out.printf ("%3d %s%n", i, items.get (i)); + + for (ItemV4 item : items) + item.link (items, spellNames); } // ---------------------------------------------------------------------------------//