Wizardry V: Heart of the Maelstrom/Save State Hacking: Difference between revisions

From StrategyWiki, the video game walkthrough and strategy guide wiki
m
fixed game name
m (wikify update)
m (fixed game name)
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{wikify}}
{{cleanup}}
{{drivel}}
{{drivel}}
{{Header Nav|game=Wizardry V}}
{{Header Nav|game=Wizardry V: Heart of the Maelstrom}}
I've been hex editing everything from emulation save states, to PC save games for a while now, but mostly for personal use. Basically, I've had all the offset locations for the stats and stuff. All I needed was a few more things and it was complete.  
I've been hex editing everything from emulation save states, to PC save games for a while now, but mostly for personal use. Basically, I've had all the offset locations for the stats and stuff. All I needed was a few more things and it was complete.  


Line 19: Line 19:
<!-- In the rest of this section there are numbers in brackets. They refer to the original numbers for each section before the guide was cleaned up and copy edited. To fix the scentences that refer to these numbers will most likely require skimming the original version of this that was imported to find out what titles/sections they are referring to. Please do not remove this note unless the numbers in brackets have been fixed. -->Also, the SNES emulator I was using was ZSNES 1.35. I am not sure if all emulators save states the exact same way. If you aren't sure, download ZSNES and take a simple save state (of anything) and compare the *DOS* file sizes to see if they are the same size. The reason I say to use DOS, is that Windows (which I assume you are using) displays file sizes in Kilobytes, and rounds out. DOS displays file sizes in bytes and, therefore, is more accurate. Even if the files are only a few bytes apart, I would still try. Some emulators might add a few extra info, like the emulator version. An alternative method is to open up the save state file, look at offset 1C15, and see if the first letter of the first character's name is there. If not, you can still look around for your characters' names and then just add or subtract that many (in hex) from the values I give in section [5].
<!-- In the rest of this section there are numbers in brackets. They refer to the original numbers for each section before the guide was cleaned up and copy edited. To fix the scentences that refer to these numbers will most likely require skimming the original version of this that was imported to find out what titles/sections they are referring to. Please do not remove this note unless the numbers in brackets have been fixed. -->Also, the SNES emulator I was using was ZSNES 1.35. I am not sure if all emulators save states the exact same way. If you aren't sure, download ZSNES and take a simple save state (of anything) and compare the *DOS* file sizes to see if they are the same size. The reason I say to use DOS, is that Windows (which I assume you are using) displays file sizes in Kilobytes, and rounds out. DOS displays file sizes in bytes and, therefore, is more accurate. Even if the files are only a few bytes apart, I would still try. Some emulators might add a few extra info, like the emulator version. An alternative method is to open up the save state file, look at offset 1C15, and see if the first letter of the first character's name is there. If not, you can still look around for your characters' names and then just add or subtract that many (in hex) from the values I give in section [5].


Now that we've gotten that our of the way, the best way to go about using this guide would be this:
Now that we've gotten that out of the way, the best way to go about using this guide would be this:


Look through section [4] to see what you want to edit. Each element in the game that is covered in this guide will have a description, as well as the format used to edit it. How many bytes long and what the values mean, for example. Then, go to section [5] to see where exactly you want to apply it to.
Look through section [4] to see what you want to edit. Each element in the game that is covered in this guide will have a description, as well as the format used to edit it. How many bytes long and what the values mean, for example. Then, go to section [5] to see where exactly you want to apply it to.
Line 30: Line 30:
Basically, each character is exactly 128 bytes apart from the start of the next character. This is perfect, as all (or at least they should) hex editors display characters 16 bytes wide which, in turn, means all the characters' data will be perfectly aligned. This is useful because you can just scroll down 8 lines in order to edit the next character, in the same offset. That probably didn't make much sense but you'll see what I mean when you start editing for all characters at once.
Basically, each character is exactly 128 bytes apart from the start of the next character. This is perfect, as all (or at least they should) hex editors display characters 16 bytes wide which, in turn, means all the characters' data will be perfectly aligned. This is useful because you can just scroll down 8 lines in order to edit the next character, in the same offset. That probably didn't make much sense but you'll see what I mean when you start editing for all characters at once.


The 128 block of data for each character looks something like this:
;The 128 block of data for each character looks something like this.
<pre>
{{col|2|begin}}
Byte Position   |
{| {{prettytable}}
from start of   |
!Byte Position from start of character!!What is stored in the value
character.      | What is stored in the value.
|-
----------------|------------------------------------------------------
|1-8||Character Name
            1-8 | Character Name
|-
              9 | Alignment/Class/Race (compressed)
|9||Alignment/Class/Race (compressed)  
            10 | Strength
|-
            11 | IQ
|10||Strength
            12 | Devotion
|-
            13 | Vitality
|11||IQ
            14 | Agility
|-
            15 | Luck
|12||Devotion
          16-21 | Gold
|-
          22-27 | E.P (Experience Points)
|13||Vitality
          28-29 | Current Hit Points
|-
          30-31 | Maximum Hit Points
|14||Agility
          32-33 | Level
|-
            34 | Status
|15||Luck
            35 | Age
|-
            36 | ???
|16-21||Gold
            37 | AC (Armor Class)
|-
          38-44 | Mage spell points
|22-27||E.P (Experience Points)  
          45-51 | Cleric spell points
|-
          52-58 | Mage spells
|28-29||Current Hit Points
          59-65 | Cleric spells
|-
          66-73 | Inventory status indicator
|30-31||Maximum Hit Points
          74-81 | Inventory slots 1-8
|-
            82 | Max inventory indicator
|32-33||Level
            83 | Poison strength?
|-
          84-86 | ???
|34||Status
            87 | Symbol next to name?
|-
          88-97 | ???
|35||Age
        98-103 | Marks (Kills)
|-
        104-105 | RIPs (Deaths)
|36||???  
        106-128 | ???
|}
</pre>
{{col|2}}
{| {{prettytable}}
!Byte Position from start of character!!What is stored in the value
|-
|37||AC (Armor Class)  
|-
|38-44||Mage spell points
|-
|45-51||Cleric spell points
|-
|52-58||Mage spells
|-
|59-65||Cleric spells
|-
|66-73||Inventory status indicator
|-
|74-81||Inventory slots 1-8
|-
|82||Max inventory indicator
|-
|83||Poison strength?  
|-
|84-86||???  
|-
|87||Symbol next to name?  
|-
|88-97||???  
|-
|98-103||Marks (Kills)  
|-
|104-105||RIPs (Deaths)  
|-
|106-128||???
|}
{{col|2|end}}
 
There are a few gaps within the majority of the data block, and a large one at the end until you reach the next character. I don't know what these do exactly, and I don't think I want to experiment around. They might be objective flags, but I'm not too sure.
There are a few gaps within the majority of the data block, and a large one at the end until you reach the next character. I don't know what these do exactly, and I don't think I want to experiment around. They might be objective flags, but I'm not too sure.


Line 85: Line 120:


As noted from the table above, the A/C/R value has been compressed. Sort of. Instead of a value for each, it can represent every possible combination of character's alignment, class and race into 1 value. Although it seems impossible it works quite well. Basically, every time you change this value by one, you change the alignment. For every 4 steps, you change the class type (Fighter, Thief, Mage, etc.) and end up with the same alignment. For every 32 steps, you change the race, but the alignment and class remains the same. With the above information we can use this procedure to completely change a character's a/c/r (we will be using decimal for this example, just add along the numbers):
As noted from the table above, the A/C/R value has been compressed. Sort of. Instead of a value for each, it can represent every possible combination of character's alignment, class and race into 1 value. Although it seems impossible it works quite well. Basically, every time you change this value by one, you change the alignment. For every 4 steps, you change the class type (Fighter, Thief, Mage, etc.) and end up with the same alignment. For every 32 steps, you change the race, but the alignment and class remains the same. With the above information we can use this procedure to completely change a character's a/c/r (we will be using decimal for this example, just add along the numbers):
<pre>
#Determine the Race.
First, determine the Race-
#Determine the Class.
#Determine the alignment.


  Human   - Add 0
{{col|3|begin}}
  Elf     - Add 32
{| {{prettytable}}
  Dwarf   - Add 64
|+Add for Race
  Gnome   - Add 96
!Race!!Add
  Hobbit - Add 128
|-
|Human||0
|-
|Elf||32
|-
|Dwarf||64
|-
|Gnome||96
|-
|Hobbit||128
|}


Second, determine the Class-
{{col|3}}


  Fighter - Add 0
{| {{prettytable}}
  Mage   - Add 4
|+ Add for Class
  Cleric - Add 8
!Class!!Add
  Thief   - Add 12
|-
  Wizard - Add 16
|Fighter||0
  Samurai - Add 20
|-
  Lord   - Add 24
|Mage||4
  Ninja   - Add 28
|-
|Cleric||8
|-
|Thief||12
|-
|Wizard||16
|-
|Samurai||20
|-
|Lord||24
|-
|Ninja||28
|}


Finally, determine the alignment-
{{col|3}}


  Good   - Add 0
{| {{prettytable}}
  Neutral - Add 1
|+ Add for Alignment
  Evil   - Add 2
!Alignment!!Add
  ?       - Add 3
|-
</pre>
|Good||0
|-
|Neutral||1
|-
|Evil||2
|-
|?||3
|}
{{col|3|end}}


Then, all you have to do, is convert the finally decimal value into hex and use that value. '''Example:''' We want an Elf (32) Lord (24) who is Neutral (1). 32 + 24 + 1 = 57. Convert it into hex and we get 39. So, if we wanted to change character 1, we slap the value 39 in offset address 1C1D and boom. We now have a neutral Elf Lord. At level 1 :) The '?' alignment I decided to keep in even though I didn't experiment with it any. My guess is that it's kind of like Type-O blood. It can hang around other people with a '?' alignment, as well as G-N-E characters. I could be wrong, though.
Then, all you have to do, is convert the finally decimal value into hex and use that value. '''Example:''' We want an Elf (32) Lord (24) who is Neutral (1). 32 + 24 + 1 = 57. Convert it into hex and we get 39. So, if we wanted to change character 1, we slap the value 39 in offset address 1C1D and boom. We now have a neutral Elf Lord. At level 1 :) The '?' alignment I decided to keep in even though I didn't experiment with it any. My guess is that it's kind of like Type-O blood. It can hang around other people with a '?' alignment, as well as G-N-E characters. I could be wrong, though.


Also, You probably would only want to change someone's alignment, so you can mix good/evil characters in one party (unless you have patience enough to do that one trick that does the same job). In that case, just use the third table above and +/- the hex value accordingly. Have a good character that needs a touch of evil? Increase the value by 2. How about a neutral character that wants to be good? Decrease it by 1. It is the same with races and classes. Just add/subtract 32 or 4 from the value, respectively. Remember to use hex when just changing the a/c/r.
Also, you probably would only want to change someone's alignment, so you can mix good/evil characters in one party (unless you have patience enough to do that one trick that does the same job). In that case, just use the third table above and +/- the hex value accordingly. Have a good character that needs a touch of evil? Increase the value by 2. How about a neutral character that wants to be good? Decrease it by 1. It is the same with races and classes. Just add/subtract 32 or 4 from the value, respectively. Remember to use hex when just changing the a/c/r.


===Strength, IQ, Devotion, Vitality, Agility and Luck===
===Strength, IQ, Devotion, Vitality, Agility and Luck===
Line 1,002: Line 1,068:
A. For some examples I used the xx xx format, for sake of example only. When I was explaining the ranges for certain stats within the game, it was either because the value wasn't a numerical value (continuous 'xxxx' format) or it was because the value was non-numerical like a text string, or each value within the range has it's own 'slot', like inventory or spell points (separated 'xx xx' format). Other than that, there really is no difference.
A. For some examples I used the xx xx format, for sake of example only. When I was explaining the ranges for certain stats within the game, it was either because the value wasn't a numerical value (continuous 'xxxx' format) or it was because the value was non-numerical like a text string, or each value within the range has it's own 'slot', like inventory or spell points (separated 'xx xx' format). Other than that, there really is no difference.


{{Footer Nav|game=Wizardry V|prevpage=|nextpage=}}
{{Footer Nav|game=Wizardry V: Heart of the Maelstrom|prevpage=|nextpage=}}