Add kingdom, place, and region rollers

This commit is contained in:
RussellChamp committed 2021-07-24 21:55:53 -04:00
1 parent 749986c5c2
commit 08aa49d727
6 files changed
+113 -2

No files matched your search

+47
View File
@@ -0,0 +1,47 @@
<script lang="ts">
import { kingdoms } from "./data";
import * as _ from "lodash";
import { format as formatDate } from "date-fns";
export let rollResults: { value: string; timestamp: string }[] = [];
let kingdom = "arpad";
let category = "male";
let categories: string[];
let values: string[];
function addResult(result: string) {
rollResults = [{ value: result, timestamp: formatDate(new Date(), "P kk:mm:ss") }, ...rollResults];
}
function rollName(event: Event) {
addResult(_.sample(values));
}
$: categories = kingdoms[kingdom].categories;
$: values = kingdoms[kingdom][category];
</script>
<main>
<h1>
<select bind:value={kingdom}>
{#each Object.keys(kingdoms) as k}
<option value={k}>{kingdoms[k].description}</option>
{/each}
</select>
</h1>
<h2>{kingdoms[kingdom].subtitle}</h2>
<hr />
<select bind:value={category}>
{#each categories as c}
<option value={c}>{_.capitalize(c)}</option>
{/each}
</select>
<button type="button" class="btn btn-primary" on:click={rollName}>Roll {_.capitalize(category)}</button>
{#each rollResults as result}
<h3>{result.timestamp}: {result.value}</h3>
{/each}
</main>
<style>
</style>
+30
View File
@@ -0,0 +1,30 @@
<script lang="ts">
import { places } from "./data";
import * as _ from "lodash";
import { format as formatDate } from "date-fns";
import { bodgeString } from "./utils";
export let rollResults: { value: string; timestamp: string }[] = [];
function addResult(result: string) {
rollResults = [{ value: result, timestamp: formatDate(new Date(), "P kk:mm:ss") }, ...rollResults];
}
function roll(event: Event) {
let template = _.sample(places.templates);
addResult(bodgeString(template, places));
}
</script>
<main>
<h1>Random Places</h1>
<button type="button" class="btn btn-primary" on:click={roll}>Roll Region</button>
{#each rollResults as result}
<h3>{result.timestamp}: {result.value}</h3>
{/each}
</main>
<style>
</style>
+30
View File
@@ -0,0 +1,30 @@
<script lang="ts">
import { regions } from "./data";
import * as _ from "lodash";
import { format as formatDate } from "date-fns";
import { bodgeString } from "./utils";
export let rollResults: { value: string; timestamp: string }[] = [];
function addResult(result: string) {
rollResults = [{ value: result, timestamp: formatDate(new Date(), "P kk:mm:ss") }, ...rollResults];
}
function roll(event: Event) {
let template = _.sample(regions.templates);
addResult(bodgeString(template, regions));
}
</script>
<main>
<h1>Random Regions</h1>
<button type="button" class="btn btn-primary" on:click={roll}>Roll Region</button>
{#each rollResults as result}
<h3>{result.timestamp}: {result.value}</h3>
{/each}
</main>
<style>
</style>
+69
View File
@@ -0,0 +1,69 @@
export const kingdoms = {
arpad: {
description: 'The Kingdom of Arpad',
subtitle: 'Based loosely on Hungarian',
categories: ['male', 'female', 'steading', 'mount'],
male: ['Agoston', 'Arpad', 'Attila', 'Bognar', 'Denes', 'Edmond', 'Erno', 'Etele', 'Ferdinand', 'Florian', 'Geza', 'Gyula', 'Hugo', 'Karcsi', 'Konrad', 'Lazlo', 'Lukas', 'Marko', 'Miklos', 'Peti', 'Robi', 'Tamas', 'Ronold', 'Viktor', 'Zoltan',],
female: ['Abigel', 'Aliz', 'Amalia', 'Andrea', 'Aranka', 'Csilla', 'Edit', 'Erzebet', 'Gertrud', 'Greta', 'Iren', 'Kamilla', 'Lara', 'Ua', 'Lujza', 'Matild', 'Olga', 'Otilia', 'Parma', 'Roza', 'Terez', 'Tunda', 'Valeria', 'Vilma', 'Viola',],
steading: ['Aldott (Blessed)', 'Almahid (Applebridge)', 'Elesett (Fallen)', 'Feketz (Black Rock)', 'Godor (Pit)', 'Kelegaz (Eastford)', 'Kigyov (Snake Swamp)', 'Kiralokas (Queen\'s Castle)', 'Kiralsir (King\'s Grave)', 'Magziklar (Highcliff)', 'Mocsar (Fen)', 'Nagyvros (Hightown)', 'Okorm (Oxfield)', 'Orkfal (Orcwail)', 'Perov (Redwater)', 'Soterdo (Dark Wood)', 'Tehenvar (Cow Town)', 'Toron (Tower)', 'Torott (Ironhold)', 'Utolszer (Last Stand)', 'Valavolg (Greendale)', 'Vastar (Dwarf Watch)', 'Viz (Oxfield)', 'Volgyom (Valley)', 'Zoldom (Green Hill)',],
mount: ['Barat (Friend)', 'Barsony (Velvet)', 'Eclesem (Sweetheart)', 'Egatz (Skyfire)', 'Eso (Rain)', 'Fakyla (Torch)', 'Feketsor (Black Mane)', 'Felho (Cloud)', 'Fiotta (Fleet)', 'Gazda (Master)', 'Hold (Moon)', 'Igaslo (Dobbin)', 'Ijeda (Skittish)', 'Koszalo (Rambler)', 'Megmento (Savior)', 'Napfen (Sunshine)', 'Rozsa (Rose)', 'Szamla (Bill)', 'Szellem (Spritied)', 'Szeplok (Freckles)', 'Szerence (Lucky)', 'Tusko (Stumps)', 'Vad (Wild One)', 'Vihar (Storm)', 'Villam (Lightning)',]
},
oloru: {
description: 'Oloru, Sky-God\'s Home',
subtitle: 'Based loosely on Yoruba',
categories: ['male', 'female', 'steading', 'mount'],
male: ['Mibemi', 'Aboye', 'Megoke', 'Ayokunle', 'Babajide', 'Babatunde', 'Enitan', 'Femi', 'Kayin', 'Kayode', 'Lanre', 'Lekan', 'Mongo', 'Nwachukwu', 'Oban', 'Ogun', 'Olukayode', 'Oluwalanni', 'Oluwatoke', 'Onipede', 'Sijuade', 'Toben', 'Utiba', 'Zaki', 'Zoputan',],
female: ['Abeni', 'Me', 'Alaba', 'Bolanle', 'Bosade', 'Daraja', 'Fan', 'Gbemisola', 'Ife', 'Ige', 'Lewa', 'Mojisola', 'Monifa', 'Olufemi', 'Omolara', 'Oni', 'Orisa', 'Osa', 'Ronke', 'Shanum', 'Simisola', 'Titlayo', 'Yejide', 'Yewande', 'Zauna',],
steading: ['Asala Ilu (Desert Town)', 'Atijo ma (Old Fire)', 'Bajesia (Broken Banner)', 'Dudu Olomi (Blackmarsh)', 'Ebutte Meta (Three Ports)', 'Eodo (Snake River)', 'Esukale (Devil\'s Dinner)', 'Fadormi (Silver Spring)', 'Funfumi (Whitewater)', 'Gooluna (Gold Road)', 'Ijisofo (Storm Hollow)', 'Ikukenu (Dearth\'s Door)', 'Twin Ago (Faery Watch)', 'Jinibi (Far Place)', 'Oba Ile (King\'s Home)', 'Oduroke (Prayer Hill)', 'Ogbinibi (Farming Place)', 'Ogunibi (Battle Place)', 'Okanigi (One Tree)', 'Okutasibo (Stone Marker)', 'Olorusura (God\'s Treasure)', 'Olusajeki (Wizard\'s Keep)', 'Oluwakaji (Lord\'s Tomb)', 'Opolokuta (Many Stones)', 'Opoligi (Many Trees)'],
mount: ['Adiitu (Mystery)', 'Alayo (Happy)', 'Atale (Ginger)', 'Bilu (Bill)', 'Dudupatak (Dark Hoof)', 'Egun (Bramble)', 'Eniyan (Ember)', 'Esirun (Longshanks)', 'Fenuko (Kiss)', 'Funfungo (White Hair)', 'Gunirun (Longhair)', 'Imole (Bright)', 'Imole Uju (Bright Eye)', 'Ira (Rambler)', 'Itan (Story)', 'Iyebiye (Precious)', 'Lulu (Powder)', 'Nilera (Healthy)', 'Ogbo (Spotted)', 'Ogboju (Brave Heart)', 'Ojiji (Shadow)', 'Olooto (Faithful)', 'Orisa (Spring)', 'Orun (Heaven)', 'Sare (Flash)'],
},
valkoina: {
description: 'Valkoina, Land of White Iron',
subtitle: 'Based loosely on Finnish',
categories: ['male', 'female', 'steading', 'mount'],
male: ['Aatami', 'Armas', 'Arsi', 'Arvi', 'Eetu', 'Hannu', 'Heimo', 'Ilkka', 'Jorma', 'Kaapo', 'Kain', 'Kauko', 'Lari', 'Manu', 'Nuutti', 'Petri', 'Rairno', 'Reima', 'Risto', 'Sakari', 'Sampsa', 'Seppo', 'Taito', 'Terho', 'Vilppu',],
female: ['Aija', 'Ama', 'Ainikki', 'Heini', 'Ilona', 'Irja', 'Jaana', 'Kirsi', 'Maija', 'Marita', 'Miina', 'Mimmi', 'Minja', 'Mira', 'Naemi', 'Outi', 'Pirjo', 'Paivikki', 'Riikka', 'Saimi', 'Suoma', 'Suvi', 'Tuula', 'Vellamo', 'Virpi',],
steading: ['Etuvartio (Outpost)', 'Hopea Kaivos (Silver Mine)', 'Kalapunki (Fish Town)', 'Kivimurri (Stone Wall)', 'Maaginen (Magic)', 'Maki Linna (Hill Castle)', 'Merenranta (Seaside)', 'Metsastysniaat (Hunting Ground)', 'Mustakota (Black Hut)', 'Maenrinne (Hillside)', 'Paja (Forge)', 'Pienni Paikka (Low Place)', 'Pyha Paikka (Holy Place)', 'Rantakallio (Cliff)', 'Rikki (Broken)', 'Suo (Swamp)', 'Suosi (Favored)', 'Torni (Tower)', 'Turvapaikka (Refuge)', 'Uusipunki (New Town)', 'Valkoinen Kivi (Whitestone)', 'Valtaistuin (Throne)', 'Vapaanki (Free Town)', 'Vihrea Paikka (Green Place)', 'Viimeinen Koti (Last Home)',],
mount: ['Aave (Ghost)', 'Enkeli (Angel)', 'Haiva (Shadow)', 'Hopea (Silver)', 'Ilmavirta (Current)', 'Kesi (Tame)', 'Kestaba (Durable)', 'Kiukuinnen (Angry)', 'Lansiviima (West Wind)', 'Luotettava (Trusty)', 'Myrskyisa (Stormy)', 'Nokka (Bill)', 'Noyra (Humble)', 'Pitkanena (Longnose)', 'Saikki (Skittish)', 'Salama (Thunderbolt)', 'Sankani (Hero)', 'Sisko (sister)', 'Upea (Magnificent)', 'Vahva (Strong)', 'Valkoinen (White)', 'Varmaotteinen (Surefoot)', 'Vesuri (Billhook)', 'Vinha (Fast)', 'Ystava (Friend)',]
},
tamanarugan: {
description: 'The Tamanarugan Empire',
subtitle: 'Based loosely on Indonesian',
categories: ['male', 'female', 'steading', 'mount'],
male: ['Me', 'Mi', 'Amaziah', 'Ayokunle', 'Ary', 'Bambang', 'Bima', 'Budi', 'Darma', 'Dian', 'Eli', 'Gunardi', 'Hartono', 'Irwan', 'Lauwita', 'Manusama', 'Okan', 'Onesimus', 'Sammin', 'Tameem', 'Tanaya', 'Tirto', 'Wiryono', 'Yandi', 'Zebulun',],
female: ['Mah', 'Bulan', 'Candrakusuma', 'Devi', 'Hanjojo', 'Iman', 'Intan', 'Laksniini', 'Lestari', 'Limijanto', 'Marah', 'Megawati', 'Melati', 'Nadiyya', 'Ophrah', 'Ramza', 'Sapphiral', 'Selah', 'Suminten', 'Tamar', 'Tanjaya', 'Tjokro', 'Tri', 'Wangi', 'Zenze',],
steading: ['Airdib (Blessed Waters)', 'Airjinh (Clearwater)', 'Akhir Jalan (Road\'s End)', 'Berdarah (Bloody)', 'Bidang Bera (Fallow Field)', 'Candibula (Moon Temple)', 'Ditingga (Forsaken)', 'Emasungai (Gold Creek)', 'Gunung (Mountain)', 'Kayu (Timber)', 'Kuil (Temple)', 'Ladang Hijau (Greenfield)', 'Lembah (Valley)', 'Menjau (Far Away)', 'Ngarai (Canyon)', 'Persimpangan (Crossroads)', 'Puncakit (Hilltop)', 'Sungairac (}bison River)', 'Teibing (Cliffside)', 'Tempat Aman (Safe Place)', 'Tempat Istir (Rest Place)', 'Terkutuk (Cursed)', 'Tersentu (Touched by God)', 'Wahah (Oasis)', 'Yangtinggi (High Tower)',],
mount: ['Anginu (North Wind)', 'Api (Blaze)', 'Bakat (Felicity)', 'Bakti (Loyal)', 'Beruntung (Lucky)', 'Bilah (Blade)', 'Biru (Blue)', 'Gemetar (Quiver)', 'Guntur (Thunder)', 'Hidungi (Black Nose)', 'Janda (Widow)', 'Kakicerah (Bright Foot)', 'Kakiring (Light Foot)', 'Keriangan (Sunshine)', 'Kunang (Firefly)', 'Lapar (Hungry)', 'Murni (Pure)', 'Paruh (Bill)', 'Penebus (Avenger)', 'Penyelemat (Savior)', 'Prajurit (Warrior)', 'Rusak (Broken)', 'Satucep (Fast One)', 'Setia (True Heart)', 'Tahanla (Durable)',]
},
};
export const regions = {
templates: [
'[ADJECTIVE] [TERRAIN]',
'[TERRAIN] of (the) [NOUN]',
'The [TERRAIN] [ADJECTIVE]',
'[NOUN] [TERRAIN]',
'[NOUN]\'s [ADJECTIVE] [TERRAIN]',
'[ADJECTIVE] [TERRAIN] of (the) [NOUN]'
],
terrain: ['Bay', 'Bluffs', 'Bog', 'Cliffs', 'Desert', 'Downs', 'Dunes', 'Expanse', 'Fells', 'Fen', 'Flats', 'Foothills', 'Forest', 'Groves', 'Heath', 'Heights', 'Hills', 'Hollows', 'Jungle', 'Lake', 'Lowland', 'March', 'Marsh', 'Meadows', 'Moor', 'Morass', 'Mounds', 'Mountains', 'Peaks', 'Plains', 'Prairie', 'Quagmire', 'Range', 'Reach', 'Sands', 'Savanna', 'Scarps', 'Sea', 'Slough', 'Sound', 'Steppe', 'Swamp', 'Sweep', 'Teeth', 'Thicket', 'Upland', 'Wall', 'Waste', 'Wasteland', 'Woods',],
adjective: ['Ageless', 'Ashen', 'Black', 'Blessed', 'Blighted', 'Blue', 'Broken', 'Burning', 'Cold', 'Cursed', 'Dark', 'Dead', 'Deadly', 'Deep', 'Desolate', 'Diamond', 'Dim', 'Dismal', 'Dun', 'Eerie', 'Endless', 'Fallen', 'Far', 'Fell', 'Flaming', 'Forgotten', 'Forsaken', 'Frozen', 'Glittering', 'Golden', 'Green', 'Grim', 'Holy', 'Impassable', 'Jagged', 'Light', 'Long', 'Misty', 'Perilous', 'Purple', 'Red', 'Savage', 'Shadowy', 'Shattered', 'Shifting', 'Shining', 'Silver', 'White', 'Wicked', 'Yellow',],
noun: ['[NAME]', 'Ash', 'Bone', 'Darkness', 'Dead', 'Death', 'Desolation', 'Despair', 'Devil', 'Doom', 'Dragon', 'Fate', 'Fear', 'Fire', 'Fury', 'Ghost', 'Giant', 'God', 'Gold', 'Heaven', 'Hell', 'Honor', 'Hope', 'Horror', 'King', 'Life', 'Light', 'Lord', 'Mist', 'Peril', 'Queen', 'Rain', 'Refuge', 'Regret', 'Savior', 'Shadow', 'Silver', 'Skull', 'Sky', 'Smoke', 'Snake', 'Sorrow', 'Storm', 'Sun', 'Thorn', 'Thunder', 'Traitor', 'Troll', 'Victory', 'Witch',]
// * Choose a name appropriate to your setting; or, if you have a name list, roll one up. Dw THE MAP
};
export const places = {
templates: [
'The [PLACE]',
'The [ADJECTIVE] [PLACE]',
'The [PLACE] of (the) [NOUN]',
'(The) [NOUN]\'s [PLACE]',
'[PLACE] of the [ADJECTIVE] [NOUN]',
'The [ADJECTIVE] [NOUN]'
],
place: ['Barrier', 'Beach', 'Bowl', 'Camp', 'Cave', 'Circle', 'City', 'Cliff', 'Crater', 'Crossing', 'Crypt', 'Den', 'Ditch', 'Falls', 'Fence', 'Field', 'Fort', 'Gate', 'Grove', 'Hill', 'Hole', 'Hut', 'Keep', 'Lake', 'Marsh', 'Meadow', 'Mountain', 'Pit', 'Post', 'Ridge', 'Ring', 'Rise', 'Road', 'Rock', 'Ruin', 'Shrine', 'Spire', 'Spring', 'Stone', 'Tangle', 'Thmple', 'Throne', 'Tomb', 'Tower', 'Town', 'Tree', 'Vale', 'Valley', 'Village', 'Wall',],
adjective: ['Ancient', 'Ashen', 'Black', 'Bloody', 'Blue', 'Bright', 'Broken', 'Burning', 'Clouded', 'Copper', 'Cracked', 'Dark', 'Dead', 'Doomed', 'Endless', 'Fallen', 'Far', 'Fearsome', 'Floating', 'Forbidden', 'Frozen', 'Ghostly', 'Gloomy', 'Golden', 'Grim', 'Hidden', 'High', 'Iron', 'Jagged', 'Lonely', 'Lost', 'Low', 'Near', 'Petrified', 'Red', 'Screaming', 'Sharp', 'Shattered', 'Shifting', 'Shining', 'Shivering', 'Shrouded', 'Silver', 'Stalwart', 'Stoney', 'Sunken', 'Thorny', 'Thundering', 'White', 'Withered',],
noun: ['[Name]', 'Arm', 'Ash', 'Blood', 'Child', 'Cinder', 'Corpse', 'Crystal', 'Dagger', 'Death', 'Demon', 'Devil', 'Doom', 'Eye', 'Fear', 'Finger', 'Fire', 'Foot', 'Ghost', 'Giant', 'Goblin', 'God', 'Gold', 'Hand', 'Head', 'Heart', 'Hero', 'Hope', 'King', 'Knave', 'Knight', 'Muck', 'Mud', 'Priest', 'Queen', 'Sailor', 'Silver', 'Skull', 'Smoke', 'Souls', 'Spear', 'Spirit', 'Stone', 'Sword', 'Thief', 'Troll', 'Warrior', 'Water', 'Witch', 'Wizard',],
// * Choose a name appropriate to your setting; or, if you have a name list, roll one up.
};
+14
View File
@@ -0,0 +1,14 @@
import { sample } from 'lodash';
export function bodgeString(template: string, dict: Object) {
// The template string will look like "The [FOO] [BAR]"
// and we will replace "FOO" and "BAR" with options in dict
// like dict.foo and dict.bar
const tagMatcher = /\[([A-Z]+)\]/g;
return String(template).replace(tagMatcher, (match, key) => {
key = String(key).toLocaleLowerCase();
let replacement = dict.hasOwnProperty(key) && Array.isArray(dict[key]) ? sample(dict[key]) : match;
return replacement;
});
}