def use(self, player_state: "PlayerState", monster: "Combat"): self.recipient = monster self.max_available_uses -= 1 self.expiration_turn = player_state.total_turns_spent + self.turn_duration if not self.has_rejection: player_state.olfacted_monster = monster # immunity from rejection is handled on player_state while only olfaction does so utils.vlog(f"{player_state.total_turns_spent + 1}: Using the copier {self.name} on {utils.agreement(monster)} {monster.name}.")
def holiday_run(encounter, player_state, location, **kwargs): if player_state.inventory[Items.BoringBinderClip] < 1: player_state.inventory[Items.BoringBinderClip] += 1 utils.vlog( f"{player_state.total_turns_spent + 1}: Gained a boring binder clip." ) elif player_state.accountants_fought > 4: player_state.locations[location].increment_progress( player_state, location)
def surgeon_run(encounter, player_state, location, **kwargs): if player_state.surgeonosity < threshold: for gear in SURGEON_GEAR: if player_state.inventory[gear] < 1: player_state.inventory[gear] += 1 break else: utils.vlog( f"Ran away from a surgeon at {player_state.surgeonosity} surgeonosity." )
def resolve_macro(self, player_state: "PlayerState", original_monster: "Combat") -> None: player_state.macro_active = True new_monster = self.select_macro_combat(player_state, original_monster) player_state.locations[self].macros_used += 1 player_state.available_macros -= 1 utils.vlog( f"{player_state.total_turns_spent + 1}: using Macrometeorite on {utils.agreement(original_monster)} {original_monster.name}, which changed it into a {new_monster.name}." ) new_monster.run_from(4, player_state, self)
def use(self, player_state: "PlayerState", location: "Location", monster: "Combat"): self.recipient = monster self.max_available_uses -= 1 self.expiration_turn = player_state.total_turns_spent + self.turn_duration if not self.should_roll_drops: player_state.should_roll_drops = False if self.is_free: player_state.free_turn = True player_state.locations[location].banishers_used += 1 utils.vlog( f"{player_state.total_turns_spent}: Using the banisher {self.name} on {utils.agreement(monster)} {monster.name}." )
def roll_drops(self, player_state: "PlayerState") -> None: if self.item_drops: for item in self.item_drops: roll = random.randrange(100) rate = math.floor(self.item_drops[item] * player_state.drop_multiplier) if roll < rate: player_state.inventory[item] += 1 utils.vlog( f"Acquired {Items.get_name(item)} by rolling {roll} against a total drop rate of {rate}." ) else: utils.vlog( f"Drop failure: rolled {roll} against a total drop rate of {rate} for {Items.get_name(item)}." )
def dumpster_run(encounter, player_state, location, **kwargs): if not player_state.janitors_moved: player_state.janitors_moved = True utils.vlog( f"{player_state.total_turns_spent}: Pygmy janitors moved to the park." ) else: item = roll_dumpster_item() player_state.inventory[item] += 1 utils.vlog(f"Acquired 1 {Items.get_name(item)} from the dumpster.") if not random.randrange(20): player_state.inventory[Items.ShortWritOfHabeasCorpus] += 1 utils.vlog( f"Acquired 1 {Items.get_name(Items.ShortWritOfHabeasCorpus)} from the dumpster." )
def drunk_run(encounter, player_state, location, **kwargs): if player_state.inventory[Items.BookOfMatches]: player_state.free_turn = True player_state.should_roll_drops = False utils.vlog("Used a bowl of scoprions to complete the combat without using a turn.")
def increment_progress(self, player_state: "PlayerState", location: "Location", num: int = 1): self.progress += num utils.vlog(f"Gained {num} progress in {location.name} for a total of {self.progress}.")
def verbose_log(self, player_state: "PlayerState", location: "Location") -> None: utils.vlog( f"{player_state.total_turns_spent}: Encountered {self.name} at {player_state.locations[location].progress} location progress." )
def resolve_free_turn(self, player_state: "PlayerState", location: "Location") -> None: if player_state.free_turn: player_state.free_turn = False utils.vlog( f"Turn {player_state.total_turns_spent + 1} was a free turn.")