aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstonedDiscord <Tukz@gmx.de>2022-09-23 18:07:22 +0200
committerGitHub <noreply@github.com>2022-09-23 18:07:22 +0200
commit82983e0c38383ec2602b4f41327342d1c8d0a8fd (patch)
tree2c6af046c350e594143ddd5950f1fd373bfe6dda
parenta732a654c058842e39917210e47ca7476fa7ef68 (diff)
parentc3bde03911eb41bb768d1f01c0857d69300e36b8 (diff)
Merge pull request #175 from caleb-mabry/more-function-removal-viewport
More function removal from viewport
-rw-r--r--.github/workflows/deploy.yml2
-rw-r--r--webAO/client.ts2
-rw-r--r--webAO/client/loadResources.ts8
-rw-r--r--webAO/client/setEmote.ts2
-rw-r--r--webAO/dom/changeMusicVolume.ts14
-rw-r--r--webAO/dom/reloadTheme.ts16
-rw-r--r--webAO/packets/handlers/handleMS.ts11
-rw-r--r--webAO/packets/handlers/handleRT.ts4
-rw-r--r--webAO/viewport/interfaces/ChatMsg.ts6
-rw-r--r--webAO/viewport/interfaces/Viewport.ts35
-rw-r--r--webAO/viewport/utils/handleICSpeaking.ts312
-rw-r--r--webAO/viewport/utils/initTestimonyUpdater.ts31
-rw-r--r--webAO/viewport/utils/setSide.ts91
-rw-r--r--webAO/viewport/viewport.ts529
14 files changed, 573 insertions, 490 deletions
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index b0d5ea4..eaf50c1 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -1,6 +1,6 @@
name: Deploy CI
-on: [push]
+on: [push, pull_request]
jobs:
build:
diff --git a/webAO/client.ts b/webAO/client.ts
index b908b62..f3711e9 100644
--- a/webAO/client.ts
+++ b/webAO/client.ts
@@ -145,7 +145,7 @@ class Client extends EventEmitter {
this.selectedEvidence = 0;
this.checkUpdater = null;
this.sender = sender
- this.viewport = masterViewport(this);
+ this.viewport = masterViewport();
this._lastTimeICReceived = new Date(0);
loadResources
isLowMemory
diff --git a/webAO/client/loadResources.ts b/webAO/client/loadResources.ts
index 65d0895..4954966 100644
--- a/webAO/client/loadResources.ts
+++ b/webAO/client/loadResources.ts
@@ -1,12 +1,14 @@
import getCookie from "../utils/getCookie";
import vanilla_evidence_arr from "../constants/evidence.js";
import vanilla_background_arr from "../constants/backgrounds.js";
-import { client } from "../client";
+import { changeMusicVolume } from '../dom/changeMusicVolume'
import { setChatbox } from "../dom/setChatbox";
import { changeSFXVolume, changeShoutVolume, changeTestimonyVolume } from "../dom/changeVolume";
import { showname_click } from "../dom/showNameClick";
import { changeBlipVolume } from '../dom/changeBlipVolume'
+import { reloadTheme } from '../dom/reloadTheme'
const version = process.env.npm_package_version;
+
/**
* Load game resources and stored settings.
*/
@@ -41,7 +43,7 @@ export const loadResources = () => {
(<HTMLOptionElement>(
document.querySelector(`#client_themeselect [value="${cookietheme}"]`)
)).selected = true;
- client.viewport.reloadTheme();
+ reloadTheme();
const cookiechatbox = getCookie("chatbox") || "dynamic";
@@ -52,7 +54,7 @@ export const loadResources = () => {
(<HTMLInputElement>document.getElementById("client_mvolume")).value =
getCookie("musicVolume") || "1";
- client.viewport.changeMusicVolume();
+ changeMusicVolume();
(<HTMLAudioElement>document.getElementById("client_sfxaudio")).volume =
Number(getCookie("sfxVolume")) || 1;
changeSFXVolume();
diff --git a/webAO/client/setEmote.ts b/webAO/client/setEmote.ts
index 161eb51..f4fbdbb 100644
--- a/webAO/client/setEmote.ts
+++ b/webAO/client/setEmote.ts
@@ -28,7 +28,7 @@ const setEmote = async (
for (const extension of extensionsMap) {
// Hides all sprites before creating a new sprite
- if (client.viewport.lastChar !== client.viewport.chatmsg.name) {
+ if (client.viewport.getLastCharacter() !== client.viewport.getChatmsg().name) {
emoteSelector.src = transparentPng;
}
let url;
diff --git a/webAO/dom/changeMusicVolume.ts b/webAO/dom/changeMusicVolume.ts
new file mode 100644
index 0000000..9e5d51a
--- /dev/null
+++ b/webAO/dom/changeMusicVolume.ts
@@ -0,0 +1,14 @@
+import { client } from '../client'
+import setCookie from '../utils/setCookie';
+
+export const changeMusicVolume = (volume: number = -1) => {
+ const clientVolume = Number(
+ (<HTMLInputElement>document.getElementById("client_mvolume")).value
+ );
+ let musicVolume = volume === -1 ? clientVolume : volume;
+ client.viewport.music.forEach(
+ (channel: HTMLAudioElement) => (channel.volume = musicVolume)
+ );
+ setCookie("musicVolume", String(musicVolume));
+};
+window.changeMusicVolume = changeMusicVolume; \ No newline at end of file
diff --git a/webAO/dom/reloadTheme.ts b/webAO/dom/reloadTheme.ts
new file mode 100644
index 0000000..bfa46b6
--- /dev/null
+++ b/webAO/dom/reloadTheme.ts
@@ -0,0 +1,16 @@
+import { client } from '../client'
+import setCookie from '../utils/setCookie';
+
+/**
+ * Triggered by the theme selector.
+ */
+export const reloadTheme = () => {
+ client.viewport.setTheme((<HTMLSelectElement>document.getElementById("client_themeselect"))
+ .value);
+
+ setCookie("theme", client.viewport.getTheme());
+ (<HTMLAnchorElement>(
+ document.getElementById("client_theme")
+ )).href = `styles/${client.viewport.getTheme()}.css`;
+}
+window.reloadTheme = reloadTheme; \ No newline at end of file
diff --git a/webAO/packets/handlers/handleMS.ts b/webAO/packets/handlers/handleMS.ts
index 1256900..92d65db 100644
--- a/webAO/packets/handlers/handleMS.ts
+++ b/webAO/packets/handlers/handleMS.ts
@@ -2,14 +2,14 @@ import { client, extrafeatures, UPDATE_INTERVAL } from "../../client";
import { handleCharacterInfo } from "../../client/handleCharacterInfo";
import { resetICParams } from "../../client/resetICParams";
import { prepChat, safeTags } from "../../encoding";
-
+import { handle_ic_speaking } from '../../viewport/utils/handleICSpeaking'
/**
* Handles an in-character chat message.
* @param {*} args packet arguments
*/
export const handleMS = (args: string[]) => {
// TODO: this if-statement might be a bug.
- if (args[4] !== client.viewport.chatmsg.content) {
+ if (args[4] !== client.viewport.getChatmsg().content) {
document.getElementById("client_inner_chat")!.innerHTML = "";
const char_id = Number(args[9]);
@@ -55,7 +55,7 @@ export const handleMS = (args: string[]) => {
if (char_muted === false) {
let chatmsg = {
- deskmod: safeTags(args[1]).toLowerCase(),
+ deskmod: Number(safeTags(args[1]).toLowerCase()),
preanim: safeTags(args[2]).toLowerCase(), // get preanim
nameplate: msg_nameplate,
chatbox: char_chatbox,
@@ -69,7 +69,7 @@ export const handleMS = (args: string[]) => {
charid: char_id,
snddelay: Number(args[10]),
objection: Number(args[11]),
- evidence: safeTags(args[12]),
+ evidence: Number(safeTags(args[12])),
flip: Number(args[13]),
flash: Number(args[14]),
color: Number(args[15]),
@@ -158,7 +158,8 @@ export const handleMS = (args: string[]) => {
if (chatmsg.charid === client.charID) {
resetICParams();
}
- client.viewport.handle_ic_speaking(chatmsg); // no await
+
+ handle_ic_speaking(chatmsg); // no await
}
}
} \ No newline at end of file
diff --git a/webAO/packets/handlers/handleRT.ts b/webAO/packets/handlers/handleRT.ts
index 5bbf2b2..62ebb1e 100644
--- a/webAO/packets/handlers/handleRT.ts
+++ b/webAO/packets/handlers/handleRT.ts
@@ -1,5 +1,5 @@
import { client } from "../../client";
-
+import { initTestimonyUpdater } from '../../viewport/utils/initTestimonyUpdater'
/**
* Handles a testimony states.
@@ -21,5 +21,5 @@ export const handleRT = (args: string[]) => {
default:
console.warn("Invalid testimony");
}
- client.viewport.initTestimonyUpdater();
+ initTestimonyUpdater();
} \ No newline at end of file
diff --git a/webAO/viewport/interfaces/ChatMsg.ts b/webAO/viewport/interfaces/ChatMsg.ts
index 293a774..6b96c6e 100644
--- a/webAO/viewport/interfaces/ChatMsg.ts
+++ b/webAO/viewport/interfaces/ChatMsg.ts
@@ -2,12 +2,12 @@ export interface ChatMsg {
content: string;
objection: number;
sound: string;
- startpreanim: boolean;
- startspeaking: boolean;
+ startpreanim?: boolean;
+ startspeaking?: boolean;
side: any;
color: number;
snddelay: number;
- preanimdelay: number;
+ preanimdelay?: number;
speed: number;
blips: string;
self_offset?: number[];
diff --git a/webAO/viewport/interfaces/Viewport.ts b/webAO/viewport/interfaces/Viewport.ts
index 3ffbcc8..5b428c1 100644
--- a/webAO/viewport/interfaces/Viewport.ts
+++ b/webAO/viewport/interfaces/Viewport.ts
@@ -1,17 +1,35 @@
import { ChatMsg } from "./ChatMsg";
+
export interface Viewport {
+ getTextNow: Function;
+ setTextNow: Function;
+ getChatmsg: Function;
+ setChatmsg: Function;
+ getSfxPlayed: Function;
+ setSfxPlayed: Function;
+ setTickTimer: Function;
+ getTickTimer: Function;
+ getAnimating: Function;
+ setAnimating: Function;
+ getLastEvidence: Function;
+ setLastEvidence: Function;
+ setLastCharacter: Function;
+ getLastCharacter: Function;
+ setShoutTimer: Function;
+ getShoutTimer: Function;
+ setTestimonyTimer: Function;
+ getTestimonyTimer: Function;
+ setTestimonyUpdater: Function;
+ getTestimonyUpdater: Function;
+ getTheme: Function;
+ setTheme: Function;
+ testimonyAudio: HTMLAudioElement;
chat_tick: Function;
- changeMusicVolume: Function;
- reloadTheme: Function;
playSFX: Function;
set_side: Function;
- initTestimonyUpdater: Function;
updateTestimony: Function;
disposeTestimony: Function;
- handle_ic_speaking: Function;
handleTextTick: Function;
- theme: string;
- chatmsg: ChatMsg;
setSfxAudio: Function;
getSfxAudio: Function;
getBackgroundFolder: Function;
@@ -19,6 +37,7 @@ export interface Viewport {
music: any;
musicVolume: number;
setBackgroundName: Function;
- lastChar: string;
getBackgroundName: Function;
-} \ No newline at end of file
+ shoutaudio: HTMLAudioElement;
+ updater: any;
+}
diff --git a/webAO/viewport/utils/handleICSpeaking.ts b/webAO/viewport/utils/handleICSpeaking.ts
new file mode 100644
index 0000000..c396093
--- /dev/null
+++ b/webAO/viewport/utils/handleICSpeaking.ts
@@ -0,0 +1,312 @@
+import { ChatMsg } from "../interfaces/ChatMsg";
+import { client } from "../../client";
+import { appendICLog } from "../../client/appendICLog";
+import { checkCallword } from "../../client/checkCallword";
+import setEmote from "../../client/setEmote";
+import { AO_HOST } from "../../client/aoHost";
+import { SHOUTS } from "../constants/shouts";
+import getAnimLength from "../../utils/getAnimLength";
+import { setChatbox } from "../../dom/setChatbox";
+import { resizeChatbox } from "../../dom/resizeChatbox";
+import transparentPng from "../../constants/transparentPng";
+import { COLORS } from "../constants/colors";
+import mlConfig from "../../utils/aoml";
+
+const attorneyMarkdown = mlConfig(AO_HOST);
+
+export let startFirstTickCheck: boolean;
+export const setStartFirstTickCheck = (val: boolean) => {startFirstTickCheck = val}
+export let startSecondTickCheck: boolean;
+export const setStartSecondTickCheck = (val: boolean) => {startSecondTickCheck = val}
+export let startThirdTickCheck: boolean;
+export const setStartThirdTickCheck = (val: boolean) => {startThirdTickCheck = val}
+/**
+ * Sets a new emote.
+ * This sets up everything before the tick() loops starts
+ * a lot of things can probably be moved here, like starting the shout animation if there is one
+ * TODO: the preanim logic, on the other hand, should probably be moved to tick()
+ * @param {object} chatmsg the new chat message
+ */
+export const handle_ic_speaking = async (playerChatMsg: ChatMsg) => {
+ client.viewport.setChatmsg(playerChatMsg);
+ client.viewport.setTextNow("");
+ client.viewport.setSfxPlayed(0);
+ client.viewport.setTickTimer(0);
+ client.viewport.setAnimating(true);
+
+ startFirstTickCheck = true;
+ startSecondTickCheck = false;
+ startThirdTickCheck = false;
+ let charLayers = document.getElementById("client_char")!;
+ let pairLayers = document.getElementById("client_pair_char")!;
+ // stop updater
+ clearTimeout(client.viewport.updater);
+
+ // stop last sfx from looping any longer
+ client.viewport.getSfxAudio().loop = false;
+
+ const fg = <HTMLImageElement>document.getElementById("client_fg");
+ const gamewindow = document.getElementById("client_gamewindow")!;
+ const waitingBox = document.getElementById("client_chatwaiting")!;
+
+ // Reset CSS animation
+ gamewindow.style.animation = "";
+ waitingBox.style.opacity = "0";
+
+ const eviBox = document.getElementById("client_evi")!;
+
+ if (client.viewport.getLastEvidence() !== client.viewport.getChatmsg().evidence) {
+ eviBox.style.opacity = "0";
+ eviBox.style.height = "0%";
+ }
+ client.viewport.setLastEvidence(client.viewport.getChatmsg().evidence);
+
+ const validSides: string[] = ["def", "pro", "wit"]; // these are for the full view pan, the other positions use 'client_char'
+ if (validSides.includes(client.viewport.getChatmsg().side)) {
+ charLayers = document.getElementById(`client_${client.viewport.getChatmsg().side}_char`);
+ pairLayers = document.getElementById(`client_${client.viewport.getChatmsg().side}_pair_char`);
+ }
+
+ const chatContainerBox = document.getElementById("client_chatcontainer")!;
+ const nameBoxInner = document.getElementById("client_inner_name")!;
+ const chatBoxInner = document.getElementById("client_inner_chat")!;
+
+ const displayname =
+ (<HTMLInputElement>document.getElementById("showname")).checked &&
+ client.viewport.getChatmsg().showname !== ""
+ ? client.viewport.getChatmsg().showname!
+ : client.viewport.getChatmsg().nameplate!;
+
+ // Clear out the last message
+ chatBoxInner.innerText = client.viewport.getTextNow();
+ nameBoxInner.innerText = displayname;
+
+ if (client.viewport.getLastCharacter() !== client.viewport.getChatmsg().name) {
+ charLayers.style.opacity = "0";
+ pairLayers.style.opacity = "0";
+ }
+
+ client.viewport.setLastCharacter(client.viewport.getChatmsg().name);
+
+ appendICLog(client.viewport.getChatmsg().content, client.viewport.getChatmsg().showname, client.viewport.getChatmsg().nameplate);
+
+ checkCallword(client.viewport.getChatmsg().content, client.viewport.getSfxAudio());
+
+ setEmote(
+ AO_HOST,
+ client,
+ client.viewport.getChatmsg().name!.toLowerCase(),
+ client.viewport.getChatmsg().sprite!,
+ "(a)",
+ false,
+ client.viewport.getChatmsg().side
+ );
+
+ if (client.viewport.getChatmsg().other_name) {
+ setEmote(
+ AO_HOST,
+ client,
+ client.viewport.getChatmsg().other_name.toLowerCase(),
+ client.viewport.getChatmsg().other_emote!,
+ "(a)",
+ false,
+ client.viewport.getChatmsg().side
+ );
+ }
+
+ // gets which shout shall played
+ const shoutSprite = <HTMLImageElement>(
+ document.getElementById("client_shout")
+ );
+
+ const shout = SHOUTS[client.viewport.getChatmsg().objection];
+ if (shout) {
+ // Hide message box
+ chatContainerBox.style.opacity = "0";
+ if (client.viewport.getChatmsg().objection === 4) {
+ shoutSprite.src = `${AO_HOST}characters/${encodeURI(
+ client.viewport.getChatmsg().name!.toLowerCase()
+ )}/custom.gif`;
+ } else {
+ shoutSprite.src = client.resources[shout].src;
+ shoutSprite.style.animation = "bubble 700ms steps(10, jump-both)";
+ }
+ shoutSprite.style.opacity = "1";
+
+ client.viewport.shoutaudio.src = `${AO_HOST}characters/${encodeURI(
+ client.viewport.getChatmsg().name.toLowerCase()
+ )}/${shout}.opus`;
+ client.viewport.shoutaudio.play();
+ client.viewport.setShoutTimer(client.resources[shout].duration);
+ } else {
+ client.viewport.setShoutTimer(0);
+ }
+
+ client.viewport.getChatmsg().startpreanim = true;
+ let gifLength = 0;
+
+ if (client.viewport.getChatmsg().type === 1 && client.viewport.getChatmsg().preanim !== "-") {
+ //we have a preanim
+ chatContainerBox.style.opacity = "0";
+
+ gifLength = await getAnimLength(
+ `${AO_HOST}characters/${encodeURI(
+ client.viewport.getChatmsg().name!.toLowerCase()
+ )}/${encodeURI(client.viewport.getChatmsg().preanim)}`
+ );
+ console.debug("preanim is " + gifLength + " long");
+ client.viewport.getChatmsg().startspeaking = false;
+ } else {
+ client.viewport.getChatmsg().startspeaking = true;
+ if (client.viewport.getChatmsg().content !== "") chatContainerBox.style.opacity = "1";
+ }
+ client.viewport.getChatmsg().preanimdelay = gifLength;
+ const setAside = {
+ position: client.viewport.getChatmsg().side,
+ showSpeedLines: false,
+ showDesk: false,
+ };
+ let skipoffset: boolean = false;
+ if (client.viewport.getChatmsg().type === 5) {
+ setAside.showSpeedLines = true;
+ setAside.showDesk = false;
+ client.viewport.set_side(setAside);
+ } else {
+ switch (Number(client.viewport.getChatmsg().deskmod)) {
+ case 0: //desk is hidden
+ setAside.showSpeedLines = false;
+ setAside.showDesk = false;
+ client.viewport.set_side(setAside);
+ break;
+ case 1: //desk is shown
+ setAside.showSpeedLines = false;
+ setAside.showDesk = true;
+ client.viewport.set_side(setAside);
+ break;
+ case 2: //desk is hidden during preanim, but shown during idle/talk
+ setAside.showSpeedLines = false;
+ setAside.showDesk = false;
+ client.viewport.set_side(setAside);
+ break;
+ case 3: //opposite of 2
+ setAside.showSpeedLines = false;
+ setAside.showDesk = false;
+ client.viewport.set_side(setAside);
+ break;
+ case 4: //desk is hidden, character offset is ignored, pair character is hidden during preanim, normal behavior during idle/talk
+ setAside.showSpeedLines = false;
+ setAside.showDesk = false;
+ client.viewport.set_side(setAside);
+ skipoffset = true;
+ break;
+ case 5: //opposite of 4
+ setAside.showSpeedLines = false;
+ setAside.showDesk = true;
+ client.viewport.set_side(setAside);
+ break;
+ default:
+ setAside.showSpeedLines = false;
+ setAside.showDesk = true;
+ client.viewport.set_side(setAside);
+ break;
+ }
+ }
+
+ setChatbox(client.viewport.getChatmsg().chatbox);
+ resizeChatbox();
+
+ if (!skipoffset) {
+ // Flip the character
+ charLayers.style.transform =
+ client.viewport.getChatmsg().flip === 1 ? "scaleX(-1)" : "scaleX(1)";
+ pairLayers.style.transform =
+ client.viewport.getChatmsg().other_flip === 1 ? "scaleX(-1)" : "scaleX(1)";
+
+ // Shift by the horizontal offset
+ switch (client.viewport.getChatmsg().side) {
+ case "wit":
+ pairLayers.style.left = `${200 + Number(client.viewport.getChatmsg().other_offset[0])}%`;
+ charLayers.style.left = `${200 + Number(client.viewport.getChatmsg().self_offset[0])}%`;
+ break;
+ case "pro":
+ pairLayers.style.left = `${400 + Number(client.viewport.getChatmsg().other_offset[0])}%`;
+ charLayers.style.left = `${400 + Number(client.viewport.getChatmsg().self_offset[0])}%`;
+ break;
+ default:
+ pairLayers.style.left = `${Number(client.viewport.getChatmsg().other_offset[0])}%`;
+ charLayers.style.left = `${Number(client.viewport.getChatmsg().self_offset[0])}%`;
+ break;
+ }
+
+ // New vertical offsets
+ pairLayers.style.top = `${Number(client.viewport.getChatmsg().other_offset[1])}%`;
+ charLayers.style.top = `${Number(client.viewport.getChatmsg().self_offset[1])}%`;
+ }
+
+ client.viewport.blipChannels.forEach(
+ (channel: HTMLAudioElement) =>
+ (channel.src = `${AO_HOST}sounds/general/sfx-blip${encodeURI(
+ client.viewport.getChatmsg().blips.toLowerCase()
+ )}.opus`)
+ );
+
+ // process markup
+ if (client.viewport.getChatmsg().content.startsWith("~~")) {
+ chatBoxInner.style.textAlign = "center";
+ client.viewport.getChatmsg().content = client.viewport.getChatmsg().content.substring(2, client.viewport.getChatmsg().content.length);
+ } else {
+ chatBoxInner.style.textAlign = "inherit";
+ }
+
+ // apply effects
+ fg.style.animation = "";
+ const effectName = client.viewport.getChatmsg().effects[0].toLowerCase();
+ const badEffects = ["", "-", "none"];
+ if (effectName.startsWith("rain")) {
+ (<HTMLLinkElement>document.getElementById("effect_css")).href = "styles/effects/rain.css";
+ let intensity = 200;
+ if (effectName.endsWith("weak")) {
+ intensity = 100;
+ } else if (effectName.endsWith("strong")) {
+ intensity = 400;
+ }
+ if (intensity < fg.childElementCount)
+ fg.innerHTML = '';
+ else
+ intensity = intensity - fg.childElementCount;
+
+ for (let i = 0; i < intensity; i++) {
+ let drop = document.createElement("p");
+ drop.style.left = (Math.random() * 100) + "%";
+ drop.style.animationDelay = String(Math.random()) + "s";
+ fg.appendChild(drop)
+ }
+ } else if (
+ client.viewport.getChatmsg().effects[0] &&
+ !badEffects.includes(effectName)
+ ) {
+ (<HTMLLinkElement>document.getElementById("effect_css")).href = "";
+ fg.innerHTML = '';
+ const baseEffectUrl = `${AO_HOST}themes/default/effects/`;
+ fg.src = `${baseEffectUrl}${encodeURI(effectName)}.webp`;
+ } else {
+ fg.innerHTML = '';
+ fg.src = transparentPng;
+ }
+
+
+ charLayers.style.opacity = "1";
+
+ const soundChecks = ["0", "1", "", undefined];
+ if (soundChecks.some((check) => client.viewport.getChatmsg().sound === check)) {
+ client.viewport.getChatmsg().sound = client.viewport.getChatmsg().effects[2];
+ }
+
+ client.viewport.getChatmsg().parsed = await attorneyMarkdown.applyMarkdown(
+ client.viewport.getChatmsg().content,
+
+ COLORS[client.viewport.getChatmsg().color]
+
+ );
+ client.viewport.chat_tick();
+}; \ No newline at end of file
diff --git a/webAO/viewport/utils/initTestimonyUpdater.ts b/webAO/viewport/utils/initTestimonyUpdater.ts
new file mode 100644
index 0000000..e6f6e9d
--- /dev/null
+++ b/webAO/viewport/utils/initTestimonyUpdater.ts
@@ -0,0 +1,31 @@
+import { Testimony } from '../interfaces/Testimony'
+import { client, UPDATE_INTERVAL } from '../../client'
+/**
+ * Intialize testimony updater
+ */
+export const initTestimonyUpdater = () => {
+ const testimonyFilenames: Testimony = {
+ 1: "witnesstestimony",
+ 2: "crossexamination",
+ 3: "notguilty",
+ 4: "guilty",
+ };
+
+ const testimony = testimonyFilenames[client.testimonyID];
+ if (!testimony) {
+ console.warn(`Invalid testimony ID ${client.testimonyID}`);
+ return;
+ }
+
+ client.viewport.testimonyAudio.src = client.resources[testimony].sfx;
+ client.viewport.testimonyAudio.play();
+
+ const testimonyOverlay = <HTMLImageElement>(
+ document.getElementById("client_testimony")
+ );
+ testimonyOverlay.src = client.resources[testimony].src;
+ testimonyOverlay.style.opacity = "1";
+
+ client.viewport.setTestimonyTimer(0);
+ client.viewport.setTestimonyUpdater(setTimeout(() => client.viewport.updateTestimony(), UPDATE_INTERVAL));
+}; \ No newline at end of file
diff --git a/webAO/viewport/utils/setSide.ts b/webAO/viewport/utils/setSide.ts
new file mode 100644
index 0000000..15cb7c6
--- /dev/null
+++ b/webAO/viewport/utils/setSide.ts
@@ -0,0 +1,91 @@
+import { positions } from '../constants/positions'
+import { AO_HOST } from '../../client/aoHost'
+import { client } from '../../client'
+import tryUrls from '../../utils/tryUrls';
+import fileExists from '../../utils/fileExists';
+
+/**
+ * Changes the viewport background based on a given position.
+ *
+ * Valid positions: `def, pro, hld, hlp, wit, jud, jur, sea`
+ * @param {string} position the position to change into
+ */
+export const set_side = async ({
+ position,
+ showSpeedLines,
+ showDesk,
+}: {
+ position: string;
+ showSpeedLines: boolean;
+ showDesk: boolean;
+}) => {
+ const view = document.getElementById("client_fullview")!;
+ console.log(position)
+ let bench: HTMLImageElement;
+ if (['def','pro','wit'].includes(position)) {
+ bench = <HTMLImageElement>(
+ document.getElementById(`client_${position}_bench`)
+ );
+ } else {
+ bench = <HTMLImageElement>document.getElementById("client_bench_classic");
+ }
+
+ let court: HTMLImageElement;
+ if ("def,pro,wit".includes(position)) {
+ court = <HTMLImageElement>(
+ document.getElementById(`client_court_${position}`)
+ );
+ } else {
+ court = <HTMLImageElement>document.getElementById("client_court_classic");
+ }
+
+ let bg;
+ let desk;
+ let speedLines;
+
+ if ("def,pro,hld,hlp,wit,jud,jur,sea".includes(position)) {
+ bg = positions[position].bg;
+ desk = positions[position].desk;
+ speedLines = positions[position].speedLines;
+ } else {
+ bg = `${position}`;
+ desk = { ao2: `${position}_overlay.png`, ao1: "_overlay.png" };
+ speedLines = "defense_speedlines.gif";
+ }
+
+ if (showSpeedLines === true) {
+ court.src = `${AO_HOST}themes/default/${encodeURI(speedLines)}`;
+ } else {
+ court.src = await tryUrls(client.viewport.getBackgroundFolder() + bg);
+ }
+
+
+ if (showDesk === true && desk) {
+ const deskFilename = (await fileExists(client.viewport.getBackgroundFolder() + desk.ao2))
+ ? desk.ao2
+ : desk.ao1;
+ bench.src = client.viewport.getBackgroundFolder() + deskFilename;
+ bench.style.opacity = "1";
+ } else {
+ bench.style.opacity = "0";
+ }
+
+ if ("def,pro,wit".includes(position)) {
+ view.style.display = "";
+ document.getElementById("client_classicview")!.style.display = "none";
+ switch (position) {
+ case "def":
+ view.style.left = "0";
+ break;
+ case "wit":
+ view.style.left = "-200%";
+ break;
+ case "pro":
+ view.style.left = "-400%";
+ break;
+ }
+ } else {
+ view.style.display = "none";
+ document.getElementById("client_classicview").style.display = "";
+ }
+};
diff --git a/webAO/viewport/viewport.ts b/webAO/viewport/viewport.ts
index 9772796..9ac6e96 100644
--- a/webAO/viewport/viewport.ts
+++ b/webAO/viewport/viewport.ts
@@ -1,18 +1,8 @@
-import tryUrls from "../utils/tryUrls";
-import fileExists from "../utils/fileExists";
-import Client, { delay } from "../client";
+import { client, delay } from "../client";
import { UPDATE_INTERVAL } from "../client";
-import { setChatbox } from "../dom/setChatbox";
-import { resizeChatbox } from "../dom/resizeChatbox";
-import transparentPng from "../constants/transparentPng";
-import mlConfig from "../utils/aoml";
import setEmote from "../client/setEmote";
-import getAnimLength from "../utils/getAnimLength";
import { safeTags } from "../encoding";
-import setCookie from "../utils/setCookie";
import { AO_HOST } from "../client/aoHost";
-import { appendICLog } from "../client/appendICLog";
-import { checkCallword } from '../client/checkCallword'
import { Viewport } from './interfaces/Viewport'
import { createBlipsChannels } from './utils/createBlipChannels'
import { defaultChatMsg } from './constants/defaultChatMsg'
@@ -20,18 +10,16 @@ import { createMusic } from './utils/createMusic'
import { createSfxAudio } from './utils/createSfxAudio'
import { createShoutAudio } from './utils/createShoutAudio'
import { createTestimonyAudio } from './utils/createTestimonyAudio'
-import { ChatMsg } from "./interfaces/ChatMsg";
import { Testimony } from './interfaces/Testimony'
import { COLORS } from './constants/colors'
-import { SHOUTS } from './constants/shouts'
-import { positions } from './constants/positions'
+import { set_side } from './utils/setSide'
+import { ChatMsg } from "./interfaces/ChatMsg";
+import { setStartFirstTickCheck, setStartSecondTickCheck, startFirstTickCheck, startSecondTickCheck } from "./utils/handleICSpeaking";
-const viewport = (masterClient: Client): Viewport => {
+const viewport = (): Viewport => {
let animating = false;
- let attorneyMarkdown = mlConfig(AO_HOST);
let blipChannels = createBlipsChannels();
let chatmsg = defaultChatMsg;
- let client = masterClient;
let currentBlipChannel = 0;
let lastChar = "";
let lastEvi = 0;
@@ -41,9 +29,6 @@ const viewport = (masterClient: Client): Viewport => {
let sfxplayed = 0;
let shoutTimer = 0;
let shoutaudio = createShoutAudio();
- let startFirstTickCheck: boolean;
- let startSecondTickCheck: boolean;
- let startThirdTickCheck: boolean;
let testimonyAudio = createTestimonyAudio();
let testimonyTimer = 0;
let testimonyUpdater: any;
@@ -58,129 +43,34 @@ const viewport = (masterClient: Client): Viewport => {
const setBackgroundName = (value: string) => { backgroundName = value };
const getBackgroundFolder = () =>
`${AO_HOST}background/${encodeURI(backgroundName.toLowerCase())}/`;
-
+ const getTextNow = () => {return textnow}
+ const setTextNow = (val: string) => {textnow = val}
+ const getChatmsg = () => {return chatmsg}
+ const setChatmsg = (val: ChatMsg) => {chatmsg = val}
+ const getSfxPlayed = () => sfxplayed
+ const setSfxPlayed = (val: number) => {sfxplayed = val}
+ const getTickTimer = () => tickTimer
+ const setTickTimer = (val: number) => {tickTimer = val}
+ const getAnimating = () => animating
+ const setAnimating = (val: boolean) => {animating = val}
+ const getLastEvidence = () => lastEvi
+ const setLastEvidence = (val: number) => {lastEvi = val}
+ const setLastCharacter = (val: string) => {lastChar = val}
+ const getLastCharacter = () => lastChar
+ const getShoutTimer = () => shoutTimer
+ const setShoutTimer = (val: number) => {shoutTimer = val}
+ const getTheme = () => theme
+ const setTheme = (val: string) => {theme = val}
+ const getTestimonyTimer = () => testimonyTimer;
+ const setTestimonyTimer = (val: number) => {testimonyTimer = val}
+ const setTestimonyUpdater = (val: any) => {testimonyUpdater = val}
+ const getTestimonyUpdater = () => testimonyUpdater
const playSFX = async (sfxname: string, looping: boolean) => {
sfxAudio.pause();
sfxAudio.loop = looping;
sfxAudio.src = sfxname;
sfxAudio.play();
};
-
- /**
- * Changes the viewport background based on a given position.
- *
- * Valid positions: `def, pro, hld, hlp, wit, jud, jur, sea`
- * @param {string} position the position to change into
- */
- const set_side = async ({
- position,
- showSpeedLines,
- showDesk,
- }: {
- position: string;
- showSpeedLines: boolean;
- showDesk: boolean;
- }) => {
- const view = document.getElementById("client_fullview");
-
- let bench: HTMLImageElement;
- if ("def,pro,wit".includes(position)) {
- bench = <HTMLImageElement>(
- document.getElementById(`client_${position}_bench`)
- );
- } else {
- bench = <HTMLImageElement>document.getElementById("client_bench_classic");
- }
-
- let court: HTMLImageElement;
- if ("def,pro,wit".includes(position)) {
- court = <HTMLImageElement>(
- document.getElementById(`client_court_${position}`)
- );
- } else {
- court = <HTMLImageElement>document.getElementById("client_court_classic");
- }
-
- let bg;
- let desk;
- let speedLines;
-
- if ("def,pro,hld,hlp,wit,jud,jur,sea".includes(position)) {
- bg = positions[position].bg;
- desk = positions[position].desk;
- speedLines = positions[position].speedLines;
- } else {
- bg = `${position}`;
- desk = { ao2: `${position}_overlay.png`, ao1: "_overlay.png" };
- speedLines = "defense_speedlines.gif";
- }
-
- if (showSpeedLines === true) {
- court.src = `${AO_HOST}themes/default/${encodeURI(speedLines)}`;
- } else {
- court.src = await tryUrls(getBackgroundFolder() + bg);
- }
-
- if (showDesk === true && desk) {
- const deskFilename = (await fileExists(getBackgroundFolder() + desk.ao2))
- ? desk.ao2
- : desk.ao1;
- bench.src = getBackgroundFolder() + deskFilename;
- bench.style.opacity = "1";
- } else {
- bench.style.opacity = "0";
- }
-
- if ("def,pro,wit".includes(position)) {
- view.style.display = "";
- document.getElementById("client_classicview").style.display = "none";
- switch (position) {
- case "def":
- view.style.left = "0";
- break;
- case "wit":
- view.style.left = "-200%";
- break;
- case "pro":
- view.style.left = "-400%";
- break;
- }
- } else {
- view.style.display = "none";
- document.getElementById("client_classicview").style.display = "";
- }
- };
-
- /**
- * Intialize testimony updater
- */
- const initTestimonyUpdater = () => {
- const testimonyFilenames: Testimony = {
- 1: "witnesstestimony",
- 2: "crossexamination",
- 3: "notguilty",
- 4: "guilty",
- };
-
- const testimony = testimonyFilenames[masterClient.testimonyID];
- if (!testimony) {
- console.warn(`Invalid testimony ID ${masterClient.testimonyID}`);
- return;
- }
-
- testimonyAudio.src = masterClient.resources[testimony].sfx;
- testimonyAudio.play();
-
- const testimonyOverlay = <HTMLImageElement>(
- document.getElementById("client_testimony")
- );
- testimonyOverlay.src = masterClient.resources[testimony].src;
- testimonyOverlay.style.opacity = "1";
-
- testimonyTimer = 0;
- testimonyUpdater = setTimeout(() => updateTestimony(), UPDATE_INTERVAL);
- };
-
/**
* Updates the testimony overaly
*/
@@ -195,8 +85,8 @@ const viewport = (masterClient: Client): Viewport => {
// Update timer
testimonyTimer += UPDATE_INTERVAL;
- const testimony = testimonyFilenames[masterClient.testimonyID];
- const resource = masterClient.resources[testimony];
+ const testimony = testimonyFilenames[client.testimonyID];
+ const resource = client.resources[testimony];
if (!resource) {
disposeTestimony();
return;
@@ -208,304 +98,15 @@ const viewport = (masterClient: Client): Viewport => {
testimonyUpdater = setTimeout(() => updateTestimony(), UPDATE_INTERVAL);
}
};
-
/**
* Dispose the testimony overlay
*/
const disposeTestimony = () => {
- masterClient.testimonyID = 0;
+ client.testimonyID = 0;
testimonyTimer = 0;
document.getElementById("client_testimony").style.opacity = "0";
clearTimeout(testimonyUpdater);
};
-
- /**
- * Sets a new emote.
- * This sets up everything before the tick() loops starts
- * a lot of things can probably be moved here, like starting the shout animation if there is one
- * TODO: the preanim logic, on the other hand, should probably be moved to tick()
- * @param {object} chatmsg the new chat message
- */
- const handle_ic_speaking = async (playerChatMsg: ChatMsg) => {
- chatmsg = playerChatMsg;
- client.viewport.chatmsg = playerChatMsg;
-
- textnow = "";
- sfxplayed = 0;
- tickTimer = 0;
- animating = true;
- startFirstTickCheck = true;
- startSecondTickCheck = false;
- startThirdTickCheck = false;
- let charLayers = document.getElementById("client_char");
- let pairLayers = document.getElementById("client_pair_char");
- // stop updater
- clearTimeout(updater);
-
- // stop last sfx from looping any longer
- sfxAudio.loop = false;
-
- const fg = <HTMLImageElement>document.getElementById("client_fg");
- const gamewindow = document.getElementById("client_gamewindow");
- const waitingBox = document.getElementById("client_chatwaiting");
-
- // Reset CSS animation
- gamewindow.style.animation = "";
- waitingBox.style.opacity = "0";
-
- const eviBox = document.getElementById("client_evi");
-
- if (lastEvi !== chatmsg.evidence) {
- eviBox.style.opacity = "0";
- eviBox.style.height = "0%";
- }
- lastEvi = chatmsg.evidence;
-
- const validSides: string[] = ["def", "pro", "wit"]; // these are for the full view pan, the other positions use 'client_char'
- if (validSides.includes(chatmsg.side)) {
- charLayers = document.getElementById(`client_${chatmsg.side}_char`);
- pairLayers = document.getElementById(`client_${chatmsg.side}_pair_char`);
- }
-
- const chatContainerBox = document.getElementById("client_chatcontainer");
- const nameBoxInner = document.getElementById("client_inner_name");
- const chatBoxInner = document.getElementById("client_inner_chat");
-
- const displayname =
- (<HTMLInputElement>document.getElementById("showname")).checked &&
- chatmsg.showname !== ""
- ? chatmsg.showname
- : chatmsg.nameplate;
-
- // Clear out the last message
- chatBoxInner.innerText = textnow;
- nameBoxInner.innerText = displayname;
-
- if (lastChar !== chatmsg.name) {
- charLayers.style.opacity = "0";
- pairLayers.style.opacity = "0";
- }
-
- lastChar = chatmsg.name;
- client.viewport.lastChar = chatmsg.name;
-
- appendICLog(chatmsg.content, chatmsg.showname, chatmsg.nameplate);
-
- checkCallword(chatmsg.content, sfxAudio);
-
- setEmote(
- AO_HOST,
- client,
- chatmsg.name.toLowerCase(),
- chatmsg.sprite,
- "(a)",
- false,
- chatmsg.side
- );
-
- if (chatmsg.other_name) {
- setEmote(
- AO_HOST,
- client,
- chatmsg.other_name.toLowerCase(),
- chatmsg.other_emote,
- "(a)",
- false,
- chatmsg.side
- );
- }
-
- // gets which shout shall played
- const shoutSprite = <HTMLImageElement>(
- document.getElementById("client_shout")
- );
- const shout = SHOUTS[chatmsg.objection];
- if (shout) {
- // Hide message box
- chatContainerBox.style.opacity = "0";
- if (chatmsg.objection === 4) {
- shoutSprite.src = `${AO_HOST}characters/${encodeURI(
- chatmsg.name.toLowerCase()
- )}/custom.gif`;
- } else {
- shoutSprite.src = masterClient.resources[shout].src;
- shoutSprite.style.animation = "bubble 700ms steps(10, jump-both)";
- }
- shoutSprite.style.opacity = "1";
-
- shoutaudio.src = `${AO_HOST}characters/${encodeURI(
- chatmsg.name.toLowerCase()
- )}/${shout}.opus`;
- shoutaudio.play();
- shoutTimer = masterClient.resources[shout].duration;
- } else {
- shoutTimer = 0;
- }
-
- chatmsg.startpreanim = true;
- let gifLength = 0;
-
- if (chatmsg.type === 1 && chatmsg.preanim !== "-") {
- //we have a preanim
- chatContainerBox.style.opacity = "0";
- gifLength = await getAnimLength(
- `${AO_HOST}characters/${encodeURI(
- chatmsg.name.toLowerCase()
- )}/${encodeURI(chatmsg.preanim)}`
- );
- console.debug("preanim is " + gifLength + " long");
- chatmsg.startspeaking = false;
- } else {
- chatmsg.startspeaking = true;
- if (chatmsg.content !== "") chatContainerBox.style.opacity = "1";
- }
- chatmsg.preanimdelay = gifLength;
- const setAside = {
- position: chatmsg.side,
- showSpeedLines: false,
- showDesk: false,
- };
- let skipoffset: boolean = false;
- if (chatmsg.type === 5) {
- setAside.showSpeedLines = true;
- setAside.showDesk = false;
- set_side(setAside);
- } else {
- switch (Number(chatmsg.deskmod)) {
- case 0: //desk is hidden
- setAside.showSpeedLines = false;
- setAside.showDesk = false;
- set_side(setAside);
- break;
- case 1: //desk is shown
- setAside.showSpeedLines = false;
- setAside.showDesk = true;
- set_side(setAside);
- break;
- case 2: //desk is hidden during preanim, but shown during idle/talk
- setAside.showSpeedLines = false;
- setAside.showDesk = false;
- set_side(setAside);
- break;
- case 3: //opposite of 2
- setAside.showSpeedLines = false;
- setAside.showDesk = false;
- set_side(setAside);
- break;
- case 4: //desk is hidden, character offset is ignored, pair character is hidden during preanim, normal behavior during idle/talk
- setAside.showSpeedLines = false;
- setAside.showDesk = false;
- set_side(setAside);
- skipoffset = true;
- break;
- case 5: //opposite of 4
- setAside.showSpeedLines = false;
- setAside.showDesk = true;
- set_side(setAside);
- break;
- default:
- setAside.showSpeedLines = false;
- setAside.showDesk = true;
- set_side(setAside);
- break;
- }
- }
-
- setChatbox(chatmsg.chatbox);
- resizeChatbox();
-
- if (!skipoffset) {
- // Flip the character
- charLayers.style.transform =
- chatmsg.flip === 1 ? "scaleX(-1)" : "scaleX(1)";
- pairLayers.style.transform =
- chatmsg.other_flip === 1 ? "scaleX(-1)" : "scaleX(1)";
-
- // Shift by the horizontal offset
- switch (chatmsg.side) {
- case "wit":
- pairLayers.style.left = `${200 + Number(chatmsg.other_offset[0])}%`;
- charLayers.style.left = `${200 + Number(chatmsg.self_offset[0])}%`;
- break;
- case "pro":
- pairLayers.style.left = `${400 + Number(chatmsg.other_offset[0])}%`;
- charLayers.style.left = `${400 + Number(chatmsg.self_offset[0])}%`;
- break;
- default:
- pairLayers.style.left = `${Number(chatmsg.other_offset[0])}%`;
- charLayers.style.left = `${Number(chatmsg.self_offset[0])}%`;
- break;
- }
-
- // New vertical offsets
- pairLayers.style.top = `${Number(chatmsg.other_offset[1])}%`;
- charLayers.style.top = `${Number(chatmsg.self_offset[1])}%`;
- }
-
- blipChannels.forEach(
- (channel: HTMLAudioElement) =>
- (channel.src = `${AO_HOST}sounds/general/sfx-blip${encodeURI(
- chatmsg.blips.toLowerCase()
- )}.opus`)
- );
-
- // process markup
- if (chatmsg.content.startsWith("~~")) {
- chatBoxInner.style.textAlign = "center";
- chatmsg.content = chatmsg.content.substring(2, chatmsg.content.length);
- } else {
- chatBoxInner.style.textAlign = "inherit";
- }
-
- // apply effects
- fg.style.animation = "";
- const effectName = chatmsg.effects[0].toLowerCase();
- const badEffects = ["", "-", "none"];
- if (effectName.startsWith("rain")) {
- (<HTMLLinkElement>document.getElementById("effect_css")).href = "styles/effects/rain.css";
- let intensity = 200;
- if (effectName.endsWith("weak")) {
- intensity = 100;
- } else if (effectName.endsWith("strong")) {
- intensity = 400;
- }
- if (intensity < fg.childElementCount)
- fg.innerHTML = '';
- else
- intensity = intensity - fg.childElementCount;
-
- for (let i = 0; i < intensity; i++) {
- let drop = document.createElement("p");
- drop.style.left = (Math.random() * 100) + "%";
- drop.style.animationDelay = String(Math.random()) + "s";
- fg.appendChild(drop)
- }
- } else if (
- chatmsg.effects[0] &&
- !badEffects.includes(effectName)
- ) {
- (<HTMLLinkElement>document.getElementById("effect_css")).href = "";
- fg.innerHTML = '';
- const baseEffectUrl = `${AO_HOST}themes/default/effects/`;
- fg.src = `${baseEffectUrl}${encodeURI(effectName)}.webp`;
- } else {
- fg.innerHTML = '';
- fg.src = transparentPng;
- }
-
- charLayers.style.opacity = "1";
-
- const soundChecks = ["0", "1", "", undefined];
- if (soundChecks.some((check) => chatmsg.sound === check)) {
- chatmsg.sound = chatmsg.effects[2];
- }
- chatmsg.parsed = await attorneyMarkdown.applyMarkdown(
- chatmsg.content,
- COLORS[chatmsg.color]
- );
- chat_tick();
- };
-
const handleTextTick = async (charLayers: HTMLImageElement) => {
const chatBox = document.getElementById("client_chat");
const waitingBox = document.getElementById("client_chatwaiting");
@@ -631,7 +232,8 @@ const viewport = (masterClient: Client): Viewport => {
const chat_tick = async () => {
// note: this is called fairly often
// do not perform heavy operations here
-
+ console.log(textnow)
+ console.log(chatmsg.content)
await delay(chatmsg.speed);
if (textnow === chatmsg.content) {
return;
@@ -696,14 +298,15 @@ const viewport = (masterClient: Client): Viewport => {
} else {
pairLayers.style.opacity = "0";
}
+
// Done with first check, move to second
- startFirstTickCheck = false;
- startSecondTickCheck = true;
+ setStartFirstTickCheck(false)
+ setStartSecondTickCheck(true)
chatmsg.startpreanim = false;
chatmsg.startspeaking = true;
}
-
+
const hasNonInterruptingPreAnim = chatmsg.noninterrupting_preanim === 1;
if (textnow !== chatmsg.content && hasNonInterruptingPreAnim) {
const chatContainerBox = document.getElementById("client_chatcontainer");
@@ -717,7 +320,7 @@ const viewport = (masterClient: Client): Viewport => {
if (chatmsg.evidence > 0) {
// Prepare evidence
eviBox.src = safeTags(
- masterClient.evidences[chatmsg.evidence - 1].icon
+ client.evidences[chatmsg.evidence - 1].icon
);
eviBox.style.width = "auto";
@@ -842,59 +445,53 @@ const viewport = (masterClient: Client): Viewport => {
);
}
}
+ console.log(animating)
if (animating) {
chat_tick();
}
tickTimer += UPDATE_INTERVAL;
};
- /**
- * Triggered by the theme selector.
- */
- function reloadTheme() {
- theme = (<HTMLSelectElement>document.getElementById("client_themeselect"))
- .value;
-
- setCookie("theme", theme);
- (<HTMLAnchorElement>(
- document.getElementById("client_theme")
- )).href = `styles/${theme}.css`;
- }
- window.reloadTheme = reloadTheme;
-
- const changeMusicVolume = (volume: number = -1) => {
- const clientVolume = Number(
- (<HTMLInputElement>document.getElementById("client_mvolume")).value
- );
- let musicVolume = volume === -1 ? clientVolume : volume;
- music.forEach(
- (channel: HTMLAudioElement) => (channel.volume = musicVolume)
- );
- setCookie("musicVolume", String(musicVolume));
- };
- window.changeMusicVolume = changeMusicVolume;
return {
+ getTextNow,
+ setTextNow,
+ getChatmsg,
+ setChatmsg,
+ getSfxPlayed,
+ setSfxPlayed,
+ setTickTimer,
+ getTickTimer,
+ setAnimating,
+ getAnimating,
+ getLastEvidence,
+ setLastEvidence,
+ setLastCharacter,
+ getLastCharacter,
+ getShoutTimer,
+ setShoutTimer,
+ setTheme,
+ getTheme,
+ setTestimonyTimer,
+ getTestimonyTimer,
+ setTestimonyUpdater,
+ getTestimonyUpdater,
+ testimonyAudio,
chat_tick,
- changeMusicVolume,
- reloadTheme,
playSFX,
set_side,
setBackgroundName,
- initTestimonyUpdater,
updateTestimony,
disposeTestimony,
- handle_ic_speaking,
handleTextTick,
getBackgroundFolder,
getBackgroundName,
getSfxAudio,
setSfxAudio,
- theme,
- chatmsg,
blipChannels,
- lastChar,
music,
musicVolume,
+ shoutaudio,
+ updater,
};
};