#!/usr/bin/env python3
"""Generate html page of an AI boss opponent"""
# TODO: support multiple languages
import argparse
from pathlib import Path
from string import Template
import re
import yaml
from data import name2file
import generate_card_hover_links
SETS = {"kraken": "kraken", "tyrant": "tyrant"}
NAMES = {"kraken": "The Kraken", "tyrant": "The Tyrant"}
DESCS = {
"kraken":
"Face the evil of the sea. Overcome the kraken, the fierce epicenter of the ozean, which employs creatures of the depth to stop your offense.
Since the kraken does not move and can not win it is the perfect boss to start.",
"tyrant": "" # TODO
}
TEMPLATE = """
${boss_name}
Win Condition
${win_condition}
Starting Deck
${start_deck}
Recommended Draft ?
${draft}
Instructions
${instructions}
"""
def name_to_map(name: str) -> str:
"""Return the map's file name of a boss"""
return name.lower().replace(" ", "-")
def wincon_desc(map_def: dict) -> str:
"""Format a map's win condition"""
wincon = map_def['win_condition']
if isinstance(wincon, str):
return wincon.capitalize()
s = ""
for player, wc in wincon.items():
s += f'{player.capitalize()}: {wc.capitalize()}'
return f''
def recommended_draft(map_def: dict) -> str:
"""Format the map's recommended draft"""
# TODO: improve default draft
# TODO: format multiple recommendations
return map_def.get('draft', '3x[2;8]')
def ai_instruction(name: str, rules, lang: str) -> str:
"""Extract the boss' instructions from the rules"""
rules_path = Path(rules) / lang / 'ai.md'
with open(rules_path, 'r', encoding='utf-8') as rf:
rules = rf.read()
p = f'#.*{name}.*\n'
ai_start = re.findall(p, rules)
ai_start = ai_start[0]
rules = rules[rules.find(ai_start) + len(ai_start):]
# rule taken from mdextractor
instructions = re.findall(r"```(?:\w+\s+)?(.*?)```", rules, re.DOTALL)
return instructions[0].strip()
def gen_startdeck_ul(map_def: dict, lang: str) -> str:
"""Generate the HTML for the hoverable startdeck listing"""
if 'start_deck_list' in map_def:
dl = map_def["start_deck_list"].splitlines()
else:
dl = ['3 misc/farmer']
s = ""
for card in dl:
card_fmt = ""
parts = card.split()
if len(parts) > 1:
card_fmt = f'{parts[0]} '
c = parts[1]
else:
c = card
def gen_link_target(c, lang):
return generate_card_hover_links.gen_link_to_cardlisting(
c, lang, path_prefix='../')
hlink = generate_card_hover_links.gen_hoverable_link(
c,
lambda _: c,
gen_link_target,
'../latex-build/',
lang,
placeholder_png_prefix='../')
card_fmt += hlink
s += f'\n{card_fmt}'
return f''
def main():
# pylint: disable=W0641
"""Generate a boss page"""
parser = argparse.ArgumentParser(description='generate a boss html page')
parser.add_argument('name',
help='the name of the boss',
choices=['kraken', 'tyrant'])
parser.add_argument('data', help='directory containing the card data')
parser.add_argument('maps', help='directoey containing the map data')
parser.add_argument('rules', help='directoey containing the rules')
args = parser.parse_args()
lang = 'en'
boss_name = NAMES[args.name]
desc = DESCS[args.name]
set_name = SETS[args.name]
boss_card = f'{set_name}/{name2file(boss_name)}'
map_name = name_to_map(boss_name)
map_path = Path(args.maps) / f'{map_name}.yml'
with open(map_path, 'r', encoding='utf-8') as map_file:
map_def = yaml.safe_load(map_file)
win_condition = wincon_desc(map_def)
start_deck = gen_startdeck_ul(map_def, lang)
draft = recommended_draft(map_def)
instructions = ai_instruction(boss_name, args.rules, lang)
print(Template(TEMPLATE).substitute(locals()))
if __name__ == '__main__':
main()