В свежем релизе Pizza Legacy v0.1.0 появилась долгожданная возможность официально завершить игру победой — совсем как в оригинале.
В детстве, когда я пропадал в Pizza Tycoon (1994), вопрос финала меня совершенно не волновал. Мне было в радость развивать сеть ресторанов, экспериментировать с рецептурой пиццы и ради финансирования империи даже промышлять нелегальной торговлей оружием. О том, что игру можно «пройти» до победного конца, я тогда даже не задумывался.
Приступив к работе над ремейком, я начал изучать исходные файлы Pizza Tycoon. Среди прочего обнаружился графический файл ENDE.VGA и текстовое сопровождение ENDE.E, проливающее свет на финал:

Первая строка в ENDE.E гласила:
Вы совершили невозможное! Вы — единоличный правитель западного рынка фастфуда! Вы — настоящий МАГНАТ ПИЦЦЫ.
Это недвусмысленно намекало на существование финала, но подробности условий оставались загадкой.
Я на время отложил этот вопрос, сосредоточившись на разработке, пока случайно не наткнулся на пост на Reddit: «Я «выиграл» в Pizza Tycoon? Как так вышло?». Любопытство взяло верх, и я решил изучить ассемблерный код игры, обратившись за помощью к ИИ (Claude) для интерпретации логики. Его вердикт был таков:
Функция end_of_week_processing еженедельно проверяет, удерживает ли игрок долю рынка не менее 5% во ВСЕХ 10 городах.
Это выглядело логично и подтверждалось найденным текстом. Однако это в корне противоречило словам автора поста на Reddit, который утверждал, что победил, имея рестораны только в двух городах. Я попытался связаться с ним, но ответа не получил.
Нестыковка
Позже, тестируя собственный движок, я наткнулся на видео Pizza Tycoon — Worldwide Pizza King — Episode Ten. В нем игрок AppleSauce внезапно увидел экран победы, хотя его экспансия ограничивалась лишь Парижем. Раз у меня была запись геймплея, я мог со стопроцентной уверенностью сказать: условия «во всех городах» там не было. Пришлось снова нырять в дебри ассемблера.
Разбор функции end_of_week_processing (которую я постепенно документировал последние 15 лет в PT.EXE) расставил всё по местам. Эта процедура вызывается раз в неделю и отвечает за расчеты банкротства, прибыль и проверку победных условий.

Логика проверки выглядела так:
loc_546CD:
xor bl, bl ; индекс города = 0 (Париж)
jmp short loc_546F3 ; запуск цикла
loc_546D1:
movzx eax, bh ; bh = индекс текущего игрока
imul eax, 0x0A ; игрок * 10 (10 городов)
movzx edx, bl ; индекс города
cmp byte ptr marketshare_percentages[edx+eax], 5
jb short loc_546F8 ; доля < 5%? выход из цикла
push 0x8C ; GAME_OVER_YOU_WON
call schedule_fullscreen_status_update ; ВЫ ПОБЕДИЛИ
add esp, 4
inc bl
loc_546F3:
cmp bl, 0x0A ; цикл до 10 городов
jb short loc_546D1
loc_546F8: ; код после завершения
movzx edx, bh
...
В переложении на C это выглядит так:
int number_of_cities = 10;
for (int city_id = 0; city_id < number_of_cities; city_id++) {
if (marketshare_percentages[player_id][city_id] < 5) {
break;
}
schedule_fullscreen_status_update(GAME_OVER_YOU_WON);
}
Ошибка фундаментальна: функция победы вызывается внутри цикла, сразу после первой успешной проверки. То есть, игра считает вас победителем, как только вы добираетесь до 5% доли рынка в Париже (городе с индексом 0).
Практический тест
Я проверил это на своей сохраненке: имея 5%+ в шести городах, я не получал победу, но стоило мне открыть ресторан в Париже, как игра тут же завершилась триумфом. Интересно, что в оригинальной немецкой Pizza Connection бага нет — он специфичен для англоязычной локализации от MicroProse.
Чтобы сэкономить время, я схитрил: с помощью Python-скрипта проанализировал дампы сохранений, вычислил адрес переменной с количеством бомб (0x2E0) и накрутил себе капитал, чтобы быстро развить бизнес в Париже. Баг подтвердился: в англоязычной версии вы побеждаете, стоит лишь захватить Париж.

Баг или фича?
Скорее всего, разработчики задумывали полноценную экспансию во все 10 городов, но при адаптации игры для западного рынка через MicroProse логику случайно сломали. Тот факт, что «победным» стал Париж, — чистая случайность: это просто первый город в массиве данных. Если бы они хотели упростить задачу сознательно, они бы могли выбрать любой другой город.
Зачем вообще потребовалось вмешательство в код? Вероятно, маркетинг: Pizza Tycoon была частью «Tycoon Series», нацеленной на более массовую, казуальную аудиторию. В англоязычной версии даже убрали саркастичные немецкие титры, заменив их навязчивой рекламой других игр серии.

Как это работает в Pizza Legacy
Теперь, спустя 30 лет, игроки могут выбрать: либо проходить игру в «исправленном» режиме (захватив все города), либо оставить всё как в классической версии (доминируя в одном Париже). В следующем обновлении я добавлю удобный переключатель условий победы.
В Pizza Legacy реализовано множество улучшений — подробности можно найти в MODERNIZATIONS.md. Последняя версия Pizza Legacy v0.1.0 — лучший способ ощутить этот классический геймплей с современным подходом.


