PageSourceSearch

https://opencyberai.com/gjs/util/t_professor_anim.js

js opencyberai.com collected 2026-10-01 15:54:51 UTC 3,952 bytes, 127 lines download raw bytes

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.