Aller au contenu

Empaquetage et distribution

Wayward Crown propose deux méthodes d'empaquetage pour compiler le jeu en exécutables directement distribuables.


Comparaison des méthodes

Élément PyInstaller Nuitka
Vitesse de compilation Rapide (secondes à minutes) Lente (5 à 15 minutes)
Vitesse d'exécution Identique à Python Légèrement plus rapide (+5 % à 30 %)
Protection du code source .pyc peut être décompilé Compilé en C, extrêmement difficile à rétro-ingénierer
Taille de la distribution Plus petite Plus grande
Compilateur C requis Non Oui
Utilisation recommandée Développement et tests Versions de production

Prérequis

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

L'extension C doit être compilée en premier ; sinon le jeu utilisera un chemin Python pur (performances réduites).


PyInstaller

Installation

pip install pyinstaller

Commande de compilation

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

Sortie

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

Nuitka

Installation

pip install nuitka zstandard ordered-set

Nécessite un compilateur C (Visual Studio Build Tools ou MinGW64).

Commande de compilation

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

Fichiers requis

Type Chemin Description
Extension C game/_ccore.cp3XX-*.pyd Accélération de base pour le pathfinding A*, le hachage spatial, etc.
Contenu du jeu game/content/*.json Définitions des classes, ennemis et bâtiments
Packs de langue game/lang/*.json Traductions en 15 langues
Ressources graphiques assets/ Toutes les images, musiques et effets sonores
Campagnes campaigns/ Campagne tutoriel intégrée
Cartes personnalisées maps/ Cartes des utilisateurs
Plugins plugins/ Extensions tierces
SDK Steam steam_sdk/ DLL Steamworks
Licences THIRD_PARTY_LICENSES.md etc. Documents de conformité LGPLv3

Version de Python

Le nom du fichier .pyd inclut la version de Python (ex. cp314). Après un changement de version de Python, vous devez recompiler l'extension C et mettre à jour le nom du fichier dans la commande de compilation.