Intergalactic Space Race Scenario Generator

Generate high-octane scenarios for thrilling races across the cosmos! Engines ready!

${generatedRaceData.rival}

Potential Hazards/Obstacles:

    ${generatedRaceData.hazards}

The Prize:

${generatedRaceData.prize}

"${generatedRaceData.commentary}"
`; // Use innerHTML to render the
  • list resultsDiv.style.display = 'block'; pdfBtn.disabled = false; } // --- PDF Download Function --- function downloadPDF() { if (!generatedRaceData || !generatedRaceData.raceName) { alert("Please generate a race scenario first."); return; } // Ensure jsPDF is loaded if (typeof jspdf === 'undefined' || typeof jspdf.jsPDF === 'undefined') { console.error("jsPDF library or jsPDF constructor is not loaded correctly."); alert("Error: PDF generation library failed to load. Please check internet connection or Elementor setup."); return; } const { jsPDF } = jspdf; const doc = new jsPDF(); // --- PDF Styling --- const primaryColor = '#ffeb3b'; // Yellow const secondaryColor = '#03a9f4'; // Blue const accentColor = '#f44336'; // Red const textColor = '#111111'; // Dark text for PDF readability const pageMargin = 15; const lineSpacing = 7; let currentY = pageMargin; const pageHeight = doc.internal.pageSize.height; const pageWidth = doc.internal.pageSize.width; // Helper to add text with page breaks function addTextToPDF(text, size, color, style = 'normal') { doc.setFont("helvetica", style); // Standard font for PDF doc.setFontSize(size); doc.setTextColor(color); // Basic HTML stripping for PDF list items text = text.replace(/
  • /g, ' • ').replace(/<\/em><\/li>/g, '').replace(/
      /g, '').replace(/<\/ul>/g,'').trim(); const splitText = doc.splitTextToSize(text, pageWidth - pageMargin * 2); splitText.forEach(line => { if (currentY + lineSpacing > pageHeight - pageMargin) { doc.addPage(); currentY = pageMargin; // Reset font on new page doc.setFont("helvetica", style); doc.setFontSize(size); doc.setTextColor(color); } doc.text(line, pageMargin, currentY); currentY += lineSpacing; }); } function addHeadingPDF(text) { addTextToPDF(text.toUpperCase() + ":", 12, secondaryColor, 'bold'); // Blue heading currentY += lineSpacing * 0.1; } function addParagraphPDF(text) { addTextToPDF(text, 10, textColor); currentY += lineSpacing * 0.3; } function addRaceTitlePDF(text) { // Center align Title doc.setFont("helvetica", "bold"); doc.setFontSize(16); doc.setTextColor(primaryColor); // Yellow title const textWidth = doc.getTextWidth(text); const xPos = (pageWidth - textWidth) / 2; if (currentY + lineSpacing > pageHeight - pageMargin) { doc.addPage(); currentY = pageMargin; } doc.text(text, xPos, currentY); currentY += lineSpacing * 2; // Extra space after title } function addCommentaryPDF(text) { addTextToPDF(`"${text}"`, 10, primaryColor, 'italic'); // Yellow Italic currentY += lineSpacing * 0.3; } // --- PDF Content --- addRaceTitlePDF(generatedRaceData.raceName); addHeadingPDF("Course Details"); addParagraphPDF(generatedRaceData.course); addHeadingPDF("Your Ship Hint"); addParagraphPDF(generatedRaceData.yourShipHint); addHeadingPDF("Primary Rival"); addParagraphPDF(generatedRaceData.rival); addHeadingPDF("Potential Hazards"); addParagraphPDF(generatedRaceData.hazards); // Will format list items addHeadingPDF("The Prize"); addParagraphPDF(generatedRaceData.prize); addCommentaryPDF(generatedRaceData.commentary); // --- Save PDF --- const safeFileName = `space_race_${generatedRaceData.raceName.replace(/[^a-z0-9]/gi, '_')}`.toLowerCase(); doc.save(`${safeFileName}.pdf`); } // --- Event Listeners --- if (generateBtn) { generateBtn.addEventListener('click', generateRace); } else { console.error("Generate button not found! Check ID: race-generate-btn-d0e3f"); } if (pdfBtn) { pdfBtn.addEventListener('click', downloadPDF); } else { console.error("PDF button not found! Check ID: race-pdf-btn-d0e3f"); // Corrected ID check } })(); // Immediately invoke the function
Scroll to Top