Intergalactic Space Race Scenario Generator
Generate high-octane scenarios for thrilling races across the cosmos! Engines ready!
Generated Race Scenario
${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
