From dbf9166836bbb01ee5f20e5c7c8837369a56a5c3 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 10 Aug 2026 12:32:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=B2=D0=B5=D1=82=D0=B0=206=20=D0=B8=201?= =?UTF-8?q?2=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D0=BE=D0=B9=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D1=82=D1=80=D1=8B:=20=D0=B8=D0=B3=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D1=82=20=D0=B8=D1=85=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=B5,=20=D0=BC=D1=8B?= =?UTF-8?q?=20=D0=B1=D1=80=D0=B0=D0=BB=D0=B8=20VGA-=D0=B7=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Симптом (наблюдение пользователя): кирпичи дворцовой кладки правильного цвета, а швы между ними — нет. Корень шире, чем швы. init_game_main (seg000:164) подменяет ДВЕ записи 16-цветной палитры сразу после загрузки: // (blood, hurt flash) #E00030 = red set_pal(12, 0x38, 0x00, 0x0C); // (palace wall pattern) #C09850 = light brown set_pal( 6, 0x30, 0x26, 0x14); Подтверждено дампом палитры живого SDLPoP: PAL[6] = 48,38,20, PAL[12] = 56,0,12. У нас в таблице VGA16 стояли стандартные VGA-цвета (42,21,0) и (63,21,21). Цветом 6 рисуются швы дворцовой кладки (blitters_46h_mono_6), цветом 12 — кровь чомпера и вспышка урона, так что промах был не только в стенах. Заодно исправлена вспышка урона в roomtest.c: было flash_bg(255,85,85) (стандартный brightred), стало (224,0,48). Проверка: ряд стен уровня 4 теперь совпадает с эталоном SDLPoP по всем восьми цветам и их количествам один в один (5333/4013/3110/2065/1785/1372/ 1075/447). Остаточное различие значений — только наше масштабирование 6->8 бит: (v*255)/63 против v*4 у SDLPoP, то есть (194,153,80) против (192,152,80). ПОПРАВКА к f107711: там записано, будто рисунок кладки не совпадает с оригиналом из-за замены PRNG. Это неверно — POP_PRANDOM_EXACT по умолчанию 1, работает ассемблерный LCG оригинала, и совпадение счётчиков цветов это подтверждает. Расхождения по PRNG нет. Co-Authored-By: Claude Opus 5 --- applications/PoP/poc/res/bg/pop_bg.pal | Bin 1024 -> 1024 bytes applications/PoP/poc/res/kid/kid.pal | Bin 1024 -> 1024 bytes applications/PoP/roomtest/roomtest.c | 4 +++- applications/PoP/toolchain/pop_pack_bg.py | 9 +++++++-- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/applications/PoP/poc/res/bg/pop_bg.pal b/applications/PoP/poc/res/bg/pop_bg.pal index fc1752b665f57976c757d4aba4beae535a890f95..b574a9134b6de555a330e18a00ea33e5f9676707 100644 GIT binary patch delta 38 qcmZqRXyBM|LposQA%<0}RxyNzhBEvI;?Vy<8i)-T9&P;0%M1W6K@X<@ delta 38 qcmZqRXyBM|Lz*FU6~n4ks~AE_4aA|L|2KZ-Wd;Bpa}SaL diff --git a/applications/PoP/poc/res/kid/kid.pal b/applications/PoP/poc/res/kid/kid.pal index 22ab0806685f8a7bbe2f5e81da42009b1cc7265f..bfbd2cda33e9e5598420bedb54c203b325f54f40 100644 GIT binary patch delta 38 qcmZqRXyBM|LposQA%<0}RxyNzhBEvI;?Vy<8i)-T9&P;0%M1W6K@X<@ delta 38 qcmZqRXyBM|Lz*FU6~n4ks~AE_4aA|L|2KZ-Wd;Bpa}SaL diff --git a/applications/PoP/roomtest/roomtest.c b/applications/PoP/roomtest/roomtest.c index 6ed5c15..9fe8172 100644 --- a/applications/PoP/roomtest/roomtest.c +++ b/applications/PoP/roomtest/roomtest.c @@ -840,7 +840,9 @@ int main(void) if (!pop_flash_time) pop_flash_red = 0; flash_on = 1; } else if (pop_kid_hurt) { - flash_bg(255, 85, 85); /* color_12_brightred */ + flash_bg(224, 0, 48); /* color_12: игра правит его на */ + /* #E00030 (seg000:164), это не */ + /* стандартный VGA brightred */ flash_on = 1; } update_kid_render_dx(); /* straddle: смещение спрайта, если kid_room≠cur_room */ diff --git a/applications/PoP/toolchain/pop_pack_bg.py b/applications/PoP/toolchain/pop_pack_bg.py index 82a0f30..322bee6 100644 --- a/applications/PoP/toolchain/pop_pack_bg.py +++ b/applications/PoP/toolchain/pop_pack_bg.py @@ -125,8 +125,13 @@ POT_PAL_BASE = 0x40 # 16 цветов chtab_1 -> слоты 0x40..0x4F # MONO-блит (method_3_blit_mono, seg009:3040) красит спрайт цветом из ОБЩЕЙ # 16-цветной палитры экрана, а не из палитры chtab. Кладём её в 0x30..0x3F. VGA16_PAL_BASE = 0x30 -VGA16 = [(0,0,0),(0,0,42),(0,42,0),(0,42,42),(42,0,0),(42,0,42),(42,21,0), - (42,42,42),(21,21,21),(21,21,63),(21,63,21),(21,63,63),(63,21,21), +# Два цвета игра ПРАВИТ на старте (init_game_main, seg000:164) — стандартные +# VGA-значения там не годятся: +# 6 -> #C09850 (0x30,0x26,0x14) «palace wall pattern» — швы дворцовой кладки +# 12 -> #E00030 (0x38,0x00,0x0C) «blood, hurt flash» — кровь и вспышка урона +# Проверено дампом палитры живого SDLPoP: PAL[6]=48,38,20 PAL[12]=56,0,12. +VGA16 = [(0,0,0),(0,0,42),(0,42,0),(0,42,42),(42,0,0),(42,0,42),(48,38,20), + (42,42,42),(21,21,21),(21,21,63),(21,63,21),(21,63,63),(56,0,12), (63,21,63),(63,63,21),(63,63,63)] # 6-битные каналы, как в .pal POT_MASK_COLOR = VGA16_PAL_BASE + 0 # чёрный (blitters_40h_mono без цвета) POT_BUBBLE_COLOR = VGA16_PAL_BASE + 12 # ярко-красный (color 12: «лечение»)