add some more cool rollers

This commit is contained in:
RussellChamp committed 2021-07-30 00:03:52 -04:00
1 parent c896a4b9d9
commit ec4617e036
9 files changed
+364 -123

No files matched your search

+1 -1
View File
@@ -1,3 +1,3 @@
Add Discovery, Danger, Details, NPC, and Dungeons roll tables Add NPC, and Dungeons roll tables
Put the rollers in their own accordion slots Put the rollers in their own accordion slots
Make everything look nicer Make everything look nicer
+8
View File
@@ -3,7 +3,10 @@
import KingdomRoller from "./rollers/KingdomRoller.svelte"; import KingdomRoller from "./rollers/KingdomRoller.svelte";
import RegionRoller from "./rollers/RegionRoller.svelte"; import RegionRoller from "./rollers/RegionRoller.svelte";
import PlaceRoller from "./rollers/PlaceRoller.svelte"; import PlaceRoller from "./rollers/PlaceRoller.svelte";
import DangerRoller from "./rollers/DangerRoller.svelte";
import DiscoveryRoller from "./rollers/DiscoveryRoller.svelte";
import FollowerRoller from "./rollers/FollowerRoller.svelte"; import FollowerRoller from "./rollers/FollowerRoller.svelte";
import DetailsRoller from "./rollers/DetailsRoller.svelte";
import Footer from "./componenets/Footer.svelte"; import Footer from "./componenets/Footer.svelte";
</script> </script>
@@ -17,10 +20,15 @@
<hr /> <hr />
<PlaceRoller /> <PlaceRoller />
<hr /> <hr />
<DangerRoller />
<hr />
<DiscoveryRoller />
<hr />
<CreatureRoller /> <CreatureRoller />
<hr /> <hr />
<FollowerRoller /> <FollowerRoller />
<hr /> <hr />
<DetailsRoller />
<Footer /> <Footer />
</main> </main>
+25
View File
@@ -0,0 +1,25 @@
<script lang="ts">
import * as _ from "lodash";
import { format as formatDate } from "date-fns";
import { Danger, rollDanger } from "./dangers";
export let rollResults: { value: Danger; timestamp: string }[] = [];
function roll(event: Event) {
rollResults = [{ value: rollDanger(), timestamp: formatDate(new Date(), "P kk:mm:ss") }, ...rollResults];
}
</script>
<main>
<h2>Random Danger</h2>
<button type="button" class="btn btn-primary" on:click={roll}>Roll Danger</button>
{#each rollResults as result}
<h4>
{result.timestamp}: {result.value.category} ({result.value.subcategory}): {result.value.description}
</h4>
{/each}
</main>
<style>
</style>
+102
View File
@@ -0,0 +1,102 @@
<script lang="ts">
import * as _ from "lodash";
import { format as formatDate } from "date-fns";
import { Button, Icon } from "sveltestrap";
import {
rollAbility,
rollActivity,
rollAdjective,
rollAge,
rollAlignment,
rollAspect,
rollCondition,
rollDisposition,
rollElement,
rollFeature,
rollMagicType,
rollNumAppearing,
rollOddity,
rollOrientation,
rollRuination,
rollSize,
rollTag,
rollTerrain,
rollVisibility,
} from "./details";
let rollResults: { category: string; value: string; timestamp: string }[] = [];
function addResult(item: { roll: number; description: string }) {
rollResults = [
{ category: item.constructor.name, value: item.description, timestamp: formatDate(new Date(), "P kk:mm:ss") },
...rollResults,
];
}
</script>
<main>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollAbility())}>Roll Ability</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollActivity())}>Roll Activity</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollAdjective())}>Roll Adjective</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollAge())}>Roll Age</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollAlignment())}>Roll Alignment</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollAspect())}>Roll Aspect</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollCondition())}>Roll Condition</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollDisposition())}>Roll Disposition</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollElement())}>Roll Element</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollFeature())}>Roll Feature</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollMagicType())}>Roll MagicType</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollNumAppearing())}>Roll NumAppearing</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollOddity())}>Roll Oddity</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollOrientation())}>Roll Orientation</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollRuination())}>Roll Ruination</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollSize())}>Roll Size</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollTag())}>Roll Tag</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollTerrain())}>Roll Terrain</Button>
</span>
<span class="btn">
<Button color="primary" on:click={() => addResult(rollVisibility())}>Roll Visibility</Button>
</span>
{#each rollResults as result}
<h4>{result.timestamp}: ({result.category}): {result.value}</h4>
{/each}
</main>
<style>
</style>
+25
View File
@@ -0,0 +1,25 @@
<script lang="ts">
import * as _ from "lodash";
import { format as formatDate } from "date-fns";
import { Discovery, rollDiscovery } from "./discoveries";
export let rollResults: { value: Discovery; timestamp: string }[] = [];
function roll(event: Event) {
rollResults = [{ value: rollDiscovery(), timestamp: formatDate(new Date(), "P kk:mm:ss") }, ...rollResults];
}
</script>
<main>
<h2>Random Discovery</h2>
<button type="button" class="btn btn-primary" on:click={roll}>Roll Discovery</button>
{#each rollResults as result}
<h4>
{result.timestamp}: {result.value.category} ({result.value.subcategory}): {result.value.description}
</h4>
{/each}
</main>
<style>
</style>
+2 -8
View File
@@ -144,17 +144,11 @@ export function rollTrapHazard(roll: number = random(1, 12)): string {
return ""; return "";
} }
// 1-3 1-2 1-2
// 4-8 34 3-5
// 9-11 5-7 6-8
// 12 divine 8-9 9
// 10-11 10-12 ambush
// ASPECT, VISIBILITY 12 ODDITY CREATURE responsible,
// ASPECT, VISIBILITY
export function rollDangerCreature(roll: number = random(1, 12)): Danger { export function rollDangerCreature(roll: number = random(1, 12)): Danger {
let danger = new Danger(roll, 0, 0, "creature"); let danger = new Danger(roll, 0, 0, "creature");
danger.creature = rollCreature(); danger.creature = rollCreature();
danger.subcategory = danger.creature.type + (danger.creature.subtype !== "" ? "/" + danger.creature.subtype : "");
danger.description = danger.creature.description;
return danger; return danger;
} }
+168 -114
View File
@@ -1,7 +1,9 @@
import { random, sample } from 'lodash'; import { random, sample } from 'lodash';
import { Creature, rollCreature } from './creatures'; import { Creature, rollCreature } from './creatures';
import { rollAlignment, rollElement, rollMagicType } from './details'; import { rollAlignment, rollElement, rollMagicType, rollOddity, rollTerrain } from './details';
import { rollDungeon } from './dungeons';
import { rollSteading, Steading } from './steadings'; import { rollSteading, Steading } from './steadings';
import { rollTreasure } from './treasures';
export class Discovery { export class Discovery {
constructor(public roll: number = 0, public subroll: number = 0, public specificroll: number = 0, public category: string = "", public subcategory: string = "", public description: string = "") { }; constructor(public roll: number = 0, public subroll: number = 0, public specificroll: number = 0, public category: string = "", public subcategory: string = "", public description: string = "") { };
@@ -47,7 +49,7 @@ export function rollUnnaturalFeature(roll: number = random(1, 12), subroll: numb
} }
export function rollArcaneFeature(roll: number = random(1, 12)): string { export function rollArcaneFeature(roll: number = random(1, 12)): string {
let feature = random(1, 3) == 3 ? sample([rollAlignment(), rollMagicType()]) + " " : ""; let feature = random(1, 3) == 3 ? sample([rollAlignment().description, rollMagicType().description]) + " " : "";
if (roll <= 2) { if (roll <= 2) {
feature += "residue"; feature += "residue";
@@ -127,71 +129,96 @@ export function rollNaturalFeature(roll: number = random(1, 12), subroll: number
} }
export function rollLair(roll: number = random(1, 12)): string { export function rollLair(roll: number = random(1, 12)): string {
// 1-2 LAIR if (roll <= 3) {
return "burrow";
} else if (roll <= 7) {
return "cave/tunnels";
} else if (roll <= 9) {
return "nest/aerie";
} else if (roll <= 10) {
return "hive";
} else if (roll <= 10) {
return `${rollRuinStructure()} ruins`;
}
// 1-3 burrow
// 4-7 cave/tunnels
// 8-9 nest/aerie
// 10 hive
// 1142 ruins (see STRUCTURE)
return ""; return "";
} }
export function rollObstacle(roll: number = random(1, 12)): string { export function rollObstacle(roll: number = random(1, 12)): string {
// 3-4 OBSTACLE if (roll <= 5) {
// 1-5 difficult ground return "difficult ground";
// (specific to terrain) } else if (roll <= 8) {
// 6-8 cliff/crevasse/chasm return "cliff/crevasse/chasm";
// 9-10 ravine/gorge } else if (roll <= 10) {
// 11-12 ODDITY return "ravine/gorge";
} else if (roll <= 12) {
return rollOddity().description;
}
return ""; return "";
} }
export function rollTerrainChange(roll: number = random(1, 12)): string { export function rollTerrainChange(roll: number = random(1, 12)): string {
// 5-7 TERRAIN CHANGE if (roll <= 4) {
// 14 limited area of an return `limited area of ${rollTerrain()}`;
// another TERRAIN type } else if (roll <= 6) {
// 5-6 crevice/hole/pit/cave return "crevice/hole/pit/cave";
// 7-8 altitude change } else if (roll <= 8) {
// 9-10 canyon/valley return "altitude change";
// 11-12 rise/peak in distance } else if (roll <= 10) {
return "canyon/valley";
} else if (roll <= 12) {
return "rise/peak in distance";
}
return ""; return "";
} }
export function rollWaterFeature(roll: number = random(1, 12)): string { export function rollWaterFeature(roll: number = random(1, 12)): string {
// 8-9 WATER FEATURE 10-11 LANDMARK 12 RESOURCE if (roll <= 1) {
// I spring/hotspring 1-3 water-based (water- 1-4 game/fruit/vegetable return "spring/hotspring";
// 2 waterfall/geyser fall, geyser, etc.) 5-6 herb/spice/dye source } else if (roll <= 2) {
// 3-6 creek/stream/brook 4-6 plant-based (ancient 7-9 timber/stone return "waterfall/geyser";
// 7-8 pond/lake tree, giant flowers, etc.) 10-11 ore (copper, iron, etc.) } else if (roll <= 6) {
// 9-10 river 7-10 earth-based (peak, 12 precious metal/gems return "creek/stream/brook";
// 11-12 sea/ocean formation, crater, etc.) } else if (roll <= 8) {
// SIZE, ............................... VISIBILITY. return "pond/lake";
} else if (roll <= 10) {
return "river";
} else if (roll <= 12) {
return "sea/ocean";
}
return ""; return "";
} }
export function rollLandmark(roll: number = random(1, 12)): string { export function rollLandmark(roll: number = random(1, 12)): string {
// 8-9 WATER FEATURE 10-11 LANDMARK 12 RESOURCE if (roll <= 3) {
// I spring/hotspring 1-3 water-based (water- 1-4 game/fruit/vegetable return "water-based (water-fall, geyser, etc.)";
// 2 waterfall/geyser fall, geyser, etc.) 5-6 herb/spice/dye source } else if (roll <= 6) {
// 3-6 creek/stream/brook 4-6 plant-based (ancient 7-9 timber/stone return "plant-based (ancient tree, giant flowers, etc.)";
// 7-8 pond/lake tree, giant flowers, etc.) 10-11 ore (copper, iron, etc.) } else if (roll <= 10) {
// 9-10 river 7-10 earth-based (peak, 12 precious metal/gems return "earth-based (peak, formation, crater, etc.)";
// 11-12 sea/ocean formation, crater, etc.) } else if (roll <= 12) {
// SIZE, ............................... VISIBILITY. return rollOddity().description
}
return ""; return "";
} }
export function rollResource(roll: number = random(1, 12)): string { export function rollResource(roll: number = random(1, 12)): string {
// 8-9 WATER FEATURE 10-11 LANDMARK 12 RESOURCE if (roll <= 4) {
// I spring/hotspring 1-3 water-based (water- 1-4 game/fruit/vegetable return "game/fruit/vegetable";
// 2 waterfall/geyser fall, geyser, etc.) 5-6 herb/spice/dye source } else if (roll <= 6) {
// 3-6 creek/stream/brook 4-6 plant-based (ancient 7-9 timber/stone return "herb/spice/dye source";
// 7-8 pond/lake tree, giant flowers, etc.) 10-11 ore (copper, iron, etc.) } else if (roll <= 9) {
// 9-10 river 7-10 earth-based (peak, 12 precious metal/gems return "timber/stone";
// 11-12 sea/ocean formation, crater, etc.) } else if (roll <= 11) {
// SIZE, ............................... VISIBILITY. return "ore (copper, iron, etc.)";
} else if (roll <= 12) {
return "precious metal/gems";
}
return ""; return "";
} }
@@ -215,44 +242,60 @@ function rollEvidence(roll: number = random(1, 12), subroll: number = random(1,
export function rollTracksSpoor(roll: number = random(1, 12)): string { export function rollTracksSpoor(roll: number = random(1, 12)): string {
if (roll <= 3) {
return "faint/unclear";
} else if (roll <= 6) {
return "definite/clear";
} else if (roll <= 8) {
return "multiple";
} else if (roll <= 10) {
return "signs of violence";
} else if (roll <= 12) {
return "trail of blood/other";
}
// 1-6 TRACKS/SPOOR
// 1-3 faint/unclear
// 4-6 definite/clear
// 7-8 multiple
// 9-10 signs of violence
// 11-12 trail of blood/other
// AGE, CREATURE responsible
// 44
return ""; return "";
} }
export function rollRemainsDebris(roll: number = random(1, 12)): string { export function rollRemainsDebris(roll: number = random(1, 12)): string {
if (roll <= 4) {
return "bones";
} else if (roll <= 7) {
return "corpse/carcass";
} else if (roll <= 9) {
return "site of violence";
} else if (roll <= 10) {
return "junk/refuse";
} else if (roll <= 11) {
return "lost supplies/cargo";
} else if (roll <= 12) {
return "tools/weapons/armor";
}
// 7-10 REMAINS/DEBRIS
// 1-4 bones
// 5-7 corpse/carcass
// 8-9 site of violence
// 10 junk/refuse
// 11 lost supplies/cargo
// 12 tools/weapons/armor
// AGE, VISIBILITY
return ""; return "";
} }
export function rollStashCache(roll: number = random(1, 12)): string { export function rollStashCache(roll: number = random(1, 12)): string {
// 1142 STASH/CACHE if (roll <= 3) {
// 1-3 trinkets/coins return "trinkets/coins";
// 4-5 tools/weapons/armor } else if (roll <= 5) {
// 6-7 map return "tools/weapons/armor";
// 8-9 food/supplies } else if (roll <= 7) {
// 10-12 treasure (p43) return "map";
} else if (roll <= 9) {
return "food/supplies";
} else if (roll <= 12) {
return rollTreasure();
}
return ""; return "";
} }
export function rollDiscoveryCreature(roll: number = random(1, 12)): Discovery { export function rollDiscoveryCreature(roll: number = random(1, 12)): Discovery {
let discovery = new Discovery(roll, 0, 0, "creature"); let discovery = new Discovery(roll, 0, 0, "creature");
discovery.creature = rollCreature(); discovery.creature = rollCreature();
discovery.subcategory = `${discovery.creature.type}/${discovery.creature.subtype}`;
discovery.description = discovery.creature.description;
return discovery; return discovery;
} }
@@ -273,9 +316,9 @@ export function rollStructure(roll: number = random(1, 12), subroll: number = ra
discovery.description = rollBurialReligiousStructure(specificroll); discovery.description = rollBurialReligiousStructure(specificroll);
} else if (subroll <= 8) { } else if (subroll <= 8) {
discovery.subcategory = "steading"; discovery.subcategory = "steading";
discovery.description = "steading";
discovery.specificroll = 0;
discovery.steading = rollSteading(); discovery.steading = rollSteading();
discovery.description = discovery.steading.description;
discovery.specificroll = 0;
} else if (subroll <= 12) { } else if (subroll <= 12) {
discovery.subcategory = "ruin"; discovery.subcategory = "ruin";
discovery.description = rollRuinStructure(specificroll); discovery.description = rollRuinStructure(specificroll);
@@ -285,70 +328,81 @@ export function rollStructure(roll: number = random(1, 12), subroll: number = ra
} }
export function rollEnigmaticStructure(roll: number = random(1, 12)): string { export function rollEnigmaticStructure(roll: number = random(1, 12)): string {
if (roll <= 4) {
return "earthworks";
} else if (roll <= 8) {
return "megalith";
} else if (roll <= 11) {
return "statue/idol/totem";
} else if (roll <= 12) {
return rollOddity().description;
}
// 912 STRUCTURE. Who built it? Is it connected to anything else they made nearby?
// 1 ENIGMATIC 2-3 INFRASTRUCTURE 4 DWELLING
// 1-4 earthworks 14 track/path 1-3 campsite
// 5-8 megalith 5-8 road 4-6 hovel/hut
// 941 statue/idol/totem 9-10 bridge/ford 7-8 farm
// 12 ODDITY 11 mine/quarry 9-10 inn/roadhouse
// AGE (1d844) SIZE (1d844) 12 aqueduct/canal/portal 1112 tower/keep/estate
// VISIBILITY CREATURE responsible (1d4.4) CREATURE responsible (1d4+4)
return ""; return "";
} }
export function rollInfrastructureStructure(roll: number = random(1, 12)): string { export function rollInfrastructureStructure(roll: number = random(1, 12)): string {
if (roll <= 4) {
return "track/path";
} else if (roll <= 8) {
return "road";
} else if (roll <= 10) {
return "bridge/ford";
} else if (roll <= 11) {
return "mine/quarry";
} else if (roll <= 12) {
return "aqueduct/canal/portal";
}
// 912 STRUCTURE. Who built it? Is it connected to anything else they made nearby?
// 1 ENIGMATIC 2-3 INFRASTRUCTURE 4 DWELLING
// 1-4 earthworks 14 track/path 1-3 campsite
// 5-8 megalith 5-8 road 4-6 hovel/hut
// 941 statue/idol/totem 9-10 bridge/ford 7-8 farm
// 12 ODDITY 11 mine/quarry 9-10 inn/roadhouse
// AGE (1d844) SIZE (1d844) 12 aqueduct/canal/portal 1112 tower/keep/estate
// VISIBILITY CREATURE responsible (1d4.4) CREATURE responsible (1d4+4)
return ""; return "";
} }
export function rollDwellingStructure(roll: number = random(1, 12)): string { export function rollDwellingStructure(roll: number = random(1, 12)): string {
if (roll <= 3) {
return "campsite";
} else if (roll <= 6) {
return "hovel/hut";
} else if (roll <= 8) {
return "farm";
} else if (roll <= 10) {
return "inn/roadhouse";
} else if (roll <= 12) {
return "tower/keep/estate";
}
// 912 STRUCTURE. Who built it? Is it connected to anything else they made nearby?
// 1 ENIGMATIC 2-3 INFRASTRUCTURE 4 DWELLING
// 1-4 earthworks 14 track/path 1-3 campsite
// 5-8 megalith 5-8 road 4-6 hovel/hut
// 941 statue/idol/totem 9-10 bridge/ford 7-8 farm
// 12 ODDITY 11 mine/quarry 9-10 inn/roadhouse
// AGE (1d844) SIZE (1d844) 12 aqueduct/canal/portal 1112 tower/keep/estate
// VISIBILITY CREATURE responsible (1d4.4) CREATURE responsible (1d4+4)
return ""; return "";
} }
export function rollBurialReligiousStructure(roll: number = random(1, 12)): string { export function rollBurialReligiousStructure(roll: number = random(1, 12)): string {
if (roll <= 2) {
return "grave marker/barrow";
} else if (roll <= 4) {
return "graveyard/necropolis";
} else if (roll <= 6) {
return "tomb/crypt";
} else if (roll <= 9) {
return "shrine";
} else if (roll <= 11) {
return "temple/retreat";
} else if (roll <= 12) {
return "great temple";
}
// 5-6 BURIAL/RELIGIOUS 7-8 STEADING 9-12 RUIN
// 1-2 grave marker/barrow Roll on STEADING table 1-2 Ias'raucruRE (1d646)
// 3-4 graveyard/necropolis 3-4 DWELLING (1d844)
// 5-6 tomb/crypt 5-6 BURIAIJREIJGI0us
// 7-9 shrine (1d8+4)
// 1041 temple/retreat 7-8 STEADING (00+2)
// 12 great temple 9-12 DUNGEON (pp60-61)
// CREATURE responsible (1d4+4), CREATURE responsible (1d444),
// ALIGNMENT, ASPECT AGE (1d8.4), RUINATION,
// VISIBILITY
return ""; return "";
} }
export function rollRuinStructure(roll: number = random(1, 12)): string { export function rollRuinStructure(roll: number = random(1, 12)): string {
if (roll <= 2) {
return `${rollInfrastructureStructure(random(1, 6) + 6)} ruins`;
} else if (roll <= 4) {
return `${rollDwellingStructure(random(1, 8) + 4)} ruins`;
} else if (roll <= 6) {
return `${rollBurialReligiousStructure(random(1, 8) + 4)} ruins`;
} else if (roll <= 8) {
return `${rollSteading(random(1, 10) + 2).description} ruins`;
} else if (roll <= 12) {
return `${rollDungeon().printDescription()} ruins`;
}
// 5-6 BURIAL/RELIGIOUS 7-8 STEADING 9-12 RUIN
// 1-2 grave marker/barrow Roll on STEADING table 1-2 Ias'raucruRE (1d646)
// 3-4 graveyard/necropolis 3-4 DWELLING (1d844)
// 5-6 tomb/crypt 5-6 BURIAIJREIJGI0us
// 7-9 shrine (1d8+4)
// 1041 temple/retreat 7-8 STEADING (00+2)
// 12 great temple 9-12 DUNGEON (pp60-61)
// CREATURE responsible (1d4+4), CREATURE responsible (1d444),
// ALIGNMENT, ASPECT AGE (1d8.4), RUINATION,
// VISIBILITY
return ""; return "";
} }
+27
View File
@@ -0,0 +1,27 @@
export class Dungeon {
size: Size;
ruination: string;
builder: string;
function: string;
themes: string[];
discovery: string;
danger: string;
printDescription() {
return `${this.size.size} ${this.builder} ${this.function}`;
}
}
export class Size {
constructor(public size: string = "", public themes: string = "", public areas: string = "") { };
}
export function rollDungeon(): Dungeon {
// TODO: Add the who dungeon thing
let dungeon = new Dungeon();
dungeon.size = new Size("huge");
dungeon.builder = "dwarves";
dungeon.function = "mine";
return new Dungeon();
}
+6
View File
@@ -0,0 +1,6 @@
import { random } from "lodash";
export function rollTreasure(roll: number = random(1, 18)) {
// TODO: Scan the treasures table
return "treasure";
}