mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2025-02-18 05:30:29 +00:00
adjusted huffman decode routine
This commit is contained in:
parent
f5664a9ce9
commit
7d4d8c75e6
@ -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 ();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
@ -21,14 +21,6 @@ class ItemV1 extends Item // implements Comparable<ItemV1>
|
||||
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<ItemV1>
|
||||
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
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------//
|
||||
|
@ -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<ItemV4> items, List<String> 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 ();
|
||||
}
|
||||
|
@ -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 ();
|
||||
}
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ public class Wizardry4BootDisk extends PascalDisk
|
||||
private List<CharacterParty> parties = new ArrayList<> ();
|
||||
private List<ItemV4> items = new ArrayList<> ();
|
||||
private List<MonsterV4> monsters = new ArrayList<> ();
|
||||
public List<String> 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<DiskAddress> 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);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------//
|
||||
|
Loading…
x
Reference in New Issue
Block a user