diff --git a/BondageClub/Screens/MiniGame/MagicBattle/MagicBattle.js b/BondageClub/Screens/MiniGame/MagicBattle/MagicBattle.js
index 94bf9db4b0..7d56d668a6 100644
--- a/BondageClub/Screens/MiniGame/MagicBattle/MagicBattle.js
+++ b/BondageClub/Screens/MiniGame/MagicBattle/MagicBattle.js
@@ -4,7 +4,6 @@ var MagicBattleOpponent = null;
 var MagicBattleReturnFunction = "";
 var MagicBattleDifficulty = 0;
 var MagicBattleVictory = false;
-/** @type Array<number> */
 var MagicBattleAvailSpell = [];
 var MagicBattleOpponentSpell = 0;
 var MagicBattlePlayerAppearance = null;
@@ -13,10 +12,6 @@ var MagicBattleSpellDifficulty = [3, 5, 7, 9, 6, 8, 4, 8];
 
 /**
  * Start a magic battle against an opponent
- * @param {Character} Opponent
- * @param {number} Difficulty
- * @param {string} Background
- * @param {string} FunctionName
  * @returns {void} - Nothing
  */
 function MagicBattleStart(Opponent, Difficulty, Background, FunctionName) {
@@ -42,7 +37,6 @@ function MagicBattleLoad() {
 
 /**
  * Returns a difficulty factor based on the character nakedness and predicament
- * @param {Character} C
  * @returns {number} - Difficulty from 0 (full cloth, no restrain) to 10 (naked, fully restrained)
  */
 function MagicBattleGetDifficulty(C) {
@@ -67,8 +61,7 @@ function MagicBattleGetDifficulty(C) {
 
 /**
  * Returns the spells that are available based on opponent (C) clothing and restraints
- * @param {Character} C
- * @returns {Array<number>} - Nothing
+ * @returns {void} - Nothing
  */
 function MagicBattleGetAvailSpells(C) {
 	if (C == null) return [];
@@ -132,7 +125,6 @@ function MagicBattleClick() {
 
 /**
  * Starts the magic puzzle mini-game for a specific spell (S)
- * @param {number} S
  * @returns {void} - Nothing
  */
 function MagicBattleSpellStart(S) {
@@ -151,12 +143,10 @@ function MagicBattleSpellStart(S) {
 
 /**
  * Applies the effect of a magic spell (Spell) on a character (C)
- * @param {Character} C
- * @param {number} Spell
  * @returns {void} - Nothing
  */
 function MagicSpellEffect(C, Spell) {
-
+	
 	// Strip spell
 	if (Spell == 0) {
 		if ((InventoryGet(C, "Cloth") != null) || (InventoryGet(C, "ClothLower") != null) || (InventoryGet(C, "ClothAccessory") != null) || (InventoryGet(C, "Shoes") != null)) {
@@ -248,5 +238,5 @@ function MagicBattleSpellEnd() {
  * @returns {void} - Nothing
  */
 function MagicBattleKeyDown() {
-	//if (MiniGameCheatKeyDown())
+	//if (MiniGameCheatKeyDown()) 
 }
diff --git a/BondageClub/Screens/Online/ChatCreate/ChatCreate.js b/BondageClub/Screens/Online/ChatCreate/ChatCreate.js
index c3544fbfa4..70a222f43a 100644
--- a/BondageClub/Screens/Online/ChatCreate/ChatCreate.js
+++ b/BondageClub/Screens/Online/ChatCreate/ChatCreate.js
@@ -19,13 +19,15 @@ var ChatCreateIsHidden = false;
 function ChatCreateLoad() {
 
 	// Resets the LARP game status
-	if ((ChatRoomGame == "LARP") && (GameLARPGetStatus() != "")) {
-		GameLARPSetStatus("");
+	if ((ChatRoomGame == "LARP") && (Player.Game != null) && (Player.Game.LARP != null) && (Player.Game.LARP.Status != "")) {
+		Player.Game.LARP.Status = "";
+		ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
 	}
 
 	// Resets the Magic Battle game status
-	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleGetStatus() != "")) {
-		GameMagicBattleSetStatus("");
+	if ((ChatRoomGame == "MagicBattle") && (Player.Game != null) && (Player.Game.MagicBattle != null) && (Player.Game.MagicBattle.Status != "")) {
+		Player.Game.MagicBattle.Status = "";
+		ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
 	}
 
 	// If the current background isn't valid, we pick the first one
diff --git a/BondageClub/Screens/Online/Game/OnlineGame.js b/BondageClub/Screens/Online/Game/OnlineGame.js
index e1637337b1..cb874590ba 100644
--- a/BondageClub/Screens/Online/Game/OnlineGame.js
+++ b/BondageClub/Screens/Online/Game/OnlineGame.js
@@ -1,6 +1,5 @@
 "use strict";
-/** @type string[][] */
-let OnlineGameDictionary = null;
+var OnlineGameDictionary = null;
 
 /**
  * Loads the online game dictionary that will be used throughout the game to output messages
@@ -52,8 +51,8 @@ function OnlineGameDictionaryText(KeyWord) {
  * @return {*} Returns the return content of click function of the currently selected game, or false if there is no corresponding game
  */
 function OnlineGameClickCharacter(C) {
-	if ((ChatRoomGame == "LARP") && (GameLARPGetStatus() != "")) return GameLARPCharacterClick(C);
-	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleGetStatus() != "")) return GameMagicBattleCharacterClick(C);
+	if ((ChatRoomGame == "LARP") && (GameLARPStatus != "")) return GameLARPCharacterClick(C);
+	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleStatus != "")) return GameMagicBattleCharacterClick(C);
 	return false;
 }
 
@@ -62,8 +61,8 @@ function OnlineGameClickCharacter(C) {
  * @return {*} Returns the return content of click function of the currently selected game, or false if there is no corresponding game
  */
 function OnlineGameClick() {
-	if ((ChatRoomGame == "LARP") && (GameLARPGetStatus() != "")) return GameLARPClickProcess();
-	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleGetStatus() != "")) return GameMagicBattleClickProcess();
+	if ((ChatRoomGame == "LARP") && (GameLARPStatus != "")) return GameLARPClickProcess();
+	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleStatus != "")) return GameMagicBattleClickProcess();
 	return false;
 }
 
@@ -84,8 +83,8 @@ function OnlineGameRun() {
  * @returns {boolean} - Returns TRUE if there's no online game that currently blocks changing
  */
 function OnlineGameAllowChange() {
-	if ((ChatRoomGame == "LARP") && (GameLARPGetStatus() != "")) return false;
-	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleGetStatus() != "")) return false;
+	if ((ChatRoomGame == "LARP") && (GameLARPStatus != "")) return false;
+	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleStatus != "")) return false;
 	return true;
 }
 
@@ -94,8 +93,8 @@ function OnlineGameAllowChange() {
  * @returns {boolean} - Returns TRUE if the online game allows you to block items
  */
 function OnlineGameAllowBlockItems() {
-	if ((ChatRoomGame == "LARP") && (GameLARPGetStatus() != "")) return false;
-	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleGetStatus() != "")) return false;
+	if ((ChatRoomGame == "LARP") && (GameLARPStatus != "")) return false;
+	if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleStatus != "")) return false;
 	return true;
 }
 
@@ -104,8 +103,22 @@ function OnlineGameAllowBlockItems() {
  * @returns {void} - Nothing
  */
 function OnlineGameLoadStatus() {
-	if (ChatRoomGame == "LARP") GameLARPLoadStatus();
-	if (ChatRoomGame == "MagicBattle") GameMagicBattleLoadStatus();
+	if (ChatRoomGame == "LARP") {
+		for (let C = 0; C < ChatRoomCharacter.length; C++)
+			if ((ChatRoomData.Admin.indexOf(ChatRoomCharacter[C].MemberNumber) >= 0) && (ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.LARP != null) && (ChatRoomCharacter[C].Game.LARP.Status != "")) {
+				GameLARPStatus = ChatRoomCharacter[C].Game.LARP.Status;
+				return;
+			}
+		GameLARPReset();
+	}
+	if (ChatRoomGame == "MagicBattle") {
+		for (let C = 0; C < ChatRoomCharacter.length; C++)
+			if ((ChatRoomData.Admin.indexOf(ChatRoomCharacter[C].MemberNumber) >= 0) && (ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.MagicBattle != null) && (ChatRoomCharacter[C].Game.MagicBattle.Status != "")) {
+				GameMagicBattleStatus = ChatRoomCharacter[C].Game.MagicBattle.Status;
+				return;
+			}
+		GameMagicBattleReset();
+	}
 }
 
 /**
@@ -138,7 +151,70 @@ function OnlineGameCharacterInChatRoom(MemberNumber) {
  * @returns {void} - Nothing
  */
 function OnlineGameDrawCharacter(C, X, Y, Zoom) {
-	if (ChatRoomGame === "GGTS") AsylumGGTSDrawCharacter(C, X, Y, Zoom);
-	if (ChatRoomGame === "LARP") GameLARPDrawCharacter(C, X, Y, Zoom);
-	if (ChatRoomGame === "MagicBattle") GameMagicBattleDrawCharacter(C, X, Y, Zoom);
+
+	// GGTS Draws the level, the number of strikes and a progress bar, level 6 shows the time in a gold frame
+	if ((CurrentModule == "Online") && (CurrentScreen == "ChatRoom") && (ChatRoomGame == "GGTS") && (ChatRoomSpace === "Asylum")) {
+		let Level = AsylumGGTSGetLevel(C);
+		if ((Level > 0) && (C.Game != null) && (C.Game.GGTS != null)) {
+			if (C.Game.GGTS.Strike >= 1) DrawImageZoomCanvas("Screens/Room/AsylumGGTS/Strike" + C.Game.GGTS.Strike.toString() + ".png", MainCanvas, 0, 0, 100, 50, X + 50 * Zoom, Y + 800 * Zoom, 100 * Zoom, 50 * Zoom);
+			MainCanvas.font = CommonGetFont(Math.round(36 * Zoom));
+			let Progress = Math.floor(C.Game.GGTS.Time / AsylumGGTSLevelTime[Level] * 100);
+			if (C.Game.GGTS.Strike >= 3) Progress = 0;
+			if ((Level >= 6) || (Progress >= 100)) DrawEmptyRect(X + 50 * Zoom, Y + 860 * Zoom, 100 * Zoom, 40 * Zoom, "Black");
+			if (Level >= 6) DrawRect(X + 52 * Zoom, Y + 862 * Zoom, 96 * Zoom, 36 * Zoom, "#FFD700");
+			else if (Progress >= 100) DrawRect(X + 50 * Zoom, Y + 860 * Zoom, 100 * Zoom, 40 * Zoom, "White");
+			else DrawProgressBar(X + 50 * Zoom, Y + 860 * Zoom, 100 * Zoom, 40 * Zoom, Progress);
+			if (Level >= 6) DrawText(Math.floor(C.Game.GGTS.Time / 60000).toString(), X + 100 * Zoom, Y + 881 * Zoom, "Black", "White");
+			else if (Progress >= 50) DrawText(Level.toString(), X + 100 * Zoom, Y + 881 * Zoom, "Black", "White");
+			else DrawText(Level.toString(), X + 101 * Zoom, Y + 882 * Zoom, "White", "Black");
+			if (C.Game.GGTS.Rule != null)
+				for (let R = 0; R < C.Game.GGTS.Rule.length; R++)
+					DrawImageZoomCanvas("Screens/Room/AsylumGGTS/Rule" + C.Game.GGTS.Rule[R] + ".png", MainCanvas, 0, 0, 33, 33, X + 50 * Zoom + R * 33 * Zoom, Y + 902 * Zoom, 33 * Zoom, 33 * Zoom);
+			if ((C.ID == 0) && (AsylumGGTSTimer > 0) && (AsylumGGTSTimer > CommonTime()) && (C.Game.GGTS.Strike < 3)) {
+				let ForeColor = (AsylumGGTSTask == null) ? "Black" : "White";
+				let BackColor = (ForeColor == "White") ? "Black" : "White";
+				if ((BackColor == "Black") && (Math.round((AsylumGGTSTimer - CommonTime()) / 1000) <= 10)) BackColor = "Red";
+				DrawEmptyRect(X + 350 * Zoom, Y + 860 * Zoom, 100 * Zoom, 40 * Zoom, ForeColor, 2);
+				DrawRect(X + 352 * Zoom, Y + 862 * Zoom, 96 * Zoom, 36 * Zoom, BackColor);
+				DrawText(Math.round((AsylumGGTSTimer - CommonTime()) / 1000).toString(), X + 399 * Zoom, Y + 882 * Zoom, ForeColor, "Silver");
+			}
+			MainCanvas.font = CommonGetFont(36);
+		}
+	}
+
+	// LARP draws the timer if needed and the icon linked to team and class
+	if ((CurrentModule == "Online") && (CurrentScreen == "ChatRoom") && (ChatRoomGame == "LARP")) {
+		GameLARPDrawIcon(C, X + 70 * Zoom, Y + 800 * Zoom, 0.6 * Zoom);
+		if ((GameLARPPlayer.length > 0) && (C.MemberNumber == GameLARPPlayer[GameLARPTurnPosition].MemberNumber) && (GameLARPStatus == "Running") && (GameLARPTurnFocusCharacter == null)) {
+			MainCanvas.font = CommonGetFont(72);
+			var Time = Math.ceil((GameLARPTurnTimer - TimerGetTime()) / 1000);
+			DrawText(((Time < 0) || (Time > GameLARPTimerDelay[GameLARPTimerDelay.length - 1])) ? OnlineGameDictionaryText("TimerNA") : Time.toString(), X + 250 * Zoom, Y + 830 * Zoom, "Red", "Black");
+			MainCanvas.font = CommonGetFont(36);
+		}
+	}
+
+	// Magic battle draws the timer and the spell buttons
+	if ((CurrentModule == "Online") && (CurrentScreen == "ChatRoom") && (ChatRoomGame == "MagicBattle")) {
+		GameMagicBattleDrawIcon(C, X + 70 * Zoom, Y + 800 * Zoom, 0.6 * Zoom);
+		if (Player.CanTalk() && (GameMagicBattleStatus == "Running")) {
+			if (C.MemberNumber == Player.MemberNumber) {
+				MainCanvas.font = CommonGetFont(72);
+				let Time = Math.ceil((GameMagicBattleTurnTimer - TimerGetTime()) / 1000);
+				let Color = "#00FF00";
+				if (Time <= 15) Color = "#FFFF00";
+				if (Time <= 6) Color = "#FF0000";
+				DrawText(((Time < 0) || (Time > GameMagicBattleTimerDelay)) ? OnlineGameDictionaryText("TimerNA") : Time.toString(), X + 250 * Zoom, Y + 830 * Zoom, Color, "Black");
+				MainCanvas.font = CommonGetFont(36);
+			}
+			if ((GameMagicBattleFocusCharacter != null) && (C.MemberNumber == GameMagicBattleFocusCharacter.MemberNumber) && (GameMagicBattleStatus == "Running")) {
+				GameMagicBattleButton = [];
+				for (let S = 0; S < MagicBattleAvailSpell.length; S++) {
+					let B = { X: X + 50 * Zoom, Y: Y + (400 + (S * 100)) * Zoom, W: 400 * Zoom, H: 60 * Zoom };
+					GameMagicBattleButton.push(B);
+					DrawButton(B.X, B.Y, B.W, B.H, OnlineGameDictionaryText("Spell" + MagicBattleAvailSpell[S].toString() + "Name"), "White");
+				}
+			}
+		}
+	}
+
 }
diff --git a/BondageClub/Screens/Online/GameLARP/GameLARP.js b/BondageClub/Screens/Online/GameLARP/GameLARP.js
index 63647d3aa4..a9c0f878b9 100644
--- a/BondageClub/Screens/Online/GameLARP/GameLARP.js
+++ b/BondageClub/Screens/Online/GameLARP/GameLARP.js
@@ -36,6 +36,7 @@ var GameLARPTeamList = ["None", "Red", "Green", "Blue", "Yellow", "Cyan", "Purpl
 var GameLARPTimerDelay = [20, 60];
 var GameLARPEntryClass = "";
 var GameLARPEntryTeam = "";
+var GameLARPStatus = "";
 var GameLARPProgress = [];
 var GameLARPPlayer = [];
 var GameLARPOption = [];
@@ -50,40 +51,13 @@ var GameLARPTurnTimerDelay = GameLARPTimerDelay[0];
 var GameLARPTurnFocusCharacter = null;
 var GameLARPTurnFocusGroup = null;
 
-/**
- * Gets the current state of LARP.
- * @returns {OnlineGameStatus}
- */
-function GameLARPGetStatus() {
-	if (Player.Game && Player.Game.LARP && ["", "Running"].includes(Player.Game.LARP.Status))
-		return Player.Game.LARP.Status;
-	return "";
-}
-
-/**
- * Set the current state of LARP.
- * @param {OnlineGameStatus} s
- * @returns {void}
- */
-function GameLARPSetStatus(s) {
-	if (!["", "Running"].includes(s))
-		return;
-
-	if (Player.Game == null || Player.Game.LARP == null)
-		GameLARPLoad();
-
-	/* @ts-ignore */
-	Player.Game.LARP.Status = s;
-	ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
-}
-
 /**
  * Checks if the character is an admin or the LARP admin while the game is going.
  * @param {Character} C - Character to check for
  * @returns {boolean} -  Returns TRUE if that character is an admin/the game administrator
  */
 function GameLARPIsAdmin(C) {
-	if (GameLARPGetStatus() == "")
+	if (GameLARPStatus == "")
 		return (ChatRoomData.Admin.indexOf(C.MemberNumber) >= 0);
 	else
 		return (GameLARPTurnAdmin == C.MemberNumber);
@@ -108,18 +82,13 @@ function GameLARPDrawIcon(C, X, Y, Zoom) {
  */
 function GameLARPLoad() {
 	if (Player.Game == null) Player.Game = {};
-	let game = Player.Game.LARP;
-	Player.Game.LARP = {
-		Class: (game && typeof game.Class !== undefined ? game.Class : GameLARPClass[0].Name),
-		Team: (game && typeof game.Team !== undefined ? game.Team : GameLARPTeamList[0]),
-		TimerDelay: (game && typeof game.TimerDelay !== undefined ? game.TimerDelay : GameLARPTimerDelay[0]),
-		Status: "",
-		Level: (game && typeof game.Level != undefined ? game.Level : []),
-	};
-
+	if (Player.Game.LARP == null) Player.Game.LARP = {};
+	if (Player.Game.LARP.Class == null) Player.Game.LARP.Class = GameLARPClass[0].Name;
+	if (Player.Game.LARP.Team == null) Player.Game.LARP.Team = GameLARPTeamList[0];
+	if (Player.Game.LARP.TimerDelay == null) Player.Game.LARP.TimerDelay = GameLARPTimerDelay[0];
 	GameLARPEntryClass = Player.Game.LARP.Class;
 	GameLARPEntryTeam = Player.Game.LARP.Team;
-	if (GameLARPGetStatus() == "") GameLARPProgress = [];
+	if (GameLARPStatus == "") GameLARPProgress = [];
 }
 
 /**
@@ -134,15 +103,15 @@ function GameLARPRun() {
 	DrawText(TextGet("Title"), 550, 125, "Black", "Gray");
 	DrawText(TextGet("SelectClass"), 550, 225, "Black", "Gray");
 	DrawText(TextGet("SelectTeam"), 550, 425, "Black", "Gray");
-	if (GameLARPGetStatus() != "") DrawText(TextGet("Class" + Player.Game.LARP.Class), 900, 225, "Black", "Gray");
+	if (GameLARPStatus != "") DrawText(TextGet("Class" + Player.Game.LARP.Class), 900, 225, "Black", "Gray");
 	DrawText(TextGet("LevelProgress"), 550, 325, "Black", "Gray");
 	DrawText(GameLARPGetClassLevel(Player.Game.LARP) + " (" + Math.floor(GameLARPGetClassProgress(Player.Game.LARP) / 10).toString() + "%)", 900, 325, "Black", "Gray");
-	if (GameLARPGetStatus() != "") DrawText(TextGet("Color" + Player.Game.LARP.Team), 900, 425, "Black", "Gray");
-	DrawText(TextGet((GameLARPGetStatus() == "") ? "StartCondition" : "RunningGame"), 550, 525, "Black", "Gray");
+	if (GameLARPStatus != "") DrawText(TextGet("Color" + Player.Game.LARP.Team), 900, 425, "Black", "Gray");
+	DrawText(TextGet((GameLARPStatus == "") ? "StartCondition" : "RunningGame"), 550, 525, "Black", "Gray");
 	MainCanvas.textAlign = "center";
 	DrawButton(1815, 75, 90, 90, "", "White", "Icons/Exit.png");
-	if (GameLARPGetStatus() == "") DrawBackNextButton(900, 193, 400, 64, TextGet("Class" + Player.Game.LARP.Class), "White", "", () => "", () => "");
-	if (GameLARPGetStatus() == "") DrawBackNextButton(900, 393, 400, 64, TextGet("Color" + Player.Game.LARP.Team), "White", "", () => "", () => "");
+	if (GameLARPStatus == "") DrawBackNextButton(900, 193, 400, 64, TextGet("Class" + Player.Game.LARP.Class), "White", "", () => "", () => "");
+	if (GameLARPStatus == "") DrawBackNextButton(900, 393, 400, 64, TextGet("Color" + Player.Game.LARP.Team), "White", "", () => "", () => "");
 	GameLARPDrawIcon(Player, 1400, 225, 2);
 	if (GameLARPCanLaunchGame()) DrawBackNextButton(550, 600, 400, 65, TextGet("TimerDelay" + Player.Game.LARP.TimerDelay), "White", "", () => "", () => "");
 	if (GameLARPCanLaunchGame()) DrawButton(1050, 600, 400, 65, TextGet("StartGame"), "White");
@@ -156,13 +125,13 @@ function GameLARPRun() {
 function GameLARPRunProcess() {
 
 	// If the player is an admin, she can make player skip their turns
-	if ((GameLARPGetStatus() == "Running") && (TimerGetTime() > GameLARPTurnTimer) && GameLARPIsAdmin(Player)) {
+	if ((GameLARPStatus == "Running") && (TimerGetTime() > GameLARPTurnTimer) && GameLARPIsAdmin(Player)) {
 		GameLARPTurnTimer = TimerGetTime() + (GameLARPTurnTimerDelay * 1000);
 		ServerSend("ChatRoomGame", { GameProgress: "Skip" });
 	}
 
 	// Clears the focused character if it's not the player turn
-	if ((GameLARPTurnFocusCharacter != null) && ((GameLARPGetStatus() != "Running") || (GameLARPPlayer[GameLARPTurnPosition].ID != 0))) GameLARPTurnFocusCharacter = null;
+	if ((GameLARPTurnFocusCharacter != null) && ((GameLARPStatus != "Running") || (GameLARPPlayer[GameLARPTurnPosition].ID != 0))) GameLARPTurnFocusCharacter = null;
 
 	// If we must show the focused character and available abilities
 	if (GameLARPTurnFocusCharacter != null) {
@@ -312,7 +281,8 @@ function GameLARPStartProcess() {
 
 	// Changes the game status and exits
 	ServerSend("ChatRoomGame", { GameProgress: "Start" });
-	GameLARPSetStatus("Running");
+	Player.Game.LARP.Status = "Running";
+	ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
 	ChatRoomCharacterUpdate(Player);
 }
 
@@ -326,7 +296,7 @@ function GameLARPClick() {
 	if (MouseIn(1815, 75, 90, 90)) GameLARPExit();
 
 	// When the user selects a new class
-	if (MouseIn(900, 193, 400, 64) && (GameLARPGetStatus() == "")) {
+	if (MouseIn(900, 193, 400, 64) && (GameLARPStatus == "")) {
 		var Index = 0;
 		for (let I = 0; I < GameLARPClass.length; I++)
 			if (GameLARPClass[I].Name == Player.Game.LARP.Class)
@@ -337,7 +307,7 @@ function GameLARPClick() {
 	}
 
 	// When the user selects a new team
-	if (MouseIn(900, 393, 400, 64) && (GameLARPGetStatus() == "")) {
+	if (MouseIn(900, 393, 400, 64) && (GameLARPStatus == "")) {
 		if (MouseX <= 1100) Player.Game.LARP.Team = (GameLARPTeamList.indexOf(Player.Game.LARP.Team) <= 0) ? GameLARPTeamList[GameLARPTeamList.length - 1] : GameLARPTeamList[GameLARPTeamList.indexOf(Player.Game.LARP.Team) - 1];
 		else Player.Game.LARP.Team = (GameLARPTeamList.indexOf(Player.Game.LARP.Team) >= GameLARPTeamList.length - 1) ? GameLARPTeamList[0] : GameLARPTeamList[GameLARPTeamList.indexOf(Player.Game.LARP.Team) + 1];
 	}
@@ -378,7 +348,7 @@ function GameLARPClick() {
 function GameLARPExit() {
 
 	// When the game isn't running, we allow to change the class or team
-	if (GameLARPGetStatus() == "") {
+	if (GameLARPStatus == "") {
 
 		// Notices everyone in the room of the change, if there is any
 		if (GameLARPEntryClass != Player.Game.LARP.Class || GameLARPEntryTeam != Player.Game.LARP.Team) {
@@ -407,7 +377,7 @@ function GameLARPExit() {
 function GameLARPCanLaunchGame() {
 	if (Player.Game.LARP.Class == null || Player.Game.LARP.Class == "") return false;
 	if (Player.Game.LARP.Team == null || Player.Game.LARP.Team == "None") return false;
-	if (GameLARPGetStatus() != "") return false;
+	if (GameLARPStatus != "") return false;
 	if (!GameLARPIsAdmin(Player)) return false;
 	var Team = "";
 	for (let C = 0; C < ChatRoomCharacter.length; C++)
@@ -756,7 +726,7 @@ function GameLARPProcessAction(Action, ItemName, Source, Target, RNG) {
 function GameLARPCharacterClick(C) {
 
 	// If it's the player turn, we allow clicking on a character to get the abilities menu
-	if ((GameLARPGetStatus() == "Running") && (GameLARPPlayer[GameLARPTurnPosition].ID == 0) && (C.Game != null) && (C.Game.LARP != null) && (C.Game.LARP.Team != null) && (C.Game.LARP.Team != "") && (C.Game.LARP.Team != "None")) {
+	if ((GameLARPStatus == "Running") && (GameLARPPlayer[GameLARPTurnPosition].ID == 0) && (C.Game != null) && (C.Game.LARP != null) && (C.Game.LARP.Team != null) && (C.Game.LARP.Team != "") && (C.Game.LARP.Team != "None")) {
 		GameLARPTurnFocusCharacter = C;
 		GameLARPTurnFocusGroup = null;
 		GameLARPOption = GameLARPBuildOption(Player, GameLARPTurnFocusCharacter);
@@ -981,7 +951,7 @@ function GameLARPProcess(P) {
 
 		// The administrator can start the LARP game, he becomes the turn admin in the process
 		if ((ChatRoomData.Admin.indexOf(P.Sender) >= 0) && (P.Data.GameProgress == "Start")) {
-			GameLARPSetStatus("Running");
+			GameLARPStatus = "Running";
 			GameLARPTurnAdmin = P.Sender;
 			GameLARPTurnPosition = -1;
 			GameLARPTurnAscending = true;
@@ -995,13 +965,13 @@ function GameLARPProcess(P) {
 		}
 
 		// The turn administrator can skip turns after the delay has ran out
-		if ((GameLARPGetStatus() == "Running") && (GameLARPTurnAdmin == P.Sender) && (P.Data.GameProgress == "Skip")) {
+		if ((GameLARPStatus == "Running") && (GameLARPTurnAdmin == P.Sender) && (P.Data.GameProgress == "Skip")) {
 			GameLARPProgress.push({ Sender: P.Sender, Time: CurrentTime, RNG: P.RNG, Data: P.Data });
 			if (GameLARPContinue()) GameLARPNewTurn("TurnSkip");
 		}
 
 		// The current turn player can trigger an action
-		if ((GameLARPGetStatus() == "Running") && (GameLARPPlayer[GameLARPTurnPosition].MemberNumber == P.Sender) && (P.Data.GameProgress == "Action") && (P.Data.Action != null) && (P.Data.Target != null)) {
+		if ((GameLARPStatus == "Running") && (GameLARPPlayer[GameLARPTurnPosition].MemberNumber == P.Sender) && (P.Data.GameProgress == "Action") && (P.Data.Action != null) && (P.Data.Target != null)) {
 
 			// Before we process it, we make sure the action is valid by checking all possible options
 			var Source = GameLARPGetPlayer(P.Sender);
@@ -1027,40 +997,9 @@ function GameLARPProcess(P) {
  * @returns {void} - Nothing
  */
 function GameLARPReset() {
-	GameLARPSetStatus("");
-}
-
-/**
- * Ensure all character's MagicBattle game status are the same
- */
-function GameLARPLoadStatus() {
-	for (let C = 0; C < ChatRoomCharacter.length; C++)
-		if ((ChatRoomData.Admin.indexOf(ChatRoomCharacter[C].MemberNumber) >= 0) && (ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.LARP != null) && (ChatRoomCharacter[C].Game.LARP.Status != "")) {
-			GameLARPSetStatus(ChatRoomCharacter[C].Game.LARP.Status);
-			return;
-		}
-	GameLARPReset();
-}
-
-
-/**
- * Draws the online game images/text needed on the characters
- * @param {Character} C - Character to draw the info for
- * @param {number} X - Position of the character the X axis
- * @param {number} Y - Position of the character the Y axis
- * @param {number} Zoom - Amount of zoom the character has (Height)
- * @returns {void} - Nothing
- */
-function GameLARPDrawCharacter(C, X, Y, Zoom) {
-
-	// LARP draws the timer if needed and the icon linked to team and class
-	if ((CurrentModule == "Online") && (CurrentScreen == "ChatRoom")) {
-		GameLARPDrawIcon(C, X + 70 * Zoom, Y + 800 * Zoom, 0.6 * Zoom);
-		if ((GameLARPPlayer.length > 0) && (C.MemberNumber == GameLARPPlayer[GameLARPTurnPosition].MemberNumber) && (GameLARPGetStatus() == "Running") && (GameLARPTurnFocusCharacter == null)) {
-			MainCanvas.font = CommonGetFont(72);
-			var Time = Math.ceil((GameLARPTurnTimer - TimerGetTime()) / 1000);
-			DrawText(((Time < 0) || (Time > GameLARPTimerDelay[GameLARPTimerDelay.length - 1])) ? OnlineGameDictionaryText("TimerNA") : Time.toString(), X + 250 * Zoom, Y + 830 * Zoom, "Red", "Black");
-			MainCanvas.font = CommonGetFont(36);
-		}
+	GameLARPStatus = "";
+	if ((Player.Game != null) && (Player.Game.LARP != null) && (Player.Game.LARP.Status != null) && (Player.Game.LARP.Status != "")) {
+		Player.Game.LARP.Status = "";
+		ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
 	}
 }
diff --git a/BondageClub/Screens/Online/GameMagicBattle/GameMagicBattle.js b/BondageClub/Screens/Online/GameMagicBattle/GameMagicBattle.js
index b4e0718a94..aa860421d0 100644
--- a/BondageClub/Screens/Online/GameMagicBattle/GameMagicBattle.js
+++ b/BondageClub/Screens/Online/GameMagicBattle/GameMagicBattle.js
@@ -1,6 +1,7 @@
 "use strict";
 var GameMagicBattleBackground = "Sheet";
 var GameMagicBattleTimerDelay = 30;
+var GameMagicBattleStatus = "";
 var GameMagicBattlePlayer = [];
 var GameMagicBattleAction = "";
 var GameMagicBattleTurnAdmin = null;
@@ -10,33 +11,6 @@ var GameMagicBattleFocusCharacter = null;
 var GameMagicBattleLog = [];
 var GameMagicBattleButton = [];
 
-/**
- * Gets the current state of LARP.
- * @returns {OnlineGameStatus}
- */
-function GameMagicBattleGetStatus() {
-	if (Player.Game && Player.Game.MagicBattle && ["", "Running"].includes(Player.Game.MagicBattle.Status))
-		return Player.Game.MagicBattle.Status;
-	return "";
-}
-
-/**
- * Set the current state of LARP.
- * @param {OnlineGameStatus} s
- * @returns {void}
- */
-function GameMagicBattleSetStatus(s) {
-	if (!["", "Running"].includes(s))
-		return;
-
-	if (Player.Game == null || Player.Game.MagicBattle == null)
-		GameMagicBattleLoad();
-
-	// @ts-ignore
-	Player.Game.MagicBattle.Status = s;
-	ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
-}
-
 /**
  * Checks if the character is an admin while the game is going.
  * @param {Character} C - Character to check for
@@ -65,12 +39,9 @@ function GameMagicBattleDrawIcon(C, X, Y, Zoom) {
  */
 function GameMagicBattleLoad() {
 	if (Player.Game == null) Player.Game = {};
-	let game = Player.Game.MagicBattle;
-	Player.Game.MagicBattle = {
-		Status: "",
-		House: (game && typeof game.House !== undefined ? game.House : "NotPlaying"),
-		TeamType: (game && typeof game.TeamType !== undefined ? game.TeamType : "House"),
-	};
+	if (Player.Game.MagicBattle == null) Player.Game.MagicBattle = {};
+	if (Player.Game.MagicBattle.House == null) Player.Game.MagicBattle.House = "NotPlaying";
+	if (Player.Game.MagicBattle.TeamType != "FreeForAll") Player.Game.MagicBattle.TeamType = "House";
 }
 
 /**
@@ -80,19 +51,19 @@ function GameMagicBattleLoad() {
 function GameMagicBattleGetTeamType() {
 
 	// If the game is running, we return the setup from the game admin
-	if ((GameMagicBattleGetStatus() == "Running") && (GameMagicBattleTurnAdmin != null))
+	if ((GameMagicBattleStatus == "Running") && (GameMagicBattleTurnAdmin != null))
 		for (let C = 0; C < GameMagicBattlePlayer.length; C++)
 			if (GameMagicBattlePlayer[C].MemberNumber == GameMagicBattleTurnAdmin)
 				if ((GameMagicBattlePlayer[C].Game != null) && (GameMagicBattlePlayer[C].Game.MagicBattle != null) && (GameMagicBattlePlayer[C].Game.MagicBattle.TeamType != null))
 					return GameMagicBattlePlayer[C].Game.MagicBattle.TeamType;
 
 	// When the game isn't running, the player team type is returned if admin
-	if ((GameMagicBattleGetStatus() == "") && GameMagicBattleIsAdmin(Player))
+	if ((GameMagicBattleStatus == "") && GameMagicBattleIsAdmin(Player))
 		if ((Player.Game != null) && (Player.Game.MagicBattle != null) && (Player.Game.MagicBattle.TeamType != null))
 			return Player.Game.MagicBattle.TeamType;
 
 	// When the game isn't running, the first admin team type is returned
-	if ((GameMagicBattleGetStatus() == "") && !GameMagicBattleIsAdmin(Player))
+	if ((GameMagicBattleStatus == "") && !GameMagicBattleIsAdmin(Player))
 		for (let C = 0; C < ChatRoomCharacter.length; C++)
 			if (GameMagicBattleIsAdmin(ChatRoomCharacter[C]))
 				if ((ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.MagicBattle != null) && (ChatRoomCharacter[C].Game.MagicBattle.TeamType != null))
@@ -113,19 +84,19 @@ function GameMagicBattleRun() {
 	let TeamType = GameMagicBattleGetTeamType();
 	DrawCharacter(Player, 50, 50, 0.9);
 	DrawText(TextGet("Title"), 1200, 125, "Black", "Gray");
-	if (GameMagicBattleGetStatus() == "") DrawBackNextButton(900, 218, 600, 64, TextGet("PlayType" + Player.Game.MagicBattle.House), "White", "", () => "", () => "");
+	if (GameMagicBattleStatus == "") DrawBackNextButton(900, 218, 600, 64, TextGet("PlayType" + Player.Game.MagicBattle.House), "White", "", () => "", () => "");
 	else DrawText(TextGet("PlayType" + Player.Game.MagicBattle.House), 1200, 250, "Black", "Gray");
-	if ((GameMagicBattleGetStatus() == "") && GameMagicBattleIsAdmin(Player)) DrawBackNextButton(900, 343, 600, 64, TextGet("TeamType") + " " + TextGet(TeamType), "White", "", () => "", () => "");
+	if ((GameMagicBattleStatus == "") && GameMagicBattleIsAdmin(Player)) DrawBackNextButton(900, 343, 600, 64, TextGet("TeamType") + " " + TextGet(TeamType), "White", "", () => "", () => "");
 	else DrawText(TextGet("TeamType") + " " + TextGet(TeamType), 1200, 375, "Black", "Gray");
-	if (GameMagicBattleGetStatus() == "") DrawText(TextGet("StartCondition" + TeamType), 1200, 500, "Black", "Gray");
+	if (GameMagicBattleStatus == "") DrawText(TextGet("StartCondition" + TeamType), 1200, 500, "Black", "Gray");
 	else DrawText(TextGet("RunningGame"), 1200, 500, "Black", "Gray");
 	if (GameMagicBattleCanLaunchGame()) DrawButton(1000, 600, 400, 65, TextGet("StartGame"), "White");
-	if (GameMagicBattleIsAdmin(Player) && (GameMagicBattleGetStatus() != "")) DrawButton(1000, 600, 400, 65, TextGet("StopGame"), "White");
+	if (GameMagicBattleIsAdmin(Player) && (GameMagicBattleStatus != "")) DrawButton(1000, 600, 400, 65, TextGet("StopGame"), "White");
 	GameMagicBattleDrawIcon(Player, 600, 210, 2);
 
 	// Draw the right side buttons
 	DrawButton(1815, 75, 90, 90, "", "White", "Icons/Exit.png");
-	if ((GameMagicBattleGetStatus() == "") && (Player.Game.MagicBattle.House.indexOf("House") == 0) && Player.CanChange()) DrawButton(1815, 190, 90, 90, "", "White", "Icons/Wardrobe.png");
+	if ((GameMagicBattleStatus == "") && (Player.Game.MagicBattle.House.indexOf("House") == 0) && Player.CanChange()) DrawButton(1815, 190, 90, 90, "", "White", "Icons/Wardrobe.png");
 
 }
 
@@ -136,7 +107,7 @@ function GameMagicBattleRun() {
 function GameMagicBattleRunProcess() {
 
 	// If the player is the game admin, she sends the 30 seconds timer tick to everyone
-	if ((GameMagicBattleGetStatus() == "Running") && (TimerGetTime() > GameMagicBattleTurnTimer) && (Player.MemberNumber == GameMagicBattleTurnAdmin)) {
+	if ((GameMagicBattleStatus == "Running") && (TimerGetTime() > GameMagicBattleTurnTimer) && (Player.MemberNumber == GameMagicBattleTurnAdmin)) {
 		GameMagicBattleTurnTimer = TimerGetTime() + (GameMagicBattleTimerDelay * 1000);
 		ServerSend("ChatRoomGame", { GameProgress: "Next" });
 	}
@@ -167,7 +138,7 @@ function GameMagicBattleClickProcess() {
 
 /**
  * When the magic puzzle ends, we go back to the chat room
- * @returns {void}
+ * @returns {boolean} - Returns TRUE if the click was handled by this online click handler
  */
 function GameMagicBattlePuzzleEnd() {
 	ServerSend("ChatRoomGame", { GameProgress: "Action", Action: (MiniGameVictory ? "SpellSuccess" : "SpellFail"), Spell: MagicPuzzleSpell, Time: MagicPuzzleFinish - MagicPuzzleStart, Target: GameMagicBattleFocusCharacter.MemberNumber });
@@ -184,7 +155,8 @@ function GameMagicBattlePuzzleEnd() {
  */
 function GameMagicBattleStartProcess() {
 
-	// Gives a delay in seconds, based on the player preference
+	// Gives a delay in seconds, based on the player preference, returns to the chat screen
+	CommonSetScreen("Online", "ChatRoom");
 	GameMagicBattleTurnTimer = TimerGetTime() + (GameMagicBattleTimerDelay * 1000);
 
 	// Notices everyone in the room that the game starts
@@ -194,7 +166,9 @@ function GameMagicBattleStartProcess() {
 
 	// Changes the game status and exits
 	ServerSend("ChatRoomGame", { GameProgress: "Start" });
-	GameMagicBattleSetStatus("Running");
+	Player.Game.MagicBattle.Status = "Running";
+	ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
+
 }
 
 /**
@@ -204,18 +178,14 @@ function GameMagicBattleStartProcess() {
 function GameMagicBattleClick() {
 
 	// When the user exits or wants to change clothes
-	if (MouseIn(1815, 75, 90, 90)) {
-		GameMagicBattleExit();
-		return;
-	}
-	if (MouseIn(1815, 190, 90, 90) && (GameMagicBattleGetStatus() == "") && (Player.Game.MagicBattle.House.indexOf("House") == 0) && Player.CanChange()) {
+	if (MouseIn(1815, 75, 90, 90)) GameMagicBattleExit();
+	if (MouseIn(1815, 190, 90, 90) && (GameMagicBattleStatus == "") && (Player.Game.MagicBattle.House.indexOf("House") == 0) && Player.CanChange()) {
 		MagicSchoolLaboratoryPrepareNPC(Player, Player.Game.MagicBattle.House.replace("House", ""));
 		ChatRoomCharacterUpdate(Player);
-		return;
 	}
 
 	// When the user changes house/role
-	if (MouseIn(900, 218, 600, 64) && (GameMagicBattleGetStatus() == "")) {
+	if (MouseIn(900, 218, 600, 64) && (GameMagicBattleStatus == "")) {
 
 		// Back button
 		if (MouseX < 1200) {
@@ -238,26 +208,20 @@ function GameMagicBattleClick() {
 				else Player.Game.MagicBattle.House = "NotPlaying";
 			} else Player.Game.MagicBattle.House = (Player.Game.MagicBattle.House == "NotPlaying") ? "Independent" : "NotPlaying";
 		}
-		return;
+
 	}
 
 	// When the user selects a new team configuration, we update that player for everyone
-	if (MouseIn(900, 343, 600, 64) && (GameMagicBattleGetStatus() == "") && GameMagicBattleIsAdmin(Player)) {
+	if (MouseIn(900, 343, 600, 64) && (GameMagicBattleStatus == "") && GameMagicBattleIsAdmin(Player)) {
 		Player.Game.MagicBattle.TeamType = (Player.Game.MagicBattle.TeamType == "House") ? "FreeForAll" : "House";
 		ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
-		return;
 	}
 
 	// If the administrator wants to start the game or end the game
-	if (MouseIn(1000, 600, 400, 65) && GameMagicBattleCanLaunchGame()) {
-		CommonSetScreen("Online", "ChatRoom");
-		GameMagicBattleStartProcess();
-		return;
-	}
-	if (MouseIn(1000, 600, 400, 65) && GameMagicBattleIsAdmin(Player) && (GameMagicBattleGetStatus() != "")) {
+	if (MouseIn(1000, 600, 400, 65) && GameMagicBattleCanLaunchGame()) GameMagicBattleStartProcess();
+	if (MouseIn(1000, 600, 400, 65) && GameMagicBattleIsAdmin(Player) && (GameMagicBattleStatus != "")) {
 		CommonSetScreen("Online", "ChatRoom");
 		ServerSend("ChatRoomGame", { GameProgress: "Stop" });
-		return;
 	}
 
 }
@@ -269,7 +233,7 @@ function GameMagicBattleClick() {
 function GameMagicBattleExit() {
 
 	// When the game isn't running, we allow to change the class or team
-	if (GameMagicBattleGetStatus() == "") {
+	if (GameMagicBattleStatus == "") {
 		ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
 		ChatRoomCharacterUpdate(Player);
 	}
@@ -282,7 +246,7 @@ function GameMagicBattleExit() {
  * @returns {boolean} - Returns TRUE if the game can be launched
  */
 function GameMagicBattleCanLaunchGame() {
-	if (GameMagicBattleGetStatus() != "") return false;
+	if (GameMagicBattleStatus != "") return false;
 	if (!GameMagicBattleIsAdmin(Player)) return false;
 	if ((Player.Game.MagicBattle.TeamType != "House") && (Player.Game.MagicBattle.TeamType != "FreeForAll")) return false;
 	var House = "";
@@ -334,7 +298,7 @@ function GameMagicBattleCharacterClick(C) {
 	if (GameMagicBattleTurnDone || !Player.CanTalk()) return true;
 
 	// We allow clicking on a participating room member that's not gagged
-	if ((GameMagicBattleGetStatus() == "Running") && (C.Game != null) && (C.Game.MagicBattle != null) && (C.Game.MagicBattle.House != null) && (C.Game.MagicBattle.House != "NotPlaying") && C.CanTalk())
+	if ((GameMagicBattleStatus == "Running") && (C.Game != null) && (C.Game.MagicBattle != null) && (C.Game.MagicBattle.House != null) && (C.Game.MagicBattle.House != "NotPlaying") && C.CanTalk())
 		GameMagicBattleFocusCharacter = (C.MemberNumber == Player.MemberNumber) ? null : C;
 
 	// Cannot target a player from it's own house if playing in teams by houses
@@ -398,7 +362,7 @@ function GameMagicBattleBuildPlayerList() {
 
 /**
  * Calculates the turn winner and applies the consequences.
- * @returns {OnlineGameStatus}
+ * @returns {void} - Nothing
  */
 function GameMagicBattleCalculateTurnWinner() {
 
@@ -448,13 +412,13 @@ function GameMagicBattleCalculateTurnWinner() {
 	// If there's a winner, we announce it, if the player was representing a house, she can rain reputation
 	if (HouseCount <= 1) {
 		GameMagicBattleAddChatLog("GameOver", Player, Player, null, "#0000A0");
-		GameMagicBattleSetStatus("");
+		GameMagicBattleStatus = "";
 		if (Player.CanTalk() && (Player.Game != null) && (Player.Game.MagicBattle != null) && (Player.Game.MagicBattle.House != null) && (Player.Game.MagicBattle.House.indexOf("House") == 0))
 			DialogChangeReputation(Player.Game.MagicBattle.House, 3);
 	}
 
 	// Returns the game status for the next round
-	return GameMagicBattleGetStatus();
+	return GameMagicBattleStatus;
 }
 
 /**
@@ -467,7 +431,7 @@ function GameMagicBattleProcess(P) {
 
 		// An administrator can start the Magic Battle game, he becomes the turn admin in the process
 		if ((ChatRoomData.Admin.indexOf(P.Sender) >= 0) && (P.Data.GameProgress == "Start")) {
-			GameMagicBattleSetStatus("Running");
+			GameMagicBattleStatus = "Running";
 			GameMagicBattleTurnAdmin = P.Sender;
 			GameMagicBattleBuildPlayerList();
 			GameMagicBattleNewTurn("GameStart" + GameMagicBattleGetTeamType());
@@ -478,17 +442,19 @@ function GameMagicBattleProcess(P) {
 			let Source = GameMagicBattleGetPlayer(P.Sender);
 			if (Source != null) {
 				GameMagicBattleAddChatLog("GameStop", Source, Source, null, "#0000A0");
-				GameMagicBattleSetStatus("");
+				GameMagicBattleStatus = "";
+				Player.Game.MagicBattle.Status = "";
+				ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
 			}
 		}
 
 		// When the turn administrator sends the message to end the turn, we calculate the outcome
-		if ((GameMagicBattleGetStatus() == "Running") && (GameMagicBattleTurnAdmin == P.Sender) && (P.Data.GameProgress == "Next"))
+		if ((GameMagicBattleStatus == "Running") && (GameMagicBattleTurnAdmin == P.Sender) && (P.Data.GameProgress == "Next"))
 			if (GameMagicBattleCalculateTurnWinner() == "Running")
 				GameMagicBattleNewTurn("TurnNext");
 
 		// The current turn player can trigger an action, a spell cast by a user
-		if ((GameMagicBattleGetStatus() == "Running") && (P.Data.GameProgress == "Action") && (P.Data.Action != null) && (P.Data.Target != null)) {
+		if ((GameMagicBattleStatus == "Running") && (P.Data.GameProgress == "Action") && (P.Data.Action != null) && (P.Data.Target != null)) {
 
 			// Keep the data in the game log for that turn
 			GameMagicBattleLog.push({ Sender: P.Sender, Data: P.Data });
@@ -509,52 +475,9 @@ function GameMagicBattleProcess(P) {
  * @returns {void} - Nothing
  */
 function GameMagicBattleReset() {
-	GameMagicBattleSetStatus("");
-}
-
-/**
- * Ensure all character's MagicBattle game status are the same
- */
-function GameMagicBattleLoadStatus() {
-	for (let C = 0; C < ChatRoomCharacter.length; C++)
-		if ((ChatRoomData.Admin.indexOf(ChatRoomCharacter[C].MemberNumber) >= 0) && (ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.MagicBattle != null) && (ChatRoomCharacter[C].Game.MagicBattle.Status != "")) {
-			GameMagicBattleSetStatus(ChatRoomCharacter[C].Game.MagicBattle.Status);
-			return;
-		}
-	GameMagicBattleReset();
-}
-
-
-/**
- * Draws the online game images/text needed on the characters
- * @param {Character} C - Character to draw the info for
- * @param {number} X - Position of the character the X axis
- * @param {number} Y - Position of the character the Y axis
- * @param {number} Zoom - Amount of zoom the character has (Height)
- * @returns {void} - Nothing
- */
-function GameMagicBattleDrawCharacter(C, X, Y, Zoom) {
-	// Magic battle draws the timer and the spell buttons
-	if ((CurrentModule == "Online") && (CurrentScreen == "ChatRoom")) {
-		GameMagicBattleDrawIcon(C, X + 70 * Zoom, Y + 800 * Zoom, 0.6 * Zoom);
-		if (Player.CanTalk() && (GameMagicBattleGetStatus() == "Running")) {
-			if (C.MemberNumber == Player.MemberNumber) {
-				MainCanvas.font = CommonGetFont(72);
-				let Time = Math.ceil((GameMagicBattleTurnTimer - TimerGetTime()) / 1000);
-				let Color = "#00FF00";
-				if (Time <= 15) Color = "#FFFF00";
-				if (Time <= 6) Color = "#FF0000";
-				DrawText(((Time < 0) || (Time > GameMagicBattleTimerDelay)) ? OnlineGameDictionaryText("TimerNA") : Time.toString(), X + 250 * Zoom, Y + 830 * Zoom, Color, "Black");
-				MainCanvas.font = CommonGetFont(36);
-			}
-			if ((GameMagicBattleFocusCharacter != null) && (C.MemberNumber == GameMagicBattleFocusCharacter.MemberNumber) && (GameMagicBattleGetStatus() == "Running")) {
-				GameMagicBattleButton = [];
-				for (let S = 0; S < MagicBattleAvailSpell.length; S++) {
-					let B = { X: X + 50 * Zoom, Y: Y + (400 + (S * 100)) * Zoom, W: 400 * Zoom, H: 60 * Zoom };
-					GameMagicBattleButton.push(B);
-					DrawButton(B.X, B.Y, B.W, B.H, OnlineGameDictionaryText("Spell" + MagicBattleAvailSpell[S].toString() + "Name"), "White");
-				}
-			}
-		}
+	GameMagicBattleStatus = "";
+	if ((Player.Game != null) && (Player.Game.MagicBattle != null) && (Player.Game.MagicBattle.Status != null) && (Player.Game.MagicBattle.Status != "")) {
+		Player.Game.MagicBattle.Status = "";
+		ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
 	}
 }
diff --git a/BondageClub/Screens/Room/AsylumGGTS/AsylumGGTS.js b/BondageClub/Screens/Room/AsylumGGTS/AsylumGGTS.js
index 33a5d7725a..5b012dd55c 100644
--- a/BondageClub/Screens/Room/AsylumGGTS/AsylumGGTS.js
+++ b/BondageClub/Screens/Room/AsylumGGTS/AsylumGGTS.js
@@ -1195,43 +1195,3 @@ function AsylumGGTSAllowChange(C) {
 	}
 	return true;
 }
-
-/**
- * Draws the online game images/text needed on the characters
- * @param {Character} C - Character to draw the info for
- * @param {number} X - Position of the character the X axis
- * @param {number} Y - Position of the character the Y axis
- * @param {number} Zoom - Amount of zoom the character has (Height)
- * @returns {void} - Nothing
- */
-function AsylumGGTSDrawCharacter(C, X, Y, Zoom) {
-	// GGTS Draws the level, the number of strikes and a progress bar, level 6 shows the time in a gold frame
-	if ((CurrentModule == "Online") && (CurrentScreen == "ChatRoom") && (ChatRoomSpace === "Asylum")) {
-		let Level = AsylumGGTSGetLevel(C);
-		if ((Level > 0) && (C.Game != null) && (C.Game.GGTS != null)) {
-			if (C.Game.GGTS.Strike >= 1) DrawImageZoomCanvas("Screens/Room/AsylumGGTS/Strike" + C.Game.GGTS.Strike.toString() + ".png", MainCanvas, 0, 0, 100, 50, X + 50 * Zoom, Y + 800 * Zoom, 100 * Zoom, 50 * Zoom);
-			MainCanvas.font = CommonGetFont(Math.round(36 * Zoom));
-			let Progress = Math.floor(C.Game.GGTS.Time / AsylumGGTSLevelTime[Level] * 100);
-			if (C.Game.GGTS.Strike >= 3) Progress = 0;
-			if ((Level >= 6) || (Progress >= 100)) DrawEmptyRect(X + 50 * Zoom, Y + 860 * Zoom, 100 * Zoom, 40 * Zoom, "Black");
-			if (Level >= 6) DrawRect(X + 52 * Zoom, Y + 862 * Zoom, 96 * Zoom, 36 * Zoom, "#FFD700");
-			else if (Progress >= 100) DrawRect(X + 50 * Zoom, Y + 860 * Zoom, 100 * Zoom, 40 * Zoom, "White");
-			else DrawProgressBar(X + 50 * Zoom, Y + 860 * Zoom, 100 * Zoom, 40 * Zoom, Progress);
-			if (Level >= 6) DrawText(Math.floor(C.Game.GGTS.Time / 60000).toString(), X + 100 * Zoom, Y + 881 * Zoom, "Black", "White");
-			else if (Progress >= 50) DrawText(Level.toString(), X + 100 * Zoom, Y + 881 * Zoom, "Black", "White");
-			else DrawText(Level.toString(), X + 101 * Zoom, Y + 882 * Zoom, "White", "Black");
-			if (C.Game.GGTS.Rule != null)
-				for (let R = 0; R < C.Game.GGTS.Rule.length; R++)
-					DrawImageZoomCanvas("Screens/Room/AsylumGGTS/Rule" + C.Game.GGTS.Rule[R] + ".png", MainCanvas, 0, 0, 33, 33, X + 50 * Zoom + R * 33 * Zoom, Y + 902 * Zoom, 33 * Zoom, 33 * Zoom);
-			if ((C.ID == 0) && (AsylumGGTSTimer > 0) && (AsylumGGTSTimer > CommonTime()) && (C.Game.GGTS.Strike < 3)) {
-				let ForeColor = (AsylumGGTSTask == null) ? "Black" : "White";
-				let BackColor = (ForeColor == "White") ? "Black" : "White";
-				if ((BackColor == "Black") && (Math.round((AsylumGGTSTimer - CommonTime()) / 1000) <= 10)) BackColor = "Red";
-				DrawEmptyRect(X + 350 * Zoom, Y + 860 * Zoom, 100 * Zoom, 40 * Zoom, ForeColor, 2);
-				DrawRect(X + 352 * Zoom, Y + 862 * Zoom, 96 * Zoom, 36 * Zoom, BackColor);
-				DrawText(Math.round((AsylumGGTSTimer - CommonTime()) / 1000).toString(), X + 399 * Zoom, Y + 882 * Zoom, ForeColor, "Silver");
-			}
-			MainCanvas.font = CommonGetFont(36);
-		}
-	}
-}
diff --git a/BondageClub/Scripts/Typedef.d.ts b/BondageClub/Scripts/Typedef.d.ts
index bf5e1cdd21..6b66edb56b 100644
--- a/BondageClub/Scripts/Typedef.d.ts
+++ b/BondageClub/Scripts/Typedef.d.ts
@@ -696,11 +696,7 @@ interface Character {
 		GameVersion: string;
 		ItemsAffectExpressions: boolean;
 	};
-	Game?: {
-		LARP?: GameLARPParameters,
-		MagicBattle?: GameMagicBattleParameters,
-		GGTS?: GameGGTSParameters,
-	};
+	Game?: any;
 	BlackList: number[];
 	RunScripts?: boolean;
 	HasScriptedAssets?: boolean;
@@ -1501,42 +1497,3 @@ interface PokerPlayer {
 	WebLink?: string;
 	Alternate?: void;
 }
-
-// #region Online Games
-
-/**
- * Online game status values.
- *
- * @property "" - The game is in the setup phase.
- * @property "Running" - The game is currently running.
- *
- * @fix FIXME: "" should really be renamed Setup
- */
-type OnlineGameStatus = "" | "Running";
-
-interface GameLARPParameters {
-	Status: OnlineGameStatus;
-	Class: string;
-	Team: string;
-	TimerDelay: number;
-	Level: {
-		Name: string;
-		Level: number;
-		Progress: number;
-	}[];
-}
-
-interface GameMagicBattleParameters {
-	Status: OnlineGameStatus;
-	House: string;
-	TeamType: "FreeForAll" | "House";
-}
-
-interface GameGGTSParameters {
-	Level: number;
-	Time: number;
-	Strike: number;
-	Rule: string[];
-}
-
-// #endregion