Saltar a contenido

Empaquetado y Distribución

Wayward Crown ofrece dos métodos de empaquetado para compilar el juego en ejecutables directamente distribuibles.


Comparación de Métodos

Elemento PyInstaller Nuitka
Velocidad de compilación Rápida (segundos a minutos) Lenta (5–15 minutos)
Velocidad de ejecución Igual que Python Ligeramente más rápida (+5%–30%)
Protección del código fuente .pyc puede descompilarse Compilado a C, extremadamente difícil de revertir
Tamaño de distribución Menor Mayor
Requiere compilador C No
Uso recomendado Desarrollo y pruebas Versiones de producción

Requisitos Previos

pip install -r requirements.txt
python setup_ext.py build_ext --inplace   # Genera game/_ccore.*.pyd

La extensión C debe compilarse primero; de lo contrario, el juego recurrirá a una ruta de Python puro (menor rendimiento).


PyInstaller

Instalación

pip install pyinstaller

Comando de Compilación

pyinstaller --noconfirm --clean --name WaywardCrown ^
    --noconsole ^
    --icon "assets/Icons/WaywardCrown.ico" ^
    --add-data "assets;assets" ^
    --add-data "game/content;game/content" ^
    --add-data "game/lang;game/lang" ^
    --add-data "plugins;plugins" ^
    --add-data "campaigns;campaigns" ^
    --add-data "maps;maps" ^
    --add-data "steam_sdk;steam_sdk" ^
    --add-data "THIRD_PARTY_LICENSES.md;." ^
    --add-data "LGPL-3.0.txt;." ^
    --add-data "GPL-3.0.txt;." ^
    --add-binary "game/_ccore.cp314-win_amd64.pyd;game" ^
    --hidden-import PySide6.QtWidgets ^
    --hidden-import PySide6.QtCore ^
    --hidden-import PySide6.QtGui ^
    --hidden-import PySide6.QtOpenGLWidgets ^
    --hidden-import PySide6.QtMultimedia ^
    --hidden-import OpenGL.GL ^
    main.py

Resultado

dist/WaywardCrown/
├── WaywardCrown.exe
└── _internal/
    ├── assets/
    ├── game/
    │   ├── _ccore.cp314-win_amd64.pyd
    │   ├── content/
    │   └── lang/
    ├── campaigns/
    ├── maps/
    └── plugins/

Nuitka

Instalación

pip install nuitka zstandard ordered-set

Requiere un compilador C (Visual Studio Build Tools o MinGW64).

Comando de Compilación

python -m nuitka ^
    --standalone ^
    --plugin-enable=pyside6 ^
    --include-data-dir=assets=assets ^
    --include-data-dir=game/content=game/content ^
    --include-data-dir=game/lang=game/lang ^
    --include-data-dir=plugins=plugins ^
    --include-data-dir=campaigns=campaigns ^
    --include-data-dir=maps=maps ^
    --include-data-dir=steam_sdk=steam_sdk ^
    --include-data-files=steam_sdk/steam_api.dll=steam_sdk/steam_api.dll ^
    --include-data-files=steam_sdk/win64/steam_api64.dll=steam_sdk/win64/steam_api64.dll ^
    --include-data-files=game/_ccore.cp314-win_amd64.pyd=game/_ccore.cp314-win_amd64.pyd ^
    --include-data-files=THIRD_PARTY_LICENSES.md=THIRD_PARTY_LICENSES.md ^
    --include-data-files=LGPL-3.0.txt=LGPL-3.0.txt ^
    --include-data-files=GPL-3.0.txt=GPL-3.0.txt ^
    --include-qt-plugins=multimedia ^
    --include-package=OpenGL ^
    --include-module=PySide6.QtOpenGLWidgets ^
    --include-module=PySide6.QtMultimedia ^
    --windows-console-mode=disable ^
    --windows-icon-from-ico=assets/Icons/WaywardCrown.ico ^
    --output-filename=WaywardCrown.exe ^
    --output-dir=dist ^
    --lto=yes ^
    --jobs=8 ^
    main.py

Archivos Necesarios

Tipo Ruta Descripción
Extensión C game/_ccore.cp3XX-*.pyd Aceleración principal para pathfinding A*, hashing espacial, etc.
Contenido del juego game/content/*.json Definiciones de clases, enemigos y edificios
Paquetes de idioma game/lang/*.json Traducciones de 15 idiomas
Recursos artísticos assets/ Todas las imágenes, música y efectos de sonido
Campañas campaigns/ Campaña tutorial integrada
Mapas personalizados maps/ Mapas de usuario
Plugins plugins/ Extensiones de terceros
Steam SDK steam_sdk/ DLL de Steamworks
Licencias THIRD_PARTY_LICENSES.md etc. Documentos de cumplimiento LGPLv3

Versión de Python

El nombre del archivo .pyd incluye la versión de Python (por ejemplo, cp314). Después de cambiar de versión de Python, debes recompilar la extensión C y actualizar el nombre del archivo en el comando de compilación.