import { Engine } from "./engine"; import { setTimeoutRef } from "./utils/SetTimeoutRef"; import { removeChildrenFromElement } from "../utils/uiHelpers/removeChildrenFromElement"; import { createElement } from "../utils/uiHelpers/createElement"; import { exceptionAlert } from "../utils/helpers/exceptionAlert"; import { isString } from "../utils/helpers/isString"; export let cinematicTextFlag = false; /** * Print a message using a hacking-style "typing" effect. * Note that this clears the UI so that the text from this is the only thing visible. * * @param lines {string[]} Array of strings to print, where each element is a separate line */ export function writeCinematicText(lines) { cinematicTextFlag = true; if (lines.constructor !== Array) { throw new Error("Invalid non-array argument passed into writeCinematicText()"); } // Reuse the 'Red Pill' content Engine.loadCinematicTextContent(); const container = document.getElementById("cinematic-text-container"); container.style.width = "75%"; if (container == null) {throw new Error("Could not find cinematic-text-container for writeCinematicText()");} removeChildrenFromElement(container); for (let i = 0; i < lines.length; ++i) { if (!isString(lines[i])) { throw new Error("Invalid non-string element in 'lines' argument. writeCinematicText() failed"); } } return writeCinematicTextRecurse(lines).then(function() { return cinematicTextEnd(); //Puts the continue button }).catch(function(e) { exceptionAlert(e); }); } function writeCinematicTextRecurse(lines, lineNumber=0) { if (lineNumber >= lines.length) {return Promise.resolve(true);} return writeCinematicTextLine(lines[lineNumber]).then(function() { return writeCinematicTextRecurse(lines, lineNumber+1); }); } function writeCinematicTextLine(line) { return new Promise(function(resolve, reject) { const container = document.getElementById("cinematic-text-container"); const pElem = document.createElement("p"); container.appendChild(pElem); const promise = writeCinematicTextLetter(pElem, line, 0); promise.then(function(res) { resolve(res); }, function(e) { reject(e); }); }); } function writeCinematicTextLetter(pElem, line, i=0) { return new Promise(function(resolve, reject) { setTimeoutRef(function() { const textToShow = line.substring(0, i); if (i >= line.length) { pElem.innerHTML = textToShow; return resolve(true); } pElem.innerHTML = textToShow + ""; const promise = writeCinematicTextLetter(pElem, line, i+1); promise.then(function(res) { resolve(res); }, function(e) { reject(e); }); }, 15); }); } function cinematicTextEnd() { var container = document.getElementById("cinematic-text-container"); var mainMenu = document.getElementById("mainmenu-container"); container.appendChild(createElement("br")); return new Promise (function(resolve) { container.appendChild(createElement("a", { class:"a-link-button", innerText:"Continue...", clickListener:()=>{ removeChildrenFromElement(container); Engine.loadTerminalContent(); mainMenu.style.visibility = "visible"; cinematicTextFlag = false; resolve(); }, })); }); }