cubequest/questhelper/map/map_generator.py
henriquenakashima d9916579b6 Render paths
2021-03-28 16:09:33 -04:00

63 lines
2.1 KiB
Python

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