本ゲームにおける兵器アイコンのデータは、各マップファイル内に格納・管理されている。
※マップファイル:本ゲームのCDをPCで開いた時の「VIEWMAP」以下のMAP**.bin(*は番号、作戦ファイルの場合はMAP***.bin)を指す

具体的には、MAP**.binをバイナリエディタで開いたときのアドレス35CC以降が兵器アイコンのデータとなる。
バイナリエディタ上で見ても、この箇所では明らかに何らかの形が示されていることが分かる。
例えば以下は鋼鉄MAP01.binの第1アイコン、具体的にはフランス侵攻作戦マップにおけるBf109Eを示す。
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 65 46 60 00 00 00 00 00 00 00 00
00 00 00 00 00 64 35 65 00 00 00 00 43 40 00 00
00 00 80 00 00 64 35 56 00 00 00 04 56 65 00 00
00 00 80 00 00 64 3C BB 61 11 12 35 67 76 00 00
00 00 83 22 11 12 4C C4 53 33 34 45 21 36 00 00
00 00 95 44 44 44 55 55 44 45 56 77 31 35 00 00
00 00 79 65 45 56 66 65 55 66 60 00 53 40 00 00
00 00 89 96 66 42 23 45 67 00 00 00 77 00 00 00
00 00 80 00 77 52 23 46 77 79 A0 07 77 9A 00 00
00 00 80 07 77 51 34 59 77 77 77 77 77 77 00 00
00 00 00 00 07 51 34 67 77 00 00 09 77 77 00 00
00 00 00 00 00 51 45 77 70 00 00 00 97 77 00 00
00 00 00 00 00 07 77 77 00 00 00 00 09 90 00 00
00 00 00 00 00 07 77 70 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    ▼

上記の通り1アイコンあたり256(100h)バイトだが、ゲーム内の実際のアイコンは横32×縦16=512ドットのため、
2ドットを1バイトで管理→16色ビットマップのデータだと分かる。
アイコンの数はマップファイルごとに異なり、基本的にそのマップに登録されている兵器以外のアイコンは存在しない。

16色のパレット内訳

上記例の通り、アイコングラフィックは1ドットあたり0~Fの16通りのデータで管理されている。
次に0~Fにどのようなパレットが当て嵌められているかを示す。
  • 0は透過色
  • 1~7は陣営ごとにカラーが異なり、明るい順に指定される。7はいずれの陣営色でもほとんど黒に近い。
    なおソ連のみ、鋼鉄と作戦で微妙に色が異なっている。

8以降は基本的には陣営色に依存せず一定であり、一部パレットアニメーションの処理が絡んでいる。
  • 8は歩兵ユニットの肌色を示し、航空機や牽引砲などでは点滅させることでプロペラや砲撃を表現。
  • 9、Aは暗い灰色、明るい灰色を示し、歩兵の靴や機銃の表現などに使われている。
  • B、Cは航空機のキャノピー、または艦船における波の表現に使われている。
  • D~Fは車両系ユニットのキャタピラまたはホイールの回転表現に使われている。
  • 歩兵系はパレットアニメーションはないが、アイコン枠を3つ用いており、
    n番目→n+1番目→n+2番目→n+1番目→n番目→…と切り替えることで歩行を表現する。

これらのアニメーションのうちどれが割り当てられるかは、UNITPACKファイル(兵器登録コードに相当)における兵器種の指定で自動的に決まる。

アイコンと兵器指定値の関連付け

アイコンデータ群の直後に、明らかにアイコンの形をしていないデータ群が現れる。
(例)MAP01.binのアドレス90CC以降
                   00 46 00 5B
00 4E 00 00 00 59 00 01 00 64 00 02 00 67 00 03
00 69 00 04 00 6D 00 05 00 4A 00 06 00 70 00 07
00 97 00 08 00 76 00 09 00 79 00 0A 00 7B 00 0B
00 80 00 0C 00 A7 00 0D 00 A9 00 0E 00 A3 00 0F
00 AB 00 10 00 AF 00 13 01 8E 00 16 00 4B 00 17
00 4C 00 1A 00 71 00 1C 00 8C 00 1D 00 AA 00 1E
00 AC 00 1F 00 B1 00 22 00 FD 00 25 01 01 00 26
01 0A 00 27 01 0E 00 28 01 35 00 29 01 38 00 2A
01 39 00 2B 01 3A 00 2C 01 3D 00 2D 00 49 00 30
01 9E 00 31 01 15 00 32 01 16 00 33 01 1B 00 34
01 1C 00 35 01 1D 00 36 01 1E 00 37 01 1F 00 38
01 28 00 39 01 29 00 3A 01 8F 00 3B 01 91 00 3C
01 7A 00 3D 01 7B 00 3E 01 7C 00 3F 01 7D 00 40
01 7F 00 41 01 80 00 42 01 81 00 43 01 82 00 44
01 83 00 45 01 84 00 46 01 85 00 47 01 86 00 48
01 87 00 49 01 8A 00 4A 01 8B 00 4D 01 96 00 50
01 7E 00 51 01 88 00 52 01 89 00 53 01 8C 00 54
01 8D 00 57 01 B2 00 5A
これの意味は次の通りである。
  • 冒頭 00 46 00 5B →登録兵器の数が70(=0046h)、アイコンの数は91(=005B)
 ※兵器の数とアイコン数が違うのは、歩兵と輸送車が3アイコン、輸送機が2アイコン消費するためである。
  また違う兵器でも同じアイコンを共有する場合も稀にある。
  • 次の   00 4E 00 00 →BF109E(004E)のアイコンは1番目(0から数えるので0000h+1)
  • その次の 00 59 00 01 →Me110C(0059)のアイコンは2番目(0001h+1)
  • 途中の  00 AB 00 10 →歩兵(独)(00AB)のアイコンは17番目(0010h+1)
  • その次の 00 AF 00 13 →装甲擲弾兵(00AF)のアイコンは20番目(直前の歩兵が3アイコン消費しているため)
 と続いていく。
  • ちなみにダミー(0000)用のアイコンだが、恐らく上記データ列の7バイト目~ 00 00 00 59 を読み取って、
    兵器0000のアイコンは90番目(0059h+1)とされているものと思われる(実際それで辻褄が合っている)。
    よって、ここの0059の部分がアイコン番号の最大値を超えてしまった場合、ダミーはアイコンなし(完全に透明)になる。

なお、兵器指定値(最大でも01CA)やアイコンの順番(多くて200~300程度)を扱っているため、
上記には2バイトで1000h以上行くデータは基本的に存在しない。
したがって、データ1000h以上が突如現れる次のセクションとは明確に見分けできる。

パレットデータの仕様

(例)MAP01.binのアドレス91E8以降
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 29 F2 25 AF 1D 4C 19 0A 14 C8 10 A7 08 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 29 F2 25 AF 1D 4C 19 0A 14 C8 10 A7 08 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 29 F2 25 AF 1D 4C 19 0A 14 C8 10 A7 08 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 29 F2 25 AF 1D 4C 19 0A 14 C8 10 A7 08 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 29 F2 25 AF 1D 4C 19 0A 14 C8 10 A7 08 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 29 F2 25 AF 1D 4C 19 0A 14 C8 10 A7 08 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 29 F2 25 AF 1D 4C 19 0A 14 C8 10 A7 08 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 5A 4C 52 27 45 C6 39 85 2D 24 24 E3 10 42 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 5A 4C 52 27 45 C6 39 85 2D 24 24 E3 10 42 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 5A 4C 52 27 45 C6 39 85 2D 24 24 E3 10 42 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 5A 4C 52 27 45 C6 39 85 2D 24 24 E3 10 42 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 5A 4C 52 27 45 C6 39 85 2D 24 24 E3 10 42 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 5A 4C 52 27 45 C6 39 85 2D 24 24 E3 10 42 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 5A 4C 52 27 45 C6 39 85 2D 24 24 E3 10 42 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 55 92 4D 50 41 2D 39 0B 2C C8 20 86 10 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 55 92 4D 50 41 2D 39 0B 2C C8 20 86 10 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 55 92 4D 50 41 2D 39 0B 2C C8 20 86 10 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 55 92 4D 50 41 2D 39 0B 2C C8 20 86 10 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 55 92 4D 50 41 2D 39 0B 2C C8 20 86 10 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 55 92 4D 50 41 2D 39 0B 2C C8 20 86 10 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
7F FF 55 92 4D 50 41 2D 39 0B 2C C8 20 86 10 44 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
11 C8 4E 75 42 12 35 AF 2D 6C 25 29 18 C6 08 43 2E B7 18 A5 29 4A 67 0B 62 26 29 49 18 C5 00 00
そのマップの兵器アイコンのパレットデータ。兵器←→アイコン関連付けセクションの直後に配置されている。
32バイトのデータが7回ずつ繰り返され、その塊が5セットという構造を示していることが分かる。
その内訳は、1色あたり2バイト×16色×7回繰り返し(ここまでが1陣営分)×5陣営分=総計1120(=460h)バイトである。

前半16バイト(透過色入れて8色)は陣営ごとに違うが、後半16バイトは共通していることが分かる。
これを分析していくと、このページの最初に上げたパレット一覧表の通りになる。
また第1陣営~第5陣営の順に並んでおり、上記例は第5陣営が第1陣営と同じになっている。
MAP01.bin(フランス)はご存じ4陣営構成なので、空白の5陣営目は初期値であるドイツ色を示すためだ。

2バイトで1色ということは、RGBそれぞれ1バイト(→1色あたり3バイト)ではないということになる。
その正体は15ビットカラー(RGBごとに5ビット、0~31の32階調)であり、一旦2進数に分解する必要がある。
例えば最初の 11 C8 → 2進で 00010001 11001000 → 0 00100 01110 01000
→ 最初の0は無視して B:00100 G:01110 R :01000 (RGBではなくBGRであることに注意)
→ 10進で B:4(/31) G:14 R:8 → 24ビットカラー換算(それぞれに8倍)で B:32(/255) G:112 R:64
→ この色になる

実際にはこの色(11C8)は透過色に相当するので表示されず、その次の15色 4E75~0000 が兵器アイコンの色になる。
上にも書いた通り2進法の最初の0は無視されるため、7FFF(01111111 11111111)とFFFF(11111111 11111111)のどちらでも
同じ白(R248 G248 R248)が表示される。 ※←最も明るい白でも上記の理屈によりB255 G255 R255にはならない。
このセクション以外にもパレットのデータは至る所に使われており、そこではFFFFが使われている場合もある。

ところでなぜわざわざ同じ32バイトを7回繰り返しているか。これはテストしていないので推測だが、
兵器登録コードのパレットアニメ・陣営色の項目(アドレス8056)と関係していると考えられる。
(ここのコードを変えると、色は変わらないがパレットアニメが変わる、さらに変えていくと色が変わるといった現象が起こる)
例えば7回分繰り返しのうちのここは歩兵、ここは戦闘機・砲類、ここは艦船といった感じで管理を分けているかもしれない。
だとすると、7回分を全てバラバラの色構成にすると、1陣営の中で兵器種ごとに色が変わってカラフルなことになりそうだ。

いずれにせよそれは紛らわしいだけなので、改造するなら素直に7回分繰り返すのが無難。
しかし、冒頭の陣営色一覧に存在しないパレットを自作して当てはめることは当然可能である。

パレットデータその2

(加筆予定)
最終更新:2023年02月20日 17:15
添付ファイル