PvZ-Portable:跨平台植物大战僵尸重实现

近乎100%复现植物大战僵尸年度版体验的开源引擎,支持Linux、Windows、macOS等多平台

Posted by wszqkzqk on January 26, 2026
本文字数:4292

PvZ-Portable

笔者在大一时曾经尝试写过 Python 版植物大战僵尸。那时候笔者还在起步阶段,用 Python 和 Pygame 做了一个简单的练习,主要目的是学习 Python 和面向对象编程。那个项目虽然能玩,但在还原度上和功能完成度上存在不少局限。

时隔几年,随着技术栈的深入,在开源社区前人大量代码1 2的基础上,笔者带来了一个强大得多的新项目 —— PvZ-Portable

这是一个跨平台的社区驱动项目,是对《植物大战僵尸:年度版》(GOTY Edition)的完整重实现。与之前的玩具项目不同,PvZ-Portable 的目标是100% 还原原版游戏体验,同时让它能在现代硬件和各种非官方支持的平台上流畅运行。项目开源开发,用于交流学习跨平台移植技术引擎现代化以及研究如何将经典游戏逻辑适配到各种不同的硬件架构(如 ARM, RISC-V, LoongArch)上。

🌿 原汁原味 🎮 可移植/跨平台 🛠️ 开源开放
几乎 100% 复刻原版所有特性 支持 Linux, Windows, macOS, Switch… 基于 OpenGL & SDL

为什么要重写?

原版《植物大战僵尸》虽然经典,但毕竟是十几年前的游戏。原版使用了 DirectX 7 等过时技术,且只提供了 32 位可执行文件,在现代操作系统上运行可能会遇到兼容性问题,而且它从未官方支持过 Linux,也没有适配过 LoongArch 等新兴指令集架构。

在开源社区,已经有前人基于逆向工程得到的文档和社区研究,3重写了游戏引擎。PvZ-Portable 在此基础上进一步开发,是一个专注于跨平台移植技术的研究项目,主要目标包括:

  1. 现代化渲染:使用 SDL2 和 OpenGL 替代了古老的 DirectX4,支持硬件加速,并且终于支持调整窗口大小了!
    • 由于游戏分辨率仅有 800x600,在高分辨率屏幕上运行原版时窗口会非常小,只有开启全屏模式才能放大。
    • PvZ-Portable 支持任意缩放比例,也支持窗口最大化和全屏。
  2. 真正、全面跨平台
    • OS: Linux, Windows, macOS
    • ISA: x86_64, aarc64, riscv64, loongarch64, …
    • 主机: Nintendo Switch
    • 其他: Haiku OS 等小众系统
  3. 音频升级:基于 Headshotnoby 的适配工作,使用 SDL Mixer X 和 libopenmpt,支持 MO3 音乐格式。
  4. 修复原版 Bug:在保持原汁原味的同时,本项目还可选修复一些原版游戏中存在的逻辑错误(例如有关特殊的魅惑僵尸的某些行为等)。当然,如果你喜欢那些“特性”,也可以选择不开启修复。(默认不启用额外修复,保证体验与原版一致)

⚠️ 版权与使用说明

重要:本项目仅包含代码引擎,不包含任何游戏素材!

PvZ-Portable 严格遵守版权协议。游戏的 IP(植物大战僵尸)属于 PopCap/EA。

要游玩此项目,你必须拥有正版游戏(如果没有,请在 SteamEA 官网 上购买)。你需要从正版游戏中提取以下文件放到 PvZ-Portable 的程序所在目录中:

  • main.pak
  • properties/ 目录

本项目仅提供引擎代码,用于技术学习,不包含上述任何游戏资源文件,任何游戏资源均需要用户自行提供正版游戏文件。

使用指南

数据存储

PvZ-Portable 会自动在各操作系统的标准应用数据目录下存储存档和配置:

  • Linux: ~/.local/share/io.github.wszqkzqk/PlantsVsZombies/
  • Windows: %APPDATA%\io.github.wszqkzqk\PlantsVsZombies\
  • macOS: ~/Library/Application Support/io.github.wszqkzqk/PlantsVsZombies/
  • Nintendo Switch: sdmc:/switch/PlantsvsZombies

你可以手动将原版的用户进度文件复制到上述路径的 userdata 子目录下,以继续你的游戏进度(例如复制 users.dat, user1.dat 等)。但是请注意,由于关卡内进度(例如 game1_13.dat)的保存涉及到内存数据,无法兼容原版。

构建与测试

作为开源项目,你可以自由地编译它。本项目使用了现代化的 CMake 构建系统。

构建

这部分仅涉及引擎的编译,适用于开发者或希望手动管理游戏文件的用户。确保安装了 CMake, Ninja, SDL2, OpenGL, libopenmpt 等依赖。这里列出了部分平台的依赖安装命令:

  • Arch Linux:
    sudo pacman -S --needed base-devel cmake glew libjpeg-turbo libogg libopenmpt libpng libvorbis mpg123 ninja sdl2-compat
    
  • Windows (MSYS2 UCRT64):
    pacman -S --needed base-devel mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-glew mingw-w64-ucrt-x86_64-libjpeg-turbo mingw-w64-ucrt-x86_64-libopenmpt mingw-w64-ucrt-x86_64-libogg mingw-w64-ucrt-x86_64-libpng mingw-w64-ucrt-x86_64-libvorbis mingw-w64-ucrt-x86_64-mpg123 mingw-w64-ucrt-x86_64-ninja mingw-w64-ucrt-x86_64-SDL2
    
  • macOS (Homebrew):
    brew install cmake dylibbundler glew jpeg-turbo libogg libopenmpt libpng libvorbis mpg123 ninja sdl2
    

配置项目 (Release 模式):

cmake -G Ninja -B build -DCMAKE_BUILD_TYPE=Release

编译:

cmake --build build

编译完成后,你需要手动将正版游戏的 main.pakproperties/ 复制到生成的可执行文件所在目录才能运行。

Arch Linux 打包与环境测试

为了方便在 Arch Linux 环境下进行测试,仓库中提供了 PKGBUILD 脚本;笔者创建这个文件的原因主要是为了研究引擎在不同显示服务器(Wayland vs. X11)下的行为差异

由于法律原因,我们无法在软件包中分发游戏资源。在打包前,你需要自行提供正版游戏资源:

  1. 找到你购买的正版游戏安装目录,常见路径包括:
    • Steam (Linux/Proton): ~/.steam/steam/steamapps/common/PlantsVsZombies/
    • Steam (Windows): C:\Program Files (x86)\Steam\steamapps\common\PlantsVsZombies\
    • PopCap (Windows): C:\Program Files (x86)\PopCap Games\PlantsVsZombies\C:\Program Files\PopCap Games\PlantsVsZombies\
  2. main.pakproperties/ 目录打包为 Plants_vs._Zombies_1.2.0.1073_EN.zip
    • 确保 main.pak 位于 ZIP 文件的根目录,而不是子目录内。例如,可以使用以下命令(假设你在游戏目录下):
      7z a Plants_vs._Zombies_1.2.0.1073_EN.zip main.pak properties/
      
  3. 将该 ZIP 文件放置在 archlinux/ 目录下。

然后执行打包命令:

cd archlinux
makepkg -si

关于 Wayland 的测试

在 Linux 平台上,我们特别关注 SDL2 后端在 Wayland 和 X11 环境下的表现差异(例如全屏下的黑边闪烁问题)。为此,Arch Linux 包中引入了一个特殊的启动脚本,用于自动检测环境并在必要时调整 SDL 视频驱动:

#!/usr/bin/env sh

# Default to Wayland SDL video driver if running in a Wayland session and $SDL_VIDEODRIVER is not set
if [ -n "$WAYLAND_DISPLAY" ] && [ -z "$SDL_VIDEODRIVER" ]; then
    export SDL_VIDEODRIVER="wayland,x11"
fi

exec /usr/share/pvz-portable/pvz-portable "$@"

在运行的时候,这个脚本会检查当前是否在 Wayland 会话中运行,如果是且没有设置 SDL_VIDEODRIVER 环境变量,则会将其设置为 wayland,x11,以优先使用 Wayland 后端。在需要测试 Xwayland 的情况下,可以在启动时手动设置 SDL_VIDEODRIVER=x11

DeepWiki AI 助手

如果你在测试、学习或开发 PvZ-Portable 过程中遇到问题,可以询问项目的 DeepWiki AI 助手

由于本项目高度精准地实现了原版的游戏逻辑,你也可以通过 DeepWiki AI 助手来查询原版游戏的详细内部机制和规则

致谢

这个项目站在了巨人的肩膀上。

  • 特别感谢 PatokeHeadshotnoby 对引擎的跨平台移植的杰出贡献!
  • 感谢 SDL 开发团队提供的强大跨平台库!
  • 感谢所有为游戏研究做出贡献的社区成员!
  • 感谢宝开创造了这个经典游戏!

如果你对游戏引擎开发或者跨平台移植感兴趣,欢迎访问项目仓库给个 Star,或者参与贡献!

👉 项目地址: https://github.com/wszqkzqk/PvZ-Portable

  1. Patoke 的 re-plants-vs-zombies 

  2. Headshotnoby 的 re-plants-vs-zombies fork 

  3. 互联网上存在大量关于植物大战僵尸游戏机制的研究文档,部分基于逆向分析,例如在 植物大战僵尸吧, PVZ WikiPvZ Tools 等平台上都有丰富详尽的游戏机制细节资料。但笔者从未对游戏进行过任何逆向工程分析。 

  4. 原版植物大战僵尸使用 DirectX 7 进行渲染,无法跨平台且性能较差。目前为止,移植到 OpenGL 的主要工作由 PatokeHeadshotnoby 完成。