async def main(**kwargs): get_game().overworld.freeze() await display_text(load_text('overworld/lyceum_1_sportick/sportick')) await fight(load_enemy_battle_by_name('sportick'), on_before_finish=remove_sportick) get_state()['sportick_fought'] = True get_state()['lyceum_staircase_unlocked'] = True get_game().overworld.unfreeze()
async def main(*args, root, **kwargs): game = get_game() room = game.overworld.room game.overworld.freeze() room.named_objects['grumpylook'].kill() texture = AnimatedTexture( [load_texture(root / 'grumpylook' / 'overworld.png')], fps=1) grumpy = TexturedWalkingSprite( pos=Vector(840, 360), left=texture, right=texture, front=texture, back=texture, speed=200.0, ) room.spawn(grumpy) await display_text(load_text('overworld/lyceum_hall/grumpylook/wait/1')) await grumpy.walk_x(-620) await display_text(load_text('overworld/lyceum_hall/grumpylook/wait/2')) await grumpy.walk_x(-240) grumpy.kill() get_state()['grumpylook_met'] = True game.overworld.unfreeze()
async def main(*a, **k): await display_text(load_text('overworld/lyceum_2_geoma/ruler')) give(get_inventory(), 'ruler') named_objects = get_game().overworld.room.named_objects named_objects['ruler'].kill() del named_objects['ruler'] get_state()['took_ruler'] = True
async def main(root, **kwargs): overworld = get_game().overworld overworld.freeze() await display_text(load_text('overworld/lyceum_2_left/grumpylook')) room = overworld.room grumpylook_object = room.named_objects['grumpylook'] pos = grumpylook_object.pos grumpylook_object.kill() del grumpylook_object player = room.player texture = AnimatedTexture( [load_texture(root / 'grumpylook' / 'overworld.png')], fps=1) grumpylook = TexturedWalkingSprite( pos=pos, left=texture, right=texture, front=texture, back=texture, speed=player.speed, ) room.spawn(grumpylook) await gather(grumpylook.walk_x(-240), player.walk_x(-240)) get_state()['grumpylook_met_at_floor2'] = True overworld.load_room('lyceum_5_left') overworld.unfreeze()
async def main(*, root, **kwargs): overworld = get_game().overworld room = overworld.room overworld.freeze() await sleep(0.8) old_flate = room.named_objects['flate'] old_flate.texture = load_texture(root / 'flate' / 'overworld_neutral.png', scale=2) await sleep(0.8) route = determine_route() if route not in ['cheater', 'pacifist', 'neutral', 'genocide']: raise NotImplementedError(f'Unknown route: {repr(route)}') text_name = f'overworld/lyceum_3_mid/flate/{route}' await display_text(load_text(text_name)) flate_texture = AnimatedTexture([old_flate.texture], fps=1) flate = TexturedWalkingSprite( pos=old_flate.pos, left=flate_texture, right=flate_texture, front=flate_texture, back=flate_texture, speed=240, ) room.spawn(flate) old_flate.kill() await flate.walk_x(-500) get_state()['lyceum_3_flate_met'] = True overworld.unfreeze()
async def main(root, **kwargs): overworld = get_game().overworld overworld.freeze() await display_text(load_text('overworld/lyceum_5_left/grumpylook')) room = overworld.room grumpylook_object = room.named_objects['grumpylook'] pos = grumpylook_object.pos grumpylook_object.kill() del grumpylook_object texture = AnimatedTexture( [load_texture(root / 'grumpylook' / 'overworld.png')], fps=1) grumpylook = TexturedWalkingSprite( pos=pos, left=texture, right=texture, front=texture, back=texture, speed=280, ) room.spawn(grumpylook) await grumpylook.walk_x(700) grumpylook.kill() get_state()['grumpylook_gone'] = True overworld.unfreeze()
async def main(*, root, **kwargs): overworld = get_game().overworld if get_state()['lyceum_elevator_used']: overworld.freeze() await display_text(load_text('overworld/lyceum_5_right/elevator_1')) overworld.unfreeze() return overworld.freeze() elevator_open_texture = load_texture(root / 'elevator_open.png') elevator_open_sprite = TexturedSprite(pos=Vector(619, 126), texture=elevator_open_texture) overworld.room.spawn(elevator_open_sprite) await sleep(1) await display_text(load_text('overworld/lyceum_5_right/elevator_enter')) get_state()['lyceum_elevator_used'] = True overworld.load_room('lyceum_1_right') overworld.unfreeze()
async def main(*args, **kwargs): if get_state().get('grumpylook_met', False): return game = get_game() room = game.overworld.room grumpy = room.named_objects.get('grumpylook') if grumpy is None: return grumpy.pos.y = min(474.0, room.player.pos.y)
def __init__(self, game: 'Game'): super().__init__(game) if get_state()['genocide_route_possible']: logo_filename = 'logo_red.png' else: logo_filename = 'logo.png' self.logo = load_texture(Path('.') / 'assets' / 'textures' / logo_filename, scale=12) self._elapsed_time = 0.0
def save(game: 'Game'): SAVE_PATH.parent.mkdir(parents=True, exist_ok=True) data: dict = {} data['overworld'] = game.overworld.to_dict() data['state'] = get_state() data['pi_approx'] = 3.1415926535 logger.info('Saving file {}', SAVE_PATH) with SAVE_PATH.open('w') as f: json.dump(data, f)
def determine_route(): state = get_state() if state['pacifist_route_possible'] and state['genocide_route_possible']: return 'cheater' elif state['pacifist_route_possible']: return 'pacifist' elif state['genocide_route_possible']: return 'genocide' else: return 'neutral'
async def main(*, root, script, **kwargs): global DEBUG_SKIP get_game().overworld.freeze() if not DEBUG_SKIP: await display_text( load_text('overworld/lyceum_entrance/flate-interact/1-crying')) await sleep(2) if not DEBUG_SKIP: await display_text( load_text( 'overworld/lyceum_entrance/flate-interact/2-flate-speech')) animation = load_animated_once_texture(root / 'flate' / 'disappear', scale=2) flate = get_game().overworld.room.named_objects['flate'] flate.texture = animation event_id, callback = make_callback() animation.on_finish = callback await wait_for_event(event_id) flate.kill() cariel_overworld = TexturedWalkingSprite( pos=Vector(400, -170), left=load_animated_texture(root / 'cariel' / 'left', scale=2), right=load_animated_texture(root / 'cariel' / 'right', scale=2), front=load_animated_texture(root / 'cariel' / 'front', scale=2), back=load_animated_texture(root / 'cariel' / 'back', scale=2), speed=120.0, ) get_game().overworld.room.spawn(cariel_overworld) await cariel_overworld.walk_y(260) if not DEBUG_SKIP: await display_text( load_text( 'overworld/lyceum_entrance/flate-interact/3-cariel-pre-fight')) await fight(load_enemy_battle_by_name('itt_test_cariel_tutorial')) if not DEBUG_SKIP: if get_state()['itt_test_tutorial'] == 'dead': await display_text( load_text( 'overworld/lyceum_entrance/flate-interact/4-cariel-post-fight-kill' )) else: await display_text( load_text( 'overworld/lyceum_entrance/flate-interact/4-cariel-post-fight-spare' )) await cariel_overworld.walk_y(-260) cariel_overworld.kill() get_game().overworld.unfreeze()
async def buy_item(item_name: str, price: int): item = get_item_by_name(item_name) state = get_state() if state['player_money'] < price: await display_text(load_text('helper/not_enough_money')) return inventory = get_inventory() # TODO: handle the case of full inventory await display_text( load_text('helper/item_bought', fmt={'item': item.inline_name})) give(inventory, item_name) state['player_money'] -= price
async def main(*, root, **kwargs): get_game().overworld.freeze() await display_text(load_text('overworld/lyceum_5_assembly_hall/1')) await fight(load_enemy_battle_by_name('globby')) await display_text(load_text('overworld/lyceum_5_assembly_hall/2')) await fight(load_enemy_battle_by_name('algebroid')) await fight(load_enemy_battle_by_name('geoma')) await display_text(load_text('overworld/lyceum_5_assembly_hall/3')) await fight(load_enemy_battle_by_name('crier'), on_before_finish = lambda: spawn_water(root)) await display_text(load_text('overworld/lyceum_5_assembly_hall/4')) get_state()['lyceum_presentation_watched'] = True get_game().overworld.unfreeze()
async def spare(self): if self._num_attacks > 0: await display_text(DisplayedText([TextPage('...?', picture=self.textures['cariel_neutral'])])) return self._num_spares += 1 await display_text(self.get_text_for_current_spare()) self._has_spared = self.check_if_has_spared() if self._has_spared: get_state()['cariel_fought'] = True await self.cariel_sprite.walk_x(-300) await self.on_spare()
def maybe_hit_player(self, damage): if not self._can_hit_player(): return now = time.monotonic() self._last_time_player_hit = now state = get_state() state['player_hp'] = max(0, state['player_hp'] - damage) logger.debug('Player was hit, {} hp left', state['player_hp']) if state['player_hp'] == 0: logger.info('Player died') from underkate.death_screen.mode import DeathScreenMode # TODO: fix this shit get_game().current_game_mode = DeathScreenMode( game = get_game(), heart_pos = self.get_current_coords(), )
async def attack_xxl(self): await self.enemy.hit(0) await HitAnimation(self.enemy.sprite).animate() await display_text(DisplayedText([TextPage('You start XXL and solve all the problems you can find')])) self._resolution = 'kill' inflash = Flash(size=(800, 600), length=1.0).start_animation() self.spawn(inflash) await sleep(1.5) inflash.kill() self.enemy.sprite.texture = self.enemy.wounded_texture outflash = Flash(size=(800, 600), length=0.3, is_reversed=True).start_animation() self.spawn(outflash) await sleep(0.31) outflash.kill() await sleep(1.0) await self.enemy.on_disappear() await sleep(1.0) await display_text(self.get_kill_text()) disappear_animation = DisappearAnimation( pos = self.cariel_sprite.pos, texture = self.textures['cariel'], slowdown_factor = 4, ) self.cariel_sprite.kill() await disappear_animation.animate() await sleep(1) txt = DisplayedText([ TextPage('Cariel has been killed'), ]) await display_text(txt) await self.on_kill() get_state()['cariel_fought'] = True
async def consume_food(self, food_consumption): food = food_consumption.food recovered = food.restores state = get_state() state['player_hp'] += recovered if state['player_hp'] >= state['player_max_hp']: state['player_hp'] = state['player_max_hp'] txt = DisplayedText([ TextPage( f'You ate {food.inline_name} and recovered HP to the maximum' ), ]) else: txt = DisplayedText([ TextPage( f'You ate {food.inline_name} and recovered {recovered} HP' ), ]) await display_text(txt) inventory.remove_from_slot(inventory.get_inventory(), food_consumption.inventory_slot)
async def main(*, root, **kwargs): overworld = get_game().overworld room = overworld.room overworld.freeze() cariel = respawn_cariel(root, room) cariel.direction = 'down' await room.player.walk_x(-50) await sleep(0.8) await cariel.walk_y(room.player.pos.y - cariel.pos.y) cariel.direction = 'right' await sleep(0.8) state = get_state() if state['genocide_route_possible']: await branch_genocide() elif state['pacifist_route_possible']: await branch_pacifist() else: await branch_neutral() overworld.unfreeze()
async def pay(coins: int): get_state()['player_money'] += coins await display_text(load_text('helper/got_money', fmt={'coins': str(coins)}))
async def on_spare(self): get_state()['genocide_route_possible'] = False await pay(self.battle.data['reward_for_spare'])
def get_inventory() -> Inventory: return get_state()['player_inventory']
def get_max_hp(self): return get_state()['player_max_hp']
def get_current_hp(self): return get_state()['player_hp']
async def fight_coroutine(*args, **kwargs): get_game().overworld.freeze() await fight(load_enemy_battle_by_name(name)) get_state()['lyceum_2_right_fights'][name] = True get_game().overworld.unfreeze()
async def spare(self): self._resolution = 'spare' await display_text(self.get_spare_text()) get_state()['cariel_fought'] = True await self.cariel_sprite.walk_x(-300) await self.on_spare()
async def attack_xxl(self): await self.enemy.hit(0) await HitAnimation(self.enemy.sprite).animate() self._num_attacks += 1 await display_text(self.get_text_for_current_attack()) if self.has_killed_xxl(): inflash = Flash(size=(800, 600), length=1.0).start_animation() self.spawn(inflash) await sleep(1.5) inflash.kill() self.enemy.sprite.texture = self.enemy.wounded_texture outflash = Flash(size=(800, 600), length=0.3, is_reversed=True).start_animation() self.spawn(outflash) await sleep(0.31) outflash.kill() await sleep(1.0) await self.enemy.on_disappear() await sleep(1.0) await display_text( DisplayedText([ TextPage( '...', picture = self.textures['cariel_surprised'], ), TextPage( 'My problems...', picture = self.textures['cariel_surprised'], ), TextPage( 'They are all... solved?', picture = self.textures['cariel_surprised'], ), TextPage( 'You managed to do everything so easily?', picture = self.textures['cariel_surprised'], ), TextPage( 'Oh my, oh no...', picture = self.textures['cariel_desperate'], ), TextPage( 'This went further than it was supposed to...', picture = self.textures['cariel_desperate'], ), TextPage( 'I lost my problems... I lost my powers...', picture = self.textures['cariel_desperate'], ), TextPage( 'I lost the energy that kept me alive...', picture = self.textures['cariel_closed_eyes'], ), TextPage( '...', picture = self.textures['cariel_closed_eyes'], ), TextPage( 'But...', picture = self.textures['cariel_desperate'], ), TextPage( 'I still believe in you', picture = self.textures['cariel_desperate'], ), TextPage( 'You are strong enough to survive, you have just proved it...', picture = self.textures['cariel_closed_eyes'], delay = 0.15, ), TextPage( 'My child.....', picture = self.textures['cariel_closed_eyes'], delay = 0.3, ), ]), ) disappear_animation = DisappearAnimation( pos = self.cariel_sprite.pos, texture = self.textures['cariel'], slowdown_factor = 4, ) self.cariel_sprite.kill() await disappear_animation.animate() await sleep(1) txt = DisplayedText([ TextPage('Cariel has been killed'), ]) await display_text(txt) await self.on_kill() get_state()['cariel_fought'] = True
async def on_kill(self): get_state()['itt_test_tutorial'] = 'dead' await super().on_kill()
async def on_spare(self): get_state()['itt_test_tutorial'] = 'spared' await super().on_spare()
async def on_kill(self): get_state()['pacifist_route_possible'] = False await pay(self.battle.data['reward_for_kill'])