Take on Rules 2026-04-21T20:25:32-04:00 Jeremy Friesen[email protected] https://takeonrules.com/ https://takeonrules.com/ <![CDATA[Osprey on the Lake]]> https://takeonrules.com/2026/04/21/osprey-on-the-lake/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < personal < poetry

Summary: Seeing nature unfold before me.

, mid-day I saw a large bird land and perch on a tree across the lake. I grabbed our binoculars, stepping onto the porch to identify the bird. Was it a bald eagle or an osprey or something else. No white head and I the white shoulder markings and recognized an osprey.

Paddling on our shore were two Canada geese and their six goslings. The osprey took flight and we quickly searched “Do osprey eat other birds” and received a yes. The goslings were possible prey.

As if on answer to the question, the osprey took flight, above the lake and began circling. The hunt, or so we thought, was on. The geese I think took notice and ushered their goslings to safety. The osprey continued circling for awhile then left our line of site.

Then, an hour before the golden hour, I took our two border collies out to play frisbee and to search for morel mushrooms in our yard. After the first throw, I again noticed an osprey circling the lake. I abandoned my search for morels and distractedly threw a few more times with the dogs. All while the osprey circled.

Then another joined the field, both giving space for each other to hunt. Likely a mated pair. I noticed a flash of ones shoulder whites, and the circling changed. The dive and strike had begun.

I moved for a better view. That moment when it crashed noisily on the lake sparked my heart and soul. I had seen before one plunge and emerge, but never heard the clap of an osprey breaking the surface.

As quick as it struck it emerged victorious, I think, as it made its way towards where osprey have nested in prior years. As the first exited the stage, the second began its dive. Crash and splash, emerging without prize, flying low along the water, then climbing again to circle.

I called to Jenny, to come and look. And we watched as the osprey dove again. Crash then rose, circled a bit, and dove once more. On its fourth try it retired towards its mate, it had given up or succeeded in capturing something small enough.

Osprey circles near
Goslings led on safe retreat
Fish loses this one

Reply by Email

]]>
2026-04-21T20:25:32-04:00 2026-04-21T20:25:32-04:00
<![CDATA[Local Library Programming]]> https://takeonrules.com/2026/02/27/local-library-programming/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < personal > < poetry >

Summary: Establishing intentional plans for personal enrichment.

As I understand it, in mid- the topic of personal curriculum started emerging on TikTok. Jenny, then working at a small local library, sought to add a Personal Curriculum segment to the library programming. The schedule up until the turn of the year was packed.

So they scheduled a session for January; but due to inclement weather, postponed the inaugural session until .

There were five attendees with Jenny facilitating. She introduced the concept with a presentation, a mix of examples and videos, highlighting the breadth of what others had considered as well as how to write a curriculum:

  • topic
  • learning objectives and tangible outputs
  • secondary outcomes
  • potential resources
  • schedule of activity

Jenny emphasized that the topic should be of interest, one in which you have some basic knowledge, and identifying a goal to achieve. Everything else was in support of enriching a personal interest.

Jenny gave her example: Color Theory. With a list of weekly activities. And a final outcome.

The others of us shared our ideas:

  • Bassoon reed making
  • Mushroom foraging
  • Either ancient history or true crime

For myself, I came with a list of possibilities:

  • poetry
  • standing up a media server
  • reading chonky books
  • doodling

And while we were discussing our topics, I began narrowing mine. I knew that I wanted to avoid technology for my first foray; after all I’m on a computer all day. I looked to my other topics and narrowed poetry to haiku and chonky books to Don Quixote; with secondary sources.

We had a great shared conversation, I asked the young patron about their interest in ancient history. And knowing she was a young mother, made mention of Dan Carlin’s Hardcore History. Something she could listen to in those moments between parenting.

As the session wound down I settled on a 4 week exploration of Haiku. We also agreed to meet in 4 weeks to check-in and report back.

STARTED A Personal Curriculum: Haiku

  • Outcome: Assemble a small haiku zine (8 or so)
  • Secondary Outcomes: Read classic haikus. Read on writing haiku.
  • Timeframe: 4 weeks

Throughout:

  • Write with pen and pencil on paper; one goal is to disconnect from my computer.
  • Always carry a pen and paper.
  • Seek to always carry Haiku and read from, instead of glancing at my phone.

Schedule:

  • Week 1: Read «How to Haiku» by Bruce Ross.
  • Week 2: Read introduction and excerpts of Sōseki Natsume’s Collected Haiku translated by Erik R. Lofgren
  • Week 3: Review past haiku’s written to find samples.
  • Week 4: Assemble hand-written haiku zine pamphlet, reproduce 20 copies.

The Morning After

When we got home from the library, I started reading How to Haiku. I wrote a few in pencil. We went to bed early, and around 5am I found myself waking, a short poem at the tip of my thought. Sidenote Not some Kubla Kahn, just myself parsing out a haiku.

I needed to capture that moment:

quiet early morn
commuter cars growl on by
old dog curls on chair

From which I found myself awake, and thinking of Don Quixote, and of Borges and Me by Jay Parini, and of Terry Gilliam; and a dawn readying itself to burst upon a still frozen lake.

My phone rattled, I had a before the dawn text from my father. he had sold off his entire wood working setup; he’s moving and downsizing. His whole life, fixing things has been his identity, and the wood shop his means of becoming. The morning text being a follow up, saying that he has had to get comfortable with reading during daylight hours.

Reply by Email

]]>
2026-02-27T08:12:48-05:00 2026-02-27T08:12:48-05:00
<![CDATA[«A Poetry Handbook» by Mary Oliver]]> https://takeonrules.com/2026/02/10/a-poetry-handbook-by-mary-oliver/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < poetry >

Summary: A brief reflection on a #poetry #handbook that I just read.

I’ve been reading more poetry, and scratching out efforts at poetry. I finished reading A Poetry Handbook by Mary Oliver. A compact guide into the writing and reading poetry; describing the basics, presenting a few examples, and most importantly giving bits of advice.

  1. If one must choose between reading poetry and attending a workshop, choose reading. (Though consider a workshop)
  2. A poem must be complete; that is it contains all that it must and is atomic, though may reference/allude to other things.
  3. The process of writing a poem is vulnerable to interruptions; flow state is a good thing.
  4. Revise and revisit.

In reading, I haven’t gotten beyond subvocalization. That is I say “in my mind” the words I’m reading. This, I think, helps in my read of poetry. Because I can almost imagine the breaths. But subvocalizing poems, when I have the option to read aloud, does a disservice. I don’t feel the flip of my tongue, nor the breath leaving.

Mary Oliver’s A Poetry Handbook provides this and more, delving into philosophy. I read the following and my mind cracked open:

Literature is the apparatus through which the world tries to keep intact its important ideas and feelings.

―Mary Oliver, A Poetry Handbook

Yes, this definition of literature excludes the reality of oral tradition, which I think is unfortunate. But a quick substitution of “story” for “literature” and we hit at the heart of things. And by cracked open, I read that passage as putting words to a known truth.

We write, narrate, and tell tales to convey that which we find important. And the act of re-telling and reading and listening is engaging in that “preservation.”

Poetry is my present fascination, wrestling with the sound, shape, and shadow of words. The books that bind these poems I keep close, filling the cherry bookshelf made by my father. Throughout the days, I pull a book out, thumb to a random page, and read a poem or three. With 7 or so linear feet of poetry, I find this to be a wonderful and sustaining grazing.

Reply by Email

]]>
2026-02-10T19:33:35-05:00 2026-02-10T19:33:35-05:00
<![CDATA[Prairie Poor]]> https://takeonrules.com/2026/02/08/prairie-poor/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < poetry >

Summary: A #poem reflecting on land and language.

My ancestors carried with them a lowland language,
From flat Frisia to the banks of Motława,
later amongst the golden fields of Ukraine,
then, with treasured seed in tow, the prairie of Nebraska.

Listening to my father, aunt, and uncle speak
Their low German, I hear my poverty revealed.
This past year, I recorded them one night;
Visions of zweibach and veranika danced in my head.
Their accents and cadences invoking
the first of three spirits visiting that old miser,

They were telling tales of yore,
dredging as only the Dutch might,
laughter from the depths of half an age ago.
Mischief that spoke of simpler times
(At least that’s what nostalgia would have me say).

As paternal lineage goes,
I’m first generation English-as-a-first-language.
Raised on the prairie, fed a new language too,
I see now, as second generation, a privation
Of language and lore. I learned the simple new words
of these not-so-simple folk.

Yet, old Scrooge and I, we’re much the same.
With our impoverished lexicon, near bankrupt
as we fail to name much more
beyond accounts and ledgers.
Were that I had the native tongue,
I might know more than corn fields and cricks.

These days I read poetry, hoping to learn the song
I know still and once sung. Reading Heaney, Shepherd,
and many others, I feel again my poverty.

I’m too new to this language
(though it is my only one),
the one not of my father,
but of a land fed on red, black, and brown blood.
A language (and land) that borrows, robs, and steals.

An’ I wonder, to which (or whom) am I cognate?
Me, a settler adrift on these amber waves.

Reply by Email

]]>
2026-02-08T10:22:07-05:00 2026-02-08T10:22:07-05:00
<![CDATA[Inverness]]> https://takeonrules.com/2026/02/06/inverness/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < poetry >

Summary: A #poem of #winter reflection, of painting a ceiling not in white but in a bold color, and a mind thus adrift.

I sit and ponder this canopy of evergreen,
Painted the long year prior;
Bringing a sense of summer amongst the trees,
Even in this stick white winter
amidst the perma-cloud,
Muting all color, joy, and—dare I say—hope.

Inverness, the green so named.

Echoing

That city atop the British isles.
A place I’ve never been, save for
a neighboring Shepherd’s tale;
One of dancing amongst mountains,
alive and free.

Yet I am rooted here, and travel seems so distant
In this wintry discontent.
When brother stands vigil over encroaching ice.
And I call to those who will not listen.

Here, amidst this canopy,
tree that I am; Witness
to a forest fell-tide. Unmoving,
yet not unfeeling, waiting for:

an axe to fall,
a wedge to split,
a fire to lick.

Knowing a paralytic dread as winter grinds on,

biting,
  clawing,
    raging.

The loon heralds a coming spring when:

Ice will melt,
Buds will burst,
Leaves will unfurl,

And life anew shall begin again,
as hope arriving; a gentle morning glow,
Bathing this room of mine,
Where I sit each day,
And ponder.

Reply by Email

]]>
2026-02-06T15:11:24-05:00 2026-02-06T15:11:24-05:00
<![CDATA[Serendipity and Verse]]> https://takeonrules.com/2026/02/05/serendipity-and-verse/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < personal >

Summary: It is through epics and poetry that I my home.

I’ve been enjoying narrative verse, poetry, myths, and legends. , I finished Yvain by M.T. Anderson. I felt the thrill of story and primacy of archetype. I found the artistic style deeply textured and enchanting. It interwove with my reading of The Once and Future King and The Book of Merlyn; adding to my personal Arthurian canon.

While perusing a local independent bookstore, I picked up Fierce Fairytales by Nikita Gill. I started reading, and felt the invocation—an echo of Genesis. From which Gill offers clusters poems related to a story; each of those poems digging behind the fairy tale to offer perspective of the characters in the story.

Not to absolve the wicked step-mother, but to walk with her on a path—one of myriad—that she traversed in donning that mantle. Or, more correctly, one in which the mantle was forced upon her by the systems of oppression: poverty and misogyny.

This lead me to look for additional books by Nikita Gill—I added a few to my “shopping list.” Then I stumbled upon an interview with Gill, and learned of their collaboration with Anoushka Shankar on Sister Susannah.

I gave a listen; I very much loved it. I read more about the song’s origins (‘Sister Susannah’: Shattering the Silence Around Abuse). And then spent time listening to a few other of Anoushka Shankar’s songs. Now I’m neck deep in sitar music; feeling such freshness move through me. A fresh yet ancient force, that draws upon the ancient echoes I also heard in Geek Sublime by Vikram Chandra.

Years ago, a friend of mine, now since departed, journeyed to England. His goal: to see something truly ancient. He started on a well trod tourist path, and at the first destination, he took it in and then asked the locals, “Where might I find something even more ancient?”

They obliged and pointed him down a path. Upon arrival, he took it in, then asked these other locals again where to find the ancient. And they pointed him further. He followed the local memory until he arrived at an ancient forge, here he felt the world of myth touching upon him.

That story hung with me, because of my friend leaning on local memory, one that could continue to point further back in time.

That is what I feel when I read these epics and retellings; most often in verse. I feel the author touching on something far older. And both bringing it forward in time and transporting me backwards.

This is the magic of The Hobbit; in which we start in the familiar and prosaic, then soon find ourselves on an adventure with fairy tale logic.

It is present in Heaney’s The Tollund Man. And in a way Rukeyser’s The Soul and Body of John Brown; itself not ancient nor regarding antiquity. Yet as much a part of mythology, due to the complexities and nuance of the titular character.

And then there is Borges; one who writes of myth, riddled with lies most true.

Reply by Email

]]>
2026-02-05T19:25:06-05:00 2026-02-05T19:25:06-05:00
<![CDATA[Does One Call Oneself a Poet?]]> https://takeonrules.com/2026/01/17/does-one-call-oneself-a-poet/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < poetry >

Summary: A bit of introspection and a #haiku. In part a post to say I&rsquo;m still here.

I wonder, what makes one a poet? And perhaps not the general case, but the self-centered case.

Am I a poet?

I write poetry. I am an adept conjurer of analogies and metaphors. I have an above average command of the English language. I write poems, scratching out words to find the best (in the moment) forms, sometimes returning to prior phrases.

At our local library, next week we’re kicking off a Personal Curriculum series. I had been considering poetry as mine—though ham radio just joined the consideration.

My bedroom bookshelf is packed with poetry. On occasion—though not often enough—I find myself grabbing a book and reading a few poems. Life pours from these works, bathing me in warmth.

We were driving back home, and as we were passing a wooded area that chirps and whistles in spring from the tree frogs. At that moment, while driving in silence, Jenny asked me what I was thinking about, I responded: frogs.

That spot along with the neighbors saying that a large bullfrog had come out of hibernation earlier this month; when we had 55° Fahrenheit weather (and rain).

Which inspired the following haiku:

Amidst icy woods
New moon hiding snow and branch
In the thaw, frog song.

Reply by Email

]]>
2026-01-17T12:26:19-05:00 2026-01-17T12:26:19-05:00
<![CDATA[Bolstering Against the Permeating LLM Language]]> https://takeonrules.com/2026/01/07/bolstering-against-the-permeating-llm-language/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < personal > < poetry > < responses

Summary: On being human, embracing the analogue, and working through private deep introspection.

From Being creative requires taking risks:

Children will say stuff that will shock you, because you can see where they are coming from, but it’s just not the thing you say. They’re not yet collapsed. But we are collapsed. We end up revisiting the same thoughts. We end up saying more and more of the same stuff, and the learning rates go down.

This requires further thinking and discussion. Why? These last few days I’ve been actively and assertively deconstructing and mitigating deeply internalized patriarchy—staring at a 50th birthday a half-a-year away; feeling the reverberations of pivoting from ever darkening days to those of light’s return.

I’m also reading further in the blog post, and fucking hate the permeation of semantics describing Large Language Model (LLM 📖) phenominon that are then projected onto the act of being human; I’m not a fucking computer nor mathematical model.

I am a human being, always arriving into a present in which I seek orientation, wonder, beauty, poetry, and art.

A present in which I’m busy practicing to write better haiku, Emacs 📖 Lisp 📖 , love notes to my wife, and read chunky books.

Over the course of the last 9 days, I have watched only a fragment of something on “television.” Most everything else I’ve pursued is tactile: a book printed on paper, dishes in the sink (so many), colored pencils scribbling on paper, and more. (I have had days of work in which I needed to clicky-clacky on the keyboard to make the code behave).

So, when I read a post in which “the human” condition is mapped to the language of LLMs , I think “bro, get out, touch some dirt, read an older book of fiction, and watch a sunrise.” We are each, and all, more than that lingual effort to collapse us into an ever simplifying model.

Warmth of mid-winter
I fear you most as herald
Of hell-blasted hate.

Reply by Email

]]>
2026-01-07T18:46:59-05:00 2026-01-07T18:46:59-05:00
<![CDATA[Fallacy of Record]]> https://takeonrules.com/2026/01/01/fallacy-of-record/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < responses > < technologies

Summary: Exhuming a reflection I wrote in October around “leaving a record.”

We cross the line, who pushed who over?
It doesn’t matter to you, it matters to me
We’re cut adrift, but still floating
I’m only hanging on to watch you go down, my love.

— U2, *So Cruel*

In Printed is not the Point, I encountered the following quote:

What record are we leaving if the printed word is not the most interesting creative work being developed?
Naomi Duguid

I question that the “printed word“ has ever been much of “the most interesting creative work being developed.” Consider the interesting and ephemeral [saucy] puppet show, street protest, poetic recitation, dance routine, or concert. Though perhaps “work” is carrying the burden? As in the toil expressed? Or the concept enclosed?

But then again, the word “interesting” is one of those “eye of the beholder” words. The printed word’s super power is one of slow moving transport: across time and space. Ideas bound and encoded for transport—of atomic symbols creating molecules with which we create a transport of cultural DNA.

I read the lamenting question as one of the shift from analog to digital; in which digital preservation requires far more resources of active attention than analog—which itself requires more space than digital. As though there is some universal constant that expresses the cost of sustaining memory: in physical space, archival processes and systems, and/or calories to maintain biological brains—though can a book or hard-drive be called “memory?”

And then to turn to “What record are we leaving,” implying a collective and coordinated effort. To join in the grandeur of cultural preservation and heritage; to belong to a line—constructed/fabricated—connecting from antiquity to the days ahead. We carry that ever accumulating baggage, as though an honor, and one we hope to add a little and bestow upon successive generations. Do we demand accretion? or is composting adequate?

One record we will leave is the death rattle of capitalism Sidenote Perhaps Kyriarchy 📖 is more appropriate? and its escalating ravages against the world. Perhaps those ravages shall transform and pass into myth, a Scylla and Charybdis of parched earth, nuclear waste, acidic oceans, and eroded wastelands. How might one notice any other record?

Reply by Email

]]>
2026-01-01T10:02:43-05:00 2026-01-01T10:02:43-05:00
<![CDATA[The Books of 2025]]> https://takeonrules.com/2025/12/31/the-books-of-2025/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < personal > < reading

Summary: Not all of the books of the year, but an overview of the ones that stuck out.

This year, my partner and I are participating as a team in our local library reading “challenge.” The goal is for the team to read 100 books. Thusfar we’ve read 150 or so books; me having read about 50 and my partner over a 100.

What have been the stand-out books? And more importantly, why? Not all of these are ones that I very much enjoyed (e.g. a 4 out of 4 rating), but they are ones that stuck with me.

  • Aflame by Pico Iyer: a flowing memoir of solitude and retreat so as to re-e**ngage with the world. To find energy and capacity in quiet communion with both others and nature.
  • Annihilation by Jeff Vandermeer: we listened to this audiobook throughout a single day. And found ourselves wondering what was happening. The richness of language and imagery paired with withheld information drew me in. Leaving me both wondering while also knowing that I won’t find out. Much like I won’t know how “climate change” or “history” ends .
  • Babbitt by Sinclair Lewis: a book written in the 1920s that seems almost immediately applicable to 2020s; plus this was part of a community read, so I had a fantastic conversation with community members.
  • Bea Wolf by Zach Weinersmith: I love reading Beowulf, each time a new translation. And this one, while not a translation, is instead a retelling that brought me absolute child-like joy.
  • Being Peace by Thich Nhat Hanh: it had been years since I read a Thich Nhat Hanh book, and this was a natural read after Aflame.
  • Black and Female by Tsitsi Dangarembga: these essays hit home the absolute vileness of apartheid, as applied in South Africa, but also in the Jim Crow era that the present regime is angling to restore and expand. As an added bonus, Dangarembga was the first Zimbabwean author that I’ve read.
  • The City of Saints and Madmen by Jeff VanderMeer: the language and imagery of Annihilation captivated me. And one day, while waiting for my partner to finish perusing the bookstore we were visiting, I cracked open the Ambergrisomnibus, and started reading Draden, in Love. And found myself immediately transported into the chaotic streets of Ambergris.
  • The Creative Act by Rick Rubin: a book to keep on hand, flip through and find a bit of inspiration.
  • The Dispossessed by Ursula K. Le Guin: a speculative work on how community can move past capitalism, yet also understand that it would be hard to fully escape it, while also knowing that governance is invariably a political and personal affair.
  • The Empusium by Olga Tokarczuk: Tokarczuk writes to expand and enlarge the past through which we invariably construct and sustain an ever narrowing view.
  • The Fellowship of the Ring by J.R.R. Tolkien: a passion project, in which Phil Dragash narrated and voice acted a production of the The Fellowship of the Ring.
  • Freedom is a Constant Struggle by Angela Y. Davis: articulating so clearly that Palestine, the military industrial complex, petro-carceral state feed into each other; and have created the conditions in which we find the United States.
  • Hope in the Dark by Rebecca Solnit: I had trepidation about this; it felt as though I might be thinking “Oh Sweet Summer Child” of the grim days of yore. But I instead found this collection of essays a timeless reminder that unpredictable positive events and situations arise from times of tribulation and uncertainty. Importantly, Solnit provides receipts for past achievements and successes that we may have forgotten.
  • I Who Have Never Known Men by Jacqueline Harpman: a philosophical dystopian read in which one invariably will think about purpose and meaning of life.
  • James by Percival Everett: a great book in its own right, that delivers a fantastic additional narrative perspective to the events told by Huck Finn (himself unreliable). This book did double duty, rekindling memories of reading The Adventures of Huckleberry Finn and seeing Big River.
  • The Life of Poetry by Muriel Rukeyser: such lyricism and exposure to aspects of history and thought lost in our march to forget the lessons of facing and overcoming fascism.
  • The Little Book of Solitude by Joost Joossen: a collection of mini-biographies and quotes that lead me to to Pico Iyer’s Aflame; it was also amongst the first library books I checked out from our local library.
  • Men Explain Things to Me by Rebecca Solnit: this has been sitting on my shelf, partially read, and I sat down to read it. Solnit always provides a reminder of the misogynistic structures and cultural behaviors that course through the world in which we live.
  • Open Socrates by Agnes Callard: as with other philosophy books, this is one I’ve added a hefty dose of marginalia. Considering how to better approach love, death, and politics.
  • Piranesi by Susanna Clarke: this one will sit with me for a very long-time. Slow-moving, playing with memory. I highly recommend reading this in close proximity to I Who Have Never Known Men.
  • The Player of Games by Iain M. Banks: an interesting bit of speculation on how a complex game can be used to constrain a society, and how the rules and language of the game impose upon the society. And how diversity can be a mighty advantage.
  • Prairie Songs by Lauren Friesen: my uncle wrote this, and I learned a little bit more about him and my family history. And my uncles poem about surviving polio ending with: “and beside my bed \ they spun, \ an iron cocoon.” Goosebumps.
  • Pranksters vs. Autocrats by Srdja Popovic and Sophia A. McClennen: I have recommended this book to many people looking for hope and action. Evidence is that humor wins.
  • Slowness by Milan Kundera: this was one of my question books, due to its quote: “There is a secret bond between slowness and memory, between speed and forgetting.” I found this book for a reasonable price and read it that evening.
  • Spring, Summer, Asteroid, Bird by Henry Lien: on a lark I picked this up, and it opened my awareness to other narrative structures, ones that I now look for as a change of pace.
  • This is How You Lose the Time War by Amal El-Mohtar and Max Gladstone: Jenny borrowed this via inter-library loan; read it and thought I might enjoy it. She was right. I appreciate the myth building through symbols; the language of thread, needle felting, and sleeping beauty (herself a wolf hungry for little red riding hood).
  • To Fight Against this Age by Rob Riemen: I Farenheit 451liked the title and subtitle, and found a philosophical memoir that reinforced the need for humanism and conversation.
  • The Trial by Franz Kafka: Having never read much of Kafka, yet knowing the foundational nature of his work, then reading references in To Fight Against this Age and eyeing Kafka on the Shore, I had to read it. And I was hooked. Forget Cthulhu, existential dread is mindless bureaucracy.
  • Upright Women Wanted by Sarah Gailey: not normally something I’d read, but this let the Wild West tropes do quite a bit of work, and then subvert those tropes and tell a unique story about resistance.
  • We by Yevgeny Zamyatin: I love 1984, Brave New World, and Farenheit 451; and We is the spiritual ancestor of those stories. The dystopian over-reaching state in which so much energy must be spent to sustain the systems of oppression and coercion. It felt a bit derivative, but as it came before, must be viewed with a freshness of thought relative to others.
  • When No Thing Works by Norma Kaelokū Wong: an important reminder that it is not enough to resist, but to imagine a future in which we are along moving along the path of restoration and restitution. Naming what that future looks like—in details. The dishes one brings to celebrations, the evidence of how improvements manifest.

Then synthesizing all of these things: subvert tropes as this fosters further imagination of possibility. And from there, action becomes possible.

Reply by Email

]]>
2025-12-31T08:15:42-05:00 2025-12-31T08:15:42-05:00
<![CDATA[The Books of 2025]]> https://takeonrules.com/2025/12/31/the-books-of-2025/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < personal > < reading >

Summary: Not all of the books of the year, but an overview of the ones that stuck out.

This year, my partner and I are participating as a team in our local library reading “challenge.” The goal is for the team to read 100 books. Thusfar we’ve read 150 or so books; me having read about 50 and my partner over a 100.

What have been the stand-out books? And more importantly, why? Not all of these are ones that I very much enjoyed (e.g. a 4 out of 4 rating), but they are ones that stuck with me.

  • Aflame by Pico Iyer: a flowing memoir of solitude and retreat so as to re-engage with the world. To find energy and capacity in quiet communion with both others and nature.
  • Annihilation by Jeff Vandermeer: we listened to this audiobook throughout a single day. And found ourselves wondering what was happening. The richness of language and imagery paired with withheld information drew me in. Leaving me both wondering while also knowing that I won’t find out. Much like I won’t know how “climate change” or “history” ends .
  • Babbitt by Sinclair Lewis: a book written in the 1920s that seems almost immediately applicable to 2020s; plus this was part of a community read, so I had a fantastic conversation with community members.
  • Bea Wolf by Zach Weinersmith: I love reading Beowulf, each time a new translation. And this one, while not a translation, is instead a retelling that brought me absolute child-like joy.
  • Being Peace by Thich Nhat Hanh: it had been years since I read a Thich Nhat Hanh book, and this was a natural read after Aflame.
  • Black and Female by Tsitsi Dangarembga: these essays hit home the absolute vileness of apartheid, as applied in South Africa, but also in the Jim Crow era that the present regime is angling to restore and expand. As an added bonus, Dangarembga was the first Zimbabwean author that I’ve read.
  • The City of Saints and Madmen by Jeff VanderMeer: the language and imagery of Annihilation captivated me. And one day, while waiting for my partner to finish perusing the bookstore we were visiting, I cracked open the Ambergrisomnibus, and started reading Draden, in Love. And found myself immediately transported into the chaotic streets of Ambergris.
  • The Creative Act by Rick Rubin: a book to keep on hand, flip through and find a bit of inspiration.
  • The Dispossessed by Ursula K. Le Guin: a speculative work on how community can move past capitalism, yet also understand that it would be hard to fully escape it, while also knowing that governance is invariably a political and personal affair.
  • The Empusium by Olga Tokarczuk: Tokarczuk writes to expand and enlarge the past through which we invariably construct and sustain an ever narrowing view.
  • The Fellowship of the Ring by J.R.R. Tolkien: a passion project, in which Phil Dragash narrated and voice acted a production of the The Fellowship of the Ring.
  • Freedom is a Constant Struggle by Angela Y. Davis: articulating so clearly that Palestine, the military industrial complex, petro-carceral state feed into each other; and have created the conditions in which we find the United States.
  • Hope in the Dark by Rebecca Solnit: I had trepidation about this; it felt as though I might be thinking “Oh Sweet Summer Child” of the grim days of yore. But I instead found this collection of essays a timeless reminder that unpredictable positive events and situations arise from times of tribulation and uncertainty. Importantly, Solnit provides receipts for past achievements and successes that we may have forgotten.
  • I Who Have Never Known Men by Jacqueline Harpman: a philosophical dystopian read in which one invariably will think about purpose and meaning of life.
  • James by Percival Everett: a great book in its own right, that delivers a fantastic additional narrative perspective to the events told by Huck Finn (himself unreliable). This book did double duty, rekindling memories of reading The Adventures of Huckleberry Finn and seeing Big River.
  • The Life of Poetry by Muriel Rukeyser: such lyricism and exposure to aspects of history and thought lost in our march to forget the lessons of facing and overcoming fascism.
  • The Little Book of Solitude by Joost Joossen: a collection of mini-biographies and quotes that lead me to to Pico Iyer’s Aflame; it was also amongst the first library books I checked out from our local library.
  • Men Explain Things to Me by Rebecca Solnit: this has been sitting on my shelf, partially read, and I sat down to read it. Solnit always provides a reminder of the misogynistic structures and cultural behaviors that course through the world in which we live.
  • Open Socrates by Agnes Callard: as with other philosophy books, this is one I’ve added a hefty dose of marginalia. Considering how to better approach love, death, and politics.
  • Piranesi by Susanna Clarke: this one will sit with me for a very long-time. Slow-moving, playing with memory. I highly recommend reading this in close proximity to I Who Have Never Known Men.
  • The Player of Games by Iain M. Banks: an interesting bit of speculation on how a complex game can be used to constrain a society, and how the rules and language of the game impose upon the society. And how diversity can be a mighty advantage.
  • Prairie Songs by Lauren Friesen: my uncle wrote this, and I learned a little bit more about him and my family history. And my uncles poem about surviving polio ending with: “and beside my bed \ they spun, \ an iron cocoon.” Goosebumps.
  • Pranksters vs. Autocrats by Srdja Popovic and Sophia A. McClennen: I have recommended this book to many people looking for hope and action. Evidence is that humor wins.
  • Slowness by Milan Kundera: this was one of my question books, due to its quote: “There is a secret bond between slowness and memory, between speed and forgetting.” I found this book for a reasonable price and read it that evening.
  • Spring, Summer, Asteroid, Bird by Henry Lien: on a lark I picked this up, and it opened my awareness to other narrative structures, ones that I now look for as a change of pace.
  • This is How You Lose the Time War by Amal El-Mohtar and Max Gladstone: Jenny borrowed this via inter-library loan; read it and thought I might enjoy it. She was right. I appreciate the myth building through symbols; the language of thread, needle felting, and sleeping beauty (herself a wolf hungry for little red riding hood).
  • To Fight Against this Age by Rob Riemen: I liked the title and subtitle, and found a philosophical memoir that reinforced the need for humanism and conversation.
  • The Trial by Franz Kafka: Having never read much of Kafka, yet knowing the foundational nature of his work, then reading references in To Fight Against this Age and eyeing Kafka on the Shore, I had to read it. And I was hooked. Forget Cthulhu, existential dread is mindless bureaucracy.
  • Upright Women Wanted by Sarah Gailey: not normally something I’d read, but this let the Wild West tropes do quite a bit of work, and then subvert those tropes and tell a unique story about resistance.
  • We by Yevgeny Zamyatin: I love 1984, Brave New World, and Farenheit 451; and We is the spiritual ancestor of those stories. The dystopian over-reaching state in which so much energy must be spent to sustain the systems of oppression and coercion. It felt a bit derivative, but as it came before, must be viewed with a freshness of thought relative to others.
  • When No Thing Works by Norma Kaelokū Wong: an important reminder that it is not enough to resist, but to imagine a future in which we are along moving along the path of restoration and restitution. Naming what that future looks like—in details. The dishes one brings to celebrations, the evidence of how improvements manifest.

Then synthesizing all of these things: subvert tropes as this fosters further imagination of possibility. And from there, action becomes possible.

Reply by Email

]]>
2025-12-31T08:12:40-05:00 2025-12-31T08:12:40-05:00
<![CDATA[Yuletide]]> https://takeonrules.com/2025/12/30/yuletide/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < personal > < poetry >

Summary: I can think of no better time than that between Winter Solstice and New Year’s Day.

Myth is a tear in the fabric of reality, and immense energies pour through these holy fissures. Our stories, our poems, are rips in this fabric as well, however slight.

―Jay Parini, Borges and Me

Yule-tide, the twelve days between Winter Solstice and New Year’s Day. those days coincide with my (paid) time off of work.

I stumbled a bit, thinking what the common weekday name I would give . It felt very much like Sunday. Much as did. Perhaps there’s that sense of holiness that burns through these yule-lit days.

Not holy as we might conflate with communion and sermons, but in those fissures. In which a true light shines through, that of communal memory and myths constructed around firelight.

I think to those gatherings at Grandma and Grandpa Friesen’s house. We’d be there together for what felt like several days. Time made little sense, as the 15 of us stuffed into that small ranch house in Nebraska. Laughter tumbling amidst Low German and English.

The younger cousins and I would play at grandpa’s pool table. Endless hours in those pre-electronic entertainment console days. Later I’d learn that it was a shoddy thing, warped and uneven. But in those days, the green felt felt enchantingly rich.

In later years, there were those days in which we’d pack up after Christmas and drive to Vermont. Late nights of laughter as we’d play fishbowl around the hearth. Yule-tide, is for gathering. For catching glimpses of the sun’s return. Sharing in that joy of togetherness, when the world outside, at this latitude at least, is grinding ice and howling wind.

Now, I gather with Jenny and our dogs Lacey and Ollie. Me writing (poetry and Lisp, as though there were a difference) and Jenny reading. Lacey curled up beside Jenny and Ollie wedged into his lounging chair. We’ll go outside for a bit, and stomp through the fresh powder of yesterday.

But Yule-tide is now a fragile thing, at least in these States of America. Each year, I claim some of my employer benefits: paid time off. Yet not all of my children have benefits that provide paid time off. Others must budget time off for visiting their fractured families.

Where is the sacred?

I want to write “sacrificed to the maw of capitalism”, but that is an indirection. Capitalists, lets name them not their system, demand our time and talent to extract and enrich themselves. The sacred, cultural memories and echoes, is something to be shattered, rended, and in their flattening-mind, forgotten and/or perverted. Replaced with consumption.

Yule-tide, yule-tide, a wave of night
passing through mists of time
waxing toward growing light.

This yule-tide let pop the cork
and decant drought of warding warmth,
and celebrate family and friends
and home and hearth.

Reply by Email

]]>
2025-12-30T10:30:07-05:00 2025-12-30T10:30:07-05:00
<![CDATA[Lake Effect Snow]]> https://takeonrules.com/2025/12/29/lake-effect-snow/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < poetry >

Summary: A winter poem celebrating snow.

Out windows, white flakes
Dancing, twirling, falling hide
All past nearest shore—

What darkening winter keeps
Curtains drawn our secrets near.

Reply by Email

]]>
2025-12-29T16:40:38-05:00 2025-12-29T16:40:38-05:00
<![CDATA[That Time In Between]]> https://takeonrules.com/2025/12/29/that-time-in-between/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < personal > < poetry >

Summary: On that sacred time during winter dark.

Folly is to name the days between Christmas and New Years.
There’s hardly enough daytime to warrant such.
Instead, let us embrace these long winter’s night;
Where story presses against the glass,
  breath hot, frozen fog forming crystalline lace.
No logs split nor tallow lit, that once did dance.
Instead, light sits steady and flat,
And the only flicker that of picture panes.
This is a moment when little sense does our time make.

I embrace Romjul, that period between Christmas/Boxing Day and New Year’s Eve. For most of my life, the time between Christmas and New Years has been one of holiday. That is: not working for my employer, but instead spending time with friends (both present and tome-bound).

Reply by Email

]]>
2025-12-29T08:27:55-05:00 2025-12-29T08:27:55-05:00
<![CDATA[Serializing Somewhat Large Emacs Alists]]> https://takeonrules.com/2025/12/23/serializing-somewhat-large-emacs-alists/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < emacs < programming

Summary: Creating a bespoke process to dump and load data in manageable chunks.

In my Mythic Bastionland Emacs package I’ve been populating an Emacs 📖 alist with information related to the state of the map for my Forged from the Worst campaign.

I have 14 top-level keys in that alist: barriers, curses, dwellings, escalations, hazards, holdings, known-hexes, locations, monuments, myth, omens-revealed, rivers, ruins, and sanctums. Most of those entries have 3 to 6 associated elements, with rivers, locations, and barriers having more.

Along the way, I found that when I went to persist the alist to a file, I was getting trailing ... characters in a few places. The process was truncating my data. Which meant data loss when I went to load the persisted alist.

No worries, due to the nature of the package, I could rebuild the map data and it would be true to the state of play (though the non-revealed information would be different). However, I wanted to solve this persistence issue.

I spent an evening searching and exploring the use of prin1 and (setopt eval-expression-print-level nil) but Emacs seemed to insist that when I went to print the full variable out, it would truncate.

So I set about writing out chunks of the data. Then reassembling those chunks.

Writing the Data Out in Chunks

Below is my mythic-bastionland-map-write function available at Sourcehut. What the code does is:

  • Create a feature called mythic-bastionland-map, which we’ll write as a loadable package.
  • For each association in the map:
    • Chunk that data into groups of 8 and write each sub-group into a variable with name based on the association’s car and incremental suffix.
    • Store those incremental variable names in another variable.
  • Store the name of each association’s car rendered in yet another variable.
(defun mythic-bastionland-map-write (&optional map)
  "Write the MAP into a re-loadable format.

Emacs is truncating things so I need to jump through some hoops."
  (setq mythic-bastionland-map (or map (mythic-bastionland-map)))
  (with-temp-buffer
    (let ((features nil))
      (insert ";;; mbm ---  -*- lexical-binding: t -*-\n")
      (cl-loop for (feature . values) in mythic-bastionland-map do
               (let (;; In my experience somewhere around 10 elements
                     ;; and we start seeing truncation.  So let's be
                     ;; under that.
                     (size 8)
                     ;; This will be a list of the variable names that,
                     ;; when reassembled, will be the values.
                     (segment-names nil))
                 (cl-pushnew feature features)
                 (dotimes (i (+ 1 (/ (length values) size)))
                   (let (;; Name of variable that will hold a segment
                         ;; of the values.
                         (segment-name
                          (format "mbm--data-%s-%d" feature i)))
                     ;; Track this segment's variable name.
                     (push (intern segment-name) segment-names)
                     ;; Grab a subset of values for this segment and
                     ;; store it in the variable with name that is the
                     ;; value of the segment.
                     (insert (format "(defvar %s '" segment-name))
                     ;; Yes yes, this is likely less effecient as I'm
                     ;; always reading the list.  But it was quick
                     (prin1 (seq-take
                             (nthcdr (* i size) values) size)
                            (current-buffer))
                     (insert ")\n")))
                 ;; Now track all of the segment names associated with
                 ;; this feature.
                 (insert (format "(defvar mbm--data-%s-list '" feature))
                 (prin1 segment-names (current-buffer))
                 (insert ")\n")))
      ;; Last track all feature names so we may reassemble them.
      (insert (format
               "(defvar mbm--features \"%s\")\n"
               (mapconcat (lambda (e) (format "%s" e))
                          features " "))))
    (insert "(provide 'mbm)\n"
            ";;; mythic-bastionland-map.el ends here\n")
    (write-file mythic-bastionland-map-state-file)))

Reading the Data Back In

I use the mythic-bastionland-map-read to reassemble that segmented data. When done I call (unload-feature 'mbm) to remove the fragmented variables, leaving only the mythic-bastionland-map variable.

(defun mythic-bastionland-map-read ()
  "Load the unduly complicated encoding of the map."
  (unless (f-file-p mythic-bastionland-map-state-file)
    (user-error "No file found at %s"
                mythic-bastionland-map-state-file))
  (require 'mbm mythic-bastionland-map-state-file)
  (let ((map nil))
    ;; Our serialized map has a variable mbm--map-features; we use that
    ;; to start our loading of data.
    (dolist (map-feature (s-split " " mbm--features))
      (let* ((values nil)
             ;; The name of each of the variables that houses a segment
             ;; of the feature's data.
             (segment-names
              (symbol-value
               (intern (format "mbm--data-%s-list" map-feature)))))
        (dolist (segment-name segment-names)
          (dolist (value (symbol-value segment-name))
            (cl-pushnew value values)))
        ;; Now that we've reassembled (in reverse order) the values for
        ;; this feature, add them to the underlying map.
        (cl-pushnew (cons (intern map-feature) values) map)))
    ;; With all features and their values loaded, we assign the map to
    ;; something more durable.
    (setq mythic-bastionland-map map))
  ;; And last clean up all those variables we used for reassembly.
  (unload-feature 'mbm))

Perhaps Another Way?

It seems a bit odd that this is how I could reliably read and write the data. And I’m open for other approaches. However, I felt it worth sharing this bespoke method as it might help others.

If you know of another way, please contact me.

Structured Data and Iterating

While working on my Mythic Bastionland Emacs package, I have been very pleased with the malleability of the alist, and their ease of testing; in part because of the Read-eval-print loop (REPL 📖) but also because of the nature of Lisp.

I can easily grab a portion of the syntax tree and reliably mash on that in the REPL . Think about other programming languages, if you want to use a portion of the inner logic of a function, what steps do you need to take to use it?

Due to the primacy of the alist there are fantastic functions for working with them.

Segmenting the data was a bit odd, I was hoping to simply dump the alist to a file. However, with the problems I encountered, I started exploring other options. Maybe write to JSON and load from JSON. But then I would’ve needed to establish a mechanism for describing that transformation.

update

Reader’s rallied and submitted some options. The following refactor works in place of the previous implementations.

(defun mythic-bastionland-map-write (&optional map)
  "Write the MAP into a re-loadable format."
  (setq mythic-bastionland-map (or map (mythic-bastionland-map)))
  (with-temp-buffer
    (let ((print-level nil)
          (print-length nil))
      (prin1 mythic-bastionland-map (current-buffer)))
    (write-file mythic-bastionland-map-state-file)))

(defun mythic-bastionland-map-read ()
  "Load the persisted map."
  (if-let ((file mythic-bastionland-map-state-file))
      (if (f-file-p file)
          (progn
            (setq mythic-bastionland-map
                  (read (with-temp-buffer
                          (insert-file-contents file)
                          (buffer-string))))
            (message "Loaded mythic-bastionland-map from %s" file))
        (user-error "No file found at %s"
                    mythic-bastionland-map-state-file))
    (user-error "'mythic-bastionland-state-file is nil")))

Reply by Email

]]>
2025-12-23T08:47:49-05:00 2025-12-23T08:47:49-05:00
<![CDATA[Game Procedures as Bridges from Potential to Actual]]> https://takeonrules.com/2025/12/21/game-procedures-as-bridges-from-potential-to-actual/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < reflections < rpgs

Summary: Considering the great utility of procedures and tables as a means of developing the fictive world, passing from potential to actual.

I’ve been playing a solo game of Mythic Bastionland 📖 , tracking the story in my Forged from the Worst series. This morning Ep 4: Mythic Bastionland Solo Campaign rolled through my feed.

And I noted they were using different procedures. Which lead me to Tension Tables and Faction Development in Mythic Bastionland. Very interesting and I can see cribbing that encounter table procedure.

In one of the comments, Jack Edward wrote:

It’s funny, I’m always curious about how to work other kinds of play into Mythic Bastionland — particularly other themes and dimensions of play — just reworking the random encounter table to include more stuff is one of the most elegant ways I’ve seen of doing it!

And this is something to poke at more. At the end of Forged From the Worst: Session 5, Sir Beatrice learned of The Lich. I the referee and you the reader, had known that the Lich was likely going to enter into the fiction. Yet, as the player of Sir Beatrice, it was news to me.

The fiction is what happens at the table: revealed random encounters, actions taken, words spoken, tests passed and failed etc. The potential is the random encounter tables, rumor tables, morale checks, reaction rolls, and backstory. And we use procedures, implicit and explicit, to transform potential into actual.

In that moment between potential and actual, we gain glimpses. When a referee and player negotiate task, intent, and the consequences of success and failure, the game enters a liminal space. There is visibility into the potentiality of something that will not occur (the failure consequences when the test succeeds).

Likewise, when a player has visibility into the random tables (and procedures for using them) they have access to more than what is…they know what can be.

Swapping Procedures

At a few sessions into Mythic Bastionland , I’m looking at the Gnomestones’s random event table. The table and procedures mean that their game will involve more consideration for weather and factions.

I find the ability to swap out subsystems a compelling reason for these analogue games. And as these procedures are performed “by hand” there’s an incentive for them to be concise. Which helps in their portability.

Don’t like that your players are always escalating to combat? Introduce the Reaction Roll? See that the players are always leaning into the Reaction Roll because of high charisma? Require that in order to gain the Charisma bonus the first action of the encounter must be Parlay; which might leave them ill-prepared for an attack.

I think it is important that you shouldn’t significantly change procedures between sessions…unless an Age has passed. As in, if you are fast forwarding to a time in which world events would change, consider the swap out.

Thinking of Mythic Bastionland, how might we start shifting towards the “Into the Odd” era (if we wanted to)? What procedures might change? How might I alter my random tables or procedures to move in that direction?

Or how might I give more focus to the Factions? I’ve created the lever in the procedures for entering a Holding, and when the current Age ends, perhaps I’ll adjust the procedures to reflect the game I’m seeing or wishing to further explore.

Building Forged from the Worst

These days, I eschew writing back story, instead spending time having that emerge in play. I might seed situations, but most often that’s through random procedures.

In Forged from the Worst I did spend time rolling up relationships and conflicts, but only in service of seeding an Escalation Table for one of the relationships. And I’m doing that in a just in time manner.

Below is the relationship graph. It’s one where I’ve thought a bit about each relationship, marveling at some of those random rolls and how they compounded on each other. But only the Escalation Table for the relationship between Prentise and Yelena carries any fictive reality; in that I’ve now once rolled on it.

Relationship graph between Holdings and Rulers generated in Session 5 of Forged from the Worst.

A relationship graph which was detailed in a prior post.  For more information read the image caption to link to the text description of the relationships.

Further, in solo-play it seems absurd to spend much time on back story. If I’m doing that, I might as well write a novel.

Conclusion

I first started playing Dungeons & Dragons in Second Edition era. It was a time when backstory and story plot became vogue. Amongst my local gaming groups, and those that ran games, I remember derision towards random encounters — self-included. Yet now, I consider much of this required for the types of games I’ll enjoy running.

First, when I’m running a game, I too want to experience surprise and wonder. With procedures generating random situations, I’m surprised first in the situation I present and then in the response of the players. Which I find far more enjoyable than presenting the next plot point then being surprised by the player responses.

Reply by Email

]]>
2025-12-21T11:07:13-05:00 2025-12-21T11:07:13-05:00
<![CDATA[Forged From the Worst: Session 5]]> https://takeonrules.com/2025/12/21/forged-from-the-worst-session-5/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < rpgs > < sessions Series: < Forged from the Worst

Summary: In which the Knights learn of a blood feud and yet another Myth plaguing the realm.

Three horses, two with riders and the smaller other riderless. Both riders armed and armored. A bow shot away, they see the eastern gatehouse of Castle Steimfluss, its squat towers gleaming proud, gates open with portcullis raised, as though a mouth feed a feast of peddlers and vagabonds. The gate house protects the bridge that cross over the river to the fortress that rises from the island in the middle of the river.

Beatrice thinks upon the trial of the morning. Her sense of purpose restored after Weydlyn’s victory over the Sergeants of the Judge. Then her surprise at finding her possessions restored and waiting outside the checkered courtyard. Her mace, radiant armor, polished mirror, and her horse.

She grins thinking of Light’s Return, once name unknown, yet no longer; now tethered to her blue roan horse. She leans forward, scratching her horse’s neck and whispers to the horse, “Worry not, as forewarned, I shall not name you. Though I wonder, my friend, what power lurks within your name.”

Before being within bow shot, they both dismount and lead their horses forward, while battered and bruised and carrying news, they are not harbingers riding in on the wings of haste.

A guard in front of the gates takes note of the two heavily armed knights approaching, quickly raises then lowers his head just a bit then waits for the knights to draw within a suitable speaking distance.

Beatrice looks to Weydlynd, and says, “Introduce yourself first, keep it short, and I’ll do the remainder of the talking. Lord Prentise will remember me and should help us gain a more immediate audience with him.”

Weydlyn grunts as the guard draws close enough to speak without shouting, “In the name of Lord Prentise, please state your business.”

“I am Sir Weydlynd, the Reforger of Knighthood,” he says as he catches the gaze of the guard then points his head toward Sir Beatrice.

“And I am Sir Beatrice, I have once before helped Lord Prentise; though I hope I may do more. And we wish to speak to Lord Prentise on matters regarding the Realm. Of the devil’s court of Amrageft.”

The guard tilts his head, as though puzzling something out, almost speaks, pauses, then says, “As you insist Sir Beatrice and Sir Weydlynd, I shall ensure that you are announced. May you find the Lord’s hospitality most welcoming.”

Checking Game State

I have deferred on building out relationships between the different holdings. But now that they’ve arrived, I need to do some work.

I also review the rule book to see what the Sir Prentise might know of the Judge.

Vassals know about the nearest Myth, and its general direction. If it is adjacent to their home, then they know its precise location. They know Landmarks in their home and neighbouring Hexes.
Mythic Bastionland page 19

Using my mythic-bastionland.el package and “hidden” map, I invoke M-x mythic-bastionland-nearest-myth, punch in 5,3 (the coordinates of Castle Steimfluss) and get back “The Judge”. I then invoke M-x mythic-bastionland-direction to find that “The Judge” is to the Northeast of the Castle.

Unfortunately, I when checking direction I chose the wrong one. And gained very useful information about the actual hex: “The Judge” was north of 7,3. Which the player should not know. So I’m going to rebuild the map based on what must be true.

Also, I’m going to need a command to reveal the direction of adjacent landmarks to a holding (maybe a Hex, but we’ll work first from a Holding). Which after a bit of work, I’ve included.

Just in Time Locations and Relationships

Moving into a Holding, I wanted to attend to the relationship of holdings and their rulers. I read through BASTIONLAND: Sparking Conflict and rolled up the relationships and conflicts.

Locations and Their Leaders

  • Steimfluss (seat of power, castle): Lord Prentise (Rat Knight)
  • Skanya (town): Yuri the Beautiful (cult leader)
  • Twierdska (fortress): Tove the Elder (Tome Knight)
  • Vukturm (tower): Yelena (gambler)

Locations and Their Woes/Dramas

  • Skanya: Drama (ambition/disguise)
  • Steimfluss: Drama (greed/oath)
  • Twierdska: Woe (escalating/theft)
  • Vukturm: Drama (rivalry/oath)

Conflicts Between Locations

  • Skanya / Steimfluss: Waterway negotiations
  • Skanya / Twierdska: Conquest standoff
  • Skanya / Vukturm: Betrayal animosity
  • Steimfluss / Twierdska: Waterway war
  • Steimfluss / Vukturm: Bloodfeud truce
  • Twierdska / Vukturm: Marriage standoff

Relationships Between Leaders

  • Prentise / Tove: Estranged Mentor
  • Prentise / Yelena: Intimate Enemy
  • Tove / Yelena: Resentful Successor
  • Yuri / Prentise: Tumultuous Rival
  • Yuri / Tove: Reluctant Lover
  • Yuri / Yelena: Resentful Guardian

Conflict Escalation Procedure

Reading Holding Threads I’m thinking about how to consider the relationship between leaders, conflicts between locations, and the present woes or dramas unfolding at a location.

I’m thinking that the relationships color the conflict; but are not things that necessarily resolve. Maybe an End of Year procedure to see how these relations change?

Table 271: Conflict Escalation Roll
d6 Result
1 News arrives of the next Escalation of a Conflict between two other holdings.
2–3 Reveal the next Escalation of a Conflict between the current holding and another.
4–6 Conflicts continue to simmer without Escalation.

In Holding Threads, Chris checks each morning phase while in the city. I feel that is too frequent. I’m going to go with three things:

  • When you start a session in a Holding make a Conflict Escalation Roll.
  • When you first enter a Holding make a Conflict Escalation roll.

I also must consider if these pre-rolled things “exist” regardless of revelation or only exist at the time of encountering them. I’m going to assume they don’t exist.

I’m contemplating having the Drama and Woe of the current holding enter into the fray of Escalation. For now, that’s what I’ll try.

Back to the Narrative

Let’s check the Conflict Escalation: I get a 3. And Escalate the Conflict—Bloodfeud Truce—between Steimfluss and Vukturm.

I quickly write up the following:

  1. Kinsfolk of both feuding sides meet, any weapons ceremonially tied.
  2. Cursing of one or the other families can be heard throughout the streets and taverns. There are some who don’t think the others are quite so bad.
  3. Kinsfolk recently arrived to plead case, are chased out of town. Only a few rotten vegetables are thrown.
  4. Catchy songs and poems mocking and deriding the others are heard whistled, hummed and whispered.
  5. Allies are sought as reprisals are planned.
  6. Now is the time of reprisals.

Of Sir Weydlyn’s Days

During the first day Sir Weydlyn notices several fancy dressed people, wearing similar attire to those that were harassing Tompot. He asks a few folks and they say that they are pledged to Yelena, 2nd cousin of Lord Prentise.

Weydlyn learns of the bad blood between these two. And while a tentative peace holds, Weydlyn scratches the scar on his jaw and thinks how he would be quick to spill that fancy blood.

After a few days of rest, recovery, and hospitality, Sir Weydlyn’s wounds are nicely healed and he feels ready to present his case to Lord Prentise regarding Tompot. But he first stops to see how he might secure a helm for himself.

For Sir Weydlyn, I wonder what does the armor smith desire of Sir Weydlyn. I roll on the Sparks and get Knowledge and Curiosity. I think the smith wishes to know about Weydlyn’s bolt-guisarme and how to make it and would exchange knowledge for a fine coif. Weydlyn agrees to share, again a Clarity test with a consequence of failure being that this will take considerable time.

And Weydlyn fails, he’s not very good at explaining. I tag the Woe of the Castle. Greed and Oath are in play.

A few days into Weydlyn’s work in the forge, agitation throbbing, the din of the forge piercing and pounding his aching skull, he hits his limit. A page’s arrival brought his rage to a boil. Lord Prentise was now demanding his presence, and the idiot armoursmith was still no closer to working out the nuances of the bolt-guisarme.

Fed up, he looks at the blistered man, and barks, “I have tried these last few days to teach you, but you are an anvil, nothing getting through that thick skull of yours.”

Weydlyn continues with a litany of curses and excoriations that he often heard directed at him during his apprenticeship.

The armour smith’s face grows even redder, but knows better than to challenge a knight of the realm.

“I’ll be taking that coif as I have spent more time in this forge than I’d ever need to work one of those from steel.”

The smith scowls, biting his tongue, tasting the copper of drawn blood. “Ay sir.”

Of Sir Beatrice’s Days

Sir Beatrice, in the meantime, spends her time amongst the squires, looking to whom she might recruit. Neither Weydlyn nor Beatrice are certain if their paths will continue after they present to themselves to Lord Prentise.

I call for a Clarity test for Sir Beatrice. She succeeds and makes note of the quality of squires and prepares her request of Lord Prentise.

While watching and offering guidance to the exuberant and receptive youth, she finds herself thinking of whether she wishes to cast her lot with Sir Weydlyn. She saw him rise to greatness, and fight to the brink in order to restore her knighthood.

She knew his deed was one motivated by fear of his mortality and losing his one identity, knowing that without the mantle of Knighthood, he’d return to the forge (and source of scars both seen and unseen) or he’d fall into brigandry.

Weydlyn took his Oaths seriously, but behind it was fear. Something most dangerous. She wondered how long she could withstand the blasts of hot anger pouring from mouth and eyes. Could she bring calming light to him?

A few days after their arrival, Sir Beatrice requested an audience with Lord Prentise; she did not include Sir Weydlyn. She spent the evening before polishing mirror and armor. Though she would leave armor and weapon behind, she knew that her mirror was always welcome.

An Audience with Lord Prentise

“Presenting Sir Beatrice, the Violet Knight, Retriever of the Vassal Rod,” proclaims a herald as the doors open to the throne room. Upon a dias sits Lord Prentise, lounging in his blackened leather armor. His mouth holding that puckered look, as though sniffing something.

Sir Beatrice takes not of the numerous rat holes throughout this room, she shudders just a bit, seeing a tail dart into the darkness.

“Good Sir Beatrice, since last we spoke, I had received a decree from a most unwelcome courier, that you had been stripped of your knighthood. Yet, when I heard your arrival and had my steward read that letter again, it was nothing more than a naughty limerick not worth repeating,” said the man smiling, at first looking Beatrice up and down, then looking away in some perhaps private shame.

“I have Sir Weydlyn to thank for my restoration. I wish, that we might exchange news so that we might both make better of our Knightly Oaths.”

Beatrice shares the events of the Judge. Lord Prentise shares of the cursed Silence to the south and the Minstrel’s Nook dwelling to the north. Lord Prentise shares that the Lich is closer and to the West.

From fable’s heart springs fable’s fear, a past within a past
From time before our nightmares still, made flesh by sullen mass.

Conclusion

This session was me working through Holding’s procedures and random tables as well as implementing functions for my mapping. I spent a bit of the morning working on my Mythic Bastionland Emacs package. To answer questions around neighboring landmarks. Also to output the map.

My goal is to express game state in the data structure I use to generate a map. That way, as new information arises, I can use that to track the information and even regenerate the map if I so choose.

Regarding the fiction, I felt that this was a session in which I (as the referee) needed to shift from the Wilderness mindset to a Holdings mindset. Which meant reconciling various posts I’ve read and creating corresponding procedures.

As a player, I’m uncertain if I want to continue with both of the knights. I thought I’d explore writing from Sir Beatrice’s perspective to see how that feels.

I also chose to step out of the narrative and exchange information. I’ll review the Lich and bring that into the narrative in future sessions.

Until next time.

Reply by Email

]]>
2025-12-21T11:07:12-05:00 2025-12-21T11:07:12-05:00
<![CDATA[Forged from the Worst: Session 4]]> https://takeonrules.com/2025/12/19/forged-from-the-worst-session-4/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < rpgs > < sessions > Series: < Forged from the Worst >

Summary: In which Sir Weydlyn confronts his fear and makes a solemn promise to Beatrice.

Sir Weydlyn and Beatrice spend an uneventful and rather quiet evening camping. Sir Weydlyn tending and staring into the fire, and Beatrice brushing Light’s Return. Several paces outside the fire ring, a placid skunk quietly watches, wondering if it too might appreciate a brushing from the woman.

In the morning, they dowse the coals, forage a simple meal and begin their journey. The two riders cross the dry hills making for the barren river valley, choked by slate and slag.

Ever Working Through Procedures

I check and there is no barrier between 7,2 and 6,3.

And I realize I’m uncertain about what to do if there’s a Myth on the Hex.

Ending a phase in the Hex containing a Myth always reveals its next Omen without making a Wilderness Roll. When possible the Knights also get the drop on the Omen.
Mythic Bastionland page 18

So the for Trek procedure (e.g. moving 1 Hex) is:

  • Check for barrier
  • When none
    • Cross and check for myth
      • When present encounter next Oment of the Myth
      • When none make Wilderness Roll

Gallop has a different procedure.

Thus far, I have only performed Trek. I take a bit of time and add a travel function to the Mythic Bastionland package. As of it only handles Treks.

I consult the function and get:

Trekking from (7 . 4) to (6 . 6). You move to (6 . 6), and reveal the next Omen for The Judge (the nearest Myth).

(Note: the output uses double-height coordinates)

Which leads me to writing a function to help me track omens revealed. But I digress with this lengthy tangent.

A Courtyard of Judgment

They follow the bluff along the eastern bank of the river, the morning sun dancing upon the wide cobalt colored river. The slate and slag spreading along the eastern horizon. Here and there they note a herons, some blue, others green, standing in the shallows. Their attention to the hunt.

As they follow the bow there amidst large menhirs and dead ash trees they see a courtyard in black and white, carved seats in a circle.

Beatrice halts Light’s Return and soothes her to maintain a silence. Sir Weydlyn, takes note, and himself halts, though not as concerned with maintaining silence.

“The court,” says Beatrice in a nerve-pinched whisper.

“The court?”

“Yes, I recognize this, it is a court of Amrageft,” whispers Beatrice.

“Is Amrageft there?”

“I can’t tell.”

“Then go and check.”

“What?” asks Beatrice.

“Go and check. If this is the court of Amrageft, she’s already passed judgment on you once, so there’s nothing more to fear,” says Sir Weydlyn, eyeing the circle, still considering that Beatrice might herself be untrue.

“Me? Why you villain. Your Oath is to Seek the Myths…and one is right before you, yet you cower behind me,” replies Beatrice.

As they converse, they hear vague voices echoing and arguing from the courtyard.

“You say it is a Myth,” says Weydlyn, his voice rising as a vein on his temple throbs and his face reddens, “yet the truth of your story hangs in the balance. Perhaps nothing but devils breath.”

Beatrice’s nostrils flare, her eyes widen, as she walks Light’s Return up beside Ingot. Through halting breaths she says, “You coward. You would send me forth as sacrifice to maintain your knighthood.”

Sir Weydlyn raises his gauntlet, Beatrice flinches. Weydlyn pauses, noting the passion and bravery in Beatrice’s words. Slowly he lowers his fist. Then lowers his head.

“I see,” says Beatrice, as she grabs the bundle of javelins, and makes for the courtyard, passing between two large stones and onto the white and black flagstones.

To Face Ones Judgment

In a firm resounding voice, Beatrice proclaims, “I come seeking the writ of judgment against Sir Beatrice, the Violet Knight.”

As Sir Weydlyn with head bowed deep, raises to look between the stones, the echoing voices stop. And one voice, now loud, barking and bitter, says in baritone “What of this claim, oh wretched Beatrice?”

“I seek this writ so I may prove true a warning to those who heed not the laws of Ambrageft,” commands Beatrice, “I demand that you, Muntin, produce this writ.”

From between the stones Sir Weydlyn sees Beatrice now talking with a tall man wearing a checkered longcoat, holding a grim polehook.

“Muntin,” mutters Sir Weydlyn, as he watches on seeing the tall man pull a singular scroll from his longcoat, and unfurl it.

“Be it known throughout the land, I Ambrageft of Diamond Eye, do find guilty Sir Beatrice for the crime of under-sharpening their knightly weapons. And for which she shall be stripped of her knighthood,” reads the barking bitter man.

As Muntin reads the scroll, Sir Weydlyn walks Ingot towards the courtyard, passing the two large stones. Beatrice’s gaze turns to Weydlyn, and he averts his eyes and lowering his head a bit, then looking to Muntin.

Muntin noting Sir Weydlyn’s approach, commands him to halt and name himself.

“I am Sir Weydlyn, knight of the Realm. The verdict of Ambrageft is capricious. Surely you Muntin, can see that,” says Weydlyn as he draws Ingot to a halt.

“It is not for me to see nor say, as I am now bound in service as Sergeant of the Law,” replies Muntin as he grips his polehook and looks up to mounted Weydlyn.

“Those Laws of your Mistress are false.”

“Knight,” growls Muntin, “do you challenge these laws?”

Weydlyn glancing to Beatrice then back to Muntin responds, “I know not all of your laws but I do challenge the judgment against Sir Beatrice.”

“Sir Beatrice is no more,” hisses Muntin coiling tighter, readying to spring or strike.

“Then I challenge you to Trial by Combat, to prove the verdict unjust and vacate the sentence,” howls Weydlyn.

I wonder, does Muntin have the authority to receive such a challenge? Probably not. I Ask the Stars and get a “Yes but…”

Muntin chuckles, “Oh Sir Weydlyn, I alone have not the authority to vacate Ambrageft’s judgment.”

“Foul devil,” replies Weydlyn, “then if not you alone, whom else?”

I’m torn, will Muntin share the levers that might move the gears of Justice? How Kafka-esque is this Judge’s court? There’s already the absurd failure to sharpen an mace. So I’m thinking absurd. I again Ask the Stars, will Muntin share the lever in which he moves? The answer seems unlikely, and the stars agree.

Muntin begins to speak, and his mouth quickly clamps shut, nearly biting through his tongue. He looks at Weydlyn, as though now a dog caught doing something that warrants a scolding, eyes begging for mercy and forgiveness.

“Speak,” commands Weydlyn. Muntin’s face shifts, shedding guilt, and instead looking up at Weydlyn with bitter eyes.li

“Very well, I challenge those with whom you together have authority to vacate Ambrageft’s judgment,” says Weydlyn.

Muntin nods, and responds, “So be it.”

I Ask the Stars is it the three Sergeants of Law that together must be challenged? The answer seems likely. And the stars agree.

Reaching into his checkerboard longcoat, he pulls forth a small trumpet, and drawing to his mouth, blows a short blast, “I summon Lyo and Tonnel, my fellow Sergeants of Law.”

All the while, Beatrice watches the exchange, her eyes lighting for a moment as hope swells that she might find herself restored. With hope rising, she casts her gaze to Sir Weydlyn, his fear forgotten and the quickening fires of passion drawing him to a challenge unknown.

Do the two Sergeant’s manifest almost immediately? I Ask the Stars with the answer likely. The stars reply: Yes but…

Mist gathers and swirls near Muntin. Both Beatrice and Weydlyn back their horses away. The swirling mist expands and dissipates, leaving two similarly clad men standing.

Each shakes his head, then looks to Muntin, who speaks, “I must confer with my fellow Sergeants of Law, but know this, tomorrow at day break, we shall receive your challenge and join in Trial by Combat. For now, you have leave to rest. Know that nothing shall disturb this day nor night. Amidst the stones, you’ll find a small cottage where you might rest and prepare for the trial.”

Respite before the Trial

Is there access to Sustenance before the trial? I Ask the Stars with the answer being unlikely. The Stars respond: Yes but…to eat the food is to accept future Judgment. Now does Sir Weydlyn recognize this? Or does Beatrice know this? Let’s make a Clarity check, and use the better of the two: Beatrice by many times over. She does not recognize this fact.

Sir Weydlyn eats the meal provided, restoring his Vigor. Weydlyn’s stubborn and refuses to apologize for doubting Beatrice’s story. Beatrice thanks him for fighting to restore her knighthood. Weydlyn deflects, claiming he is doing this to Seek the Myths and Protect the Realm; which restoring a Knight will certainly help on both accounts.

Weydlyn makes a solemn Promise to Beatrice, that he shall restore her knighthood.

The Trial

Is this a Trial to the Death? Yes but…well we’ll let that one hang for a bit.

And the combat must remain within the chess board.

The humid morning air, hangs upon the four combatants. Even before the trial, sweat beads on their brow. The day beginning unseasonably hot for early spring. As though the furnace forge had drawn close to bear witness to this day.

Weydlyn, white beneath, begins on the white queen’s square. Muntin on the other side, stand not on the first row, but the second. Muntin, center on white, Tonnel and Lyo each flanking on black. As though pawns standing guard of some yet to arrive queen.

Amongst the seats in the stones, Beatrice watches. Hope giving way to nerves. She knows the prowess granted by the sacred sworn oaths, and prays to the stars now vanished that Sir Weydlyn’s oath carries him through.

Lyo, Tonnel, and Muntin have the same stats: Vigor 12, Clarity 14, Spirit 14, Guard 6, Armor 1, polehook (d10 long)

They stand close, forming a shield-wall.

Sir Weydlyn winces as a horn blasts and echoes throughout stone and courtyard. Lyo says, “We have begun.” Patient, the sargeants wait, polehooks lowered ready to hold off the legendary assault of Knight of the Realm.

Sir Weydlyn looks to Beatrice, smiles, reaches to his belt and hurls his dagger at Muntin.

I invoke a Smite to add a d12 to the roll, getting a 10 and 5. There’s a few options: do 6 damage and inflict a scare or 10 damage and perform a Gambit; which grants a Save. Reviewing the scars, these aren’t likely to sway the combat. So Gambit it is. I choose to attempt to Stop Muntin from moving. But he Saves, so may move. Since wounded, I also check if he routs, but does not. Weydlyn passes his Vigor save and is not fatigued.

Muntin
Vigor 9, Guard 0.

The Sergeants bark, “Come face justice.” And begin a slow advance; not wishing to surrender the advantages of their shield wall.

Sir Weydlyn surveying the board, sees nothing more to throw. He grins and hurls his bolt-guisarme at Lyo, who’s face registers this unconventional action.

Again Weydlyn Smites and rolls a 1 and a 12. The polearm dives deep into Lyo’s shoulder, he crumples reduced to Vigor 7. His morale holds. I roll Weydlyn’s Vigor save and get a 20. A failure. Weydlyn is now Fatigued. I really had hoped for a Gambit or to make the save. Things are going to get dire.

With Weydlyn presently unarmed, the three charge.

For them, I roll a 10, 9, 7. It makes sense to inflict 8 damage and Stop Weydlyn from moving. This reduces his Guard from 6 to 0, and his armor soaks the remaining points. He is also Stopped.

Weydlyn tries to lunges at Lyo, with his heavy mail gauntlet. I roll a 4. Lyo’s Vigor drops to 4 (with that armor 1 preventing the mortal wound).

The three Seargants roll 5,4,2 on their counter attack. Sir Weydlyn’s Vigor drops from 16 to 12. And he presses back, his gauntlet burning with the forge fires. I roll a 5 and 3. He punches Lyo, dropping inflicting a Mortal Wound and dropping him.

Muntin and Tonnel, return a strike: 6 and 3. Weylynd drops from 12 to 8 Vigor. Circumstances are beyond dire.

The gauntlet, hot with Weydlyn’s rage pounds into Muntin. Inflicting, I roll an 8,6,2. Dropping Muntin’s Vigor from 9 to 4. He falls, face smashed and bleeding.

Tonnel’s resolve breaks (failing his Spirit save by 1). And backs off. With fury, Weydlyn charges up within Tonnel’s reach. Punching with a now blazing gauntlet. I roll 7,4,1,1. And opt for 7 damage and attempt to press the impairment; which fails. Reducing Tonnel’s guard to 0 and inflicting a Scar; smatching Tonnel’s mouth. He loses 6 Vigor, dropping from 14 to 8.

Tonnel steps back, and pokes at Weydlyn. There’s a 50/50 chance this is all over. I roll a 5. Weydlyn’s armor soaks 2, leaving his Vigor at 5. Weydlyn dives in with his gauntlet singing a song of the forge. I roll 7,8,5,2. Weydlyn’s fist catches Tonnel square in the skull, bone and blood splatter.

Exhausted, bloody, and battered, Weydlyn limps to retrieve his bolt-quisarme. A glowing violet nimbus surrounds Beatrice as she rushes to help Weydlyn.

“Sir Weydlyn, you have fought with a fury unmatched. And restored me to knighthood. For that, I thank you.”

“Yes, yes,” replies Weydyln between wincing breaths.

Reflections

Well that was a brutal and close fight. But let’s move back a bit.

I’m working through Sir Weylynd’s fears. Playing his low Spirit and Clarity with a bit of cowardice, low emotional intelligence, and manipulation. And Beatrice rising to face her judgment.

I let the oracles guide me, moving through the in play discovery of Weydlyn’s brashness, the arbitrary nature of the Judge, and how a Trial by Combat might reverse the sentence.

And before I started the Trial by Combat, I reviewed the combat section. And saw that the spearwall was a strong defense against a the charge of a Knight. Knowing that in older style games, breaking morale is often the stronger strategy.

Which is why I had Weydlyn risk much by hurling his two weapons. It was a risk. And the dice were fickle; lots of damage, no Gambit, and becoming Fatigued. Had Weylynd been able to perform a Gambit, my plan was for him to quickly move and retrieve his spear. And had he not become Fatigued, well he could’ve weathered more of the storm.

But all of those early inflicted wounds set the stage for a pitched battle that Weydlynd narrowly survived, due very much to the power of Tempering Strike: “when you cause a Wound with a melee weapon, that weapon receives +d8 until the end of combat. This effect can stack.”

I made the call that wearing scale armor meant heavy gauntlets, which I consider a melee weapon.

I keep thinking that the Combat moves quickly with ample points for decisions and risk taking. And the fictional state changes quickly.

Reply by Email

]]>
2025-12-19T06:44:43-05:00 2025-12-19T06:44:43-05:00
<![CDATA[Mythic Bastionland Map Play Aid Emacs Package]]> https://takeonrules.com/2025/12/16/mythic-bastionland-map-play-aid-emacs-package/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < emacs > < rpgs >

Summary: Generating the canonical game map while encapsulating its state and revealing information through functions that interrogate the map. That is, I the player can ask Emacs to answer questions about the campaign map that a referee would know.

In the Forge from the Worst series, I’ve been writing about my solo play in Mythic Bastionland 📖 . I had went into the game hoping to engage the map without referee knowledge of the map; no insight into where all the features are, but instead allowing the procedures of the game to reveal the locations of various features.

Midway through my 3rd session, I found myself needing to reveal information of the map that was going to be more challenging to derive. I chose that moment—a just in time moment—to set about loading the map into Emacs 📖 and then write commands to interrogate the map.

I reviewed the questions I had already asked of the map, and wrote them down:

  • What is the direction to a named Myth?
  • What is the nearest Myth?
  • What is a random Myth that is not the nearest?
  • Is there a barrier when moving between these two hexes?
  • Is there a Myth on this Hex?
  • What is feature is there on this hex?

I suspect I may also need to ask: “What is the direction to the nearest Myth?”

I wasn’t going to type up the map and store it, but instead randomly generate the map. Also, I wanted to make sure that I could generate a map that would conform to the player-discovered information from the sessions thus far session.

Initial Research

Given that I was going to be working out distances, I read through the amazing and helpful Hexagonal Grids.

I needed to settle on an appropriate coordinates systems. With some reading, I chose to adopt the double-height coordinates. Which was not the notation I had already written down in blog posts, but would be easy to map.

Initial Work

I knew that once I created a map that conformed to Sir Weydlyn’s observations, I wouldn’t want to dig into the data nor debug functions using that map. So, my approach was to work from a disposable map and test the functions.

I used the Read-eval-print loop (REPL 📖) to test these functions. One emergent foible is that I kept using the single-height coordinates; introducing a translating function for internal work. As of this foible persists. And creates a bit more chatter, which we’ll see in a bit.

Encoding the Known World

Once I had a solid set of functions that could answer questions, I set about encoding the Known World. Let’s walk through this.

First we have this mbc function. It converts single-height coordinates to double-height such that (mbc 8 1) will be (8 . 2) and (mbc 7 1) will be (7 . 3).

(defalias 'mbc 'mythic-bastionland--random-coord)

Next let’s read over the code and comments. I’ll meet you after the code block.

(defalias 'mbc 'mythic-bastionland--random-coord)
(mythic-bastion-land-map-write
 (mythic-bastionland-map-generate
  `((constraints .
                 ((nearest . ((label . "The Mountain")
                              (feature . myths)
                              (coord . ,(mbc 9 1))))
                  (nearest . ((label . "The Judge")
                              (feature . myths)
                              (coord . ,(mbc 7 2))))))
    ;; This is where Sir Weydlyn encountered Seer Tompot.
    (sanctums . (("Tompot (Tangled Seer)" . ,(mbc 8 1))))
    ;; With the chosen random scenario, we assign the Moutain, then
    ;; pick a random one for the Beast
    (myths . (("The Mountain" .
               (,(mbc 10 4) ,(mbc 8 4) ,(mbc 9 2)
                ,(mbc 9 3) ,(mbc 9 4) ,(mbc 9 5)))
              ("The Beast" .
               (,(mbc 8 3) ,(mbc 9 3) ,(mbc 8 4)
                ,(mbc 9 4) ,(mbc 8 5)))
              ("The Judge" .
               ,(mythic-bastionland-hexes-within-range
                 (mbc 7 2) 3))))
    ;; These have been converted to double height coordinates.
    (holdings . (("Tower" . (9 . 3)) ("Castle" . (5 . 7))
                 ("Fortress" . (1 . 19)) ("Town" . (8 . 16))))
    (omens-revealed . (("The Mountain" . 1)))
    (omit (
           ;; Sir Wedylyn crossed between these two potential
           ;; barriers.
           (barriers .
                     ((,(mbc 8 1) . ,(mbc 9 1))
                      (,(mbc 9 1) . ,(mbc 8 2))
                      (,(mbc 8 2) . ,(mbc 7 2)))))))))

The mythic-bastionland-map-generate function takes an alist with keys: holdings, myths, landmarks, dwellings, sanctums, monuments, hazards, curses, ruins, barriers, constraints, omens-revealed, and omit.

This allows me to specify where to place specific already known landmarks as well as to omit placing landmarks at a given coordinate.

Of those: holdings, myths, landmarks, dwellings, sanctums, monuments, hazards, curses, and ruins are nameable feature types; a function I wanted as I managed the map.

The omit option allows me to specify coordinates that I will not place the named feature.

The constraints option are tests that must be true with the completed map. When all of them are not true, I discard that generated map and create another one. By default this will be attempted 10 times; but you can also pass max-retries to the generation to modify that amount.

And omens-revealed allows for tracking of each omen’s present state.

Generating the World from that Which is Known

With the mythic-bastionland-features, I define the feature types (that are renamable), how many there should be, and optionally a minimum distance.

 (defvar mythic-bastionland-features
  '((myths . ((how-many . (6))))
     (holdings . ((how-many . (4)) (min-distance . 5)))
     (sanctums . ((how-many . (3 4))))
     (monuments . ((how-many . (3 4))))
     (dwellings . ((how-many . (3 4))))
     (hazards . ((how-many . (3 4))))
     (curses . ((how-many . (3 4))))
     (ruins . ((how-many . (3 4)))))
  "Feature types that are labeled, and thus renameable.  Also we want
to consider how many of these we might place as well as the minimum
distance (if any).")

For holdings, there are 4 at a minimum distance of 5. For myths there are always 6. And for the others, there is either 3 or 4.

And now we have the code that generates the map based on the given configuration.

In short:

  1. We place the given features; when a feature has more than one coordinate, we randomly pick a coordinate that does not have something in it.
  2. Build a list of the remaining features to place.
  3. Looping through the locations to place, attempt to place them on the map; honoring minimum distance, omitted coordinates, as well as only allowing one feature per hex.
  4. Randomly place known barriers, skipping over omitted ones. (As of , I don’t have a means of placing known barriers, but that feature is trivial to add).
  5. Validate that all constraints are true; if not, try again.
  6. The record any omens-revealed.
(defun mythic-bastionland-map-generate (config)
  "Generate and store `mythic-bastionland-map' via CONFIG.

See `mythic-bastionland-features' for some of the `car' values of
CONFIG.  Another is `barriers' (which are unamed).  Another is `omit',
itself an alist, with the same `car' values as those in CONFIG (except
`omit').

When providing existing locations to place, you may provide either a
single coordinate or a list of coordinates (from which the function will
randomly pick a candidate of coordinates not already placed).  The logic
enforces that only one feature may be placed in each hex.

Given this placement logic, ensure that the config places features with
less candidate spaces earlier."
  (let ((max-retries
          (or (alist-get 'max-retries config) 10))
         (keep-mapping t)
         (the-map nil))
    (while (and keep-mapping (> max-retries 0))
      ;; Assume that we don't need to keep trying to build the map
      (setq keep-mapping nil)
      (setq the-map nil)
      (setq max-retries (- max-retries 1))

      ;; Now, let's see if our assumption is correct.
      (let ((barriers nil)
             (locations nil)
             (locations-to-place nil))
        ;; First put the locations on the map...no effort is taken to
        ;; avoid location collisions.  Also, queue up further locations
        ;; to place.
        (cl-loop for (feature . fconfig) in mythic-bastionland-features do
          (let* ((feat-locations
                   (alist-get feature config))
                  (how-many
                    (alist-get 'how-many fconfig))
                  ;; TODO: allow for multiple feature entries.
                  (placed-features '()))

            ;; When we are given location qs for this feature type, add
            ;; it to the placed list.
            (when feat-locations
              (cl-loop for (label . list-or-one-coord) in feat-locations do
                (let ((placed-coordinates
                        (mapcar #'car locations)))
                  (if (consp (car list-or-one-coord))
                    ;; We have a list of coordinates
                    (let ((coord
                            (seq-random-elt
                              (seq-filter
                                (lambda (c)
                                  (not (member c placed-coordinates)))
                                list-or-one-coord))))
                      (unless coord
                        (user-error "Location %s with coordinate options %s cannot be placed due to collisoin with all other placed locations."
                          (label list-or-one-coord)))
                      (cl-pushnew (cons coord label) locations)
                      (cl-pushnew (cons label coord) placed-features))
                    ;; We have one coordinate
                    (let ((coord list-or-one-coord))
                      (when (member coord placed-coordinates)
                        (user-error "Location %s with coord %s cannot be placed due to existing placed location"
                          label coord))
                      (cl-pushnew (cons coord label) locations)
                      (cl-pushnew (cons label coord) placed-features))))))
            (cl-pushnew (cons feature placed-features) the-map)

            ;; Next queue up placing the remainder of locations for the
            ;; feature type (accounting for what was already given).
            (dotimes (i (- (seq-random-elt how-many)
                          (length feat-locations)))
              (cl-pushnew (cons feature
                            (format "%s %s" feature (+ i 1)))
                locations-to-place))))

        ;; Now that we have our task list of what all needs adding.
        ;;
        ;; This involves avoiding collisions with other placed features
        ;; as well as heading the guidance of an omit coordinates for
        ;; the given feature.
        (cl-loop for (feature . label) in locations-to-place do
          (let ((keep-trying t)
                 (min-distance
                   (alist-get 'min-distance
                     (alist-get feature mythic-bastionland-features)))
                 (omitted-feature-coordinates
                   (alist-get feature (alist-get 'omit the-map))))
            (while keep-trying
              (let* ((coord
                       (mythic-bastionland--random-coord)))
                (when (and
                        ;; Verify that what we're placing is place at
                        ;; the minimum distance.
                        (if min-distance
                          (<= min-distance
                            (min
                              (mapcar
                                (lambda (label-coord)
                                  (mythic-bastionland--hex-distance
                                    coord (cdr label-coord)))
                                (alist-get feature the-map))))
                          t)
                        (not (or
                               (assoc coord locations)
                               (member coord
                                 omitted-feature-coordinates))))
                  (progn
                    (setq keep-trying nil)
                    ;; For locations we favor storing the (coord . label)
                    ;; This makes later comparisons easier.n
                    (cl-pushnew (cons coord label) locations)
                    ;; For a named feature favor storing (label . coord)
                    ;; as this makes prompts easier.
                    (cl-pushnew (cons label coord)
                      (alist-get feature the-map))))))))

        ;; Nex, we handle the barriers as they are a bit of a different
        ;; creature.  We generate them by placing them between two
        ;; neighboring hexes.
        ;;
        ;; I have given special consideration for hexes on the edge of
        ;; the map; Namely don't create barriers on the edges.  And
        ;; proportionally reduce the chance of adding a barrier on those
        ;; edges proportional to the number sides that the hex has
        ;; on-map neighbors."
        (let ((omitted-barriers
                (mapcar
                  (lambda (b)
                    (mythic-bastionland--make-ordered-pair
                      (car b) (cdr b)))
                  (alist-get 'barriers (alist-get 'omit config)))))
          (dotimes (i (+ 23 (random 3)))
            (let ((keep-trying t))
              (while keep-trying
                (let* ((coord
                         (mythic-bastionland--random-coord))
                        (in-6-chance
                          (cond
                            ((member coord '((0 . 0) (11 . 22)))
                              ;; top-left, bottom-right
                              2)
                            ((member coord '((11 . 0) (0 . 22)))
                              ;; top-right, bottom-right
                              3)
                            ((member (car coord) '(0 11))
                              ;; from or to
                              4)
                            ((member (cdr coord) '(0 23))
                              ;; top of col that is taller; bottom of
                              ;; col that is shorter
                              3)
                            ((member (cdr coord) '(1 22))
                              ;; top of col that is shorter; bottom of
                              ;; col that is taller
                              5)
                            (t 6))))
                  (when (<= (+ 1 (random 6)) in-6-chance)
                    (progn
                      (let* ((neighbor
                               (seq-random-elt
                                 (mythic-bastionland--neighbors coord)))
                              (pair
                                (mythic-bastionland--make-ordered-pair
                                  coord neighbor)))
                        ;; Don't repeat barriers
                        (when
                          (not (or (member pair barriers)
                                 (member pair omitted-barriers)))
                          (progn
                            (cl-pushnew pair barriers)
                            (setq keep-trying nil)))))))))))

        ;; PS...make sure we add the locations and barriers to the map.
        (cl-pushnew `(locations . ,locations) the-map)
        (cl-pushnew `(barriers . ,barriers) the-map)

        ;; Next, see if we have a conformant map
        (cl-loop
          for (constraint . info)
          in (alist-get 'constraints config) do
          (pcase constraint
            ('nearest
              (unless (mythic-bastionland--test-constraint-nearest info the-map)
                (setq keep-mapping t)))
            (_ (user-error "Unknow constraint %s" constraint))))))

    ;; TODO: Consider generalizations but for now this is adequate.
    (when-let ((omens-revealed (assoc 'omens-revealed config)))
      (push omens-revealed the-map))
    the-map))

It’s All a Mapping Problem

I once read that all computer science problems are mapping problems. There were two that I needed to consider.

First, when rolling up a barrier, it is placed along the shared side of two adjacent hexes. This meant creating a “unique key” for those pairs, so that I don’t accidentally pix Hex 0,0 then its neighbor Hex 0,1 to place a barrier, and then pick Hex 0,1 and its neighbor Hex 0,0 to place a hex.

Enter the mythic-bastionland--make-ordered-pair function:

(defun mythic-bastionland--make-ordered-pair (from to)
  "Provide a consistent sort order FROM and TO coordinates."
  (let ((from
          (or from
            (mythic-bastionland--text-to-coord nil "Left ")))
         (to
           (or to
             (mythic-bastionland--text-to-coord nil "Right "))))
    (if (> (car from) (car to))
      `(,from . ,to)
      (if (> (cdr from) (cdr to))
        `(,from . ,to)
        `(,to . ,from)))))

It normalizes a pair of coordinates so that we can have consistent interaction when referencing those two coordinates.

Second, one of the questions was direction from one coordinate to another. And here we have mythic-bastionland--direction:

(defun mythic-bastionland--direction (&optional from to)
  "Get human-readable direction FROM TO."
  (let ((from
          (or from
            (mythic-bastionland--text-to-coord nil "From ")))
         (to
           (or to
             (mythic-bastionland--text-to-coord nil "To "))))
      (cond
        ((equal to from)
          "Under your nose")
        ((= (car from) (car to))
          (if (> (cdr from) (cdr to))
            "North" "South"))
        (t (let ((slope (/
                          (float (- (cdr to) (cdr from)))
                          (float (- (car to) (car from))))))
             (cond
               ;; After compass, protractor, marker, and spreadsheet
               ;; work, I'm happy with the direction calculations.
               ;; Remember, hex maps starting from top-left instead
               ;; of bottom right like Geometry means things get a
               ;; mind bending (at least for this old guy).
               ((or (> slope 4) (< slope -4))
                 (if (> (cdr from) (cdr to))
                   "North" "South"))
               ((<= 0.8 slope) (<= slope 4)
                 (if (> (cdr from) (cdr to))
                   "Northwest" "Southeast"))
               ((< -0.8 slope 0.8)
                 (if (> (car from) (car to))
                   "West" "East"))
               ((<= -4 slope -0.8)
                 (if (> (cdr from) (cdr to))
                   "Northeast" "Southwest"))))))))

Using geometry of Rise over Run to determine slope, I can enter the from and to coordinate to get the named direction. As the comments indicate, this involved some protractor work to make sure I got the algorithm correct.

When I had set out, I had first thought of saying the two adjacent hexes to the right of a given hex were to the given hex’s east. But the geometry suggested breaking this apart.

So for a given Hex, and looking at Hexes one space away and starting at the Hex directly above the given Hex and working clockwise we have: north, north east, south east, south, south west, and north west. Stepping to the next ring out, we have: north, north east, north east, west, south east, south east, south, south west, south west, west, north west, north west.

I felt that having the algorithm well understood by me would make for consistent solo play.

Testing This Thing

When you look at the code, you might notice that the interactive functions will take a coordinate or prompt you for one. You might also note that some non-interactive functions take optional coordinates, and prompt if none are given.

All of this was in service of attempting to test functions. Verifying the correctness of distance and direction required no knowledge of the map, but instead relied on two coordinates. So I could bombard these functions in the REPL and prompt for the inputs.

I also made a decision not to codify Sir Weydlyn’s map until I’d test driven things a few times. Hence I write the map to disk and then read it back when I want to use it. This also serves to clobber the variable’s value, preventing accidental peaking. I am considering further measures, but am holding off.

I found that once it was all tested, and I started playing, I realized I wanted to adjust some functionality. Namely, determining the nearest myth. I refactored that section. And to test, used a bit of dependency injection, to pass in the map I wanted to test (so as to not peak).

Once I verified behavior, I loaded the game map and made sure the question I had previously asked of the map returned the same result. And it didn’t so I set about further refactoring (which added the constraints option). I adjusted the initial config, adding constraints and allowing for features to be placed from a subset of coordinates.

Conclusion

I’ve had two significant refactors of the base functionality.

From the initial state to the next state, I needed to consider that I was changing the logic for what was nearest, going from randomly picking hexes that had the same distance to now consistently picking hexes.

I performed the refactor then tested my map. The answer I got conflicted with established facts (e.g. “The Judge” was the closest myth to 9,1). So I needed to refactor again. This is when I introduced constraints. Which was relatively easy to introduce.

I did the second refactor in two parts. Part 1 was wrapping the existing body in the following then re-indenting:

(let ((max-retries
       (or (alist-get 'max-retries config) 10))
      (keep-mapping t)
      (the-map nil))
  (while (and keep-mapping (> max-retries 0))
    ;; Assume that we don't need to keep trying to build the map
    (setq keep-mapping nil)
    (setq the-map nil)
    (setq max-retries (- max-retries 1))

    …EXISTING BODY…
    ))

This change was a noop change, that I committed. Then I set about implementing the constraints logic. This way I would have smaller second commit that didn’t interweave with indentation changes.

You can find the “mythic-bastionland” package on Sourcehut.

Reply by Email

]]>
2025-12-16T20:11:00-05:00 2025-12-16T20:11:00-05:00
<![CDATA[Forged from the Worst: Session 3]]> https://takeonrules.com/2025/12/16/forged-from-the-worst-session-3/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < rpgs > < sessions > Series: < Forged from the Worst >

Summary: In which Sir Weydlyn continues his trek towards the castle, learning of a fate perhaps worse than death.

The eastern golden dapple sky frames the two horses, a large stallion with horned helm and a smaller rouncey. On the stallion rides a broad shouldered man bedecked gambeson and dark polished scale, one hand holding the reins, the other a raised bolt-guisarme, and empty saddle bags. The rouncey, riderless, bears a clutch of javelins, heavy saddle bags, and bedroll.

Ahead the overgrown plains begin rolling into hills that look as though shunned by the spring rains. Riding on, the waves of tall grasses fall behind the three as they ride amidst the dry hills (coordinates 8,2), where morning sun has now drifted to mid-day.

I make a Barrier Check…encountering none. And then a Wilderness Roll…Encounter the Hex’s Landmark otherwise all clear.

And here we come to another procedure that I will need to establish.

Establishing a Landmark Procedure

Some Wilderness Hexes contain a Landmark. These are discovered when travellers roll 4-6 on the Wilderness roll. A typical Realm has 3 or 4 of each type of Landmark. Mark them with their initial or an icon.
Mythic Bastlionland page 14

This prompts me to wonder: can a Landmark and Myth be in the same Hex? So I read about Myth Hex (emphasis mine).

Place 6 Myths (p27) in remote places. Number them as 1–6. The Hexes are clearly affected by the presence of their Myth.
Mythic Bastionland page 14

While not explicit, I’m going to assume that Landmarks and Myths will not share a Hex. Also, I need to consider that a Myth might be in a Hex and showing some signs. This will require a bit of logic as a knight travels across the realm.

We need to know if the Hex has Landmark or alterations due to a Myth. There are 6 Myths. There are 6 types of Landmarks: Dwellings, Sanctums, Monuments, Hazards, Curses, and Ruins. So we’d have between 18 and 24 Landmarks. I’ll also assume that Myths do not exist in Holdings.

As I set about doing this, I realized, why don’t I encode the map into an Emacs data structure then interrogate that data structure. Which proved to be a fun little diversion worthy of its own blog post; the long and short being I now have a few functions I can call to query the map to ask for:

  • Is there a barrier between Hex one and Hex two?
  • Is there Myth on this square?
  • What is the nearest myth?
  • What is a random myth that is not the nearest?
  • What is direction to a given myth?

One side-effect is that I had to change the coordinate system. Namely I’m starting the top-most left-most hex at 0,0; immediately down is 0,1, then down and right is 1,0. I could make more significant adjustments, but for now that’s what I’ll be working from.

With my map loaded, I ask it “What, if any feature is on 8,2?” And I get “Monument 4“. I pull a Random Myth to find the Monument and get “Sky Spire.” Now, will Weydlyn tarry and explore this Sky Spire? I think not. He seeks to fulfill his Promise to Tompot.

Amidst the Hills

Weydlyn rides southwest, making for the castle and Seat of Power. As the mid-day clouds make way, he sees a multi-coloured spire shimmering in the east. In his heart, he feels a desire to look upon the spire, to turn Ingot towards the scintillating spire.

I rolled a few sparks: Multi-colour, shimmering, and desire.

But his Promise to Tompot burns as a bright brand in the grim night of his soul. This spire of light and enchantment tugs and pulls at him. As though all his forge work was but slag, and only now has he beheld true beauty.

Here, I find myself wishing for the Virtues of Pendragon. Yet I, as the referee, am not quite wanting to compel Sir Weydlyn. So, let’s Ask the Stars if I as the referee should compel Sir Weydlyn? The answer is “No but…” so as referee, I don’t call for the compulsion.

Because I’m playing both sides of the table, should remove the option at this moment.

The tower pulses for a moment, Weydlyn hears an angelic song break out, and the tower vanishes. Heavy clouds roll in and with it the song fades. Sir Weydlyn, not wishing to chase phantoms, continues his journey towards the castle.

Making to exit 8,2 into 7,2, I check for a Barrier. And there is none. I make the Wilderness Roll and “Encounter the next Omen from the nearest Myth.” I wonder, what is the nearest myth to 7,2? I get “myth 1”. Which is neither the Mountain nor the Beast. I roll up a random Realm myth and get “The Judge.”

This is my first encounter with the Judge, and the Omen reads as follows: “A wretch pleads for charity. She was a Knight, sentenced harshly by the Judge.”

First, I need to know, is the Judge on this Hex? No.

I roll a land character spark to determine the lay of these new hill: overgrown.

Of Wretch and Judgment

With noon day now waning, Sir Weydlyn, Ingot, and the other horse, find themselves in the overgrown hills a days travel northeast of the castle. They make their way along the narrow trails of taken by the infrequent peddlers trekking between tower and castle. Sidenote We’re going to name these, but only upon arrival. Then I might go back and update my posts.

Ahead on the trail Weydlyn notes a downtrodden wretch, sitting beside the trail. She is rubbing her feet. And seeing Weydlyn, she lowers her head. Weydlyn slows and stops a few paces from the woman with tangled hair adorned in rags.

Here I need to read a bit about the Judge. Are these Judgments fair? It seems as though the judgments are arbitrary, perhaps stinking of the fey. Which helps me understand how next to proceed.

I pull a random Knight/Seer to get a theme for the judgment: Sharpness. Another question

“Good Knight, might you spare a bit of charity for a fellow downtrodden Knight?” begs the wretch.

Sir Weydlyn now looks to see if there is truth in these words. Uncertain he responds, “A Knight? I daresay you look not the part.”

The woman bows her head, “No, I have lost that part, as the Judge, Ambrageft, of Diamond Eye has seen fit to judge me guilty and cast me to the road-side, poor and beggard.”

Steadying Ingot and drawing him back a step, Weydlyn asks the wretch, “If knight you were, tell me true of your deeds.”

The wretch, tells of her knighting and fetching the vassal rod from the red vultures and restoring it to Lord Prentise, ruler of the realm.

I used several different pages to assemble these narrative points. I also rolled the wretch up as the Violet Knight.

Listening, a few questions begin filling Weydlyn’s mind. And as she finishes her tail, he begins with his questions, “And it was not Lord Prentise whom judged you but this Amrageft? How can this be?”

“Yes, not Lord Prentise, but Amrageft terrible and hard. And how it came to be? A courier handed me a lambskin scroll and written in crimson in language unknown was the decree. A season later, I was whisked away to a court, and judgment cast,” replied the woman.

“And were you guilty?” asks Weydlyn.

“I had upheld my Oaths. And the charges, why they were most absurd. I was found guilty of under-sharpening Sidenote Again, another random theme picked. I’m also opting for the absurd. my grand mace,” responds the wretch now rising, “and after the season long trial they just this day returned me here. This Myth found me unworthy.”

Weydlyn, now seeing the woman stand, looks her over. And the word “Myth” settles amongst the din of steel always clanging in his head. “These times are strange. And my heart wishes to know the truth of…”

“They are true, I…,” she interrupts

Sir Weydlyn hisses, “Silence. Your words, I wish I could know their truth. Ride with me to Lord Prentise’s castle. And there he can vouch for you and your tale. And know that if you have treated me false and now lead me astray, you’ll feel the bite of steal. I ask of you two things: your name and to give this horse a name; his previous owner failed to tell me before he died.”

“I speak true and thank you for your kindness. I am Beatrice. And I shall call this lovely steed Light’s Return,” says Beatrice.

Sir Weydlyn’s scornful eyes look past Beatrice, as though searching for a mirror to see check if this fear in his heart shows on his brow. Fear of what he could become if this tale of hers is true. Now looking on her, he hopes she proves false. He tightens his grip on his bolt-guisarme, aching to toss it into her lying mouth.

He guides Ingot beside Light’s Return and grabs the javelin bundle then tosses the reins to Beatrice, and with a cold steely voice says, “We will ride a few more hours then camp for the night.”

I roll up Beatrice’s stats as though a Knight Errant:

Guard
1
Clarity
14
Spirit
5
Vigor
13

I’m envisioning that Beatrice might be a squire? Or swear an oath anew. Perhaps returning to her seer.

Reflections

As mentioned, I started playing this session, prepared to manage the game state in a document and infer what must be where based on rolls. But then I thought how absurd, why not encode a map and then write functions to query the map. That was an enjoyable side-quest, and as mentioned is something I’ll later blog about.

At the conclusion of this session, Weydlyn has directly encountered two myths and has it on authority the general location of another. Also, having reconciled past statements, I have a sense of where three Myths are. My algorithm for finding the closest myth, in the case of ties, is to randomly pick from those that share the closest distance.

And as I write this, I realize that I want a consistent answer from a given hex. So I’m going to set about providing a consistent answer. That could mean my present map configuration is not correct given the new algorithm; but I have ways to rebuild the map in such a way as to be truthful to what has emerged in play.

For now, before I set about a minor code change, I’m doodling a bit on the map, I know that the Judge must be within 3 hexes of 7,2. Otherwise the logic would invalidate the in game facts regarding the Mountain and the Beast.

Reply by Email

]]>
2025-12-16T17:37:09-05:00 2025-12-16T17:37:09-05:00
<![CDATA[Extending Core Emacs Bookmark Package]]> https://takeonrules.com/2025/12/10/extending-core-emacs-bookmark-package/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < emacs > < programming >

Summary: Revisiting yesterday’s implementation and refactoring towards a bookmark implementation.

I wrote Extending Emacs to Play Mythic Bastionland and as I thought about it, I realized that I was coming very close to re-implementing bookmarks. What I had worked. But lacked the elegance of the bookmark ecosystem when adding to the PDF list.

And for those who took heart of what I did yesterday, read on, I found some bugs and fixed them.

So with time to think about it, I set about exploring how I might open a PDF to a random page (from a list of possible pages). Also, how I could capture that I want this bookmark to be a random page.

I also thought about how I might generalize my “starting and stopping” game play. After all, I have a few solo games that I might pick up.

Bookmarks

What follows almost completely replaces the previous implementation; except I don’t have a nifty re-roll a random table keybinding.

I had previously written a bookmark handler, so set about writing another one.

First, we should understand the structure of a PDF bookmark in Emacs 📖 :

 ("Tangled Seer"
(filename . "~/mythic=bastionland--core-rules__rules_systems.pdf")
(position . 1)
(last-modified 26934 62792 320522 78000)
(page . 104)
(slice)
(size . fit-page)
(origin 0.0 . 0.0)
(handler . pdf-view-bookmark-jump-handler))

The pdf-view-bookmark-jump-handler:random function first checks if there’s an associated pages value. If so, it picks one at random, sets the page value and passes it along to the pdf-view-bookmark-jump-handler.

  (defun pdf-view-bookmark-jump-handler:random (bmk)
    "A handler-function implementing interface for bookmark PDF BMK.

When the handler has a 'pages property, which is assumed to be a list,
pick one from that.  Otherwise fallack to the 'page property.

See also `pdf-view-bookmark-jump-handler' and
`pdf-view-bookmark-make-record'."
    (let ((pages
            (bookmark-prop-get bmk 'pages)))
      (bookmark-prop-set bmk 'page
        (or (seq-random-elt pages) (bookmark-prop-get bmk 'page)))
      (pdf-view-bookmark-jump-handler bmk)))

To test, I backed-up my bookmarks, and manually changed the handler to and added a pages attribute. I reloaded that file, and everything worked. Next, how could I avoid manually editing the file?don’t

I don’t want to always have my PDF bookmarks to be random tables. So I figured I would again repurpose the existing PDF bookmark making. This time with using an advising function.

First, I call the original pdf-view-bookmark-make-record; then if I have enabled 1) prompting for random pages and 2) said I want to specify the pages, then I prompt for the pages to use in randomization (yup, I had to manually enter those pages…or at least generate that list of pages programmatically, add it to the kill ring, then yank it into the prompt).

Once I had the list of pages, I change the handler from pdf-view-bookmark-jump-handler to pdf-view-bookmark-jump-handler:random. And returned the modified bookmark.

  (defun pdf-view-bookmark-make-record:with-randomizer (&rest app)
    "Conditionally randomize which page we'll open in a PDF.

See `pdf-view-bookmark-make-record:prompt-for-random'."
    (let ((bmk
            (apply app)))
      (if (and
            pdf-view-bookmark-make-record:prompt-for-random
            (yes-or-no-p "Specify Random Pages?"))
        (let* ((attributes
                (cdr bmk))
               (integers-as-string
                 (split-string
                   (read-string "Enter pages (comma-separated): "
                     (format "%s," (alist-get 'page attributes)))
                   "[,; ]+" t "[[:space:]]+")))
          ;; We clobber the existing handler replacing it with one of
          ;; our own devising.
          (setcdr (assoc 'handler attributes)
            'pdf-view-bookmark-jump-handler:random)
          (add-to-list 'attributes
            (cons 'pages
              (mapcar #'string-to-number integers-as-string)))
          ;; We need to return an object of the same form (e.g. a `cons'
          ;; cell).
          (cons (car bmk) attributes))
        bmk)))

  (advice-add #'pdf-view-bookmark-make-record
    :around #'pdf-view-bookmark-make-record:with-randomizer)

  (defvar pdf-view-bookmark-make-record:prompt-for-random
    nil
    "When non-nil, prompt as to whether or not to create a bookmark
that is randomization.")

Next, I wanted to continue popping those pages into a dedicated side window. Enter some more advice. This time, advising the bookmark-jump. Reading that implementation, I was surprised that the default wasn’t a variable; which might have made things easier.

(defvar default-bookmark-display-function
  nil
  "When non-nil, favor opening bookmarks with this function.")

(defun bookmark-jump-with-display (fn bookmark &optional display-func)
  (let ((display-func
          (or display-func
            default-bookmark-display-function
            (when current-prefix-arg 'switch-to-buffer-side-window))))
    (funcall fn bookmark display-func)))
(advice-add #'bookmark-jump :around #'bookmark-jump-with-display)

And last, a little bit of glamour. I visually show that the bookmark will be randomized by showing a the 6-face of a die with the word PDF.

;; Show that I'll be opening this PDF to a random page.
(put 'pdf-view-bookmark-jump-handler:random 'bookmark-handler-type "⚅PDF")

Starting and Stopping

With the new bookmark handling, I set about rethinking the implementation. As I needed to and unset more values, the lambda approach seemed cumbersome and repetitive. Also, in my experimentation, I wasn’t properly changing bookmarks files. The result was a steady appending to my default bookmarks.

What follows addresses that issue. First a variable of no significant insight.

(defvar playing-a-game nil
  "When non-nil, indicates that I'm playing a game.

See `playing-a-game-candidates' and `start-playing'.")

Next, I define what it means to start and stop playing my Forged from the Worst; using keywords.

(defvar playing-a-game-candidates
  `(
     ("Forged from the Worst (Mythic Bastionland)" .
       ((start .
          ((bmk-display-func . switch-to-buffer-side-window)
            (bmk-prompt-for-random . t)
            (bmk-file . "~/forged=from=the=worst--bookmarks.el")))
         (stop .
           ((bookmark-display-function . nil)))))
     )
  "Possible games I might be playing via Emacs.  A game you are playing
should have both a 'start' and 'stop' property.")

And then the function that prompts for the game played and applies the configuration; first stopping the previous game.

(defun start-playing (game)
  "Start playing the GAME; stopping any currently played game.

A GAME has a 'start' and 'stop' property, that is an alist.  That alist
has the following properties:

- 'bmk-file' :: what file we'll find our working bookmarks.
- 'bmk-display-func' :: the function we use to display bookmarks.
- 'bmk-prompt-for-random' :: if we'll prompt for possible random pages
  in PDF bookmarks.

When a property is not provided, \"suitable\" defaults are assigned."
  (interactive
    (list
      (let ((handle
              (completing-read "Start Playing: "
                playing-a-game-candidates nil t)))
        (alist-get handle playing-a-game-candidates nil nil #'string=))))
  ;; Stop playing what we were playing...if anything
  ;; Then start playing what we are playing...if anything
  (dolist (config (list playing-a-game (alist-get 'start game)))
    (when config
      (let ((file
              (or
                (alist-get 'bmk-file config)
                fallback-bookmark-file)))
        (setq default-bookmark-display-function
          (alist-get 'bmk-display-func config))
        (setq pdf-view-bookmark-make-record:prompt-for-random
          (alist-get 'bmk-prompt-for-random config))
        (bookmark-save)
        (setopt bookmark-default-file file)
        (bookmark-load file t nil t))))
  ;; Last register how to stop playing.
  (setq playing-a-game (alist-get 'stop game)))

And for symmetry and ease of thinking, I have added the related stop-playing.

(defun stop-playing ()
  "Stop playing a game."
  (interactive)
  (start-playing '("Nothing" . nil)))

Conclusion

Consolidating file lookup functions feels like the correct path. That is reduce the number of ways I’m opening up files. And extending existing functionality. Also learn a bit more about that implementation.

Reply by Email

]]>
2025-12-10T21:01:36-05:00 2025-12-10T21:01:36-05:00
<![CDATA[Forged from the Worst: Session 2]]> https://takeonrules.com/2025/12/10/forged-from-the-worst-session-2/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < rpgs > < sessions > Series: < Forged from the Worst >

Summary: In which hard-lessons are learned after witholding information.

Before I get going, I need to establish a traveling procedure: namely barrier generation. And before that, as I think about play, Sir Weydlyn and Squire Kelwun have ended a Phase of the day in the Wilderness. Meaning Wilderness Roll.

I make a Wilderness Roll (4) and all is clear. I also wonder if Sir Weydlyn or Squire Kelwun can discern if their captives are eager or nervous to head to the tower.

I decide to give them both a Clarity save to notice. Kelwun notices, but Weydlyn does not. Now does he make mention of it to Weydlyn or the others? For the time being, I think it is unlikely. I Ask the Stars, they respond with “No but…” I think after a couple hours, Weydlyn notices something off about Kelwun. Enough for us to cross from one Hex to another.

Establishing a Procedure for Barrier Generation while Traveling

I’ll be adding what follows to my Campaign Notebook, a document separate from the narrative play. However, I want to share this work as it may be useful for others playing Mythic Bastionland 📖 .

I’m considering the procedure for placing “just in time” barriers while a character travels the land.

Some Hexes have a Barrier on one or more of their edges, typically a sudden altitude change or impassible feature. These cannot normally be travelled through. For a typical Realm, place a number of Barriers equal to one sixth of your total Hexes.
Mythic Bastionland page 14

My read of the rules is that Barriers are revealed to players as they encounter them on their travels. This read is reinforced by the Realm Map generator hides the barriers on the player’s map.

Going by the book there are 144 Hexes in the Realm, meaning there are 24 barriers.

Travel through a Barrier is not normally possible, though locals might know a way. Attempting to travel through a Barrier wasts that Phase of the day, but still causes a Wilderness Roll.
Mythic Bastionland page 18

I read the above to mean that a barrier is applicable when leaving or arriving from that side of the Hex. There are 468 edges in a 12 by 12 Realm. Of those 96 are along the exterior border of the Realm. Leaving 372 edges on which there might be a barrier. Meaning that Sir Weydlyn has a 2 in 31 chance of encountering a barrier when they cross their first Hex. Which comes out to a 6.45% chance.

Thinking about about the dice rolls I have two procedures that come to mind:

  1. Roll a d6 + d12; when the 6-sided dice is a 1 and the 12-sided is 1 through 5, there’s a barrier. This is generates a barrier 6.94%.
  2. Roll a d8 + d6; when the 8-sided die is a 1 and the 6-sided die is 1 through 3, there’s a barrier. This generates a barrier 6.25% of the time.

As an alternative, were I to alternate procedures with each step, that would create a 6.60% chance, which gets closer; but definitely makes things more fiddly.

Stepping back, I’ve already said the River is a known barrier. So, lets go with the lower probability. We’ll check the first time the character attempts to cross, and record that result for future reference.

Setting Out

Sir Weydlyn on Ingot and Squire Kelwun with his three prisoners (and six riding horses) head south east to the tower. They’ve spent the morning at Tompot’s academy, eat a meager meal, and depart.

I grab some dice and roll for a barrier between hex 9,1 and hex 9,1. I was hoping, a bit, that there would be a barrier…but the dice said no. For future reference, until I encounter tooling issues, the top left-most corner is 0,0 and moving right increments the first digit.

While traveling the land shifts from grey plains to overgrown, uneasing Weydlyn. The dear trail makes for easier travel, avoiding the worst of the overgrowth. Ahead, the trail appears to veer north avoiding a large knot of thickets that splays onto the plain.

“Squire Kelwun, I noticed that you are a bit on edge. These tall grasses nipping at more than your stirrups? Maybe your spirit?”

Kelwun, eyes darting amongst the prisoners, as though rechecking that he’s tied the knots suitably, answers, “Umm, no its not that,” he says trailing off, as though catching some unexpected movement amongst his prisoners.

“Then what pray tell?”

“I’m just a bit busy keeping my eye on the prisoners.”

Your prisoners,” reiterates Sir Weydlyn.

“Yes, my prisoners. Just making sure their bonds are well suited. They…”

At this point, I consider what Kelwun has noticed of the prisoners. “Are the fancy bandits eager to return to the tower?” I honestly don’t know. So instead of Asking the Stars I’ll make a Luck Roll, and get a Crisis…something immediately bad.

“…don’t seem to be trying to escape,” says Kelwun.

Sir Weydlyn draws a deep breath, leans towards Ingot’s head, running his fingers across the dark polished steel of Ingot’s curled horned helm, lazily asking, “and?”

“And, that concerns me. We know them to be false. And to not attempt escape, well that, I dare think, means,” says Kelwun, as the three bandits each wince and test their bonds, “we’re probably returning them to welcoming arms.”

Weydlyn halts Ingot, and locks his smouldering gaze with Kelwun, again asking “and?”

That question hangs for a moment, as one of the three bandit’s eyes dart towards the thicket.

“And, I think we should be prepared. Because, I think they’ve been nudging us.”

The other bandits notice the first. They squint tilting their heads forward just a bit.

“Prepared? And you’re now telling me this? No. Don’t answer. We could be walking into a trap.”

Hisses split the sky, as the bandits dive off the deer trail into the tall overgrown grass, and arrows fly.

Ambuscade

I check Weydlyn and Kelwun’s Clarity, both fail. No Guard for them. Four arrows fly at Weydlyn and 1 at Kelwun (I chose a d4 for each of them).

Weydlyn
6, 3, 2, 1
Kelwun
2

Weydlyn Denies the 6. Fails the Clarity save, and is Fatigued. With Armor 2, Weydlyn’s Vigor drops from 17 to 16. Kelwun’s Vigor drops from 8 to 6.

Both have sustained a wound. I check Kelwun’s morale, and he’s ready to stay and fight.

Without access to Feats, Weydlyn is far less dangerous.

An arrow pieces Kelwun’s thigh as he cries out. Another finds purchase between the plates of Weydlyn’s armor, sinking into the meat of his shoulder.

Kelwun looks to Weydlyn, reaching for his javelin, noting that Weydlyn is pulling on Ingot’s reins for a hard turn. Seeing this, both knight and squire spur their horses into a galloping retreat.

As hooves thunder amongst the tall grass, arrows again fly.

Two at Weydlyn and three at Kelwun.1

Weydlyn
6,1; dropping Weydlyn’s guard from 6 to 0. That’ll be a Scar. Disfigurement, a permanent mark on his Jaw.
Kelwun
5,3,2; dropping Kelwun’s guard from 1 to 0. And reducing his vigor to 2. A Mortal Wound. I call for a Vigor save for Kelwun to stay horsed, but fails. He loses 4 more Vigor, dying in the fall.

An arrow tears across Weydlyn’s jaw; a brief memory flashes of his forging of Ingot’s helmet; he snarls. And lowers himself spurring Ingot on. Gazing over his shoulder again, he sees an arrow sink into Kelwum’s neck. Weydlyn’s gaze holds a moment longer, as Kelwum slumps, bounces, then slides and caroms off of his horse. A horse pressing forward, spooked, and pulling at a leg still stirrup bound.

Both horse and Weydlyn’s gaze shake free of Kelwum’s battered body. Growling and muttering a curse, Weydlyn rides on, steering Ingot southwest.

Weydlyn has a chance to shake off his Fatigue. And ends this portion of the day in the Wilderness. I get a 4 on my Wilderness Roll; no events. (Certainly not the Tower landmark).

Reading Travel rules, Weydlyn’s spent the morning at Tompot’s and the afternoon in 9,1 and fleeing. Both were done as a Trek (e.g. 1 Hex). So he’ll be camping outside; meaning another Wilderness Roll: “Encounter the next Omen from the nearest Myth.”

Procedure for Myth when Only Having a Player Facing Map

In Forged from the Worst: Session 1 Seer Tompot established that The Beast is on the western shores of the silver lake. That could mean the Beast is no more than 2 squares away, or as far as 5. Asking the Stars it seems likely that the Beast is the nearest Myth to 9,1 Hex: “No but…” Maybe equidistant? We’ll hold this lightly.

I roll a random established Myth, and get “The Mountain.” Well, a mountain in the plains.

Fur-clad monks pray toward the Mountain scattering stones, water, and coals in its direction. They warn that only the worthy can climb it.
Mystic Bastionland p81

And that direction? South of 9,1. This is enough to continue play.

An Evening of Contemplation

Sitting beside a small campfire, Weydlyn casts his gaze to Ingot and and Kelwum’s horse—he never did learn its name. Both graze after a hard afternoon of riding. Weydlyn thinks about when he first met Kelwum. Sidenote I Ask the Stars for their Signs and Positions: The Traveller (wandering - chance) Colliding (change - violence).

He had found Kelwum in the village streets, a blubbering mess, carrying on about his mother marrying a wicked man—a man that was scheming to kill Kelwum. Just as he had killed others. Tossing noose over gallows and kicking out the stool. Or so that’s what Kelwum said and Weydlyn remembered. Kelwum begged Sir Weydlyn to take him on as a squire.

Weydlyn accepted, and being neither kind nor wicked towards Kelwum, set about working Kelwum as one might work steel on the forge. Folding fire and strength into his squire’s heart and soul.

No tears came as Weydlyn looked into the embers of a fading fire. The embers throbbed and pulsed from muted burgundy to a glowing brilliant crimson. Weydlyn’s mind blank as he stared deeper into the eye of the fire.

Was it an hour or a minute when he next heard Ingot and that other horse neigh. Reaching for his bolt-guisarme, Wedylyn rose, cursing as the smouldering echoes were all he could see.

A weak poetic voice in the darkness spoke, “Traveler, might we join you by your fire? We too are travelers, no pilgrims, seeking an evening of warmth and rest.”

As Weydlyn’s eyes adjusted, he saw 3 fur-clad monks bowing deep, each holding a bowl; one shimmering a bit as though catching the evening stars; the second smouldering embers and coal, the last filled with something unknown.

Weydlyn snuffed, raising hand to chin and almost reaching to touch his field dressed jaw. His shoulder ached, as though pleading for soft bed and warm hearth.

“Mayhaps, but answer me this. The night is warm, yet you fur clad. Why is that so?”

“Ah, we are on a holy journey,” said another, as each reached into their bowl grabbed a pinch and cast it towards the campfire, “to the mountain, and in our supplication we hope it deems us worthy to ascend.”

“A mountain you say? To the south? Those mountains are many leagues away. West of the great river.”

“Oh not those, for there is one near. One that only the worthy may ascend,” says the third, who’s face looked as weather pocked and worn stone.

Weydlyn nods, thinking of his map of the realm tucked into his saddle bags. Thinking to himself that there is no mountain on this side of the river.

“Good monks, my fire has dwindled, providing poor company for this evening. Let us stoke the flames and share heart warming stories of the day.”

The three bow graciously and they all set about fueling the fire. Weydlyn’s heart warms, for it is in the fire where he finds his solace.

Reflections

First, pour one out for Squire Kelwum. He was a tender heart, caught between a avoiding unwarranted violence and trying to “toughen up.” I’d imagine he chose to withhold information from Weydlyn, in part to avoid criticism.

Second, Weydlyn’s a dick. And I felt him turning his discomfort into a question of Kelwum as one of those “would rather pick at someone than go to therapy” moments.

I’m also quite satisfied with treating any knowledge Kelwum had as opaque to Weydlyn; that is Kelwum was filling a traditional Non-Player Character (NPC 📖) role.

I really love using Oracles to nudge things into a state of conflict, and felt that I had a reasonable flow. Made personally more interesting by withholding information and asking questions of the stars.

I did not, however, ask the Oracle for the nature of the Crisis. It felt obvious. The prisoner’s attempting an escape against two mounted combatants did not feel correct. I suppose I could’ve Asked the Stars for a Sign. But the ambush felt right. And I can see a situation in which Sir Weydlyn would raise a warband to confront this brigandry.

Without Guard available, the stakes felt high. And I got a better sense of just how delicate the characters are. For the second volley, I chose to randomize but with a likely lower number of arrows. The thought being that the assailants were likely also responding to the prisoners. Yet the same number of arrows flew. So perhaps there were more than 5?

I didn’t give any consideration of Weydlyn would attempt to return for Kelwum. It felt as though grim pragmatism would lead Weydlyn on.

For Weydlyn’s memory of Kelwum, I consulted the stars, rolled on a sparks table, and reincorporated his background. Also, it is quite clear that Weydlyn is inattentive.

Playing in a world emerging—in which I’m trying to maintain ignorance of what would be behind the screen—is a fun little puzzle to resolve.

Reply by Email

]]>
2025-12-10T18:31:54-05:00 2025-12-10T18:31:54-05:00
<![CDATA[Extending Emacs to Play Mythic Bastionland]]> https://takeonrules.com/2025/12/09/extending-emacs-to-play-mythic-bastionland/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < emacs > < programming > < technologies > Series: < Forged from the Worst >

Summary: Swapping out bookmarks while playing #MythicBastionland then restoring when finished. Also opening PDFs to random pages to simulate rolling on #RandomTables.

For playing Mythic Bastionland 📖 , I’ve been using or building out tooling. First, I’m leaning on my random-tables package. Next, while playing, I manually swapped out my baseline Emacs 📖 bookmarks for game specific bookmarks. Last, I began thinking about flipping to random PDF pages for inspiration.

Swapping Out Bookmarks

What I posted in Forged from the Worst: Session 1 worked, but I started thinking about how I might alter Emacs while running/playing the game. At first, this felt akin to turning on a minor mode. But the more I thought about it, it was more equivalent to using org-clock.

A quick brainstorm, and I realized that while playing:

  • I wanted different bookmarks.
  • Additional snippets (for my knight and squires name).
  • An indicator that I was playing the game.
  • And depending on how I organize my campaign world notes, maybe I’d start a clock on the headline associated with my world notes.

I haven’t yet implemented the world notes, but I have made adjustments for the others. Here’s what I have:

First, I establish a variable to track the state of “playing/not playing.”

(defvar playing-forged-from-the-worst nil
  "When non-nil, indicates that I'm playing Forged from the Worst.")

Then I created a command to toggle that on and off:

(defun toggle-forged-from-the-worst ()
  "Begin or end playing Forged from the Worst."
  (interactive)
  (load "jf-mythic-bastionland.el")
  (setq playing-forged-from-the-worst
    (not playing-forged-from-the-worst))
  (bookmark-load
    (if playing-forged-from-the-worst
      "~/SyncThings/source/forged-from-the-worst/forged=from=the=worst--bookmarks.el"
      "~/emacs-bookmarks.el")
    t nil t))

The command loads my random tables for the campaign. Toggles state. The loads the correct bookmarks based on state.

To indicate that I’m “playing”, I then added a variable that I could use with my modeline:

(defvar-local jf/mode-line-format/playing-fftw
    '(:eval
       (when (and (boundp playing-forged-from-the-worst)
               playing-forged-from-the-worst
               (mode-line-window-selected-p))
         (concat
           (propertize " 🎲 " 'face 'mode-line-highlight) " "))))

I add the variable into my mode-line-format:

(setq-default mode-line-format
    '("%e" " "
       jf/mode-line-format/timeclock
       jf/mode-line-format/org-clock
       jf/mode-line-format/vterm
       jf/mode-line-format/kbd-macro
       jf/mode-line-format/narrow
       jf/mode-line-format/playing-fftw
       jf/mode-line-format/buffer-name-and-status " "
       jf/mode-line-format/major-mode " "
       jf/mode-line-format/project " "
       jf/mode-line-format/vc-branch " "
       jf/mode-line-format/flymake " "
       jf/mode-line-format/eglot
       jf/mode-line-format/which-function
       ))

And ensure that I mark that variable as a risky-local-variable:

(dolist (construct '(
                        jf/mode-line-format/buffer-name-and-status
                        jf/mode-line-format/eglot
                        jf/mode-line-format/flymake
                        jf/mode-line-format/kbd-macro
                        jf/mode-line-format/playing-fftw
                        jf/mode-line-format/major-mode
                        jf/mode-line-format/misc-info
                        jf/mode-line-format/narrow
                        jf/mode-line-format/org-clock
                        jf/mode-line-format/timeclock
                        jf/mode-line-format/project
                        jf/mode-line-format/vc-branch
                        jf/mode-line-format/vterm
                        jf/mode-line-format/which-function
                        ))
    (put construct 'risky-local-variable t))

With that, when I’m playing the game, I see a little dice in my mode-line and have access to game specific bookmarks. That clock part is going to gnaw at me, so I assume I’ll work through that once I’ve published this post.

Flipping to Random PDF Page in Emacs

In Mythic Bastionland Session Reflection, I thought about the fact that I now had the PDF bookmarked and could quickly, I assume, access the oracular information at the bottom of the Knight/Seer and Myths pages.

My first pass was “what was the minimum viable command to open a random page in a PDF.” This involved reading the pdf-view-bookmark-jump-handler code and then setting about making it happen.

What I’m presenting is not the first nor second pass, but instead a third iteration that introduces a bit more utility. But I digress.

The algorithm I wanted was:

  • Prompt for whether I wanted a Seer/Knight or a Myth page.
  • Open the PDF in a dedicated window.
  • Go to a random page based on selection.

There are 72 Seer/Knight pages and 72 Myth pages. On a spread, the left page is a Seer/Knight and the right page is a Myth. The Seer/Knight starts on page 28.

The random function started as:

(+ (if seer-knight 28 29)
   (* (random 72) 2))

That is pick a number between 0 and 71, multiple that by 2, then add 28 or 29 depending on Seer/Knight or Myth.

I would then use find-file and in that buffer call pdf-view-goto-page. It was inelegant but was quick to verify general behavior.

Then I set about creating a better user experience. Below is the random-pages to choose from, and their relevant information of what file and how to pick a page.

(defvar random-pages
  '(("Knights/Seers" .
     (:file
      "~/Documents/RPGs/Mythic Bastionland/mythic=bastionland--core-rules__rules_systems.pdf"
      :callback
      (lambda () (pdf-view-goto-page (+ 28 (* (random 72) 2))))))
    ("Myths" .
     (:file
      "~/Documents/RPGs/Mythic Bastionland/mythic=bastionland--core-rules__rules_systems.pdf"
      :callback
      (lambda ()
        (pdf-view-goto-page (+ 29 (* (random 72) 2)))))))
  "An alist where `car' is the label and `cdr' is a plist with :file and
optional :callback.

We'll open the :file, then if a :callback is present, we'll run that
callback on the newly opened file.")

Next up is the function to open the random page in a dedicated window; with the happy little “bind g to pick a new random page.”

(defun random-page (&optional label set)
  "Open the file from SET with given LABEL.

SET is assumed to be an alist with `car' as the label and `cdr' a plist
with :file and :callback.  See `random-pages' for more information."
  (interactive)
  (let* ((set
           (or set random-pages))
          (label
           (or label
             (completing-read "Source: " set nil t)))
          (source
            (alist-get label set nil nil #'string=))
          (file
            (plist-get source :file))
          (display-buffer-mark-dedicated
            t)
          (buffer (or
                    (find-buffer-visiting file)
                    (find-file-noselect file))))
    ;; We'll pop open a dedicated side window with ample space for
    ;; viewing a new file.
    (pop-to-buffer buffer '((display-buffer-in-side-window)
                             (side . right)
                             (window-width 72)
                             (window-parameters
                               (tab-line-format . none)
                               (mode-line-format . none)
                               (no-delete-other-windows . t))))
    (with-current-buffer buffer
      ;; As a courtesy let's bind "g" to refresh re-invoke the
      ;; random-page using the same label.
      (local-set-key (kbd "g")
        (lambda () (interactive)
          (random-page label)))
      ;; I envision that not every random-page would have a callback.
      ;; Which highlights that perhaps the function name 'random-page'
      ;; is a misnomer based on my nascent understanding of what this
      ;; could be.
      (when-let ((callback
                   (plist-get source :callback)))
        (funcall callback)))))

What the above does is pop open a window on the right, with plenty of space to view the whole page. That window gets focus and I can close it q or re-roll with g. It also does the work to re-use a buffer if it already exists.

An animated GIF demontsrating the functions along with a list of commands called.
  • M-x consult-bookmark to show starting bookmarks.
  • M-x jf/mode-line-format/playing-fftw to start playing “Forged from the Worst.”
  • M-x consult-bookmark show a list of the game specific bookmarks.
  • M-x random-page REG Seer/Knight RET to pop open a random Knight/Seer page from the Mythic Bastionland rule book.
  • Then g a few times to pick a new random Knight/Seer page each time.

Conclusion

I love the virtuous cycle of playing a game, having a tool to support that game-play, and knowing that I can extend the tool to facilitate play. The result tends towards a generative feedback loop.

And both my during play moments of reflection as well as after play write-ups helped me consider what might be interesting to add to my tool chain. Which fed into exploring existing functionality and implementation to craft something just a bit new.

Now to think about my next session of Forged from the Worst. And attending to how I write up campaign notes while running. See what’s missing, maybe work and clocking time there. That would mean I’d have access to capture content to that clock, and could leverage more native Org-Mode 📖 functionality.

Reply by Email

]]>
2025-12-09T19:11:23-05:00 2025-12-09T19:11:23-05:00
<![CDATA[Mythic Bastionland Session Reflection]]> https://takeonrules.com/2025/12/09/mythic-bastionland-session-reflection/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < reflections > < rpgs > Series: < Forged from the Worst >

Summary: With one #solo #rpg session in the books, I take a bit to assess and reflect on my experience. Will there be more sessions? I’ll need to Ask the Stars.

What follows are my reflections on Forged from the Worst: Session 1.

I reviewed the aggregate list of resources from Running Mythic Bastionland. Reading Chris McDowall’s BASTIONLAND: Landmark Sites - Sanctum, I think of how quick I placed Sir Weydlyn in the presence of a Seer. Something to consider going forward.

Then, I listened to Luck Roll: Mythic Bastionland - Knotte - Session 1, I must consider that Sir Weydlyn appeared en media res . Which works, but I’ll want to consider the question: “Why this realm?”

With those larger contexts, I’m going to dive into my thoughts.

First and foremost, combat is intense and decisive. With a 17 Vigor, it feels like Sir Weydlyn can safely Smite. But his other Virtues are low, meaning I can only assume he could use one of these once, before experiencing Fatigue.

The combat decisions feel meaningful; do I go for maximum damage or attempt a Gambit to sustain, press, or create an advantage? Having given Sir Weydlyn the initiative, and allowing for an initial burst was perhaps generous, but given my exploration of the system feels appropriate.

With his high Guard, Vigor and Armor 2, charging into a volley of arrows likely wouldn’t have changed much. It really was the Burst that set the stage for the rout.

Next, those seers. Reading those terse three bullet points, I felt as though I could play to the weirdness and idiosyncrasies of the Tangled Seer. I’d imagine at a group table in which I were running these games, I’d feel that exhilaration of improvising a bit of apparent insanity.

One thing I want to remember is to also briefly study the image associated with the seer; it too is evocative and operates at a different level from the seer’s text.

In writing the dialogue of Sir Weydlyn, and his announcement of no quarter, I knew that Squire Kelwun, with his piety and witness to an execution, could provide a good foil to the grim nature of his knight. So I chose to introduce tension and sustain it.

From a play stand-point, I found considerable utility having the PDF of Mythic Bastionland 📖 and bookmarking specific pages. As I write this, and know the auguries at the bottom of the book, I am contemplating a function to “open the PDF to a random Knight/Seer or Myth page.” So that I might quickly reference those tables (without need of transcription).

As I was playing, and Squire Kelwun suggested traveling to the tower, I felt that direction served three aspects:

  • Increase the fictional tension between squire and knight.
  • Set in motion two settlements.
  • Create a location triangle in the fiction: tower, castle, and lake.

Digging into that location triangle a bit more, I’ve encumbered Sir Weydlyn with a Promise to a Seer to go to the castle, a begrudged acceptance that offloading prisoners sooner rather than later makes sense, and knowledge that a Myth (and adventure) lurks near the silver lake.

Heading towards the tower also moves towards answering that lingering setup question about the fancy bandits relation to the settlement. Oh the vindication that Sir Weydlyn will feel if they return those prisoners not to justice but to their awaiting homes and friends.

Aside from character creation and generating the map (as well as what you read in the Forged from the Worst: Session 1) I have done no additional preparation. My plan is to do this all just in time. What this means is as knight and squire head towards the tower, I’ll determine if there’s a barrier. I have a bit of preparation to translate realm creation for a traditional GM role into a process for solo exploration.

Yes, I could establish all of the barriers, and know them ahead of time. However, I find a narrative excitement when playing and needing to consult an oracle for information regarding the world. That oracle is bringing forth personal symbols from my experiences, interweaving them with the language and prompts of both the oracle’s words and images, as well as the fiction as presented.

In other words, I can use all of this to play to find out .

Last, I think about two solo campaigns. First , I was exploring Pendragon 📖 , see the following:

  • Building a Family History for Pendragon
  • On Starting a Solo Pendragon Campaign
  • The Great Pendragon Campaign: Year 490

But I lost steam. Why? Well there was a disheartening election, paired with moving into our house, and closing our retail store. Then, I found myself really enjoying reading a myriad of books. The time and space away from the game, has me thinking fondly of the system and the mini-game of character creation.

Second, I think of The Travels of Duinhir Tailwind. I haven’t fully closed that game out, but I’m looking at the character sheet of Duinhir Tailwind versus Sir Weydlyn, and appreciate the terse nature.

Mythic Bastionland has less character sheet overhead, which I find refreshing. And while the Virtues and Passions of Pendragon are fantastic for solo-play, a flavorful oracle can do quite a lot of work.

And, there’s the cognitive load/fatigue of playing a game in such a well established world. There’s the mood and tone to consider, but also the “fiction” as established. I’ll see how the travel procedures of Mythic Bastionland play out.

Which is to say, for now, I’ve found a nice shiny to play with. And I’m enjoying the writing opportunity as well as building my toolbox for running this game. Now, to write that Emacs 📖 function to lookup random pages.

Reply by Email

]]>
2025-12-09T17:46:12-05:00 2025-12-09T17:46:12-05:00
<![CDATA[Forged from the Worst: Session 1]]> https://takeonrules.com/2025/12/08/forged-from-the-worst-session-1/ Jeremy Friesen[email protected] https://takeonrules.com/ Related Links :: Tags: < rpgs > < sessions > Series:Forged from the Worst >

Summary: In which we establish our realm and we first meet Knight-Errant Sir Weydlyn, his helmed steed Ingot, and Squire Kelwum.

Gravid beats on ferrous slab, thick air a crimson sheen
Each mallenstroke leaves scars aworn, apparent and unseen

I’m going to start playing a solo campaign of Mythic Bastionland 📖 . I’ll be using Emacs 📖 to manage the campaign.

For my knight, I rolled up The Forge Knight; one knighted by The Worst Seer. I opted for a Knight-Errant and have the following characteristics:

  • Guard: 6
  • Clarity: 5
  • Spirit: 3
  • Vigor: 17
  • Glory: 0
  • Weapons: Bolt-guisarme (d10 long in melee or d10 slow ranged)
  • Armor: Gambeson (A1), Scale (A1)
  • Scars: blistered face; noise sensitivy
  • Steed: Ingot, Helmed steed (VIG 14, CLA 4, SPI 5, 4GD, d6 trample, A1)
  • Passion: Burning; restore SPI when you are wounded by fire.
  • Ability: Tempering Strike: when you cause a Wound with a melee weapon, that weapon receives +d8 until the end of combat. This effect can stack.

I named this bruiser Sir Weydlyn and rolled up Squire Kelwum to accompany him:

  • Guard: 1
  • Clarity: 9
  • Spirit: 8
  • Vigor: 8
  • Steed: Pony (VIG 7, CLA 7, SP 2, 2GD)
  • Weapons: dagger (d6); three javelins (d6)
  • Upbringing: They were raised in a pious environment and carry memories of an execution.
  • Constraint: They will not eat meat.

I’m referencing Plimbort’s guidance on Solo for Mythic Bastionland; of which as the player, I know the general map of the realm, but am oblivious to where other things might be. I’ll instead use procedures to play to find out .

Unlike the guidance of the solo-play, I chose to roll up the starting myths; though I only looked up the page so as to bookmark them. I got the following:

  • the Beast
  • the Fortress
  • the Judge
  • the Lich
  • the Mountain
  • the Wall

I used the Realm Map to generate a campaign for my suiting. What I like about this map is that there’s a major arterial river running north/south. Something that might facilitate travel.

Per the solo recommendations, I don’t know the locations of the staring Myth, Landmarks, nor Barriers. I’m also going to treat the river as a barrier; there will be bridges for crossing, but not in every hex.

Setting the Initial Situation

From the solo rules, I looked at the starting point and tossed a d6 to see how Sir Weydlyn and Squire Kelwum starts… a skirmish with bandits. Sidenote The text is “Roll on the Soldier Spark tables. Will a nearby holding or dwelling be glad to see them gone, or wroth to have their raiders killed?”

Rolling on the Sparks > Combat > Soldier table I get Fancy Scout(s). Sidenote Read that again…Fancy Scouts. Perhaps a Fancy Scout of Cornwood? How many (1d6): 6. Looking at Warfare I don’t see “scouts” but figure “skirmishers” work: Vigor 10, Clarity 13, Spirit 10, 2GD, Shortbow (d6 long). Sidenote Yikes to archers.

Now which holding? The Tower in the northeast corner…we’ll name that in a bit.

And how close? I’ll roll a d6; on a 1–2 it is the hex of the Tower; 3–5 adjacent hex; 6 two hexes away. I get an adjacent hex, and roll it is the grey plains to the northwest (coordinates 8,1). Sidenote Note to self, I’m going to need a way of better tracking these things. Perhaps a sheet of paper? For now, coordinates are easier.

I review the Basic Rules. And think a bit about the situation. The question implies that combat has started. I wonder, why did Sir Weydlyn and Squire Kelwum engage these fancy scouts? Let’s Ask the Stars …The Elder (authority - tradition) Bowed (submission - mercy). Maybe they are threatening a Seer? Seems likely, let’s again Ask the Stars …and yes they are.

I grab a d12 and d6, getting the Tangled Seer. Sidenote They are not quite here, but also too much of them is here. Appears as knotted appendages and faces, twisting in and out of the air. Perhaps outside their humble academy.

Skirmish with the Fancy Bandits

Sir Weydlyn and his squire having begun their journey into this mythic realm, traveling upon the grey plains. Near a copse of ash trees in bloom, they note six riding horses tethered up; adorned in finery, yet unattended. A cry of help and cursing erupts in the distance, coming from beyond the horses.

“Come good Kelwum, something is amiss,” says Weydlyn as he spurs Ingot forward, “I hope we are not too late.” As they trot around the copse, through the waist high grasses, and see cleared land surrounding a small building, with a bell raised high on ashen beam.

Between Sir Weydlyn and the building, somewhat scattered, are five men with short bows unbent. A sixth with walks amidst them with torch looking to light the arrows. All dressed in finery matching those of the horses.

“You foul brigands, this fine academy, shall not submit,” rages a voice within the academy.

“Then, I’m afraid, we shall make a pyre of you and yours,” howls the voice of the man with the firebrand.

Sir Weydlyn’s eyes catch the firelight, and a grim smile bends his face. From trot to gallop, Weydlyn brandishes his bolt-guisarme, prepared to run over these bandits. “Kelwum, stay back, and should one escape give chase,” orders Sir Weydlyn, as he prepares for the clash.

Sir Weydlyn’s brings 1d10 (bolt-guisarme) + 1d6 (trample) dice and opts to invoke the Smite feat to gain Blast. Can he hit them all with a blast? I Ask the Stars and get a yes. Here comes the slop.

Basic stats: Vigor 10, Clarity 13, Spirit 10, 2GD, Shortbow (d6 long)

Bandit 1
10, 3; eliminate 2GD and Vigor is at 2; Mortally wounded and dying.
Bandit 2
4, 3; gambit impair (fails), eliminate 2GD, Vigor is at 9.
Bandit 3
4, 3; gambit impair (success), eliminate 2GD, Vigor is at 9.
Bandit 4
2, 2; eliminate 2GD; Inflict Scar of Agony, lose 11 Spirit, now Impaired.
Bandit 5
9, 1; eliminate 2GD and vigor at 3; Mortally wounded and dying.
Bandit 6 (with firebrand)
4, 3; gambit stop (fails), eliminate 2GD, Vigor is at 9.

And Weydlyn makes his Save after using Smite. And Weydlyn has wounded 4 bandits. That bolt-guisarme is going to be quite dangerous.

Grim determination sets Weydlyn in motion, charging into the archers, themselves confused, as they turn to face Ingot and Weydlyn explode amidst them. Weydlyn’s bolt-guisarme piercing in a flury, as though a hot poker stoking the coals of a fire. Ingot bashing and trampling, twisting the ankle of one as they avoid the worst of Ingot’s wrath. The others maintain their wits as they back away from Weydlyn and the helmed Ingot.

Consulting the rules, I see a call for a Wavering Morale, check on Bandits 2, 3, and 4. Amazingly they all succeed. Bandit 2, 3, 4 move back and fire hoping that bandit 6 can pull Weydlyn from his horse. I grab 3d6 + 1d4 and roll: 1, 1, 3, 4. Their hope rests in unhorsing Weydlyn. So they inflict 3 damage; reducing Weylynd’s Guard from 6 to 3. And the Gambit fails as Sir Weydlyn succeeds at his save.

With wits about them, those with shortbows scatter, one limping along. And they hastily turn and fire, distracting Sir Weydlyn as the brigand with the fire brand attempts to pull Weydlyn down. Weydlyn feels the tug as Ingot pivots breaking the tenuous grapple of the brigand. Weydlyn bellows a laugh, “I am Sir Weydlyn, I offer no quarter nor assume any shall be given.” Sidenote This line came to me, as I realized the Sir Weydlyn offers only the fury of the fire.

The Blast option of Smite is not available, so Sir Weydlyn needs to pick them off one at a time. I roll 1d10+4d8+1d6, netting: 8,7,6,5,5,1. That’s 7 base damage plus 3 for Bolster and a Strong Gambit for no save. Someone’s soaking 10 damage.

Making good on his grim declaration, he spurs Ingot towards the bandit already limping. Running him down, leaving a ruin of bone and blood. “Brigands and bandits, know this, I Sir Weydlyn have sworn a sacred oath to protect the realm. And I deem you a most wicked of threat to this glorious realm.”

With half of their ranks fallen, I again check for Wavering Morale. There’s no real leader individual rolls. Rolling 11, 18, 19, the remaining all fail.

From the corner of Weydlyn’s eye, he sees Squire Kelwun and his pony ride after one of the bandits. Weydlyn hears Kelwun’s melodic voice shout, “halt and I shall claim you as my captive, your life shall be mine to spare.” The one bandit quickly drops to his knees and begs, accepting this chance of safety.

As the other two bandits plead, with cracking voices, “We submit to you, oh merciful one.” Weydlyn curses under his breath, a hiss as though water poured over his hot iron heart.

“Very well Squire Kelwun, these are your prisoners,” proclaims Weydlyn as he dismounts and approaches the dropped firebrand, watching as the flame sputters against the damp spring grasses.

“And I do so hope that these caged birds will sing of why they attacked this academy,” barks Weydlyn as he drives his boot into the smouldering fire brand; his heart yearning that this were instead the dried thatch of harvest time.

The Tangled Seer

Weydlyn winces as the small bell rings, piercing his reverie. He shifts his head, teeth clenched and looks upon a confusion of a man, fussing and flapping, as though himself tethered to the bell.

“Sir Weydlyn, I am Tompot, at least so I’m told, and you have, I believe—yes, I think—saved me and perhaps, most probably, my academy…well the realms academy…if they might claim it,” bumbled the man as he found his ill-fitting clothes now tangled on the bell chord. All efforts to untangle, being met by both a piercing ring, and further ensnarement.

Sir Weydlyn, bites his lip, breaths deep, and dismounts, walking towards the bell. His walk a chainmail song. “Here, let me help,” growls Sir Weydlyn, as he draws his dagger, Tompot wincing for a moment, then noticing the blade cut the chord; freeing Tompot from one tether, though finding himself now caught in what looks like twice as many clothes—none well-fitting.

“Ah, thank you again for rescuing me. Though…perhaps this is not a good thing,” replies Tompot, as he stops moving, letting his clothes settle, as though a pine tree laden with heavy wet winter snow, “as I have said, you have saved me and this academy. How shall I reward you? Ah, you a knight of the realm, your squire as yet unpledged. Yes, what might I a humble school master give?”

“You know my oaths,” states Sir Weydlyn, speaking slower, as to not sound irritated, “answer me true, are you a Seer?”

“I have been known to be that. Yes,” replies Tompot, furrowing his brow as though a thought shattered as glass upon stone. “Yes, at least until this day ends, I’m a seer.”

Drawing a deep, cooling breath, Weydlyn begins, “Then I ask nothing more of you than to know of what plagues realm. For I am oathbound to protect this realm.”

“Nothing more than what ails this realm?” asks Tompot, lucid in his confusion regarding Weydlyn’s response.

“Nothing,” affirms Sir Weydlyn.

For a moment, Tompot’s face twists as though beard and brow were in a row, then in a clear and certain voice he speaks in verse Sidenote The five lines are the lines of verse from each of the Myths. :

In cutting coil and snatching horn and crushing limb abound
Tameless creature sees no knight, no seer, no king a’found

A cage in stone, all thorned and vast
Disguise a scheme in shadows cast

In time she calls for all the knights
Upon the best her blade still bites

From fable’s heart springs fable’s fear, a past within a past
From time before our nightmares still, made flesh by sullen mass

Cutting through the land, a wonder two storms tall
Guarding from invasion, or built to cage us all

How earth ajoys to lay frailty bare
Render us small in its coldstone stare

While listening to the recitation Sir Weydlyn catches himself, wanting to interrupt and hurry on this doddering Seer. And when Tompot finish, Weydlyn’s wrath boils over, “You twisted man in riddles speak,” simmering down he continues, “…oh I spoke in haste and do apologize, as my ears and mind fail to unwind your riddled verse. Of those you speak, I wish to know more of this timeless creature. Where might I find it?”

“Now that is a bit more than you first asked, though I guessed as much and said as less. For our score is settled and were I to yield more, I require less… less visitors from that cursed castle to the south west. These men, they insist on bringing messages and knowledge new, as though to barter for visions and knowledge held.”

Sir Weydlyn, releases his held breath, as though opening the furnace door, “I can travel there and issue your demands, though I don’t know what sway I hold.”

“All I ask, is that you ask. Now go, then return and I’ll tell you more,” commands Tompot.

“Good Tompot, share this little truth before I depart, and I do so swear that I shall deliver your demands and petition those of the castle to take heed.” Sidenote Drawn from Promises - a Mythic Bastionland House Rule | Valeria Loves. Looking at Weydlyn’s virtues, convincing someone might be a bit of a challenge.

Tompot writhes, again twisting and undulating within his clothes, as though many snakes sought to spill from these robes, “Very well, I accept your Promise. And give you this look for the fell beast on the western shores of the silver lake south east of here.”

Sir Weydlyn bows deeply, “Thank you Tompot, I shall leave you this morning and make haste for the castle. Kelwun, are your prisoners bound by oath or leather, for we must ride to the castle.”

“Sir, there’s a tower nearby, surely we could first take the prisoners…”

Your prisoners Kelwum. Yours!”

“Yes, my prisoners,” continues Kelwum, “and perhaps there’s justice or reward offered in the tower. I’ve bound my prisoners hands, they’ll walk. We should also get their horses.”

Sir Wydlyn growls eyeing the noon day sun. “Listen Kelwum’s prisoners, to attempt escape is to forfeit your life. We make for the tower.”

Technicalities

I’m looking to reuse existing Emacs functionality. First, while playing, I’ve set custom bookmarks. When I invobke the following, it clobbers my default bookmarks and instead uses the given file.

(bookmark-load "~/SyncThings/source/campaign-forged-from-the-worst.el"
                 t nil t)

That file has links to various PDFs and web pages related to the campaign or how to run Mythic Bastionland .

I also registered a new random table, using my random-table.el package (code on Github):

(random-table/register
 :name "Mythic Bastionlan > Forged from the Worst > Myth"
 :data '("The Beast"
         "The Fortress"
         "The Judge"
         "The Lich"
         "The Mountain"
         "The Wall"))

The “Forged from the Worst” table provides a means of determining a random applicable myths.

I also transcribed the following tables from Chris McDowall’s Ask the Stars, to use those for augury rolls.

(random-table/register
 ;; From https://bit.ly/askthestars
 :name "Ask the Stars > Yes or No"
 :roller (lambda (&optional table)
           (if (yes-or-no-p "Is the answer likely yes?")
               (max (+ 1 (random 12)) (+ 1 (random 12)))
             (min (+ 1 (random 12)) (+ 1 (random 12)))))
 :data '("No" "No" "No"
         "No but" "No but" "No but"
         "Yes but" "Yes but" "Yes but"
         "Yes" "Yes" "Yes"))

(random-table/register
 ;; From https://bit.ly/askthestars
 :name "Ask the Stars > Signs & Positions"
 :data '("- Sign :: {Ask the Stars > Sign}\n- Position :: {Ask the Stars > Position}"))

(random-table/register
 :name "Ask the Stars > Sign"
 :private t
 :data '("The Fang (hostility - fear)"
         "The Wings (freedom - nature)"
         "The Cage (protection - obligation)"
         "The Hand (creation - misdirection)"
         "The Mask (persuasion - shame)"
         "The Eye (judgement - secrets)"
         "The Child (learning - greed)"
         "The Traveller (wandering - chance)"
         "The Elder (authority - tradition)"
         "The Ship (direciton - struggle)"
         "The Council (opposition - cycles)"
         "The Legion (unification - identity)"))

(random-table/register
 :name "Ask the Stars > Position"
 :private t
 :data '("Rising (growth - possibility)"
         "Entombed (memory - death)"
         "Twinned (intimacy - dependency)"
         "Waning (desire - decay)"
         "Rooted (stability - plenty)"
         "Bowed (submission - mercy)"
         "Colliding (change - violence)"
         "Burning (honesty - pride)"
         "Veiled (faith - deceit)"
         "Exiled (guilt - autonomy)"
         "Crowned (ambition - ruin)"
         "Reflected (reversal - vanity)"))

Reply by Email

]]>
2025-12-08T20:44:15-05:00 2025-12-08T20:44:15-05:00