Battle Isle 2

Mission files

MIS/MISS000.DAT ... MISS040.DAT

One file per campaign mission: scenario settings, the map, facilities, timed actions and deferred map changes.

A campaign mission is one MIS/MISS###.DAT file. A fixed header gives the offsets of five sections: MISS (scenario settings and rule tables), ACTN (the map: terrain, overlay and unit planes), SHOP (facilities and starting cargo), MAP\0 (timed actions: weather, announcements, win and loss rules) and DFxx (map changes applied later). All integers are little-endian. Every byte of the 24 shipped campaign files has a place in the layout; a few fields are still not understood, and the page says which.

Each box is one part of the file, in file order, split into the groups of the structure below. A block is as wide as its bytes where its label fits. ACTN, SHOP, MAP and DFxx vary in length (the range is across the campaign): a stack stands for the records of that section, and its label gives the record count. Dashed blocks (the tags) hold the same string in every file. A line means one field decides where a section starts or how large another block is; the label says how, and field, line and section share a shade.

German and English text

The English edition has clear mission-text errors: mission 11 uses mission 12’s translated text, and mission 12 remains in German. German matches the mission facility data, but also has missing entries. Other differences below are changes in meaning; they are not all established errors.

Mission text lives in ENG/MISS###.TXT (key-table format, TPWM-compressed). The German edition carries the same file names under GER/. The two editions were compared record by record (26 campaign MISS###.TXT, GAME.TXT, UNIT000.TXT, and the 123 non-empty ATXT000 messages). The German overlay has no .DAT files, so every statement about layout below uses the English install's MIS/MISS###.DAT.

MISS011 / MISS012: the English text files are shifted

FileEnglish installGerman overlay
MISS011.TXT36 entries. Title "ATTACKING TITAN-NET'S HEADQUARTERS WITH REBEL SUPPORT" / "TITAN-NET IN SIGHT"; names AIR-3020, FELP, TUPP, ... HQ-KAIS.26 entries. Title "5 ARMEEN TREFFEN AUFEINANDER." / "DIE KAI-HALBINSEL"; names XEGO, HQ, CELLERUS, ..., HQ DER REBELLEN, HQ-0081.
MISS012.TXTGerman text, byte-for-byte the same entries as the German MISS012.TXT.36 entries: "MIT UNTERSTÜTZUNG DER REBELLEN GEGEN TITAN NETS HAUPTQUARTIER." / "TITAN NET IN SICHT"; same name list as the English MISS011.TXT.

So the English MISS011.TXT is the translation of the German MISS012.TXT, the English MISS012.TXT is that same German file untranslated, and the German MISS011.TXT has no English counterpart.

Which text fits which .DAT was decided from facility records (type-1 SHOP records, nameId = key in the mission's text file). The discriminating records:

RecordMISS011.DAT: (x,y) side function, buildable unitsEnglish MISS011.TXTGerman MISS011.TXTMISS012.DAT: same nameIdEnglish = German MISS012.TXT
#3(2,31) side 1, HQ (shopFunction 1)FELPHQ(20,2) side 1, depot (16)FELP
#6(36,36) side 2, HQPITEGHHQ-0081(25,8) side 64, depotPITEGH
#7(37,15) side 4, HQHOLWEHQ DER REBELLEN(2,8) side 1, depotHOLWE
#8(32,19) side 4, function 2 with ground vehicles 8,16,9,18HQATC-4477(14,7) side 1, HQHQ
#15(3,34) side 1, factory (8)TITAN-NET'S HQCMP-4308(34,31) side 2, HQHQ TITAN NET
#18(20,20) side 2, function 2 with ground vehicles 7,52,9,11AIR-3023KAI-NET-WERKE(32,34) side 2, function 2 with planesAIR-3023
#19(30,33) side 2, ground vehicles 11,52,16,15AIR-3024SAMURAI-2 FABRIK(36,34) side 2, planesAIR-3024
#20(23,37) side 2, planes 35,41,38,31PERWORKAI-NET AIRPORT(36,38) side 2, depotPERWOR
#21(21,7) side 16, planes 38,39,31,34ATC-2013POLUWA AIRPORT(3,13) side 16, ground vehiclesATC-2013
#22(3,2) side 16, ships 50,48,42,49WEXKERKRART-WERFT(7,13) side 16, depotWEX
#31(absent: MISS011.DAT has records 2..25)HQ-KAIS(absent)(7,33) side 16, HQHQ-KAIS

Bold marks the name that fits the record. Counted over shopFunction = 1 (HQ) records:

.DATEnglish MISS011.TXTGerman MISS011.TXTMISS012.TXT (either language)
MISS011.DAT (3 HQs)0 / 3 named HQ3 / 30 / 3
MISS012.DAT (3 HQs)3 / 30 / 3 (10 records have no name at all)3 / 3

Further support:

  • MISS011.DAT has five owner sides (1,2,4,8,16), matching "5 ARMEEN"; MISS012.DAT has six masks (1,2,4,8,16, plus 64 neutral).
  • The German names fit the *kind* of facility on every shipyard, airport and factory record above (-WERFT on the ship builder, AIRPORT on both plane builders, FABRIK/-WERKE on the two ground-vehicle builders). The English names do not.
  • The ATXT204 chapter-III briefing (Kai Peninsula, "three hostile armies" plus rebels) describes the MISS011 map, not the "Titan-Net in sight" scenario.

Conclusion (status: known for the data pairing, unverified at runtime): MISS011.DAT belongs with the German MISS011.TXT; MISS012.DAT belongs with MISS012.TXT. The English install ships neither correct file for mission 11. MISS011.TXT carries mission 12's translated title and names, so mission 11 would show "FELP" on its own HQ and a title describing the next mission, and mission 12 would show German title and names. The Kai Peninsula text has no English version in this install. Open: confirm in the running English game that mission 11 shows FELP/HOLWE/PITEGH on its HQs and mission 12 a German title.

Other differences in meaning

Briefing messages (ENG/ATXT000.LIB, text id in the first column):

IdEnglishGermanEffect
095"we should not attack Titan-Net's headquarters directly""wir gehen jetzt dazu über, das Hauptquartier ... direkt anzugreifen"Opposite advice. Both objectives say to occupy the HQ; that objective alone does not decide whether the attack should be direct.
052Objectives: Pem Pont, TexolObjectives: Pem Pont, Texol, HQ Titan-NetsGerman lists a third objective. The mission requires all three capture conditions, so the English objective list is incomplete.
018Wipe out all DEMON and RANGER unitsAll DEMON unitsEnglish adds RANGER. Pank plus destruction of enemy DEMON units can satisfy the mission without destroying every RANGER; German matches this route.
019"tank units ... in some of the depots""Panzerzüge" (armoured trains); HQ of Titan-Net's 32nd ArmyDifferent unit; English drops the owner.
024"We know how to reach you""den Weg zu Ihrer Heimat"German names the home as the target.
031"Bay of Maxis""Bucht von Meltix"English contradicts its own chapter I text (Meltix).
039Speaker: Intelligence SectionSpeaker: VerteidigungsratDifferent sender.
071naval base "in your sector""im nordwestlichen Bereich"German gives a direction.
087Khun Kaap, Durag's Adjutant"Adjutantin"German states female.
201"The Plot collapses""Der Verrat bricht zusammen"Plot vs betrayal.
202ROOM "disconnected ... sabotaged"ROOM "vom Feind unterwandert" (infiltrated)Different cause.
240"Walter had made his decision"; "Chairperson""Val hatte ..."; "Vorsitzender"Name; gender.
255tested "the Drullian people"tested their "Einigkeit" (unity)Nuance.

Untranslated or missing entries: English ATXT207 (chapter heading) and ATXT236 contain German; ATXT254 is German in both; MISS035 entry 26 is empty in German; ATXT023 and ATXT047 are header-only in German.

Unit and place names:

SourceEnglishGerman
UNIT000 9ARMOURED CARSCHÜTZENPANZER (infantry fighting vehicle)
UNIT000 11MAIN BATTLE TANKSCHWERER PANZER (heavy tank)
UNIT000 12ARTILLERYS.HAUBITZE (heavy howitzer)
UNIT000 13ASSAULT TANKSTURMGESCHÜTZ (assault gun)
UNIT000 15ANTI RADAR VEHICELOKA-STÖRTRUPPE (jamming troop)
UNIT000 50TORPEDO BOATZERSTÖRER (destroyer)
MISS007 21ROCKETLAUNCHER-W.RAKETENPANZER-W.
MISS008 22TITAN-NET'S NORTHERN HQHQ NO-TITAN NET (north-east)
MISS016 26HALMAX SHIPYARDSHALMAX-WERKE (works)

GAME.TXT, NET.TXT and BLUENET.TXT show no differences in meaning. Spelling drift only: Haris/Harris, Rekkronto/Rekkrontro, Chromsom/Chromson, Gelvet/Gelwet, Trendon/Trentan/Tentan. Not compared: the Scenery missions (no English mission texts in the local install) and the speech audio.

File Header

278 bytes8 fields● 8 ◐ 0 ○ 0
0x0000char[4]tag ●Literal MSSN.

Section offsets

4 fields · 16 bytes
0x0004u32lemissOffset ●Absolute file offset of the MISS metadata section.
0x0008u32lemapOffset ●Absolute file offset of the MAP\0 action-record section.
0x000cu32leshopOffset ●Absolute file offset of the SHOP place/facility section.
0x0010u32leactnOffset ●Absolute file offset of the ACTN map-plane section.

Deferred layers

3 fields · 258 bytes
0x0014u16ledfLayerCount ●Number of declared DFxx offset/size entries.
0x0016u32le[32]dfOffsetsPlus4 ●One file offset per deferred layer, each stored 4 too high.
0x0096u32le[32]dfSizes ●Byte size of each DFxx layer, tag included, in the same order as dfOffsetsPlus4.

MISS Section

332 bytes26 fields● 14 ◐ 10 ○ 2values from 24 campaign missions, MISS section
0x0000MISS00x00200x00400x00600x00800x00a00x00c00x00e00x01000x01200x0140
Point at the bar to name a field; select it to jump to its row.
knownpartly knownunknown: investigatenamed, never setalways one valueunused bits
0x0000char[4]tag ●Literal MISS.

Identity

3 fields · 6 bytes
0x0004u16letitleTextId ●0 · 2Text id for scenario title, resolved against ENG/MISS###.TXT.
0x0006u16leforceTextId ●1 · 3Text id for the force/player label.
0x012au16leselfMissionId ●0–4024 distinct valuesThe mission's own file id, stored a second time.

Sides

4 fields · 11 bytes
0x0008u16leside_selection_mask ◐Side masksA mask over sides, shipped as 16, 19, 28 and 31.
1514131211109876543210
5 named2 named but never set9 unused
bitmasknamemeaning
00x0001side 0Blue: the player in campaign missions.
10x0002side 1Red.
20x0004side 2Orange-yellow.
30x0008side 3Olive green.
40x0010side 4Grey-green.
50x0020side 5never set in this fieldYellow. Owns units and facilities only in MISS035, 036, 037 and 040, so owner_side_mask sets it there; side_selection_mask never does.
60x0040side 6never set in this fieldNeutral (brown-grey): unowned buildings and units.
7–15unusedNever set in any record.
0x000du8present_sides_mask ◐3–4311 distinct valuesA mask over sides: the sides that take part.
0x000eu8mission_side_mask ◐0–3010 distinct valuesA mask over sides.
0x0014bytes[7]alliances ●Who is allied with whom: byte s, bit n set means side s is allied with side n, and the table is symmetric (side n then lists side s too).

Campaign

3 fields · 6 bytes
0x000au16lenextMissionId ●1–999923 distinct valuesId of the campaign mission file that follows this one on completion; 9999 marks the final mission.
0x0010u8[2]resource_selector_pair ◐always 0Both bytes are zero in all 24 shipped missions.
0x0012u16lemusicWord ◐0 · 256 · 512 · 768The high byte selects the song archive LIB/SNG000..003.LIB.

Indexed pair

3 fields · 11 bytes
0x000cu8side_or_tail_pair_index ◐0 · 1 · 3Selects one byte from each of the five-byte tables indexed_tail_bytes_a and indexed_tail_bytes_b.
0x0124bytes[5]indexed_tail_bytes_a ◐Five bytes, one per value of side_or_tail_pair_index.
0x012cbytes[5]indexed_tail_bytes_b ◐Five bytes, one per value of side_or_tail_pair_index.

Mission result

3 fields · 10 bytes
0x000fu8terminal_condition_count_threshold ●1 · 2 · 3Threshold against the accumulated count of satisfied mission terminal conditions (action types 0x08..0x0e).
0x011cbytes[8]tail_script_ids_a ●Up to eight animation-script ids.
0x0129u8tail_byte_129 ◐Passed to a lookup in a later step.

Movement

2 fields · 64 bytes
0x001ci8[32]terrain_cost_table ●Movement cost for each terrain class.
0x003ci8[32]auxiliary_terrain_cost_table ◐A second per-terrain-class cost row.

Combat

2 fields · 64 bytes
0x005ci8[32]combat_initiative_percent_by_terrain_class ●Signed initiative modifier, in percent, for each selected terrain class.
0x007ci8[32]combat_damage_percent_by_terrain_class ●Signed weapon-damage modifier, in percent, for each selected terrain class.

Production

1 field · 128 bytes
0x009cu16le[64]unit_construction_flags ●One flags word per unit class id, 64 slots.
313029282726252423222120191817161514131211109876543210
2 named30 not listed
bitmasknamemeaning
00x0001factory listThe class may appear in the generic construction list.
10x0002side conditionAlso required when the construction list's side-mask condition is active. OLARIBU sets it for unit ids 3, 4, 6, 8, 10, 11, 12, 52.
2–31not listedNo name recorded.

Startup and next-mission result path

1 field · 3 bytes
0x0131bytes[3]tail_script_ids_b ●Three optional animation-script ids.

Unknown / reserved

3 fields · 25 bytes
0x001bu8intro_byte_1b ○Zero in all 24 shipped missions.
0x0134u16le[4]tail_zero_padding ●Zero across all 24 local campaign missions.
0x013cbytesunknown_tail_payload ○Zero in all 24 shipped missions.

ACTN Section

variable size6 fields● 6 ◐ 0 ○ 0
0x00char[4]tag ●Literal ACTN.

Header

2 fields · 4 bytes
0x04u16lewidth ●Map width in hex cells.
0x06u16leheight ●Map height in hex cells.

Planes

3 fields
0x0008..0x0008+cell_count*2-1i16le[]terrain ●cell_count = width * height; row-major terrain tile ids.
0x0008+cell_count*2..0x0008+cell_count*4-1i16le[]overlay ●width * height overlay tile ids; values < 1 are empty.
0x0008+cell_count*4..0x0008+cell_count*6-1i16le[]units ●width * height unit words, row-major; 0xffff (-1) marks an empty cell.

SHOP Section

variable size3 fields● 2 ◐ 1 ○ 0
0x00char[4]tag ●Literal SHOP.

Header

1 field · 2 bytes
0x04u16lerecord_count ●Number of 80-byte records following the header.

Records

1 field
0x0006..0x0006+record_count*80-1repeat record_count x ShopRecordfacility_records ◐40 signed words per record.

ShopRecord

80 bytes21 fields● 7 ◐ 13 ○ 1values from 24 campaign missions, SHOP section
0x0000x2800
Point at the bar to name a field; select it to jump to its row.
knownpartly knownunknown: investigatenamed, never setalways one valueunused bits

Type and place

6 fields · 12 bytes
0x00i16lerecord_type_flags ●1 · 2Only 1 and 2 occur in the 1,081 records.
0x02u16lepacked_position ●65–3931812 distinct valuesCell position as x + y * factor.
0x04i16leshopFunction ◐Shop functionsObserved values are 0, 1, 2, 4, 8, 16, 32.
1514131211109876543210
6 named10 unused
bitmasknamemeaning
00x0001HQHeadquarters (33).
10x0002airport or harbourWhere aircraft or ships are built and enter (135).
20x0004depot(14).
30x0008academy(38).
40x0010city or village(221).
50x0020loaded transportA carrier already holding cargo, not a building (22).
6–15unusedNever set in any record.
0x06i16lefacility_creation_arg ◐always 0Zero in all 1,081 nonempty campaign SHOP records.
0x0ai16leactive_packed_position_copy ◐0–3931420 distinct valuesA second copy of the position: it equals packed_position in all 465 base-game records whose last contents word is -1, and is zero in all 616 whose last word is 0.
0x32u16lefacility_or_carrier_category ◐Facility categoriesOn 440 of 441 building records the high byte is one facility-category bit, the same vocabulary as the unit class shop_mask; a unit may enter only when its mask has the matching bit.
1514131211109876543210
8 named5 set but unnamed3 unused
bitmasknamemeaning
00x0001unnamedMeaning unknown. Set in 1 of 1081.
10x0002unnamedMeaning unknown. Set in 1 of 1081.
50x0020unnamedMeaning unknown. Set in 1 of 1081.
60x0040unnamedMeaning unknown. Set in 9 of 1081.
70x0080unnamedMeaning unknown. Set in 1 of 1081.
80x0100HQHeadquarters.
90x0200airport
100x0400harbour
110x0800factory
120x1000depot
130x2000city
140x4000academy
150x8000special facility
2–4unusedNever set in any record.

Name and owner

2 fields · 4 bytes
0x08i16lenameId ●0–5050 distinct valuesText id in ENG/MISS###.TXT.
0x40i16leowner_side_mask ◐Side masksThe owning side as a single bit.
1514131211109876543210
7 named1 set but unnamed8 unused
bitmasknamemeaning
00x0001side 0Blue: the player in campaign missions.
10x0002side 1Red.
20x0004side 2Orange-yellow.
30x0008side 3Olive green.
40x0010side 4Grey-green.
50x0020side 5Yellow. Owns units and facilities only in MISS035, 036, 037 and 040, so owner_side_mask sets it there; side_selection_mask never does.
60x0040side 6Neutral (brown-grey): unowned buildings and units.
70x0080unnamedMeaning unknown. Set in 1 of 1081.
8–15unusedNever set in any record.

Economy

6 fields · 10 bytes
0x0ci16leinitial_energy ◐0–9027 distinct valuesThe facility's starting energy limit, read when the construction list is built.
0x0ei16leinitial_material ◐0–7039 distinct valuesThe facility's starting material limit, read when the construction list is built.
0x10i8facility_energy_increment ●Signed energy income of this facility, added to its owning side's total when the incoming-owner update includes facility rates.
0x11i8facility_material_increment ●Signed material income of this facility, added to its current material by the incoming-owner update when that update includes facility rates.
0x3ci16lecapacity_state ◐always 0Zero in all 1,081 nonempty campaign records.
0x3ei16leunidentified_facility_word_3e ◐0–94086 distinct valuesAn unidentified word that is not the owner.

Contents

2 fields · 40 bytes
0x12i16le[16]contents_slots ●-1–5343 distinct valuesSixteen positions for starting unit class ids.
0x34i16le[4]construction_unit_ids ●0–5235 distinct valuesUp to four extra unit class ids appended to this facility's generic production list.

AI command row (type 2)

4 fields · 8 bytes
0x48i16letype2_extension_word_0 ◐0–189 distinct valuesObserved values: 0, 1, 2, 4, 8, 9, 12, 17, 18.
0x4ai16letype2_extension_word_1 ◐0 · 5 · 6 · 7 · 10 · 20Observed values: 0, 5, 6, 7, 10, 20; 10 occurs in 596 records.
0x4ci16letype2_extension_word_2 ◐0–23319 distinct valuesObserved values: 0, 105, 137, 342, 793, 1556, 1808, 2327, 2331.
0x4ei16letype2_extension_word_3 ◐0 · 4 · 7 · 794 · 1350Observed values: 0, 4, 7, 794, 1350.

Unknown / reserved

1 field · 6 bytes
0x42i16le[3]zero_extension_words ○always 0All three words are zero in every shipped record, and nothing is known to read them.

MAP Section

variable size2 fields● 1 ◐ 1 ○ 0
0x00char[4]tag ●Literal MAP\0: MAP plus a NUL terminator.

Records

1 field
0x0004..firstDfOffset-1repeat action_record_count x MapActionRecordaction_records ◐action_record_count = (firstDfOffset - mapOffset - 4) / 40; the section ends where the first DFxx section begins.

MapActionRecord

40 bytes12 fields● 6 ◐ 5 ○ 1values from 24 campaign missions, MAP section
0x00000
Point at the bar to name a field; select it to jump to its row.
knownpartly knownunknown: investigatenamed, never setalways one valueunused bits

Condition

3 fields · 6 bytes
0x00u16lecategory_or_scope ◐0 · 48 · 80Corpus values are 0, 0x30, and 0x50.
0x02u16leturn ●0–3027 distinct valuesCopied by parser and insertion to entry +0x0c; second-pass scheduling requires signed entry turn <= signed manager turn +0x12.
0x04u16letrigger_group_or_side ●0–1212 distinct valuesCopied through insertion to entry +0x0a; second-pass scheduling requires signed entry event <= signed manager event +0x10.

Action

3 fields · 4 bytes
0x06u8action_selector ●Copied to entry +0x0e.
0x07u8action_type ●The action kind; the game dispatches on this byte.
0x08u16leduration_or_count ●0 · 100Copied to entry +0x06, the unsigned low sequence ceiling; entry +0x08 is its signed high word.

Operands

4 fields · 8 bytes
0x0au16leaction_param_a ●always 0Zero in all 364 shipped action records.
0x0cu16leaction_param_b ◐0–9898 distinct valuesFamily-specific operand: type 0x04 DF index, 0x05/06/07 side number, 0x0d returned request word; type 0x02 weather state; type 0x03 ASCR scene id; type 0x07 side whose alliance row changes; type 0x08 target side; type 0x09 requested facility-owner side; type 0x0a maximum mission turn count; type 0x0c target unit class id.
0x0eu16leaction_param_c ◐0–2717 distinct valuesFamily-specific operand: 0x05 signed energy delta, 0x06 native facility ordinal; 0x0900 native facility ordinal (not a universal SHOP-array index); 0x0c00 target unit side id.
0x10u16leaction_param_d ◐0 · 1Usually zero; the only nonzero shipped value is 1, in MISS003.DAT MAP record 4 (0x0704).

Unknown / reserved

2 fields · 22 bytes
0x12u16le[3]copied_zero_action_words ◐always 0All three words are zero in the shipped records.
0x18u16le[8]unread_map_record_tail ○always 0All eight words are zero in the shipped records, and the game never reads this part of the record.

DFxx Layers

variable size2 fields● 1 ◐ 1 ○ 0

Header

1 field · 4 bytes
0x00char[4]tag ●DF00, DF01 and so on.

Records

1 field
0x0004..df_size-1repeat df_record_count x DfCellRecorddeferred_cells ◐Sparse map edits.

DfCellRecord

8 bytes4 fields● 4 ◐ 0 ○ 0
0x00
Point at the bar to name a field; select it to jump to its row.
knownpartly knownunknown: investigatenamed, never setalways one valueunused bits

Cell patch

4 fields · 8 bytes
0x00u16lepacked_position ●Padded native cell index; the writer uses P for byte base/overlay planes and P*2 for word occupancy.
0x02i16leterrain ●Compare raw word with source-ID word of each loaded 46-byte PART row; first match writes compact ordinal to base byte plane.
0x04i16leoverlay ●Same source-ID lookup; write matching compact ordinal, or ff when no row matches.
0x06i16leunit ●ffff requests no creation.

Reference: terrain classes

Bit n of a terrain record's entry mask names a terrain class (see Terrain records). The four per-class rows in the MISS section (terrain_cost_table, auxiliary_terrain_cost_table, combat_initiative_percent_by_terrain_class and combat_damage_percent_by_terrain_class) are indexed by that bit. The values below are the row every shipped mission carries.

BitTerrain classMain costAuxiliary costCombat initiative %Combat damage %
0road00+500
1path80+300
2ditch204+90+50
3rail10000
4minor obstacle164−30+40
5major obstacle2016−10+30
6hill2424−20+50
7mountain3832−40+60
8slope268−15+25
9grassland12000
10forest1616−20+40
11hazard1204−95−20
12water basin300−60−10
13mud320−40−30
14snow200−10−20
15rock in water164−10−10
16shallow water0000
17medium water0000
18deep water0000
19unnamed80+40−10
20building1201600
21building (enterable)1680+30
22building entrance01600
23..31unused in shipped entry masks0000

The class names describe common base-tile uses of each bit; they are not exclusive. The two cost columns are local threshold values, not amounts summed along a route. The two percentage columns are the raw mission values; difficulty decides whether they are applied.

Reference: MAP action types and selectors

The stored word 0xTTSS at bytes 0x06..0x07 of a MapActionRecord is the action type TT and the selector SS; 0x0201 and 0x0202 are the same type with different selectors, not separate subtypes. In the table, word[n] is the n-th 16-bit word of the 40-byte record: word[1] is turn, word[6] is action_param_b, word[7] is action_param_c and word[8] is action_param_d.

Stored wordCountCurrent roleEvidence in playNotes
0x020190global weather change, selector 1confirmed in playword[6] selects the weather: 0 clear, 1 light rain, 2 heavy rain, 3 light snow, 4 heavy snow. All five states were seen in AMPORGE. Value 5 occurs three times in ULUARGE, but the game's weather routine rejects values outside 0..4 and leaves the weather unchanged.
0x02023global weather change, selector 2type confirmed in play; selector 2 untestedWAGOPAY uses selector 2 with weather values 1, 2 and 0. Selector 2 has not been tested against selector 1 in play.
0x0301155mission announcement/reportconfirmed in playword[6] selects the animation script ASCR###; the script's write(...) calls select the ATXT### text archives.
0x032013mission announcement/report, selector 0x20same shape as 0x0301; selector difference untestedThe same script-selection field as selector 1; the difference between the selectors has not been tested.
0x04017deferred DF-layer activation, selector 1original executable bytesActivates a DFxx layer: word[1] is the turn and word[6] the layer index. These 7 actions cover 7 of the 9 genuine layers; ULUARGE and DAFATWA have a layer with no activation record. No placeholder-layer mission has one.
0x07041alliance change for one side, selector 4not tested in playSeen once, in MISS003.DAT record 4 at turn 16. Type 0x07 selects the side row from word[6], clears the bit for word[8] and adds the bit for word[7] in the table at alliances. The stored values 2, 0, 1 therefore take side 1 out of side 2's row and add side 0 (already there): side 2 stops being allied with side 1 and stays with side 0. A player-visible test is open.
0x080014side-elimination terminal conditionconfirmed in playword[6] is the target side; true when no active unit of that side has class bit 29 clear. Contained units count; strength is not tested. Category 0x30 is success, category 0x50 is failure.
0x090056facility-ownership terminal conditionconfirmed in playword[6] is the requested owner side and word[7] the SHOP record index; the condition tests plain ownership of any facility. Category 0x30 is success, category 0x50 is failure.
0x0a0019mission turn-limit failure conditionconfirmed in playCategory 0x50. word[6] is the maximum mission turn count (campaign values 15..60) and word[7] is zero. The exact predicate is signed native manager turn >= signed B. Visible-turn conversion needs a counted-turn/context binding.
0x0a011mission turn-limit failure condition, selector 1confirmed in playCategory 0x50. The same dispatched type as 0x0a00; the only one is in MISS015.DAT with word[6] = 35.
0x0c005matching-unit terminal conditionconfirmed in play; polarity depends on the categoryword[6] is a unit class and word[7] its side. Category 0x30 is a destroy-all-matching-units success rule, and repeated blocks are separate one-shot counted conditions; mission threshold controls the aggregate result. Category 0x50 reads as a protect rule that fails when the matching units die; it still needs a normal-combat replay.

Example: an announcement in AMPORGE

MIS/MISS000.DAT is the first campaign mission, AMPORGE. Its MAP\0 section starts at the offset in the header word mapOffset (0x0c60 in this file), and each action record is 40 bytes after the 4-byte tag. Record 3 is the fourth: it starts at 0x0c60 + 4 + 3 x 40. Each line is one field: its offset in the record, its bytes as stored, and the value they decode to.

0x00  00 00                                      category_or_scope = 0
0x02  00 00                                      turn = 0
0x04  00 00                                      trigger_group_or_side = 0
0x06  01                                         action_selector = 1
0x07  03                                         action_type = 0x03: announcement
0x08  64 00                                      duration_or_count = 100
0x0a  00 00                                      action_param_a = 0
0x0c  11 00                                      action_param_b = 17: animation script ASCR017
0x0e  00 00                                      action_param_c = 0
0x10  00 00                                      action_param_d = 0
0x12  00 00 00 00 00 00                          copied_zero_action_words = 0, 0, 0
0x18  00 00 00 00 00 00 00 00 00 00 00 00 ...    unread_map_record_tail = 0 (16 bytes)

The stored word at 0x06 reads 0x0301: type 0x03, selector 1. The record fires at turn 0, so the announcement plays as the mission opens. It names script ASCR017 in action_param_b; that script shows General Odan's contact message. Record 4 has the same shape with script ASCR019, the objective briefing. A condition record such as record 1 (50 00 ... 08 00) has category 0x50 and type 0x08; it is a failure rule that names side 0, the player.

Example: a neutral city in AMPORGE

The same mission's SHOP section holds three records. Record 0 starts at shopOffset + 6 and is 80 bytes long. It is a type-1 record: a facility, here a city.

0x00  01 00                                      record_type_flags = 1: facility
0x02  d5 00                                      packed_position = 213: x 21, y 3
0x04  10 00                                      shopFunction = 0x0010: city or village
0x06  00 00                                      facility_creation_arg = 0
0x08  02 00                                      nameId = 2
0x0a  d5 00                                      active_packed_position_copy = 213
0x0c  14 00                                      initial_energy = 20
0x0e  1e 00                                      initial_material = 30
0x10  08                                         facility_energy_increment = 8
0x11  04                                         facility_material_increment = 4
0x12  ff ff ff ff ff ff ff ff ff ff ff ff ...    contents_slots = -1 x 16 (empty)
0x32  00 20                                      facility_or_carrier_category = 0x2000: city
0x34  00 00 00 00 00 00 00 00                    construction_unit_ids = 0, 0, 0, 0
0x3c  00 00                                      capacity_state = 0
0x3e  2c 01                                      unidentified_facility_word_3e = 300
0x40  40 00                                      owner_side_mask = 0x0040: side 6, neutral
0x42  00 00 00 00 00 00                          zero_extension_words = 0, 0, 0
0x48  00 00                                      type2_extension_word_0 = 0
0x4a  00 00                                      type2_extension_word_1 = 0
0x4c  00 00                                      type2_extension_word_2 = 0
0x4e  00 00                                      type2_extension_word_3 = 0

The position 213 is 3 x 64 + 21, since the map is no wider or taller than 64. Nobody owns the city, so its side is the neutral side 6, and a plain city builds nothing: all four extra unit ids are zero and all sixteen contents positions are empty. It still produces: each turn it adds 8 energy and 4 material. The three type-2 words are unused here because they apply only to type-2 records, which annotate units already on the map.

Still to investigate

Every field marked unknown or partial above, and every bit that is set without a name or named without ever being set.

  • side_selection_mask◐A mask over sides, shipped as 16, 19, 28 and 31. Bit 5 (side 5), Bit 6 (side 6) are named but never set. MISS Section
  • side_or_tail_pair_index◐Selects one byte from each of the five-byte tables indexed_tail_bytes_a and indexed_tail_bytes_b. MISS Section
  • present_sides_mask◐A mask over sides: the sides that take part. MISS Section
  • mission_side_mask◐A mask over sides. MISS Section
  • resource_selector_pair◐Both bytes are zero in all 24 shipped missions. MISS Section
  • musicWord◐The high byte selects the song archive LIB/SNG000..003.LIB. MISS Section
  • intro_byte_1b○Zero in all 24 shipped missions. MISS Section
  • auxiliary_terrain_cost_table◐A second per-terrain-class cost row. MISS Section
  • indexed_tail_bytes_a◐Five bytes, one per value of side_or_tail_pair_index. MISS Section
  • tail_byte_129◐Passed to a lookup in a later step. MISS Section
  • indexed_tail_bytes_b◐Five bytes, one per value of side_or_tail_pair_index. MISS Section
  • unknown_tail_payload○Zero in all 24 shipped missions. MISS Section
  • facility_records◐40 signed words per record. SHOP Section
  • shopFunction◐Observed values are 0, 1, 2, 4, 8, 16, 32. ShopRecord
  • facility_creation_arg◐Zero in all 1,081 nonempty campaign SHOP records. ShopRecord
  • active_packed_position_copy◐A second copy of the position: it equals packed_position in all 465 base-game records whose last contents word is -1, and is zero in all 616 whose last word is 0. ShopRecord
  • initial_energy◐The facility's starting energy limit, read when the construction list is built. ShopRecord
  • initial_material◐The facility's starting material limit, read when the construction list is built. ShopRecord
  • facility_or_carrier_category◐On 440 of 441 building records the high byte is one facility-category bit, the same vocabulary as the unit class shop_mask; a unit may enter only when its mask has the matching bit. Bits 0–1, 5–7 are set but unnamed. ShopRecord
  • capacity_state◐Zero in all 1,081 nonempty campaign records. ShopRecord
  • unidentified_facility_word_3e◐An unidentified word that is not the owner. ShopRecord
  • owner_side_mask◐The owning side as a single bit. Bit 7 is set but unnamed. ShopRecord
  • zero_extension_words○All three words are zero in every shipped record, and nothing is known to read them. ShopRecord
  • type2_extension_word_0◐Observed values: 0, 1, 2, 4, 8, 9, 12, 17, 18. ShopRecord
  • type2_extension_word_1◐Observed values: 0, 5, 6, 7, 10, 20; 10 occurs in 596 records. ShopRecord
  • type2_extension_word_2◐Observed values: 0, 105, 137, 342, 793, 1556, 1808, 2327, 2331. ShopRecord
  • type2_extension_word_3◐Observed values: 0, 4, 7, 794, 1350. ShopRecord
  • action_records◐action_record_count = (firstDfOffset - mapOffset - 4) / 40; the section ends where the first DFxx section begins. MAP Section
  • category_or_scope◐Corpus values are 0, 0x30, and 0x50. MapActionRecord
  • action_param_b◐Family-specific operand: type 0x04 DF index, 0x05/06/07 side number, 0x0d returned request word; type 0x02 weather state; type 0x03 ASCR scene id; type 0x07 side whose alliance row changes; type 0x08 target side; type 0x09 requested facility-owner side; type 0x0a maximum mission turn count; type 0x0c target unit class id. MapActionRecord
  • action_param_c◐Family-specific operand: 0x05 signed energy delta, 0x06 native facility ordinal; 0x0900 native facility ordinal (not a universal SHOP-array index); 0x0c00 target unit side id. MapActionRecord
  • action_param_d◐Usually zero; the only nonzero shipped value is 1, in MISS003.DAT MAP record 4 (0x0704). MapActionRecord
  • copied_zero_action_words◐All three words are zero in the shipped records. MapActionRecord
  • unread_map_record_tail○All eight words are zero in the shipped records, and the game never reads this part of the record. MapActionRecord
  • deferred_cells◐Sparse map edits. DFxx Layers