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
Quest Creator
Die 1 Name of the Quest
Die 2 Call to Adventure
Die 3 Town Map and NPCs Tavern Blacksmith Marketplace Temple Guard Tower Library
Die 4 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)
Die 5 Side Quests from NPCs
+ Add Side Quest
Die 6 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.
Die 7 Resolution & Rewards
Die 8 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(); }