Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *******************************************************************************
- * *
- * Dragon Warrior (NES) Formulas v1.0 *
- * By Ryan8bit *
- * generalkillt@yahoo.com *
- * 01/07/11 *
- * *
- *******************************************************************************
- Table of Contents
- -------------------
- I. Introduction
- II. Simplified Formulas
- A. Journeying
- B. Combat
- C. Chests
- D. Name choice and stats
- III. Precise Formulas and Code
- A. Common algorithms
- B. Journeying
- C. Combat
- D. Chests
- E. Name choice and stats
- IV. Frequently Asked Questions
- *******************************************************************************
- * I. Introduction *
- *******************************************************************************
- I had often been curious about the formulas used to calculate damage and all
- sorts of other things in Dragon Warrior. Mostly I wanted to make games based
- on it, but I also wanted to use them to build a simulator of the game that
- could crank out data that could be analyzed. I have since learned the assembly
- language of the NES in order to learn all I could about the game's mechanics.
- With that knowledge, I have programmed my simulator which I will have a FAQ
- like this one for at a later date.
- So for whatever purpose you may have, I hope you get usage out of these
- formulas.
- I've broken down the sections into simple and complex, so that if you just want
- to get the general idea you want section II. If you're more into exact
- formulas and some actual code, you want section III.
- *******************************************************************************
- * II. Simplified Formulas *
- *******************************************************************************
- These formulas are simplified and as a result may not be exact when it comes to
- rounding. For more advanced assembly code formulas, see section III.
- *************************
- A. Journeying
- *************************
- -= Items and Spells =-
- Herb: +23-30 HP
- HEAL: +10-17 HP
- HEALMORE: +85-100 HP
- Torch: Unlimited
- Radiant: 200 total steps
- Radius of 3 squares: 80 steps
- Radius of 2 squares: 60 steps
- Radius of 1 square : 60 steps
- REPEL: 128 total steps
- Only works against enemies who have strength that is less than the
- hero's defense.
- Fairy Water has the exact same effect.
- The Silver Harp summons a Slime, Red Slime, Drakee, Ghost, Magician, or
- Scorpion, all with roughly equal chance.
- -= Encounters =-
- The chances for an encounter on the overworld vary by terrain type, and by
- location. For every step you take, you have a random chance to enter combat.
- In the zones where you fight only Slimes and Red Slimes around Tantegel (which
- I call Zone 0), the encounter rates are significantly lower.
- Zone 0
- Grasslands: 1/48
- Bridge: 1/48
- Forest: 1/32
- Hills: 1/32
- Desert: 1/16 (There is only one square of desert in this region)
- Every other zone, including dungeons
- Grasslands: 1/24
- Swamp: 1/16
- Forest: 1/16
- Hills: 1/8
- Desert: 1/8
- Stairs: 1/24
- Chest: 1/24
- Barrier: 1/16
- Brick: 1/16
- -= Monster Sets =-
- The entire world map is broken down into an 8x8 grid. Each cell of the grid
- has a different zone, or set of enemies. This is a representation of the grids
- corresponding to zone number:
- 3 3 2 2 3 5 4 5
- 3 2 1 2 3 3 4 5
- 4 1 0 0 1 3 4 5
- 5 1 1 12 9 6 6 6
- 5 5 4 12 12 7 7 7
- 10 9 8 12 12 12 8 7
- 10 10 11 12 13 13 9 8
- 11 11 12 13 13 12 9 9
- So for instance, the top left corner represents the 15x15 tile area surrounding
- Garinham. http://www.gamefaqs.com/console/nes/file/563408/55534 is a good
- example of this visually.
- Every zone has five possible enemies in them, and some are duplicates. The
- chances of encountering each one is roughly equal.
- Zone 0: Slime, Red Slime, Slime, Red Slime, Slime
- Zone 1: Red Slime, Slime, Red Slime, Drakee, Red Slime
- Zone 2: Slime, Ghost, Drakee, Ghost, Red Slime
- Zone 3: Red Slime, Red Slime, Drakee, Ghost, Magician
- Zone 4: Ghost, Magician, Magidrakee, Magidrakee, Scorpion
- Zone 5: Ghost, Magician, Magidrakee, Scorpion, Skeleton
- Zone 6: Magidrakee, Scorpion, Skeleton, Warlock, Wolf
- Zone 7: Skeleton, Warlock, Metal Scorpion, Wolf, Wolf
- Zone 8: Metal Scorpion, Wraith, Wolflord, Wolflord, Goldman
- Zone 9: Wraith, Wyvern, Wolflord, Wyvern, Goldman
- Zone 10: Wyvern, Rogue Scorpion, Wraith Knight, Knight, Demon Knight
- Zone 11: Wraith Knight, Knight, Magiwyvern, Demon Knight, Metal Slime
- Zone 12: Knight, Magiwyvern, Demon Knight, Werewolf, Starwyvern
- Zone 13: Werewolf, Green Dragon, Starwyvern, Starwyvern, Wizard
- Zone 14: Poltergeist, Droll, Drakeema, Skeleton, Warlock
- Zone 15: Specter, Wolflord, Druinlord, Drollmagi, Wraith Knight
- Zone 16: Werewolf, Green Dragon, Starwyvern, Wizard, Axe Knight
- Zone 17: Wizard, Axe Knight, Blue Dragon, Blue Dragon, Stoneman
- Zone 18: Wizard, Stoneman, Armored Knight, Armored Knight, Red Dragon
- Zone 19: Ghost, Magician, Scorpion, Druin, Druin
- *************************
- B. Combat
- *************************
- -=Enemies=-
- These are all the stats of the enemies:
- Strength is used in figuring out how much damage will be done to you.
- Agility is used in figuring out how much damage will be reduced for the enemy,
- and it is used to determine how hard it is for you to run away.
- HP is how many hit points the enemy has, and this typically varies.
- SLEEP resist, STOPSPELL resist, and HURT resist are the chances that the spell
- will have no effect on the enemy. HURT and HURTMORE have the same chance.
- Dodge is the chance that the enemy will dodge any physical attack.
- GP is how much gold will be awarded, and this typically varies.
- XP is how many experience points will be awarded to you.
- Pattern is what the enemy decides to do when attacking. It starts with the
- first line and if it doesn't do that attack, it moves to the next line.
- #00 : Slime
- Strength: 5
- Agility: 3
- HP: 3
- SLEEP resist: 0 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 1
- GP: 1
- Pattern: Attack only
- #01 : Red Slime
- Strength: 7
- Agility: 3
- HP: 4
- SLEEP resist: 0 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 1
- GP: 2
- Pattern: Attack only
- #02 : Drakee
- Strength: 9
- Agility: 6
- HP: 5 - 6
- SLEEP resist: 0 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 2
- GP: 2
- Pattern: Attack only
- #03 : Ghost
- Strength: 11
- Agility: 8
- HP: 6 - 7
- SLEEP resist: 0 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 4 / 64
- XP: 3
- GP: 3 - 4
- Pattern: Attack only
- #04 : Magician
- Strength: 11
- Agility: 12
- HP: 10 - 13
- SLEEP resist: 0 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 4
- GP: 9 - 11
- Pattern: 50 % to cast HURT
- Otherwise attack
- #05 : Magidrakee
- Strength: 14
- Agility: 14
- HP: 12 - 15
- SLEEP resist: 0 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 5
- GP: 9 - 11
- Pattern: 50 % to cast HURT
- Otherwise attack
- #06 : Scorpion
- Strength: 18
- Agility: 16
- HP: 16 - 20
- SLEEP resist: 0 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 6
- GP: 12 - 15
- Pattern: Attack only
- #07 : Druin
- Strength: 20
- Agility: 18
- HP: 17 - 22
- SLEEP resist: 0 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 7
- GP: 12 - 15
- Pattern: Attack only
- #08 : Poltergeist
- Strength: 18
- Agility: 20
- HP: 18 - 23
- SLEEP resist: 0 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 0 / 16
- Dodge: 6 / 64
- XP: 8
- GP: 13 - 17
- Pattern: 75 % to cast HURT
- Otherwise attack
- #09 : Droll
- Strength: 24
- Agility: 24
- HP: 19 - 25
- SLEEP resist: 0 / 16
- STOPSPELL resist: 14 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 10
- GP: 18 - 24
- Pattern: Attack only
- #10 : Drakeema
- Strength: 22
- Agility: 26
- HP: 16 - 20
- SLEEP resist: 2 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 0 / 16
- Dodge: 6 / 64
- XP: 11
- GP: 15 - 19
- Pattern: 25 % to cast HEAL, but only if its HP < 1/4 of its max HP
- Otherwise 50 % to cast HURT
- Otherwise attack
- #11 : Skeleton
- Strength: 28
- Agility: 22
- HP: 23 - 30
- SLEEP resist: 0 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 4 / 64
- XP: 11
- GP: 22 - 29
- Pattern: Attack only
- #12 : Warlock
- Strength: 28
- Agility: 22
- HP: 23 - 30
- SLEEP resist: 3 / 16
- STOPSPELL resist: 1 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 13
- GP: 26 - 34
- Pattern: 25 % to cast SLEEP, but only if you're not asleep
- Otherwise 50 % to cast HURT
- Otherwise attack
- #13 : Metal Scorpion
- Strength: 36
- Agility: 42
- HP: 17 - 22
- SLEEP resist: 0 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 14
- GP: 30 - 39
- Pattern: Attack only
- #14 : Wolf
- Strength: 40
- Agility: 30
- HP: 26 - 34
- SLEEP resist: 1 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 16
- GP: 37 - 49
- Pattern: Attack only
- #15 : Wraith
- Strength: 44
- Agility: 34
- HP: 28 - 36
- SLEEP resist: 7 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 0 / 16
- Dodge: 4 / 64
- XP: 17
- GP: 45 - 59
- Pattern: 25 % to cast HEAL, but only if its HP < 1/4 of its max HP
- Otherwise attack
- #16 : Metal Slime
- Strength: 10
- Agility: 255
- HP: 4
- SLEEP resist: 15 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 15 / 16
- Dodge: 1 / 64
- XP: 115
- GP: 4 - 5
- Pattern: 75 % to cast HURT
- Otherwise attack
- #17 : Specter
- Strength: 40
- Agility: 38
- HP: 28 - 36
- SLEEP resist: 3 / 16
- STOPSPELL resist: 1 / 16
- HURT resist: 0 / 16
- Dodge: 4 / 64
- XP: 18
- GP: 52 - 69
- Pattern: 25 % to cast SLEEP, but only if you're not asleep
- Otherwise 75 % to cast HURT
- Otherwise attack
- #18 : Wolflord
- Strength: 50
- Agility: 36
- HP: 29 - 38
- SLEEP resist: 4 / 16
- STOPSPELL resist: 7 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 20
- GP: 60 - 79
- Pattern: 50 % to cast STOPSPELL, but only if your spell isn't blocked
- Otherwise attack
- #19 : Druinlord
- Strength: 47
- Agility: 40
- HP: 27 - 35
- SLEEP resist: 15 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 0 / 16
- Dodge: 4 / 64
- XP: 20
- GP: 63 - 84
- Pattern: 75 % to cast HEAL, but only if its HP < 1/4 of its max HP
- Otherwise 25 % to cast HURT
- Otherwise attack
- #20 : Drollmagi
- Strength: 52
- Agility: 50
- HP: 29 - 38
- SLEEP resist: 2 / 16
- STOPSPELL resist: 2 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 22
- GP: 67 - 89
- Pattern: 50 % to cast STOPSPELL, but only if your spell isn't blocked
- Otherwise attack
- #21 : Wyvern
- Strength: 56
- Agility: 48
- HP: 32 - 42
- SLEEP resist: 4 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 24
- GP: 75 - 99
- Pattern: Attack only
- #22 : Rogue Scorpion
- Strength: 60
- Agility: 90
- HP: 27 - 35
- SLEEP resist: 7 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 26
- GP: 82 - 109
- Pattern: Attack only
- #23 : Wraith Knight
- Strength: 68
- Agility: 56
- HP: 35 - 46
- SLEEP resist: 5 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 3 / 16
- Dodge: 4 / 64
- XP: 28
- GP: 90 - 119
- Pattern: 75 % to cast HEAL, but only if its HP < 1/4 of its max HP
- Otherwise attack
- #24 : Golem
- Strength: 120
- Agility: 60
- HP: 53 - 70
- SLEEP resist: 15 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 15 / 16
- Dodge: 0 / 64
- XP: 5
- GP: 7 - 9
- Pattern: Attack only
- #25 : Goldman
- Strength: 48
- Agility: 40
- HP: 38 - 50
- SLEEP resist: 13 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 6
- GP: 150 - 199
- Pattern: Attack only
- #26 : Knight
- Strength: 76
- Agility: 78
- HP: 42 - 55
- SLEEP resist: 6 / 16
- STOPSPELL resist: 7 / 16
- HURT resist: 0 / 16
- Dodge: 1 / 64
- XP: 33
- GP: 97 - 129
- Pattern: 50 % to cast STOPSPELL, but only if your spell isn't blocked
- Otherwise attack
- #27 : Magiwyvern
- Strength: 78
- Agility: 68
- HP: 44 - 58
- SLEEP resist: 2 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 0 / 16
- Dodge: 2 / 64
- XP: 34
- GP: 105 - 139
- Pattern: 50 % to cast SLEEP, but only if you're not asleep
- Otherwise attack
- #28 : Demon Knight
- Strength: 79
- Agility: 64
- HP: 38 - 50
- SLEEP resist: 15 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 15 / 16
- Dodge: 15 / 64
- XP: 37
- GP: 112 - 149
- Pattern: Attack only
- #29 : Werewolf
- Strength: 86
- Agility: 70
- HP: 46 - 60
- SLEEP resist: 7 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 0 / 16
- Dodge: 7 / 64
- XP: 40
- GP: 116 - 154
- Pattern: Attack only
- #30 : Green Dragon
- Strength: 88
- Agility: 74
- HP: 49 - 65
- SLEEP resist: 7 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 2 / 16
- Dodge: 2 / 64
- XP: 45
- GP: 120 - 159
- Pattern: 25 % to breathe fire
- Otherwise attack
- #31 : Starwyvern
- Strength: 86
- Agility: 80
- HP: 49 - 65
- SLEEP resist: 8 / 16
- STOPSPELL resist: 0 / 16
- HURT resist: 1 / 16
- Dodge: 2 / 64
- XP: 43
- GP: 120 - 159
- Pattern: 75 % to cast HEALMORE, but only if its HP < 1/4 of its max HP
- Otherwise 25 % to breathe fire
- Otherwise attack
- #32 : Wizard
- Strength: 80
- Agility: 70
- HP: 49 - 65
- SLEEP resist: 15 / 16
- STOPSPELL resist: 7 / 16
- HURT resist: 15 / 16
- Dodge: 2 / 64
- XP: 50
- GP: 123 - 164
- Pattern: 50 % to cast HURTMORE
- Otherwise attack
- #33 : Axe Knight
- Strength: 94
- Agility: 82
- HP: 53 - 70
- SLEEP resist: 15 / 16
- STOPSPELL resist: 3 / 16
- HURT resist: 1 / 16
- Dodge: 1 / 64
- XP: 54
- GP: 123 - 164
- Pattern: 25 % to cast SLEEP, but only if you're not asleep
- Otherwise attack
- #34 : Blue Dragon
- Strength: 98
- Agility: 84
- HP: 53 - 70
- SLEEP resist: 15 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 7 / 16
- Dodge: 2 / 64
- XP: 60
- GP: 112 - 149
- Pattern: 25 % to breathe fire
- Otherwise attack
- #35 : Stoneman
- Strength: 100
- Agility: 40
- HP: 121 - 160
- SLEEP resist: 2 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 7 / 16
- Dodge: 1 / 64
- XP: 65
- GP: 105 - 139
- Pattern: Attack only
- #36 : Armored Knight
- Strength: 105
- Agility: 86
- HP: 68 - 90
- SLEEP resist: 15 / 16
- STOPSPELL resist: 7 / 16
- HURT resist: 1 / 16
- Dodge: 2 / 64
- XP: 70
- GP: 105 - 139
- Pattern: 75 % to cast HEALMORE, but only if its HP < 1/4 of its max HP
- Otherwise 25 % to cast HURTMORE
- Otherwise attack
- #37 : Red Dragon
- Strength: 120
- Agility: 90
- HP: 76 - 100
- SLEEP resist: 15 / 16
- STOPSPELL resist: 7 / 16
- HURT resist: 15 / 16
- Dodge: 2 / 64
- XP: 100
- GP: 105 - 139
- Pattern: 25 % to cast SLEEP, but only if you're not asleep
- Otherwise 25 % to breathe fire
- Otherwise attack
- #38 : Dragonlord first form
- Strength: 90
- Agility: 75
- HP: 76 - 100
- SLEEP resist: 15 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 15 / 16
- Dodge: 0 / 64
- XP: 0
- GP: 0
- Pattern: 25 % to cast STOPSPELL, but only if your spell isn't blocked
- Otherwise 75 % to cast HURTMORE
- Otherwise attack
- #39 : Dragonlord second form
- Strength: 140
- Agility: 200
- HP: 130
- SLEEP resist: 15 / 16
- STOPSPELL resist: 15 / 16
- HURT resist: 15 / 16
- Dodge: 0 / 64
- XP: 0
- GP: 0
- Pattern: 50 % to breathe a very strong fire
- Otherwise attack
- -=Enemy attack formulas=-
- ~Attacks~
- There are two formulas for attack damage for enemies. The standard range is
- from:
- (EnemyStrength - HeroDefense / 2) / 4,
- to:
- (EnemyStrength - HeroDefense / 2) / 2
- The hero's defense is equal to his agility / 2 rounded down, plus the modifiers
- for his equipment.
- The other type of attack happens if your defense power is greater than or equal
- to the enemy's strength. In that case, the range is from:
- 0
- to:
- (enemyStrength + 4) / 6
- ~Spells~
- NOTE: Enemy HURT and HEAL classes of spells have different ranges than the
- hero's spells.
- HURT does 3 - 10 damage
- HURTMORE does 30 - 45 damage
- Both Magic Armor and Erdrick's Armor will reduce HURT spells by 1/3. So:
- HURT does 2 - 6 damage vs. Erdrick's and Magic Armor
- HURTMORE does 20 - 30 damage vs. Erdrick's and Magic Armor
- SLEEP always puts you to sleep, and there is no resisting it. Waking up from
- sleep is a 50/50 chance, but because of the limitations of the game programming
- it's not possible for it to last for more than 6 turns.
- STOPSPELL has a 50/50 chance of working against you. If you have Erdrick's
- Armor it has no chance of working.
- HEAL recovers 20 - 27 HP
- HEALMORE recovers 85 - 100 HP
- ~Fire breath~
- There are two types of fire breath. Only the Dragonlord's second form has the
- stronger breath. The rest of the enemies that have breath attacks only have
- the weaker type of breath.
- Weak breath does 16 - 23 damage
- Strong breath does 65 - 72 damage
- The only thing that protects against fire breath is Erdrick's Armor, which
- reduces the damage by 1/3. So:
- Weak breath vs. Erdrick's Armor does 10 - 14 damage
- Strong breath vs. Erdrick's Armor does 42 - 48 damage
- -=Hero attack formulas=-
- ~Attacks~
- All enemies except the Golem and the Dragonlord have the capability of dodging
- any attack, including excellent moves, as is listed in the enemy chart above.
- Just like the standard enemy attack, the range for the hero's standard attack
- damage is from:
- (HeroAttack - EnemyAgility / 2) / 4,
- to:
- (HeroAttack - EnemyAgility / 2) / 2
- If the damage done is less than 1, then there is 50/50 chance that you will do
- either no damage, or 1 damage.
- Excellent moves have a 1/32 chance of happening per attack, and the formulas
- completely ignore the defense of the enemy. They range from:
- Hero attack / 2
- to:
- Hero attack
- Unfortunately, excellent moves are not possible against either form of the
- Dragonlord. They can also be dodged.
- ~Spells~
- Hero spells have different ranges than enemy spells.
- HURT does 5 - 12 damage
- HURTMORE does 58 - 65 damage
- SLEEP effectiveness depends on the enemy's SLEEP resist stat. You're always
- guaranteed one turn of attack, and after that turn it is a 1/3 chance that the
- enemy will wake up.
- STOPSPELL effectiveness depends on the enemy's STOPSPELL resist stat. It never
- loses its effect.
- -=Running=-
- Enemy: If your strength is two times the enemy's strength or more, there is a
- 25% chance the enemy will run when it's given a turn. The enemy also makes
- this check right upon encounter, so he may get a chance to run right away
- regardless of initiative.
- Hero: Certain groups of monsters have higher chances of blocking your running.
- The more difficult an enemy is, it may belong to a group that is better at
- blocking.
- Group 1: #00 (Slime) - #19 (Druinlord)
- Group 2: #20 (Drollmagi) - #29 (Werewolf)
- Group 3: #30 (Green Dragon) - #34 (Blue Dragon)
- Group 4: #35 (Stoneman) - #39 (Dragonlord second form)
- So for instance, group 4 will block you much easier than group 1 will. On top
- of that is a test of agility. The test goes like this:
- If HeroAgility * Random # < EnemyAgility * Random # * GroupFactor, then the
- enemy will block you.
- Random # is a random number between 0 and 255.
- GroupFactor depends on the group:
- Group 1: 0.25
- Group 2: 0.375
- Group 3: 0.5
- Group 4: 1.0
- So you can see that enemies in group 1 are going to have a much lower product
- than enemies in group 4, meaning that it will be more likely that your product
- will be higher and that you will get away.
- And yes, it is possible to run from the Dragonlord, although you will repeat
- the same dialog and have to fight the first form again. You can also run from
- the Axe Knight in Hauksness, the Golem outside Cantlin, and the Green Dragon in
- the Marsh Cave, but it will put you back a spot so that you can't just skip
- them and get their prize.
- Also worth noting is that if the monster is asleep, you can run away every
- time.
- -=Initiative=-
- This is the same equation as running from enemies in Group 1, except instead of
- being blocked, the enemy will go first.
- *************************
- C. Chests
- *************************
- -=Shrine west of Kol=-
- Staff of Rain
- -=Charlock=-
- B2:
- Erdrick's Sword
- B7:
- Two Herbs, 500 - 755 gold, Magic Key, Wings, Cursed Belt
- -=Garinham=-
- Back room:
- 10 - 17 gold, Torch, Herb
- -=Grave of Garinham=-
- B1:
- 6-13 gold, 5-20 gold, Herb
- B3:
- Cursed Belt, Silver Harp
- -=Erdrick's Cave=-
- B2: Erdrick's Tablet
- -=Mountain Cave=-
- B1:
- Herb
- B2:
- Fighter's Ring, Torch, 10 - 17 gold, 100 - 131 gold (this chest can also be the
- Death Necklace, which is a 1/32 chance, and can only be obtained once)
- -=Rimuldar=-
- Wings
- -=Tantegel=-
- Throne Room:
- 120 gold, Torch, Magic Key
- Treasury:
- All chests are 6 - 13 gold
- Basement:
- Stones of Sunlight
- -=The treasure chest bug=-
- The handling of treasure chests in Dragon Warrior was done in a very strange
- way. Whenever you take a chest, it doesn't simply check to see if you are
- standing on a chest, but rather it checks what your position is on the map and
- it checks if you've already taken a chest at that position. These positions
- are loaded into a collection of numbers. Whenever you leave a town or cave,
- this collection is wiped clean, which in part is why chests reappear when you
- re-enter. The only time this collection is not cleared is when you die because
- it was an oversight on the part of the programmers, which was later corrected
- in sequels to the game. Because the data is not cleared, it thinks you still
- picked up those specific chests at those specific coordinates.
- Another thing is that whenever you enter the throne room in Tantegel, the
- original three chests that were in that room are placed into this collection to
- make certain you don't get them again. So if you die in one cave after having
- collected two chests, that makes the total chests it thinks you've collected as
- five. Because the maximum number of chest positions the game alotted is eight,
- that makes it so that when we pick up the fourth chest in the treasury, that it
- would be the ninth chest. Because the collection is full, it can't store that
- ninth chest's position, and therefore that position will never be on that list
- when you hit take. So if the game can't find that position on the list, the
- chest never disappears.
- The bug allows you to pull as much gold as you want, which effectively gives
- you lots of gold really fast, and allows you to buy some of the best equipment
- very early in the game.
- *************************
- D. Name choice and stats
- *************************
- The name you choose to give your hero will affect your stats and stat growth,
- so it becomes very important. Only the first four letters of the name are used
- in this calculation. Each letter has a corresponding numerical value, and they
- are added up to find the result.
- This is a simplification of those corresponding numbers:
- a b c d e f
- g h i j k l m n o p q r s t u v
- w x y z A B C D E F G H I J K L
- M N O P Q R S T U V W X Y Z
- ' . , - ? ! ) (
- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- Take the values of the first four letters and add them up. This is our sum. If
- you divide that sum by 4, and take the remainder, that is your growth type.
- There are 4 different growth types, with each one focusing on two particular
- stats that will be reduced in the long term, but will be higher in the short
- term.
- Type 0: Long term HP and MP, short term Strength and Agility
- Type 1: Long term Strength and HP, short term Agility and MP
- Type 2: Long term Agility and MP, short term Strength and HP
- Type 3: Long term Strength and Agility, short term HP and MP
- So below is a chart with all the stat numbers at each level. If you have long
- term growth in that category, then the number is unchanged. If you have short
- term growth in that category, then there is some math to get the adjusted
- number. Take the sum from above and divide by 4 again, this time rounding
- down. Take that number, divide by 4, and take the remainder. Take this number
- and add it to 9/10 of the number on the chart to get your final value.
- Level Strength Agility HP MP
- 1 4 4 15 0
- 2 5 4 22 0
- 3 7 6 24 5
- 4 7 8 31 16
- 5 12 10 35 20
- 6 16 10 38 24
- 7 18 17 40 26
- 8 22 20 46 29
- 9 30 22 50 36
- 10 35 31 54 40
- 11 40 35 62 50
- 12 48 40 63 58
- 13 52 48 70 64
- 14 60 55 78 70
- 15 68 64 86 72
- 16 72 70 92 95
- 17 72 78 100 100
- 18 85 84 115 108
- 19 87 86 130 115
- 20 92 88 138 128
- 21 95 90 149 135
- 22 97 90 158 146
- 23 99 94 165 153
- 24 103 98 170 161
- 25 113 100 174 161
- 26 117 105 180 168
- 27 125 107 189 175
- 28 130 115 195 180
- 29 135 120 200 190
- 30 140 130 210 200
- So as an example, I'll use the name Erdrick at level 20 and do the math.
- So I'll look up the values for the first four letters:
- E: 8
- r: 11
- d: 13
- r: 11
- My sum is then 8 + 11 + 13 + 11 = 43
- My growth type is the remainder of 43 / 4, which is 3. Growth type 3 is long
- term Strength and Agility, so I can automatically pick those numbers off of the
- chart. My strength is 92 and my agility is 88.
- So now I need to find my short term stats. Again I take 43 / 4, but I round it
- down this time, giving me 10. I will take that result, divide by 4, and take
- the remainder, which is 2. So I will take that number and add it to 9/10 of
- what the base stat is. For HP it is 138, so 138 * 9/10 + 2 will give me the
- result, which is 126. Doing the same process for MP I will get 117.
- So my stats end up as:
- Strength: 92
- Agility: 88
- HP: 126
- MP: 117
- *******************************************************************************
- * III. Precise Formulas and Code *
- *******************************************************************************
- These are the advanced formulas that will reference assembly language straight
- from the game. Before reading onward, there are several algorithms you must be
- aware of.
- *************************
- A. Common algorithms
- *************************
- First and foremost is the random generator subroutine, which is located at
- $C55B. It generates a random number between 0 and 255, which for future
- reference I will refer to as RAND. This number is stored at $95. Here's how
- it works:
- The code What it does
- ------------------------- --------------------------------------------------
- $C55B:A5 95 LDA $0095 Load up the previous random number.
- $C55D:85 3D STA $003D Put it into $3D.
- $C55F:A5 94 LDA $0094 Load up the random number's lower byte.
- $C561:85 3C STA $003C Put it into $3C.
- $C563:06 94 ASL $0094
- $C565:26 95 ROL $0095 Multiply $9495 by 2.
- $94 is the lower byte and $95 is the higher byte. Together they are used as
- one larger number. This is apparent by doing the ASL on $94, and carrying the
- overflow into $95. These byte pairs will be referred to as $9495 and $3C3D.
- The code What it does
- ------------------------- --------------------------------------------------
- $C567:18 CLC
- $C568:65 94 ADC $0094 Add $3C3D to the new $9495.
- $C56A:85 94 STA $0094
- $C56C:A5 95 LDA $0095
- $C56E:65 3D ADC $003D
- $C570:85 95 STA $0095
- $C572:A5 94 LDA $0094 Add $94 to $95.
- $C574:18 CLC
- $C575:65 95 ADC $0095
- $C577:85 95 STA $0095
- $C579:A5 94 LDA $0094 Add 0x81 to $9495.
- $C57B:18 CLC
- $C57C:69 81 ADC #$81
- $C57E:85 94 STA $0094
- $C580:A5 95 LDA $0095
- $C582:69 00 ADC #$00
- $C584:85 95 STA $0095
- $C586:60 RTS
- So to simplify a little bit, we have:
- $9495 = $9495 * 2 + $9495
- $95 = $94 + $95
- $9495 = $9495 + 0x81
- We can simplify this a little bit more. The first line could be summed up as
- $9495 * 3. For our purposes, the second line can be expressed as $9495 * 257
- since the overflow is inconsequential. So then we have:
- $9495 *= 3
- $9495 *= 257
- $9495 += 0x81
- This can then be combined into one line as:
- $9495 = $9495 * 771 + 0x81
- Or:
- $9495 = $9495 * 0x303 + 0x81
- This formula presents some limitations. The modulo of the low byte ($94) by 4
- can only ever equal 0 or 1 (bit 1 can never be 1). This means that $94 only
- represents 128 values, where $95 represents 256. This makes 32,768
- possibilities.
- The biggest limitation is when it is run consecutively and the consecutive
- values are used. While the distribution is even, running it consecutively will
- result in patterns cropping up. In the case of the hero waking up from SLEEP,
- which is a 50/50 chance, after a few turns it is impossible for him to stay
- asleep. A true random generator could go on for a long time, but this one is
- fairly limited. It does work quite well when waiting for input though. When
- the player is idle, the generator runs once a frame, which almost guarantees
- that it will be random.
- The next algorithm to know is multiplication, which is located at $C1C9.
- The code What it does
- ------------------------- --------------------------------------------------
- $C1C9:A9 00 LDA #$00 $40 and $41 form a double byte, and they represent
- $C1CB:85 40 STA $0040 the answer to the multiplication. Here they are
- $C1CD:85 41 STA $0041 zeroed.
- $C1CF:A5 3C LDA $003C $3C and $3D also form a double byte, and they are
- $C1D1:05 3D ORA $003D one of the factors. Here it checks if $3C3D is 0
- $C1D3:F0 1A BEQ $C1EF and it ends the subroutine if so.
- $C1D5:46 3D LSR $003D
- $C1D7:66 3C ROR $003C $3C3D is divided by 2.
- $C1D9:90 0D BCC $C1E8 If the remainder is 0, it branches to $C1E8.
- $C1DB:A5 3E LDA $003E
- $C1DD:18 CLC
- $C1DE:65 40 ADC $0040
- $C1E0:85 40 STA $0040 $3E and $3F are the other double byte factor.
- $C1E2:A5 3F LDA $003F Here they are added to $4041 (the result).
- $C1E4:65 41 ADC $0041
- $C1E6:85 41 STA $0041
- $C1E8:06 3E ASL $003E
- $C1EA:26 3F ROL $003F $3E3F is multiplied by 2.
- $C1EC:4C CF C1 JMP $C1CF The process is repeated until $3C == $3D
- $C1EF:60 RTS
- There are other FAQs that deal with the particulars of how this works, and it's
- rather lengthy. Suffice it to say that all that you need to know is that
- $3C3D * $3E3F = $4041.
- The last algorithm to know is division, which is located at $C1F0.
- The code What it does
- ------------------------- --------------------------------------------------
- $C1F0:A9 00 LDA #$00
- $C1F2:85 3D STA $003D $3D, part of a double byte $3C3D, is set to 0.
- $C1F4:A0 10 LDY #$10 Y = 0x10, which is setting up 16 loops.
- $C1F6:A9 00 LDA #$00
- $C1F8:06 3C ASL $003C
- $C1FA:26 3D ROL $003D
- $C1FC:85 40 STA $0040 $40 is set to $3C3D * 2.
- $C1FE:65 40 ADC $0040 The accumulator is set to $40 (plus 1 if there is
- overflow).
- $C200:E6 3C INC $003C $3C++
- $C202:38 SEC
- $C203:E5 3E SBC $003E $3E is subtracted from the accumulator.
- $C205:B0 05 BCS $C20C If there is no overflow, it branches to $C20C.
- $C207:18 CLC
- $C208:65 3E ADC $003E Else $3E is added to the accumulator.
- $C20A:C6 3C DEC $003C $3C--
- $C20C:88 DEY Y--
- $C20D:D0 E9 BNE $C1F8 If Y != 0, then repeat.
- $C20F:85 40 STA $0040 Store the accumulator in $40.
- $C211:60 RTS
- Like multiplication, the explanation for how this works is lengthy, so suffice
- it to say that all you need to know is that $3C3D / $3E = $3C remainder $40.
- Now that we know the basics of the algorithms, we can progress to the formulas.
- *************************
- B. Journeying
- *************************
- -= Items and Spells =-
- For all healing items and spells, the code is basically the same.
- The code What it does
- ------------------------- --------------------------------------------------
- $DBB8:20 5B C5 JSR $C55B Do the random algorithm.
- $DBBB:A5 95 LDA $0095 Load our random number and...
- $DBBD:29 07 AND #$07 ...limit it to a number between 0-7.
- $DBBF:18 CLC
- $DBC0:69 0A ADC #$0A Add that number to 0x0A.
- $DBC2:18 CLC
- $DBC3:65 C5 ADC $00C5 Add that to your HP.
- $DBC5:B0 04 BCS $DBCB If it exceeds 255, branch to $DBCB.
- $DBC7:C5 CA CMP $00CA Or if it exceeds your max HP, branch to $DBCB.
- $DBC9:90 02 BCC $DBCD
- $DBCB:A5 CA LDA $00CA
- $DBCD:85 C5 STA $00C5 Make the HP the max HP.
- All the healing works this way. Here are the values for various spells/items:
- Item HP gained Code location
- Herb: RAND & 0x0F + 0x17 $DCFE
- HEAL: RAND & 0x07 + 0x0A $DBB8
- HEALMORE: RAND & 0x0F + 0x55 $DBD7
- Radiant spell
- The code What it does
- ------------------------- --------------------------------------------------
- $DA6A:A9 50 LDA #$50
- $DA6C:85 DA STA $00DA Puts 0x50 into the radiant counter.
- After initial casting, you have the three square radius for 0x50 steps. Every
- step you take does:
- The code What it does
- ------------------------- --------------------------------------------------
- $CA5A:C6 DA DEC $00DA Decrease the radiant counter by 1.
- $CA5C:D0 0E BNE $CA6C If it's not 0, move on to other things.
- $CA5E:A5 D0 LDA $00D0 If it is 0, check the radius ($D0).
- $CA60:C9 01 CMP #$01 If it's 1...
- $CA62:F0 08 BEQ $CA6C ...Move on to other things.
- $CA64:A9 3C LDA #$3C Otherwise put 0x3C into $DA.
- $CA66:85 DA STA $00DA
- $CA68:C6 D0 DEC $00D0
- $CA6A:C6 D0 DEC $00D0 $D0 -= 2
- $D0 is the number that signifies the radius. It is initially set at seven.
- Every time $DA hits 0, $D0 is subtracted by 2. The radius could be expressed
- as ($D0 - 1) / 2. When it is 1, there is no more extra visible area. Torches
- simply set this value to 0x03 and they last until you leave the cave.
- REPEL spell
- The code What it does
- ------------------------- --------------------------------------------------
- $DA98:A9 FF LDA #$FF
- $DA9A:85 DB STA $00DB Put 0xFF into the repel counter.
- After the initial casting you have the repel counter ($DB) / 2 number of steps.
- The reason it is divided by 2 is because Fairy Water sets $DB to 0xFE. They
- were separated in this way so that they could run the same formulas, but also
- to have different messages when the effect wears off. So every step subtracts
- 2 from the counter.
- The way encounters work with the effect:
- The code What it does
- ------------------------- --------------------------------------------------
- $CF20:A5 45 LDA $0045 Load up the current area
- $CF22:C9 01 CMP #$01 Check if you're on the overworld
- $CF24:D0 1E BNE $CF44
- $CF26:A5 DB LDA $00DB Load the repel counter
- $CF28:F0 1A BEQ $CF44 If it's not 0...
- $CF2A:A5 CD LDA $00CD ...load the hero's defense and...
- $CF2C:4A LSR ...divide that by 2...
- $CF2D:85 3E STA $003E ...and put it into $3E.
- $CF2F:A6 3C LDX $003C X = $3C (at current, $3C is the enemy ID)
- $CF31:BD FA F4 LDA $F4FA,X Load the current enemy's strength and...
- $CF34:38 SEC
- $CF35:E5 3E SBC $003E ...subtract $3E (HeroDefense / 2) from it.
- $CF37:90 0A BCC $CF43 Branch if there is overflow.
- $CF39:85 3E STA $003E Store (EnemyStrength - HeroDefense / 2) at $3E.
- $CF3B:BD FA F4 LDA $F4FA,X Load the current enemy's strength and...
- $CF3E:4A LSR ...divide it by 2.
- $CF3F:C5 3E CMP $003E If EnemyStrength / 2 > EnemyStrength -
- HeroDefense/2
- $CF41:90 01 BCC $CF44 Branch
- $CF43:60 RTS
- There is some redundancy here. First it checks if the hero's defense is twice
- or more times the enemy's strength. If it's not, then it checks if the hero's
- defense is greater than the enemy's strength. The first check could
- essentially be cut, but probably wasn't for memory or speed reasons.
- So the only formula worth concerning yourself with here is:
- If (HeroDefense >> 1 > EnemyStrength >> 1) then the enemy is evaded.
- The bitwise right shifts make it worth noting that if your defense is say, 51,
- and the enemy's strength is say, 50, you won't evade them. So the formula
- can't be simplified to just HeroDefense > EnemyStrength like I do in the
- earlier section.
- The Silver Harp
- The code What it does
- ------------------------- --------------------------------------------------
- $DE18:A5 45 LDA $0045
- $DE1A:C9 01 CMP #$01 Check to make sure you're on the overworld.
- $DE1C:D0 23 BNE $DE41
- $DE1E:20 5B C5 JSR $C55B
- $DE21:A5 95 LDA $0095 Load up a random number.
- $DE23:29 07 AND #$07 Limit that number to 0-7.
- $DE25:C9 05 CMP #$05 If the number is 5...
- $DE27:F0 F5 BEQ $DE1E
- $DE29:C9 07 CMP #$07 ...or 7...
- $DE2B:F0 F1 BEQ $DE1E repeat the random process until it isn't.
- This random number serves as the monster you will encounter. 5 is the
- Magidrakee and 7 is the Druin. This shows that the summoning of enemies only
- works on the overworld.
- Because of the limitations of the random generator, and the fact that it is
- repeated in succession if the result is 5 or 7, this makes the odds not an even
- 1/6 split for each remaining enemy. The actual odds are:
- 0 - Slime: 5504/32768 ~16.8%
- 1 - Red Slime: 5472/32768 ~16.7%
- 2 - Drakee: 5504/32768 ~16.8%
- 3 - Ghost: 5440/32768 ~16.6%
- 4 - Magician: 5472/32768 ~16.7%
- 6 - Scorpion: 5376/32768 ~16.4%
- So there's not a whole lot of variance there. There are other areas, such as
- the chances of encountering an enemy from each zone set, that are a bit more
- varied.
- -= Encounters =-
- For every step that you take, the random subroutine is called. First, it
- figures out what kind of tile you are on. Then it proceeds to check types of
- terrain. It starts with the swamp:
- The code What it does
- ------------------------- --------------------------------------------------
- $CDC6:A5 E0 LDA $00E0 Load the current tile.
- $CDC8:C9 06 CMP #$06 Check if it's swamp.
- $CDCA:D0 36 BNE $CE02 If it's not, move on.
- $CDCC:A5 BE LDA $00BE If it is, load the equipment type.
- $CDCE:29 1C AND #$1C
- $CDD0:C9 1C CMP #$1C
- $CDD2:F0 27 BEQ $CDFB If you're wearing Erdrick's Armor skip the damage.
- ...
- $CDDF:A5 C5 LDA $00C5
- $CDE1:38 SEC
- $CDE2:E9 02 SBC #$02 If not, subtract 2 hit points.
- $CDE4:B0 02 BCS $CDE8 Check if HP is less than 0.
- $CDE6:A9 00 LDA #$00
- $CDE8:85 C5 STA $00C5
- ...
- $CDF0:A5 C5 LDA $00C5
- $CDF2:D0 07 BNE $CDFB If you're still alive, skip ahead.
- ...
- $CDFB:A9 0F LDA #$0F
- $CDFD:25 95 AND $0095 Limit the last random number to 0-15
- $CDFF:F0 7B BEQ $CE7C If it's 0, move on to check the zone you're in.
- $CE01:60 RTS
- And then moves on to desert:
- The code What it does
- ------------------------- --------------------------------------------------
- $CE02:C9 01 CMP #$01 Check if it's desert.
- $CE04:F0 0D BEQ $CE13
- $CE13:A9 07 LDA #$07
- $CE15:D0 E6 BNE $CDFD
- $CDFD:25 95 AND $0095 Limit the random number to 0-7.
- $CDFF:F0 7B BEQ $CE7C If it's 0, move on to check the zone you're in.
- $CE01:60 RTS
- And then to hills:
- The code What it does
- ------------------------- --------------------------------------------------
- $CE06:C9 02 CMP #$02 Check if it's hills.
- $CE08:D0 0D BNE $CE17
- ...
- $CE13:A9 07 LDA #$07
- $CE15:D0 E6 BNE $CDFD
- $CDFD:25 95 AND $0095 Limit the random number to 0-7.
- $CDFF:F0 7B BEQ $CE7C If it's 0, move on to check the zone you're in.
- $CE01:60 RTS
- And then forest:
- The code What it does
- ------------------------- --------------------------------------------------
- $CE17:C9 0B CMP #$0B Check if it's forest.
- $CE19:F0 44 BEQ $CE5F
- $CE5F:A9 0F LDA #$0F
- $CE61:D0 9A BNE $CDFD
- $CDFD:25 95 AND $0095 Limit the random number to 0-15.
- $CDFF:F0 7B BEQ $CE7C If it's 0, move on to check the zone you're in.
- $CE01:60 RTS
- And then brick floor:
- The code What it does
- ------------------------- --------------------------------------------------
- $CE1B:C9 04 CMP #$04 Check if it's brick floor.
- $CE1D:F0 40 BEQ $CE5F
- $CE5F:A9 0F LDA #$0F
- $CE61:D0 9A BNE $CDFD
- $CDFD:25 95 AND $0095 Limit the random number to 0-15.
- $CDFF:F0 7B BEQ $CE7C If it's 0, move on to check the zone you're in.
- $CE01:60 RTS
- And then if it's barrier:
- The code What it does
- ------------------------- --------------------------------------------------
- $CE1F:C9 0D CMP #$0D Check if it's barrier.
- $CE21:D0 40 BNE $CE63
- $CE23:A5 BE LDA $00BE If it is, load the equipment type.
- $CE25:29 1C AND #$1C
- $CE27:C9 1C CMP #$1C
- $CE29:F0 34 BEQ $CE5F If you're wearing Erdrick's Armor skip the damage.
- $CE5F:A9 0F LDA #$0F
- $CE61:D0 9A BNE $CDFD
- $CDFD:25 95 AND $0095 Limit the random number to 0-15.
- $CDFF:F0 7B BEQ $CE7C If it's 0, move on to check the zone you're in.
- $CE01:60 RTS
- And if it's none of the above:
- The code What it does
- ------------------------- --------------------------------------------------
- $CE63:A5 3A LDA $003A Load the hero's x position.
- $CE65:4A LSR
- $CE66:B0 07 BCS $CE6F If x is odd, proceed to check if y is even.
- $CE68:A5 3B LDA $003B If x is even, load the hero's y position.
- $CE6A:4A LSR
- $CE6B:90 07 BCC $CE74 If y is even, the random number will be 0-31.
- $CE6D:B0 09 BCS $CE78 If y is odd, the random number will be 0-15.
- $CE6F:A5 3B LDA $003B If the x position was odd...
- $CE71:4A LSR
- $CE72:90 04 BCC $CE78 ..and if the y position is even, the random number
- $CE74:A9 1F LDA #$1F will be 0-31. If y is odd, it will be 0-15.
- $CE76:D0 85 BNE $CDFD
- $CE78:A9 0F LDA #$0F
- $CE7A:D0 FA BNE $CE76
- Basically, what this all does is set up a checker board style of encounters in
- places like grasslands. One type of checker is a 1 in 16 chance of encounter
- while the other type is a 1 in 32 chance. The point is to essentially make the
- encounter similar to a 1 in 24 chance.
- Then, we start to check what zone we're in:
- The code What it does
- ------------------------- --------------------------------------------------
- $CE7C:A5 45 LDA $0045 Check which area you're in.
- $CE7E:C9 01 CMP #$01 If it's the overworld...
- $CE80:D0 56 BNE $CED8 ...don't branch.
- $CE82:A5 3B LDA $003B Load the hero's y coordinate...
- $CE84:85 3C STA $003C ...and put it into $3C.
- $CE86:A9 0F LDA #$0F
- $CE88:85 3E STA $003E Set $3E to 0x0F.
- $CE8A:20 F0 C1 JSR $C1F0 Run the division subroutine ($3C / $3E).
- $CE8D:A5 3C LDA $003C Load the result of the division...
- $CE8F:85 42 STA $0042 ...and put it into $42 for later.
- $CE91:A5 3A LDA $003A Load the hero's X coordinate...
- $CE93:85 3C STA $003C ...and put it into $3C.
- $CE95:A9 0F LDA #$0F
- $CE97:85 3E STA $003E Set $3E to 0x0F.
- $CE99:20 F0 C1 JSR $C1F0 Runs the division subroutine ($3C / $3E).
- $CE9C:A5 42 LDA $0042 Load the hero's y grid...
- $CE9E:0A ASL
- $CE9F:0A ASL ...and multiply it by 4.
- $CEA0:85 3E STA $003E Put the result in $3E.
- $CEA2:A5 3C LDA $003C Load the hero's x grid...
- $CEA4:4A LSR ...and divide it by 2...
- $CEA5:18 CLC
- $CEA6:65 3E ADC $003E ...and add it to the previous y grid * 4.
- $CEA8:AA TAX Transfer the result to X.
- $CEA9:BD 22 F5 LDA $F522,X Loads what zone grid you are in...
- $CEAC:85 3E STA $003E ...and stores it in $3E.
- $CEAE:A5 3C LDA $003C Load the hero's x grid again.
- $CEB0:4A LSR
- $CEB1:B0 08 BCS $CEBB If it's an odd number, get the small nibble of $3E
- $CEB3:46 3E LSR $003E If it's even, get the large nibble of $3E.
- $CEB5:46 3E LSR $003E
- $CEB7:46 3E LSR $003E
- $CEB9:46 3E LSR $003E
- $CEBB:A5 3E LDA $003E
- $CEBD:29 0F AND #$0F
- $CEBF:D0 43 BNE $CF04 If the zone isn't 0, go on to combat.
- So what this does is divides your x and y coordinates by 15 to figure out what
- grid you are currently in. It then takes that grid and converts it into a
- sequential number to figure out what enemy zone this grid represents.
- So for instance, let's say your coordinates are 0x2B, 0x2C (one square south of
- Tantegel). The x grid is 0x2B / 0x0F, which is 2 (the remainder is
- unimportant). The y grid is 0x2C / 0x0F, which is also 2. So now we follow the
- equation:
- yGrid * 4 + (xGrid >> 1)
- And we would have 2 * 4 + (2 >> 1), which is 9. This result is used as the
- offset from $F522, which in this case would be $F52B, which is 0x00. Normally
- we would find out which nibble is our zone (in this case it would be the large
- nibble), but it doesn't matter since they are both 0. Since the zone is 0, we
- go on to this next code:
- The code What it does
- ------------------------- --------------------------------------------------
- $CEC1:20 5B C5 JSR $C55B If the zone is 0, run the random subroutine.
- $CEC4:A5 E0 LDA $00E0 Load the current tile.
- $CEC6:C9 02 CMP #$02 If it's hills...
- $CEC8:D0 07 BNE $CED1
- $CECA:A5 95 LDA $0095 ...load the random number and...
- $CECC:29 03 AND #$03 ...limit it to 0-3
- $CECE:F0 34 BEQ $CF04 If it's 0, go on to picking the enemy.
- Essentially what this does is that while you're in zone 0, hill encounters are
- reduced from 1/8 to 1/32. If it's not hills, the limitation is:
- The code What it does
- ------------------------- --------------------------------------------------
- $CED1:A5 95 LDA $0095 Load the random number and...
- $CED3:29 01 AND #$01 ...limit it to 0 or 1.
- $CED5:F0 2D BEQ $CF04 If it's 0, go on to picking the enemy.
- So every other type of terrain is limited by a factor of 2. That means you're
- much less likely to have encounters near Tantegel.
- Now on to picking the enemy.
- -= Monster Sets =-
- The code What it does
- ------------------------- --------------------------------------------------
- $CF04:85 3E STA $003E Store the zone number at $3E.
- $CF06:0A ASL
- $CF07:0A ASL
- $CF08:18 CLC
- $CF09:65 3E ADC $003E Multiply the zone number by 5.
- $CF0B:85 3E STA $003E Put the result in $3E.
- $CF0D:20 5B C5 JSR $C55B Run the random subroutine.
- $CF10:A5 95 LDA $0095
- $CF12:29 07 AND #$07 Limit the random number to 0-7.
- $CF14:C9 05 CMP #$05 If it's 5-7...
- $CF16:B0 F5 BCS $CF0D ...go back and repeat until it's not.
- $CF18:65 3E ADC $003E Add the random number to $3E.
- $CF1A:AA TAX
- $CF1B:BD 4F F5 LDA $F54F,X Use the result as the offset from $F54F to get the
- enemy ID.
- $CF1E:85 3C STA $003C Store the ID at $3C.
- So since there are five possibilities per zone, this figures out the zone * 5 +
- a random number between 0 and 4. From there, it checks the offset at $F54F to
- see what enemy ID is there. The chart at $F54F is as follows:
- 00 01 00 01 00
- 01 00 01 02 01
- 00 03 02 03 01
- 01 01 02 03 04
- 03 04 05 05 06
- 03 04 05 06 0B
- 05 06 0B 0C 0E
- 0B 0C 0D 0E 0E
- 0D 0F 12 12 19
- 0F 15 12 15 19
- 15 16 17 1A 1C
- 17 1A 1B 1C 10
- 1A 1B 1C 1D 1F
- 1D 1E 1F 1F 20
- 08 09 0A 0B 0C
- 11 12 13 14 17
- 1D 1E 1F 20 21
- 20 21 22 22 23
- 20 23 24 24 25
- 03 04 06 07 07
- Each enemy ID corresponds to this chart:
- Zone 0: Slime, Red Slime, Slime, Red Slime, Slime
- Zone 1: Red Slime, Slime, Red Slime, Drakee, Red Slime
- Zone 2: Slime, Ghost, Drakee, Ghost, Red Slime
- Zone 3: Red Slime, Red Slime, Drakee, Ghost, Magician
- Zone 4: Ghost, Magician, Magidrakee, Magidrakee, Scorpion
- Zone 5: Ghost, Magician, Magidrakee, Scorpion, Skeleton
- Zone 6: Magidrakee, Scorpion, Skeleton, Warlock, Wolf
- Zone 7: Skeleton, Warlock, Metal Scorpion, Wolf, Wolf
- Zone 8: Metal Scorpion, Wraith, Wolflord, Wolflord, Goldman
- Zone 9: Wraith, Wyvern, Wolflord, Wyvern, Goldman
- Zone 10: Wyvern, Rogue Scorpion, Wraith Knight, Knight, Demon Knight
- Zone 11: Wraith Knight, Knight, Magiwyvern, Demon Knight, Metal Slime
- Zone 12: Knight, Magiwyvern, Demon Knight, Werewolf, Starwyvern
- Zone 13: Werewolf, Green Dragon, Starwyvern, Starwyvern, Wizard
- Zone 14: Poltergeist, Droll, Drakeema, Skeleton, Warlock
- Zone 15: Specter, Wolflord, Druinlord, Drollmagi, Wraith Knight
- Zone 16: Werewolf, Green Dragon, Starwyvern, Wizard, Axe Knight
- Zone 17: Wizard, Axe Knight, Blue Dragon, Blue Dragon, Stoneman
- Zone 18: Wizard, Stoneman, Armored Knight, Armored Knight, Red Dragon
- Zone 19: Ghost, Magician, Scorpion, Druin, Druin
- Each enemy has a roughly equal chance to be encountered, although because of
- the limitations of the random generator, they are slightly imbalanced. It's
- called once to determine if there is combat, once again if you're in zone 0,
- and then however many times it takes to get a number between 0 and 4 instead of
- 0 and 7 (there is a maximum of 7). It's mostly because of that last part that
- the odds are uneven.
- Enemy # Chance to encounter
- 0 416/2048 ~20.3%
- 1 448/2048 ~21.9%
- 2 448/2048 ~21.9%
- 3 336/2048 ~16.4%
- 4 400/2048 ~19.5%
- Since there is one extra call in zone 0, the odds there are different:
- Enemy # Chance to encounter
- 0 368/2048 ~18.0%
- 1 384/2048 ~18.8%
- 2 448/2048 ~21.9%
- 3 416/2048 ~20.3%
- 4 432/2048 ~21.1%
- *************************
- C. Combat
- *************************
- -=Enemies=-
- These are all the stats of the enemies.
- ID Enemy Name Str Agi HP Pat SR DR XP GP
- 00 Slime 05 03 03 00 0F 01 01 02
- 01 Red Slime 07 03 04 00 0F 01 01 03
- 02 Drakee 09 06 06 00 0F 01 02 03
- 03 Ghost 0B 08 07 00 0F 04 03 05
- 04 Magician 0B 0C 0D 02 00 01 04 0C
- 05 Magidrakee 0E 0E 0F 02 00 01 05 0C
- 06 Scorpion 12 10 14 00 0F 01 06 10
- 07 Druin 14 12 16 00 0F 02 07 10
- 08 Poltergeist 12 14 17 03 00 06 08 12
- 09 Droll 18 18 19 00 0E 02 0A 19
- 0A Drakeema 16 1A 14 92 20 06 0B 14
- 0B Skeleton 1C 16 1E 00 0F 04 0B 1E
- 0C Warlock 1C 16 1E 12 31 02 0D 23
- 0D Metal Scorpion 24 2A 16 00 0F 02 0E 28
- 0E Wolf 28 1E 22 00 1F 02 10 32
- 0F Wraith 2C 22 24 90 70 04 11 3C
- 10 Metal Slime 0A FF 04 03 FF F1 73 06
- 11 Specter 28 26 24 13 31 04 12 46
- 12 Wolflord 32 24 26 60 47 02 14 50
- 13 Druinlord 2F 28 23 B1 F0 04 14 55
- 14 Drollmagi 34 32 26 60 22 01 16 5A
- 15 Wyvern 38 30 2A 00 4F 02 18 64
- 16 Rogue Scorpion 3C 5A 23 00 7F 02 1A 6E
- 17 Wraith Knight 44 38 2E B0 50 34 1C 78
- 18 Golem 78 3C 46 00 FF F0 05 0A
- 19 Goldman 30 28 32 00 DF 01 06 C8
- 1A Knight 4C 4E 37 60 67 01 21 82
- 1B Magiwyvern 4E 44 3A 20 20 02 22 8C
- 1C Demon Knight 4F 40 32 00 FF FF 25 96
- 1D Werewolf 56 46 3C 00 7F 07 28 9B
- 1E Green Dragon 58 4A 41 09 7F 22 2D A0
- 1F Starwyvern 56 50 41 F9 80 12 2B A0
- 20 Wizard 50 46 41 06 F7 F2 32 A5
- 21 Axe Knight 5E 52 46 10 F3 11 36 A5
- 22 Blue Dragon 62 54 46 09 FF 72 3C 96
- 23 Stoneman 64 28 A0 00 2F 71 41 8C
- 24 Armored Knight 69 56 5A F5 F7 12 46 8C
- 25 Red Dragon 78 5A 64 19 F7 F2 64 8C
- 26 Dragonlord 1 5A 4B 64 57 FF F0 00 00
- 27 Dragonlord 2 8C C8 82 0E FF F0 00 00
- "Str" is the enemy's strength or attack power.
- "Agi" is the enemy's agility.
- "HP" is the enemy's hit points. This number is just the maximum that their HP
- can be, but it is variable. The code to calculate it is:
- The code What it does
- ------------------------- --------------------------------------------------
- $E599:AD 02 01 LDA $0102 Load the enemy's max HP...
- $E59C:85 3E STA $003E ...and put it in $3E.
- $E59E:20 5B C5 JSR $C55B
- $E5A1:A5 95 LDA $0095
- $E5A3:85 3C STA $003C Put the random number into $3C.
- $E5A5:A9 00 LDA #$00
- $E5A7:85 3D STA $003D
- $E5A9:85 3F STA $003F
- $E5AB:20 C9 C1 JSR $C1C9 Multiply the random number by the max HP.
- $E5AE:A5 41 LDA $0041 Load the result / 256.
- $E5B0:4A LSR
- $E5B1:4A LSR Divide it by 4.
- $E5B2:85 40 STA $0040 Store the result at $40.
- $E5B4:AD 02 01 LDA $0102 Load the enemy's max HP.
- $E5B7:38 SEC
- $E5B8:E5 40 SBC $0040 Subtract $40 from the max HP.
- $E5BA:85 E2 STA $00E2 Set the enemy's current HP to that result.
- The result is:
- MaxHP - ((RAND * MaxHP) >> 10)
- So that will be a range from 75.1-100% of the value. The only exception to
- this is the Dragonlord's second form. He always has the full value for HP.
- "Pat" is the enemy's attack pattern. See below for the more advanced info on
- how this number works.
- "SR" is status resistance. The first nibble / 16 is the chance to resist
- SLEEP:
- The code What it does
- ------------------------- --------------------------------------------------
- $E770:AD 04 01 LDA $0104 Load the enemy's status resistance.
- $E773:4A LSR
- $E774:4A LSR
- $E775:4A LSR
- $E776:4A LSR Get the first nibble (SLEEP resistance).
- $E777:20 46 E9 JSR $E946
- $E946:85 3E STA $003E Store it at $3E.
- $E948:20 5B C5 JSR $C55B
- $E94B:A5 95 LDA $0095 Get the random number...
- $E94D:29 0F AND #$0F ...and limit it to 0-15.
- $E94F:C5 3E CMP $003E If that number is greater or equal to the enemy's
- $E951:90 01 BCC $E954 SLEEP resistance, then it is successful.
- $E953:60 RTS
- The second nibble / 16 is the chance to resist STOPSPELL:
- The code What it does
- ------------------------- --------------------------------------------------
- $E78A:AD 04 01 LDA $0104 Load the enemy's status resistance.
- $E78D:29 0F AND #$0F Get the second nibble (STOPSPELL resistance).
- $E78F:20 46 E9 JSR $E946
- $E946:85 3E STA $003E Store it at $3E.
- $E948:20 5B C5 JSR $C55B
- $E94B:A5 95 LDA $0095 Get the random number...
- $E94D:29 0F AND #$0F ...and limit it to 0-15.
- $E94F:C5 3E CMP $003E If that number is greater or equal to the enemy's
- $E951:90 01 BCC $E954 STOPSPELL resistance, then it is successful.
- $E953:60 RTS
- So for instance, a Slime's SR is 0F. That means SLEEP will always work and
- that STOPSPELL has a 15/16 chance of failing. Enemies who don't use magic have
- F as their STOPSPELL resistance, but this still allows a small chance of it
- working even though it will have no real effect.
- "DR" is damage resistance. The first nibble / 16 is the chance that HURT and
- HURTMORE will have no effect:
- The code What it does
- ------------------------- --------------------------------------------------
- $E73A:AD 05 01 LDA $0105 Load the enemy's damage resistance.
- $E73D:4A LSR
- $E73E:4A LSR
- $E73F:4A LSR
- $E740:4A LSR Get the first nibble (HURT resistance).
- $E741:20 46 E9 JSR $E946
- $E946:85 3E STA $003E Store it at $3E.
- $E948:20 5B C5 JSR $C55B
- $E94B:A5 95 LDA $0095 Get the random number...
- $E94D:29 0F AND #$0F ...and limit it to 0-15.
- $E94F:C5 3E CMP $003E If that number is greater or equal to the enemy's
- $E951:90 01 BCC $E954 HURT resistance, then it is successful.
- $E953:60 RTS
- The second nibble / 64 is the chance of dodging:
- The code What it does
- ------------------------- --------------------------------------------------
- $E66E:20 5B C5 JSR $C55B
- $E671:A5 95 LDA $0095 Get a random number and...
- $E673:29 3F AND #$3F ...limit it to 0-63.
- $E675:85 95 STA $0095 Store the number at $95.
- $E677:AD 05 01 LDA $0105 Load the enemy's damage resistance.
- $E67A:29 0F AND #$0F Get the second nibble (dodging chance).
- $E67C:F0 1C BEQ $E69A If it is 0, the enemy dodges.
- $E67E:38 SEC
- $E67F:E9 01 SBC #$01 Subtract 1 from the dodging chance.
- $E681:C5 95 CMP $0095 If that number is greater or equal to the previous
- $E683:90 15 BCC $E69A random number (0-63), the enemy dodges.
- So for instance, a Slime's DR is 01. That means that HURT spells will always
- connect and that it has a 1/64 chance to dodge an attack.
- "XP" is the experience you will get.
- "GP" is the maximum gold you can get plus one. The code for gold received is:
- The code What it does
- ------------------------- --------------------------------------------------
- $EA2A:AD 07 01 LDA $0107 Load the enemy's gold value.
- $EA2D:85 3E STA $003E Store it at $3E.
- $EA2F:20 5B C5 JSR $C55B
- $EA32:A5 95 LDA $0095 Get a random number and...
- $EA34:29 3F AND #$3F ...limit it to 0-63.
- $EA36:18 CLC
- $EA37:69 C0 ADC #$C0 Add that number to 0xC0.
- $EA39:85 3C STA $003C Store the result at $3C.
- $EA3B:A9 00 LDA #$00
- $EA3D:85 3D STA $003D
- $EA3F:85 3F STA $003F
- $EA41:20 C9 C1 JSR $C1C9 Multiply the enemy's gold value by $3C.
- $EA44:A5 41 LDA $0041 Load the result / 256.
- $EA46:85 00 STA $0000 And store it at $00
- That result is later added to your gold total. So the formula is:
- (GP * ((RAND & 0x3F) + 0xC0)) >> 8
- So that will be a range from 75-99.9% of the value. You will never receive
- that full number.
- -=Enemy patterns=-
- The above mentioned enemy pattern is a little bit more elaborate than the other
- stats. An enemy can have up to two special moves. One focuses on status
- spells and healing, and the other focuses on damage spells and fire breath.
- Certain checks are made to see if they use these attacks. If they don't, they
- simply attack.
- Special move 1:
- The code What it does
- ------------------------- --------------------------------------------------
- $EB4B:20 5B C5 JSR $C55B Run the random subroutine for later.
- $EB4E:AD 03 01 LDA $0103 Load the enemy's pattern.
- $EB51:29 30 AND #$30 Get bits 4 and 5, which is the 1/4 chance of
- carrying out special move 1.
- $EB53:85 3C STA $003C Store it at $3C.
- $EB55:A5 95 LDA $0095 Load the previous random number.
- $EB57:29 30 AND #$30 Get bits 4 and 5.
- $EB59:C5 3C CMP $003C If the random number is less than the enemy's
- $EB5B:B0 37 BCS $EB94 pattern, they will carry out special move 1.
- Otherwise move on to special move 2.
- $EB5D:AD 03 01 LDA $0103 Load the enemy's pattern.
- $EB60:29 C0 AND #$C0 Get bits 6 and 7, which is special move 1.
- $EB62:D0 07 BNE $EB6B
- $EB64:A5 DF LDA $00DF If special move 1 is 0, it is to cast SLEEP.
- $EB66:30 2C BMI $EB94 If the hero is already asleep, then move on to
- special move 2. Otherwise cast SLEEP, which is
- always successful.
- $EB6B:C9 40 CMP #$40
- $EB6D:D0 09 BNE $EB78
- $EB6F:A5 DF LDA $00DF If special move 1 is 1, it is to cast STOPSPELL.
- $EB71:29 10 AND #$10 If the hero's spell is already stopped, then move
- $EB73:D0 1F BNE $EB94 on to special move 2. Otherwise cast STOPSPELL,
- which has a 50/50 chance of success unless
- equipped with Erdrick's Armor, in which case there
- is no chance.
- $EB78:C9 80 CMP #$80
- $EB7A:D0 0C BNE $EB88 If special move 1 is 2, it is to cast HEAL.
- $EB7C:AD 02 01 LDA $0102 Load the enemy's max HP.
- $EB7F:4A LSR
- $EB80:4A LSR Divide that by 4.
- $EB81:C5 E2 CMP $00E2 If the enemy's current HP is less than a quarter
- $EB83:90 0F BCC $EB94 of its max HP, then it will carry out the HEAL
- spell. Otherwise move on to special move 2.
- If special move 1 is 3, it is to cast HEALMORE.
- $EB88:AD 02 01 LDA $0102 Load the enemy's max HP.
- $EB8B:4A LSR
- $EB8C:4A LSR Divide that by 4.
- $EB8D:C5 E2 CMP $00E2 If the enemy's current HP is less than a quarter
- $EB8F:90 03 BCC $EB94 of its max HP, then it will carry out the HEALMORE
- spell. Otherwise move on to special move 2.
- Special move 2:
- The code What it does
- ------------------------- --------------------------------------------------
- $EB94:20 5B C5 JSR $C55B Run the random subroutine for later.
- $EB97:AD 03 01 LDA $0103 Load the enemy's pattern.
- $EB9A:29 03 AND #$03 Get bits 0 and 1, which is the 1/4 chance of
- carrying out special move 2.
- $EB9C:85 3C STA $003C Store it at $3C.
- $EB9E:A5 95 LDA $0095 Load the previous random number.
- $EBA0:29 03 AND #$03 Get bits 0 and 1.
- $EBA2:C5 3C CMP $003C If the random number is less than the enemy's
- $EBA4:B0 1B BCS $EBC1 pattern, they will carry out special move 2.
- Otherwise move on to attack.
- $EBA6:AD 03 01 LDA $0103 Load the enemy's pattern.
- $EBA9:29 0C AND #$0C Get bits 2 and 3, which is special move 2.
- $EBAB:D0 03 BNE $EBB0 If special move 2 is 0, it is to cast HURT.
- $EBB0:C9 04 CMP #$04
- $EBB2:D0 03 BNE $EBB7 If special move 2 is 1, it is to cast HURTMORE.
- $EBB7:C9 08 CMP #$08
- $EBB9:D0 03 BNE $EBBE If special move 2 is 2, it is to breathe fire.
- $EBBE:4C E1 EC JMP $ECE1 If special move 2 is 3, it is to breathe strong
- fire.
- As an example of how it works, we will use a Starwyvern.
- The Starwyvern's pattern is F9, which is 11111001 in binary.
- The first bytes it checks are 4 & 5:
- 11111001
- ^^
- This number / 4 is the chance that they will do special move 1. In this case,
- it is a 3 / 4 chance that the Starwyvern will do special move 1.
- Bytes 6 & 7 correspond to what special move 1 is.
- 11111001
- ^^
- 00: Cast SLEEP
- 01: Cast STOPSPELL
- 10: Cast HEAL
- 11: Cast HEALMORE
- The Starwyvern's ability then is HEALMORE.
- There are always exceptions to if these will be performed. If the hero is
- already asleep, the enemy will not cast SLEEP. If the hero's spell is already
- stopped, the enemy will not cast STOPSPELL. If the enemy's HP >= their max HP
- / 4, then it will not cast healing spells.
- So if the enemy doesn't end up doing special move 1, it moves onto special
- move 2.
- Bytes 0 & 1 are checked:
- 11111001
- ^^
- Again, just like our first check, this number / 4 is the chance that they will
- do special move 2. In the case of the Starwyvern, it's chance is 1 / 4.
- Bytes 2 & 3 correspond to what special move 2 is.
- 11111001
- ^^
- 00: Cast HURT
- 01: Cast HURTMORE
- 10: Breath attack 1
- 11: Breath attack 2
- The Starwyvern's ability then is breath attack 1.
- If this special attack isn't used, then the enemy will just do a regular
- attack.
- So the starwyvern's attack chances can be broken down as such:
- If starwyvern HP < 16
- 3/4 chance to HEAL, 1/16 chance to breathe fire, 3/16 chance to attack
- If starwyvern HP >= 16
- 1/4 chance to breathe fire, 3/4 chance to attack
- -=Enemy attack formulas=-
- ~Attacks~
- There are two formulas for attack damage for enemies. This is the starting
- code:
- The code What it does
- ------------------------- --------------------------------------------------
- $EBCD:AD 00 01 LDA $0100 Load the enemy's strength.
- $EBD0:85 42 STA $0042 Store it at $42.
- $EBD2:A5 CD LDA $00CD Load the hero's defense.
- $EBD4:85 43 STA $0043 Store it at $43.
- $EBD6:20 F4 EF JSR $EFF4
- $EFF4:46 43 LSR $0043 Divide the hero's defense by 2.
- $EFF6:A5 42 LDA $0042
- $EFF8:4A LSR Divide the enemy's strength by 2.
- $EFF9:85 3E STA $003E Store the result at $3E
- $EFFB:E6 3E INC $003E Add 1 to $3E.
- $EFFD:A5 42 LDA $0042
- $EFFF:38 SEC
- $F000:E5 43 SBC $0043 Subtract the halved hero's defense from the
- enemy's strength.
- $F002:90 04 BCC $F008 Branch if it's less than 0.
- $F004:C5 3E CMP $003E Otherwise compare it to $3E, which is the enemy's
- strength / 2 + 1.
- $F006:B0 28 BCS $F030 If it's greater or equal, branch. If not, proceed
- to do lesser damage.
- So $F008 is where lesser damage is determined. $F030 is where regular damage
- is determined. Lesser damage is done if (EnemyStrength >> 2) is less than
- (HeroDefense >> 2 + 1).
- Lesser damage:
- The code What it does
- ------------------------- --------------------------------------------------
- $F008:20 5B C5 JSR $C55B
- $F00B:A5 95 LDA $0095
- $F00D:85 3C STA $003C Put a random number at $3C.
- $F00F:A9 00 LDA #$00
- $F011:85 3D STA $003D
- $F013:85 3F STA $003F
- $F015:20 C9 C1 JSR $C1C9 Multiply the random number by $3E.
- $F018:A5 41 LDA $0041 Load the result / 256.
- $F01A:18 CLC
- $F01B:69 02 ADC #$02 Add 2 to that result.
- $F01D:85 3C STA $003C Store the result in $3C.
- $F01F:A9 03 LDA #$03
- $F021:85 3E STA $003E
- $F023:4C F0 C1 JMP $C1F0 Divide $3C by 3.
- So the end result is floor(((((EnemyStrength >> 1 + 1) * RAND) >> 8) + 2) / 3).
- That's fairly simplified, although it could also be expressed as:
- floor((((EnemyStrength + 2) * RAND + 1024) >> 9) / 3)
- Regular damage:
- The code What it does
- ------------------------- --------------------------------------------------
- $F030:85 42 STA $0042 Store the enemy's strength minus the halved hero's
- defense at $42.
- $F032:85 3E STA $003E Also store it at $3E.
- $F034:E6 3E INC $003E Add 1 to $3E.
- $F036:20 5B C5 JSR $C55B
- $F039:A5 95 LDA $0095
- $F03B:85 3C STA $003C Put a random number at $3C.
- $F03D:A9 00 LDA #$00
- $F03F:85 3D STA $003D
- $F041:85 3F STA $003F
- $F043:20 C9 C1 JSR $C1C9 Multiply the random number by $3E
- $F046:A5 41 LDA $0041 Load the result / 256 and...
- $F048:18 CLC
- $F049:65 42 ADC $0042 ...add it to $42.
- $F04B:6A ROR
- $F04C:4A LSR Divide that result by 4.
- $F04D:85 3C STA $003C Store the result at $3C.
- $F04F:60 RTS
- So the end result is (((EnemyStrength - (HeroDefense >> 1) + 1) * RAND) >> 8 +
- EnemyStrength - (HeroDefense >> 1)) >> 2. This can be simplified as:
- ((256 + RAND) * (EnemyStrength - (HeroDefense >> 1) + 1) - 256) >> 10
- ~Spells~
- Spell Damage done Code location
- HURT : RAND & 0x07 + 0x03 $EC2A
- HURTMORE : RAND & 0x0F + 0x1E $EC5C
- Both Magic Armor and Erdrick's Armor will reduce HURT spells:
- The code What it does
- ------------------------- --------------------------------------------------
- $EC36:A5 BE LDA $00BE Load the hero's equipment byte.
- $EC38:29 1C AND #$1C Get bits 2-4, which is the armor.
- $EC3A:C9 1C CMP #$1C Check if it's Erdrick's Armor.
- $EC3C:F0 04 BEQ $EC42 If it is, branch.
- $EC3E:C9 18 CMP #$18 Otherwise, check if it's Magic Armor.
- $EC40:D0 10 BNE $EC52 If it is, continue.
- $EC42:A5 00 LDA $0000 Load the HURT damage.
- $EC44:85 3C STA $003C Store it at $3C.
- $EC46:A9 03 LDA #$03
- $EC48:85 3E STA $003E
- $EC4A:20 F0 C1 JSR $C1F0 Divide the HURT damage by 3.
- $EC4D:A5 3C LDA $003C
- $EC4F:0A ASL Multiply the result by 2.
- $EC50:85 00 STA $0000
- It's divided by 3, the remainder is discarded, and that result is multiplied by
- 2.
- SLEEP:
- The code What it does
- ------------------------- --------------------------------------------------
- $EC99:A5 DF LDA $00DF Load the byte that has the hero's sleep status.
- $EC9B:09 80 ORA #$80 Set bit 7 to 1, which puts the hero to sleep.
- $EC9D:85 DF STA $00DF
- SLEEP always puts you to sleep, and there is no resisting it. Waking up from
- sleep is a 50/50 chance:
- The code What it does
- ------------------------- --------------------------------------------------
- $E5D6:20 5B C5 JSR $C55B
- $E5D9:A5 95 LDA $0095 Get a random number.
- $E5DB:4A LSR
- $E5DC:B0 07 BCS $E5E5 If it's an odd number, proceed to wake up.
- $E5E5:A5 DF LDA $00DF Load the byte that has the hero's sleep status.
- $E5E7:29 7F AND #$7F Set bit 7 to 0, which wakes the hero up.
- $E5E9:85 DF STA $00DF
- Because of the limitations of the random generator, it's not possible for sleep
- to last on the hero for more than a set number of turns. Per turn, the random
- generator is run 4 times:
- 1. Check to see if the enemy does special move 1. Since special move 1 is
- SLEEP, it will not do this if you are sleeping. So it automatically goes to
- check 2.
- 2. Check to see if the enemy does special move 2.
- 3. If it does or doesn't do that move, it will run the random generator just
- once to calculate damage.
- 4. The check to see if the hero wakes up.
- The results of this are:
- Turns asleep Chance of being asleep that long
- ------------ --------------------------------
- 1 100.0%
- 2 50.0%
- 3 25.0%
- 4 12.5%
- 5 ~9.0%
- 6 ~3.1%
- 7 ~0.4%
- 8 0.0%
- So the longest you could stay asleep would be 6 turns, although it is highly
- unlikely.
- There can actually be an extra random check added in there, and that is if the
- enemy feels intimidated and wants to run. This really shouldn't be of concern
- since if you're a lot stronger than them, it shouldn't matter if you get
- sleeplocked. Regardless, these are the odds:
- Turns asleep Chance of being asleep that long
- ------------ --------------------------------
- 1 100.0%
- 2 62.5%
- 3 ~22.9%
- 4 ~9.0%
- 5 ~3.3%
- 6 ~3.1%
- 7 ~1.0%
- 8 ~0.6%
- 9 ~0.4%
- 10 ~0.2%
- 11 ~0.2%
- 12 0.0%
- So the odds are much better in the initial rounds, but it has the capacity to
- last 4 turns longer. Again, it probably wouldn't matter much if you are
- stronger than the enemy.
- STOPSPELL has a 50/50 chance of working against you unless you are equipped
- with Erdrick's Armor, in which case it won't work at all:
- The code What it does
- ------------------------- --------------------------------------------------
- $EC70:A5 BE LDA $00BE Load the hero's equipment byte.
- $EC72:29 1C AND #$1C Get bits 2-4, which is the armor.
- $EC74:C9 1C CMP #$1C Check if it's Erdrick's Armor.
- $EC76:F0 16 BEQ $EC8E If it is, STOPSPELL will not work.
- $EC78:20 5B C5 JSR $C55B
- $EC7B:A5 95 LDA $0095 Otherwise get a random number.
- $EC7D:4A LSR
- $EC7E:90 0E BCC $EC8E If it's an odd number, your spell is stopped.
- $EC80:A5 DF LDA $00DF Load the byte with the hero's STOPSPELL status.
- $EC82:09 10 ORA #$10 Set bit 4 to 1, which stops the hero's spell.
- $EC84:85 DF STA $00DF
- Spell HP recovered Code location
- HEAL : RAND & 0x07 + 0x14 $ECAD
- HEALMORE : RAND & 0x0F + 0x55 $ECD5
- ~Fire breath~
- There are two types of fire breath. Only the Dragonlord's second form has the
- stronger breath. The rest of the enemies that have breath attacks only have
- the weaker type of breath.
- Breath type Damage done Code location
- Weak breath : RAND & 0x07 + 0x10 $ECED
- Strong breath : RAND & 0x07 + 0x41 $ECE1
- The only thing that protects against fire breath is Erdrick's Armor, which
- reduces the damage:
- The code What it does
- ------------------------- --------------------------------------------------
- $ECFC:A5 BE LDA $00BE Load the hero's equipment byte.
- $ECFE:29 1C AND #$1C Get bits 2-4, which is the armor.
- $ED00:C9 1C CMP #$1C Check if it's Erdrick's Armor.
- $ED02:D0 10 BNE $ED14 If it's not, do regular damage.
- $ED04:A5 00 LDA $0000
- $ED06:85 3C STA $003C
- $ED08:A9 03 LDA #$03
- $ED0A:85 3E STA $003E
- $ED0C:20 F0 C1 JSR $C1F0 Otherwise divide the fire damage by 3.
- $ED0F:A5 3C LDA $003C
- $ED11:0A ASL Multiply the result by 2.
- $ED12:85 00 STA $0000
- It's divided by 3, the remainder is discarded, and that result is multiplied by
- 2.
- -=Hero attack formulas=-
- ~Attacks~
- First, the initial values are loaded:
- The code What it does
- ------------------------- --------------------------------------------------
- $E60C:A5 CC LDA $00CC Get the hero's attack power.
- $E60E:85 42 STA $0042 Store it at $42 for later.
- $E610:AD 01 01 LDA $0101 Get the enemy's agility.
- $E613:85 43 STA $0043 Store it at $43 for later.
- $E615:A5 E0 LDA $00E0 Get the enemy type.
- $E617:C9 26 CMP #$26 Check if it's the Dragonlord...
- $E619:F0 36 BEQ $E651
- $E61B:C9 27 CMP #$27 ...in either form.
- $E61D:F0 32 BEQ $E651
- It branches to $E651 in either case. This is where it determines if you can
- get an excellent move, and they aren't possible to achieve against the
- Dragonlord. So if the enemy is either form of the Dragonlord, it skips the
- check.
- Excellent move check:
- The code What it does
- ------------------------- --------------------------------------------------
- $E61F:20 5B C5 JSR $C55B
- $E622:A5 95 LDA $0095 Load a random number.
- $E624:29 1F AND #$1F Limit that number to 0-31.
- $E626:D0 29 BNE $E651
- Just like above, it will branch to $E651 if the random result is not 0. If it
- is, it will calculate the damage for a critical hit.
- Excellent move damage:
- The code What it does
- ------------------------- --------------------------------------------------
- $E634:20 5B C5 JSR $C55B
- $E637:A5 95 LDA $0095 Load a random number.
- $E639:85 3C STA $003C Store it at $3C for later.
- $E63B:A5 CC LDA $00CC Load the hero's attack power.
- $E63D:4A LSR Divide it by 2.
- $E63E:85 3E STA $003E Put the result into $3E.
- $E640:A9 00 LDA #$00
- $E642:85 3D STA $003D
- $E644:85 3F STA $003F
- $E646:20 C9 C1 JSR $C1C9 Multiply the random number by the hero's attack >>
- 1.
- $E649:A5 CC LDA $00CC Load the hero's attack power.
- $E64B:38 SEC
- $E64C:E5 41 SBC $0041 Subtract our previous product / 256 from the
- hero's attack power.
- So the end result for damage is HeroAttack - ((RAND * (Hero attack >> 1)) >> 8)
- Regular damage:
- The code What it does
- ------------------------- --------------------------------------------------
- $E651:20 E5 EF JSR $EFE5
- $EFE5:46 43 LSR $0043 Divide the enemy agility by 2 for later.
- $EFE7:A5 42 LDA $0042 Get the hero's attack power.
- $EFE9:38 SEC
- $EFEA:E5 43 SBC $0043 Subtract the halved enemy agility from it.
- $EFEC:90 38 BCC $F026 If it's less than 0, branch to calculate minimal
- damage.
- $EFEE:C9 02 CMP #$02 Otherwise check if it's 0 or 1.
- $EFF0:B0 3E BCS $F030 If not, it branches to calculate the rest of
- regular damage.
- $EFF2:90 32 BCC $F026 If so, it branches to calculate minimal damage.
- $F030:85 42 STA $0042 Store HeroAttack - (EnemyAgility >> 1) at $42.
- $F032:85 3E STA $003E Store the same number at $3E.
- $F034:E6 3E INC $003E Add 1 to $3E.
- $F036:20 5B C5 JSR $C55B
- $F039:A5 95 LDA $0095 Loads a random number.
- $F03B:85 3C STA $003C Store it at $3C.
- $F03D:A9 00 LDA #$00
- $F03F:85 3D STA $003D
- $F041:85 3F STA $003F
- $F043:20 C9 C1 JSR $C1C9 Multiply the random number by $3E (Heroattack -
- (EnemyAgility >> 1)).
- $F046:A5 41 LDA $0041 Load the result / 256.
- $F048:18 CLC
- $F049:65 42 ADC $0042 Add that to HeroAttack - (EnemyAgility >> 1).
- $F04B:6A ROR
- $F04C:4A LSR Then divide that result by 4.
- $F04D:85 3C STA $003C Store the result at $3C.
- $F04F:60 RTS
- So the end result for damage is:
- (((HeroAttack - (EnemyAgility >> 1)) * RAND) >> 8 + HeroAttack - (EnemyAgility
- >> 1)) >> 2
- This can be simplified as:
- ((RAND + 256) * (HeroAttack - (EnemyAgility >> 1))) >> 10
- For the minimal damage, it may seem like the checks are redundant, but one is
- for numbers less than 0, and the other is for simply 0 and 1. This is just a
- limitation of the programming. Minimal damage is:
- Minimal damage:
- The code What it does
- ------------------------- --------------------------------------------------
- $F026:20 5B C5 JSR $C55B
- $F029:A5 95 LDA $0095 Load a random number.
- $F02B:29 01 AND #$01 Limits that number to 0 or 1.
- $F02D:85 3C STA $003C Stores the result in $3C for later.
- $F02F:60 RTS
- The result is 0 or 1 damage.
- ~Spells~
- Spell Damage done Code location
- HURT : RAND & 0x07 + 0x05 $E744
- HURTMORE : RAND & 0x07 + 0x3A $E75F
- -=Running=-
- Every turn the enemy checks to see if it will run, even before the hero gets
- off a turn. Here's how it decides to run:
- The code What it does
- ------------------------- --------------------------------------------------
- $EFB7:A5 C8 LDA $00C8 Load the hero's strength.
- $EFB9:4A LSR Divide it by 2.
- $EFBA:CD 00 01 CMP $0100 Compare to the enemy's strength.
- $EFBD:90 25 BCC $EFE4 If it's less, then continue to fight.
- $EFBF:20 5B C5 JSR $C55B
- $EFC2:A5 95 LDA $0095 Otherwise get a random number.
- $EFC4:29 03 AND #$03 Limit that number to 0-3.
- $EFC6:D0 1C BNE $EFE4 If it's 0, then the enemy will run away.
- Chances of the hero running:
- The code What it does
- ------------------------- --------------------------------------------------
- $EE91:20 5B C5 JSR $C55B
- $EE94:A5 E0 LDA $00E0 Load the current enemy.
- $EE96:C9 23 CMP #$23 Compare its ID to 0x23.
- $EE98:90 05 BCC $EE9F
- $EE9A:A5 95 LDA $0095 If it's greater or equal to 0x23, use a plain
- $EE9C:4C C7 EE JMP $EEC7 random number 0-255.
- $EE9F:C9 1E CMP #$1E Otherwise if it's greater or equal to 0x1E...
- $EEA1:90 07 BCC $EEAA
- $EEA3:A5 95 LDA $0095
- $EEA5:29 7F AND #$7F ...use a random number limited to 0-127.
- $EEA7:4C C7 EE JMP $EEC7
- $EEAA:C9 14 CMP #$14 Otherwise if it's greater or equal to 0x14...
- $EEAC:90 12 BCC $EEC0
- $EEAE:A5 95 LDA $0095
- $EEB0:29 3F AND #$3F
- $EEB2:85 3E STA $003E ...put a random number limited to 0-63 at $3E.
- $EEB4:20 5B C5 JSR $C55B
- $EEB7:A5 95 LDA $0095
- $EEB9:29 1F AND #$1F
- $EEBB:65 3E ADC $003E Add another random number limited to 0-31 to $3E.
- $EEBD:4C C7 EE JMP $EEC7 This effectively makes the random number 0-94.
- $EEC0:20 5B C5 JSR $C55B
- $EEC3:A5 95 LDA $0095 If the enemyID is less than 0x14, load a random
- $EEC5:29 3F AND #$3F number and limit it to 0-63.
- $EEC7:85 3C STA $003C Store whatever the limited random number is at $3C
- $EEC9:AD 01 01 LDA $0101 Load the enemy's strength.
- $EECC:85 3E STA $003E Store it at $3E.
- $EECE:A9 00 LDA #$00
- $EED0:85 3D STA $003D
- $EED2:85 3F STA $003F
- $EED4:20 C9 C1 JSR $C1C9 Multiply the random number by the enemy's strength
- $EED7:A5 40 LDA $0040
- $EED9:85 42 STA $0042
- $EEDB:A5 41 LDA $0041
- $EEDD:85 43 STA $0043 Store the double byte $4041 at $4243.
- $EEDF:20 5B C5 JSR $C55B
- $EEE2:A5 95 LDA $0095
- $EEE4:85 3C STA $003C Put a random number at $3C.
- $EEE6:A5 C9 LDA $00C9 Load the hero's agility.
- $EEE8:85 3E STA $003E
- $EEEA:A9 00 LDA #$00
- $EEEC:85 3D STA $003D
- $EEEE:85 3F STA $003F
- $EEF0:20 C9 C1 JSR $C1C9 Multiply the random number by the hero's agility.
- $EEF3:A5 40 LDA $0040
- $EEF5:38 SEC
- $EEF6:E5 42 SBC $0042
- $EEF8:A5 41 LDA $0041
- $EEFA:E5 43 SBC $0043 Subtract the product $4041 from $4243.
- $EEFC:60 RTS
- $E89B:B0 07 BCS $E8A4 If the result is less than 0, the attempt to flee
- is successful.
- Essentially the harder enemies get, the better the chances that they'll have of
- blocking you.
- Here are the conditionals for being blocked:
- Group 1 (0x00-0x13): (EnemyAgility * (RAND >> 2)) > (HeroAgility * RAND)
- Group 2 (0x04-0x1D): (EnemyAgility * ((RAND >> 2) + (RAND >> 3))) >
- (HeroAgility * RAND)
- Group 3 (0x1E-0x22): (EnemyAgility * RAND) >> 1 > (HeroAgility * RAND)
- Group 4 (0x23-0x27): (EnemyAgility * RAND) > (HeroAgility * RAND)
- The only condition where running always works is if the enemy is asleep:
- The code What it does
- ------------------------- --------------------------------------------------
- $E894:24 DF BIT $00DF Get bit 6 of $DF, which is if the enemy is asleep.
- $E896:70 0C BVS $E8A4 If he's asleep, running is successful.
- -=Initiative=-
- This is the same equation as running from enemies in Group 1 ($EEC0), except
- instead of the hero being blocked, the enemy will go first.
- *************************
- C. Chests
- *************************
- Each chest type has an ID that corresponds to what treasure is inside.
- Chest ID Chest location Contents Code location
- -------- -------------------- ------------------------- -------------
- 02 Charlock B7 (x2) Herb $E248
- Garinham back room
- Grave of Garinham B1
- Mountain Cave B1
- 03 Charlock B7 Magic Key $E226
- Tantegel throne room
- 04 Garinham back room Torch $E26C
- Mountain cave B2
- Tantegel throne room
- 05
- 06 Charlock B7 Wings $E242
- Rimuldar
- 09 Mountain Cave B2 Fighter's Ring $E26C
- 0C Charlock B7 Cursed Belt $E26C
- Grave of Garinham B3
- 0D Grave of Garinham B3 Silver Harp $E2B9
- 0E Mountain Cave B2 0x05 + (RAND & 0x0F) Gold $E250
- or 1/32 chance for the
- Death Necklace (but only
- one can be acquired).
- 0F Tantegel basement Stones of Sunlight $E2DB
- 10 Shrine west of Kol Staff of Rain $E26C
- 11 Charlock B2 Erdrick's Sword $E297
- 12 Garinham B1 0x05 + (RAND & 0x0F) Gold $E2F1
- 13 Garinham B1 0x06 + (RAND & 0x07) Gold $E303
- Tantegel treasury (x4)
- 14 Garinham back room 0x0A + (RAND & 0x07) Gold $E315
- Mountain Cave B2
- 15 Charlock B7 0x1F4 + RAND Gold $E327
- 16 Tantegel throne room 120 Gold $E339
- 17 Erdrick's Cave B2 Erdrick's Tablet $E3C5
- Notice that several of the locations refer to $E26C. This code takes the chest
- ID and subtracts 3 from it to determine what item you should get.
- Also, it would seem that various IDs are missing, but were never intended to be
- found in chests. Some of the same algorithms work with buying and receiving
- items.
- -=The treasure chest bug=-
- The code for opening a treasure chest:
- The code What it does
- ------------------------- --------------------------------------------------
- $E209:A5 3A LDA $003A Load the hero's x position.
- $E20B:D9 21 03 CMP $0321,Y Check if that x position contains treasure.
- $E20E:D0 07 BNE $E217
- $E210:A5 3B LDA $003B If it does, load the hero's y position.
- $E212:D9 22 03 CMP $0322,Y Check if that y position contains treasure.
- $E215:F0 0A BEQ $E221
- $E221:B9 23 03 LDA $0323,Y If it does, load the treasure ID.
- $E224:85 DE STA $00DE Store it at $DE.
- So instead of checking if the actual sprite behind the hero is a treasure chest
- , it looks to see if that is a valid position for treasure. We will see why
- this is prone to be buggy in a bit. After the above code it starts checking
- which treasure to give you, which we'll skip here. Instead we'll move to right
- after that where that position is added to an array of coordinates:
- The code What it does
- ------------------------- --------------------------------------------------
- $E39A:A2 00 LDX #$00 Set the pointer to the start of the array.
- $E39C:BD 1C 60 LDA $601C,X Check if the first slot is empty.
- $E39F:1D 1D 60 ORA $601D,X Also check if the second slot is empty.
- $E3A2:F0 07 BEQ $E3AB If they are full, then branch.
- $E3A4:E8 INX
- $E3A5:E8 INX Otherwise add 2 to the pointer.
- $E3A6:E0 10 CPX #$10 If the pointer is greater than or equal to the
- $E3A8:D0 F2 BNE $E39C size of the array, then the checking is complete.
- $E3AA:60 RTS Otherwise repeat the search for an empty slot.
- $E3AB:A5 3A LDA $003A If an empty slot was found, load the x coordinate
- $E3AD:9D 1C 60 STA $601C,X into it.
- $E3B0:A5 3B LDA $003B And load the y coordinate into the next slot.
- $E3B2:9D 1D 60 STA $601D,X
- The problem here comes if the array is full. If the array is full, the
- coordinates of the current chest won't be stored there and consequently you'd
- be able to keep opening that chest. The programmers thought they got around
- this with various methods. They made sure that no dungeon would contain more
- chests than could fit into the array, which would be 8. And whenever you
- entered or exited a town or dungeon, the array was always wiped. What they
- didn't foresee was to clear the array when you die. So you could go into a
- dungeon, collect treasure chests, die, and wake up in the castle with that
- array still full. On top of that, every time you start off in the throne room
- of Tantegel, it automatically fills the last 3 positions of the array so that
- you aren't able to pick up the initial 3 treasures anymore. It doesn't matter
- that you can't see the chests because as previously mentioned, seeing them
- doesn't matter. It's the array of coordinates that matter. So if you get
- enough chests in a cave (2 minimum), die, and raid the treasury in Tantegel,
- you will come upon a chest that never disappears. All because that coordinate
- can never be stored in that full array.
- *************************
- D. Name choice and stats
- *************************
- The algorithm for figuring out stats in relation to your name. This loads the
- base values for the four main stats plus which spells you will have at that
- level:
- The code What it does
- ------------------------- --------------------------------------------------
- $99C0:A4 3C LDY $003C
- $99C2:B1 22 LDA ($22),Y Get the strength value.
- $99C4:85 C8 STA $00C8 Store it.
- $99C6:C8 INY Increment the pointer.
- $99C7:B1 22 LDA ($22),Y Get the agility value.
- $99C9:85 C9 STA $00C9 Store it.
- $99CB:C8 INY Increment the pointer.
- $99CC:B1 22 LDA ($22),Y Get the max HP value.
- $99CE:85 CA STA $00CA Store it.
- $99D0:C8 INY Increment the pointer.
- $99D1:B1 22 LDA ($22),Y Get the max MP value.
- $99D3:85 CB STA $00CB Store it.
- $99D5:C8 INY Increment the pointer.
- $99D6:B1 22 LDA ($22),Y Get the higher level spells.
- $99D8:05 CF ORA $00CF
- $99DA:85 CF STA $00CF Store it in bits 0 and 1 of $CF.
- $99DC:C8 INY Increment the pointer.
- $99DD:B1 22 LDA ($22),Y Get the lower level spells.
- $99DF:85 CE STA $00CE Store it at $CE.
- Later, the value of each of the first four letters of your name is added up:
- The code What it does
- ------------------------- --------------------------------------------------
- $F085:A2 04 LDX #$04 Set the pointer to 4.
- $F087:A9 00 LDA #$00 Set the sum to 0.
- $F089:18 CLC
- $F08A:7D B4 00 ADC $00B4,X Add the value of $B4 offset by the pointer to the
- sum.
- $F08D:CA DEX Subtract 1 from the pointer.
- $F08E:D0 F9 BNE $F089 If it's 0, continue.
- Decide from that sum which attributes will be limited:
- The code What it does
- ------------------------- --------------------------------------------------
- $F090:85 42 STA $0042 Store the sum of the letters at $42.
- $F092:29 03 AND #$03 Get bits 0 and 1 of the sum.
- $F094:85 43 STA $0043 Store that at $43.
- $F096:A5 42 LDA $0042 Load the sum.
- $F098:4A LSR
- $F099:4A LSR Divide it by 4.
- $F09A:29 03 AND #$03 Get bits 0 and 1 of the result.
- $F09C:85 42 STA $0042 Store that at $42.
- $F09E:A5 43 LDA $0043 Load $43 (bits 0 and 1 of the sum).
- $F0A0:4A LSR
- $F0A1:B0 0A BCS $F0AD
- $F0A3:A5 C8 LDA $00C8 If it's an even number, limit the strength.
- $F0A5:20 0C F1 JSR $F10C
- $F0A8:85 C8 STA $00C8
- $F0AA:4C B6 F0 JMP $F0B6
- $F0AD:A5 CB LDA $00CB If it's an odd number, limit the MP.
- $F0AF:F0 05 BEQ $F0B6
- $F0B1:20 0C F1 JSR $F10C
- $F0B4:85 CB STA $00CB
- $F0B6:A5 43 LDA $0043 Load $43 (bits 0 and 1 of the sum).
- $F0B8:29 02 AND #$02 Get just bit 1.
- $F0BA:D0 0A BNE $F0C6 If bit 1 of the sum is 0, limit the agility.
- $F0BC:A5 C9 LDA $00C9
- $F0BE:20 0C F1 JSR $F10C
- $F0C1:85 C9 STA $00C9
- $F0C3:4C CD F0 JMP $F0CD
- $F0C6:A5 CA LDA $00CA If bit 1 of the sum is 1, limit the HP.
- $F0C8:20 0C F1 JSR $F10C
- $F0CB:85 CA STA $00CA
- The limiting of the attributes:
- The code What it does
- ------------------------- --------------------------------------------------
- $F10C:85 3C STA $003C Store the current attribute at $3C.
- $F10E:A9 09 LDA #$09
- $F110:85 3E STA $003E
- $F112:A9 00 LDA #$00
- $F114:85 3D STA $003D
- $F116:85 3F STA $003F
- $F118:20 C9 C1 JSR $C1C9 Multiply the attribute by 9.
- $F11B:A5 40 LDA $0040
- $F11D:85 3C STA $003C
- $F11F:A5 41 LDA $0041
- $F121:85 3D STA $003D Store the result in the double byte $3C3D.
- $F123:A9 0A LDA #$0A
- $F125:85 3E STA $003E
- $F127:A9 00 LDA #$00
- $F129:85 3F STA $003F
- $F12B:20 F4 C1 JSR $C1F4 Divide the result by 10.
- $F12E:A5 3C LDA $003C
- $F130:18 CLC Take that result and add it to $42, which is now
- $F131:65 42 ADC $0042 bits 2 and 3 of the original sum.
- So in general, the best sums are those where bits 2 and 3 are both 1. Bit 0 of
- the sum determines if it will be long term strength or long term MP. Bit 1 of
- the sum determines if it will be long term agility or long term HP.
- *******************************************************************************
- * IV. Frequently Asked Questions *
- *******************************************************************************
- Q: What is the best way to contact you?
- A: I read the gamefaqs.com forum for Dragon Warrior fairly often. I seldom
- check my e-mail.
- Q: Will you ever figure out formulas for other games like the rest of the
- Dragon Warrior series or other RPGs?
- A: I never say never, but I have no plans in the immediate future.
- Q: What does the Fighter's Ring do?
- A: It has no meaningful purpose. It only changes what a single townsperson
- says. Don't pay any attention to websites, FAQs, or even original manuals
- that say otherwise. They all just assumed that it had a function and made a
- sloppy guess that has carried on for some time.
- Q: Does the Silver Harp have any other effects depending on your location?
- A: Nope. It always summons the same lame group of enemies.
- Q: Is there a limit to how long enemies can be asleep?
- A: No. The reason the hero's nap time is limited is because the limited random
- generator produces distinct patterns when run consecutively. If you sit by
- idly while waiting to make a command, the random generator is run 60 times
- per second. This effectively makes it a time-based random, which can result
- in any outcome. Tool-assisted speedruns have taken advantage of this.
- Q: Is it possible to get in an encounter the first step after battle?
- A: Yes. There is no counter, so theoretically you could have infinte
- encounters in a row. This is actually used in various tool-assisted speed
- runs to level up quickly.
- FAQ Display Options: Printable Version
- GameFAQs.comfacebook.com/GFAQstwitter.com/GameFAQsHelp / Contact UsChange Colors
- gamespot.comgiantbomb.commetacritic.comgamerankings.com
- © 2017 CBS Interactive Inc. All rights reserved.SitemapAdvertisePartnershipsCareersPrivacy PolicyAd ChoiceTerms of Use
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement