Mercurial > touhou
diff eosd @ 331:1b4f04b08729
Add the story mode.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sat, 30 Jun 2012 19:37:21 +0200 |
parents | 61adb5453e46 |
children | bdcf2077e368 |
line wrap: on
line diff
--- a/eosd +++ b/eosd @@ -25,38 +25,71 @@ from pytouhou.ui.gamerunner import GameR from pytouhou.games.eosd import EoSDGame from pytouhou.game.player import PlayerState from pytouhou.formats.t6rp import T6RP +from pytouhou.utils.random import Random +from pytouhou.vm.msgrunner import NextStage -def main(path, stage_num, rank, character, replay, data): +def main(path, data, stage_num, rank, character, replay): + resource_loader = Loader(path) + resource_loader.scan_archives(data) + + if stage_num is None: + story = True + stage_num = 1 + else: + story = False + if replay: with open(replay, 'rb') as file: replay = T6RP.read(file) rank = replay.rank character = replay.character - if not replay.levels[stage_num-1]: - raise Exception - from pytouhou.utils.random import Random - prng = Random(replay.levels[stage_num-1].random_seed) - else: - prng = None + + difficulty = 16 + default_power = [0, 64, 128, 128, 128, 128, 0][stage_num - 1] + states = [PlayerState(character=character, power=default_power)] - resource_loader = Loader(path) + runner = GameRunner(resource_loader) + while True: + if replay: + level = replay.levels[stage_num - 1] + if not level: + raise Exception - resource_loader.scan_archives(data) + prng = Random(level.random_seed) - # Load stage data - stage = resource_loader.get_stage('stage%d.std' % stage_num) + #TODO: apply the replay to the other players. + #TODO: see if the stored score is used or if it’s the one from the previous stage. + if stage_num != 1 and stage_num - 2 in replay.levels: + previous_level = replay.levels[stage_num - 1] + states[0].score = previous_level.score + states[0].effective_score = previous_level.score + states[0].power = level.power + states[0].lives = level.lives + states[0].bombs = level.bombs + difficulty = level.difficulty + else: + prng = None - default_power = [0, 64, 128, 128, 128, 128, 0][stage_num - 1] - game = EoSDGame(resource_loader, [PlayerState(character=character, power=default_power)], stage_num, rank, 16, - prng=prng, bgms=stage.bgms) + # Load stage data + stage = resource_loader.get_stage('stage%d.std' % stage_num) - background_anm_wrapper = resource_loader.get_anm_wrapper(('stg%dbg.anm' % stage_num,)) - background = Background(stage, background_anm_wrapper) + game = EoSDGame(resource_loader, states, stage_num, rank, difficulty, prng=prng, bgms=stage.bgms) + + background_anm_wrapper = resource_loader.get_anm_wrapper(('stg%dbg.anm' % stage_num,)) + background = Background(stage, background_anm_wrapper) - # Main loop - runner = GameRunner(resource_loader, game, background, replay=replay) - runner.start() + # Main loop + runner.load_game(game, background, replay) + try: + runner.start() + break + except NextStage: + game.music.pause() + if not story or stage_num == 6: + break + stage_num += 1 + states = [player.state.copy() for player in game.players] # if player.state.lives >= 0] pathsep = os.path.pathsep @@ -71,11 +104,11 @@ parser = argparse.ArgumentParser(descrip parser.add_argument('data', metavar='DAT', default=default_data, nargs='*', help='Game’s data files') parser.add_argument('-p', '--path', metavar='DIRECTORY', default='.', help='Game directory path.') -parser.add_argument('-s', '--stage', metavar='STAGE', type=int, required=True, help='Stage, 1 to 7 (Extra).') +parser.add_argument('-s', '--stage', metavar='STAGE', type=int, default=None, help='Stage, 1 to 7 (Extra).') parser.add_argument('-r', '--rank', metavar='RANK', type=int, default=0, help='Rank, from 0 (Easy, default) to 3 (Lunatic).') parser.add_argument('-c', '--character', metavar='CHARACTER', type=int, default=0, help='Select the character to use, from 0 (ReimuA, default) to 3 (MarisaB).') parser.add_argument('--replay', metavar='REPLAY', help='Select a replay') args = parser.parse_args() -main(args.path, args.stage, args.rank, args.character, args.replay, tuple(args.data)) +main(args.path, tuple(args.data), args.stage, args.rank, args.character, args.replay)