EnglishРусский Map

pvz-ps2

title
pvz-ps2
type
toolbox
summary
Plants vs. Zombies на PlayStation 2 - подмножество GL поверх gsKit, прикрученное к декомпиляции PvZ
tags
cpp, retrocomputing, gaming, homebrew, playstation-2, decompilation, watchlist
language
C++
license
CC0-1.0
created
2026-07-29
updated
2026-07-29
lang
ru
translation_of
pvz-ps2
source_updated
2026-07-29
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Порт Plants vs. Zombies для PlayStation 2, созданный как четвёртое звено в цепочке форков. В репозитории re-plants-vs-zombies от Patoke декомпилировали исполняемый файл PvZ Game of the Year и начали модернизировать SexyAppFramework от PopCap - C++ движок образца 2005 года на DirectDraw и Direct3D7. В форке от headshot2017 заменили рендерер на SDL2 и OpenGL, перевели звук с DirectSound/BASS/FMOD на SDL Mixer X и портировали результат на Windows, Linux, Haiku, Nintendo Switch и (в процессе) 3DS. После чего OptiJuegos взял этот код и адаптировал его под железо 2000 года.

README почти полностью унаследован от upstream'а и совсем не описывает работу под PS2 - в его таблице платформ перечислены системы от Windows до Wii U, но нет строки с PS2. Единственный оригинальный текст - три строчки в самом начале: собирайте через build ps2.bat на Windows, настраивайте CMake вручную на Linux и используйте сжатый main.pak, чтобы "избежать долгой загрузки и вылетов". Из чего на самом деле состоит порт, приходится выяснять прямо по дереву исходников.

Что сделано

Код для PS2 находится в SexyAppFramework/platform/ps2/, а его центральная часть - gles_ps2.cpp, рукописная реализация того подмножества OpenGL, которое вызывает движок, поверх gsKit. Заголовочный файл с нуля объявляет типы и константы GL (GLenum, GLbitfield, GL_TRIANGLE_FAN, GL_UNSIGNED_BYTE и всё остальное), поскольку на PS2 никакого GL нет. Вместо того чтобы переносить игру на модель Graphics Synthesizer, в порте реализовали API, на котором игра уже умеет общаться.

Вокруг этого:

  • Ps2VramAllocator вручную управляет 4 МБ видеопамяти PS2, реализуя выделение, освобождение и механизм полной выгрузки (full-eviction), а также отладочные счётчики (ps2_dbg_vram_current_kb, ps2_dbg_vram_free_blocks, ps2_dbg_vram_recycled_kb). Размещение текстур в памяти - главная проблема порта, для которой потребовался собственный аллокатор.
  • Ps2TextureConversion преобразует 32-битные BGRA-поверхности движка в пиксельные форматы GS - PSMCT32 (обратите внимание на >> 1 для альфа-канала, так как GS считает значение 0x80 полностью непрозрачным), PSMCT16 с усечением до 5-5-5-1 и T8-палитризатор со swizzling'ом индексов CLUT CSM1 для 8-битных индексированных текстур. Только за счёт снижения битности вдвое или перехода на палитру ресурсы вообще смогли поместиться.
  • SDL.h - это не SDL. Это shim, предоставляющий SDL_Init, SDL_GetTicks, SDL_Delay и объединение событий из двух полей, чтобы общий главный цикл SexyApp компилировался без изменений. SDL_GetTicks считывает GetTimerSystemTime() с таймера EE, а не через clock() из newlib, с комментарием, объясняющим причину: на PS2 clock() завязан на процессорное время и перестаёт идти, пока основной поток спит, а цикл движка ждёт изменения этого значения перед запуском первого обновления.
  • Остальное - платформенная обвязка: Ps2PadState и Input.cpp для геймпада, Ps2SoundManager, Ps2IoLock, Ps2AssetIndex, Ps2Trace (трассировщик цвета рамки, по умолчанию исключённый из сборки) и main_pvz_ps2.cpp, который считывает префикс устройства из argv[0] (cdrom0:, mass:, host:), чтобы определить, откуда читать ресурсы и куда сохранять данные.

CMake/ps2_embed_irx.cmake встраивает модули драйверов IOP в ELF, а build ps2.bat управляет пресетами CMake с опциональным шагом iso, создающим образ диска: он генерирует SYSTEM.CNF со строкой BOOT2 = cdrom0:\SLUS_67420.69;1 - выдуманным серийным номером в американском формате для ритейла.

Дамп зависимостей

Фраза "it has all the dependencies (windows)!!" понимается буквально. Папка psdevwindows/ содержит весь тулчейн ps2dev, закоммиченный прямо в git: PS2SDK, gsKit и кросс-компиляторы GCC 15.2.0 под оба процессора - mips64r5900el-ps2-elf для Emotion Engine и mipsel-none-elf для I/O Processor. Примерно 4100 из ~5100 отслеживаемых файлов в репозитории приходятся на этот тулчейн. Именно поэтому сборка под Windows запускается в два клика, а пользователям Linux предлагается разбираться с CMake самостоятельно.

Что неизвестно

Нет ни релизов, ни скриншотов, ни заметок о совместимости, ни указаний на то, работает ли это на реальном железе или только в PCSX2. В репозитории всего шесть коммитов за два дня (с 2026-07-09 по 2026-07-10), и с тех пор к нему не прикасались; последние два коммита - это исправления файлового ввода-вывода IOP от стороннего автора. Так что код вполне реален и конкретен, но результат нигде не зафиксирован - эта страница описывает то, что написано, а не то, как оно работает.

Ресурсы игры в комплект не входят и не могут входить: порту требуются main.pak и папка properties из купленной копии PvZ GOTY, а в upstream'е прямо указано, что интеллектуальная собственность PopCap, за пределами открытого движка, не распространяется. GitHub определяет лицензию как CC0-1.0, унаследованную от исходной декомпиляции, а не выбранную специально.

Помечено тегом watchlist - см. watchlist. Имеет смысл проверить ещё раз, появится ли релиз и какие-либо подтверждения работоспособности, или проект так и останется артефактом двух дней работы.

Более широкий контекст подобных начинаний описан в retrocatalog (каталоге современных портативных устройств и платформ эмуляции, где PS2 выделена в отдельную категорию) и mac-classic (поддержании исторического софта в рабочем состоянии, а не просто архивном сохранении). Этот проект находится по другую сторону границы: вместо эмуляции PS2 ради старых игр он компилирует ПК-игру 2009 года для запуска на этой консоли.

CC0-1.0, ~42★ на 2026-07-29. Upstream: Patoke/re-plants-vs-zombies и форк от headshot2017.