1import { 2 scrollToBottom, 3} from '/gjs/util/menu_renderer.js'; 4 5let currentTypingInterval = null; 6let currentResolve = null; 7let currentTimeout = null; 8let professorMessageSequence = 0; 9 10export function typeMessageProfessor(talkscript, charP, proftalking = true) { 11 const message = talkscript.msg; 12 const professorTalkTextElement = document.getElementById("professorTalkText"); 13 14 // Clear any ongoing typing and timeout 15 if (currentTypingInterval) { 16 clearInterval(currentTypingInterval); 17 currentTypingInterval = null; 18 } 19 if (currentTimeout) { 20 clearTimeout(currentTimeout); 21 currentTimeout = null; 22 } 23 if (currentResolve) { 24 currentResolve(); // Immediately resolve the previous promise 25 } 26 27 return new Promise((resolve) => { 28 currentResolve = resolve; 29 professorTalkTextElement.textContent = ""; 30 charP.talking = proftalking; 31 32 const finishMessage = () => { 33 try { 34 charP.talking = false; 35 try { 36 window.dispatchEvent( 37 new CustomEvent("professor_message_shown", { 38 detail: { hash: talkscript.hash, msg: talkscript.msg, seq: professorMessageSequence++ }, 39 }) 40 ); 41 } catch(e) {} 42 } catch(e) {} 43 resolve(); 44 currentResolve = null; 45 delete window.skipCurrentMessage; 46 }; 47 48 // Fast-forward function (skips everything) 49 const skipEverything = () => { 50 professorTalkTextElement.textContent = message; 51 if (currentTypingInterval) { 52 clearInterval(currentTypingInterval); 53 currentTypingInterval = null; 54 } 55 if (currentTimeout) { 56 clearTimeout(currentTimeout); 57 currentTimeout = null; 58 } 59 finishMessage(); // Immediately finish 60 }; 61 62 // Set up typewriter effect 63 let currentLetter = 0; 64 currentTypingInterval = setInterval(() => { 65 professorTalkTextElement.textContent += message.charAt(currentLetter); 66 currentLetter++; 67 if (currentLetter >= message.length) { 68 clearInterval(currentTypingInterval); 69 currentTypingInterval = null; 70 currentTimeout = setTimeout(finishMessage, 3000); 71 } 72 }, 53); 73 74 // Expose skip function 75 window.skipCurrentMessage = skipEverything; 76 }); 77} 78 79// Call this to skip current message completely 80export function skipCurrentMessageNow() { 81 if (typeof window.skipCurrentMessage === 'function') { 82 window.skipCurrentMessage(); 83 } 84} 85 86// Call this function from your click handler to skip the current message 87export function skipMessage() { 88 if (typeof window.skipCurrentMessage === 'function') { 89 window.skipCurrentMessage(); 90 } 91} 92 93export async function handleMessageProfessor(talkscripts,charP) { 94 const displayElement = document.getElementById("gameLessonProfessorTalkDiv"); 95 const professorTalkTextElement = document.getElementById("professorTalkText"); 96 professorTalkTextElement.textContent=""; 97 displayElement.style.display = 'flex'; 98 for (let talkscript of talkscripts) { 99 await typeMessageProfessor(talkscript,charP); 100 //if(talkscript.msg.includes("specialstring")){ 101 } 102 professorTalkTextElement.textContent=""; 103 displayElement.style.display = 'none'; 104// charP.self_follow_activestop(); 105} 106export function placeTeachingScene(characterCModel,selfusername){ 107 if(characterCModel.username=="professor"){ 108 characterCModel.model.position.x=-14; 109 characterCModel.model.position.z=-5; 110 if(characterCModel.modelname=="CasinoClientMonkey"){ 111 characterCModel.model.position.x=-2; 112 characterCModel.model.position.z=-6; 113 } 114 } 115 else if(characterCModel.username=="client"){ 116 characterCModel.model.position.x=2; 117 characterCModel.model.position.z=4; 118 } 119 else if(characterCModel.username=="hacker"){ 120 characterCModel.model.position.x=1.5; 121 characterCModel.model.position.z=-6; 122 } 123 else if (characterCModel.username==selfusername){ 124 characterCModel.model.position.x=9; 125 characterCModel.model.position.z=6; 126 } 127}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.