Skip to content

Instantly share code, notes, and snippets.

@stonehippo
Last active November 22, 2025 17:58
Show Gist options
  • Select an option

  • Save stonehippo/44bc1a25f87cc857edbec2c99c49f400 to your computer and use it in GitHub Desktop.

Select an option

Save stonehippo/44bc1a25f87cc857edbec2c99c49f400 to your computer and use it in GitHub Desktop.
Solo play oracles from the STORYTELLERS RPG, implemented in Python.

Storytellers RPG Solo Play Oracles

This is a Python implementation of the solo play oracles from the STORYTELLERS RPG by Candlenaut. See the solo play info, pp. 59-60, for details.

Basic Oracle

The basic oracle answers yes/no questions. The oracle rolls two d6 dice, the first designated the Yes die, and the second the No die. If the Yes die is higher than the No die, the oracle has answered "yes". It's lower, the oracle has answered "no". A tie indicates that the oracle is uncertain. The difference between Yes and No how true the response is

from oracles import basic_oracle
basic_oracle()
# if the oracle rolled a 4 on Yes and 2 on No, the return would be ("yes","4","2","2")

Scale Oracle

The scale oracle is a basic oracle that tells you the scale or impact of a thing. It gives a value from 1 to 6. The higher the number, the greater the impact, distance, or other parameter.

from oracles import scale_oracle
scale_oracle()

Advanced Oracle

The advance oracle generate a triplet of three words to spark ideas or answer more comples questions, such as motivations or context.

from oracles import advanced_oracle
advanced_oracle()
'''
Python implementation of the solo play oracles from the Storytellers RPG.
'''
from random import choice
# define some dice rollers. For more on this, ee https://gist.github.com/stonehippo/b6a2cae0deecca1f86bc5ef316546f61
d6, d20 = [range(1, sides + 1) for sides in (6, 20)]
def roll(die, count=1):
return tuple(choice(die) for _ in range(count))
def basic_oracle():
yes, no = roll(d6,2)
if yes > no:
answer = "yes"
elif yes < no:
answer = "no"
else:
answer = "uncertain"
return (answer, yes, no, abs(yes-no))
def scale_oracle():
return roll(d6)[0]
column_1 = (
"Growth",
"Strength",
"Bond",
"History",
"Control",
"Protection",
"Innocence",
"Family",
"Expedition",
"Home",
"Alliance",
"Secret",
"Prison",
"Possession",
"Burden",
"Truth",
"Message",
"Existence",
"Stranger",
"Nature"
)
column_2 = (
"Life",
"Device",
"Energy",
"Time",
"Law",
"Knowledge",
"Tradition",
"Ritual",
"Freedom",
"Guilt",
"Authority",
"Mastery",
"Survival",
"Balance",
"Belief",
"Religion",
"Power",
"Duty",
"Culture",
"Memory"
)
column_3 = (
"Legacy",
"Safety",
"Defense",
"Trade",
"Technology",
"Creation",
"Art",
"Discovery",
"Destiny",
"Justice",
"Peace", # this is 'Piece' in the PDF, but I think that's a typo
"Conflict",
"Community",
"Trust",
"Wisdom",
"Rebellion",
"Separation",
"Cure",
"Danger",
"Disaster"
)
def _lookup(column):
return column[roll(d20)[0] - 1]
def advanced_oracle():
return (_lookup(column_1), _lookup(column_2), _lookup(column_3))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment