Mercurial > touhou
annotate scripts/pytouhou @ 694:3ff1af76e413
anm0: only use recoverable errors, no panics except for anm0 asserts.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Fri, 23 Aug 2019 02:24:08 +0200 |
parents | 4fa0a8e7d941 |
children | a6875f90c141 |
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 |
568
e7a4731a278b
Add a GTK+ main menu, mimicking the original EoSD one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
567
diff
changeset
|
53 if not args.no_menu: |
570
f0252cf111d8
Don’t traceback when GTK+ isn’t available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
568
diff
changeset
|
54 try: |
f0252cf111d8
Don’t traceback when GTK+ isn’t available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
568
diff
changeset
|
55 from pytouhou.menu import menu |
f0252cf111d8
Don’t traceback when GTK+ isn’t available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
568
diff
changeset
|
56 except ImportError: |
f0252cf111d8
Don’t traceback when GTK+ isn’t available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
568
diff
changeset
|
57 logger.error('GTK+ unavailable, disabling the GUI menu.') |
f0252cf111d8
Don’t traceback when GTK+ isn’t available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
568
diff
changeset
|
58 else: |
f0252cf111d8
Don’t traceback when GTK+ isn’t available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
568
diff
changeset
|
59 menu(options, args) |
568
e7a4731a278b
Add a GTK+ main menu, mimicking the original EoSD one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
567
diff
changeset
|
60 |
597
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
61 import sys |
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
62 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
|
63 |
597
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
64 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
|
65 try: |
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
66 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
|
67 except ImportError: |
603
e9300aae4b24
Display the traceback on module load error.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
597
diff
changeset
|
68 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
|
69 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
|
70 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
|
71 return module |
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
72 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
|
73 |
597
244c99c568c8
Don’t hardcode the available games and interfaces, and relocation them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
596
diff
changeset
|
74 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
|
75 Interface = load_module('interface', args.interface).Interface |
512
b39ad30c6620
Add a pure SDL backend.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
508
diff
changeset
|
76 |
531
a7dc55ad9380
Display important messages in popups, instead of the terminal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
530
diff
changeset
|
77 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
|
78 from pytouhou.ui.window import Window |
97 | 79 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
|
80 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
|
81 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
|
82 from pytouhou.formats.t6rp import T6RP, Level |
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
83 from pytouhou.utils.random import Random |
404
6c0cb3eee33e
Add MoF’s hints support, and fix the Text timeout interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
378
diff
changeset
|
84 from pytouhou.formats.hint import Hint |
486 | 85 from pytouhou.network import Network |
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
86 |
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
87 |
561
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
88 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
|
89 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
|
90 options = { |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
91 '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
|
92 '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
|
93 'double-buffer': args.double_buffer, |
636
4fa0a8e7d941
Add a GLFW implementation of gui.Window.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
614
diff
changeset
|
94 '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
|
95 } |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
96 else: |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
97 options = {} |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
98 |
547
e35bef07290d
Always import runners from pytouhou.vm, to allow their replacement.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
546
diff
changeset
|
99 try: |
561
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
100 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
|
101 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
|
102 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
|
103 continue |
547
e35bef07290d
Always import runners from pytouhou.vm, to allow their replacement.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
546
diff
changeset
|
104 |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
105 try: |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
106 backend.init(options) |
603
e9300aae4b24
Display the traceback on module load error.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
597
diff
changeset
|
107 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
|
108 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
|
109 continue |
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
110 |
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
111 GameRenderer = backend.GameRenderer |
bafe6361c0af
Use logging for errors in the pytouhou script.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
554
diff
changeset
|
112 break |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
113 else: |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
114 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
|
115 backend = None |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
549
diff
changeset
|
116 GameRenderer = None |
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
117 |
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
118 |
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
|
119 class GameBossRush(Game): |
499 | 120 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
|
121 for i in range(20): |
344
eab591728abf
Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents:
341
diff
changeset
|
122 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
|
123 or self.bullets or self.cancelled_bullets) |
eab591728abf
Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents:
341
diff
changeset
|
124 if skip: |
499 | 125 keystates = [k & ~1 for k in keystates] |
126 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
|
127 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
|
128 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
|
129 if player.power < 128: |
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
130 player.power += 1 |
344
eab591728abf
Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents:
341
diff
changeset
|
131 if not skip: |
332 | 132 break |
133 | |
134 def cleanup(self): | |
372
704bea2e4360
Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
370
diff
changeset
|
135 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
|
136 if not (self.boss or self.msg_wait or boss_wait): |
332 | 137 self.enemies = [enemy for enemy in self.enemies |
499 | 138 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
|
139 for laser in self.lasers: |
777544d11578
[Boss rush] Mark removed lasers as such
Thibaut Girka <thib@sitedethib.com>
parents:
499
diff
changeset
|
140 if laser.frame <= 1: |
777544d11578
[Boss rush] Mark removed lasers as such
Thibaut Girka <thib@sitedethib.com>
parents:
499
diff
changeset
|
141 laser.removed = True |
332 | 142 self.lasers = [laser for laser in self.lasers if laser.frame > 1] |
143 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
|
144 Game.cleanup(self) |
332 | 145 |
146 | |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
147 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
|
148 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
|
149 hints, port, remote, friendly_fire): |
373
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
150 |
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
151 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
|
152 |
65453340ae95
Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
337
diff
changeset
|
153 try: |
65453340ae95
Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
337
diff
changeset
|
154 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
|
155 except IOError: |
531
a7dc55ad9380
Display important messages in popups, instead of the terminal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
530
diff
changeset
|
156 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
|
157 sys.exit(1) |
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
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 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
|
160 story = True |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
161 stage_num = 1 |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
162 continues = 3 |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
163 else: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
164 story = False |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
165 continues = 0 |
339
7a05edbab88a
Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
338
diff
changeset
|
166 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
167 if debug: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
168 continues = -1 # Infinite lives |
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
169 |
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
170 if replay: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
171 with open(replay, 'rb') as file: |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
172 replay = T6RP.read(file) |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
173 rank = replay.rank |
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
174 character = replay.character |
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
diff
changeset
|
175 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
176 save_keystates = None |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
177 if save_filename: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
178 save_replay = T6RP() |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
179 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
|
180 save_replay.character = character |
187
46793ccfedca
Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
186
diff
changeset
|
181 |
487
711c75115675
Various netplay-related fixes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
486
diff
changeset
|
182 difficulty = 16 |
711c75115675
Various netplay-related fixes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
486
diff
changeset
|
183 |
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
184 if port != 0: |
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
185 if remote: |
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
186 remote_addr, remote_port = remote.split(':') |
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
187 addr = remote_addr, int(remote_port) |
479
1de67f332f00
Fix several synchro issues
Thibaut Girka <thib@sitedethib.com>
parents:
476
diff
changeset
|
188 selected_player = 0 |
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
189 else: |
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
190 addr = None |
479
1de67f332f00
Fix several synchro issues
Thibaut Girka <thib@sitedethib.com>
parents:
476
diff
changeset
|
191 selected_player = 1 |
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
192 |
476 | 193 prng = Random(0) |
479
1de67f332f00
Fix several synchro issues
Thibaut Girka <thib@sitedethib.com>
parents:
476
diff
changeset
|
194 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
|
195 characters = [1, 3] |
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
196 else: |
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
197 con = None |
487
711c75115675
Various netplay-related fixes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
486
diff
changeset
|
198 selected_player = 0 |
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
199 characters = [character] |
475
9d4d52793eca
Experimental netplay! Yay!
Thibaut Girka <thib@sitedethib.com>
parents:
224
diff
changeset
|
200 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
201 if hints: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
202 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
|
203 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
|
204 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
205 game_class = GameBossRush if boss_rush else Game |
332 | 206 |
614
2cf518129725
Delay power assignment to players until the game is started.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
603
diff
changeset
|
207 common = Common(resource_loader, characters, continues) |
548
1e9ea6519f3c
Make EoSDInterface separate from EoSD game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
547
diff
changeset
|
208 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
|
209 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
|
210 renderer = GameRenderer(resource_loader, window) if GameRenderer is not None else None |
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
|
211 runner = GameRunner(window, renderer, common, resource_loader, skip_replay, con) |
503
c622eaf64428
Optimize GameRunner some more, fix replay, and remove Window dependency in Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
500
diff
changeset
|
212 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
|
213 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
214 while True: |
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
215 first_player = common.players[0] |
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
216 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
217 if replay: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
218 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
|
219 if not level: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
220 raise Exception |
262
8fa660da5f0c
Automatically search data files using different names.
Thibaut Girka <thib@sitedethib.com>
parents:
231
diff
changeset
|
221 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
222 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
|
223 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
224 #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
|
225 #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
|
226 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
|
227 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
|
228 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
|
229 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
|
230 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
|
231 first_player.power = level.power |
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
232 first_player.lives = level.lives |
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
233 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
|
234 difficulty = level.difficulty |
486 | 235 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
|
236 prng = Random() |
83
fc0294c745b6
Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents:
72
diff
changeset
|
237 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
238 if save_filename: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
239 if not replay: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
240 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
|
241 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
|
242 level.score = first_player.score |
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
243 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
|
244 level.power = first_player.power |
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
245 level.lives = first_player.lives |
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
246 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
|
247 level.difficulty = difficulty |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
248 save_keystates = [] |
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
249 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
250 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
|
251 |
494
6be9c99a3a24
Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
492
diff
changeset
|
252 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
|
253 common, prng, hints_stage, friendly_fire) |
331
1b4f04b08729
Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
321
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 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
|
256 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
|
257 pass |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
258 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
|
259 |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
260 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
|
261 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
|
262 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
263 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
|
264 # Main loop |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
265 window.run() |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
266 break |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
267 except NextStage: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
268 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
|
269 break |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
270 stage_num += 1 |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
271 except GameOver: |
531
a7dc55ad9380
Display important messages in popups, instead of the terminal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
530
diff
changeset
|
272 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
|
273 break |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
274 finally: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
275 if save_filename: |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
276 last_key = -1 |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
277 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
|
278 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
|
279 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
|
280 last_key = key |
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
281 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
282 window.set_runner(None) |
373
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
283 |
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
284 if save_filename: |
6deab6ad8be8
Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
372
diff
changeset
|
285 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
|
286 save_replay.write(file) |
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
287 |
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
288 |
530
64d9117b9209
Replace the --no-music option with --no-sound, disabling sound rendering altogether.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
513
diff
changeset
|
289 with SDL(sound=args.no_sound): |
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
|
290 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
|
291 fps_limit=args.fps_limit, frameskip=args.frameskip) |
18
ca26a84916cb
Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
292 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
293 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
|
294 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
|
295 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
|
296 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
|
297 |
469
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
298 import gc |
58b47e788c59
Move SDL context-manager and Window creation outside of main.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
465
diff
changeset
|
299 gc.collect() |