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, с комментарием, объясняющим причину: на PS2clock()завязан на процессорное время и перестаёт идти, пока основной поток спит, а цикл движка ждёт изменения этого значения перед запуском первого обновления.- Остальное - платформенная обвязка:
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.