Итак, вводная.
О данных и их форматах.
Цвета игроков определены в players.pal, game.pal и паре дефов. Их имена - в plcolors.txt
- Players.pal определяет цвета интерфейса и цвет флага в бою
- game.pal - цвет флажков и цвет на миникарте
- в дефах лежат
- флаг игрока (crest58.def),
- флажки для гильдии воров и т.п. (itgflags.def)
- отметки на карте "с птичьего полета" (vwsymbol.def)
- флаги героев и лодок (af*.def, abf*.def)
Формат палитр - обычный Microsoft Palette (заголовок 24 байта, потом 256 цветов в ARGB, 4 байта на каждый).
В game.pal цвета игрока занимают девять мест, начиная с 65ого (девятый - серый).
В players.pal цвета игроков занимают все пространство, т.е. на каждого игрока отводится 32 цвета (те самые, которые в индексированных геройских pcx'ах заменяют нижнюю часть палитры). Впрочем, после загрузки они приведутся к RGB565, но об этом позже.
Для редактирования этого players.pal я набросал утилитку:
https://dl.dropbox.com/u/61759222/HoMM/PaletteExplorer.zip

Сверху - крутилка списка игроков и кнопки "сохранить" и "загрузить".
Посередине - собстна, сама палитра.
Снизу слева - крутилки Hue/Saturation/Brightness. Кнопка Pick a color предложит выровнять всю палитру по какому-нить цвету (выбранный цвет станет первым в палитре, остальные изменятся по его образу и подобию). Глючновата
Снизу в центре - кнопки для заливки палитры градиентом (градиент плоский, убогий, но для экспериментов сойдет) и переворота палитры (первый цвет станет последним и т.п).
Снизу справа - место для медитаций.
О технических подробностях
Палитры грузятся один раз, при старте игры.
Код
CPU Disasm
Address Hex dump Command Comments
004EEAC0 |. B9 CCF76700 MOV ECX,OFFSET 0067F7CC ; ASCII "game.pal"
004EEAC5 |. E8 26CB0600 CALL 0055B5F0 ; [h3era.0055B5F0
004EEACA |. B9 C0F76700 MOV ECX,OFFSET 0067F7C0 ; ASCII "Players.pal"
004EEACF |. A3 18AD6A00 MOV DWORD PTR DS:[6AAD18],EAX
004EEAD4 |. E8 17CB0600 CALL 0055B5F0 ; [h3era.0055B5F0
004EEAD9 |. B9 C0F76700 MOV ECX,OFFSET 0067F7C0 ; ASCII "Players.pal"
004EEADE |. A3 10AD6A00 MOV DWORD PTR DS:[6AAD10],EAX
004EEAE3 |. E8 98CB0600 CALL 0055B680 ; [h3era.0055B680
Address Hex dump Command Comments
004EEAC0 |. B9 CCF76700 MOV ECX,OFFSET 0067F7CC ; ASCII "game.pal"
004EEAC5 |. E8 26CB0600 CALL 0055B5F0 ; [h3era.0055B5F0
004EEACA |. B9 C0F76700 MOV ECX,OFFSET 0067F7C0 ; ASCII "Players.pal"
004EEACF |. A3 18AD6A00 MOV DWORD PTR DS:[6AAD18],EAX
004EEAD4 |. E8 17CB0600 CALL 0055B5F0 ; [h3era.0055B5F0
004EEAD9 |. B9 C0F76700 MOV ECX,OFFSET 0067F7C0 ; ASCII "Players.pal"
004EEADE |. A3 10AD6A00 MOV DWORD PTR DS:[6AAD10],EAX
004EEAE3 |. E8 98CB0600 CALL 0055B680 ; [h3era.0055B680
После загрузки указатель на загруженную game.pal будет висеть по адресу 6AAD18, на players.pal, соответственно по 6AAD10
Непосредственно цветовые таблицы лежат по смещению +1С относительно загруженных данных, причем цвет там хранится в виде массива слов, каждое из которых представляет собой RGB565 цвет. Изменение данных в памяти практически сразу же действует на игру
То есть, теоретически, палитры можно менять ERM'ом, реально же делать это ручками я бы точно не стал.