1
0
Fork 0
mirror of https://github.com/EDeev/pixel_gamble.git synced 2026-10-07 23:49:29 +03:00
pixel_gamble/tools/import_assets.py
Egor Deev 4ecb9257c8 Pixel Gamble 2.0: законченная игра на ресурсах Ninja Adventure
- 10 волн, 5 видов врагов со своим поведением и босс в три фазы
- меч, копьё и посох, 11 улучшений между волнами, опыт и уровни
- меню, пауза, настройки, итоги партии и рекорд, русский и английский
- мир 480×270 с масштабированием, интерфейс в 960×540, скорости от dt
- асинхронный цикл: та же игра в браузере через pygbag
- тесты без окна, автоигрок, CI, релизы exe/Linux, GitHub Pages
- README на двух языках; исходная версия — релиз v1.0.0
2026-10-07 12:29:41 +00:00

127 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Копирует нужные файлы из набора Ninja Adventure (CC0) в game/assets.
Набор: https://pixel-boy.itch.io/ninja-adventure-asset-pack — архив
«Ninja Adventure - Asset Pack.zip». Звуки перекодируются в OGG (нужен ffmpeg),
потому что браузерная сборка (pygbag) надёжно играет только OGG.
python tools/import_assets.py "путь/к/Ninja Adventure - Asset Pack"
"""
import shutil
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
DEST = ROOT / "game" / "assets"
IMAGES = {
"chars/player.png": "Actor/Character/NinjaGreen/SpriteSheet.png",
"chars/player_face.png": "Actor/Character/NinjaGreen/Faceset.png",
"chars/ninja.png": "Actor/Character/NinjaGray/SpriteSheet.png",
"chars/skeleton.png": "Actor/Character/Skeleton/SpriteSheet.png",
"chars/slime.png": "Actor/Monster/Slime/Slime.png",
"chars/bat.png": "Actor/Monster/BlueBat/SpriteSheet.png",
"chars/cyclop_walk.png": "Actor/Boss/DemonCyclop/Walk.png",
"chars/cyclop_hit.png": "Actor/Boss/DemonCyclop/Hit.png",
"chars/boss_walk.png": "Actor/Boss/GiantRedSamurai/Walk.png",
"chars/boss_idle.png": "Actor/Boss/GiantRedSamurai/Idle.png",
"chars/boss_attack_l.png": "Actor/Boss/GiantRedSamurai/AttackLeft.png",
"chars/boss_attack_r.png": "Actor/Boss/GiantRedSamurai/AttackRight.png",
"chars/boss_charge_l.png": "Actor/Boss/GiantRedSamurai/ChargeLeft.png",
"chars/boss_charge_r.png": "Actor/Boss/GiantRedSamurai/ChargeRight.png",
"chars/boss_hit.png": "Actor/Boss/GiantRedSamurai/Hit.png",
"chars/boss_face.png": "Actor/Boss/GiantRedSamurai/Faceset.png",
"chars/shadow.png": "Actor/Character/Shadow.png",
"tiles/floor.png": "Backgrounds/Tilesets/TilesetFloor.png",
"tiles/nature.png": "Backgrounds/Tilesets/TilesetNature.png",
"fx/arc.png": "FX/Slash/SpriteSheetArc.png",
"fx/smoke.png": "FX/Smoke/Smoke/SpriteSheet.png",
"fx/energy_ball.png": "FX/Projectile/EnergyBall.png",
"fx/shuriken.png": "FX/Projectile/Shuriken.png",
"fx/rock.png": "FX/Particle/Rock.png",
"fx/leaf.png": "FX/Particle/Leaf.png",
"items/heart.png": "Items/Potion/Heart.png",
"items/sword.png": "Items/Weapons/Sword/Sprite.png",
"items/lance.png": "Items/Weapons/Lance/Sprite.png",
"items/wand.png": "Items/Weapons/MagicWand/Sprite.png",
"items/sword_hand.png": "Items/Weapons/Sword/SpriteInHand.png",
"items/lance_hand.png": "Items/Weapons/Lance/SpriteInHand.png",
"items/wand_hand.png": "Items/Weapons/MagicWand/SpriteInHand.png",
"ui/hearts.png": "Ui/Receptacle/Heart.png",
"icons/heart.png": "Ui/Skill Icon/Spell/DefenseUpgrade.png",
"icons/damage.png": "Ui/Skill Icon/Spell/AttackUpgrade.png",
"icons/speed.png": "Ui/Skill Icon/Items & Weapon/Boot.png",
"icons/haste.png": "Ui/Skill Icon/Spell/Cut.png",
"icons/heal.png": "Ui/Skill Icon/Spell/Heal.png",
"icons/reach.png": "Ui/Skill Icon/Items & Weapon/Hook.png",
"icons/lance.png": "Ui/Skill Icon/Items & Weapon/Arrow.png",
"icons/wand.png": "Ui/Skill Icon/Spell/MagicWeapon.png",
"icons/multishot.png": "Ui/Skill Icon/Items & Weapon/Shuriken.png",
"icons/vampire.png": "Ui/Skill Icon/Spell/Necromancy.png",
"icons/knockback.png": "Ui/Skill Icon/Job & Action/Punch.png",
}
SOUNDS = {
"sword": "Audio/Sounds/Whoosh & Slash/Slash.wav",
"lance": "Audio/Sounds/Whoosh & Slash/Whoosh.wav",
"wand": "Audio/Sounds/Magic & Skill/Magic1.wav",
"enemy_hit": "Audio/Sounds/Hit & Impact/Hit1.wav",
"enemy_die": "Audio/Sounds/Hit & Impact/Impact3.wav",
"player_hurt": "Audio/Sounds/Hit & Impact/Hit5.wav",
"rock_break": "Audio/Sounds/Hit & Impact/Impact2.wav",
"enemy_shoot": "Audio/Sounds/Whoosh & Slash/Launch.wav",
"boss_slash": "Audio/Sounds/Whoosh & Slash/Slash5.wav",
"boss_stomp": "Audio/Sounds/Hit & Impact/Impact5.wav",
"boss_appear": "Audio/Sounds/Alert/Alert5.wav",
"heal": "Audio/Sounds/Magic & Skill/Heal.wav",
"level_up": "Audio/Jingles/LevelUp1.wav",
"power_up": "Audio/Sounds/Bonus/PowerUp1.wav",
"wave_start": "Audio/Sounds/Alert/Alert.wav",
"wave_clear": "Audio/Jingles/Success1.wav",
"game_over": "Audio/Jingles/GameOver.wav",
"victory": "Audio/Jingles/Success3.wav",
"menu_move": "Audio/Sounds/Menu/Move1.wav",
"menu_accept": "Audio/Sounds/Menu/Accept6.wav",
"menu_back": "Audio/Sounds/Menu/Cancel2.wav",
"switch": "Audio/Sounds/Menu/Menu8.wav",
}
MUSIC = {
"menu": "Audio/Musics/1 - Adventure Begin.ogg",
"battle": "Audio/Musics/17 - Fight.ogg",
"boss": "Audio/Musics/28 - Tension.ogg",
}
def main():
if len(sys.argv) != 2:
sys.exit(__doc__)
pack = Path(sys.argv[1])
if not (pack / "Actor").is_dir():
sys.exit(f"не похоже на папку набора: {pack}")
for dest, src in IMAGES.items():
target = DEST / "images" / dest
target.parent.mkdir(parents=True, exist_ok=True)
shutil.copyfile(pack / src, target)
sounds = DEST / "sounds"
sounds.mkdir(parents=True, exist_ok=True)
for name, src in SOUNDS.items():
subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-i", str(pack / src),
"-c:a", "libvorbis", "-q:a", "4", str(sounds / f"{name}.ogg")], check=True)
music = DEST / "music"
music.mkdir(parents=True, exist_ok=True)
for name, src in MUSIC.items():
shutil.copyfile(pack / src, music / f"{name}.ogg")
(DEST / "fonts").mkdir(parents=True, exist_ok=True)
shutil.copyfile(pack / "Ui/Font/NormalFont.ttf", DEST / "fonts" / "NinjaAdventure.ttf") # латиница, для заголовка
shutil.copyfile(pack / "LICENSE.txt", DEST / "LICENSE-ninja-adventure.txt")
print(f"готово: {len(IMAGES)} картинок, {len(SOUNDS)} звуков, {len(MUSIC)} мелодий")
if __name__ == "__main__":
main()