def success(loot_scene: bool = True) -> Scene: load_loot_scene = partial(InventoryScene, partial(success, False), _mini_laser) gain_3 = partial(increment_attribute, Attributes.CREDITS, 3) if loot_scene: return DecisionScene( 'After deactivating the drone, you pick up 3 credits and ' 'dismantle it.', { '1': DecisionOption('Loot the body.', load_loot_scene), '2': DecisionOption('Back to start.', start_scene, gain_3) }) return DecisionScene( 'After deactivating the drone, you pick up 3 credits and ' 'dismantle it.', {'1': DecisionOption('Back to start.', start_scene, gain_3)})
def cryo_chambers(self) -> DecisionScene: prompt = ('You enter the cryo-chambers, where all human personnel are ' 'stored. As there are only {} hours left until landing, they ' 'are in the process of being reanimated. Status monitors ' 'indicate that some malfunction may be in progress, and that ' 'the humans may expire due to lack of oxygen. A medical robot' ' administrators look to be frantically administering some ' 'fixes.').format(self._time_until_landing) check_failure = transition_to( self.medical_bot_combat, 'You fail, causing the medical bots to attack.') # choices hack = DecisionOption('Hack the systems so that only the rival factions' ' expire, and make it look like the medical robot' 'was at fault.', check_failure, self._decrement_time_left) help = DecisionOption('Provide technical support to the medical robot.' ' All human life is precious.', check_failure, self._decrement_time_left) disable = DecisionOption('Attempt to disable the medical robot to ' 'access its encryption key.', check_failure, self._decrement_time_left) return DecisionScene(prompt, {'1': hack, '2': help, '3': disable})
def intro() -> DecisionScene: return DecisionScene( 'Choose scene arc.', { '1': DecisionOption('Swamp', start_scene), '2': DecisionOption('Space trip', space_arc.SpaceArc().intro) })
def test_making_choices_removes_listener(): game = Game() # noqa: F841 # scene_0 (Decision) -> combat scene options_0 = { 's': DecisionOption('load next scene', combat_scene.CombatScene) } scene_0 = DecisionScene('first scene', options_0) event_utils.post_scene_change(scene_0) ctl = _get_active_controller() assert isinstance(ctl, DecisionSceneController) # we must remove references otherwise EventManager will keep this listener del ctl del scene_0 event_utils.simulate_key_press('s') # The scene machine only changes scenes on a tick EventManager.post(BasicEvents.TICK) assert not any( isinstance(l, DecisionScene) for l in EventManager.listeners) assert not any( isinstance(l, DecisionSceneController) for l in EventManager.listeners) ctl = _get_active_controller() assert isinstance(ctl, CombatSceneController) assert any( isinstance(l, combat_scene.CombatScene) for l in EventManager.listeners)
def start_scene() -> DecisionScene: options = { '1': DecisionOption('Go in the swamp.', swamp_scene), '2': DecisionOption('COMBAT!', example_combat_scene) } main_text = ( 'You are walking down the path to the city. You pass by a decaying sign' ' pointing in the direction of an overgrown path. The sign says ' '"DANGER: Rogue drones in swamp".') return DecisionScene(main_text, options)
def test_press_debug_in_decision_scene_has_no_effect(): game = Game() view_manager = ViewManager() event_utils.post_scene_change( DecisionScene('dummy scene for test purposes', {})) assert isinstance(game.scene_machine.controller, DecisionSceneController) assert view_manager.current_view is not None EventManager.post(BasicEvents.DEBUG) EventManager.post(BasicEvents.TICK)
def second_scene() -> DecisionScene: player = get_player() main_text = ('Player HP: {}. Player Max HP: {}.'.format( player.status.get_attribute(Attributes.HEALTH), player.status.get_attribute(Attributes.MAX_HEALTH))) options = { '1': DecisionOption('Gain 1 HP', second_scene, partial(increment_attribute, Attributes.HEALTH, 1)), '2': DecisionOption('Lose 1 HP', second_scene, partial(increment_attribute, Attributes.HEALTH, -1)) } return DecisionScene(main_text, options)
def test_toggle_settings(): machine = SceneMachine() # This is the scene to return to after the temporary scene is toggled twice. initial_scene = DecisionScene('dummy scene', {}, inventory_available=True) initial_controller_type = type(build_controller(initial_scene)) assert initial_controller_type is not SettingsController machine.notify(NewSceneEvent(initial_scene)) assert isinstance(machine.controller, initial_controller_type) machine.notify(BasicEvents.SETTINGS) assert isinstance(machine.controller, SettingsController) machine.notify(BasicEvents.SETTINGS) assert isinstance(machine.controller, initial_controller_type)
def staging_area(self) -> DecisionScene: """The main scene where player chooses different random scenes. Game history and randomness is used to provide choices. """ prompt = ('You enter the staging area. The wall monitor indicates that ' 'there are {} hours until the ship lands on Mars.') cryo = DecisionOption('The cryo-chambers look promising.', self.cryo_chambers) scene_2 = DecisionOption('Filler for scene 2', self.scene_2) return DecisionScene(prompt.format(self._time_until_landing), { '1': cryo, '2': scene_2})
def intro(self) -> DecisionScene: chars = string.ascii_uppercase + string.digits serial_number = ''.join(random.choices(chars, k=10)) serial_number = serial_number[:4] + '-' + serial_number[4:] serial_number = serial_number[:8] + '-' + serial_number[8:] prompt = ( 'The overhead speaker emits: "Utility Robot Mk II, serial number ' '{}, exit hibernation mode and report to the staging area at ' 'maximum speed." You slide out of your charging pod. Your ' 'gryoscopes indicate that the "Mars or Bust" colony ship is still' ' in low gravity mode, so it has not yet initiated its landing ' 'sequence. You look up the content of your current mission in ' 'your long-term memory bank - help your current employer, the XXX' ' faction, dominate the new colony at all costs!').format( serial_number) return DecisionScene(prompt, {'1': DecisionOption('Continue to staging area.', self.staging_area)})
def loading_scene() -> DecisionScene: # intro scene def intro() -> DecisionScene: return DecisionScene( 'Choose scene arc.', { '1': DecisionOption('Swamp', start_scene), '2': DecisionOption('Space trip', space_arc.SpaceArc().intro) }) options = { 's': DecisionOption('Start Game', intro), 'x': DecisionOption('Settings', intro) } return DecisionScene('6TH Corp', options, background_image=BackgroundImages.LOADING.path, inventory_available=False, centered_prompt=True, centered_choices=True)
def swamp_scene() -> DecisionScene: main_text = ( 'You walk into the swamp. The foliage overhead blocks most of' ' the sunlight. Flies and mosquitoes buzz near your ears. Your' ' olfactory sensors detect the smell of sulfur. Ahead you see ' 'the curving form of a rogue drone. It is currently in ' 'hibernation mode.') def success(loot_scene: bool = True) -> Scene: load_loot_scene = partial(InventoryScene, partial(success, False), _mini_laser) gain_3 = partial(increment_attribute, Attributes.CREDITS, 3) if loot_scene: return DecisionScene( 'After deactivating the drone, you pick up 3 credits and ' 'dismantle it.', { '1': DecisionOption('Loot the body.', load_loot_scene), '2': DecisionOption('Back to start.', start_scene, gain_3) }) return DecisionScene( 'After deactivating the drone, you pick up 3 credits and ' 'dismantle it.', {'1': DecisionOption('Back to start.', start_scene, gain_3)}) if Difficulty.EASY.sample_success(Skills.STEALTH): deactivate_outcome: SceneConstructor = success else: deactivate_outcome = transition_to( example_combat_scene, 'The drone awakens. Prepare to fight!') options = { '1': DecisionOption('Continue walking.', second_scene), '2': DecisionOption('Attempt to deactivate the drone.', deactivate_outcome), '3': DecisionOption('Attack the drone', example_combat_scene) } return DecisionScene(main_text, options)
def game_over_scene() -> DecisionScene: prompt = 'Game over. You loose.' options = {'1': DecisionOption('Play again.', loading_scene, restart_game)} return DecisionScene(prompt, options)
def scene_2(self) -> DecisionScene: return DecisionScene('Something with space unicorns', {'1': DecisionOption('Back to staging area', self.staging_area, self._decrement_time_left)})
def start_scene() -> DecisionScene: loot_scene = partial(InventoryScene, start_scene, lambda: ground_mods) return DecisionScene('dummy scene for testing purposes', {'1': DecisionOption('Loot', loot_scene)})
def dummy_scene(): return DecisionScene('dummy scene for testing purposes', {})