import random from typing import List import map.quest_map from map.quest_map import QuestMap, MapEncounter, EncounterType, QuestPath as QP def generate_encounter_inaccessible() -> MapEncounter: return MapEncounter(EncounterType.INACCESSIBLE) def generate_encounter_battle(battle_type: EncounterType): assert battle_type in map.quest_map.ENCOUNTER_TYPES_BATTLE return MapEncounter(battle_type) def generate_encounter_town(): town_type = random.choice(map.quest_map.ENCOUNTER_TYPES_TOWN) return MapEncounter(town_type) def generate_map() -> QuestMap: quest_map = QuestMap() # Generate encounters # TODO: Use sample as if drawing from a deck encounters_rows = [] for r in range(11): row: List[MapEncounter] = [] if r == 10: row.append(generate_encounter_inaccessible()) row.append(generate_encounter_battle(EncounterType.BATTLE_BOSS)) row.append(generate_encounter_inaccessible()) elif r in (1, 4, 7): elite_column = random.randrange(4) # 75% chance of elite for c in range(3): battle_type = EncounterType.BATTLE_ELITE if c == elite_column else EncounterType.BATTLE_REGULAR row.append(generate_encounter_battle(battle_type)) else: for c in range(3): row.append(generate_encounter_town()) encounters_rows.append(row) quest_map.encounters = encounters_rows # Generate paths diagonals_deck = [QP.NO_PATH] * 8 + [QP.FORWARD_LEFT] * 5 + [QP.FORWARD_RIGHT] * 5 random_paths_it = iter(random.sample(diagonals_deck, len(diagonals_deck))) path_rows = [] for r in range(11 - 1): row: List[QP] if r == 0: row = [QP.FORWARD, QP.NO_PATH, QP.FORWARD, QP.NO_PATH, QP.FORWARD] elif r == 9: row = [QP.NO_PATH, QP.FORWARD_RIGHT, QP.FORWARD, QP.FORWARD_LEFT, QP.NO_PATH] else: row = [QP.FORWARD, next(random_paths_it), QP.FORWARD, next(random_paths_it), QP.FORWARD] path_rows.append(row) quest_map.paths = path_rows return quest_map