Movie Scene Creator
Set the stage. Define the conflict. Create the moment.
Please enter at least one character name.
`; resultsContainer.style.display = 'block'; pdfButtonContainer.style.display = 'none'; return; } const charArray = characterInput.split(',').map(name => name.trim()); const char1 = charArray[0] || 'CHARACTER 1'; const char2 = charArray[1] || 'CHARACTER 2'; const sceneHeading = `${setting} - ${timeOfDay}
`;
const openingText = sceneTemplates.openings[genre];
const conflictText = sceneTemplates.conflicts[conflict](char1, char2);
const closingText = sceneTemplates.closings[genre];
const fullScene = `
${sceneHeading}
${openingText}
${conflictText}
${closingText}
`;
sceneOutput.innerHTML = fullScene;
resultsContainer.style.display = 'block';
pdfButtonContainer.style.display = 'block';
};
const downloadPDF = () => {
try {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
const genre = inputs.genre.value;
const setting = inputs.setting.options[inputs.setting.selectedIndex].text;
const timeOfDay = inputs.timeOfDay.value;
const conflict = inputs.conflict.options[inputs.conflict.selectedIndex].text;
const characters = inputs.characters.value;
const sceneTextContent = sceneOutput.innerText;
const pageWidth = doc.internal.pageSize.getWidth();
const margin = 15;
// --- PDF Header ---
doc.setFont('helvetica', 'bold');
doc.setFontSize(16);
doc.text('MOVIE SCENE RUNDOWN', pageWidth / 2, 20, { align: 'center' });
doc.setLineWidth(0.5);
doc.line(margin, 25, pageWidth - margin, 25);
// --- Parameters Table ---
doc.autoTable({
startY: 30,
head: [],
body: [
['GENRE:', genre],
['SETTING:', setting],
['TIME:', timeOfDay],
['CHARACTERS:', characters],
['CORE CONFLICT:', conflict]
],
theme: 'plain',
styles: { fontSize: 10, font: 'helvetica' },
columnStyles: { 0: { fontStyle: 'bold', cellWidth: 40 } }
});
const lastY = doc.previousAutoTable.finalY + 15;
// --- Scene Script ---
// Add Courier font if available in jsPDF's standard fonts
try {
doc.setFont('courier', 'normal');
} catch(e) {
console.warn("Courier font not found, falling back to monospace.");
doc.setFont('monospace', 'normal');
}
doc.setFontSize(12);
const textLines = doc.splitTextToSize(sceneTextContent, pageWidth - margin * 2);
doc.text(textLines, margin, lastY);
doc.save('Movie_Scene.pdf');
} catch (error) {
console.error("Failed to generate PDF:", error);
if (pdfButtonContainer && !pdfButtonContainer.querySelector('.error-msg')) {
const errorMsg = document.createElement('p');
errorMsg.textContent = 'Sorry, the PDF could not be created.';
errorMsg.className = 'text-red-500 text-sm mt-2 error-msg';
pdfButtonContainer.appendChild(errorMsg);
}
}
};
generateButton.addEventListener('click', createScene);
downloadPdfButton.addEventListener('click', downloadPDF);
});
${conflictText}
${closingText}
