DO/ARM
From Dark Omen Wiki
Bembelimen (Talk | contribs) (Undo revision 2336 by 93.74.68.122 (Talk)) |
(→Savegame Header: Coloring all known stuff. Could be wrong if you are unlucky ;)) |
||
(19 intermediate revisions not shown) | |||
Line 5: | Line 5: | ||
==Layout overview== | ==Layout overview== | ||
The .ARM format is a binary format, the layout of which is very simple from a large-scale perspective: It starts with a 192 bytes header, which is followed by several 188-byte regiment records. | The .ARM format is a binary format, the layout of which is very simple from a large-scale perspective: It starts with a 192 bytes header, which is followed by several 188-byte regiment records. | ||
- | |||
- | |||
==Header== | ==Header== | ||
Line 17: | Line 15: | ||
<span style="color:rgb(128,128,128); border-right:1px solid brown;">00 </span> <span style="background:gray;">9E 02 00 00</span> <span style="background:CornflowerBlue">04 00 00 00</span> <span style="background:purple;">BC 00 00 00</span> <span style="background:CadetBlue;">01</span> 00 00 00 <span style="margin-left:1em;background:gray;">670</span> <span style="background:CornflowerBlue">No. of Units</span> <span style="background:purple;">Size of Unit (188bytes)</span> <span style="background:CadetBlue;">Race (see below)</span><br /> | <span style="color:rgb(128,128,128); border-right:1px solid brown;">00 </span> <span style="background:gray;">9E 02 00 00</span> <span style="background:CornflowerBlue">04 00 00 00</span> <span style="background:purple;">BC 00 00 00</span> <span style="background:CadetBlue;">01</span> 00 00 00 <span style="margin-left:1em;background:gray;">670</span> <span style="background:CornflowerBlue">No. of Units</span> <span style="background:purple;">Size of Unit (188bytes)</span> <span style="background:CadetBlue;">Race (see below)</span><br /> | ||
- | <span style="color:rgb(128,128,128); border-right:1px solid brown;">10 </span> <span style=" | + | <span style="color:rgb(128,128,128); border-right:1px solid brown;">10 </span> <span style="background:SaddleBrown;">15 00</span> <span style="background:GoldenRod;color:black;">00 F8 02 00 E6 83 03 00 65 00 00 00 00 00</span> <span style="margin-left:1em;background:SaddleBrown;">Default Name</span> <span style="background:GoldenRod;color:black;">Regiment Name</span><br /> |
<span style="color:rgb(128,128,128); border-right:1px solid brown;">20 </span> <span style="background:GoldenRod;color:black;">00 00 00 00 90 20 52 F7 35 01 39 01 02 00 79 00</span><br /> | <span style="color:rgb(128,128,128); border-right:1px solid brown;">20 </span> <span style="background:GoldenRod;color:black;">00 00 00 00 90 20 52 F7 35 01 39 01 02 00 79 00</span><br /> | ||
Line 33: | Line 31: | ||
<span style="color:rgb(128,128,128); border-right:1px solid brown;">80 </span> <span style="background:brown;">73 70 72 00 4E 23 7F 17 08 03 B7 1F 67 1F 0C 05</span><br /> | <span style="color:rgb(128,128,128); border-right:1px solid brown;">80 </span> <span style="background:brown;">73 70 72 00 4E 23 7F 17 08 03 B7 1F 67 1F 0C 05</span><br /> | ||
- | <span style="color:rgb(128,128,128); border-right:1px solid brown;">90 </span> <span style="background:brown;">44 00</span> <span style=" | + | <span style="color:rgb(128,128,128); border-right:1px solid brown;">90 </span> <span style="background:brown;">44 00</span> <span style="background:DarkSlateGray;">FB 00</span> <span style="background:Indigo;">64 00</span> <span style="background:DarkRed;">00 00 00 00 00 00 00 00 00 00</span> <span style="margin-left:1em;background:DarkSlateGray;">Money from Treasures</span> <span style="background:Indigo;">Money</span> <span style="background:DarkRed;">Magic Items</span><br /> |
<span style="color:rgb(128,128,128); border-right:1px solid brown;">A0 </span> <span style="background:DarkRed;">00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span><br /> | <span style="color:rgb(128,128,128); border-right:1px solid brown;">A0 </span> <span style="background:DarkRed;">00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span><br /> | ||
Line 59: | Line 57: | ||
{| class="wikitable" style="empty-cells:hide; border-collapse:separate;" | {| class="wikitable" style="empty-cells:hide; border-collapse:separate;" | ||
- | ! Data attribute !! Offset !! Byte size !! Notes | + | ! Data attribute !! Offset !! Byte size !! Notes |
|- | |- | ||
- | | File ID || 0 || 4 || Always 9E 02 00 00 for Dark Omen .ARM files | + | | File ID || 0 || 4 || Always 9E 02 00 00 for Dark Omen .ARM files |
|- | |- | ||
| # regiments blocks || 4 || 4 || | | # regiments blocks || 4 || 4 || | ||
Line 69: | Line 67: | ||
| Race || 12 || 1 || | | Race || 12 || 1 || | ||
|- | |- | ||
- | | Unknown || 13 || | + | | Unknown || 13 || 3 || '''Unknown data''' |
- | |- | + | |- |
+ | | Default Name || 16 || 2 || Used by the included Demo Armies, "Army Name" must be empty. | ||
+ | |- | ||
| Army name || 18 || 32 || 0-term string | | Army name || 18 || 32 || 0-term string | ||
|- | |- | ||
Line 79: | Line 79: | ||
| Large banner bitmap file || 114 || 32 || 0-term string (path + filename) | | Large banner bitmap file || 114 || 32 || 0-term string (path + filename) | ||
|- | |- | ||
- | | | + | | Money from Treasures || 146 || 2 || Used for "You collected x gold"-Text at summary screen |
|- | |- | ||
- | | Gold in coffers || 148 || 2 || | + | | Gold in coffers || 148 || 2 || Available Gold |
|- | |- | ||
- | | Magic items || 150 || 40 || | + | | Magic items || 150 || 40 || One byte per item |
|- | |- | ||
- | | Unknown || 190 || 2 || | + | | Unknown || 190 || 2 || Often either DC 84 or 00 00 |
|} | |} | ||
+ | |||
+ | ==Savegame Header== | ||
+ | |||
+ | A savegame is in short an army file with an additional header located before the army header (and with lots of unknown data after the regiment data) | ||
+ | |||
+ | The Save files (*.[0-9]{3}) header has a size of 504-byte. Most parts of it are unknown. | ||
+ | |||
+ | At least the following things must be in the Save file (if you find out where they are please mark them in the example): | ||
+ | * Your current progress | ||
+ | * Your success in defeating Manfred von Carstein (defines if Black Pyramide MB5_01 or MB5_01B are loaded at the end), the Hand of Nagash or the Black Grail (they will help the Dread King when you lose) - OT: Looks like CTL scripts can read savegame data or is this just a special parameter passed by the engine when loading the map? | ||
+ | * Path you've choosen e.g. in Chapter 3 (Hand of Nagash): If you help Munz or Ragnar you will lose time and more undeads will attack you in the Hand of Nagash mission (is this confirmed? At least Matthias and Klaus say this) | ||
+ | * Used/Killed/Lost Units (for the stats page displayed after the battle) | ||
+ | * Play Time (maybe ^^) | ||
+ | * ... | ||
+ | |||
+ | Example (Endgame Save (Dread King defeated)): | ||
+ | <div style="white-space:nowrap; overflow:hidden; font-family:courier;border:2px solid gray; margin:1em; padding:1em; background:black; color:rgb(200,200,200);width:auto;"> | ||
+ | <p> <span style="color:rgb(128,128,128); border-bottom:1px solid brown;">00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">000 </span> | ||
+ | <span style="background:gray;">44 65 72 20 44 72 65 61 64 20 4B 69 6E 67 20 69</span> <span style="margin-left:1em;background:gray;">Save Game Name</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">010 </span> | ||
+ | <span style="background:gray;">73 74 20 62 65 73 69 65 67 74 20 2D 20 38 33 31</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">020 </span> | ||
+ | <span style="background:gray;">34 67 63 00 00 00 00 00</span> 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">030 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">040 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">050 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 <span style="background:CornflowerBlue">44 69 65 20 73 63</span> <span style="margin-left:1em;background:CornflowerBlue">Suggested Save Name</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">060 </span> | ||
+ | <span style="background:CornflowerBlue">68 77 61 72 7A 65 20 50 79 72 61 6D 69 64 65 00</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">070 </span> | ||
+ | <span style="background:CornflowerBlue">00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">080 </span> | ||
+ | <span style="background:CornflowerBlue">00 00</span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">090 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">0A0 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">0B0 </span> | ||
+ | 00 00 00 00 00 00 00 00 01 00 00 00 <span style="background:purple;">3A 00 00 00</span> <span style="margin-left:1em;background:purple;">WHMTG Program Counter</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">0C0 </span> | ||
+ | 48 00 00 00 <span style="background:CadetBlue;">90 3D 4C 00</span> <span style="background:DarkGreen;">70 CE 4C 00</span> <span style="background:DarkBlue;">01 00 00 00</span> <span style="margin-left:1em;background:CadetBlue;">Entrypoint</span> <span style="background:DarkGreen;">Selected Choice</span> <span style="background:DarkBlue;">LV?</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">0D0 </span> | ||
+ | 01 00 00 00 <span style="background:brown;">10 00 00 00</span> 00 00 00 00 00 00 00 00 <span style="margin-left:1em;background:brown;">Stack Pointer</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">0E0 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">0F0 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">100 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">110 </span> | ||
+ | 00 00 00 00 07 00 00 00 2E 00 00 00 01 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">120 </span> | ||
+ | 25 0A 00 00 55 00 00 00 <span style="background:DarkSlateGray;">01 00 00 00</span> <span style="background:GoldenRod;color:black;">02 00 00 00</span> <span style="margin-left:1em;background:DarkSlateGray;">WHMTG If Nestlevel</span> <span style="background:GoldenRod;color:black;">GoSub Nestlevel</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">130 </span> | ||
+ | <span style="background:Indigo;">01 00 00 00</span> 00 00 00 00 CA 94 47 02 39 00 00 00 <span style="margin-left:1em;background:Indigo;">Loop Nestlevel</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">140 </span> | ||
+ | 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">150 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">160 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">170 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">180 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">190 </span> | ||
+ | 00 00 00 00 00 00 00 00 <span style="background:DarkRed;">01 00 00 00</span> <span style="background:SteelBlue;color:white;">01 00 00 00</span> <span style="margin-left:1em;background:DarkRed;">Bogenhafen</span> <span style="background:SteelBlue;color:white;">Goblin or Ragnar</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">1A0 </span> | ||
+ | <span style="background:green;">01 00 00 00</span> <span style="background:RoyalBlue;">01 00 00 00</span> <span style="background:DarkSlateGray;color:White;">01 00 00 00</span> <span style="background:Gainsboro;color:black;">00 00 00 00</span> <span style="margin-left:1em;background:green;">Goblin Camp</span> <span style="background:RoyalBlue;">Pre-Ragnar</span> <span style="background:DarkSlateGray;color:White;">Ving. or Treeman</span> <span style="background:Gainsboro;color:black;">Ving.</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">1B0 </span> | ||
+ | <span style="background:blue;">01 00 00 00</span> <span style="background:Orange;color:black;">01 00 00 00</span> <span style="background:Pink;color:black;">01 00 00 00</span> <span style="background:DarkKhaki;color:white;">01 00 00 00</span> <span style="margin-left:1em;background:blue;">Treeman</span> <span style="background:Orange;color:black;">Carstein</span> <span style="background:Pink;color:black;">Nagash</span> <span style="background:DarkKhaki;color:white;">Grail Killed</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">1C0 </span> | ||
+ | 00 00 00 00 <span style="background:Green;">01 00 00 00</span> <span style="background:CornflowerBlue;">01 00 00 00</span> <span style="background:purple;">01 00 00 00</span> <span style="margin-left:1em;background:Green;">Helmgart</span> <span style="background:CornflowerBlue;">Ragnar</span> <span style="background:purple;">Loren King met</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">1D0 </span> | ||
+ | <span style="background:CadetBlue;">01 00 00 00</span> 00 00 00 00 00 00 00 00 00 00 00 00 <span style="margin-left:1em;background:CadetBlue;">Axebite Mission</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">1E0 </span> | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 <span style="background:DarkGreen;">01 00 00 00</span> <span style="margin-left:1em;background:DarkGreen;">Related to Mission result</span><br /> | ||
+ | <span style="color:rgb(128,128,128); border-right:1px solid brown;">1F0 </span> | ||
+ | <span style="background:DarkGreen;">01 00 00 00 01 00 00 00</span><br /> | ||
+ | </p> | ||
+ | </div> | ||
+ | |||
+ | It looks like the savegame header uses "32bit Booleans" to determine what kind of events happened. | ||
+ | |||
+ | From 0xBC to 0x198 is a 220 Byte copy of the internal struct of the WHMTG-Scriptengine. It's directly followed by a struct I call Game Progress, it fills the rest (60 bytes) of the Savegame header and contains the variables referenced by the WHMTG-Script. | ||
+ | |||
+ | ==Savegame Footer== | ||
+ | |||
+ | The footer has a size of 13788 Bytes (Trivia: A larger footer will prevent Dark Omen from detecting the file as a savegame) | ||
+ | |||
+ | It contains information where the animated objects (like burning torches) are placed on the last talk screen. | ||
==Regiment data== | ==Regiment data== | ||
+ | |||
+ | :'''For a complete list of all Dark Omen regiments, see [http://dev.dark-omen.org/regimentdata.html Regiment List]''' | ||
Regiment data starts at offset 192 (in savegames offset 696). Every regiment block has a size of 188 bytes. Example first regiment from B403NME.ARM: | Regiment data starts at offset 192 (in savegames offset 696). Every regiment block has a size of 188 bytes. Example first regiment from B403NME.ARM: | ||
Line 95: | Line 191: | ||
<div style="white-space:nowrap; overflow:hidden; font-family:courier;border:2px solid olive; margin:1em; padding:1em; background:black; color:rgb(200,200,200);width:auto;"> | <div style="white-space:nowrap; overflow:hidden; font-family:courier;border:2px solid olive; margin:1em; padding:1em; background:black; color:rgb(200,200,200);width:auto;"> | ||
<p> <span style="color:rgb(128,128,128); border-bottom:1px solid brown;">00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F</span><br /> | <p> <span style="color:rgb(128,128,128); border-bottom:1px solid brown;">00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F</span><br /> | ||
- | <span style="color:rgb(128,128,128); border-right:1px solid brown;">00 </span> <span style="background:gray;">10 00</span> 00 00 <span style="background:CornflowerBlue">81 00</span> 00 00 <span style="background:purple;">00</span> <span style="background:CadetBlue;">00</span> <span style="background:DarkGreen;">00 00</span> <span style="background:DarkBlue;">D5 00</span> 00 00 <span style="margin-left:1em;background:gray;">regiment status</span> <span style="background:CornflowerBlue">Unique Unit ID</span> <span style="background:purple;">Mage type</span> <span style="background:CadetBlue;">armour</span> <span style="background:DarkGreen;">cost</span> <span style="background:DarkBlue;">banner</span><br /> | + | <span style="color:rgb(128,128,128); border-right:1px solid brown;">00 </span> <span style="background:gray;">10 00</span> 00 00 <span style="background:CornflowerBlue">81 00</span> 00 00 <span style="background:purple;">00</span> <span style="background:CadetBlue;">00</span> <span style="background:DarkGreen;">00 00</span> <span style="background:DarkBlue;">D5 00</span> 00 00 <span style="margin-left:1em;background:gray;">regiment status</span> <span style="background:CornflowerBlue">Unique Unit ID</span> <span style="background:purple;">Mage type</span> <span style="background:CadetBlue;">max armour</span> <span style="background:DarkGreen;">cost</span> <span style="background:DarkBlue;">banner</span><br /> |
<span style="color:rgb(128,128,128); border-right:1px solid brown;">10 </span> <span style="background:brown;">20 00 00 00</span> <span style="background:DarkSlateGray;">30 00</span> <span style="background:GoldenRod;color:black;">4E 69 67 68 74 20 47 6F 62 6C</span> <span style="margin-left:1em;background:brown;">Regiment attributes</span> <span style="background:DarkSlateGray;">sprite</span> <span style="background:GoldenRod;color:black;">Unit name</span><br /> | <span style="color:rgb(128,128,128); border-right:1px solid brown;">10 </span> <span style="background:brown;">20 00 00 00</span> <span style="background:DarkSlateGray;">30 00</span> <span style="background:GoldenRod;color:black;">4E 69 67 68 74 20 47 6F 62 6C</span> <span style="margin-left:1em;background:brown;">Regiment attributes</span> <span style="background:DarkSlateGray;">sprite</span> <span style="background:GoldenRod;color:black;">Unit name</span><br /> | ||
Line 103: | Line 199: | ||
<span style="background:black;"> <span style="color:rgb(128,128,128); border-right:1px solid brown;">30 </span> </span>00 00 00 00 00 00</span> <span style="background:Indigo;">21 00</span> <span style="background:DarkRed;">80</span> <span style="background:SteelBlue;"><span style="color:white;">1B</span> <span style="color:yellow;">1B</span> <span style="color:Cyan;">05</span></span> 00 00 00 00 <span style="margin-left:1em;background:Indigo;">name ID</span> <span style="background:DarkRed;">alignment</span> <span style="background:SteelBlue;"><span style="color:white;">max units</span> <span style="color:yellow;">alive units</span> <span style="color:Cyan;">ranks</span></span><br /> | <span style="background:black;"> <span style="color:rgb(128,128,128); border-right:1px solid brown;">30 </span> </span>00 00 00 00 00 00</span> <span style="background:Indigo;">21 00</span> <span style="background:DarkRed;">80</span> <span style="background:SteelBlue;"><span style="color:white;">1B</span> <span style="color:yellow;">1B</span> <span style="color:Cyan;">05</span></span> 00 00 00 00 <span style="margin-left:1em;background:Indigo;">name ID</span> <span style="background:DarkRed;">alignment</span> <span style="background:SteelBlue;"><span style="color:white;">max units</span> <span style="color:yellow;">alive units</span> <span style="color:Cyan;">ranks</span></span><br /> | ||
- | <span style="color:rgb(128,128,128); border-right:1px solid brown;">40 </span> <span style="background:green;">04 02 03 03 03 01 02 01 05</span> <span style="background:RoyalBlue;"><span style="color:white;">00</span> <span style="color:LightGray;">01</span> <span style="color:yellow;">01</span> <span style="color:Gold;">0B</span> <span style="color:LightCyan;">04</span> <span style="color:Cyan;">00</span></span> 00 <span style="margin-left:1em;background:green;">Sldr attr</span> <span style="background:RoyalBlue;"><span style="color:white;">mount</span> <span style="color:LightGray;">armour</span> <span style="color:yellow;">weapon</span> <span style="color:Gold;">unit type</span> <span style="color:LightCyan;">point value</span> <span style="color:Cyan;">missile</span></span><br /> | + | <span style="color:rgb(128,128,128); border-right:1px solid brown;">40 </span> <span style="background:green;">04 02 03 03 03 01 02 01 05</span> <span style="background:RoyalBlue;"><span style="color:white;">00</span> <span style="color:LightGray;">01</span> <span style="color:yellow;">01</span> <span style="color:Gold;">0B</span> <span style="color:LightCyan;">04</span> <span style="color:Cyan;">00</span></span> <span style="outline:2px dotted pink;">00</span> <span style="margin-left:1em;background:green;">Sldr attr</span> <span style="background:RoyalBlue;"><span style="color:white;">mount</span> <span style="color:LightGray;">armour</span> <span style="color:yellow;">weapon</span> <span style="color:Gold;">unit type</span> <span style="color:LightCyan;">point value</span> <span style="color:Cyan;">missile</span></span><br /> |
- | <span style="color:rgb(128,128,128); border-right:1px solid brown;">50 </span> <span style="outline:1px solid red;">01</span> 00 00 00 <span style="background:DarkSlateGray;color:White;">30 00</span> <span style="background:Gainsboro;color:black;">78 00 00 00 00 00 00 00 00 00</span> <span style="margin-left:1em;background:DarkSlateGray;color:White;">leader sprite</span> <span style="background:Gainsboro;color:black;">leader name</span><br /> | + | <span style="color:rgb(128,128,128); border-right:1px solid brown;">50 </span> <span style="outline:2px dotted pink;"><span style="outline:1px solid red;">01</span> 00 00 00</span> <span style="background:DarkSlateGray;color:White;">30 00</span> <span style="background:Gainsboro;color:black;">78 00 00 00 00 00 00 00 00 00</span> <span style="margin-left:1em;background:DarkSlateGray;color:White;">leader sprite</span> <span style="background:Gainsboro;color:black;">leader name</span> <span style="outline:1px dotted pink;"><b>5 byte filler</b></span><br /> |
<span style="color:rgb(128,128,128); border-right:1px solid brown;">60 </span> <span style="background:Gainsboro;color:black;">00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span><br /> | <span style="color:rgb(128,128,128); border-right:1px solid brown;">60 </span> <span style="background:Gainsboro;color:black;">00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span><br /> | ||
Line 111: | Line 207: | ||
<span style="color:rgb(128,128,128); border-right:1px solid brown;">70 </span> <span style="background:Gainsboro;color:black;">00 00 00 00 00 00</span> 00 00 00 00 00 00 00 00 00 <span style="background:blue;">04</span> <span style="margin-left:1em;background:blue;">Leader attributes</span><br /> | <span style="color:rgb(128,128,128); border-right:1px solid brown;">70 </span> <span style="background:Gainsboro;color:black;">00 00 00 00 00 00</span> 00 00 00 00 00 00 00 00 00 <span style="background:blue;">04</span> <span style="margin-left:1em;background:blue;">Leader attributes</span><br /> | ||
- | <span style="color:rgb(128,128,128); border-right:1px solid brown;">80 </span> <span style="background:blue;">03 04 04 03 01 03 02 05</span> <span style="background:RoyalBlue;"><span style="color:black;">00</span> <span style="color:White;">01</span> <span style="color:LightGray;">01</span> <span style="color:black;">00</span> <span style="color:black;">00</span> <span style="color:LightCyan;">00</span></span> 00 00 <span style="margin-left:1em;background:RoyalBlue;"><span style="color:black;">ld.mnt</span> <span style="color:White;">ld.armr</span> <span style="color:LightGray;">ld.wpn</span> <span style="color:black;">ld.tpe</span> <span style="color:black;">ld.pnt</span> <span style="color:LightCyan;">ld.mssl</span></span><br /> | + | <span style="color:rgb(128,128,128); border-right:1px solid brown;">80 </span> <span style="background:blue;">03 04 04 03 01 03 02 05</span> <span style="background:RoyalBlue;"><span style="color:black;">00</span> <span style="color:White;">01</span> <span style="color:LightGray;">01</span> <span style="color:black;">00</span> <span style="color:black;">00</span> <span style="color:LightCyan;">00</span></span> <span style="outline:2px dotted pink;">00 00</span> <span style="margin-left:1em;background:RoyalBlue;"><span style="color:black;">ld.mnt</span> <span style="color:White;">ld.armr</span> <span style="color:LightGray;">ld.wpn</span> <span style="color:black;">ld.tpe</span> <span style="color:black;">ld.pnt</span> <span style="color:LightCyan;">ld.mssl</span></span> <span style="outline:1px dotted pink;"><b>4 byte filler</b></span><br /> |
- | <span style="color:rgb(128,128,128); border-right:1px solid brown;">90 </span> <span style="outline:1px solid red;">00</span> 00 <span style="background:SaddleBrown;">89 00</span> <span style="background:DarkKhaki;color:white;">00 00 00 00</span> <span style=" | + | <span style="color:rgb(128,128,128); border-right:1px solid brown;">90 </span> <span style="outline:2px dotted pink;"><span style="outline:1px solid red;">00</span> 00</span> <span style="background:SaddleBrown;">89 00</span> <span style="background:DarkKhaki;color:white;">00 00 <span style="color:yellow;">00 00</span> 00 00 <span style="color:yellow;">00 00</span></span> <span style="background:DarkGreen;">B8 0B</span> <span style="background:Orange;color:black;">00</span> <span style="background:Pink;color:black;">00</span> <span style="margin-left:1em;background:SaddleBrown;">Leader 3D head</span> <span style="background:DarkKhaki;color:white;">Lost units <span style="color:yellow">Unk.</span> Killed <span style="color:yellow">Exp.</span></span> <span style="background:DarkGreen;">XP</span> <span style="background:Orange;color:black;">Dupl ID</span> <span style="background:Pink;color:black;">Min armour</span><br /> |
<span style="color:rgb(128,128,128); border-right:1px solid brown;">A0 </span> <span style="background:DarkGoldenRod;">FF FF</span> <span style="outline:1px solid green;background:DarkGreen;"><span style="background:Green;">FF FF</span> FF FF <span style="background:Green;">FF FF</span> FF FF <span style="background:Green;">FF FF</span> FF FF <span style="background:Green;">FF FF</span></span> <span style="margin-left:1em;background:DarkGoldenRod;">magic book</span> <span style="outline:1px solid green;background:DarkGreen;">item slots</span> <br /> | <span style="color:rgb(128,128,128); border-right:1px solid brown;">A0 </span> <span style="background:DarkGoldenRod;">FF FF</span> <span style="outline:1px solid green;background:DarkGreen;"><span style="background:Green;">FF FF</span> FF FF <span style="background:Green;">FF FF</span> FF FF <span style="background:Green;">FF FF</span> FF FF <span style="background:Green;">FF FF</span></span> <span style="margin-left:1em;background:DarkGoldenRod;">magic book</span> <span style="outline:1px solid green;background:DarkGreen;">item slots</span> <br /> | ||
Line 136: | Line 232: | ||
| Wizard type || 8 || 1 || || | | Wizard type || 8 || 1 || || | ||
|- | |- | ||
- | | Armour || 9 || 1 || || | + | | Max Armour || 9 || 1 || || |
|- | |- | ||
| Cost || 10 || 2 || || | | Cost || 10 || 2 || || | ||
Line 222: | Line 318: | ||
| Magic item slots || 162 || 6 || 3 slots á 2 bytes || | | Magic item slots || 162 || 6 || 3 slots á 2 bytes || | ||
|- | |- | ||
- | | ''reserved space'' || 168 || 10 || Five unusable item slots || | + | | ''reserved space'' || 168 || 10 || Five unusable item slots.<br>It's likely that they are used during the battle<br> to store the spells of a mage.|| |
+ | |- | ||
+ | | Bought Armor || 180 || 1 || Temporary used in Army Editor: Contains number of new bought (red) armor | ||
+ | |- | ||
+ | | Max Buyable Armor || 181 || 1 || Temporary used in Army Editor: Contains Max Armor - Current Armor | ||
+ | |- | ||
+ | | Rebought Troops || 182 || 1 || Temporary used in Army Editor: Contains number of rebought troops | ||
+ | |- | ||
+ | | Max Buyable Troops || 183 || 1 || Temporary used in Army Editor: Contains Max - Current Troops | ||
|- | |- | ||
| Book profile || 184 || 4 || || | | Book profile || 184 || 4 || || | ||
Line 230: | Line 334: | ||
==Soldier and leader Character Attributes== | ==Soldier and leader Character Attributes== | ||
{{see|The Warhammer Attributes}} | {{see|The Warhammer Attributes}} | ||
- | |||
- | + | The attributes for rank-and-file and leader units are nine bytes in the following order: | |
- | + | # Movement | |
- | + | # Weapon Skill | |
- | + | # Ballistic Skill | |
- | + | # Strength | |
- | + | # Toughness | |
- | + | # Wounds | |
- | + | # Initiative | |
- | + | # Attacks | |
+ | # Leadership | ||
+ | |||
+ | For a complete listing of all data of every single unit in Dark Omen, see '''[http://dev.dark-omen.org/regimentdata.html this big honking list]''' (Warning! 800KB of pure table madness!). | ||
==Regiment attributes== | ==Regiment attributes== | ||
Line 250: | Line 356: | ||
[[Category: Modifications|ARM]] | [[Category: Modifications|ARM]] | ||
+ | [[Category: File Formats]] |
Current revision as of 22:19, 19 July 2011
.ARM (army) files contains a list of regiments, their status, and some army data and statistics. The same format is used for multiplayer armies, single player mission enemy armies and save games. Edit with Mikademus' DOS WH2EDIT editor or Ghabry's multi-platform Wh32Edit.
Contents |
Layout overview
The .ARM format is a binary format, the layout of which is very simple from a large-scale perspective: It starts with a 192 bytes header, which is followed by several 188-byte regiment records.
Header
The header of a army-file has a size of 192 bytes. Example (Allied1.arm):
Value | Race |
0 | Empire |
1 | Empire (Multiplayer) |
2 | Greenskin |
3 | Greenskin (Multiplayer) |
4 | Undead |
5 | Undead (Multiplayer) |
Data attribute | Offset | Byte size | Notes |
---|---|---|---|
File ID | 0 | 4 | Always 9E 02 00 00 for Dark Omen .ARM files |
# regiments blocks | 4 | 4 | |
Regiment block size | 8 | 4 | Always 188 in Dark Omen .ARM files |
Race | 12 | 1 | |
Unknown | 13 | 3 | Unknown data |
Default Name | 16 | 2 | Used by the included Demo Armies, "Army Name" must be empty. |
Army name | 18 | 32 | 0-term string |
Small banner bitmap file | 50 | 32 | 0-term string (path + filename) |
Small inactive banner bitmap | 82 | 32 | 0-term string (path + filename) |
Large banner bitmap file | 114 | 32 | 0-term string (path + filename) |
Money from Treasures | 146 | 2 | Used for "You collected x gold"-Text at summary screen |
Gold in coffers | 148 | 2 | Available Gold |
Magic items | 150 | 40 | One byte per item |
Unknown | 190 | 2 | Often either DC 84 or 00 00 |
Savegame Header
A savegame is in short an army file with an additional header located before the army header (and with lots of unknown data after the regiment data)
The Save files (*.[0-9]{3}) header has a size of 504-byte. Most parts of it are unknown.
At least the following things must be in the Save file (if you find out where they are please mark them in the example):
- Your current progress
- Your success in defeating Manfred von Carstein (defines if Black Pyramide MB5_01 or MB5_01B are loaded at the end), the Hand of Nagash or the Black Grail (they will help the Dread King when you lose) - OT: Looks like CTL scripts can read savegame data or is this just a special parameter passed by the engine when loading the map?
- Path you've choosen e.g. in Chapter 3 (Hand of Nagash): If you help Munz or Ragnar you will lose time and more undeads will attack you in the Hand of Nagash mission (is this confirmed? At least Matthias and Klaus say this)
- Used/Killed/Lost Units (for the stats page displayed after the battle)
- Play Time (maybe ^^)
- ...
Example (Endgame Save (Dread King defeated)):
It looks like the savegame header uses "32bit Booleans" to determine what kind of events happened.
From 0xBC to 0x198 is a 220 Byte copy of the internal struct of the WHMTG-Scriptengine. It's directly followed by a struct I call Game Progress, it fills the rest (60 bytes) of the Savegame header and contains the variables referenced by the WHMTG-Script.
Savegame Footer
The footer has a size of 13788 Bytes (Trivia: A larger footer will prevent Dark Omen from detecting the file as a savegame)
It contains information where the animated objects (like burning torches) are placed on the last talk screen.
Regiment data
- For a complete list of all Dark Omen regiments, see Regiment List
Regiment data starts at offset 192 (in savegames offset 696). Every regiment block has a size of 188 bytes. Example first regiment from B403NME.ARM:
- For an explanation of values for sprite and leader sprite, see Sprites.
Data attribute | Offset | Byte size | Notes | |
---|---|---|---|---|
Status | 0 | 2 | ||
unknown | 2 | 2 | Seems to be unused | |
Unique Unit ID | 4 | 2 | see DO/List_of_UUIDs & DO/List_of_Multiplayer_UUIDs | |
unknown | 6 | 2 | Seems to be unused | |
Wizard type | 8 | 1 | ||
Max Armour | 9 | 1 | ||
Cost | 10 | 2 | ||
Banner | 12 | 2 | ||
unknown | 13 | 2 | Seems to be unused | |
Regiment attributes | 16 | 4 | ||
Sprite | 20 | 2 | Unit sub-record for rank-and-file 59 bytes | |
Regiment Name | 22 | 32 | Zero-terminated (or DO crashes) | |
Name ID | 54 | 2 | ||
Alignment | 56 | 1 | ||
Max units | 57 | 1 | ||
Alive units | 58 | 1 | ||
Ranks | 59 | 1 | ||
unknown | 60 | 4 | Seems to be unused | |
Rank-and-file stats | 64 | 9 | ||
Mount | 73 | 1 | ||
Armour | 74 | 1 | ||
Weapon | 75 | 1 | ||
Unit type | 76 | 1 | ||
Point value | 77 | 1 | ||
Missile weapon | 78 | 1 | ||
unknown | 79 | 1 | Unknown data | |
unknown | 80 | 3 | Seems to be unused | |
Leader sprite | 84 | 2 | Unit sub-record for regiment leader 59 bytes | |
Leader name | 86 | 32 | Zero-terminated (or DO crashes) | |
block of zeroes | 118 | 9 | Covers the name ID, align, ranks etc regiment data | |
Leader stats | 127 | 9 | ||
Mount | 136 | 1 | Unused == 0 for leader | |
Armour | 137 | 1 | ||
Weapon | 138 | 1 | ||
Unit type | 139 | 1 | Only used for fanatics | |
Point value | 140 | 1 | Only used for fanatics | |
Missile weapon | 141 | 1 | ||
unknown | 142 | 2 | Seems to be unused | |
unknown | 144 | 1 | Unknown data | |
unknown | 145 | 1 | Seems to be unused | |
Leader 3D Head ID | 146 | 2 | Unit leader 3D head data | |
X-Pos | 148 | 4 | Tested - Not working | |
Y-Pos | 152 | 4 | Tested - Not working | |
Experience | 156 | 2 | ||
Duplicate ID | 158 | 1 | ||
Base (minimum) armour | 159 | 1 | ||
Magic book | 160 | 2 | ||
Magic item slots | 162 | 6 | 3 slots á 2 bytes | |
reserved space | 168 | 10 | Five unusable item slots. It's likely that they are used during the battle to store the spells of a mage. | |
Bought Armor | 180 | 1 | Temporary used in Army Editor: Contains number of new bought (red) armor | |
Max Buyable Armor | 181 | 1 | Temporary used in Army Editor: Contains Max Armor - Current Armor | |
Rebought Troops | 182 | 1 | Temporary used in Army Editor: Contains number of rebought troops | |
Max Buyable Troops | 183 | 1 | Temporary used in Army Editor: Contains Max - Current Troops | |
Book profile | 184 | 4 |
Soldier and leader Character Attributes
- Further information: The Warhammer Attributes
The attributes for rank-and-file and leader units are nine bytes in the following order:
- Movement
- Weapon Skill
- Ballistic Skill
- Strength
- Toughness
- Wounds
- Initiative
- Attacks
- Leadership
For a complete listing of all data of every single unit in Dark Omen, see this big honking list (Warning! 800KB of pure table madness!).
Regiment attributes
Regiment attributes are physical and psychological abilities or disadvantages of entire regiments. Attributes are stored in the regiment block at bytes 16-19. The different values are flags mapped to bits in four bytes (thus 32 unique attributes are possible).
Transcluded from DO/ARM/Regiment attributes
Note: The Bits in this table are going from lowest to highest bit. So the lowest bit is 1 and the highest 8.
Bit | BYTE 1 | BYTE 2 | BYTE 3 | BYTE 4 |
---|---|---|---|---|
1 | Will never rout Flagellants, steam tank and most undead have this
| Immune to fear, can be routed Most undead have this
| Inflicting casualty causes fear Screaming skull, undead chariot and Nagash has this
| Goblin Flag (Trading Post Map only) Only Night Goblins in B1_01 have this
|
2 | Unused
| Regenerates wounds Only trolls have this
| Cowardly Only ghouls have this
| Impervious to Magic Only necromancer in B1_03 has this
|
3 | Cause fear Most undead have this
| Never rally/regroup Villagers and B1_04 Mage has this. When a regiment has been broken it will get the white flag immediately
| Destroyed if routed Wights, wraiths, zombies, Carstein and dummies have this
| No retreat, no surrender! No regiment uses this. Unit will never rout, retreat button without any use. Banner of Defiance and cheat code DONTMESSWITHME and Ctrl+C+I have the exact same effect
|
4 | Cause terror Black Grail, Dread King, Hand of Nagash and Wraiths have this
| Always Pursue No regiment has this; Regiment will follow retreating enemy until it is defeated
| Flammable Treeman and mummies have this
| No Item slots Treeman, scorpion, spider, and wraiths have this
|
5 | Elf racial flag Only elves have this
| "Engine of War" Rule Steam tank and goblin fanatics have this
| 360 Degree Vision Only giant spider has this
| Can't be selected Only goblin fanatics have this
|
6 | Goblin racial flag Goblins and goblin fanatics have this
| Indestructible Only necromancer in B1_03 has this
| Unit contains fanatics Only goblin with fanatics has this
| Fear Elves Which unit has this- Goblins?
|
7 | Hate Greenskins Elves and treeman has this
| Unused
| Aetherial "racial" flag Only wraiths have this
| Unused
|
8 | Unimpeded by difficult terrain Elves, treeman, spider, black grail, skel horsemen and wraith
| Suffer additional wounds Only skeletons and training dummy have this.
| Giant Only Treeman has this
| Unused
|
Certain and tested
Highly likely but not tested
Function basically undeterminable... :(
Guess and/or untested
|
- I changed "psychology" to "attribute". I originally used the term psychology when I started mapping out the .arm files, and I thought that only the Warhammer psychology stuff (like hatred, saga animosity, fearless, etc) were stored there. But as also physical stuff like terrain striding etc are represented here "attributes" is a more descriptive term. Mikademus 23:24, 18 September 2008 (UTC)
I have started colour-coding the above table. Since it has been a while I am not certain which attributes I definitely determined and which I merely surmised. Ghabry is the the current authority on unit attributes, and I hope he will be able to complete the chart. Mikademus 12:43, 19 September 2008 (UTC)
Certain or likely flags
Flag #9 (byte 2 bit 1): In DO only skeletons have this set. It seems to be the undead army list rule that skeletons (which are immune to fear and don't take rout tests) take additional wounds from being pushed back
Flag #24 (byte 3 bit 8): This is an adaptation of Warhammer's special Screaming Skull Catapult rule. The Screaming Skulls fired by the catapult cause fear, so if even one casualty is dealt the receiving unit must take a rout test. Since Hand of Nagash also has this is is surmised that is is also used to give extra oomph to his attacks, and in extension, to the attack of any unit with this flag.
Uncertain flags
Flag #3 (byte 1 bit 3): Only goblins have this set. It could simply to indicate race, or it could be to indicate goblins' racial traits. The WHTTv4 rules about goblins are:
Relevant WHFB TT goblinoid rules v4. Goblins
- have animosity toward other goblinoids
- hate dwarves (and gnomes)
- fear elves (of numbers > half the goblins)
- and some special stuff about being led by snotlings and substituting spells.
Flag #4 (byte 1 bit 4): Only elves have this set. It could simply to indicate race, or it could be to indicate elves' racial traits. The WHTTv4 rules about elves are:
Relevant WHFB TT v4 elves rules. Elves
- are feared by Goblins if less than twice the numbers
- have double encumbrance from armour
Wood elves
- Suffer no movement or manoeuvre penalties in wooden areas
- have 6" longer range with bows
- and some special stuff about being substituting spells.
Are elves equipped with the same longbow (missile weapon type) as f.i. Helmgard Longbowmen? If so then we know that at least the additional distance rule applies.
Flag #18 (byte 3 bit 2): Only wraiths have this set. It could simply to indicate race, or it could be to indicate wraiths' special traits. The WHTTv4 rules about wraiths are:
Relevant WHFB TT v4 wraith rules. Wraiths
- are immune to all psychology (seems not to be true in DO)
- cause fear 12" +2 in all living creatures regardless of size
- can only be damaged by magic, magic weapons, daemons, or undead chill attacks
- have chill attacks that automatically cause 1 wound, no save and no armour
- are bound to a particular place and dematerialise if they leave this zone or the thing they're attached to is destroyed
- can pass through any material obstacle unhindered
Flag #12 (byte 2 bit 4): This units can't fight in Closed Combat and can drive over other regiments while charging.