Mercurial > touhou
annotate eosd @ 373:6deab6ad8be8
Add the ability to save a replay.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 05 Aug 2012 16:37:26 +0200 |
parents | 704bea2e4360 |
children | 8f2f3053906a |
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 | 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 | 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 | 35 class EoSDGameBossRush(EoSDGame): |
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 | 48 break |
49 | |
344
eab591728abf
Minor fix in boss rush mode
Thibaut Girka <thib@sitedethib.com>
parents:
341
diff
changeset
|
50 |
332 | 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 | 54 self.enemies = [enemy for enemy in self.enemies |
55 if enemy.boss_callback != -1 or enemy.frame > 1] | |
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 | 60 self.bullets = [bullet for bullet in self.bullets if bullet.frame > 1] |
61 EoSDGame.cleanup(self) | |
62 | |
63 | |
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 | 104 game_class = EoSDGameBossRush if boss_rush else EoSDGame |
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 | 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) |