Warlords: Battlecry ARM

From XentaxWiki
Revision as of 14:33, 18 December 2020 by imported>Ikskoks (→‎Format Specifications)
Jump to navigation Jump to search

ARM

  • Game : Warlords: Battlecry
  • Format Type : Misc
  • Endian Order : Little Endian


Format Specifications

// Warlords: Battlecry 
// ARM file format

// little endian

4 bytes (char) - unit ID // "ATHX", "AHHX", "AHBX" etc.
1 byte (uint8) - reserved // always "1"
1 byte (uint8) - unit movement type //  0= Grounded 
                                    //  1= Flyer 
                                    //  2= Boat 
                                    //  3= Floater (crosses water)

20 bytes (char) - unit name         //  e.g. "Peasant" or "Human Hero"
2 bytes (uint16) - unknown
2 bytes (uint16) - unit production time (in seconds)
2 bytes (uint16) - combat
2 bytes (uint16) - speed
2 bytes (uint16) - resistance
2 bytes (uint16) - HP
2 bytes (uint16) - View
2 bytes (uint16) - Armor
2 bytes (uint16) - Strong vs. // 0= Piercing 
                              // 1= Frost 
                              // 2= Electric 
                              // 3= Fire 
                              // 4= Magic 
                              // 5= Crushing 
                              // 6= Slashing 
                              // 7= All Psychical 
                              // 8= Piercing and Slashing 
                              // 9= All Elemental 
                              // 10= All damage 
                              // E= Fire 
                              // FFFF= none

2 bytes (uint16) - Weak vs.   // as above


x bytes - other unit data  //TODO

MultiEx BMS Script

Not written yet.

Notes and Comments

  • ARM files are encrypted with custom algorithm. Special 256-bytes key is needed for decryption. Key starts with string "mr8".

Decryption algorithm

Below is Python implementation of decryption algorithm:

arm_size = os.path.getsize(in_file_path)
    
for i in range(arm_size):
    arm_byte = struct.unpack("B", arm_file.read(1))[0]
    key_file.seek(arm_byte)
    out_byte = key_file.read(1)
    out_file.write(out_byte)

Compatible Programs