Beispiel #1
0
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()
Beispiel #2
0
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()
Beispiel #3
0
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
Beispiel #4
0
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()
Beispiel #5
0
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()
Beispiel #6
0
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()
Beispiel #7
0
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()
Beispiel #8
0
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)
Beispiel #9
0
 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
Beispiel #10
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)
Beispiel #11
0
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'
Beispiel #12
0
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()
Beispiel #13
0
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
Beispiel #14
0
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()
Beispiel #15
0
    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()
Beispiel #16
0
 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(),
         )
Beispiel #17
0
    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
Beispiel #18
0
 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)
Beispiel #19
0
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()
Beispiel #20
0
async def pay(coins: int):
    get_state()['player_money'] += coins
    await display_text(load_text('helper/got_money', fmt={'coins':
                                                          str(coins)}))
Beispiel #21
0
 async def on_spare(self):
     get_state()['genocide_route_possible'] = False
     await pay(self.battle.data['reward_for_spare'])
Beispiel #22
0
def get_inventory() -> Inventory:
    return get_state()['player_inventory']
Beispiel #23
0
 def get_max_hp(self):
     return get_state()['player_max_hp']
Beispiel #24
0
 def get_current_hp(self):
     return get_state()['player_hp']
Beispiel #25
0
 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()
Beispiel #26
0
 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()
Beispiel #27
0
    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
Beispiel #28
0
 async def on_kill(self):
     get_state()['itt_test_tutorial'] = 'dead'
     await super().on_kill()
Beispiel #29
0
 async def on_spare(self):
     get_state()['itt_test_tutorial'] = 'spared'
     await super().on_spare()
Beispiel #30
0
 async def on_kill(self):
     get_state()['pacifist_route_possible'] = False
     await pay(self.battle.data['reward_for_kill'])