WELCOME TO OHR GAMES

Ohr Games is a community built around creativity, collaboration, and a shared passion for gaming and storytelling. Rooted in the concept of Ohr—a Kabbalistic term describing divine light and emanations—the community strives to be a source of insight, connection, and inspiration for its members. While PC gaming is a key branch of the group, Ohr’s heart lies in its immersive living campaigns. From 2014 to 2019, the Lands of Lore campaign and the world of Ohrros brought together over 500 members, making it one of the largest tabletop gaming communities of its time. With 8 dedicated game masters running 8-10 games weekly, Ohr Games became a haven for adventurers and storytellers alike. Events like The Siege of Kastaark—a massive session with over 40 players working together to retake their city—defined its legacy as a place where gaming meets epic, collaborative storytelling.Ohr Games is more than a gaming community—it's a shared creative endeavor. Over the years, members have come together to build Ayotha, or "The World of Ohr," a collaborative world set within the Dreaming Worlds. This shared universe has grown into a living tapestry of cities, flora, fauna, holidays, poetry, dungeons, and more. Players have contributed original writing, short stories, adventure designs, and entire gaming systems, resulting in over 800,000 words of collective creativity.Our community-driven approach extends to game design. We've created numerous free-to-play OSR systems, including Torches in the Dark (currently in its 3rd edition), Infinite Darkness (a grim sci-fi setting), and other systems like Omensworn, Barbarous, and Orenda, all rooted in the Dreaming Worlds. With six downloadable rulebooks and countless house rules, archetypes, spells, races, and items, Ohr Games exemplifies a philosophy of "create what you want to play." Whether you're a storyteller, designer, or adventurer, Ohr Games is a hub for creativity and collaboration.

WORLD BUILDING SUBMISSIONS

Help create Ayotha: voluntary submissions wanted. Are you interested in detailing a certain part of the world? Have an idea for a new type of racial weapon? Please find use the submission form below to submit your content to the Ohr Games.Some things that we are looking for:
-- DETAILS OF THE WORLD, SUCH AS THE ECONOMY, GEOGRAPHY, FLORA, AND FAUNA.
-- GOVERNMENT AND LAWS, ETC.
-- ORIGINAL POETRY
-- ORIGINAL ADVENTURES
-- ORIGINAL FEATS
-- ORIGINAL CLASS PATHS, ARCHETYPES, and FEATURES
-- ORIGINAL SPELLS, MAGIC WEAPONS, MONSTERS, AND NPCs
-- OTHER THINGS.
BY SUBMITTING CONTENT YOU AGREE THAT YOU ARE THE OWNER OF SAID WORKS, AND THAT THE WORK COMES UNDER THE CC BY 4.0 LISCENCE BELOW.
All work submitted becomes licensed under CC BY 4.0


THE WORLD THAT WAS

MAGICK BRINGS ONLY RUIN AND DEATH TO THE DREAMING WORLDS...

The world is a fragmented, ruined shell of what it once was, and magic is what ensures it stays that way. In Ages past, before the Night of the Vacant Throne—when mankind and the other races of Ayotha were given the chance to meet a sliver of what it was that they had foolishly called their Gods—the world followed the rules set out for it at its creation. Arcanery, in a very generous sense of implying it existed at all, was only a theoretical, philosophical exercise, conducted in meeting halls and lounges by societies that simply enjoyed dressing their social circles in a different kind of trapping. It did not exist; not merely as the world sees it now, in this broken age of horrors, but at all, and when it did arrive, it did so on the wings of nightmares.

Magic is not some mystical recipe its practitioners follow on a day-to-day basis to casually manipulate the world around them; while it affects very real results in the world around it, these results are consequences of another reality being imposed upon ours and causing the one we live in to shatter, albeit in—at least hopefully—a controlled fashion. As far as scattered records can ascertain, the application of this knowledge came at the hands of the humans of Ayotha first, as most of their peers and the other races struggled not just to rebuild but to survive in the lloigor-wracked wasteland that was once a comparatively peaceful, fertile world. After the Night of the Vacant Throne, rumors of uncovered writings which allowed real magic, real power, to be channeled through a dedicated practitioner and out into the world. These writings were collected in an utterly forbidden grimoire that came to be known as the Black Book, a tome with many speculated origins. Some say the Book is a legitimately living, sentient other, alien and conscious entity with unknown and sinister purposes. Others say that it exists simultaneously in other times, other places, other worlds, and exists conterminously to spread its influence in the past, present, and future all.

What is incontrovertible, however, is that the following of parsed and translated rituals found in this book or copies of it has wrought unmistakable horror upon the world and those in it. While the Night of the Vacant Throne was responsible for the destruction of cities, towns, and life, the magic found in the Black Book is responsible for the corruption of what remains and what has been built to try and effect repairs upon those shattered remnants. While there is real power to be found in the practice of these rituals, the overwhelming vast majority that even know of the existence of the Black Book are far from willing to pay the cost of not just their own sanity, but that of their friends, loved ones, and fellow men. Every so-called spell cast brings Ayotha closer to a tremulous reality merged with that of wherever the grimoire truly came from, and even amongst the universally loathed practitioners, all but the maddest can recognize that that would bode very, very poorly for our world and those living in it.

Most do not know of the intricacies of magic, of course, but they know enough and have heard enough of rumors to wish to stamp it out where it exists. People have been strung up, burned, tied, and quartered, even tortured to death over days over mere mention of witchcraft, and this is the case through almost all true civilization. There exist, of course, esoteric societies, occasional outposts, even whole races of people who feel differently, but these people are outside of their own universally reviled as destroyers and corruptors of the highest order, and they are ruthlessly hunted and slain by those who catch wind of them. Only in the vast, far reaches of the untamed world is this viewpoint ever relaxed, and even then, it would still be a poor idea to reveal oneself—for fear is the most powerful motivator of violence.

THE DREAMING WORLDS...In the eons before existence as we know it, before stars flared into brilliance and galaxies danced across the canvas of the cosmos, there existed an entity of immeasurable magnitude. This entity, Moros, was not a mere planet or star but a celestial titan, a being whose essence was interwoven with the very fabric of the universe.Moros existed in a realm beyond the grasp of mortal comprehension. It was a realm of thoughts and dreams, of emotions and memories, where time flowed like a river, twisting and turning through the tapestry of existence. It was here that Moros lived, breathed, and dreamt.But as with all things in the cosmos, even the mighty titan was not immune to the inexorable march of time. As the eons passed, Moros felt the weight of its age, the weariness of countless memories and experiences etched into its consciousness. It knew that its time was drawing to an end, that the cycle of birth, life, and death that governed the universe would also claim it.And so, Moros began its death-dream.As the titan's life force waned, its dreams became a torrent of emotions and memories, a maelstrom of thoughts that spilled into the cosmos. This cosmic tempest was the birth of the Dementia Vortex, a swirling vortex of psychic energy that emanated from Moros' very being. It was a place where memories and dreams took form, where the echoes of Moros' existence manifested as ephemeral landscapes and visions.In this vortex, dream-born entities came into being. They were born of Moros' thoughts, fragments of its consciousness given life and purpose. They navigated the shifting dreamscape, seeking to understand the titan's memories before they faded into the abyss. These dream-born explorers were drawn to the vortex, connected to Moros by an invisible thread woven from the fabric of the cosmos.As the Dementia Vortex expanded, its influence rippled across the universe. Mortals and immortals alike felt the tug of its power, drawn to its mysteries. Some saw it as a source of great knowledge, a chance to glimpse the secrets of a dying titan. Others saw it as a threat, a disturbance in the cosmic order that must be contained.The story of Moros became intertwined with the fate of the universe itself. As dream-born explorers ventured deeper into the vortex, they discovered memories that spanned epochs - civilizations rising and falling, galaxies colliding, moments of beauty and despair. They witnessed the birth of stars and the extinguishing of galaxies, all encapsulated within Moros' death-dream.

Ayotha: The Realm of Twilight

Ayotha, a twilight-soaked land where dream and waking cross paths, is haunted by its keepers, the Dreamweavers. These watchers twist dreams into fragile beauty or dark ruin, taming the restless minds of the living. Then came the Slender Crown, a godlike fiend who drank deeply from the well of dreams. Its arrival broke Ayotha’s balance, casting its people into a nightmare of blood-soaked cycles. Cities rise, flicker, and crumble; hope snuffs itself out with grim inevitability. The twilight lingers, a pall of quiet despair stretched thin over the bones of fallen empires.

Meroka: The Realm of Twisted Magicks

Meroka lies cloaked in shadow, its air thick with smoke and the hum of gears. Here, magic and machines weave together in a grim tapestry of ingenuity and menace. The sorcery is subtle, whispering through the grinding of pistons; the machinery is alive, crackling with a sorcerer’s malice. It’s a realm where wonder carries a sharp edge, where marvels are cruel and horrors are ingenious. In Meroka, nothing stays whole; beauty corrodes, and power comes with a price etched deep in iron and flesh.

Vannarad: The World of Mirrors

In Vannarad, reality bends like a trickster’s grin. The Illusionists rule here, conjuring marvels and horrors from sheer thought. Towers of mist rise and fall; monsters prowl, born from stray imaginings. Nothing lasts, for the line between real and false vanishes as swiftly as it appears. Danger is everywhere, though it’s veiled behind the glamour of ever-shifting wonders. Vannarad is a world that dazzles the senses and mocks reason, drawing all who enter into its beguiling, treacherous games.

Malat: The Realm of Unyielding Order

Malat brooks no chaos. The Lawgivers see to that, their cold eyes scanning for any crack in the system. Precision reigns here, its people moving like cogs in a machine. The Arbiters of Law are its enforcers, wielding iron rule against any who falter. To them, disorder is a plague to be crushed beneath unyielding boots. Malat’s streets shine with ruthless perfection, but beneath the surface lies a suffocating dread—the kind bred by a world that never forgives mistakes. All laws are enforced without exception.

The air here tastes of iron and despair, thick with the mists of Enlil that shroud Nuatha in ceaseless twilight. Once, Gravehold was a place where souls were sent to be forgotten—a prison island torn from the mainland, left to fester with its darkness. But something deeper has taken root. Something older.

Welcome, wanderer. Or perhaps prisoner? Outlaw? Fugitive? It matters not what brought you to these shores, for Gravehold cares not for names or past sins. The stones of Nuatha remember all, and the ancient trees in the forests whisper secrets in languages long buried. Here, men do not live; they endure, stalked by creatures malformed and twisted by the island’s old, aching madness.

Beneath the shattered prison, in depths where light itself withers, cultists dance and chant in rhythms that echo through your bones. They seek forgotten gods, half-dreamed and thrice-damned, lurking in shadowed depths that even the dead fear to tread. In the haunted city, broken spires claw at the heavens, and eyes—hungry, hollow eyes—watch from every corner, every darkened alley, every tendril of fog.

Do you feel it? The weight of something that should not be. The pulse beneath the earth, like a heart long stilled, beating once more. There are secrets here, deep within tombs older than any written word. But beware, for the price of knowledge here is high, and few leave Gravehold with their minds—or souls—intact.


Case Study 1

Case Study 1

Click to Expand

Details about Case Study 1 go here. You can add text or additional images for more information.

Case Study 2

Case Study 2

Click to Expand

Details about Case Study 2 go here. Showcase project highlights or results.

Case Study 3

Case Study 3

Click to Expand

Details about Case Study 3 go here. Provide insight into your process or outcomes.

function toggleCase(element) { const card = element.closest('.case-card'); card.classList.toggle('expanded'); }

Community Hub

Join Our Discord
Placeholder 1
Placeholder 2
Placeholder 3

Character Profiles

Jane the Warrior
Warrior | Defender

Jane is a fearless warrior known for her strength and dedication to protecting her allies. She wields a mighty sword and shield.

Alex the Mage
Mage | Spellcaster

Alex harnesses the power of the elements to unleash devastating spells, mastering both fire and ice.

Luna the Rogue
Rogue | Assassin

Luna is a cunning rogue who specializes in stealth and precision strikes, always striking from the shadows.

function toggleProfile(card) { card.classList.toggle('expanded'); }

Choose Your Adventure

You stand at the edge of a dark forest. The wind howls, and the trees seem to whisper your name. Do you dare to enter?

The forest is eerily quiet. As you step forward, you hear a growl behind you. Do you run or turn to face the threat?

You decide not to enter the forest. Instead, you find a small cabin nearby. Do you knock on the door or walk away?

You run as fast as you can, but the growling gets closer. Suddenly, you trip and fall...

You turn to face the threat, and a massive wolf emerges from the shadows. It’s a fight for survival...

You knock on the door, and it creaks open. A kind-looking old man invites you in...

You walk away from the cabin, missing the opportunity to discover its secrets...

function showStory(storyId) { const sections = document.querySelectorAll('.story-section'); sections.forEach(section => section.classList.remove('active')); document.getElementById(storyId).classList.add('active'); }

Frequently Asked Questions

What is this site about?
This site is a hub for engaging projects, stories, and creative features.
How do I join the community?
You can join our community by signing up through the Discord link in the Community Hub.
What projects are featured here?
This site showcases interactive tools, creative stories, and unique features like a branching Story Builder and Animated Case Studies.
function toggleFAQ(element) { const item = element.parentElement; item.classList.toggle('active'); } function filterFAQs(event) { const query = event.target.value.toLowerCase(); const items = document.querySelectorAll('.faq-item'); items.forEach(item => { const question = item.querySelector('.faq-question').textContent.toLowerCase(); const answer = item.querySelector('.faq-answer').textContent.toLowerCase(); if (question.includes(query) || answer.includes(query)) { item.style.display = 'block'; } else { item.style.display = 'none'; } }); }

Feature Comparison

FeaturePlan APlan BPlan C
Unlimited Storage✔️✔️
24/7 Support✔️✔️
Custom Domains✔️✔️
Analytics✔️✔️✔️
function highlightRow() { const row = document.getElementById('highlight'); row.classList.toggle('highlight'); }
Arden the Wanderer
A mysterious traveler with tales from distant lands.

Arden has been seen in the forests of Kelnor, guiding lost souls. His true intentions remain a mystery.

Lady Seraphine
A noblewoman with a penchant for intrigue and diplomacy.

Lady Seraphine is known for her sharp wit and unwavering resolve. She often acts as a mediator in disputes among the lords.

Garron the Blacksmith
A rugged blacksmith with a heart of gold and a fiery temper.

Garron’s weapons are sought after by warriors across the realm. Despite his gruff demeanor, he secretly supports the local orphanage.

function toggleNPC(card) { card.classList.toggle('expanded'); }

Quest Board

Retrieve the Lost Relic
Travel to the Ruins of Andminas and recover the Amulet of Eternity.
Rewards: 500 Gold, 1 Rare Item
Defeat the Bandit Leader
The Crimson Blades have taken over the trade routes. Eliminate their leader.
Rewards: 300 Gold, Reputation Increase
Escort the Caravan
Protect a merchant caravan traveling through the Wailing Wastes.
Rewards: 200 Gold, 1 Magic Scroll
Gather Alchemical Herbs
Collect 10 Bloodthistle plants from the Darkwood Forest.
Rewards: 100 Gold, 1 Potion

Scrollable Bestiary

Shadowfang Beast
A nocturnal predator with glowing eyes.
Rockhide Golem
A stone guardian impervious to most attacks.
Flame Serpent
A fiery serpent dwelling in volcanic caverns.
Venomous Bloom
A toxic plant spreading deadly spores.
Icefang Wolf
A frost-covered wolf of the tundra.
Storm Drake
A lightning-wielding dragon of the skies.
Swamp Lurker
A camouflaged predator in wetlands.
Blight Crawler
A plague-ridden insect of decay.
Forest Guardian
A treant protecting sacred groves.
Ash Phoenix
A fiery bird reborn from ashes.
Cave Wyrm
A scaled serpent from deep caverns.
Sky Terror
A winged beast that rules the skies.
const scrollContainer = document.querySelector('.scroll-container'); function scrollToStart() { scrollContainer.scrollTo({ left: 0, behavior: 'smooth' }); } function scrollToEnd() { scrollContainer.scrollTo({ left: scrollContainer.scrollWidth, behavior: 'smooth' }); }
Character Creation
Playable Races
Combat Rules
Stamina & Vitality
Equipment & Weapon Keywords
Defense Mechanics

Select a Rule

Use the menu on the left to select a section of the rules.
const rules = { characterCreation: { title: "Character Creation", text: `

Follow these steps to create your character:

  • Step 1: Create your story and custom background.
  • Step 2: Choose your starting equipment pack.
  • Step 3: Choose your race.
  • Step 4: Spend 10 attribute points (maximum of 6 per attribute).
  • Step 5: Roll 1D10 + 20 + Endurance for Stamina.
  • Step 6: Roll 1D10 + 5 for Vitality.
  • Step 7: Begin with 3 Vigor and roll 1D3 for Luck.
`, }, races: { title: "Playable Races", text: `

Here are the races you can play as:

  • KIN (Humans): Adaptive and balanced.
  • DVORK (Dwarves): Resilient and sturdy.
  • YULDRANGI (Elves): Mystical and insightful.
  • AFRIT (Harkon): Desert raiders with fire resistance.
  • FOMORI (Half-Giants): Powerful warriors with extra stamina.
`, }, combat: { title: "Combat Rules", text: `

Combat is turn-based with initiative rolls to determine the order:

  • Attack Rolls: Roll a d20 + modifiers.
  • Damage: Calculate based on weapon stats.
`, }, stamina: { title: "Stamina & Vitality", text: `

Stamina is used for abilities, while Vitality represents life thresholds:

  • Stamina: Depleted stamina reduces vitality.
  • Injuries: Severe injuries reduce maximum vitality.
`, }, equipment: { title: "Equipment & Weapon Keywords", text: `

Weapons and armor have unique traits:

  • Crush: Ignores armor resistance.
  • Cleave: Attack additional targets.
`, }, defense: { title: "Defense Mechanics", text: `

Defend against attacks with active rolls:

  • Dodge: Avoid all damage with a Finesse roll.
  • Parry: Counterattack melee strikes.
  • Block: Use shields to nullify damage.
`, }, }; function showContent(section) { const menuItems = document.querySelectorAll(".rule-item"); menuItems.forEach((item) => item.classList.remove("active")); document.querySelector(`[onclick="showContent('${section}')"]`).classList.add("active"); const contentTitle = document.getElementById("contentTitle"); const contentText = document.getElementById("contentText"); contentTitle.textContent = rules[section].title; contentText.innerHTML = rules[section].text; } function filterRules() { const query = document.getElementById("searchRules").value.toLowerCase(); const menuItems = document.querySelectorAll(".rule-item"); menuItems.forEach((item) => { item.style.display = item.textContent.toLowerCase().includes(query) ? "block" : "none"; }); }

Tip

Use light sources in dungeons to avoid accruing dread over time. Always carry extra torches!

Warning

Enemies in this zone have high critical strike rates. Equip armor with high resilience to reduce risk.

Fun Fact

The ruins of Zithrond are said to have been built atop an ancient, sleeping dragon. Who knows what lies beneath?

Step 1: Introduction

Welcome to the ruins of Zithrond, an ancient city steeped in mystery. The first challenge is finding the entrance hidden in plain sight.

Step 2: The First Chamber

The air grows cold as you descend into the first chamber. Strange markings line the walls, and faint whispers echo in the distance.

Step 3: The Final Puzzle

At the heart of the ruins, a pedestal holds an orb glowing with faint blue light. Inscribed around it are riddles that must be solved to proceed.

function toggleStep(header) { const content = header.nextElementSibling; content.classList.toggle("active"); }
Find the entrance to ZithrondHigh
Gather supplies for the journeyLow
Solve the riddle of the stonesHigh
Locate the dragon's lairMedium
function toggleComplete(item) { item.classList.toggle("completed"); }

Welcome to Zithrond

Explore the ruins. Uncover the secrets. Survive the dread.

Discover the Secrets
Hover over me

Ancient Artifact

This relic was forged in the fires of Zithrond, holding the secrets of the ancients.

Effect: Increases courage by 20% when used in combat.

Hover for lore

Festival of Shadows

A celebration marking the victory of light over darkness, featuring mysterious rituals.

Exploration Progress

75%

Quest Completion

50%

Resource Gathering

90%
Event Starts In:
00
Days
00
Hours
00
Minutes
00
Seconds
function startCountdown(targetDate) { const countdownElement = document.getElementById("countdown"); function updateCountdown() { const now = new Date().getTime(); const distance = targetDate - now; const days = Math.floor(distance / (1000 * 60 * 60 * 24)); const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((distance % (1000 * 60)) / 1000); document.getElementById("days").textContent = days.toString().padStart(2, "0"); document.getElementById("hours").textContent = hours.toString().padStart(2, "0"); document.getElementById("minutes").textContent = minutes.toString().padStart(2, "0"); document.getElementById("seconds").textContent = seconds.toString().padStart(2, "0"); if (distance < 0) { clearInterval(interval); countdownElement.innerHTML = "
Event Started!
"; } } const interval = setInterval(updateCountdown, 1000); updateCountdown(); } // Set target date for countdown (e.g., Dec 31, 2024) const targetDate = new Date("2024-12-31T23:59:59").getTime(); startCountdown(targetDate);

Awards & Achievements

Best Design 2023
Excellence in Innovation
Certified Expert 2022
Top Performer
Leadership Excellence

Shoutout Wall

Jane Doe
Outstanding contributions to the community!
John Smith
Exceptional teamwork and leadership skills.
Alex Johnson
Creative problem-solving and innovation.
Chris Lee
Continuous dedication and hard work.

Interactive Hex Map

Location 1
Location 2
Location 3
Location 4
Location 5

Roadmap

Phase 1: Research

Completed foundational research and gathered initial feedback from stakeholders.

Phase 2: Prototyping

Developed the first working prototype and conducted usability testing.

Phase 3: Development

Finalized core features and began full-scale development.

Phase 4: Launch

Successfully launched the product and began ongoing support and updates.

Explore the Object

Click and drag to rotate the object

// 360° Viewer Configuration const images = []; const frameCount = 36; // Number of frames let currentFrame = 0; let isDragging = false; let startX = 0; const canvas = document.getElementById('viewerCanvas'); const ctx = canvas.getContext('2d'); // Load images for (let i = 1; i <= frameCount; i++) { const img = new Image(); img.src = `https://your-image-url/frame-${i}.jpg`; // Replace with your images images.push(img); } // Initialize canvas canvas.width = 500; canvas.height = 400; images[0].onload = () => ctx.drawImage(images[0], 0, 0, canvas.width, canvas.height); // Draw current frame function drawFrame() { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(images[currentFrame], 0, 0, canvas.width, canvas.height); } // Mouse events for rotation canvas.addEventListener('mousedown', (e) => { isDragging = true; startX = e.clientX; canvas.style.cursor = 'grabbing'; }); canvas.addEventListener('mousemove', (e) => { if (!isDragging) return; const dx = e.clientX - startX; const frameChange = Math.floor(dx / 10); startX = e.clientX; currentFrame = (currentFrame - frameChange + frameCount) % frameCount; drawFrame(); }); canvas.addEventListener('mouseup', () => { isDragging = false; canvas.style.cursor = 'grab'; }); canvas.addEventListener('mouseleave', () => { isDragging = false; canvas.style.cursor = 'grab'; });
Item 1
Item 2
Item 3
Item 4

Dynamic Leaderboard

RankNameScore
1Arden2500
2Seraphine2400
3Garron2300
4Kellan2200
5Lyra2100
function sortTable(columnIndex) { const table = document.getElementById("leaderboardTable"); const rows = Array.from(table.rows).slice(1); const ascending = table.getAttribute("data-sort-order") !== "asc"; rows.sort((rowA, rowB) => { const cellA = rowA.cells[columnIndex].textContent.trim(); const cellB = rowB.cells[columnIndex].textContent.trim(); return isNaN(cellA) || isNaN(cellB) ? cellA.localeCompare(cellB) * (ascending ? 1 : -1) : (cellA - cellB) * (ascending ? 1 : -1); }); rows.forEach(row => table.tBodies[0].appendChild(row)); table.setAttribute("data-sort-order", ascending ? "asc" : "desc"); }

Interactive Lorebook

Factions

The Iron Circle, the Grey Cabal, and the Crimson Order are the primary factions. Each faction vies for control, their motives cloaked in shadow and ambition.

Artifacts

The Bloodstained Locket of Hereth and the Black Blade of Korrin are relics steeped in history and power, their origins lost to time.

History

The Age of Dread marked the rise of the Wytch Queen, whose reign brought suffering and despair. The Age of Shadow followed, where the seeds of rebellion were sown.

function toggleLore(category) { const content = category.nextElementSibling; content.style.display = content.style.display === 'block' ? 'none' : 'block'; }
NPC Encyclopedia
Arden the Wanderer
Mysterious Traveler
Arden roams the forests, aiding lost souls. His knowledge of ancient paths and secrets is unparalleled, but his motives remain unclear.
Lady Seraphine
Diplomat and Noblewoman
Known for her sharp wit, Lady Seraphine mediates disputes among the lords. Her charm and cunning make her an invaluable ally—or a dangerous enemy.
Garron the Blacksmith
Master Artisan
Garron's skill in crafting weapons is legendary. Despite his gruff demeanor, he secretly funds an orphanage in the city outskirts.
Lyra the Herbalist
Alchemical Expert
Lyra's potions and elixirs are in high demand. She harvests rare herbs under moonlight, believing it enhances their potency.
function toggleNPCDetails(card) { card.classList.toggle('expanded'); }

RPG Combat Log

Shadowfang Beast attacks with Bite!-20 HP
Cleric casts Healing Light.+15 HP
Rockhide Golem uses Earthquake!-30 HP
function addLogEntry() { const logContainer = document.getElementById('combatLog'); const entryTypes = ['damage', 'healing', 'special']; const messages = { damage: ['Shadowfang strikes!', 'Enemy attack lands!', 'Critical hit!'], healing: ['Cleric heals the party.', 'Potion restores health.', 'Healing Light activated.'], special: ['Golem smashes!', 'Mage casts Fireball!', 'Dragon breathes fire!'], }; const type = entryTypes[Math.floor(Math.random() * entryTypes.length)]; const message = messages[type][Math.floor(Math.random() * messages[type].length)]; const value = type === 'damage' ? `-${Math.floor(Math.random() * 30 + 10)} HP` : `+${Math.floor(Math.random() * 20 + 10)} HP`; const newEntry = document.createElement('div'); newEntry.className = `log-entry ${type}`; newEntry.innerHTML = `${message}${value}`; logContainer.appendChild(newEntry); newEntry.scrollIntoView({ behavior: 'smooth' }); }

Dynamic Spellbook

Eldritch Blast

Tier 1 - Eldritch

Hellfire

Tier 2 - Infernal

Hexbind

Tier 3 - Wytchcraft

Divine Intervention

Tier 4 - Miracles

Eldritch Blast

Tier: 1

Type: Eldritch

Description: Unleash a bolt of arcane energy, dealing 15 damage to a single target.

Hellfire

Tier: 2

Type: Infernal

Description: Summon flames from the abyss, dealing 25 damage to all enemies in a 10-foot radius.

Hexbind

Tier: 3

Type: Wytchcraft

Description: Bind an enemy with magical chains, reducing their movement and attacks for 2 turns.

Divine Intervention

Tier: 4

Type: Miracles

Description: Protect an ally from harm for 1 turn and restore 30 health points.

function filterSpells() { const search = document.getElementById("searchSpells").value.toLowerCase(); const type = document.getElementById("spellType").value; const tier = document.getElementById("spellTier").value; const spells = document.querySelectorAll(".spell-card"); spells.forEach((spell) => { const spellName = spell.querySelector("h3").textContent.toLowerCase(); const spellType = spell.getAttribute("data-type"); const spellTier = spell.getAttribute("data-tier"); if ( (search === "" || spellName.includes(search)) && (type === "" || spellType === type) && (tier === "" || spellTier === tier) ) { spell.style.display = "block"; } else { spell.style.display = "none"; } }); } function showSpellDetails(spellId) { const details = document.querySelectorAll(".spell-details"); details.forEach((detail) => detail.classList.remove("active")); document.getElementById(`details${spellId.charAt(0).toUpperCase() + spellId.slice(1)}`).classList.add("active"); }
"Courage is not the absence of fear, but the triumph over it." - From the Journals of Eldran the Brave
"Even the darkest night will end, and the sun will rise again." - Ancient Proverb
The ruins of ZithrondAncient city built atop dragon bones. hold many secrets. Explorers must beware of arcane trapsMagical defenses placed centuries ago. and wandering wraithsGhostly guardians of the forgotten city..
Deep within the Sunken CryptsUnderwater tombs of lost kings., adventurers will encounter spectral knightsDeadly foes who protect the crypt's treasures.. To survive, one must solve the riddle of the stonesA puzzle unlocking the crypt’s main chamber..
Update 1: The ruins of Zithrond are now accessible to players! Event: Join the Festival of Shadows this weekend. News: Patch 1.2 introduces new mechanics and enemies. Tip: Always carry torches to avoid the dread effect!
"Courage is found in the darkest of places."
- Eldran the Brave
const quotes = [ { text: "Courage is found in the darkest of places.", author: "Eldran the Brave" }, { text: "The ruins whisper secrets only the bold dare to hear.", author: "Ancient Proverb" }, { text: "Even shadows fear the light of determination.", author: "Illuminar the Wise" }, { text: "A hero is not born but forged in the fires of adversity.", author: "Tales of Zithrond" }, { text: "Hope flickers, yet never dies.", author: "Chronicles of the Sunken Crypts" } ]; function changeQuote() { const randomIndex = Math.floor(Math.random() * quotes.length); const quote = quotes[randomIndex]; const quoteText = document.getElementById("quoteText"); const quoteAuthor = document.getElementById("quoteAuthor"); quoteText.style.opacity = 0; quoteAuthor.style.opacity = 0; setTimeout(() => { quoteText.textContent = `"${quote.text}"`; quoteAuthor.textContent = `- ${quote.author}`; quoteText.style.opacity = 1; quoteAuthor.style.opacity = 1; }, 500); } setInterval(changeQuote, 5000);
Front
Right
Back
Left
Top
Bottom
Blurb Image 1

Zithrond Ruins

An ancient city where whispers of the past linger in every shadow.

Blurb Image 2

Festival of Shadows

A mystical event celebrating the triumph of light over darkness.

Blurb Image 3

Artifact of Valor

This relic grants bravery to those who dare to wield it.

const modalOverlay = document.getElementById("modalOverlay"); function showModal() { modalOverlay.classList.add("active"); const modal = modalOverlay.querySelector(".modal"); modal.classList.add("active"); } function closeModal() { modalOverlay.classList.remove("active"); const modal = modalOverlay.querySelector(".modal"); modal.classList.remove("active"); }
NEWS & UPDATES

ROAD MAP

PHASE 1: PRE-DEVELOPMENT (ONGOING, MAY 2024 TO JANUARY 2025)

  • - Initial brainstorming and system design.

  • - consolidation of mechanics and lessons learned from previous earlier editions.

  • - Drafting new mechanics such as stamina, vigor, defense actions.

  • - Conceptualization of new Grim Sorts and racial/heritage options.

Phase 2: Core Design & Alpha Development (December 2024 - March 2025)

  • - Development of a playtest rulebook and supplementary materials.

  • - Modernization and refinement of existing systems, including combat and advancement.

  • - Implementation of new mechanics into a functional ruleset.

  • - Playtest campaign.

Phase 3: Alpha Testing Continued (April 2025 - July 2025)

  • - Open playtest, free playtest rulebook on itch.io.

  • - Outreach: Recruitment of testers for games via Roll20, Foundry, etc.

  • - Focus area: Character creation flow & Complexity.

  • - Focus area: Combat mechanics and balance.

  • - Focus area: Testing the dread system and light mechanics.

  • -Outcome: Iteration based on feedback for rule clarity, pacing, and balance.

Phase 4: Beta Development & Testing (Q1-Q2 of 2026)

  • - Polished Ruleset: Incorporate alpha feedback for a more refined beta.

  • - Campaign Testing: Test the system's scalability for long-term campaigns.

  • - Final Draft Prep: Layout, Gm tools, player handouts, etc.

Phase 5: Finalization & Release (Q3-Q4 of 2026)

  • - Adjustments: Final tweaks to mechanics, balance, and presentation.

  • - Professional Polish: Editing and integration of art and design elements.

  • - Kickstarter: Digital and print release via PDF, print-on-demand.

  • - Ongoing Engagement: Continued updates and community expansions post-launch.

THE GAME SYSTEM

Torches in the Dark is a journey through Ayotha, a world so steeped in misery and decay that light itself has learned to tread lightly. Here, the players are no champions or saviors, but scavengers—like crows picking the bones of a once-great realm that now teeters on the edge of oblivion. Ayotha is a land where hope and kindness are fleeting, devoured by the overwhelming dread that encroaches with each setting sun. This is not a world for heroes; it is a ruthless, dark landscape where survival is a cruel taskmaster, and those who live must be equally ruthless or cunning to endure.

The characters in Torches in the Dark are grim-eyed mercenaries, sly thieves, hardened brigands, and savage chieftains. They are the carrion-feeders of society, collecting, stealing, and hoarding what little remains of worth in a land gone to ruin. Honor is a rare currency, found more in tales than on the roadways or in the dark alleys of Ayotha’s cities. Civilization is merely another twisted labyrinth of survival, filled with darkened taverns, crooked lords, and back-alley deals where a knife in the back is as likely as a handshake. Lords bicker over scraps of power, ruling their crumbling keeps and fortified towns with cold iron and sharper tongues, while sorcerers and wytches rise as tyrants in the fringes, revered as deities by the fearful peasants who dare not challenge them.

The countryside is a nightmare given form, where grotesque eldritch creatures roam, birthed by the remnants of the Black Crusades and the failed legions of Slender Crown, the undead god. Battlefields, now ancient and forgotten, are haunted by shambling horrors—lost soldiers, wights, and worse. The lands are riddled with crumbling dungeons, long-abandoned cities piled high with the bones of the innocent, and places no sane soul would tread. Once night falls, when the guiding light of Aith’na fades, the dread sweeps over Ayotha in full force. The world outside of pallisaded villages, crumbling city-states, and desperate outposts becomes a death trap. For those caught outside these sparse beacons, there is no mercy, only the embrace of the dread—an endless dark that consumes all, taking light, warmth, and life without question or care.

In Torches in the Dark, survival is a ceaseless struggle, and the price is steep. The grim reality of Ayotha strips away illusions, laying bare a world where every day is a victory, and every night is a battle to see the dawn.

WANT TO DOWNLOAD PREVIOUS VERSIONS OF TORCHES IN THE DARK?

Feel free to contact us on Discord, message me at @Ridrith.

Briagothian Name Generator

Click the button to generate a name!
function generateName() { const firstNames = [ "Aethelwulf", "Beorn", "Cedric", "Eadric", "Freya", "Godric", "Halda", "Ida", "Jorunn", "Keldric", "Leofric", "Morgana", "Oswin", "Ragnild", "Sigrid", "Tobias", "Ulrich", "Vigdis", "Wulfric", "Yrsa", "Alaric", "Brynhild", "Cassian", "Dagmar", "Eirik", "Faelric", "Gerda", "Hrothgar", "Ilfred", "Jarmila", "Kaelric", "Lysandra", "Magda", "Nerthus", "Osmund", "Percival", "Quenilda", "Ragnar", "Sigismund", "Thrain", "Ulfwyn", "Valdrik", "Winfrid", "Yorick", "Zigrun", "Ardith", "Berengar", "Cerdic", "Dreka", "Eowyn", "Faramond", "Giselle", "Herleif", "Ingrid", "Jodoc", "Kirsten", "Lucan", "Malric", "Nienna", "Oberon", "Patrin", "Quelan", "Raelynn", "Soren", "Tirion", "Uthred", "Vilda", "Wystan", "Ylvana", "Zelmira", "Arvid", "Baldric", "Cedwynn", "Dain", "Erland", "Froda", "Gunther", "Hilda", "Isolde", "Jorah", "Kassandra", "Leoric", "Morwen", "Norric", "Odessa", "Perrin", "Quintus", "Roderic", "Severin", "Torvald", "Ulrik", "Vilhelm", "Warin", "Yevana", "Zephyr" ]; const lastNames = [ "Aethelhelm", "Beornwulf", "Cedricsen", "Eadwulf", "Freyadottir", "Godwulf", "Halvorson", "Idesdottir", "Jorvik", "Keldrisson", "Leofhelm", "Morgandottir", "Oswulf", "Ragnarsen", "Sigvald", "Tobiasen", "Ulricson", "Vigdisdottir", "Wulfricsson", "Yrsavik", "Alaricson", "Bryndottir", "Cassidottir", "Dagmarsson", "Eiriksson", "Faelwulf", "Gerhild", "Hrothhelm", "Ilfredsen", "Jarmiladottir", "Kaelson", "Lysdottir", "Magdalvik", "Nerthson", "Oswyk", "Percivald", "Quenildsen", "Raghelm", "Sigwin", "Thrainsson", "Ulfheim", "Valdwulf", "Winhelm", "Yorhelm", "Zigrunsen", "Ardithson", "Berendottir", "Cerdheim", "Drekvald", "Eowyk", "Faramund", "Giseldottir", "Herald", "Ingridsen", "Jodhelm", "Kirsden", "Lucanson", "Malwulf", "Nienvild", "Oberwald", "Patrinheim", "Quelvik", "Raelson", "Soredottir", "Tirwald", "Uthricson", "Vildson", "Wystald", "Ylvanson", "Zelmirdottir", "Arvidsen", "Baldhelm", "Cedwinson", "Dainsson", "Erlandson", "Frodadottir", "Gunthar", "Hildwald", "Isoldef", "Jorheim", "Kasson", "Leorheim", "Morwin", "Norwald", "Odessdottir", "Perrald", "Quintald", "Roderheim", "Severindottir", "Torvalk", "Ulwulf", "Vilheldottir", "Warinson", "Yevdottir", "Zephalk" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Vandorian Name Generator

Click the button to generate a name!
function generateVandorianName() { const firstNames = [ "Azrael", "Ezekiel", "Mordecai", "Zebulon", "Hadriel", "Barak", "Tzvi", "Uriel", "Liora", "Avner", "Seraphina", "Jadon", "Noam", "Shira", "Malachai", "Elazar", "Gavriel", "Ananias", "Eshkol", "Yonatan", "Meir", "Boaz", "Keshet", "Ithamar", "Adonias", "Ezriel", "Nimrod", "Aviel", "Hadar", "Oren", "Azaiah", "Zephan", "Micajah", "Sethra", "Arkan", "Drakor", "Nadriel", "Kedron", "Shaddai", "Velar", "Thamiel", "Doreth", "Orion", "Sivan", "Tarquin", "Zebediah", "Tavor", "Laziel", "Malchar", "Vesrah" ]; const lastNames = [ "Barakel", "Gothrin", "Zioneth", "Darak", "Malkiel", "Tzidriel", "Benethor", "Lazarov", "Yehiel", "Simeonov", "Ardorin", "Vandar", "Ithrael", "Zameth", "Drakhal", "Kedorath", "Torad", "Shamriel", "Ebron", "Nadeth", "Tamarov", "Kesheth", "Malikhan", "Viroth", "Azariel", "Razan", "Tzidon", "Havilah", "Shael", "Vorath", "Nazir", "Gaveth", "Zedkiel", "Mizpah", "Joktan", "Saphorin", "Meirav", "Zurath", "Doveth", "Navar", "Iradon", "Ketherin", "Ezorin", "Rothar", "Shaizan", "Velorin", "Thaleth", "Jothar", "Noreth", "Varaz" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('vandorian-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Arkkadian Name Generator

Click the button to generate a name!
function generateArkkadianName() { const firstNames = [ "Enlil", "Ziusudra", "Naram", "Ashur", "Marduk", "Gilgamesh", "Eshkar", "Dumuzi", "Lugal", "Tammuz", "Belit", "Ninurta", "Ishtar", "Ereshkigal", "Siduri", "Anu", "Kishar", "Shulgi", "Adad", "Nabu", "Amurru", "Akkad", "Utu", "Sargon", "Etana", "Hammurabi", "Tiglath", "Ashurbanipal", "Eannatum", "Sin", "Phoenicia", "Melqart", "Adoniram", "Ahiram", "Eshmun", "Baal", "Anat", "Dido", "Zakarbaal", "Abdashtart", "Carthalo", "Hannibal", "Bostar", "Hamilcar", "Hasdrubal", "Mago", "Sophonisba", "Barca", "Tanit", "Hanno", "Astarte", "Titus", "Aulus", "Gaius", "Lucius", "Marcus", "Publius", "Servius", "Tiberius", "Decimus", "Quintus", "Cornelia", "Domitia", "Aquila", "Faustus", "Horatia", "Livia", "Nero", "Julius", "Caecilia" ]; const lastNames = [ "Babylonis", "Uruk", "Larsa", "Lagash", "Isin", "Sippar", "Eridu", "Nippur", "Ur", "Akkadum", "Mari", "Ebla", "Adab", "Kutha", "Dilmun", "Nineveh", "Ashurim", "Harran", "Arpad", "Tadmur", "Byblos", "Sidon", "Tyre", "Arados", "Kition", "Amrit", "Malka", "Kart", "Barcid", "Bosra", "Akko", "Zorba", "Gades", "Caralis", "Lixus", "Utica", "Carthage", "Capua", "Brundisium", "Puteoli", "Pompeii", "Herculaneum", "Ephesus", "Antioch", "Alexandria", "Ctesiphon", "Tarsus", "Pergamon", "Mycenae", "Thebes", "Heliopolis", "Delphi", "Pella", "Rhegium", "Sybaris", "Cumae", "Velitrae", "Tarraco", "Massilia", "Numantia", "Corduba", "Gades", "Lugdunum", "Arelate", "Aquileia", "Mediolanum", "Eboracum", "Lindum", "Isca", "Corinium" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('arkkadian-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Kashath Name Generator

Click the button to generate a name!
function generateKashathName() { const firstNames = [ "Bartosz", "Dobrosław", "Kazimierz", "Łukasz", "Mikołaj", "Radosław", "Stanisław", "Witold", "Zbigniew", "Bojan", "Davor", "Goran", "Ivica", "Mislav", "Zdravko", "Dragomir", "Milivoj", "Vladan", "Branimir", "Stjepan", "Tihomir", "Radovan", "Bogdan", "Milan", "Slobodan", "Vuk", "Jovan", "Đorđe", "Nemanja", "Žarko", "Darko", "Rastko", "Vladimir", "Marko", "Nikola", "Stefan", "Dušan", "Uroš", "Miroslav", "Petar", "Toma", "Veselin", "Vid", "Radomir", "Lazar", "Velimir", "Zoran", "Vesna", "Mirjana", "Slavica", "Jasna" ]; const lastNames = [ "Kowalski", "Wiśniewski", "Wójcik", "Kamiński", "Zieliński", "Szymański", "Woźniak", "Kozłowski", "Jankowski", "Król", "Novak", "Horvat", "Kovačić", "Marić", "Petrović", "Nikolić", "Jovanović", "Marković", "Stanković", "Radulović", "Milovanović", "Đorđević", "Stefanović", "Ilić", "Vasiljević", "Branković", "Kostić", "Lukić", "Pavlović", "Perić", "Radosavljević", "Slavnić", "Bogdanović", "Vuković", "Živković", "Mišić", "Milutinović", "Obradović", "Veselinović", "Vladisavljević", "Tomić", "Krstić", "Rašković", "Jurić", "Matić", "Babić", "Vukmanović", "Popović", "Pešić", "Filipović" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('kashath-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Thorimund Name Generator

Click the button to generate a name!
function generateThorimundName() { const firstNames = [ "Aedh", "Artos", "Brannoc", "Cadeyrn", "Cian", "Epona", "Gwynn", "Llewellyn", "Meredith", "Owain", "Rhiannon", "Taliesin", "Tristan", "Brennus", "Caradoc", "Eirwen", "Morgana", "Ninian", "Aeronwen", "Druantia", "Bryn", "Sioned", "Dafydd", "Fferyllt", "Rhydderch", "Anara", "Einion", "Glyndwr", "Aeron", "Mael", "Angharad", "Iefan", "Arne", "Bjorn", "Eirik", "Hakon", "Ivar", "Leif", "Olaf", "Ragnar", "Sigurd", "Tormund", "Vidar", "Yngve", "Skadi", "Freya", "Sif", "Jorunn", "Thorvald", "Egil", "Njal", "Yrsa" ]; const lastNames = [ "MacRhydderch", "ap Gwynedd", "Llywarch", "PenDragon", "Cadogan", "Glyndwr", "Ffraid", "Penhallow", "Talfryn", "Abern", "Kermorvan", "Dwynwen", "Mawr", "Ddraig", "Uchdryd", "Ffion", "Caerwyn", "Trevelyan", "Brenhines", "Yr Isaf", "Skjaldarson", "Bjornsson", "Hakonar", "Eriksen", "Thorvaldsen", "Ulfrikson", "Sigurdarson", "Ragnvald", "Torsken", "Vidarson", "Leifsson", "Njalson", "Freyrdottir", "Yrskar", "Branngal", "Aedhglas", "Tristanov", "Brennoric", "Caradarn", "Dovraig", "Llewellynic", "Tormandr", "Maelwyn", "Fferylltwyn", "Aberthor", "MacAnara", "Cadryth", "Thorimar", "Brynar", "Jorvik", "Yr Iseldir" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('thorimund-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Khald Name Generator

Click the button to generate a name!
function generateKhaldName() { const firstNames = [ "Ailbhe", "Brynna", "Caoimhe", "Daire", "Eoghan", "Fiona", "Gráinne", "Liam", "Maeve", "Niamh", "Oisin", "Rónán", "Siobhán", "Tadhg", "Una", "Áine", "Aodh", "Cathal", "Donn", "Éabha", "Fiachra", "Muirgen", "Eilidh", "Iona", "Eòin", "Malvina", "Sorcha", "Neasán", "Padraig", "Saoirse", "Torin", "Fionnagán", "Muirne", "Cailean", "Aonghus", "Domnall", "Alpin", "Eanraig", "Mòr", "Ruadhán", "Siùsaidh", "Tormod", "Ailis", "Bran", "Catrìona", "Coinneach", "Fìonnlagh", "Gilliosa", "Lioslaith", "Uilleam", "Gillebride", "Muiredach" ]; const lastNames = [ "MacLir", "O'Bran", "Ó Ceallaigh", "MacDonnchadha", "O'Duinn", "Ó Gallchobhair", "Mac Lochlainn", "Mac Cathmhaoil", "Mac Eoin", "Ó Fearghail", "Ó Maoilriain", "Ó Raghallaigh", "MacGowan", "Ó Domhnaill", "MacAnBhaird", "Ó hEaghra", "Mac Aodha", "Ó Conchobhair", "MacCoinnich", "MacEwen", "MacNèill", "MacDougall", "MacRath", "MacCulloch", "MacPhee", "MacCrimmon", "MacTavish", "Ó Ruairc", "Mac Greagoir", "Mac Dhuibh", "Mac Dhòmhnaill", "Ó Caollaidhe", "Ó Cinnéide", "Ó Gadhra", "Ó Baoighill", "Ó Cathasaigh", "MacBain", "MacAlastair", "MacFhionghuin", "MacGill-Eain", "Mac an t-Saoir", "Ó hAonghusa", "Ó Suilleabháin", "Ó Leannáin", "MacGilleMhaoil", "MacLachlainn", "MacArtair", "Ó Beaglaoich", "Ó Flannagáin", "Ó Maoláin", "Ó Treasaigh" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('khald-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Oronok Name Generator

Click the button to generate a name!
function generateOronokName() { const firstNames = [ "Aethelred", "Alfric", "Beowulf", "Ceolwulf", "Dunstan", "Edmund", "Godric", "Hrothgar", "Leofwine", "Oswald", "Raedwald", "Sigebryht", "Wulfstan", "Yrling", "Aino", "Eero", "Ilmari", "Jorma", "Kaija", "Lemminkäinen", "Mielikki", "Tapio", "Tuoni", "Ukko", "Väinö", "Yrjö", "Kaarlo", "Ritva", "Saima", "Venla", "Juhani", "Kaiho", "Erland", "Hakon", "Inga", "Jens", "Lars", "Magnus", "Rune", "Sigurd", "Tove", "Viggo", "Astrid", "Birger", "Dagmar", "Freja", "Gunhild", "Svend", "Thorvald", "Ulrik", "Valdemar" ]; const lastNames = [ "Aethelhelm", "Beornwulf", "Ceolwine", "Dunhelm", "Ealdwulf", "Godwulf", "Hrothgarson", "Leofric", "Osbern", "Raedhelm", "Sigmundson", "Wulfhere", "Yrlingar", "Kaelstrom", "Rautio", "Virtanen", "Mäkelä", "Ristimäki", "Tapionen", "Tuonela", "Vainonen", "Kallio", "Korhonen", "Laine", "Nieminen", "Saari", "Tammisto", "Peltonen", "Rantasalo", "Lindholm", "Bjornsson", "Eriksen", "Gunnarson", "Halldorsson", "Larsen", "Magnussen", "Thorsen", "Ulriksen", "Valdsen", "Astridsdottir", "Dagfinn", "Frejason", "Gunvaldr", "Svenholm", "Tovesen", "Viggensdottir", "Birgersson", "Ragnhildsen", "Sigurdsdottir", "Thorgrim" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('oronok-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Narak Name Generator

Click the button to generate a name!
function generateNarakName() { const firstNames = [ "Ardashir", "Bahram", "Cyrus", "Darius", "Esfandiar", "Farhad", "Hormizd", "Jamshid", "Khosrow", "Mithra", "Narseh", "Ormazd", "Ramin", "Rostam", "Shapur", "Xerxes", "Yazdegerd", "Zarathustra", "Atara", "Azadeh", "Delara", "Farzaneh", "Golnar", "Hasti", "Kiana", "Laleh", "Mehr", "Pari", "Roxana", "Shirin", "Soraya", "Taraneh", "Vardaneh", "Zhaleh", "Ahsar", "Alibeg", "Batraz", "Gudarz", "Khetag", "Kubasar", "Soslan", "Zalikhan", "Aza", "Boran", "Kaihan", "Deldar", "Tahmineh", "Shahrokh", "Maziar", "Sepanta" ]; const lastNames = [ "Afshin", "Ardavan", "Babak", "Darvish", "Esfandiari", "Farrokhzad", "Golestan", "Hedayat", "Jahanshah", "Karimi", "Khorasani", "Mahdavi", "Niyaz", "Parsa", "Rostamian", "Shahmardan", "Tahmasp", "Vahdat", "Yazdani", "Zand", "Aslan", "Batrazian", "Gagloiti", "Kabardov", "Kartlos", "Khetagurov", "Ossetrov", "Soslanov", "Teymurov", "Urusov", "Zalikhanov", "Zarandia", "Bordzh", "Gazdanov", "Khamidi", "Kubasarov", "Mazandarani", "Nariman", "Parthian", "Safarov", "Tabarestani", "Teimorian", "Vardarian", "Zarathustrian", "Yazdanian", "Zarmand", "Ormazdian", "Sarmatian", "Shahinian", "Farhadian" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('narak-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Komuh Name Generator

Click the button to generate a name!
function generateKomuhName() { const firstNames = [ "Abebe", "Amara", "Desta", "Eshe", "Hagos", "Kidane", "Lelisa", "Makeda", "Tewodros", "Zena", "Thando", "Lungile", "Nomsa", "Sipho", "Zanele", "Buhle", "Ntokozo", "Jabulani", "Sanele", "Nkosi", "Mandla", "Ayanda", "Fikile", "Vuyisile", "Andries", "Hendrik", "Stefanus", "Jacobus", "Christiaan", "Marthinus", "Petrus", "Johannes", "Barend", "Cornelis", "Gertruida", "Annemarie", "Frans", "Elize", "Gysbert", "Roelof", "Moges", "Jirata", "Tameru", "Tariku", "Zemedkun", "Segen", "Winta", "Dereje", "Bekele", "Amanuel", "Tesfaye" ]; const lastNames = [ "Bezuidenhout", "Van der Merwe", "Botha", "De Klerk", "Erasmus", "Pretorius", "Venter", "Kruger", "Jordaan", "Smit", "Ngubane", "Mhlongo", "Zulu", "Dlamini", "Mthethwa", "Nkosi", "Mbatha", "Gumede", "Khumalo", "Sibanda", "Jalata", "Feyisa", "Megersa", "Abiyot", "Duretti", "Getachew", "Lamma", "Oromia", "Tamirat", "Birhanu", "Kebede", "Fekadu", "Mengistu", "Zemedkun", "Workneh", "Eshetu", "Rikhotso", "Shongwe", "Tshabalala", "Viljoen", "Van Rensburg", "Steenkamp", "Olivier", "Laubscher", "Maritz", "Scheepers", "Schoeman", "Vercuiel", "Wessels", "Van Rooyen" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('komuh-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Omzu Name Generator

Click the button to generate a name!
function generateOmzuName() { const firstNames = [ "Abdi", "Ayaan", "Barre", "Deeq", "Filsan", "Hodan", "Idil", "Jama", "Khadija", "Liban", "Mursal", "Nimco", "Ridwan", "Sagal", "Warsame", "Zahra", "Waris", "Ahmed", "Farah", "Hawa", "Shukri", "Wafula", "Wanjiku", "Kamau", "Nduta", "Nyambura", "Muthoni", "Njoki", "Kariuki", "Gatimu", "Nyaguthii", "Kibet", "Lelisa", "Moges", "Tariku", "Teshale", "Dereje", "Bekele", "Feyisa", "Zemedkun", "Amanuel", "Jirata", "Makda", "Berhan", "Tesfaye", "Hirpo", "Awol", "Jebessa", "Fikadu", "Seid", "Hailemariam" ]; const lastNames = [ "Ali", "Hassan", "Mohamed", "Abdullahi", "Ahmed", "Yusuf", "Farah", "Warsame", "Jama", "Nur", "Aden", "Hirsi", "Abdi", "Osman", "Duale", "Awale", "Sheikh", "Wanjiru", "Kinyua", "Kamau", "Mwangi", "Ngugi", "Njuguna", "Wachira", "Gichuhi", "Karanja", "Ndungu", "Karani", "Mutua", "Wafula", "Kariuki", "Jalata", "Feyisa", "Bekele", "Lelisa", "Guta", "Kedir", "Seid", "Teshome", "Hailemariam", "Tesfaye", "Dereje", "Kedir", "Moges", "Duretti", "Abiyot", "Alemayehu", "Abdirizak", "Aden", "Hussein" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('omzu-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Selha Name Generator

Click the button to generate a name!
function generateSelhaName() { const firstNames = [ "Bayan", "Chuluun", "Erdene", "Ganbaatar", "Khasar", "Munkh", "Temur", "Tseren", "Altan", "Borte", "Enebish", "Odgerel", "Saran", "Tengri", "Zaya", "Amala", "Chimeg", "Enkh", "Jochi", "Khulan", "Ogedei", "Qorchi", "Ujin", "Yesugei", "Barutu", "Shanmu", "Dorje", "Jampa", "Lobsang", "Migmar", "Padma", "Tenzin", "Tsomo", "Yeshe", "Zopa", "Anu", "Enlil", "Nammu", "Shulgi", "Tiamat", "Ziusudra", "Eshkar", "Nergal", "Ninurta", "Sin", "Ashur", "Utu", "Ereshkigal", "Ishtar", "Gilgamesh", "Rimush" ]; const lastNames = [ "Baatur", "Chinua", "Erdenechimeg", "Ganbold", "Khorlo", "Lkhagvasuren", "Munkhtsetseg", "Nergui", "Oyuun", "Saruul", "Temujin", "Tsetseg", "Altanchimeg", "Ganerdene", "Khaserdene", "Tserenbold", "Zorig", "Zulzaya", "Dorjpalam", "Nyam", "Barqu", "Munkhchuluun", "Yesugen", "Bayarmaa", "Ogodai", "Qashiq", "Ashurnasir", "Naram", "Hammurabi", "Ziggurath", "Tiamathur", "Naburimannu", "Ur-Nammu", "Anubanini", "Lugalzagesi", "Rimutu", "Sumeresh", "Khorolt", "Bumbayar", "Temertsogt", "Bortegen", "Namtaru", "Eana", "Eshkariel", "Mardunesh", "Shulgar", "Tiamatuun", "Anukhor", "Gilzana", "Ziuskar" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('selha-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Okma Name Generator

Click the button to generate a name!
function generateOkmaName() { const firstNames = [ "Akihiko", "Asuka", "Chikako", "Daichi", "Eiko", "Fumiko", "Haruto", "Hiroshi", "Itsuki", "Junko", "Kaede", "Kazuki", "Makoto", "Michiko", "Naoki", "Natsuki", "Reiko", "Riku", "Ryo", "Sakura", "Shinobu", "Takashi", "Tomoko", "Yasuo", "Yuki", "Ayane", "Hikaru", "Kaoru", "Masaki", "Renji", "Souta", "Tsubasa", "Yoshiko", "Kaito", "Arata", "Chiharu", "Hanae", "Kazuma", "Mizuki", "Noriko", "Rina", "Shiori", "Takumi", "Toru", "Yoshihiro", "Akimura", "Rensuke", "Tadashi", "Ichika", "Emiko" ]; const lastNames = [ "Abe", "Fujimoto", "Hasegawa", "Inoue", "Ishikawa", "Kobayashi", "Matsuda", "Matsumoto", "Nakamura", "Nishimura", "Ogawa", "Okamoto", "Saito", "Sakamoto", "Shimizu", "Suzuki", "Takahashi", "Tanaka", "Ueda", "Yamamoto", "Yamashita", "Yamaguchi", "Fujikawa", "Kurosawa", "Minamoto", "Tokugawa", "Ogasawara", "Kobura", "Rokkaku", "Takeda", "Hoshino", "Ishida", "Kuroda", "Morikawa", "Ohashi", "Shimazu", "Taniyama", "Uesugi", "Yokoyama", "Fushimi", "Sanada", "Takigawa", "Hatake", "Hironaka", "Morioka", "Takahiro", "Yoshida", "Hoshikawa", "Nishida", "Aoyama" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('okma-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Hwn Name Generator

Click the button to generate a name!
function generateHwnName() { const firstNames = [ "Amun", "Ankh", "Bastet", "Djed", "Horus", "Imhotep", "Isis", "Khepri", "Maat", "Menes", "Nefer", "Osiris", "Ptah", "Ra", "Ramses", "Sekhmet", "Seti", "Sobek", "Thutmose", "Taweret", "Zoser", "Ashur", "Enlil", "Gilgamesh", "Hammurabi", "Ishtar", "Marduk", "Nabu", "Nergal", "Ninurta", "Shamash", "Sin", "Tiamat", "Ziusudra", "Sargon", "Esarhaddon", "Ashurbanipal", "Tiglath", "Nimrud", "Adad", "Nebuchadnezzar", "Shalmaneser", "Utnapishtim", "Ereshkigal", "Kudurru", "Balatu", "Nisaba", "Zababa", "Kubaba", "Tukulti", "Enmerkar", "Ur-Nammu" ]; const lastNames = [ "Amunhotep", "Bastetian", "Djedkara", "Horusar", "Kheprian", "Neferrenpet", "Osirian", "Ramesid", "Sekhmetar", "Sobekhotep", "Thutmosid", "Imhotepan", "Menkar", "Taweretian", "Rahetep", "Sargonar", "Ashurnasir", "Balatuzi", "Enlilkutu", "Ziusdarra", "Ishtarian", "Mardukal", "Tukultiar", "Nergalian", "Nebuchadri", "Shalmanu", "Hammurapi", "Shamasar", "Kudurrian", "Utnapishar", "Ninurtian", "Nisabari", "Zababan", "Kubabaran", "Adadkar", "Tiamatar", "Kudura", "Eana", "Ziggurian", "Ur-Nammuan", "Asharidian", "Eshkarlu", "Lugalar", "Enmerkaru", "Eshtarah", "Naramzi", "Zabalian", "Ereshkanu", "Tukultar", "Sinbaru" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('hwn-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Thanasi Name Generator

Click the button to generate a name!
function generateThanasiName() { const firstNames = [ "Adoniram", "Ahiram", "Melqart", "Eshmun", "Hannibal", "Sophet", "Abdeshmun", "Ishbaal", "Tanit", "Dido", "Hiram", "Baal", "Anat", "Sidon", "Phoenicia", "Alcibiades", "Demosthenes", "Hippocrates", "Leonidas", "Pericles", "Themistocles", "Zephyros", "Andromache", "Calypso", "Nestor", "Thalassios", "Phaedra", "Euphemia", "Athenodoros", "Cassia", "Decimus", "Lucius", "Marcus", "Cornelia", "Flavia", "Tiberius", "Severus", "Valeria", "Gaius", "Liviana", "Vesta", "Aurelian", "Domitian", "Sargon", "Gilgamesh", "Enlil", "Hammurabi", "Ishtar", "Ziusudra", "Ashurbanipal", "Marduk" ]; const lastNames = [ "Barakbal", "Melqartan", "Phoenicis", "Baalite", "Zidonian", "Eshmuntal", "Hannibalian", "Tanitari", "Ahireth", "Carthaginian", "Dorian", "Thalassides", "Zephyrian", "Euphemides", "Athenar", "Leonidar", "Tiberian", "Flavian", "Cornelidar", "Decimian", "Lucianar", "Cassian", "Aurelidar", "Domitianar", "Sargonar", "Mardukar", "Ashurban", "Gilgamiri", "Nergalith", "Enmerkar", "Ziusdanar", "Hammurian", "Tukultar", "Kudurran", "Eshtaran", "Shamashar", "Anubar", "Khalessian", "Tyriandar", "Sidonith", "Ishbaalor", "Hannid", "Didonar", "Tanithel", "Eupheran", "Zephyrianar", "Phaedran", "Themistar", "Leonidari", "Rimutar" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('thanasi-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Jisong Name Generator

Click the button to generate a name!
function generateJisongName() { const firstNames = [ "Baek", "Chul", "Dae", "Eun", "Hae", "Hwan", "Hyun", "Jae", "Jin", "Kyung", "Min", "Myeong", "Sang", "Seo", "Seok", "Soo", "Sun", "Tae", "Won", "Woo", "Yeon", "Yong", "Young", "Ahri", "Hyang", "Inho", "Jiyun", "Miran", "Seojin", "Sooyeon", "Yul", "Ahnsa", "Hyejin", "Jaewon", "Kyujin", "Seojun", "Sunwoo", "Taeryeong", "Yeojin", "Chaeryeong", "Hwasun", "Ilseong", "Junhyuk", "Namsun", "Jiwon", "Taehyun", "Eunji", "Kyurim", "Soryeong", "Juyeon" ]; const lastNames = [ "Kim", "Lee", "Park", "Choi", "Jung", "Kang", "Cho", "Yoon", "Jang", "Shin", "Han", "Oh", "Seo", "Ahn", "Song", "Yim", "Nam", "Baek", "Hwang", "Sung", "Jin", "Lim", "Kwon", "Cha", "Yang", "Moon", "Son", "Hong", "Yoo", "Na", "Jeong", "Hyeon", "Bong", "Gyeong", "Min", "Seong", "Soo", "Il", "Noh", "Ryoo", "Bang", "Joo", "Myung", "Hyuk", "Kyung", "Won", "Cheon", "Daek", "Jun", "Hye", "Jae" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('jisong-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

Todeswald Elf Name Generator

Click the button to generate a name!
function generateTodeswaldElfName() { const firstNames = [ "Aelwyn", "Caelan", "Daire", "Eilidh", "Fionn", "Isolde", "Kael", "Liora", "Maeve", "Niamh", "Orlaith", "Rhiannon", "Seamus", "Tadhg", "Una", "Aeron", "Brynn", "Ciaran", "Elara", "Fionna", "Grainne", "Lorcan", "Merrion", "Nerys", "Oisin", "Ronan", "Saoirse", "Talwyn", "Aisling", "Branwen", "Donovan", "Eirlys", "Keelin", "Lirien", "Morrigan", "Neve", "Riordan", "Siobhan", "Tiernan", "Wynne", "Aodh", "Brynna", "Cadell", "Delwyn", "Esmond", "Finola", "Kaelin", "Lachlan", "Oberyn", "Siorlas" ]; const lastNames = [ "Caerwyn", "Dunbar", "Eryndor", "Fionnach", "Galadain", "Lirion", "MacCraith", "Niallson", "O'Cathain", "Pendralis", "Quinndor", "Rionnach", "Siofra", "Tirial", "Uladh", "Wynfaris", "Briagwyn", "Calathor", "Dunlin", "Eryndyl", "Farlain", "Glenlor", "Kairnath", "Lioraeth", "Mornach", "Nyallar", "O'Rion", "Rendwyn", "Silvanar", "Taranach", "Aldrion", "Brialthar", "Caddain", "Elyndor", "Faolain", "Gwynfar", "Kaelion", "Letharion", "Morwyn", "Nolathar", "Olorin", "Ravenar", "Saeril", "Torrath", "Ultharion", "Wyndral", "Zerathar", "Durlain", "Morrath", "Caethar" ]; const randomFirstName = firstNames[Math.floor(Math.random() * firstNames.length)]; const randomLastName = lastNames[Math.floor(Math.random() * lastNames.length)]; document.getElementById('todeswald-elf-name-display').textContent = `${randomFirstName} ${randomLastName}`; }

CREDITS

ARTISTS:
Josh Diffey | Josh's Twitter
Numerous pieces of art. Great friend of mine, please support his work!
Dean Spencer | Dean's Patreon
© Dean Spencer multiple works used on this website and our supplements (both paid and free).
Please support his Patreon!
Rick Hershey of Fat Goblin Games | Fat Goblin Games
Publisher's Choice Quality Stock Art ©Rick Hershey / Fat Goblin Games
Purchase Fat Goblin Games products here: Drivethrurpg
Daniel Comerci | Daniel's Website
Class Character Art.
Additional art/assets.
Cerric | Cerric's Deviant Art
Ghoul King
Dwarven Fortress
The Lost Shrine
In the Forest
Necromancy Symbol
Blood Magic Symbol
Game-Icons | https://game-icons.net/
Varies - CC BY 3.0 License
Morraey | https://www.deviantart.com/morraey
Photoshop Brushes used in: World Map of Ohr, The Stone Confederacy.
Halycon450 | www.deviantart.com/halycon450/gallery/
Monster & Scene Art on Website & Roll20 Tokens.
ADDITIONAL CREDITS:
Emily - My incredible fiancé who writes parts of the epic fiction and lore you're going to read on this site. "WHERE'S MY LORE!"
Michael Morrison - My friend, who I played a solo D&D game with for many years and built the foundations of the world that you currently play in. Mute mages far and wide hate him.

COMMUNITY CREDITS
  • Adam | Contributor. The local degen, we still love him though.

  • Anteros | Contributor, Community Officer.

  • Baylee | Contributor.

  • Blackfoot | Contributor.

  • Brom | Contributor, Community Officer.

  • Cerric | Sometimes Player, Community Member.

  • Conor | Play Tester, Community Member. Kind of the worst teammate.

  • Drakon | Contributor.

  • Eisen | Contributor, Council Member. Likes balance. Never gets it.

  • Ezri | Contributor.

  • Frans | Contributor, World Builder.

  • G3 | Play Tester.

  • Gia | Contributor, Community Officer.

  • Hossy | Contributor.

  • James | Contributor. Stronghold guy.

  • Jensyn | Contributor, Article Writer, World Builder, Community Manager.

  • Jon | Contributor.

  • Kaiser | Contributor, World Builder, Community Member.

  • Kat | Contributor.

  • Kohan | Contributor. Usually the first to die.

  • Koro | Contributor.

  • Mathew | Contributor.

  • Meck | Contributor.

  • Michael | Contributor.

  • Pharros | Contributor, Community Member.

  • Ray | Contributor, Patron.

  • Sidney | Contributor. Mayor of his own medieval town.

  • Sloan | Contributor. Our adopted child.

  • Tapioca | Community Member, Play Tester. Ruined my sci-fi setting.

  • Valicene | Contributor. the best of us.

  • Wander | Contributor. the old man.

  • Xeoposer | Contributor, Play Tester. Lord of Bellmare.