Mercurial > touhou
comparison eosd @ 332:bdcf2077e368
Add a boss rush mode
| author | Thibaut Girka <thib@sitedethib.com> |
|---|---|
| date | Sat, 30 Jun 2012 20:10:45 +0200 |
| parents | 1b4f04b08729 |
| children | d369a369204a |
comparison
equal
deleted
inserted
replaced
| 331:1b4f04b08729 | 332:bdcf2077e368 |
|---|---|
| 27 from pytouhou.formats.t6rp import T6RP | 27 from pytouhou.formats.t6rp import T6RP |
| 28 from pytouhou.utils.random import Random | 28 from pytouhou.utils.random import Random |
| 29 from pytouhou.vm.msgrunner import NextStage | 29 from pytouhou.vm.msgrunner import NextStage |
| 30 | 30 |
| 31 | 31 |
| 32 def main(path, data, stage_num, rank, character, replay): | 32 class EoSDGameBossRush(EoSDGame): |
| 33 def run_iter(self, keystate): | |
| 34 for i in range(16): | |
| 35 EoSDGame.run_iter(self, keystate if i == 0 else 0) | |
| 36 if (self.msg_wait or self.enemies or self.items | |
| 37 or self.lasers or self.bullets or self.cancelled_bullets): | |
| 38 break | |
| 39 | |
| 40 def cleanup(self): | |
| 41 if not (self.boss or self.msg_wait or self.ecl_runner.boss_wait): | |
| 42 self.enemies = [enemy for enemy in self.enemies | |
| 43 if enemy.boss_callback != -1 or enemy.frame > 1] | |
| 44 self.lasers = [laser for laser in self.lasers if laser.frame > 1] | |
| 45 self.bullets = [bullet for bullet in self.bullets if bullet.frame > 1] | |
| 46 self.players_lasers = [(laser if laser and laser.frame > 1 else None) for laser in self.players_lasers] | |
| 47 self.players_bullets = [bullet for bullet in self.players_bullets if bullet.frame > 1] | |
| 48 EoSDGame.cleanup(self) | |
| 49 | |
| 50 | |
| 51 | |
| 52 def main(path, data, stage_num, rank, character, replay, boss_rush): | |
| 33 resource_loader = Loader(path) | 53 resource_loader = Loader(path) |
| 34 resource_loader.scan_archives(data) | 54 resource_loader.scan_archives(data) |
| 35 | 55 |
| 36 if stage_num is None: | 56 if stage_num is None: |
| 37 story = True | 57 story = True |
| 46 character = replay.character | 66 character = replay.character |
| 47 | 67 |
| 48 difficulty = 16 | 68 difficulty = 16 |
| 49 default_power = [0, 64, 128, 128, 128, 128, 0][stage_num - 1] | 69 default_power = [0, 64, 128, 128, 128, 128, 0][stage_num - 1] |
| 50 states = [PlayerState(character=character, power=default_power)] | 70 states = [PlayerState(character=character, power=default_power)] |
| 71 | |
| 72 game_class = EoSDGameBossRush if boss_rush else EoSDGame | |
| 51 | 73 |
| 52 runner = GameRunner(resource_loader) | 74 runner = GameRunner(resource_loader) |
| 53 while True: | 75 while True: |
| 54 if replay: | 76 if replay: |
| 55 level = replay.levels[stage_num - 1] | 77 level = replay.levels[stage_num - 1] |
| 72 prng = None | 94 prng = None |
| 73 | 95 |
| 74 # Load stage data | 96 # Load stage data |
| 75 stage = resource_loader.get_stage('stage%d.std' % stage_num) | 97 stage = resource_loader.get_stage('stage%d.std' % stage_num) |
| 76 | 98 |
| 77 game = EoSDGame(resource_loader, states, stage_num, rank, difficulty, prng=prng, bgms=stage.bgms) | 99 game = game_class(resource_loader, states, stage_num, rank, difficulty, prng=prng, bgms=stage.bgms) |
| 78 | 100 |
| 79 background_anm_wrapper = resource_loader.get_anm_wrapper(('stg%dbg.anm' % stage_num,)) | 101 background_anm_wrapper = resource_loader.get_anm_wrapper(('stg%dbg.anm' % stage_num,)) |
| 80 background = Background(stage, background_anm_wrapper) | 102 background = Background(stage, background_anm_wrapper) |
| 81 | 103 |
| 82 # Main loop | 104 # Main loop |
| 84 try: | 106 try: |
| 85 runner.start() | 107 runner.start() |
| 86 break | 108 break |
| 87 except NextStage: | 109 except NextStage: |
| 88 game.music.pause() | 110 game.music.pause() |
| 89 if not story or stage_num == 6: | 111 if not story or stage_num == (7 if boss_rush else 6): |
| 90 break | 112 break |
| 91 stage_num += 1 | 113 stage_num += 1 |
| 92 states = [player.state.copy() for player in game.players] # if player.state.lives >= 0] | 114 states = [player.state.copy() for player in game.players] # if player.state.lives >= 0] |
| 93 | 115 |
| 94 | 116 |
| 106 parser.add_argument('-p', '--path', metavar='DIRECTORY', default='.', help='Game directory path.') | 128 parser.add_argument('-p', '--path', metavar='DIRECTORY', default='.', help='Game directory path.') |
| 107 parser.add_argument('-s', '--stage', metavar='STAGE', type=int, default=None, help='Stage, 1 to 7 (Extra).') | 129 parser.add_argument('-s', '--stage', metavar='STAGE', type=int, default=None, help='Stage, 1 to 7 (Extra).') |
| 108 parser.add_argument('-r', '--rank', metavar='RANK', type=int, default=0, help='Rank, from 0 (Easy, default) to 3 (Lunatic).') | 130 parser.add_argument('-r', '--rank', metavar='RANK', type=int, default=0, help='Rank, from 0 (Easy, default) to 3 (Lunatic).') |
| 109 parser.add_argument('-c', '--character', metavar='CHARACTER', type=int, default=0, help='Select the character to use, from 0 (ReimuA, default) to 3 (MarisaB).') | 131 parser.add_argument('-c', '--character', metavar='CHARACTER', type=int, default=0, help='Select the character to use, from 0 (ReimuA, default) to 3 (MarisaB).') |
| 110 parser.add_argument('--replay', metavar='REPLAY', help='Select a replay') | 132 parser.add_argument('--replay', metavar='REPLAY', help='Select a replay') |
| 133 parser.add_argument('-b', '--boss-rush', action='store_true', help='Fight only bosses') | |
| 111 | 134 |
| 112 args = parser.parse_args() | 135 args = parser.parse_args() |
| 113 | 136 |
| 114 main(args.path, tuple(args.data), args.stage, args.rank, args.character, args.replay) | 137 main(args.path, tuple(args.data), args.stage, args.rank, args.character, args.replay, args.boss_rush) |
