Wednesday, August 28, 2019

The bestiary of Wizardry


I've split the monster table into several, while also merging some of the columns. Trust me, this is the least bad solution that I've tried.

Id Picture Unknown Name Unknown Names Name Names Group Size HP / Level
0 0 SLIME SLIMES BUBBLY SLIME BUBBLY SLIMES 2d2 1d3 +1
1 1 SMALL HUMANOID SMALL HUMANOIDS ORC ORCS 3d2 1d4
2 1 SMALL HUMANOID SMALL HUMANOIDS KOBOLD KOBOLDS 2d2 +1 2d3 +1
3 2 SKELETON SKELETONS UNDEAD KOBOLD UNDEAD KOBOLDS 1d6 +1 2d3 +2
4 3 SCRUFFY MAN SCRUFFY MEN ROGUE ROGUES 1d4 +1 2d5 +1
5 3 SCRUFFY MAN SCRUFFY MEN BUSHWACKER BUSHWACKERS 1d4 +1 3d6 +1
6 4 MAN IN CHAIN MEN IN CHAIN HIGHWAYMAN HIGHWAYMEN 2d6 3d4 +2
7 5 WEIRD HUMANOID WEIRD HUMANOIDS ZOMBIE ZOMBIES 1d6 +1 1d10 +1
8 0 SLIME SLIMES CREEPING CRUD CREEPING CRUDS 1d6 +1 3d4
9 6 GAS CLOUD GAS CLOUDS GAS CLOUD GAS CLOUDS 2d4 2d4
10 7 MAN IN ROBES MEN IN ROBES LVL 1 MAGE LVL 1 MAGES 1d1 1d4 +1
11 8 PRIEST PRIESTS LVL 1 PRIEST LVL 1 PRIESTS 1d4 +1 1d8
12 19 SMALL OBJECT SMALL OBJECTS CREEPING COIN? CREEPING COINS? 9d1 1d1
13 9 KIMONOED MAN KIMONOED MEN LVL 1 NINJA LVL 1 NINJAS 2d4 2d4 +2
14 11 RABBIT RABBITS VORPAL BUNNY VORPAL BUNNIES 2d3 +2 3d6 +2
15 11 GIANT RODENT GIANT RODENTS CAPYBARA CAPYBARAS 2d4 +1 4d4
16 12 AMPHIBIAN AMPHIBIANS GIANT TOAD GIANT TOADS 2d2 +4 4d5
17 11 MANGY DOG MANGY DOGS COYOTE COYOTES 4d2 4d6
18 8 PRIEST PRIESTS LVL 3 PRIEST LVL 3 PRIESTS 2d2 +3 3d8 +1
19 9 KIMONOED MAN KIMONOED MEN LVL 3 SAMURAI LVL 3 SAMURAI 4d2 3d6 +4
20 9 KIMONOED MAN KIMONOED MEN LVL 3 NINJA LVL 3 NINJA 2d4 +2 3d8
21 10 BEAR BEARS WERE BEAR WERE BEARS 2d3 +2 5d8
22 13 FLY FLIES DRAGON FLY DRAGON FLIES 1d3 +1 2d8
23 5 WEIRD HUMANOID WEIRD HUMANOIDS ROTTING CORPSE ROTTING CORPSES 1d5 2d8
24 16 OGRE OGRES OGRE OGRES 1d8 4d8 +1
25 14 INSECT INSECTS HUGE SPIDER HUGE SPIDERS 1d8 2d8 +2
26 11 WERERAT WERERATS WERERAT WERERATS 1d4 3d8 +1
27 14 INSECT INSECTS BORING BEETLE BORING BEETLES 1d8 5d8
28 15 DRAGON DRAGONS GAS DRAGON GAS DRAGONS 1d4 5d8
29 8 PRIEST PRIEST PRIESTESS PRIESTESS 1d6 3d8 +1
30 4 MAN IN ARMOR MEN IN ARMOR SWORDSMAN SWORDSMEN 1d6 3d10
31 14 INSECT INSECTS HUGE SPIDER HUGE SPIDERS 1d8 2d8 +2
32 11 ANIMAL ANIMALS ATTACK DOG ATTACK DOGS 1d6 4d8
33 16 GARGOYLE GARGOYLES GARGOYLE GARGOYLES 1d6 4d8 +4
34 5 UNSEEN ENTITY UNSEEN ENTITY GRAVE MIST GRAVE MISTS 1d6 4d8
35 15 ANIMAL ANIMALS DRAGON PUPPY DRAGON PUPPIES 1d6 5d10
36 11 WOLF WOLVES WEREWOLF WEREWOLVES 1d6 4d8 +3
37 5 UNSEEN ENTITY UNSEEN ENTITY SHADE SHADES 1d6 3d8 +3
38 8 PRIEST PRIESTS BISHOP BISHOPS 1d6 4d8
39 9 MAN IN ARMOR MAN IN ARMOR MINOR DAIMYO MINOR DAIMYOS 1d6 4d10
40 7 MAN IN ROBES MEN IN ROBES LVL 5 MAGE LVL 5 MAGES 1d6 5d4
41 3 MAN IN LEATHER MEN IN LEATHER LVL 4 THIEF LVL 4 THIEVES 1d6 4d8 +3
42 11 ANIMAL ANIMALS KILLER WOLF KILLER WOLVES 1d6 6d8
43 5 UNSEEN ENTITY UNSEEN ENTITY SPIRIT SPIRITS 1d6 7d3 +2
44 14 INSECT INSECTS GIANT SPIDER GIANT SPIDERS 1d6 4d8 +4
45 11 ANIMAL ANIMALS WERETIGER WERETIGERS 1d8 5d8
46 11 STRANGE ANIMAL STRANGE ANIMALS MEDUSALIZARD MEDUSALIZARDS 1d6 5d8
47 8 PRIEST PRIESTS LVL 5 PRIEST LVL 5 PRIESTS 1d5 5d8
48 9 MAN IN BLACK MEN IN BLACK LVL 6 NINJA LVL 6 NINJAS 1d5 6d10
49 7 MAN IN ROBES MEN IN ROBES LVL 7 MAGE LVL 7 MAGES 1d6 7d4
50 3 MAN IN LEATHER MEN IN LEATHER MASTER THIEF MASTER THIEVES 1d6 4d6
51 9 MAN IN ARMOR MAN IN ARMOR MAJOR DAIMYO MAJOR DAIMYOS 1d5 7d12
52 8 PRIEST PRIESTS HIGH PRIEST HIGH PRIESTS 1d6 8d8
53 9 MAN IN ARMOR MEN IN ARMOR CHAMP SAMURAI CHAMP SAMURAI 1d6 10d10
54 7 MAN IN ROBES MEN IN ROBES ARCH MAGE ARCH MAGES 1d6 8d4 +2
55 3 MAN IN LEATHER MEN IN LEATHER MASTER THIEF MASTER THIEVES 1d6 6d6
56 11 STRANGE ANIMAL STRANGE ANIMALS GAZE HOUND GAZE HOUNDS 1d5 4d8
57 16 OGRE OGRES OGRE LORD OGRE LORDS 1d5 8d8
58 16 STRANGE ANIMAL STRANGE ANIMALS TROLL TROLLS 1d3 6d8 +6
59 5 UNSEEN ENTITY UNSEEN ENTITIES LIFESTEALER LIFESTEALERS 1d1 5d8 +3
60 2 UNSEEN ENTITY UNSEEN ENTITIES NIGHTSTALKER NIGHTSTALKERS 2d3 5d8 +3
61 11 STRANGE ANIMAL STRANGE ANIMALS WYVERN WYVERNS 1d6 7d8 +7
62 8 PRIEST PRIESTS LVL 8 PRIEST LVL 8 PRIESTS 1d5 7d8
63 4 MAN IN ARMOR MEN IN ARMOR LVL 10 FIGHTER LVL 10 FIGHTERS 1d6 7d10
64 7 MAN IN ROBES MEN IN ROBES LVL 7 MAGE LVL 7 MAGES 1d6 7d4
65 3 MAN IN LEATHER MEN IN LEATHER LVL 7 THIEF LVL 7 THIEVES 1d5 7d6
66 9 MONK MONKS LVL 8 NINJA LVL 8 NINJAS 1d3 8d4
67 16 GIANT GIANTS EARTH GIANT EARTH GIANTS 1d5 1d1 +40
68 17 DEMON DEMONS LESSER DEMON LESSER DEMONS 1d1 10d8
69 15 STRANGE ANIMAL STRANGE ANIMALS CHIMERA CHIMERAS 1d4 9d6
70 16 GIANT GIANT FIRE GIANT FIRE GIANT 1d4 11d8 +4
71 10 STRANGE ANIMAL STRANGE ANIMALS GORGON GORGONS 1d1 8d8
72 8 PRIEST PRIESTS LVL 8 BISHOP LVL 8 BISHOPS 1d6 8d8
73 4 MAN IN ARMOR MEN IN ARMOR LVL 8 FIGHTER LVL 8 FIGHTERS 1d6 8d10
74 7 MAN IN ROBES MEN IN ROBES LVL 10 MAGE LVL 10 MAGES 1d6 10d4
75 3 MAN IN LEATHER MEN IN LEATHER THIEF THIEVES 1d5 9d6
76 7 MAN IN ROBE MEN IN ROBES MASTER NINJA MASTER NINJAS 1d5 10d4
77 5 UNSEEN ENTITY UNSEEN ENTITIES MURPHY'S GHOST MURPHY'S GHOSTS 1d1 10d10 +10
78 6 UNSEEN ENTITY UNSEEN ENTITIES WILL O' WISP WILL O' WISPS 1d2 10d8
79 12 STRANGE ANIMAL STRANGE ANIMALS BLEEB BLEEBS 1d8 10d8
80 16 GIANT GIANTS FROST GIANT FROST GIANTS 1d4 1d8 +50
81 15 DRAGON DRAGON FIRE DRAGON FIRE DRAGON 1d4 12d8
82 8 PRIEST PRIEST HIGH PRIEST HIGH PRIEST 1d1 11d8
83 7 MAN IN ROBES MEN IN ROBES HIGH WIZARD HIGH WIZARDS 1d1 12d4
84 3 MAN IN LEATHER MEN IN LEATHER MASTER THIEF MASTER THIEVES 1d1 12d6
85 7 MAN IN ROBES MEN IN ROBES HATAMOTO HATAMOTOS 1d1 12d4
86 2 UNSEEN ENTITY UNSEEN ENTITY VAMPIRE VAMPIRES 1d4 11d8
87 17 DEMON DEMONS GREATER DEMON GREATER DEMONS 1d6 11d8
88 16 GIANT GIANTS POISON GIANT POISON GIANTS 1d4 1d1 +80
89 15 DRAGON DRAGONS DRAGON ZOMBIE DRAGON ZOMBIES 1d4 12d8
90 4 MAN IN ARMOR MEN IN ARMOR RAVER LORD RAVER LORDS 1d1 15d10
91 1 CONEHEAD CONEHEADS THE HIGH MASTER HIGH MASTERS 1d1 15d4
92 0 STRANGE ANIMAL STRANGE ANIMALS FLACK FLECK 1d1 15d12
93 7 MAN IN ROBES MEN IN ROBES ARCH MAGE ARCH MAGES 1d1 20d4
94 17 UNSEEN BEING UNSEEN BEINGS MAELIFIC MAELIFICS 1d0 +1 25d4
95 2 UNSEEN ENTITY UNSEEN ENTITYS VAMPIRE LORD VAMPIRE LORDS 1d1 20d8
96 7 MAN IN ROBES MAN IN ROBES W E R D N A W E R D N A 1d1 10d10 +20
97 9 MAN IN KIMONO MEN IN KIMONOS HIGH NINJA HIGH NINJAS 1d1 12d4
98 8 PRIEST PRIESTS HIGH PRIEST HIGH PRIESTS 2d1 8d8
99 7 MAN IN ROBES MEN IN ROBES LVL 7 MAGE LVL 7 MAGES 2d1 7d4
100 4 MAN IN ARMOR MEN IN ARMOR LVL 7 FIGHTER LVL 7 FIGHTERS 2d1 7d10


Picture

These pictures were extracted from the Apple II disk images.

Names

Each monster gets four names. A normal name, a name representing the unidentified monster, and plural variants for both.

Group Size

The number of monsters that may appear in a group. This will never exceed (MazeLevel + 4).

HP / Level

The hit dice which determine the monster’s starting HP, which rolls for each individual monster during an encounter. The dice count also serves as the monster's level. Kobolds, for instance, with 2d3 + 1 HP, count as level 2.


Some of these notes reference formulas that I’ve discussed in the previous post.

A monster's chance to hit you in melee is (Level + YourAC) * 5% per strike.

A monster's chance to resist a successful critical hit is (Level + 10)/35.

Each monster's chance to resist Manifo is (Level * 10%) + 50%.

Each monster's chance to resist Montino and Badi is Level * 10%.

Each monster's chance to resist Katino is Level * 20%.

Monsters always resist Makanito if their level is greater than 7.

Each monster’s chance to resist Lakanito is Level * 6%.

A monster's chance to resist Dispell increases by Level * 10%.


The morale of a monster group is equal to its level, multiplied by the number of monsters whose status is OK.

When your total party level exceeds the total monster morale of all groups, they will be demoralized, and monsters with the Run ability have a 65% chance to flee.

When monsters are demoralized (even if they cannot run), your chance to succeed when running is 20% higher.


Each monster's chance to heal AFRAID status is Level * 10% per turn, but not more than 50%. I am not sure if the AFRAID status is even possible in Wizardry; fear-related spells just raise AC.

Each monster's chance to heal ASLEEP status is Level * 20% per turn, but not more than 50%.

Each monster's chance to heal PARALYZE status is Level * 7% per turn, but not more than 50%. PARALYZE also doesn't seem to be possible to inflict. Monsters successfully held with MANIFO are simply put into ASLEEP status.


When monsters advance, each monster has a “strength” value determined by this formula:
[Remaining HP] - 3 * (MageLevel + PriestLevel)

The group strength is the sum of all monsters’ strength in the group, only counting monsters with OK status.

After group strength is calculated for all groups, monster group 4 compares its strength to monster group 3, and performs this calculation:
20% * [Group 4 Strength] / [Group 3 Strength] + 31%

This result is the probability that each group moves up a rank.

The process repeats for group 3 and group 2.



Id Name Class Armor Class Attacks Special Reward 1 Reward 2
0 BUBBLY SLIME Animal 12 1d1
0 10
1 ORC Fighter 10 1d4
0 10
2 KOBOLD Fighter 8 1d2 +1 1d2 +1
0 10
3 UNDEAD KOBOLD Undead 10 1d4 +1
0 10
4 ROGUE Thief 10 1d4 2d2 +1
0 10
5 BUSHWACKER Fighter 8 1d6 +1 2d4 +1
0 10
6 HIGHWAYMAN Fighter 6 1d2 +1 1d2 +1 1d2 +1 1d2 +1
0 10
7 ZOMBIE Undead 4 1d6
0 10
8 CREEPING CRUD Animal 6 1d3 +1
0 10
9 GAS CLOUD Enchanted 10 1d4
0 10
10 LVL 1 MAGE Mage 4 2d2
1 11
11 LVL 1 PRIEST Priest 5 1d8
1 11
12 CREEPING COIN? Enchanted 4 1d1 [Drain breath] 2 4
13 LVL 1 NINJA Fighter 5 1d4 1d4 1d4
1 11
14 VORPAL BUNNY Animal 6 1d6 1d8
1 11
15 CAPYBARA Animal 8 1d10
1 11
16 GIANT TOAD Animal 7 1d4 1d6 2d3 +2
1 11
17 COYOTE Animal 8 4d4
1 11
18 LVL 3 PRIEST Priest 4 1d8 +2
1 11
19 LVL 3 SAMURAI Fighter 5 1d4 +1 1d6 +1 1d4 +1
1 11
20 LVL 3 NINJA Fighter 3 1d4 1d4 1d4 1d4 1d4
2 12
21 WERE BEAR Animal 6 3d6 +1 [Heal 1] 2 12
22 DRAGON FLY Dragon 4 1d4 1d4 1d6 [Flame breath] 2 12
23 ROTTING CORPSE Undead 6 1d3 1d3 1d6
2 12
24 OGRE Fighter 5 2d6
2 12
25 HUGE SPIDER Insect 6 1d6
2 12
26 WERERAT Were 6 1d8
2 12
27 BORING BEETLE Insect 3 5d4
2 12
28 GAS DRAGON Dragon 3 1d4 1d4 3d6 [Poison breath] 2 12
29 PRIESTESS Priest 4 1d6 +2
2 12
30 SWORDSMAN Fighter 3 2d7
3 13
31 HUGE SPIDER Insect 6 1d6
3 13
32 ATTACK DOG Animal 1 1d6
3 13
33 GARGOYLE Enchanted 5 1d3 1d3 1d6 1d4
3 13
34 GRAVE MIST Undead 4 1d4 1d4 1d8
3 13
35 DRAGON PUPPY Dragon 4 1d10 [Cold breath] 3 13
36 WEREWOLF Were 5 2d4 2d4
3 13
37 SHADE Undead 7 1d4 +1 [Drain 1] 3 13
38 BISHOP Priest 4 1d10
3 13
39 MINOR DAIMYO Fighter 2 1d12
3 13
40 LVL 5 MAGE Mage 10 1d4
4 14
41 LVL 4 THIEF Thief 10 1d6 2d6
4 14
42 KILLER WOLF Animal 0 2d4 2d4
4 14
43 SPIRIT Mythical 2 1d4 [Heal 1] 4 14
44 GIANT SPIDER Insect 4 2d4
4 14
45 WERETIGER Were 4 2d6 2d6 1d4 [Heal 1] 4 14
46 MEDUSALIZARD Mythical 6 1d3
4 14
47 LVL 5 PRIEST Priest 4 1d6 +2
4 14
48 LVL 6 NINJA Fighter 6 1d6 1d6 1d6
4 14
49 LVL 7 MAGE Mage 8 1d4
4 14
50 MASTER THIEF Thief 4 1d6 1d6 2d6
5 15
51 MAJOR DAIMYO Fighter 0 1d10 1d4
5 15
52 HIGH PRIEST Priest 3 1d8 +2
5 15
53 CHAMP SAMURAI Fighter 2 1d12 +2
5 15
54 ARCH MAGE Mage 9 1d4
5 15
55 MASTER THIEF Thief 3 1d8 3d8
5 15
56 GAZE HOUND Animal -1 1d2
5 15
57 OGRE LORD Mage 4 1d12 [Heal 1] 5 15
58 TROLL Fighter 4 1d4 +4 1d4 +4 1d4 +4 [Heal 3] 5 15
59 LIFESTEALER Undead 3 1d4 [Drain 2] 5 15
60 NIGHTSTALKER Undead 4 1d6 [Drain 1] 6 16
61 WYVERN Animal 3 2d8 1d6
6 16
62 LVL 8 PRIEST Priest 3 1d8
6 16
63 LVL 10 FIGHTER Fighter 0 1d12 1d12
6 16
64 LVL 7 MAGE Mage 8 1d4
6 16
65 LVL 7 THIEF Thief 4 1d8 3d8
6 16
66 LVL 8 NINJA Fighter 4 2d6 1d6
6 16
67 EARTH GIANT Giant 9 2d8 2d8
6 16
68 LESSER DEMON Demon 4 2d6 2d6 1d3 1d3 1d4 +4
6 16
69 CHIMERA Animal 2 1d3 1d3 1d4 1d4 2d4 3d4 [Flame breath] 6 16
70 FIRE GIANT Giant 3 5d6
7 17
71 GORGON Mythical 2 2d6 [Stone breath] 7 17
72 LVL 8 BISHOP Priest 2 1d8 +4
7 17
73 LVL 8 FIGHTER Fighter -1 1d12 +2 1d12 +2
7 17
74 LVL 10 MAGE Mage 10 1d4
7 17
75 THIEF Thief 4 1d8 1d3 3d8 2d10
7 17
76 MASTER NINJA Fighter 3 1d10 +3 1d10 +3 1d10 +3
7 17
77 MURPHY'S GHOST Undead -3 1d1 +1 [Heal 1] 3 3
78 WILL O' WISP Enchanted -8 2d8
7 17
79 BLEEB Animal 0 1d8 +1 1d8 +1
7 17
80 FROST GIANT Giant 6 3d10
8 18
81 FIRE DRAGON Dragon -1 1d4 1d4 4d4 [Flame breath] 8 18
82 HIGH PRIEST Priest 2 1d8 1d8
8 18
83 HIGH WIZARD Mage 4 1d4
8 18
84 MASTER THIEF Thief 2 1d8 5d8
8 18
85 HATAMOTO Fighter -1 3d8 3d8 3d8
8 18
86 VAMPIRE Undead -1 2d8 1d4 1d4 [Drain 2] [Heal 1] 8 18
87 GREATER DEMON Demon -3 2d12 1d6 1d4 1d4 1d4 [Heal 1] 8 18
88 POISON GIANT Giant 3 4d10 [Poison breath] 8 18
89 DRAGON ZOMBIE Undead -2 1d8 1d8 3d12 [Drain breath] 8 18
90 RAVER LORD Animal 10 3d12 3d12 [Heal 2] 9 19
91 THE HIGH MASTER Fighter -2 3d12 3d12 3d6
9 19
92 FLACK Animal -3 4d8 +3 [Cold breath] 9 19
93 ARCH MAGE Mage 0 1d4
9 19
94 MAELIFIC Undead -5 1d4 1d0 +1 [Drain 3] [Heal 3] 9 19
95 VAMPIRE LORD Undead -5 1d4 [Drain 4] [Heal 4] 9 19
96 W E R D N A Mage -7 8d5 8d5 [Drain 4] [Heal 5] 20 20
97 HIGH NINJA Fighter -1 3d8 3d8 3d8
0 0
98 HIGH PRIEST Priest 2 1d8 +4
0 0
99 LVL 7 MAGE Mage 8 1d4
0 0
100 LVL 7 FIGHTER Fighter 0 1d12 1d12 [Unique 1] 21 21


Class

Class determines the odds of being friendly.


Fighter 11%
Mage 6%
Priest 16%
Thief 4%
Midget (unused) 31%
Dragon 26%
All others 1%


Certain items, when equipped, will have a 50% chance of silently nullifying attacks from specific monster classes, should the monster decide to attack the character equipped with such an item. They do not affect spells or breath weapons.

Certain weapons deal double damage against specific monster classes.

Makanito never affects the undead. Zilwan and Dispell only affect the undead.

Class determines fighting style, though this is strictly an aesthetic detail.

Fighter Arms
Mage Arms
Priest Arms
Thief Arms
Midget Arms
Giant Arms
Mythical Claws
Dragon Both
Animal Claws
Were Both
Undead Arms
Demon Arms
Insect Claws
Enchanted Claws

A monster with “arms” SWINGS, THRUSTS, STABS, SLASHES, and CHOPS.

A monster with “claws” TEARS, RIPS, GNAWS, BITES, and CLAWS.

A monster with “both” can do any of those things.

Attacks

Simple hit dice to determine damage when a monster hits.

Some monsters have multiple attacks, and they don’t always do the same amount of damage. For instance, the greater demon’s attack is:
2d12 1d6 1d4 1d4 1d4

That means it strikes five times, each strike has a separate chance to hit, and each landed hit inflicts the corresponding damage roll.

Special: X Breath

The monster has a breath attack of element type X. Any monster with a breath attack has a 60% chance of using it instead of attacking. Breath attacks hit all players for damage equal to half of the monster’s remaining HP. Characters equipped with an item with that elemental resistance, or who make a saving throw against breath will take half damage. If both conditions are met, they take 25% damage. Element type has no other effect. Stone breath, for instance, does not petrify; it merely indicates that characters equipped with stone elemental protection will take half damage.

Special: Drain X

If you are hit, you will lose X levels, and your maxHP will be reduced to ([newLevel]*[oldMaxHP])/[MaxLev], where MaxLev is the highest level you've reached without getting drained (switching classes resets your level but not your MaxLevel). You’ll be LOST if you drop below level 1!

The creeping coins don't have this ability; they only have a breath attack with the Drain element.

Special: Heal X

The monster heals this many HP per round.

Special: Unique 1

This is a property found only found in the Level 7 Fighters, found in the monster allocation center in Level 4. When you kill a group of this monster, the value decreases by 1, permanently, and from then on will never be fought again, not even by subsequent parties starting new games. In all of the Apple II disk images of Wizardry I on Asimov, this value is already set to 0! I’ve “fixed” this in my own copy by bringing it back to 1, which I believe is the intended starting value.

If you encounter a monster whose "unique" value is 0, then you will fight its partner instead.

Reward 1 & Reward 2

Index values used to lookup the type of treasure the monster leaves. This is always based on the monster type that was initially selected for the encounter. Monsters types that populated the rear ranks are irrelevant.

“Reward 1” almost always indicates an amount of loose gold, and “Reward 2” almost always indicates a treasure chest which may or may not have items inside. Whether you get reward type 1 or type 2 is not entirely random.

As described in a previous post, upon entering a dungeon level, the map will be seeded with nine treasure chests, which will be distributed in designated treasure rooms. Entering a room with a treasure chest guarantees an encounter, and the “Reward 2” column will be selected as the contents of the treasure chest. Treasures from standard encounters are selected from the “Reward 1” column and are usually just loose piles of gold.

If you set off an alarm trap, then you'll still get a "Reward 2" prize after winning the resulting encounter, without having to re-open the treasure chest, but the prize will be determined from the resulting encounter rather than from the initial one.

If you have a random encounter in a treasure room where there isn't any treasure chest, you will recieve loose gold from the “Reward 1” column, but the amount will be doubled.


Id Name Partner Mage Level Priest Level Spell Resistance
0 BUBBLY SLIME 10% ORC 0 0 0
1 ORC 20% KOBOLD 0 0 0
2 KOBOLD 15% ORC 0 0 0
3 UNDEAD KOBOLD 10% KOBOLD 0 0 0
4 ROGUE 20% ORC 0 0 0
5 BUSHWACKER 20% ZOMBIE 0 0 0
6 HIGHWAYMAN 20% ZOMBIE 0 0 0
7 ZOMBIE 20% CREEPING CRUD 0 0 0
8 CREEPING CRUD 24% BUBBLY SLIME 0 0 0
9 GAS CLOUD 15% BUBBLY SLIME 2 0 0
10 LVL 1 MAGE 20% HIGHWAYMAN 1 0 0
11 LVL 1 PRIEST 25% ROGUE 0 1 0
12 CREEPING COIN? 100% CREEPING COIN? 0 0 0
13 LVL 1 NINJA 20% LVL 1 NINJA 0 0 0
14 VORPAL BUNNY 20% CAPYBARA 0 0 0
15 CAPYBARA 20% COYOTE 0 0 0
16 GIANT TOAD 20% COYOTE 0 0 0
17 COYOTE 25% VORPAL BUNNY 0 0 0
18 LVL 3 PRIEST 30% LVL 1 PRIEST 0 2 0
19 LVL 3 SAMURAI 20% CREEPING COIN? 1 0 0
20 LVL 3 NINJA 20% LVL 1 NINJA 0 0 0
21 WERE BEAR 30% VORPAL BUNNY 0 0 0
22 DRAGON FLY
0 0 20
23 ROTTING CORPSE 10% GRAVE MIST 0 0 0
24 OGRE 20% VORPAL BUNNY 0 0 0
25 HUGE SPIDER 10% BORING BEETLE 0 0 0
26 WERERAT 50% COYOTE 0 0 0
27 BORING BEETLE 20% HUGE SPIDER 0 0 0
28 GAS DRAGON 40% DRAGON FLY 1 0 0
29 PRIESTESS 60% GAS DRAGON 0 2 0
30 SWORDSMAN 35% ATTACK DOG 0 0 0
31 HUGE SPIDER 10% SHADE 0 0 0
32 ATTACK DOG 20% DRAGON FLY 0 0 0
33 GARGOYLE
0 0 50
34 GRAVE MIST 20% SHADE 0 0 0
35 DRAGON PUPPY 10% WERERAT 0 0 0
36 WEREWOLF 25% WERERAT 0 0 0
37 SHADE 20% ROTTING CORPSE 0 0 0
38 BISHOP 10% MINOR DAIMYO 1 3 0
39 MINOR DAIMYO 20% BISHOP 0 0 0
40 LVL 5 MAGE 20% LVL 4 THIEF 3 0 0
41 LVL 4 THIEF 20% BISHOP 0 0 0
42 KILLER WOLF 15% DRAGON PUPPY 0 0 0
43 SPIRIT 20% GARGOYLE 3 0 25
44 GIANT SPIDER 20% HUGE SPIDER 0 0 0
45 WERETIGER 20% WEREWOLF 0 0 0
46 MEDUSALIZARD 20% SPIRIT 0 0 0
47 LVL 5 PRIEST 20% LVL 6 NINJA 0 3 0
48 LVL 6 NINJA 20% MASTER THIEF 0 0 0
49 LVL 7 MAGE 20% LVL 6 NINJA 4 0 0
50 MASTER THIEF 10% LVL 5 PRIEST 0 0 0
51 MAJOR DAIMYO 50% LVL 5 PRIEST 0 0 20
52 HIGH PRIEST 20% CHAMP SAMURAI 0 5 0
53 CHAMP SAMURAI 25% HIGH PRIEST 1 0 0
54 ARCH MAGE 30% CHAMP SAMURAI 2 0 0
55 MASTER THIEF 25% ARCH MAGE 0 0 0
56 GAZE HOUND 20% GAZE HOUND 0 0 0
57 OGRE LORD 10% TROLL 3 0 0
58 TROLL 5% TROLL 0 0 0
59 LIFESTEALER 50% LIFESTEALER 3 3 20
60 NIGHTSTALKER 23% OGRE LORD 0 0 25
61 WYVERN 20% SPIRIT 0 0 0
62 LVL 8 PRIEST 20% WYVERN 0 4 0
63 LVL 10 FIGHTER 10% LVL 10 FIGHTER 0 0 0
64 LVL 7 MAGE 30% WYVERN 5 0 0
65 LVL 7 THIEF 20% LVL 8 PRIEST 0 0 0
66 LVL 8 NINJA 20% NIGHTSTALKER 0 0 0
67 EARTH GIANT
0 0 85
68 LESSER DEMON 80% LVL 8 NINJA 3 0 60
69 CHIMERA 20% ARCH MAGE 0 0 0
70 FIRE GIANT 10% LESSER DEMON 0 0 0
71 GORGON 50% CHIMERA 0 0 0
72 LVL 8 BISHOP 20% GORGON 3 4 0
73 LVL 8 FIGHTER 20% LVL 8 FIGHTER 0 0 0
74 LVL 10 MAGE 30% GORGON 5 0 0
75 THIEF 20% GORGON 0 0 0
76 MASTER NINJA 30% LVL 7 MAGE 0 0 0
77 MURPHY'S GHOST 80% MURPHY'S GHOST 0 0 40
78 WILL O' WISP
0 0 95
79 BLEEB 20% MASTER NINJA 0 0 0
80 FROST GIANT 30% THIEF 0 0 95
81 FIRE DRAGON
5 0 0
82 HIGH PRIEST 100% FIRE GIANT 0 6 0
83 HIGH WIZARD 100% LVL 8 BISHOP 6 0 0
84 MASTER THIEF 100% LVL 8 FIGHTER 0 0 0
85 HATAMOTO 100% LVL 10 MAGE 0 0 0
86 VAMPIRE 15% VAMPIRE 3 0 20
87 GREATER DEMON 70% LVL 8 NINJA 5 0 95
88 POISON GIANT 50% WILL O' WISP 0 0 95
89 DRAGON ZOMBIE 10% BLEEB 5 0 25
90 RAVER LORD 100% HIGH PRIEST 5 4 0
91 THE HIGH MASTER 100% HATAMOTO 0 0 0
92 FLACK 100% MURPHY'S GHOST 0 0 0
93 ARCH MAGE 100% HIGH WIZARD 6 0 0
94 MAELIFIC 100% POISON GIANT 7 0 50
95 VAMPIRE LORD 100% VAMPIRE 6 0 0
96 W E R D N A 100% VAMPIRE LORD 7 7 70
97 HIGH NINJA
0 0 0
98 HIGH PRIEST 100% HIGH NINJA 0 5 0
99 LVL 7 MAGE 100% HIGH PRIEST 4 0 0
100 LVL 7 FIGHTER 100% LVL 7 MAGE 0 0 0


Partner

When a monster encounter is selected, it will be in the first monster group. There is a chance that it will come with a “partner,” if it has one, in the second monster group. This is recursive; if the partner type is selected, then that partner also gets a chance of having its partner in the next group slot. There is a limit of 4 groups, or MazeLevel+1, whichever is lower.

For example, bubbly slimes have a partner value of 10% orc. So if you encounter them, there is a 10% chance that orcs will spawn too. If this happens, then since orcs have a partner value of 20% kobold, there would be a 20% chance of the orcs coming with kobolds, and so on.

Mage Level

The highest level of mage spell that the monster may cast.

Monster mage logic:
  • Monsters with any mage spells have a 75% of casting instead of attacking.
  • The monster then selects a random value from the right column of this table, according to the odds in the left column:

    71% 0
    20.59% 1
    5.97% 2
    1.73% 3
    0.5% 4
    0.15% 5
    0.06% 6
  • This number is subtracted from the Mage Level value, but it won’t drop below 1. 
  • Finally, the monster picks one of two spells within that level. There is a 66% chance of picking spell A, and a 34% chance of picking spell B.
  • After casting the spell, there is a 1 / (Monster group size + 2) chance that the group's mage level decreases by one point, affecting all individuals within it.

Monster mage spells (levels do not completely correspond to player spell levels):


A B
1 Katino Halito
2 Dilto Halito
3 Molito Mahalito
4 Dalto Lahalito
5 Lahalito Madalto
6 Madalto Zilwan
7 Tiltowait Tiltowait

It's curious that Zilwan is one of the spells, as it will never affect anyone in your party!

 

Priest Level

Priest spellcasting logic is a bit different.
  • A priest spellcaster who did not cast a mage spell has a 75% chance of casting a priest spell instead of attacking.
  • When casting a priest spell, monsters always select the highest value allowed.
  • There is still a 66% chance of selecting spell A and a 34% chance of selecting spell B.
  • There is a 1 / (Monster group size + 2) chance that the group's priest level decreases by one point. Same as with mage spells.


A B
1 Badios Badios
2 Montino Montino
3 Badios Badial
4 Badial Badial
5 Badialma Badi
6 Lorto Mabadi
7 Mabadi Mabadi

Spell Resistance

The monster’s percentage chance to resist certain spells. A resisted spell has no effect on the monster.

Spells subject to SpellResistance are:
Badios, Badial, Badialma, Litokan, Lorto, Malikto, Halito, Mahalito, Molito, Dalto, Lahalito, Madalto, Zilwan, Tiltowait


Id Name Elemental Resistance Abilities XP
0 BUBBLY SLIME Physical Magic
55
1 ORC Fire Sleep Run 235
2 KOBOLD Physical Cold Sleep Run 415
3 UNDEAD KOBOLD Fire Cold
230
4 ROGUE
Sleep Run 380
5 BUSHWACKER
Sleep Run 620
6 HIGHWAYMAN
Critical Sleep Run 840
7 ZOMBIE
Paralyze 520
8 CREEPING CRUD Cold Magic Poison 550
9 GAS CLOUD
Paralyze Run 350
10 LVL 1 MAGE
Sleep Run 475
11 LVL 1 PRIEST
Sleep Run 515
12 CREEPING COIN? Fire Cold Poison Drain Stone Call 920
13 LVL 1 NINJA
Critical Sleep 600
14 VORPAL BUNNY Cold Critical Run 735
15 CAPYBARA
Poison Run 520
16 GIANT TOAD Fire Poison Run 795
17 COYOTE Poison Drain Stone Run 780
18 LVL 3 PRIEST
Poison Sleep Run 990
19 LVL 3 SAMURAI
Run 795
20 LVL 3 NINJA
Poison Critical 1360
21 WERE BEAR Cold Poison Poison Paralyze Run 1320
22 DRAGON FLY Fire Sleep 1275
23 ROTTING CORPSE
Paralyze 680
24 OGRE
Sleep Run 960
25 HUGE SPIDER
Poison Sleep 600
26 WERERAT Magic Sleep 755
27 BORING BEETLE

1120
28 GAS DRAGON

2075
29 PRIESTESS
Sleep 870
30 SWORDSMAN
Sleep 960
31 HUGE SPIDER
Poison Sleep 600
32 ATTACK DOG
Sleep Run 1120
33 GARGOYLE Magic
2435
34 GRAVE MIST
Paralyze 1080
35 DRAGON PUPPY

2280
36 WEREWOLF Magic
975
37 SHADE Magic
875
38 BISHOP
Sleep 1135
39 MINOR DAIMYO
Sleep 1200
40 LVL 5 MAGE
Sleep 620
41 LVL 4 THIEF

740
42 KILLER WOLF

1460
43 SPIRIT Magic Poison 1245
44 GIANT SPIDER
Poison 960
45 WERETIGER Magic Poison Sleep 1405
46 MEDUSALIZARD
Stone 1040
47 LVL 5 PRIEST

1220
48 LVL 6 NINJA

1520
49 LVL 7 MAGE
Sleep 1000
50 MASTER THIEF
Sleep Run 960
51 MAJOR DAIMYO

2340
52 HIGH PRIEST

2160
53 CHAMP SAMURAI

2395
54 ARCH MAGE

790
55 MASTER THIEF
Run 1140
56 GAZE HOUND Magic Paralyze Run 1235
57 OGRE LORD

1790
58 TROLL

1720
59 LIFESTEALER Poison Drain Stone Magic
2240
60 NIGHTSTALKER Magic
1475
61 WYVERN
Poison 1540
62 LVL 8 PRIEST

1720
63 LVL 10 FIGHTER

1900
64 LVL 7 MAGE

1240
65 LVL 7 THIEF
Run 1220
66 LVL 8 NINJA
Critical 1020
67 EARTH GIANT Magic
20435
68 LESSER DEMON
Call 5100
69 CHIMERA Fire
3515
70 FIRE GIANT Fire
2115
71 GORGON

2920
72 LVL 8 BISHOP

2060
73 LVL 8 FIGHTER

2140
74 LVL 10 MAGE

1400
75 THIEF
Run 1640
76 MASTER NINJA
Critical 1280
77 MURPHY'S GHOST Fire Cold Poison Drain Stone Magic Sleep 4450
78 WILL O' WISP

42840
79 BLEEB Physical Fire Cold Poison Drain Stone Magic Run Call 3300
80 FROST GIANT Cold
40875
81 FIRE DRAGON

5000
82 HIGH PRIEST

3300
83 HIGH WIZARD Fire
2395
84 MASTER THIEF Poison Run 1935
85 HATAMOTO
Critical 1600
86 VAMPIRE Poison Drain Stone Paralyze 3330
87 GREATER DEMON
Poison Paralyze Call 44090
88 POISON GIANT

40840
89 DRAGON ZOMBIE

5200
90 RAVER LORD Fire
4155
91 THE HIGH MASTER Fire Cold Poison Drain Stone Magic Critical 3000
92 FLACK Physical Fire Cold Poison Drain Stone Magic Stone Poison Paralyze Critical 9200
93 ARCH MAGE

3160
94 MAELIFIC
Poison Paralyze 7460
95 VAMPIRE LORD
Paralyze 7320
96 W E R D N A Fire Cold Poison Stone Poison Paralyze Critical 15880
97 HIGH NINJA
Critical 1600
98 HIGH PRIEST

2200
99 LVL 7 MAGE
Sleep 1000
100 LVL 7 FIGHTER

1900

Elemental Resistance 

Spell damage from group targeting-spells is cut in half if the monster resists the corresponding element. Physical resistance does not affect non-spell damage!

Element Spells
Fire Litokan, Mahalito, Lahalito
Physical Lorto, Malikto, Molito, Tiltowait
Cold Dalto, Madalto

Poison, Drain, Stone, and Magic elemental resistances do nothing, because none of the group-targeting spells in Wizardry are aligned to those elements.

Abilities

  • Sleep – The only “bad” ability. Monsters with this ability are affected by Katino. Any others are not.
  • Run – If the monster party is demoralized, then each monster with this ability has a 65% chance to run each turn.
  • Critical – When the monster lands one or more successful hits, it has a [Level * 2%] chance, up to a maximum of 50%, to instantly kill.
  • Poison – Sets poison rate to 1 on a successful hit.
  • Paralyze – Inflicts paralysis on a successful hit.
  • Call – If the monster group has fewer than 5 monsters in it, then each monster has a 75% chance of calling for help instead of attacking. The chance that a call for help will be successful is (MonsterLevel * 5%).
  • Stone – Inflicts stone status on a successful hit.

XP calculation

Interestingly, the XP value of a monster is not actually part of the monster tables, but is calculated from the monster’s stats!

To get the XP value, calculate each line item, and then add them up.

If a line item’s governning stat is zero (AC excepted), then it doesn’t count. For instance, the second item uses MageLevel. If a monster’s MageLevel is zero, then the algorithm just skips that line item rather than plugging in a value of zero.
  • [Hit dice count] * [Hit dice sides] * 20 * [1 + HasBreath]
    • HasBreath = 0 normally, HasBreath = 1 if the monster uses a breath attack.
  • + 35 * 2^[MageLevel – 1]
  • + 35 * 2^[PriestLevel – 1]
  • + 200 * 2^[DrainLevel – 1]
  • + 90 * 2^[HealLevel – 1]
  • - 40 * [ArmorClass – 11]
  • + 30 * 2^[AttackCount – 1]
    • (only if the monster has at least two attacks!)
  • + 40 * 2^[SpellResistance/10]
  • + 10000 * 2^[SpellResistance/10 – 8]
    • (only if the monster has at least 80 Spell Resistance! This line item is due to a bug in the way Wizardry calculates multiplication of large numbers.)
  • + 35 * 2^[ElementalResistances – 1]
    • Count the number of elemental resistances EXCEPT for physical!
  • + 40 * 2^[Abilities -1]
    • Count the number of abilities, including sleep.


To illustrate this, I’ll show how the Greater Demon’s XP gets calculated.
  • [Hit dice count] * [Hit dice sides] * 20 * [1 + HasBreath]
    • 11 * 8 * 20 * [1+0]
    • 11 * 8 * 20 * 1
    • 1760
  • + 35 * 2^[MageLevel – 1]
    • + 35 * 2^[5-1]
    • + 35 * 2^4
    • + 35 * 16
    • + 560
  • + 90 * 2^[HealLevel – 1]
    • + 90 * 2^[1 – 1]
    • + 90 * 2^0
    • + 90 * 1
    • + 90
  • – 40 * [ArmorClass – 11]
    • – 40 * [-3-11]
    • – 40 * -14
    • + 560
  • + 30 * 2^[AttackCount – 1]
    • + 30 * 2^[5-1]
    • + 30 * 2^4
    • + 30 * 16
    • + 480
  • + 40 * 2^[SpellResistance/10]
    • + 40 * 2^[95/10]
    • + 40 * 2^9
    • + 40 * 512
    • + 20480
  • + 10000 * 2^[SpellResistance/10 – 8]
    • + 10000 * 2^[95/10 – 8]
    • + 10000 * 2^[9-8]
    • + 10000 * 2^1
    • + 10000 * 2
    • + 20000
  • + 40 * 2^[Abilities -1]
    • + 40 * 2^[3-1]
    • + 40 * 2^2
    • + 40 * 4
    • + 160

Summing them all up:
  • 1760
  • + 560
  • + 90
  • + 560
  • + 480
  • + 20480
  • + 20000
  • + 160
  • = 44090
If you followed that, you may have noticed that the SpellResistance accounted for most the total XP. I mentioned this before, but monsters with high Spell Resistance are always worth a lot of XP in Wizardry.

Next post I’ll go into the treasure system and items, and should be my last word on Wizardry I.

21 comments:

  1. Huh, I'm fairly sure later versions of Wizardry had Katino affect considerably more monsters than these.

    ReplyDelete
  2. Interesting to see. As a programmer, I'm curious. Can you elaborate on the bug in the XP calc related to the spell resistance?

    You mentioned in the maps section that there was another limited encounter that happens only 5 times. Is that a property of the map data then, since there isn't a corresponding 'unique 5' property here?

    ReplyDelete
    Replies
    1. Integers in Apple PASCAL are always 16-bits signed, which means there's no native method for handling integers greater than 32,767. Since XP rewards can be higher than that, multiple integers are used, as sort of a hacky way of implementing long integers, and Woodhead had to write custom routines to add, multiply, and exponentiate these long integers.

      This is the function used to add two long integers:
      PROCEDURE ADDLONGS( VAR FIRST: TWIZLONG; (* P010005 *)
      VAR SECOND: TWIZLONG);

      BEGIN
      FIRST.LOW := FIRST.LOW + SECOND.LOW;
      IF FIRST.LOW >= 10000 THEN
      BEGIN
      FIRST.MID := FIRST.MID + 1;
      FIRST.LOW := FIRST.LOW - 10000
      END;

      FIRST.MID := FIRST.MID + SECOND.MID;
      IF FIRST.MID >= 10000 THEN
      BEGIN
      FIRST.HIGH := FIRST.HIGH + 1;
      FIRST.MID := FIRST.MID - 10000
      END;

      FIRST.HIGH := FIRST.HIGH + SECOND.HIGH;
      IF FIRST.HIGH >= 10000 THEN
      BEGIN
      FIRST.HIGH := 9999;
      FIRST.MID := 9999;
      FIRST.LOW := 9999
      END
      END;

      Normally this would work fine. However, Woodhead performs exponential calculations like this:
      WHILE MULTIPLY > 0 DO
      BEGIN
      MULTIPLY := MULTIPLY - 1;
      ADDLONGS( KILLEXPX, KILLEXPX)
      END;

      Can you see the problem? If not, try walking through the code by hand. Assume that Multiply begins at 9, that KILLEXPX.LOW is initially 40, and bear in mind that Pascal passes arguments in by reference, not by value.

      Delete
    2. Regarding the maps, yes, this is a feature of the maps data blocks. The Unique property pertains to a monster class, not to an encounter. There are multiple monster types which can be encountered on that spot on Map 3, and they do not become extinct when you exhaust this encounter spot; they will continue to spawn randomly on the lower floors where they would naturally occur. It's the encounter spot itself that vanishes, reverting to a normal treasure room where the normal Map 3 encounter rates apply.

      The "Unique" property, once depleted to zero, indicates that the monster will never appear again, anywhere. It's maybe a bit confusing because the LVL 7 Fighters only appear in one spot on level 4 anyway, but to illustrate, suppose you hacked the disk images to make Kobolds "Unique 5." Each time you win a random encounter with Kobolds in the vanguard, its Unique property will decrement by 1, until hit hits 0, and then you will never fight Kobolds again. Should you randomly encounter Monster ID=2, the engine will recognize that this monster is gone, and you'll get their partners, Orcs, instead. The Orcs themselves have a 20% chance of coming with Kobold buddies. Instead you get more Orcs.

      And for more fun hypotheticals, suppose you hack the counter of Murphy's Ghosts and make them extinct. Since their partners are also Murphy's Ghosts, you'll send Wizardry into an infinite loop and freeze the game should you encounter any. I've done it!

      Delete
    3. Oh, and from a programmer's perspective, "Unique" can be any signed 16-bit integer value. Any negative value is essentially infinity, and in fact, every monster except for LVL 7 Fighters are "Unique -1." The Unique property is ignored if it's less than zero.

      I only listed the property as "Unique 1" because the only monster in the game that uses it in a meaningful way, has a value of 1.

      Map encounter spots also have auto-decrementing "Unique" properties, but the fixed fight in Map 3 is the only one with a positive value. For almost all others, it's -1, i.e. infinite. The Thundarr encounter in Level 6 is 0 in most copies, but is -1 in mine. The various messages and fire dragons on the west block in Level 7 are 0 in all extant copies, including mine.

      Delete
    4. I think I see what the problem is with the code, but isn’t that second routine you copied just multiplication? Presumably exponentiation would need a third routine to call it.

      That’s funny he was effectively working in base 10000, but did he really need a third place for anything (i.e. numbers larger than 1e8)?

      Delete
    5. ADDLONGS(KILLEXPX, KILLEXPX) is meant to double the value of KILLEXPX each time it is called. So, the loop is meant to be the equivalent of this pseudocode:
      KILLEXPX := KILLEXPX * 2^MULTIPLY

      Delete
    6. Ah, right, because Killexp gets reassigned each time through. Yuck, it’s like a functional programmer’s nightmare, but then this *is* 1981.

      Delete
    7. Right, I see the bug. Whenever you overflow the LOW and MID gets incremented, next the MIDs of both first and second are added together, and because both sides are actually the same reference, the second MID is also already incremented by the LOW step, so you get extra large bonus XP.
      If the numbers were large enough, this same bug would apply to the HIGH step.

      This is clearly homespun code. I don't think I've ever seen anyone implement higher bit math in this fashion. But understandable, given that in 1980 you can't just google the best practices of how to do something :P

      Thanks for elaborating on both questions! That was fascinating.

      Delete
  3. Great work, this is really fascinating, especially having just played it.

    ReplyDelete
  4. So I just realized that my class friendliness odds were completely wrong this whole time. Updated them.

    ReplyDelete
  5. On closer examination of the reverse-engineered code, it turns out that not only does nothing in the game inflict the AFRAID effect on either monsters or player characters, but also that nothing inflicts PARALYZE on monsters either. (Of course, characters can be PARALYZEd.) The MANIFO spell claims to "hold" monsters in its visible output, but under the hood it turns out that it inflicts ASLEEP status, which wears off accordingly. (Look at procedures DOSLEEP, DOHOLD, and ISISNOT. The key is ISISNOT's final parameter DAMTYPE, which is 3 when it's called from DOSLEEP and 0 when it's called from DOHOLD, but which sets status to ASLEEP in both cases.)

    ReplyDelete
  6. There's an extra complication related to monster mage and priest spell levels. Everything you report on this here is correct, but when a monster decides to cast a mage or priest spell and calls GETMAGSP or GETPRISP, respectively, there is a chance that the spell level for the monster's group (the maximum mage spell level for GETMAGSP, and the priest spell level for GETPRISP) will be *reduced* for subsequent mage or priest spell casts for every monster in that group. This happens when the corresponding procedure calls SPELLEZR, with either BATTLERC[ GROUPI].B.MAGSPELS or BATTLERC[ GROUPI].B.PRISPELS as its reference parameter. There is a chance of 1 in (BATTLERC[ GROUPI].A.ALIVECNT + 2), or 1 in (living group population plus 2) that this reference parameter will be decremented by 1, which would affect all subsequent calls to GETMAGSP or GETPRISP for that group. (I think I may have seen this effect once, long before I understood it, when I saw a priest cast a spell that I thought shouldn't have been possible for its spell level, but if other priests in that group had reduced the spell level by previous casting, it would explain things.)

    ReplyDelete
    Replies
    1. Am I correct in my interpretation of the code, that this affects the monster group permanently? E.g. - Werdna can only ever cast Tiltowait on you once, and only if it's the first spell he casts on you.

      Delete
    2. Yes, it permanently affects the monster group. I think the idea is to (very crudely) simulate the fact that monster spellcasters should have a limited supply of spells.

      But your suggested example with Werdna interprets things a bit too harshly. Remember that there's a "+ 2" in the chance roll which determines whether the maximum spell level gets decremented. Werdna is in a group by himself with an ALIVECNT of 1, so the + 2 makes the roll a 1-in-3 chance: each time Werdna casts any spell, he has a 1-in-3 chance of losing all further opportunity to cast TILTOWAIT.

      Delete
    3. Ah, right. I forgot about the +2 modifier.

      Delete
  7. A comment on breath attacks: you write, "Breath attacks hit all players for damage equal to half of the monster’s remaining HP. Characters equipped with an item with that elemental resistance, or who make a saving throw against breath will take half damage." The way this is written, it sounds like breath damage can only be reduced by half, either by elemental protection or making one's saving throw. Actually, the effect is cumulative, so if a character has protection against the breath element *and* makes the saving through, the character only takes about a quarter of the normal damage. One more picky point: the division in "half of the monster's remaining HP" is rounded down, while that in "half damage" (from either saving throw or elemental protection) is rounded *up*.

    ReplyDelete
  8. hello Abab. I notice twice with the entries of MAELIFIC, you listed "1d0"? How does a 0 sided die work?

    ReplyDelete
    Replies
    1. Short answer is that "1d0" always resolves to zero, and consequently "1d0 +1" resolves to 1. I am not 100% certain of this, but I'm pretty sure of it. I'm also pretty sure that this is a data entry error and it was meant to be "1d1," but the end result is the same.

      The code for resolving dice rolls looks like this:
      BEGIN
      POINTS := 0;
      WHILE HITHEAL.HITS > 0 DO
      BEGIN
      POINTS := POINTS + (RANDOM MOD HITHEAL.HITRANGE) + 1;
      HITHEAL.HITS := HITHEAL.HITS - 1
      END;
      CALCPTS := POINTS + HITHEAL.HITMIN
      END;

      HITHEAL.HITS is the number of dice. HITHEAL.HITRANGE is the number of sides. HITHEAL.HITMIN is the plus bonus. CALCPTS is the return value.

      MOD 0 would throw an error. I'm not sure how Apple Pascal handles errors, but my guess is that the code would escape the BEGIN/END block and continue running at this line:
      CALCPTS := POINTS + HITHEAL.HITMIN

      ...which would essentially be adding 1 to 0 and returning the sum.

      Delete

Most popular posts