diff --git a/src/com/bytezone/diskbrowser/wizardry/Character.java b/src/com/bytezone/diskbrowser/wizardry/Character.java old mode 100755 new mode 100644 index 90a4379..1ba2e50 --- a/src/com/bytezone/diskbrowser/wizardry/Character.java +++ b/src/com/bytezone/diskbrowser/wizardry/Character.java @@ -1,25 +1,11 @@ package com.bytezone.diskbrowser.wizardry; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.bytezone.diskbrowser.applefile.AbstractFile; -import com.bytezone.diskbrowser.utilities.Utility; // -----------------------------------------------------------------------------------// -class Character extends AbstractFile +public abstract class Character extends AbstractFile // -----------------------------------------------------------------------------------// { - private static char[] awardsText = ">!$#&* spellBook = new ArrayList<> (); - private final List baggageList = new ArrayList<> (); - static String[] races = { "No race", "Human", "Elf", "Dwarf", "Gnome", "Hobbit" }; static String[] alignments = { "Unalign", "Good", "Neutral", "Evil" }; static String[] types = @@ -27,338 +13,12 @@ class Character extends AbstractFile static String[] statuses = { "OK", "Afraid", "Asleep", "Paralyze", "Stoned", "Dead", "Ashes", "Lost" }; + int scenario; + // ---------------------------------------------------------------------------------// - Character (String name, byte[] buffer, int scenario) + Character (String name, byte[] buffer) // ---------------------------------------------------------------------------------// { super (name, buffer); - - this.scenario = scenario; - - attributes = new Attributes (); - stats = new Statistics (); - - stats.race = races[buffer[34] & 0xFF]; - stats.typeInt = buffer[36] & 0xFF; - stats.type = types[stats.typeInt]; - stats.ageInWeeks = Utility.getShort (buffer, 38); - stats.statusValue = buffer[40]; - stats.status = statuses[stats.statusValue]; - stats.alignment = alignments[buffer[42] & 0xFF]; - - stats.gold = Utility.getShort (buffer, 52) + Utility.getShort (buffer, 54) * 10000 - + Utility.getShort (buffer, 56) * 100000000L; - stats.experience = Utility.getShort (buffer, 124) + Utility.getShort (buffer, 126) * 10000; - stats.level = Utility.getShort (buffer, 132); - - stats.hitsLeft = Utility.getShort (buffer, 134); - stats.hitsMax = Utility.getShort (buffer, 136); - - stats.armourClass = buffer[176]; - - attributes.strength = (buffer[44] & 0xFF) % 16; - if (attributes.strength < 3) - attributes.strength += 16; - attributes.array[0] = attributes.strength; - - int i1 = (buffer[44] & 0xFF) / 16; - int i2 = (buffer[45] & 0xFF) % 4; - attributes.intelligence = i1 / 2 + i2 * 8; - attributes.array[1] = attributes.intelligence; - - attributes.piety = (buffer[45] & 0xFF) / 4; - attributes.array[2] = attributes.piety; - - attributes.vitality = (buffer[46] & 0xFF) % 16; - if (attributes.vitality < 3) - attributes.vitality += 16; - attributes.array[3] = attributes.vitality; - - int a1 = (buffer[46] & 0xFF) / 16; - int a2 = (buffer[47] & 0xFF) % 4; - attributes.agility = a1 / 2 + a2 * 8; - attributes.array[4] = attributes.agility; - - attributes.luck = (buffer[47] & 0xFF) / 4; - attributes.array[5] = attributes.luck; } - - // ---------------------------------------------------------------------------------// - public void linkItems (List itemList) - // ---------------------------------------------------------------------------------// - { - boolean equipped; - boolean identified; - int totItems = buffer[58]; - stats.assetValue = 0; - - for (int ptr = 60; totItems > 0; ptr += 8, totItems--) - { - int itemID = buffer[ptr + 6] & 0xFF; - if (scenario == 3) - itemID = (itemID + 24) % 256; - if (itemID >= 0 && itemID < itemList.size ()) - { - Item item = itemList.get (itemID); - equipped = (buffer[ptr] == 1); - identified = (buffer[ptr + 4] == 1); - baggageList.add (new Baggage (item, equipped, identified)); - stats.assetValue += item.getCost (); - item.partyOwns++; - } - else - System.out.println ( - getName () + " ItemID : " + itemID + " is outside range 0:" + (itemList.size () - 1)); - } - } - - // ---------------------------------------------------------------------------------// - public void linkSpells (List spellList) - // ---------------------------------------------------------------------------------// - { - int index = 0; - for (int i = 138; i < 145; i++) - for (int bit = 0; bit < 8; bit++) - { - if (((buffer[i] >>> bit) & 0x01) != 0) - { - spellBook.add (spellList.get (index)); - System.out.println (spellList.get (index)); - } - - if (++index >= spellList.size ()) - break; - } - } - - // ---------------------------------------------------------------------------------// - @Override - public String getText () - // ---------------------------------------------------------------------------------// - { - StringBuilder text = new StringBuilder (); - - text.append ("Character name ..... " + getName ()); - text.append ("\n\nRace ............... " + stats.race); - text.append ("\nType ............... " + stats.type); - text.append ("\nAlignment .......... " + stats.alignment); - text.append ("\nStatus ............. " + stats.status); - // text.append ("\nType ............... " + stats.typeInt); - // text.append ("\nStatus ............. " + stats.statusValue); - text.append ("\nGold ............... " + String.format ("%,d", stats.gold)); - text.append ("\nExperience ......... " + String.format ("%,d", stats.experience)); - text.append ("\nNext level ......... " + String.format ("%,d", stats.nextLevel)); - text.append ("\nLevel .............. " + stats.level); - text.append ("\nAge in weeks ....... " - + String.format ("%,d (%d)", stats.ageInWeeks, (stats.ageInWeeks / 52))); - text.append ("\nHit points left .... " + stats.hitsLeft); - text.append ("\nMaximum hits ....... " + stats.hitsMax); - text.append ("\nArmour class ....... " + stats.armourClass); - text.append ("\nAsset value ........ " + String.format ("%,d", stats.assetValue)); - text.append ("\nAwards ............. " + getAwardString ()); - text.append ("\nOut ................ " + isOut ()); - text.append ("\n\nStrength ........... " + attributes.strength); - text.append ("\nIntelligence ....... " + attributes.intelligence); - text.append ("\nPiety .............. " + attributes.piety); - text.append ("\nVitality ........... " + attributes.vitality); - text.append ("\nAgility ............ " + attributes.agility); - text.append ("\nLuck ............... " + attributes.luck); - - int[] spellPoints = getMageSpellPoints (); - text.append ("\n\nMage spell points .."); - for (int i = 0; i < spellPoints.length; i++) - text.append (" " + spellPoints[i]); - - spellPoints = getPriestSpellPoints (); - text.append ("\nPriest spell points "); - for (int i = 0; i < spellPoints.length; i++) - text.append (" " + spellPoints[i]); - - text.append ("\n\nSpells :"); - for (Spell s : spellBook) - text.append ("\n" + s); - - text.append ("\n\nItems :"); - for (Baggage b : baggageList) - text.append ("\n" + b); - - return text.toString (); - } - - // ---------------------------------------------------------------------------------// - public void linkExperience (ExperienceLevel exp) - // ---------------------------------------------------------------------------------// - { - stats.nextLevel = exp.getExperiencePoints (stats.level); - } - - // ---------------------------------------------------------------------------------// - public int[] getMageSpellPoints () - // ---------------------------------------------------------------------------------// - { - int[] spells = new int[7]; - - for (int i = 0; i < 7; i++) - spells[i] = buffer[146 + i * 2]; - - return spells; - } - - // ---------------------------------------------------------------------------------// - public int[] getPriestSpellPoints () - // ---------------------------------------------------------------------------------// - { - int[] spells = new int[7]; - - for (int i = 0; i < 7; i++) - spells[i] = buffer[160 + i * 2]; - - return spells; - } - - // ---------------------------------------------------------------------------------// - public Long getNextLevel () - // ---------------------------------------------------------------------------------// - { - return stats.nextLevel; - } - - // ---------------------------------------------------------------------------------// - public String getAwardString () - // ---------------------------------------------------------------------------------// - { - StringBuilder text = new StringBuilder (); - - int awards = Utility.getShort (buffer, 206); - - for (int i = 0; i < 16; i++) - { - if ((awards & 0x01) != 0) - text.append (awardsText[i]); - awards >>>= 1; - } - - return text.toString (); - } - - // ---------------------------------------------------------------------------------// - public boolean isOut () - // ---------------------------------------------------------------------------------// - { - return (buffer[32] == 1); - } - - // ---------------------------------------------------------------------------------// - public String getType () - // ---------------------------------------------------------------------------------// - { - return stats.type; - } - - // ---------------------------------------------------------------------------------// - public String getRace () - // ---------------------------------------------------------------------------------// - { - return stats.race; - } - - // ---------------------------------------------------------------------------------// - public String getAlignment () - // ---------------------------------------------------------------------------------// - { - return stats.alignment; - } - - // ---------------------------------------------------------------------------------// - public Attributes getAttributes () - // ---------------------------------------------------------------------------------// - { - return attributes; - } - - // ---------------------------------------------------------------------------------// - public Statistics getStatistics () - // ---------------------------------------------------------------------------------// - { - return stats; - } - - // ---------------------------------------------------------------------------------// - public Iterator getBaggage () - // ---------------------------------------------------------------------------------// - { - return baggageList.iterator (); - } - - // ---------------------------------------------------------------------------------// - public Iterator getSpells () - // ---------------------------------------------------------------------------------// - { - return spellBook.iterator (); - } - - // ---------------------------------------------------------------------------------// - @Override - public String toString () - // ---------------------------------------------------------------------------------// - { - return getName (); - } - - // ---------------------------------------------------------------------------------// - public class Baggage - // ---------------------------------------------------------------------------------// - { - public Item item; - public boolean equipped; - public boolean identified; - - public Baggage (Item item, boolean equipped, boolean identified) - { - this.item = item; - this.equipped = equipped; - this.identified = identified; - } - - @Override - public String toString () - { - return String.format ("%s%-15s %,10d", equipped ? "*" : " ", item.getName (), - item.getCost ()); - } - } - - // ---------------------------------------------------------------------------------// - public class Statistics implements Cloneable - // ---------------------------------------------------------------------------------// - { - public String race; - public String type; - public String alignment; - public String status; - public int typeInt; - public int statusValue; - public long gold; - public int experience; - public long nextLevel; - public int level; - public int ageInWeeks; - public int hitsLeft; - public int hitsMax; - public int armourClass; - public int assetValue; - } - - // ---------------------------------------------------------------------------------// - public class Attributes - // ---------------------------------------------------------------------------------// - { - public int strength; - public int intelligence; - public int piety; - public int vitality; - public int agility; - public int luck; - public int[] array = new int[6]; - } -} \ No newline at end of file +} diff --git a/src/com/bytezone/diskbrowser/wizardry/CharacterV1.java b/src/com/bytezone/diskbrowser/wizardry/CharacterV1.java new file mode 100755 index 0000000..432a60f --- /dev/null +++ b/src/com/bytezone/diskbrowser/wizardry/CharacterV1.java @@ -0,0 +1,355 @@ +package com.bytezone.diskbrowser.wizardry; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import com.bytezone.diskbrowser.utilities.Utility; + +// -----------------------------------------------------------------------------------// +class CharacterV1 extends Character +// -----------------------------------------------------------------------------------// +{ + private static char[] awardsText = ">!$#&* spellBook = new ArrayList<> (); + private final List baggageList = new ArrayList<> (); + + // ---------------------------------------------------------------------------------// + CharacterV1 (String name, byte[] buffer, int scenario) + // ---------------------------------------------------------------------------------// + { + super (name, buffer); + + this.scenario = scenario; + + attributes = new Attributes (); + stats = new Statistics (); + + stats.race = races[buffer[34] & 0xFF]; + stats.typeInt = buffer[36] & 0xFF; + stats.type = types[stats.typeInt]; + stats.ageInWeeks = Utility.getShort (buffer, 38); + stats.statusValue = buffer[40]; + stats.status = statuses[stats.statusValue]; + stats.alignment = alignments[buffer[42] & 0xFF]; + + stats.gold = Utility.getShort (buffer, 52) + Utility.getShort (buffer, 54) * 10000 + + Utility.getShort (buffer, 56) * 100000000L; + stats.experience = Utility.getShort (buffer, 124) + Utility.getShort (buffer, 126) * 10000; + stats.level = Utility.getShort (buffer, 132); + + stats.hitsLeft = Utility.getShort (buffer, 134); + stats.hitsMax = Utility.getShort (buffer, 136); + + stats.armourClass = buffer[176]; + + attributes.strength = (buffer[44] & 0xFF) % 16; + if (attributes.strength < 3) + attributes.strength += 16; + attributes.array[0] = attributes.strength; + + int i1 = (buffer[44] & 0xFF) / 16; + int i2 = (buffer[45] & 0xFF) % 4; + attributes.intelligence = i1 / 2 + i2 * 8; + attributes.array[1] = attributes.intelligence; + + attributes.piety = (buffer[45] & 0xFF) / 4; + attributes.array[2] = attributes.piety; + + attributes.vitality = (buffer[46] & 0xFF) % 16; + if (attributes.vitality < 3) + attributes.vitality += 16; + attributes.array[3] = attributes.vitality; + + int a1 = (buffer[46] & 0xFF) / 16; + int a2 = (buffer[47] & 0xFF) % 4; + attributes.agility = a1 / 2 + a2 * 8; + attributes.array[4] = attributes.agility; + + attributes.luck = (buffer[47] & 0xFF) / 4; + attributes.array[5] = attributes.luck; + } + + // ---------------------------------------------------------------------------------// + public void linkItems (List itemList) + // ---------------------------------------------------------------------------------// + { + boolean equipped; + boolean identified; + int totItems = buffer[58]; + stats.assetValue = 0; + + for (int ptr = 60; totItems > 0; ptr += 8, totItems--) + { + int itemID = buffer[ptr + 6] & 0xFF; + if (scenario == 3) + itemID = (itemID + 24) % 256; + if (itemID >= 0 && itemID < itemList.size ()) + { + Item item = itemList.get (itemID); + equipped = (buffer[ptr] == 1); + identified = (buffer[ptr + 4] == 1); + baggageList.add (new Baggage (item, equipped, identified)); + stats.assetValue += item.getCost (); + item.partyOwns++; + } + else + System.out.println ( + getName () + " ItemID : " + itemID + " is outside range 0:" + (itemList.size () - 1)); + } + } + + // ---------------------------------------------------------------------------------// + public void linkSpells (List spellList) + // ---------------------------------------------------------------------------------// + { + int index = 0; + for (int i = 138; i < 145; i++) + for (int bit = 0; bit < 8; bit++) + { + if (((buffer[i] >>> bit) & 0x01) != 0) + { + spellBook.add (spellList.get (index)); + // System.out.println (spellList.get (index)); + } + + if (++index >= spellList.size ()) + break; + } + } + + // ---------------------------------------------------------------------------------// + @Override + public String getText () + // ---------------------------------------------------------------------------------// + { + StringBuilder text = new StringBuilder (); + + text.append ("Character name ..... " + getName ()); + text.append ("\n\nRace ............... " + stats.race); + text.append ("\nType ............... " + stats.type); + text.append ("\nAlignment .......... " + stats.alignment); + text.append ("\nStatus ............. " + stats.status); + // text.append ("\nType ............... " + stats.typeInt); + // text.append ("\nStatus ............. " + stats.statusValue); + text.append ("\nGold ............... " + String.format ("%,d", stats.gold)); + text.append ("\nExperience ......... " + String.format ("%,d", stats.experience)); + text.append ("\nNext level ......... " + String.format ("%,d", stats.nextLevel)); + text.append ("\nLevel .............. " + stats.level); + text.append ("\nAge in weeks ....... " + + String.format ("%,d (%d)", stats.ageInWeeks, (stats.ageInWeeks / 52))); + text.append ("\nHit points left .... " + stats.hitsLeft); + text.append ("\nMaximum hits ....... " + stats.hitsMax); + text.append ("\nArmour class ....... " + stats.armourClass); + text.append ("\nAsset value ........ " + String.format ("%,d", stats.assetValue)); + text.append ("\nAwards ............. " + getAwardString ()); + text.append ("\nOut ................ " + isOut ()); + text.append ("\n\nStrength ........... " + attributes.strength); + text.append ("\nIntelligence ....... " + attributes.intelligence); + text.append ("\nPiety .............. " + attributes.piety); + text.append ("\nVitality ........... " + attributes.vitality); + text.append ("\nAgility ............ " + attributes.agility); + text.append ("\nLuck ............... " + attributes.luck); + + int[] spellPoints = getMageSpellPoints (); + text.append ("\n\nMage spell points .."); + for (int i = 0; i < spellPoints.length; i++) + text.append (" " + spellPoints[i]); + + spellPoints = getPriestSpellPoints (); + text.append ("\nPriest spell points "); + for (int i = 0; i < spellPoints.length; i++) + text.append (" " + spellPoints[i]); + + text.append ("\n\nSpells :"); + for (Spell s : spellBook) + text.append ("\n" + s); + + text.append ("\n\nItems :"); + for (Baggage b : baggageList) + text.append ("\n" + b); + + return text.toString (); + } + + // ---------------------------------------------------------------------------------// + public void linkExperience (ExperienceLevel exp) + // ---------------------------------------------------------------------------------// + { + stats.nextLevel = exp.getExperiencePoints (stats.level); + } + + // ---------------------------------------------------------------------------------// + public int[] getMageSpellPoints () + // ---------------------------------------------------------------------------------// + { + int[] spells = new int[7]; + + for (int i = 0; i < 7; i++) + spells[i] = buffer[146 + i * 2]; + + return spells; + } + + // ---------------------------------------------------------------------------------// + public int[] getPriestSpellPoints () + // ---------------------------------------------------------------------------------// + { + int[] spells = new int[7]; + + for (int i = 0; i < 7; i++) + spells[i] = buffer[160 + i * 2]; + + return spells; + } + + // ---------------------------------------------------------------------------------// + public Long getNextLevel () + // ---------------------------------------------------------------------------------// + { + return stats.nextLevel; + } + + // ---------------------------------------------------------------------------------// + public String getAwardString () + // ---------------------------------------------------------------------------------// + { + StringBuilder text = new StringBuilder (); + + int awards = Utility.getShort (buffer, 206); + + for (int i = 0; i < 16; i++) + { + if ((awards & 0x01) != 0) + text.append (awardsText[i]); + awards >>>= 1; + } + + return text.toString (); + } + + // ---------------------------------------------------------------------------------// + public boolean isOut () + // ---------------------------------------------------------------------------------// + { + return (buffer[32] == 1); + } + + // ---------------------------------------------------------------------------------// + public String getType () + // ---------------------------------------------------------------------------------// + { + return stats.type; + } + + // ---------------------------------------------------------------------------------// + public String getRace () + // ---------------------------------------------------------------------------------// + { + return stats.race; + } + + // ---------------------------------------------------------------------------------// + public String getAlignment () + // ---------------------------------------------------------------------------------// + { + return stats.alignment; + } + + // ---------------------------------------------------------------------------------// + public Attributes getAttributes () + // ---------------------------------------------------------------------------------// + { + return attributes; + } + + // ---------------------------------------------------------------------------------// + public Statistics getStatistics () + // ---------------------------------------------------------------------------------// + { + return stats; + } + + // ---------------------------------------------------------------------------------// + public Iterator getBaggage () + // ---------------------------------------------------------------------------------// + { + return baggageList.iterator (); + } + + // ---------------------------------------------------------------------------------// + public Iterator getSpells () + // ---------------------------------------------------------------------------------// + { + return spellBook.iterator (); + } + + // ---------------------------------------------------------------------------------// + @Override + public String toString () + // ---------------------------------------------------------------------------------// + { + return getName (); + } + + // ---------------------------------------------------------------------------------// + public class Baggage + // ---------------------------------------------------------------------------------// + { + public Item item; + public boolean equipped; + public boolean identified; + + public Baggage (Item item, boolean equipped, boolean identified) + { + this.item = item; + this.equipped = equipped; + this.identified = identified; + } + + @Override + public String toString () + { + return String.format ("%s%-15s %,10d", equipped ? "*" : " ", item.getName (), + item.getCost ()); + } + } + + // ---------------------------------------------------------------------------------// + public class Statistics implements Cloneable + // ---------------------------------------------------------------------------------// + { + public String race; + public String type; + public String alignment; + public String status; + public int typeInt; + public int statusValue; + public long gold; + public int experience; + public long nextLevel; + public int level; + public int ageInWeeks; + public int hitsLeft; + public int hitsMax; + public int armourClass; + public int assetValue; + } + + // ---------------------------------------------------------------------------------// + public class Attributes + // ---------------------------------------------------------------------------------// + { + public int strength; + public int intelligence; + public int piety; + public int vitality; + public int agility; + public int luck; + public int[] array = new int[6]; + } +} \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/wizardry/CharacterV4.java b/src/com/bytezone/diskbrowser/wizardry/CharacterV4.java index 1f382f4..9edec24 100644 --- a/src/com/bytezone/diskbrowser/wizardry/CharacterV4.java +++ b/src/com/bytezone/diskbrowser/wizardry/CharacterV4.java @@ -3,12 +3,11 @@ package com.bytezone.diskbrowser.wizardry; import java.util.ArrayList; import java.util.List; -import com.bytezone.diskbrowser.applefile.AbstractFile; import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.Utility; // -----------------------------------------------------------------------------------// -public class CharacterV4 extends AbstractFile +public class CharacterV4 extends Character // -----------------------------------------------------------------------------------// { private static int MAX_POSSESSIONS = 8; @@ -98,6 +97,7 @@ public class CharacterV4 extends AbstractFile super (name, buffer); this.id = id; + scenario = 4; inMaze = Utility.getShort (buffer, 33) != 0; race = Race.values ()[Utility.getShort (buffer, 35)]; diff --git a/src/com/bytezone/diskbrowser/wizardry/WizardryScenarioDisk.java b/src/com/bytezone/diskbrowser/wizardry/WizardryScenarioDisk.java index e04ce0f..351665e 100755 --- a/src/com/bytezone/diskbrowser/wizardry/WizardryScenarioDisk.java +++ b/src/com/bytezone/diskbrowser/wizardry/WizardryScenarioDisk.java @@ -18,8 +18,8 @@ import com.bytezone.diskbrowser.gui.DataSource; import com.bytezone.diskbrowser.pascal.PascalDisk; import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.Utility; -import com.bytezone.diskbrowser.wizardry.Character.Attributes; -import com.bytezone.diskbrowser.wizardry.Character.Statistics; +import com.bytezone.diskbrowser.wizardry.CharacterV1.Attributes; +import com.bytezone.diskbrowser.wizardry.CharacterV1.Statistics; import com.bytezone.diskbrowser.wizardry.Header.ScenarioData; import com.bytezone.diskbrowser.wizardry.Spell.SpellType; @@ -31,7 +31,7 @@ public class WizardryScenarioDisk extends PascalDisk public List images; public List items; - public List characters; + public List characters; public List spells; public List messages; public List monsters; @@ -111,7 +111,7 @@ public class WizardryScenarioDisk extends PascalDisk // makeNodeVisible (node); // add information about each characters' baggage, spells known etc. - for (Character c : characters) + for (CharacterV1 c : characters) { c.linkItems (items); c.linkSpells (spells); @@ -252,7 +252,7 @@ public class WizardryScenarioDisk extends PascalDisk + "HP St In Pi Vi Ag Lu Status\n"); text.append ("------------- ---- -------- -------- ---------- " + "-- -- -- -- -- -- -- ------\n"); - for (Character ch : characters) + for (CharacterV1 ch : characters) { Statistics stats = ch.getStatistics (); Attributes att = ch.getAttributes (); @@ -287,7 +287,7 @@ public class WizardryScenarioDisk extends PascalDisk byte[] data2 = new byte[recLen]; System.arraycopy (buffer, ptr, data2, 0, recLen); - Character c = new Character (name, data2, scenarioHeader.scenarioID); + CharacterV1 c = new CharacterV1 (name, data2, scenarioHeader.scenarioID); characters.add (c); addToNode (c, node, blocks, characterSector); }