Mercurial > touhou
annotate scripts/pytouhou @ 792:11bc22bad1bf default tip
python: Replace the image crate with png
We weren’t using any of its features anyway, so the png crate is exactly what
we need, without the many heavy dependencies of image.
https://github.com/image-rs/image-png/pull/670 will eventually make it even
faster to build.
| author | Link Mauve <linkmauve@linkmauve.fr> |
|---|---|
| date | Sat, 17 Jan 2026 22:22:25 +0100 |
| parents | 1f152ca95658 |
| children |
| rev | line source |
|---|---|
|
590
e15672733c93
Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
589
diff
changeset
|
1 #!/usr/bin/env python3 |
|
52
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
2 # -*- encoding: utf-8 -*- |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
3 ## |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
4 ## Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com> |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
5 ## |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
6 ## This program is free software; you can redistribute it and/or modify |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
7 ## it under the terms of the GNU General Public License as published |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
8 ## by the Free Software Foundation; version 3 only. |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
9 ## |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
10 ## This program is distributed in the hope that it will be useful, |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
11 ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
13 ## GNU General Public License for more details. |
|
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
14 ## |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
15 |
|
565
5f7f859a72f9
Move CLI options to their own module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
561
diff
changeset
|
16 from os.path import pathsep |
|
416
e23871eddb7a
Importing everything makes the --help slow, call parse_args before the imports.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
415
diff
changeset
|
17 default_data = (pathsep.join(('CM.DAT', 'th06*_CM.DAT', '*CM.DAT', '*cm.dat')), |
|
e23871eddb7a
Importing everything makes the --help slow, call parse_args before the imports.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
415
diff
changeset
|
18 pathsep.join(('ST.DAT', 'th6*ST.DAT', '*ST.DAT', '*st.dat')), |
|
e23871eddb7a
Importing everything makes the --help slow, call parse_args before the imports.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
415
diff
changeset
|
19 pathsep.join(('IN.DAT', 'th6*IN.DAT', '*IN.DAT', '*in.dat')), |
|
e23871eddb7a
Importing everything makes the --help slow, call parse_args before the imports.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
415
diff
changeset
|
20 pathsep.join(('MD.DAT', 'th6*MD.DAT', '*MD.DAT', '*md.dat')), |
|
e23871eddb7a
Importing everything makes the --help slow, call parse_args before the imports.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
415
diff
changeset
|
21 pathsep.join(('102h.exe', '102*.exe', '東方紅魔郷.exe', '*.exe'))) |
|
e23871eddb7a
Importing everything makes the --help slow, call parse_args before the imports.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
415
diff
changeset
|
22 |
|
567
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
23 defaults = {'data': default_data, |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
24 'path': '.', |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
25 'rank': 0, |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
26 'character': 0, |
|
597
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
27 'game': 'eosd', |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
28 'interface': 'eosd', |
|
567
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
29 'port': 0, |
|
636
4fa0a8e7d941
Add a GLFW implementation of gui.Window.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
614
diff
changeset
|
30 'frontend': 'glfw', |
|
567
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
31 'backend': ['opengl', 'sdl'], |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
32 'gl-flavor': 'compatibility', |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
33 'gl-version': 2.1, |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
34 'double-buffer': None, |
|
589
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
577
diff
changeset
|
35 'fps-limit': -1, |
|
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
577
diff
changeset
|
36 'frameskip': 1} |
|
534
346cbf266856
Move options to logical groups, to make the help a bit less dry; and disable friendly-fire by default.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
531
diff
changeset
|
37 |
|
567
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
38 from pytouhou.options import parse_config, parse_arguments |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
39 options = parse_config('pytouhou', defaults) |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
40 args = parse_arguments(options) |
|
416
e23871eddb7a
Importing everything makes the --help slow, call parse_args before the imports.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
415
diff
changeset
|
41 |
|
567
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
42 verbosity = args.verbosity or options.get('verbosity') or 'WARNING' |
|
561
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
43 |
|
566
04ae31809dc7
Move all logging logic to the root logger, we don’t need specific handlers anymore.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
565
diff
changeset
|
44 import logging |
|
04ae31809dc7
Move all logging logic to the root logger, we don’t need specific handlers anymore.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
565
diff
changeset
|
45 logging.basicConfig(level=getattr(logging, verbosity), |
|
04ae31809dc7
Move all logging logic to the root logger, we don’t need specific handlers anymore.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
565
diff
changeset
|
46 format='[%(name)s] [%(levelname)s]: %(message)s') |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
47 |
|
566
04ae31809dc7
Move all logging logic to the root logger, we don’t need specific handlers anymore.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
565
diff
changeset
|
48 logger = logging |
|
04ae31809dc7
Move all logging logic to the root logger, we don’t need specific handlers anymore.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
565
diff
changeset
|
49 logger.root.name = 'pytouhou' |
|
543
fb837b32c3dd
Automatically fallback on the SDL renderer if the OpenGL one can’t be imported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
534
diff
changeset
|
50 |
|
567
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
51 logger.info('Configuration loaded from: %s', ', '.join(options.paths)) |
|
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
52 |
|
597
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
53 import sys |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
54 from importlib import import_module |
|
547
e35bef07290d
Always import runners from pytouhou.vm, to allow their replacement.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
546
diff
changeset
|
55 |
|
597
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
56 def load_module(type_, name, items=None): |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
57 try: |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
58 module = import_module('pytouhou.games.%s.%s' % (name, type_)) |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
59 except ImportError: |
|
603
e9300aae4b24
Display the traceback on module load error.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
597
diff
changeset
|
60 logger.exception('Module “%s” doesn’t contain %s data, aborting:', name, type_) |
|
597
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
61 sys.exit(1) |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
62 if items is None: |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
63 return module |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
64 return (getattr(module, item) for item in items) |
|
548
1e9ea6519f3c
Make EoSDInterface separate from EoSD game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
547
diff
changeset
|
65 |
|
597
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
66 Game, Common = load_module('game', args.game, ['Game', 'Common']) |
|
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
67 Interface = load_module('interface', args.interface).Interface |
|
512
b39ad30c6620
Add a pure SDL backend.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
68 |
|
531
a7dc55ad9380
Display important messages in popups, instead of the terminal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
530
diff
changeset
|
69 from pytouhou.lib.sdl import SDL, show_simple_message_box |
|
422
52829ebe2561
Refactor window management in its own class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
421
diff
changeset
|
70 from pytouhou.ui.window import Window |
| 97 | 71 from pytouhou.resource.loader import Loader |
|
205
ee6dfd14a785
Rename pytouhou.opengl to pytouhou.ui, makes much more sense that way.
Thibaut Girka <thib@sitedethib.com>
parents:
196
diff
changeset
|
72 from pytouhou.ui.gamerunner import GameRunner |
|
577
e35a083d4208
Move NextStage outside of pytouhou.vm.msg, to be able to use it from anywhere without dependency on EoSD.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
570
diff
changeset
|
73 from pytouhou.game import NextStage, GameOver |
|
373
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
74 from pytouhou.formats.t6rp import T6RP, Level |
|
784
1f152ca95658
Replace pytouhou.utils.random.Random with a Rust version
Link Mauve <linkmauve@linkmauve.fr>
parents:
783
diff
changeset
|
75 from libtouhou import Prng as Random |
|
404
6c0cb3eee33e
Add MoF’s hints support, and fix the Text timeout interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
378
diff
changeset
|
76 from pytouhou.formats.hint import Hint |
| 486 | 77 from pytouhou.network import Network |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
78 |
|
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
79 |
|
561
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
80 for backend_name in args.backend: |
|
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
81 if backend_name == 'opengl': |
|
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
82 options = { |
|
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
83 'flavor': args.gl_flavor, |
|
554
653a9f087673
Make both double- and single-buffer available on the CLI, but default to SDL’s default.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
553
diff
changeset
|
84 'version': args.gl_version, |
|
653a9f087673
Make both double- and single-buffer available on the CLI, but default to SDL’s default.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
553
diff
changeset
|
85 'double-buffer': args.double_buffer, |
|
636
4fa0a8e7d941
Add a GLFW implementation of gui.Window.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
614
diff
changeset
|
86 'frontend': args.frontend, |
|
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
87 } |
|
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
88 else: |
|
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
89 options = {} |
|
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
90 |
|
547
e35bef07290d
Always import runners from pytouhou.vm, to allow their replacement.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
546
diff
changeset
|
91 try: |
|
561
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
92 backend = import_module('pytouhou.ui.%s.backend' % backend_name) |
|
603
e9300aae4b24
Display the traceback on module load error.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
597
diff
changeset
|
93 except ImportError: |
|
567
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
94 logger.exception('Failed to import backend %s:', backend_name) |
|
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
95 continue |
|
547
e35bef07290d
Always import runners from pytouhou.vm, to allow their replacement.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
546
diff
changeset
|
96 |
|
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
97 try: |
|
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
98 backend.init(options) |
|
603
e9300aae4b24
Display the traceback on module load error.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
597
diff
changeset
|
99 except Exception: |
|
567
b2269b9c6119
Add a configuration parser, and pass those options to argparse as defaults. Also include an xdg helper.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
566
diff
changeset
|
100 logger.exception('Backend %s failed to initialize:', backend_name) |
|
561
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
101 continue |
|
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
102 |
|
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
103 GameRenderer = backend.GameRenderer |
|
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
104 break |
|
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
105 else: |
|
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
106 show_simple_message_box(u'No graphical backend could be used, continuing with a windowless game.') |
|
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
107 backend = None |
|
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
108 GameRenderer = None |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
109 |
|
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
110 |
|
454
a502887557ac
Add an option to choose which game to play; currently only EoSD is supported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
452
diff
changeset
|
111 class GameBossRush(Game): |
| 499 | 112 def run_iter(self, keystates): |
|
337
bc162f60f0a0
Skip dialogs in the boss rush mode, and make boss rush skipping faster
Thibaut Girka <thib@sitedethib.com>
parents:
334
diff
changeset
|
113 for i in range(20): |
|
344
eab591728abf
Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents:
341
diff
changeset
|
114 skip = not (self.enemies or self.items or self.lasers |
|
eab591728abf
Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents:
341
diff
changeset
|
115 or self.bullets or self.cancelled_bullets) |
|
eab591728abf
Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents:
341
diff
changeset
|
116 if skip: |
| 499 | 117 keystates = [k & ~1 for k in keystates] |
| 118 Game.run_iter(self, [0 if i else k | 256 for k in keystates]) | |
|
340
39bc59953dfa
Increase player's power stats during skipped frames in boss rush mode.
Thibaut Girka <thib@sitedethib.com>
parents:
339
diff
changeset
|
119 if not self.enemies and self.frame % 90 == 0: |
|
39bc59953dfa
Increase player's power stats during skipped frames in boss rush mode.
Thibaut Girka <thib@sitedethib.com>
parents:
339
diff
changeset
|
120 for player in self.players: |
|
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
121 if player.power < 128: |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
122 player.power += 1 |
|
344
eab591728abf
Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents:
341
diff
changeset
|
123 if not skip: |
| 332 | 124 break |
| 125 | |
| 126 def cleanup(self): | |
|
372
704bea2e4360
Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
370
diff
changeset
|
127 boss_wait = any(ecl_runner.boss_wait for ecl_runner in self.ecl_runners) |
|
704bea2e4360
Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
370
diff
changeset
|
128 if not (self.boss or self.msg_wait or boss_wait): |
| 332 | 129 self.enemies = [enemy for enemy in self.enemies |
| 499 | 130 if enemy.boss_callback or enemy.frame > 1] |
|
500
777544d11578
[Boss rush] Mark removed lasers as such
Thibaut Girka <thib@sitedethib.com>
parents:
499
diff
changeset
|
131 for laser in self.lasers: |
|
777544d11578
[Boss rush] Mark removed lasers as such
Thibaut Girka <thib@sitedethib.com>
parents:
499
diff
changeset
|
132 if laser.frame <= 1: |
|
777544d11578
[Boss rush] Mark removed lasers as such
Thibaut Girka <thib@sitedethib.com>
parents:
499
diff
changeset
|
133 laser.removed = True |
| 332 | 134 self.lasers = [laser for laser in self.lasers if laser.frame > 1] |
| 135 self.bullets = [bullet for bullet in self.bullets if bullet.frame > 1] | |
|
454
a502887557ac
Add an option to choose which game to play; currently only EoSD is supported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
452
diff
changeset
|
136 Game.cleanup(self) |
| 332 | 137 |
| 138 | |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
139 def main(window, path, data, stage_num, rank, character, replay, save_filename, |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
140 skip_replay, boss_rush, debug, enable_background, enable_particles, |
|
561
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
141 hints, port, remote, friendly_fire): |
|
373
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
142 |
|
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
143 resource_loader = Loader(path) |
|
338
65453340ae95
Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
337
diff
changeset
|
144 |
|
65453340ae95
Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
337
diff
changeset
|
145 try: |
|
65453340ae95
Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
337
diff
changeset
|
146 resource_loader.scan_archives(data) |
|
65453340ae95
Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
337
diff
changeset
|
147 except IOError: |
|
531
a7dc55ad9380
Display important messages in popups, instead of the terminal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
530
diff
changeset
|
148 show_simple_message_box(u'Some data files were not found, did you forget the -p option?') |
|
a7dc55ad9380
Display important messages in popups, instead of the terminal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
530
diff
changeset
|
149 sys.exit(1) |
|
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
150 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
151 if stage_num is None: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
152 story = True |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
153 stage_num = 1 |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
154 continues = 3 |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
155 else: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
156 story = False |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
157 continues = 0 |
|
339
7a05edbab88a
Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
338
diff
changeset
|
158 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
159 if debug: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
160 continues = -1 # Infinite lives |
|
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
161 |
|
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
162 if replay: |
|
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
163 with open(replay, 'rb') as file: |
|
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
164 replay = T6RP.read(file) |
|
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
165 rank = replay.rank |
|
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
166 character = replay.character |
|
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
167 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
168 save_keystates = None |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
169 if save_filename: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
170 save_replay = T6RP() |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
171 save_replay.rank = rank |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
172 save_replay.character = character |
|
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
173 |
|
487
711c75115675
Various netplay-related fixes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
486
diff
changeset
|
174 difficulty = 16 |
|
711c75115675
Various netplay-related fixes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
486
diff
changeset
|
175 |
|
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
176 if port != 0: |
|
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
177 if remote: |
|
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
178 remote_addr, remote_port = remote.split(':') |
|
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
179 addr = remote_addr, int(remote_port) |
|
479
1de67f332f00
Fix several synchro issues
Thibaut Girka <thib@sitedethib.com>
parents:
476
diff
changeset
|
180 selected_player = 0 |
|
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
181 else: |
|
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
182 addr = None |
|
479
1de67f332f00
Fix several synchro issues
Thibaut Girka <thib@sitedethib.com>
parents:
476
diff
changeset
|
183 selected_player = 1 |
|
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
184 |
| 476 | 185 prng = Random(0) |
|
479
1de67f332f00
Fix several synchro issues
Thibaut Girka <thib@sitedethib.com>
parents:
476
diff
changeset
|
186 con = Network(port, addr, selected_player) |
|
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
187 characters = [1, 3] |
|
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
188 else: |
|
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
189 con = None |
|
487
711c75115675
Various netplay-related fixes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
486
diff
changeset
|
190 selected_player = 0 |
|
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
191 characters = [character] |
|
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
192 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
193 if hints: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
194 with open(hints, 'rb') as file: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
195 hints = Hint.read(file) |
|
404
6c0cb3eee33e
Add MoF’s hints support, and fix the Text timeout interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
378
diff
changeset
|
196 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
197 game_class = GameBossRush if boss_rush else Game |
| 332 | 198 |
|
614
2cf518129725
Delay power assignment to players until the game is started.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
603
diff
changeset
|
199 common = Common(resource_loader, characters, continues) |
|
548
1e9ea6519f3c
Make EoSDInterface separate from EoSD game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
547
diff
changeset
|
200 interface = Interface(resource_loader, common.players[0]) #XXX |
|
1e9ea6519f3c
Make EoSDInterface separate from EoSD game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
547
diff
changeset
|
201 common.interface = interface #XXX |
|
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
202 renderer = GameRenderer(resource_loader, window) if GameRenderer is not None else None |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
773
diff
changeset
|
203 runner = GameRunner(window, renderer, common, resource_loader, skip_replay, con, args.no_sound) |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
500
diff
changeset
|
204 window.set_runner(runner) |
|
508
1bc014f9d572
Make GameRunner entirely independent of Window or GameRenderer, so we can run a game without display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
503
diff
changeset
|
205 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
206 while True: |
|
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
207 first_player = common.players[0] |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
208 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
209 if replay: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
210 level = replay.levels[stage_num - 1] |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
211 if not level: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
212 raise Exception |
|
262
8fa660da5f0c
Automatically search data files using different names.
Thibaut Girka <thib@sitedethib.com>
parents:
231
diff
changeset
|
213 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
214 prng = Random(level.random_seed) |
|
83
fc0294c745b6
Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents:
72
diff
changeset
|
215 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
216 #TODO: apply the replay to the other players. |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
217 #TODO: see if the stored score is used or if it’s the one from the previous stage. |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
218 if stage_num != 1 and stage_num - 2 in replay.levels: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
219 previous_level = replay.levels[stage_num - 1] |
|
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
220 first_player.score = previous_level.score |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
221 first_player.effective_score = previous_level.score |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
222 first_player.points = level.point_items |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
223 first_player.power = level.power |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
224 first_player.lives = level.lives |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
225 first_player.bombs = level.bombs |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
226 difficulty = level.difficulty |
| 486 | 227 elif port == 0: |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
228 prng = Random() |
|
83
fc0294c745b6
Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents:
72
diff
changeset
|
229 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
230 if save_filename: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
231 if not replay: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
232 save_replay.levels[stage_num - 1] = level = Level() |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
233 level.random_seed = prng.seed |
|
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
234 level.score = first_player.score |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
235 level.point_items = first_player.points |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
236 level.power = first_player.power |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
237 level.lives = first_player.lives |
|
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
238 level.bombs = first_player.bombs |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
239 level.difficulty = difficulty |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
240 save_keystates = [] |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
241 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
242 hints_stage = hints.stages[stage_num - 1] if hints else None |
|
404
6c0cb3eee33e
Add MoF’s hints support, and fix the Text timeout interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
378
diff
changeset
|
243 |
|
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
244 game = game_class(resource_loader, stage_num, rank, difficulty, |
|
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
500
diff
changeset
|
245 common, prng, hints_stage, friendly_fire) |
|
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
246 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
247 if not enable_particles: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
248 def new_particle(pos, anim, amp, number=1, reverse=False, duration=24): |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
249 pass |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
250 game.new_particle = new_particle |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
251 |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
252 background = game.background if enable_background else None |
|
530
64d9117b9209
Replace the --no-music option with --no-sound, disabling sound rendering altogether.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
513
diff
changeset
|
253 runner.load_game(game, background, game.std.bgms, replay, save_keystates) |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
254 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
255 try: |
|
530
64d9117b9209
Replace the --no-music option with --no-sound, disabling sound rendering altogether.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
513
diff
changeset
|
256 # Main loop |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
257 window.run() |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
258 break |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
259 except NextStage: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
260 if not story or stage_num == (7 if boss_rush else 6 if rank > 0 else 5): |
|
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
261 break |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
262 stage_num += 1 |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
263 except GameOver: |
|
531
a7dc55ad9380
Display important messages in popups, instead of the terminal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
530
diff
changeset
|
264 show_simple_message_box(u'Game over!') |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
265 break |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
266 finally: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
267 if save_filename: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
268 last_key = -1 |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
269 for time, key in enumerate(save_keystates): |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
270 if key != last_key: |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
271 level.keys.append((time, key, 0)) |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
272 last_key = key |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
273 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
274 window.set_runner(None) |
|
373
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
275 |
|
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
276 if save_filename: |
|
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
277 with open(save_filename, 'wb+') as file: |
|
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
278 save_replay.write(file) |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
279 |
|
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
280 |
|
754
a6875f90c141
Python: Only init SDL2 video if using SDL2 frontend.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
636
diff
changeset
|
281 is_sdl = (args.frontend == 'sdl') |
|
783
ec1e06402a97
Replace SDL2_mixer with the kira crate
Link Mauve <linkmauve@linkmauve.fr>
parents:
773
diff
changeset
|
282 with SDL(video=is_sdl): |
|
596
ab131d04987d
Fix a regression introduced in the previous commit when the interface has a different resolution than 640×480 and framebuffer_blit is enabled.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
590
diff
changeset
|
283 window = Window(backend, Interface.width, Interface.height, |
|
ab131d04987d
Fix a regression introduced in the previous commit when the interface has a different resolution than 640×480 and framebuffer_blit is enabled.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
590
diff
changeset
|
284 fps_limit=args.fps_limit, frameskip=args.frameskip) |
|
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
285 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
286 main(window, args.path, tuple(args.data), args.stage, args.rank, |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
287 args.character, args.replay, args.save_replay, args.skip_replay, |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
288 args.boss_rush, args.debug, args.no_background, args.no_particles, |
|
561
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
289 args.hints, args.port, args.remote, args.friendly_fire) |
|
186
84da28ae7ee4
Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
162
diff
changeset
|
290 |
|
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
291 import gc |
|
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
292 gc.collect() |
