import json
import os
import sys
import random
def create_tiddler(title, content, tags=None):
tiddler = f"title: {title}\n"
if tags:
tiddler += f"tags: {' '.join(tags)}\n"
tiddler += "\n"
tiddler += content
return tiddler
def parse_population(pop_string):
return int(pop_string.replace('.', '').replace(',', ''))
def generate_city_link(burg, cells):
name = burg['name']
population = parse_population(str(burg.get('population', 0)))
size = min(max(int(population/1000), 15), 60) # Size between 15 and 60
seed = random.randint(1, 2000000000)
coast = 0
river = 0
try:
cell = cells[burg['cell']]
coast = 1 if cell.get('haven', 0) == 1 else 0
river = 1 if cell.get('river', 0) else 0
except (IndexError, KeyError):
pass
citadel = random.choice([0, 1])
urban_castle = random.choice([0, 1])
plaza = random.choice([0, 1])
temple = random.choice([0, 1])
walls = 1 if population > 5000 else random.choice([0, 1])
shantytown = random.choice([0, 1])
base_url = "https://watabou.github.io/city-generator/?"
params = {
"size": size,
"seed": seed,
"name": name.replace(" ", "+"),
"greens": 0,
"citadel": citadel,
"urban_castle": urban_castle,
"plaza": plaza,
"temple": temple,
"walls": walls,
"shantytown": shantytown,
"coast": coast,
"river": river,
"gates": -1
}
url = base_url + "&".join(f"{k}={v}" for k, v in params.items())
return f''
def generate_village_link(burg, cells):
name = burg['name']
population = parse_population(str(burg.get('population', 0)))
seed = random.randint(1, 2000000000)
river = ''
try:
cell = cells[burg['cell']]
if cell.get('river', 0):
river = 'river'
except (IndexError, KeyError):
pass
tags = ['organic' if random.random() < 0.7 else 'gridded',
'district' if random.random() < 0.3 else '',
'no square' if random.random() < 0.5 else 'square',
'isolated' if random.random() < 0.2 else '',
'farmland' if random.random() < 0.8 else '',
'dense' if random.random() < 0.3 else 'sparse',
'grove' if random.random() < 0.5 else '']
tags = [tag for tag in tags + [river] if tag] # Remove empty strings
base_url = "https://watabou.github.io/village-generator/?"
params = {
"seed": seed,
"name": name.replace(" ", "+"),
"pop": population,
"tags": ",".join(tags)
}
url = base_url + "&".join(f"{k}={v}" for k, v in params.items())
return f''
def generate_dungeon_link(name):
seed = random.randint(1, 2000000000)
possible_tags = [
"backdoor", "colonnades", "compact", "cramped", "deep", "dry", "dwelling",
"flat", "flooded", "large", "medium", "no secrets", "ordered", "round",
"single-level", "small", "spacious", "square", "string", "temple", "tomb",
"treasure", "wet", "winding"
]
num_tags = random.randint(2, 4)
tags = random.sample(possible_tags, num_tags)
base_url = "https://watabou.github.io/one-page-dungeon/?"
params = {
"seed": seed,
"name": name.replace(" ", "+"),
"tags": ",".join(tags)
}
url = base_url + "&".join(f"{k}={v}" for k, v in params.items())
return f''
def process_map_data(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
tiddlers = []
culture_lookup = {c['i']: c['name'] for c in data['pack']['cultures']}
state_lookup = {s['i']: s['name'] for s in data['pack']['states']}
cells = data['pack'].get('cells', [])
# General info
info = data['info']
general_info = f"""! Map Information
* Name: {info['mapName']}
* Size: {info['width']}x{info['height']}
* Seed: {info['seed']}
* Exported: {info['exportedAt']}
"""
tiddlers.append(create_tiddler("Map Information", general_info, ["MapData"]))
# Cultures
for culture in data['pack']['cultures']:
content = f"""! [[{culture['name']}]]
* Type: {culture.get('type', 'N/A')}
* Expansionism: {culture.get('expansionism', 'N/A')}
* Code: {culture.get('code', 'N/A')}
"""
tiddlers.append(create_tiddler(f"Culture: {culture['name']}", content, ["Culture", "MapData"]))
# States
for state in data['pack']['states']:
if state['i'] == 0: # Skip neutral state
continue
content = f"""! [[{state['name']}]]
* Type: {state.get('type', 'N/A')}
* Expansionism: {state.get('expansionism', 'N/A')}
* Capital: [[{state_lookup.get(state.get('capital'), 'Unknown')}]]
* Form: {state.get('form', 'N/A')}
* Full Name: {state.get('fullName', 'N/A')}
"""
tiddlers.append(create_tiddler(f"State: {state['name']}", content, ["State", "MapData"]))
# Burgs
for burg in data['pack']['burgs']:
if burg.get('i', 0) == 0: # Skip empty burg
continue
culture_name = culture_lookup.get(burg['culture'], 'Unknown')
state_name = state_lookup.get(burg['state'], 'Unknown')
population = parse_population(str(burg.get('population', 0)))
content = f"""! [[{burg['name']}]]
* Population: {population:,}
* Type: {burg.get('type', 'N/A')}
* Culture: [[{culture_name}]]
* State: [[{state_name}]]
"""
if population >= 1000:
content += "\n" + generate_city_link(burg, cells)
elif population > 0:
content += "\n" + generate_village_link(burg, cells)
tiddlers.append(create_tiddler(f"Burg: {burg['name']}", content, ["Burg", "MapData"]))
# Religions
for religion in data['pack']['religions']:
if religion['i'] == 0: # Skip no religion
continue
content = f"""! [[{religion['name']}]]
* Type: {religion.get('type', 'N/A')}
* Form: {religion.get('form', 'N/A')}
* Deity: {religion.get('deity', 'N/A')}
* Code: {religion.get('code', 'N/A')}
"""
tiddlers.append(create_tiddler(f"Religion: {religion['name']}", content, ["Religion", "MapData"]))
# Check for markers (which might include dungeon-like locations)
if 'markers' in data['pack']:
for marker in data['pack']['markers']:
if marker['type'] in ['ruins', 'landmark', 'cave']: # Add other relevant types
name = marker.get('name', f"{marker['type'].capitalize()} at ({marker['x']}, {marker['y']})")
content = f"""! [[{name}]]
* Type: {marker['type'].capitalize()}
* Location: x={marker.get('x', 'Unknown')}, y={marker.get('y', 'Unknown')}
* Description: {marker.get('description', 'No description available')}
{generate_dungeon_link(name)}
"""
tiddlers.append(create_tiddler(f"{marker['type'].capitalize()}: {name}", content, [marker['type'], "MapData", "Dungeon"]))
return tiddlers
def main():
if len(sys.argv) != 2:
print("Usage: python script_name.py ")
sys.exit(1)
file_path = sys.argv[1]
if not os.path.exists(file_path):
print(f"Error: File '{file_path}' not found.")
sys.exit(1)
tiddlers = process_map_data(file_path)
# Save tiddlers to files
output_folder = "tiddlers"
os.makedirs(output_folder, exist_ok=True)
for i, tiddler in enumerate(tiddlers):
file_name = f"tiddler_{i+1}.tid"
with open(os.path.join(output_folder, file_name), 'w', encoding='utf-8') as file:
file.write(tiddler)
print(f"Generated {len(tiddlers)} tiddlers in the '{output_folder}' directory.")
if __name__ == "__main__":
main()