Quest Creator
body {
font-family: ‘Uncial Antiqua’, cursive;
margin: 0;
padding: 20px;
background-image: url(‘
https://i.imgur.com/ryHP2sh.png’);
background-size: cover;
background-position: center;
background-attachment: fixed;
color: #f0e6d2;
}
.header-container {text-align: center;margin-bottom: 40px;}
.header-title {
display: inline-block;padding: 25px 40px;
background: radial-gradient(ellipse at center, rgba(10,10,10,0.85), rgba(0,0,0,0.6));
border: 6px ridge #00ff99;border-radius: 30px;box-shadow: 0 0 40px rgba(0,255,150,0.6);
font-size: 2.8em;color: #00ffcc;text-shadow: 2px 2px 10px #003322;
}
.section {
background: rgba(255,248,220,0.95);
background-image: url(‘
https://www.transparenttextures.com/patterns/paper-fibers.png’);
padding: 25px;border-radius: 16px;margin-bottom: 30px;
border: 6px double #5c3317;box-shadow:0 0 20px rgba(0,0,0,0.5);color:#2e1a0f;
}
label{display:flex;align-items:center;margin-bottom:8px;font-weight:bold;}
textarea,input[type=”text”],select{width:100%;padding:12px;background:#fef9e7;border:2px solid #5c3317;border-radius:8px;font-family:’Uncial Antiqua’,cursive;font-size:16px;color:#2e1a0f;box-shadow:inset 0 0 6px rgba(0,0,0,0.3);}
textarea::placeholder,input[type=”text”]::placeholder{color:#a88f7b;font-style:italic;}
button{padding:10px 20px;font-size:16px;font-family:’Uncial Antiqua’,cursive;cursor:pointer;margin:10px 0;background:linear-gradient(to bottom,#f4e2d8,#a76b3d);border:3px ridge #3a1e0a;border-radius:8px;color:#2e1a0f;text-shadow:1px 1px #fceabb;box-shadow:2px 2px 5px rgba(0,0,0,0.4);}
.remove-btn{margin-left:10px;background:#8b0000;color:#fff;border:none;border-radius:4px;cursor:pointer;font-weight:bold;padding:2px 8px;}
https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js
Download PDF

Name of the Quest

Call to Adventure

Town Map and NPCs
Tavern
Blacksmith
Marketplace
Temple
Guard Tower
Library

Antagonists and Encounters
Kobold (AC:12 HP:5 DMG:4)
Giant Rat (AC:12 HP:7 DMG:4)
Bat (AC:12 HP:1 DMG:1)
Goblin (AC:15 HP:7 DMG:5)
Bandit (AC:12 HP:11 DMG:5)
Panther (AC:12 HP:13 DMG:7)
Skeleton (AC:13 HP:13 DMG:5)
Wolf (AC:13 HP:11 DMG:7)
Giant Wasp (AC:12 HP:13 DMG:10)
Zombie (AC:8 HP:22 DMG:6)
Orc (AC:13 HP:15 DMG:9)
Giant Spider (AC:14 HP:26 DMG:11)

Side Quests from NPCs
+ Add Side Quest

Treasures and Fun Items
Bag of Holding – Stores up to 500 lbs.
Ring of Invisibility – Grants invisibility once per day.
Potion of Healing – Restores 2d4+2 HP.
Wand of Fireballs – 3 charges per day.
+1 Magic Sword – Grants +1 to attack and damage.

Resolution & Rewards

Additional Notes
function addLocationField(value){
const container=document.getElementById(‘locationFields’);
const wrapper=document.createElement(‘div’);
wrapper.style.display=’flex’;wrapper.style.alignItems=’center’;wrapper.style.marginBottom=’8px’;
const input=document.createElement(‘input’);input.type=’text’;input.value=value;input.style.flex=’1′;
const removeBtn=document.createElement(‘button’);removeBtn.textContent=’✕’;removeBtn.className=’remove-btn’;removeBtn.onclick=()=>wrapper.remove();
wrapper.appendChild(input);wrapper.appendChild(removeBtn);container.appendChild(wrapper);
}
function handleLocationChange(select){
const selected=[…select.selectedOptions].map(o=>o.value);
document.getElementById(‘locationFields’).innerHTML=”;
selected.forEach(v=>addLocationField(v));
}
function handleCustomLocation(inp){const v=inp.value.trim();if(v){addLocationField(v);inp.value=”;}}
function addCreatureField(value){
const container=document.getElementById(‘creatureFields’);
const wrapper=document.createElement(‘div’);
wrapper.style.display=’flex’;wrapper.style.alignItems=’center’;wrapper.style.marginBottom=’8px’;
const input=document.createElement(‘input’);input.type=’text’;input.value=value;input.style.flex=’1′;
const removeBtn=document.createElement(‘button’);removeBtn.textContent=’✕’;removeBtn.className=’remove-btn’;removeBtn.onclick=()=>wrapper.remove();
wrapper.appendChild(input);wrapper.appendChild(removeBtn);container.appendChild(wrapper);
}
function handleCreatureChange(select){
const selected=[…select.selectedOptions].map(o=>o.value);
document.getElementById(‘creatureFields’).innerHTML=”;
selected.forEach(v=>addCreatureField(v));
}
function handleCustomCreature(inp){
const v=inp.value.trim();
if(v){addCreatureField(v);inp.value=”;}
}
function filterCreaturesByCR(search) {
const options = document.querySelectorAll(‘#creatureSelect optgroup’);
options.forEach(group => {
const label = group.label.toLowerCase();
const match = label.includes(search.toLowerCase());
group.style.display = match || search === ” ? ‘block’ : ‘none’;
});
}
function addSideQuest(){
const container = document.getElementById(‘sideQuestFields’);
const wrapper = document.createElement(‘div’);
wrapper.style.display = ‘flex’;
wrapper.style.alignItems = ‘center’;
wrapper.style.marginBottom = ‘8px’;
const input = document.createElement(‘input’);
input.type = ‘text’;
input.placeholder = ‘Describe the side quest…’;
input.style.flex = ‘1’;
const removeBtn = document.createElement(‘button’);
removeBtn.textContent = ‘✕’;
removeBtn.className = ‘remove-btn’;
removeBtn.onclick = () => wrapper.remove();
wrapper.appendChild(input);
wrapper.appendChild(removeBtn);
container.appendChild(wrapper);
}function addTreasureField(value){
const container=document.getElementById(‘treasureFields’);
const wrapper=document.createElement(‘div’);
wrapper.style.display=’flex’;
wrapper.style.alignItems=’center’;
wrapper.style.marginBottom=’8px’;
const input=document.createElement(‘input’);
input.type=’text’;
input.value=value;
input.style.flex=’1′;
const removeBtn=document.createElement(‘button’);
removeBtn.textContent=’✕’;
removeBtn.className=’remove-btn’;
removeBtn.onclick=()=>wrapper.remove();
wrapper.appendChild(input);
wrapper.appendChild(removeBtn);
container.appendChild(wrapper);
}
function handleTreasureChange(select){
const selected = […select.selectedOptions].map(o => o.value);
document.getElementById(‘treasureFields’).innerHTML = ”;
selected.forEach(v => addTreasureField(v));
}
function handleCustomTreasure(inp){
const v = inp.value.trim();
if(v){
addTreasureField(v);
inp.value=”;
}
}
function generatePDF() {
const element = document.body; // or wrap your main content in a
html2pdf()
.set({
margin: 0,
filename: ‘quest.pdf’,
image: { type: ‘jpeg’, quality: 0.98 },
html2canvas: { scale: 2, logging: true, dpi: 192, letterRendering: true },
jsPDF: { unit: ‘in’, format: ‘letter’, orientation: ‘portrait’ }
})
.from(element)
.save();
}