Mercurial > touhou
diff pytouhou/games/eosd.py @ 548:1e9ea6519f3c
Make EoSDInterface separate from EoSD game.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Wed, 21 May 2014 20:56:53 +0200 |
parents | e35bef07290d |
children |
line wrap: on
line diff
--- a/pytouhou/games/eosd.py +++ b/pytouhou/games/eosd.py @@ -20,8 +20,6 @@ from pytouhou.game.lasertype import Lase from pytouhou.game.itemtype import ItemType from pytouhou.game.player import Player from pytouhou.game.orb import Orb -from pytouhou.game.effect import Effect -from pytouhou.game.text import Text, Counter, Gauge, NativeText from pytouhou.game.background import Background from pytouhou.vm import ECLMainRunner @@ -96,8 +94,6 @@ class EoSDCommon(object): eosd_characters[player_character], character, default_power, continues) - self.interface = EoSDInterface(resource_loader, self.players[0]) #XXX - class EoSDGame(Game): @@ -143,149 +139,15 @@ class EoSDGame(Game): common.height, prng, common.interface, hints, friendly_fire) - self.texts['stage_name'] = common.interface.stage_name - self.texts['song_name'] = common.interface.song_name - - - -class EoSDInterface(object): - def __init__(self, resource_loader, player_state): - self.game = None - self.player_state = player_state - front = resource_loader.get_single_anm('front.anm') - self.ascii_anm = resource_loader.get_single_anm('ascii.anm') - - self.width = 640 - self.height = 480 - self.game_pos = (32, 16) - - self.highscore = 1000000 #TODO: read score.dat - self.items = ([Effect((0, 32 * i), 6, front) for i in range(15)] + - [Effect((416 + 32 * i, 32 * j), 6, front) for i in range(7) for j in range(15)] + - [Effect((32 + 32 * i, 0), 7, front) for i in range(12)] + - [Effect((32 + 32 * i, 464), 8, front) for i in range(12)] + - [Effect((0, 0), i, front) for i in reversed(range(6))] + - [Effect((0, 0), i, front) for i in range(9, 16)]) - for item in self.items: - item.sprite.allow_dest_offset = True #XXX - - self.level_start = [] - - self.labels = { - 'highscore': Text((500, 58), self.ascii_anm, front, text='0'), - 'score': Text((500, 82), self.ascii_anm, front, text='0'), - 'player': Counter((500, 122), front, front, script=16, value=0), - 'bombs': Counter((500, 146), front, front, script=17, value=0), - 'power': Text((500, 186), self.ascii_anm, front, text='0'), - 'graze': Text((500, 206), self.ascii_anm, front, text='0'), - 'points': Text((500, 226), self.ascii_anm, front, text='0'), - 'framerate': Text((512, 464), self.ascii_anm, front), - 'debug?': Text((0, 464), self.ascii_anm, front), - - # Only when there is a boss. - 'boss_lives': Text((80, 16), self.ascii_anm), - 'timeout': Text((384, 16), self.ascii_anm), - } - self.labels['boss_lives'].set_color('yellow') - - self.boss_items = [ - Effect((0, 0), 19, front), # Enemy - Gauge((100, 24), front), # Gauge - Gauge((100, 24), front), # Spellcard gauge - ] - for item in self.boss_items: - item.sprite.allow_dest_offset = True #XXX - - - def start_stage(self, game, stage): - self.game = game - if stage < 6: - text = 'STAGE %d' % stage - elif stage == 6: - text = 'FINAL STAGE' - elif stage == 7: - text = 'EXTRA STAGE' - - self.stage_name = NativeText((192, 200), unicode(game.std.name), shadow=True, align='center') - self.stage_name.set_timeout(240, effect='fadeout', duration=60, start=120) - - self.set_song_name(game.std.bgms[0][0]) - - self.level_start = [Text((16+384/2, 200), self.ascii_anm, text=text, align='center')] #TODO: find the exact location. - self.level_start[0].set_timeout(240, effect='fadeout', duration=60, start=120) - self.level_start[0].set_color('yellow') + try: + self.texts['stage_name'] = common.interface.stage_name + except AttributeError: + pass - - def set_song_name(self, name): - #TODO: use the correct animation. - self.song_name = NativeText((384, 432), u'♪ ' + name, shadow=True, align='right') - self.song_name.set_timeout(240, effect='fadeout', duration=60, start=120) - - - def set_boss_life(self): - if not self.game.boss: - return - self.boss_items[1].maximum = self.game.boss.life or 1 - self.boss_items[2].maximum = self.game.boss.life or 1 - - - def set_spell_life(self): - self.boss_items[2].set_value(self.game.boss.low_life_trigger if self.game.boss else 0) - - - def update(self): - for elem in self.items: - elem.update() - - for elem in self.level_start: - elem.update() - if elem.removed: #XXX - self.level_start = [] - - player_state = self.player_state - - self.highscore = max(self.highscore, player_state.effective_score) - self.labels['highscore'].set_text('%09d' % self.highscore) - self.labels['score'].set_text('%09d' % player_state.effective_score) - self.labels['power'].set_text('%d' % player_state.power) - self.labels['graze'].set_text('%d' % player_state.graze) - self.labels['points'].set_text('%d' % player_state.points) - self.labels['player'].set_value(player_state.lives) - self.labels['bombs'].set_value(player_state.bombs) - - if self.game.boss: - boss = self.game.boss - - life_gauge = self.boss_items[1] - life_gauge.set_value(boss.life) - - spell_gauge = self.boss_items[2] - spell_gauge.sprite.color = (255, 192, 192) - if boss.life < spell_gauge.value: - spell_gauge.set_value(boss.life) - - for item in self.boss_items: - item.update() - - self.labels['boss_lives'].set_text('%d' % boss.remaining_lives) - self.labels['boss_lives'].changed = True - - timeout = min((boss.timeout - boss.frame) // 60, 99) - timeout_label = self.labels['timeout'] - if timeout >= 20: - timeout_label.set_color('blue') - elif timeout >= 10: - timeout_label.set_color('darkblue') - else: - if timeout >= 5: - timeout_label.set_color('purple') - else: - timeout_label.set_color('red') - if (boss.timeout - boss.frame) % 60 == 0 and boss.timeout != 0: - self.game.sfx_player.set_volume('timeout.wav', 1.) - self.game.sfx_player.play('timeout.wav') - timeout_label.set_text('%02d' % (timeout if timeout >= 0 else 0)) - timeout_label.changed = True + try: + self.texts['song_name'] = common.interface.song_name + except AttributeError: + pass