annotate eosd @ 374:6a63fd3deb76

Use an iterator to get the keystates from a replay.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 05 Aug 2012 18:19:42 +0200
parents 6deab6ad8be8
children 8f2f3053906a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
1 #!/usr/bin/env python
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
186
84da28ae7ee4 Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 162
diff changeset
16 import argparse
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
17 import os
338
65453340ae95 Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 337
diff changeset
18 import sys
363
cb1460b9b6cf Enable debug messages when using --debug
Thibaut Girka <thib@sitedethib.com>
parents: 352
diff changeset
19 import logging
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
20
131
fab7ad2f0d8b Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents: 130
diff changeset
21 import pyximport
fab7ad2f0d8b Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents: 130
diff changeset
22 pyximport.install()
fab7ad2f0d8b Use Cython, improve performances!
Thibaut Girka <thib@sitedethib.com>
parents: 130
diff changeset
23
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 94
diff changeset
24 from pytouhou.resource.loader import Loader
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
25 from pytouhou.game.background import Background
205
ee6dfd14a785 Rename pytouhou.opengl to pytouhou.ui, makes much more sense that way.
Thibaut Girka <thib@sitedethib.com>
parents: 196
diff changeset
26 from pytouhou.ui.gamerunner import GameRunner
196
1e501e3b6645 Add a subclass for each character, and implement player attacks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 188
diff changeset
27 from pytouhou.games.eosd import EoSDGame
339
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
28 from pytouhou.game.game import GameOver
130
11ab06f4c4c6 Introduce characters!
Thibaut Girka <thib@sitedethib.com>
parents: 122
diff changeset
29 from pytouhou.game.player import PlayerState
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
30 from pytouhou.formats.t6rp import T6RP, Level
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
31 from pytouhou.utils.random import Random
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
32 from pytouhou.vm.msgrunner import NextStage
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
33
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
34
332
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
35 class EoSDGameBossRush(EoSDGame):
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
36 def run_iter(self, keystate):
337
bc162f60f0a0 Skip dialogs in the boss rush mode, and make boss rush skipping faster
Thibaut Girka <thib@sitedethib.com>
parents: 334
diff changeset
37 for i in range(20):
344
eab591728abf Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 341
diff changeset
38 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
39 or self.bullets or self.cancelled_bullets)
eab591728abf Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 341
diff changeset
40 if skip:
eab591728abf Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 341
diff changeset
41 keystate &= ~1
eab591728abf Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 341
diff changeset
42 EoSDGame.run_iter(self, keystate | 256 if i == 0 else 0)
340
39bc59953dfa Increase player's power stats during skipped frames in boss rush mode.
Thibaut Girka <thib@sitedethib.com>
parents: 339
diff changeset
43 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
44 for player in self.players:
39bc59953dfa Increase player's power stats during skipped frames in boss rush mode.
Thibaut Girka <thib@sitedethib.com>
parents: 339
diff changeset
45 if player.state.power < 128:
39bc59953dfa Increase player's power stats during skipped frames in boss rush mode.
Thibaut Girka <thib@sitedethib.com>
parents: 339
diff changeset
46 player.state.power += 1
344
eab591728abf Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 341
diff changeset
47 if not skip:
332
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
48 break
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
49
344
eab591728abf Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 341
diff changeset
50
332
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
51 def cleanup(self):
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 370
diff changeset
52 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
53 if not (self.boss or self.msg_wait or boss_wait):
332
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
54 self.enemies = [enemy for enemy in self.enemies
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
55 if enemy.boss_callback != -1 or enemy.frame > 1]
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
56 self.lasers = [laser for laser in self.lasers if laser.frame > 1]
352
cca5843c2e95 Clean up effects left behind by lasers in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 344
diff changeset
57 self.effects = [effect for effect in self.effects
cca5843c2e95 Clean up effects left behind by lasers in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 344
diff changeset
58 if not hasattr(effect, '_laser')
cca5843c2e95 Clean up effects left behind by lasers in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 344
diff changeset
59 or effect._laser in self.lasers]
332
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
60 self.bullets = [bullet for bullet in self.bullets if bullet.frame > 1]
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
61 EoSDGame.cleanup(self)
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
62
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
63
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
64
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
65 def main(path, data, stage_num, rank, character, replay, save_filename,
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
66 boss_rush, fps_limit, single_buffer, debug, fixed_pipeline):
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
67
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
68 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
69
65453340ae95 Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 337
diff changeset
70 try:
65453340ae95 Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 337
diff changeset
71 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
72 except IOError:
65453340ae95 Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 337
diff changeset
73 sys.stderr.write('Some data files were not found, did you forget the -p option?\n')
65453340ae95 Print an error when all the needed files aren’t present.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 337
diff changeset
74 exit(1)
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
75
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
76 if stage_num is None:
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
77 story = True
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
78 stage_num = 1
339
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
79 continues = 3
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
80 else:
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
81 story = False
339
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
82 continues = 0
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
83
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
84 if debug:
363
cb1460b9b6cf Enable debug messages when using --debug
Thibaut Girka <thib@sitedethib.com>
parents: 352
diff changeset
85 logging.basicConfig(level=logging.DEBUG)
339
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
86 continues = float('inf')
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
87
187
46793ccfedca Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 186
diff changeset
88 if replay:
46793ccfedca Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 186
diff changeset
89 with open(replay, 'rb') as file:
46793ccfedca Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 186
diff changeset
90 replay = T6RP.read(file)
46793ccfedca Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 186
diff changeset
91 rank = replay.rank
46793ccfedca Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 186
diff changeset
92 character = replay.character
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
93
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
94 save_keystates = None
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
95 if save_filename:
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
96 save_replay = T6RP()
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
97 save_replay.rank = rank
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
98 save_replay.character = character
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
99
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
100 difficulty = 16
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
101 default_power = [0, 64, 128, 128, 128, 128, 0][stage_num - 1]
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
102 states = [PlayerState(character=character, power=default_power)]
187
46793ccfedca Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 186
diff changeset
103
332
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
104 game_class = EoSDGameBossRush if boss_rush else EoSDGame
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
105
370
74471afbac37 Add a programmable pipeline renderer, and a --fixed-pipeline switch to use the old one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 363
diff changeset
106 runner = GameRunner(resource_loader, fps_limit=fps_limit, double_buffer=(not single_buffer), fixed_pipeline=fixed_pipeline)
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
107 while True:
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
108 if replay:
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
109 level = replay.levels[stage_num - 1]
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
110 if not level:
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
111 raise Exception
262
8fa660da5f0c Automatically search data files using different names.
Thibaut Girka <thib@sitedethib.com>
parents: 231
diff changeset
112
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
113 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
114
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
115 #TODO: apply the replay to the other players.
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
116 #TODO: see if the stored score is used or if it’s the one from the previous stage.
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
117 if stage_num != 1 and stage_num - 2 in replay.levels:
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
118 previous_level = replay.levels[stage_num - 1]
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
119 states[0].score = previous_level.score
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
120 states[0].effective_score = previous_level.score
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
121 states[0].point_items = level.point_items
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
122 states[0].power = level.power
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
123 states[0].lives = level.lives
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
124 states[0].bombs = level.bombs
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
125 difficulty = level.difficulty
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
126 else:
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
127 prng = Random()
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
128
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
129 if save_filename:
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
130 if not replay:
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
131 save_replay.levels[stage_num - 1] = level = Level()
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
132 level.score = states[0].score
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
133 level.random_seed = prng.seed
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
134 level.point_items = states[0].points
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
135 level.power = states[0].power
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
136 level.lives = states[0].lives
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
137 level.bombs = states[0].bombs
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
138 level.difficulty = difficulty
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
139 save_keystates = []
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
140
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
141 # Load stage data
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
142 stage = resource_loader.get_stage('stage%d.std' % stage_num)
321
61adb5453e46 Implement music playback.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 300
diff changeset
143
341
61caded6b4f5 Clean music playback API a little.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 340
diff changeset
144 game = game_class(resource_loader, states, stage_num, rank, difficulty, prng=prng, continues=continues)
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
145
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
146 background_anm_wrapper = resource_loader.get_anm_wrapper(('stg%dbg.anm' % stage_num,))
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
147 background = Background(stage, background_anm_wrapper)
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
148
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
149 # Main loop
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
150 runner.load_game(game, background, stage.bgms, replay, save_keystates)
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
151 try:
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
152 runner.start()
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
153 break
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
154 except NextStage:
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
155 game.music.pause()
333
d369a369204a Prevent story mode in easy to go beyond stage 5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 332
diff changeset
156 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
157 break
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
158 stage_num += 1
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
159 states = [player.state.copy() for player in game.players] # if player.state.lives >= 0]
339
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
160 except GameOver:
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
161 print('Game over')
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
162 break
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
163 finally:
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
164 if save_filename:
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
165 last_key = -1
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
166 for time, key in enumerate(save_keystates):
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
167 if key != last_key:
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
168 level.keys.append((time, key, 0))
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
169 last_key = key
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
170
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
171 if save_filename:
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
172 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
173 save_replay.write(file)
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
174
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
175
297
a09ac4650e0d Fix relative path handling and os-specific path separators.
Thibaut Girka <thib@sitedethib.com>
parents: 265
diff changeset
176 pathsep = os.path.pathsep
a09ac4650e0d Fix relative path handling and os-specific path separators.
Thibaut Girka <thib@sitedethib.com>
parents: 265
diff changeset
177 default_data = (pathsep.join(('CM.DAT', 'th06*_CM.DAT', '*CM.DAT', '*cm.dat')),
a09ac4650e0d Fix relative path handling and os-specific path separators.
Thibaut Girka <thib@sitedethib.com>
parents: 265
diff changeset
178 pathsep.join(('ST.DAT', 'th6*ST.DAT', '*ST.DAT', '*st.dat')),
300
da53bc29b94a Add the game interface.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 297
diff changeset
179 pathsep.join(('IN.DAT', 'th6*IN.DAT', '*IN.DAT', '*in.dat')),
321
61adb5453e46 Implement music playback.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 300
diff changeset
180 pathsep.join(('MD.DAT', 'th6*MD.DAT', '*MD.DAT', '*md.dat')),
297
a09ac4650e0d Fix relative path handling and os-specific path separators.
Thibaut Girka <thib@sitedethib.com>
parents: 265
diff changeset
181 pathsep.join(('102h.exe', '102*.exe', '東方紅魔郷.exe', '*.exe')))
262
8fa660da5f0c Automatically search data files using different names.
Thibaut Girka <thib@sitedethib.com>
parents: 231
diff changeset
182
8fa660da5f0c Automatically search data files using different names.
Thibaut Girka <thib@sitedethib.com>
parents: 231
diff changeset
183
186
84da28ae7ee4 Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 162
diff changeset
184 parser = argparse.ArgumentParser(description='Libre reimplementation of the Touhou 6 engine.')
18
ca26a84916cb Add preliminary ECL viewer/interpreter.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
185
262
8fa660da5f0c Automatically search data files using different names.
Thibaut Girka <thib@sitedethib.com>
parents: 231
diff changeset
186 parser.add_argument('data', metavar='DAT', default=default_data, nargs='*', help='Game’s data files')
186
84da28ae7ee4 Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 162
diff changeset
187 parser.add_argument('-p', '--path', metavar='DIRECTORY', default='.', help='Game directory path.')
331
1b4f04b08729 Add the story mode.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 321
diff changeset
188 parser.add_argument('-s', '--stage', metavar='STAGE', type=int, default=None, help='Stage, 1 to 7 (Extra).')
186
84da28ae7ee4 Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 162
diff changeset
189 parser.add_argument('-r', '--rank', metavar='RANK', type=int, default=0, help='Rank, from 0 (Easy, default) to 3 (Lunatic).')
84da28ae7ee4 Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 162
diff changeset
190 parser.add_argument('-c', '--character', metavar='CHARACTER', type=int, default=0, help='Select the character to use, from 0 (ReimuA, default) to 3 (MarisaB).')
187
46793ccfedca Implement replays.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 186
diff changeset
191 parser.add_argument('--replay', metavar='REPLAY', help='Select a replay')
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
192 parser.add_argument('--save-replay', metavar='REPLAY', help='Save the upcoming game into a replay file')
332
bdcf2077e368 Add a boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents: 331
diff changeset
193 parser.add_argument('-b', '--boss-rush', action='store_true', help='Fight only bosses')
334
4eca6130f118 Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents: 333
diff changeset
194 parser.add_argument('--single-buffer', action='store_true', help='Disable double buffering')
4eca6130f118 Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents: 333
diff changeset
195 parser.add_argument('--fps-limit', metavar='FPS', default=60, type=int, help='Set fps limit')
339
7a05edbab88a Implement continues when the lives fall bellow 0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 338
diff changeset
196 parser.add_argument('--debug', action='store_true', help='Set unlimited continues, and perhaps other debug features.')
370
74471afbac37 Add a programmable pipeline renderer, and a --fixed-pipeline switch to use the old one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 363
diff changeset
197 parser.add_argument('--fixed-pipeline', action='store_true', help='Use the fixed pipeline instead of the new programmable one.')
186
84da28ae7ee4 Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 162
diff changeset
198
84da28ae7ee4 Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 162
diff changeset
199 args = parser.parse_args()
84da28ae7ee4 Parse command line with argparse.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 162
diff changeset
200
334
4eca6130f118 Add options to set FPS limit and disable double buffering
Thibaut Girka <thib@sitedethib.com>
parents: 333
diff changeset
201 main(args.path, tuple(args.data), args.stage, args.rank, args.character,
373
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
202 args.replay, args.save_replay, args.boss_rush, args.fps_limit,
6deab6ad8be8 Add the ability to save a replay.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
203 args.single_buffer, args.debug, args.fixed_pipeline)