use stored experience points
This commit is contained in:
parent
ff7c6fd126
commit
3435e825df
Binary file not shown.
After Width: | Height: | Size: 378 KiB |
|
@ -6,11 +6,14 @@ import java.util.List;
|
||||||
|
|
||||||
import com.bytezone.diskbrowser.applefile.AbstractFile;
|
import com.bytezone.diskbrowser.applefile.AbstractFile;
|
||||||
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
||||||
|
import com.bytezone.diskbrowser.utilities.Utility;
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------//
|
// -----------------------------------------------------------------------------------//
|
||||||
class Monster extends AbstractFile
|
class Monster extends AbstractFile
|
||||||
// -----------------------------------------------------------------------------------//
|
// -----------------------------------------------------------------------------------//
|
||||||
{
|
{
|
||||||
|
int scenarioId;
|
||||||
|
|
||||||
public final String genericName;
|
public final String genericName;
|
||||||
public final String realName;
|
public final String realName;
|
||||||
public final int monsterID;
|
public final int monsterID;
|
||||||
|
@ -19,10 +22,8 @@ class Monster extends AbstractFile
|
||||||
Reward goldReward;
|
Reward goldReward;
|
||||||
Reward chestReward;
|
Reward chestReward;
|
||||||
|
|
||||||
public final int type;
|
final int type;
|
||||||
public final int imageID;
|
final int imageID;
|
||||||
int rewardTable1;
|
|
||||||
int rewardTable2;
|
|
||||||
|
|
||||||
public final int partnerID;
|
public final int partnerID;
|
||||||
public final int partnerOdds;
|
public final int partnerOdds;
|
||||||
|
@ -31,6 +32,7 @@ class Monster extends AbstractFile
|
||||||
public final int mageSpellLevel;
|
public final int mageSpellLevel;
|
||||||
public final int priestSpellLevel;
|
public final int priestSpellLevel;
|
||||||
|
|
||||||
|
int experiencePoints;
|
||||||
int levelDrain;
|
int levelDrain;
|
||||||
int healPts;
|
int healPts;
|
||||||
int breathe;
|
int breathe;
|
||||||
|
@ -38,6 +40,7 @@ class Monster extends AbstractFile
|
||||||
int unique;
|
int unique;
|
||||||
int resistance;
|
int resistance;
|
||||||
int abilities;
|
int abilities;
|
||||||
|
|
||||||
public final Dice groupSize, hitPoints;
|
public final Dice groupSize, hitPoints;
|
||||||
List<Dice> damage = new ArrayList<> ();
|
List<Dice> damage = new ArrayList<> ();
|
||||||
|
|
||||||
|
@ -46,6 +49,7 @@ class Monster extends AbstractFile
|
||||||
public static String[] monsterClass = { "Fighter", "Mage", "Priest", "Thief", "Midget", "Giant",
|
public static String[] monsterClass = { "Fighter", "Mage", "Priest", "Thief", "Midget", "Giant",
|
||||||
"Mythical", "Dragon", "Animal", "Were", "Undead", "Demon", "Insect", "Enchanted" };
|
"Mythical", "Dragon", "Animal", "Were", "Undead", "Demon", "Insect", "Enchanted" };
|
||||||
|
|
||||||
|
// Scenario #1 values
|
||||||
private static int[] experience = { //
|
private static int[] experience = { //
|
||||||
55, 235, 415, 230, 380, 620, 840, 520, 550, 350, // 00-09
|
55, 235, 415, 230, 380, 620, 840, 520, 550, 350, // 00-09
|
||||||
475, 515, 920, 600, 735, 520, 795, 780, 990, 795, // 10-19
|
475, 515, 920, 600, 735, 520, 795, 780, 990, 795, // 10-19
|
||||||
|
@ -61,21 +65,18 @@ class Monster extends AbstractFile
|
||||||
};
|
};
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
Monster (String name, byte[] buffer, List<Reward> rewards, List<Monster> monsters)
|
Monster (String name, byte[] buffer, List<Reward> rewards, List<Monster> monsters, int scenarioId)
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
{
|
{
|
||||||
super (name, buffer);
|
super (name, buffer);
|
||||||
|
|
||||||
|
this.scenarioId = scenarioId;
|
||||||
|
|
||||||
realName = name;
|
realName = name;
|
||||||
genericName = HexFormatter.getPascalString (buffer, 0);
|
genericName = HexFormatter.getPascalString (buffer, 0);
|
||||||
this.monsterID = counter++;
|
this.monsterID = counter++;
|
||||||
this.monsters = monsters;
|
this.monsters = monsters;
|
||||||
|
|
||||||
goldReward = rewards.get (buffer[136]);
|
|
||||||
chestReward = rewards.get (buffer[138]);
|
|
||||||
goldReward.addMonster (this, 0);
|
|
||||||
chestReward.addMonster (this, 1);
|
|
||||||
|
|
||||||
imageID = buffer[64];
|
imageID = buffer[64];
|
||||||
groupSize = new Dice (buffer, 66);
|
groupSize = new Dice (buffer, 66);
|
||||||
hitPoints = new Dice (buffer, 72);
|
hitPoints = new Dice (buffer, 72);
|
||||||
|
@ -83,17 +84,18 @@ class Monster extends AbstractFile
|
||||||
armourClass = buffer[80];
|
armourClass = buffer[80];
|
||||||
|
|
||||||
recsn = buffer[82]; // number of dice
|
recsn = buffer[82]; // number of dice
|
||||||
for (int i = 0, ptr = 84; i < 8; i++, ptr += 6)
|
for (int i = 0, ptr = 84; i < 7; i++, ptr += 6)
|
||||||
{
|
{
|
||||||
if (buffer[ptr] == 0)
|
if (buffer[ptr] == 0)
|
||||||
break;
|
break;
|
||||||
damage.add (new Dice (buffer, ptr));
|
damage.add (new Dice (buffer, ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
experiencePoints = Utility.readTriple (buffer, 126);
|
||||||
levelDrain = buffer[132];
|
levelDrain = buffer[132];
|
||||||
healPts = buffer[134];
|
healPts = buffer[134];
|
||||||
rewardTable1 = buffer[136];
|
goldReward = rewards.get (buffer[136]);
|
||||||
rewardTable2 = buffer[138];
|
chestReward = rewards.get (buffer[138]);
|
||||||
partnerID = buffer[140];
|
partnerID = buffer[140];
|
||||||
partnerOdds = buffer[142];
|
partnerOdds = buffer[142];
|
||||||
mageSpellLevel = buffer[144];
|
mageSpellLevel = buffer[144];
|
||||||
|
@ -105,6 +107,9 @@ class Monster extends AbstractFile
|
||||||
|
|
||||||
resistance = buffer[154]; // bit flags
|
resistance = buffer[154]; // bit flags
|
||||||
abilities = buffer[156]; // bit flags
|
abilities = buffer[156]; // bit flags
|
||||||
|
|
||||||
|
goldReward.addMonster (this, 0);
|
||||||
|
chestReward.addMonster (this, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
|
@ -114,7 +119,7 @@ class Monster extends AbstractFile
|
||||||
{
|
{
|
||||||
StringBuilder text = new StringBuilder ();
|
StringBuilder text = new StringBuilder ();
|
||||||
|
|
||||||
int totalExperience = getExperience ();
|
int totalExperience = scenarioId == 1 ? getExperience () : experiencePoints;
|
||||||
|
|
||||||
text.append ("ID .............. " + monsterID);
|
text.append ("ID .............. " + monsterID);
|
||||||
text.append ("\nMonster name .... " + realName);
|
text.append ("\nMonster name .... " + realName);
|
||||||
|
@ -151,10 +156,10 @@ class Monster extends AbstractFile
|
||||||
|
|
||||||
text.append (String.format ("%n%nExperience ...... %-,7d", totalExperience));
|
text.append (String.format ("%n%nExperience ...... %-,7d", totalExperience));
|
||||||
|
|
||||||
text.append ("\n\n===== Gold reward ======");
|
text.append (String.format ("%n%n===== Gold reward %2d ======", goldReward.id));
|
||||||
// text.append ("\nTable ........... " + rewardTable1);
|
// text.append ("\nTable ........... " + rewardTable1);
|
||||||
text.append ("\n" + goldReward.getText (false));
|
text.append ("\n" + goldReward.getText (false));
|
||||||
text.append ("===== Chest reward =====");
|
text.append (String.format ("===== Chest reward %2d =====", chestReward.id));
|
||||||
// text.append ("\nTable ........... " + rewardTable2);
|
// text.append ("\nTable ........... " + rewardTable2);
|
||||||
text.append ("\n" + chestReward.getText (false));
|
text.append ("\n" + chestReward.getText (false));
|
||||||
|
|
||||||
|
@ -179,8 +184,8 @@ class Monster extends AbstractFile
|
||||||
int expDamage = recsn <= 1 ? 0 : getBonus (30, recsn);
|
int expDamage = recsn <= 1 ? 0 : getBonus (30, recsn);
|
||||||
int expUnaffect = unaffect == 0 ? 0 : getBonus (40, (unaffect / 10 + 1));
|
int expUnaffect = unaffect == 0 ? 0 : getBonus (40, (unaffect / 10 + 1));
|
||||||
|
|
||||||
int expFlags1 = getBonus (35, Integer.bitCount (resistance & 0x7E));
|
int expFlags1 = getBonus (35, Integer.bitCount (resistance & 0x7E)); // 6 bits
|
||||||
int expFlags2 = getBonus (40, Integer.bitCount (abilities & 0x7F));
|
int expFlags2 = getBonus (40, Integer.bitCount (abilities & 0x7F)); // 7 bits
|
||||||
|
|
||||||
return expHitPoints + expAc + expMage + expPriest + expDrain + expHeal + expDamage + expUnaffect
|
return expHitPoints + expAc + expMage + expPriest + expDrain + expHeal + expDamage + expUnaffect
|
||||||
+ expFlags1 + expFlags2;
|
+ expFlags1 + expFlags2;
|
||||||
|
@ -196,11 +201,16 @@ class Monster extends AbstractFile
|
||||||
int total = base;
|
int total = base;
|
||||||
while (multiplier > 1)
|
while (multiplier > 1)
|
||||||
{
|
{
|
||||||
|
int part = total % 10000; // get the last 4 digits
|
||||||
|
|
||||||
multiplier--;
|
multiplier--;
|
||||||
total += total; // double the value
|
total += total; // double the value
|
||||||
|
|
||||||
|
if (part >= 5000) // mimics the wizardry bug
|
||||||
|
total += 10000; // yay, free points
|
||||||
}
|
}
|
||||||
|
|
||||||
return total + total / 10000 * 10000; // mimics the Wizardry bug
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
|
@ -234,8 +244,11 @@ class Monster extends AbstractFile
|
||||||
for (Dice d : damage)
|
for (Dice d : damage)
|
||||||
text.append (d + ", ");
|
text.append (d + ", ");
|
||||||
|
|
||||||
text.deleteCharAt (text.length () - 1);
|
if (text.length () > 0)
|
||||||
text.deleteCharAt (text.length () - 1);
|
{
|
||||||
|
text.deleteCharAt (text.length () - 1);
|
||||||
|
text.deleteCharAt (text.length () - 1);
|
||||||
|
}
|
||||||
|
|
||||||
return text.toString ();
|
return text.toString ();
|
||||||
}
|
}
|
||||||
|
@ -254,7 +267,7 @@ class Monster extends AbstractFile
|
||||||
for (int i = lo; i < hi; i++)
|
for (int i = lo; i < hi; i++)
|
||||||
line.append (String.format ("%02X ", buffer[i]));
|
line.append (String.format ("%02X ", buffer[i]));
|
||||||
|
|
||||||
if (block == 3)
|
if (block == 3 && scenarioId == 1)
|
||||||
{
|
{
|
||||||
int exp = getExperience ();
|
int exp = getExperience ();
|
||||||
line.append (String.format (" %,6d %,6d", exp, exp - experience[monsterID]));
|
line.append (String.format (" %,6d %,6d", exp, exp - experience[monsterID]));
|
||||||
|
|
|
@ -165,7 +165,9 @@ public class WizLong
|
||||||
return high > other.high ? 1 : -1;
|
return high > other.high ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------------//
|
||||||
public int value ()
|
public int value ()
|
||||||
|
// ---------------------------------------------------------------------------------//
|
||||||
{
|
{
|
||||||
return high * 10000 * 10000 + mid * 10000 + low;
|
return high * 10000 * 10000 + mid * 10000 + low;
|
||||||
}
|
}
|
||||||
|
@ -229,7 +231,7 @@ public class WizLong
|
||||||
int heal = 0;
|
int heal = 0;
|
||||||
int breathe = 0;
|
int breathe = 0;
|
||||||
int unaffect = 85;
|
int unaffect = 85;
|
||||||
int wepsty = 0x40;
|
int wepsty = 64;
|
||||||
int sppc = 0;
|
int sppc = 0;
|
||||||
|
|
||||||
// Werdna
|
// Werdna
|
||||||
|
@ -243,8 +245,8 @@ public class WizLong
|
||||||
// int heal = 5;
|
// int heal = 5;
|
||||||
// int breathe = 0;
|
// int breathe = 0;
|
||||||
// int unaffect = 70;
|
// int unaffect = 70;
|
||||||
// int wepsty = 0x0E;
|
// int wepsty = 14;
|
||||||
// int sppc = 0x0F;
|
// int sppc = 15;
|
||||||
|
|
||||||
// Will O Wisp
|
// Will O Wisp
|
||||||
// int hpSides = 10;
|
// int hpSides = 10;
|
||||||
|
@ -272,6 +274,7 @@ public class WizLong
|
||||||
multAddKX (killExp, priestSpells, 35);
|
multAddKX (killExp, priestSpells, 35);
|
||||||
multAddKX (killExp, drain, 200);
|
multAddKX (killExp, drain, 200);
|
||||||
multAddKX (killExp, heal, 90);
|
multAddKX (killExp, heal, 90);
|
||||||
|
|
||||||
killExp.printLong ();
|
killExp.printLong ();
|
||||||
|
|
||||||
killExpx = new WizLong (40 * (11 - ac));
|
killExpx = new WizLong (40 * (11 - ac));
|
||||||
|
@ -280,16 +283,41 @@ public class WizLong
|
||||||
|
|
||||||
if (recsn > 1)
|
if (recsn > 1)
|
||||||
multAddKX (killExp, recsn, 30);
|
multAddKX (killExp, recsn, 30);
|
||||||
|
|
||||||
killExp.printLong ();
|
killExp.printLong ();
|
||||||
|
|
||||||
if (unaffect > 0)
|
if (unaffect > 0)
|
||||||
multAddKX (killExp, (unaffect / 10 + 1), 40);
|
multAddKX (killExp, (unaffect / 10 + 1), 40);
|
||||||
|
|
||||||
killExp.printLong ();
|
killExp.printLong ();
|
||||||
|
|
||||||
multAddKX (killExp, Integer.bitCount (wepsty & 0x7E), 35); // 6 bits
|
multAddKX (killExp, Integer.bitCount (wepsty & 0x7E), 35); // 6 bits
|
||||||
// System.out.println (Integer.bitCount (wepsty));
|
|
||||||
multAddKX (killExp, Integer.bitCount (sppc & 0x7F), 40); // 7 bits
|
multAddKX (killExp, Integer.bitCount (sppc & 0x7F), 40); // 7 bits
|
||||||
|
|
||||||
killExp.printLong ();
|
killExp.printLong ();
|
||||||
|
|
||||||
|
System.out.println ();
|
||||||
|
|
||||||
|
WizLong a = new WizLong (1000);
|
||||||
|
a.multLong (54);
|
||||||
|
a.printLong ();
|
||||||
|
a.addLong (a);
|
||||||
|
a.printLong ();
|
||||||
|
|
||||||
|
System.out.println ();
|
||||||
|
|
||||||
|
a = new WizLong (1000);
|
||||||
|
a.multLong (500);
|
||||||
|
a.printLong ();
|
||||||
|
a.addLong (a);
|
||||||
|
a.printLong ();
|
||||||
|
|
||||||
|
System.out.println ();
|
||||||
|
|
||||||
|
a = new WizLong (1000);
|
||||||
|
a.multLong (505);
|
||||||
|
a.printLong ();
|
||||||
|
a.addLong (a);
|
||||||
|
a.printLong ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -277,9 +277,10 @@ public class WizardryScenarioDisk extends PascalDisk
|
||||||
{
|
{
|
||||||
int nameLength = buffer[ptr] & 0xFF;
|
int nameLength = buffer[ptr] & 0xFF;
|
||||||
if (nameLength == 0xC3)
|
if (nameLength == 0xC3)
|
||||||
continue;
|
return;
|
||||||
|
|
||||||
String name = HexFormatter.getString (buffer, ptr + 1, nameLength);
|
String name = HexFormatter.getString (buffer, ptr + 1, nameLength);
|
||||||
if ("UNSET".equals (name) && buffer[ptr + 40] == 0x07) // 7 = LOST
|
if (name.isEmpty () || ("UNSET".equals (name) && buffer[ptr + 40] == 0x07)) // 7 = LOST
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
byte[] data2 = new byte[recLen];
|
byte[] data2 = new byte[recLen];
|
||||||
|
@ -341,7 +342,7 @@ public class WizardryScenarioDisk extends PascalDisk
|
||||||
byte[] data2 = new byte[recLen];
|
byte[] data2 = new byte[recLen];
|
||||||
System.arraycopy (buffer, ptr, data2, 0, recLen);
|
System.arraycopy (buffer, ptr, data2, 0, recLen);
|
||||||
|
|
||||||
Monster m = new Monster (itemName, data2, rewards, monsters);
|
Monster m = new Monster (itemName, data2, rewards, monsters, scenarioHeader.scenarioID);
|
||||||
monsters.add (m);
|
monsters.add (m);
|
||||||
addToNode (m, node, blocks, monsterSector);
|
addToNode (m, node, blocks, monsterSector);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue