Plot Hook & Quest Idea Generator

Generate creative adventure prompts for tabletop RPGs, novels, or game development.

Saved Quest Ideas

No quests saved yet. Generate some ideas first!

Hook: ${quest.hook}

`; archiveList.appendChild(questElement); }); // Add event listeners to view buttons document.querySelectorAll('.view-details').forEach(button => { button.addEventListener('click', function() { const index = parseInt(this.getAttribute('data-index')); viewQuestDetails(savedQuests[index]); }); }); } // View full quest details function viewQuestDetails(quest) { // Update the generator tab with this quest document.getElementById('genre').value = quest.genre; document.getElementById('complexity').value = quest.complexity; document.getElementById('tone').value = quest.tone; document.getElementById('quest-type').textContent = quest.type; document.getElementById('quest-genre').textContent = quest.genre.charAt(0).toUpperCase() + quest.genre.slice(1); document.getElementById('quest-title').textContent = quest.title; document.getElementById('quest-hook').textContent = quest.hook; document.getElementById('quest-objective').textContent = quest.objective; document.getElementById('quest-complication').textContent = quest.complication; document.getElementById('quest-reward').textContent = quest.reward; document.getElementById('quest-complexity').textContent = document.getElementById('complexity').options[document.getElementById('complexity').selectedIndex].text; document.getElementById('quest-tone').textContent = document.getElementById('tone').options[document.getElementById('tone').selectedIndex].text; // Show results and switch tab document.getElementById('quest-results').style.display = 'block'; document.querySelector('.tab-button[data-tab="generator-tab"]').click(); } // Generate PDF function generatePDF() { if (!currentQuest) { alert('Please generate a quest first'); return; } const { jsPDF } = window.jspdf; const doc = new jsPDF(); // Title doc.setFontSize(18); doc.text(`Quest: ${currentQuest.title}`, 10, 15); // Metadata doc.setFontSize(12); doc.text(`Type: ${currentQuest.type}`, 10, 25); doc.text(`Genre: ${currentQuest.genre.charAt(0).toUpperCase() + currentQuest.genre.slice(1)}`, 10, 32); doc.text(`Complexity: ${document.getElementById('complexity').options[document.getElementById('complexity').selectedIndex].text}`, 10, 39); doc.text(`Tone: ${document.getElementById('tone').options[document.getElementById('tone').selectedIndex].text}`, 10, 46); // Content doc.setFontSize(14); doc.text('Hook:', 10, 60); doc.setFontSize(12); doc.text(doc.splitTextToSize(currentQuest.hook, 180), 10, 68); doc.setFontSize(14); doc.text('Objective:', 10, 88); doc.setFontSize(12); doc.text(doc.splitTextToSize(currentQuest.objective, 180), 10, 96); doc.setFontSize(14); doc.text('Complication:', 10, 116); doc.setFontSize(12); doc.text(doc.splitTextToSize(currentQuest.complication, 180), 10, 124); doc.setFontSize(14); doc.text('Reward:', 10, 144); doc.setFontSize(12); doc.text(doc.splitTextToSize(currentQuest.reward, 180), 10, 152); // Save PDF doc.save(`quest-${currentQuest.title.toLowerCase().replace(/ /g, '-')}.pdf`); } // Initialize with a generated quest let currentQuest = null; generateQuest(); });
Scroll to Top