diff --git a/BondageClub/Screens/Character/Player/Dialog_Player.csv b/BondageClub/Screens/Character/Player/Dialog_Player.csv
index 000a9de221d797eb49a9c31604033f5791097fbb..8114dbe05a7e19f2bfa614f75a9b53ff51b672a8 100644
--- a/BondageClub/Screens/Character/Player/Dialog_Player.csv
+++ b/BondageClub/Screens/Character/Player/Dialog_Player.csv
@@ -34,6 +34,8 @@ PlayerGagged,,,(You can use or remove items by selecting specific body regions o
 92,0,"(Yes, I want to be released.)",,DialogChatRoomSafewordRelease(),
 92,0,"(No, don't release me.)",(You can use or remove items by selecting specific body regions on yourself.),,
 0,,(Play Kinky Dungeon),,DialogStartKinkyDungeon(),DialogHasGamingHeadset()
+KinkyDungeonExit,,,"SourceCharacter quit a game of Kinky Dungeon at level KinkyDungeonLevel",,
+KinkyDungeonLose,,,"SourceCharacter met her defeat in Kinky Dungeon! She made it to level KinkyDungeonLevel before succumbing.",,
 SavedExpressionsSave,,,Save,,
 SavedExpressionsLoad,,,Load,,
 SavedExpressions,,,Save/Load Expressions,,
@@ -753,6 +755,7 @@ InteractiveVisorHeadTypeHeavyTint,,,Heavy Tint,,
 SelectVisorType,,,Select the type of visor,,
 InteractiveVRHeadsetHeadSetVirtual,,,SourceCharacter logs DestinationCharacter headset into the virtual world.,,
 InteractiveVRHeadsetHeadSetAR,,,SourceCharacter configures DestinationCharacter headset to display the surroundings through a camera feed.,,
+InteractiveVRHeadsetHeadSetGaming,,,SourceCharacter boots up Kinky Dungeon on DestinationCharacter headset.,,
 InteractiveVRHeadsetHeadSetOff,,,SourceCharacter turns off DestinationCharacter headset.,,
 InteractiveVRHeadsetHeadTypeVirtual,,,Virtual World,,
 InteractiveVRHeadsetHeadTypeGaming,,,Kinky Dungeon,,
diff --git a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeon.js b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeon.js
index 38dfaa8c8245325c8f80fbc90ec61d78bda75f90..d2fcceab250222c295dbe47706349c8c2fee3140 100644
--- a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeon.js
+++ b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeon.js
@@ -229,8 +229,22 @@ function KinkyDungeonClick() {
  * Handles exit during the kinky dungeon game
  * @returns {void} - Nothing
  */
-function KinkyDungeonExit() {
+function KinkyDungeonExit() {	
 	CommonDynamicFunction(MiniGameReturnFunction + "()");
+	
+	if (CurrentScreen == "ChatRoom" && KinkyDungeonState != "Menu" && (MiniGameKinkyDungeonLevel > 1 || KinkyDungeonState == "Lose")) {
+		let Message = "KinkyDungeonExit"
+		
+		if (KinkyDungeonState == "Lose") {
+			Message = "KinkyDungeonLose"
+		}
+		
+		let Dictionary = [
+			{ Tag: "SourceCharacter", Text: Player.Name, MemberNumber: Player.MemberNumber },
+			{ Tag: "KinkyDungeonLevel", Text: String(MiniGameKinkyDungeonLevel)},
+		];
+		ChatRoomPublishCustomAction(Message, false, Dictionary);
+	}
 }
 
 /**
diff --git a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonDraw.js b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonDraw.js
index 370b06022a41215a9df4b0291998ce696ca00f51..7a48df93d7a6e874bd94d522edc7ef6dbd80bec7 100644
--- a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonDraw.js
+++ b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonDraw.js
@@ -197,19 +197,19 @@ function KinkyDungeonDrawGame() {
 		if (KinkyDungeonSpells[KinkyDungeonSpellChoices[0]]) {
 			var spell = KinkyDungeonSpells[KinkyDungeonSpellChoices[0]]
 			DrawText(TextGet("KinkyDungeonSpell"+ spell.name), 1275, 835, color, "silver")
-			DrawText("(" + KinkyDungeonGetCost(spell.level) + ")", 1275, 870, color, "silver")
+			DrawText("(" + Math.ceil(KinkyDungeonGetCost(spell.level)) + ")", 1275, 870, color, "silver")
 			DrawButton(1230, 895, 90, 90, "", "White", "Screens/Minigame/KinkyDungeon/Spell1.png", "");
 		}
 		if (KinkyDungeonSpells[KinkyDungeonSpellChoices[1]]) {
 			var spell = KinkyDungeonSpells[KinkyDungeonSpellChoices[1]]
 			DrawText(TextGet("KinkyDungeonSpell"+ spell.name), 1525, 835, color, "silver")
-			DrawText("(" + KinkyDungeonGetCost(spell.level) + ")", 1525, 870, color, "silver")
+			DrawText("(" + Math.ceil(KinkyDungeonGetCost(spell.level)) + ")", 1525, 870, color, "silver")
 			DrawButton(1480, 895, 90, 90, "", "White", "Screens/Minigame/KinkyDungeon/Spell2.png", "");
 		}
 		if (KinkyDungeonSpells[KinkyDungeonSpellChoices[2]]) {
 			var spell = KinkyDungeonSpells[KinkyDungeonSpellChoices[2]]
 			DrawText(TextGet("KinkyDungeonSpell"+ spell.name), 1775, 835, color, "silver")
-			DrawText("(" + KinkyDungeonGetCost(spell.level) + ")", 1775, 870, color, "silver")
+			DrawText("(" + Math.ceil(KinkyDungeonGetCost(spell.level)) + ")", 1775, 870, color, "silver")
 			DrawButton(1730, 895, 90, 90, "", "White", "Screens/Minigame/KinkyDungeon/Spell3.png", "");
 		}
 	} else if (KinkyDungeonDrawState == "Magic") {
diff --git a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonEnemies.js b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonEnemies.js
index 23aa3da098d22b131d08b89ee9c8a9a6b7106fa9..a07a095e0c5c2d3d5ea4013663fd9e162051b4d8 100644
--- a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonEnemies.js
+++ b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonEnemies.js
@@ -121,7 +121,7 @@ function KinkyDungeonUpdateEnemies(delta) {
 							break;
 						}
 					}
-			} else if (AI == "guard") {
+			} else if (AI == "guard" && (enemy.Enemy.attackWhileMoving || playerDist > enemy.Enemy.attackRange + 0.5)) {
 				if (!enemy.gx) enemy.gx = enemy.x
 				if (!enemy.gy) enemy.gy = enemy.y
 				
@@ -152,7 +152,7 @@ function KinkyDungeonUpdateEnemies(delta) {
 			}
 			playerDist = Math.sqrt((enemy.x - KinkyDungeonPlayerEntity.x)*(enemy.x - KinkyDungeonPlayerEntity.x) + (enemy.y - KinkyDungeonPlayerEntity.y)*(enemy.y - KinkyDungeonPlayerEntity.y))
 			
-			if (!moved && enemy.Enemy.attack.includes("Melee") && playerDist < enemy.Enemy.attackRange + 0.5) {//Player is adjacent
+			if ((!moved || enemy.Enemy.attackWhileMoving) && enemy.Enemy.attack.includes("Melee") && playerDist < enemy.Enemy.attackRange + 0.5) {//Player is adjacent
 				idle = false;
 			
 				var dir = KinkyDungeonGetDirection(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y)
diff --git a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonMagic.js b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonMagic.js
index fbc71c66a0b04b2a7085beb027d8a049928cb230..49e3780753f83f622fe2e81841a39506cd4b93b8 100644
--- a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonMagic.js
+++ b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonMagic.js
@@ -30,7 +30,7 @@ var KinkyDungeonSpellChoices = [0, 1, 2]
 var KinkyDungeonSpellChoiceCount = 3
 var KinkyDungeonSpellList = { // List of spells you can unlock in the 3 books. When you plan to use a mystic seal, you get 3 spells to choose from. 
 	"Elements": [
-		{name: "Fireball", exhaustion: 6, components: ["Arms"], level:4, type:"bolt", projectile:true, onhit:"aoe", power: 6, delay: 0, range: 50, aoe: 1.5, size: 3, lifetime:1, damage: "fire", speed: 1}, // Throws a fireball in a direction that moves 1 square each turn
+		{name: "Fireball", exhaustion: 6, components: ["Arms"], level:4, type:"bolt", projectile:true, onhit:"aoe", power: 4, delay: 0, range: 50, aoe: 1.5, size: 3, lifetime:1, damage: "fire", speed: 1}, // Throws a fireball in a direction that moves 1 square each turn
 		{name: "Icebolt", exhaustion: 4, components: ["Arms"], level:2, type:"bolt", projectile:true, onhit:"", time: 2,  power: 2, delay: 0, range: 50, damage: "stun", speed: 2}, // Throws a blast of ice which stuns the target for 2 turns
 	],
 	"Conjure": [
diff --git a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonRestraints.js b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonRestraints.js
index 0e7b6cb0079ddbcf171f42a68a4640f730314cd6..bd256b75e1306716bcb5e9ce11ddfb6c5a84f9d9 100644
--- a/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonRestraints.js
+++ b/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonRestraints.js
@@ -37,7 +37,7 @@ var KinkyDungeonRestraints = [
 	{name: "WeakMagicRopeArms", Asset: "HempRope", Color: "#ff88AA", Group: "ItemArms", magic: false, power: 5, weight: 1, escapeChance: {"Struggle": 0.2, "Cut": 0.67, "Remove": 0.3}, enemyTags: {"ropeMagicWeak":2}, playerTags: {}, minLevel: 0, floors: []},
 	{name: "WeakMagicRopeLegs", Asset: "HempRope", Type: "FullBinding", Color: "#ff88AA", Group: "ItemLegs", magic: false, power: 3, weight: 1, escapeChance: {"Struggle": 0.2, "Cut": 0.67, "Remove": 0.3}, enemyTags: {"ropeMagicWeak":2}, playerTags: {}, minLevel: 0, floors: []},
 	
-	{name: "StickySlime", Asset: "Web", Type: "Tangled", Color: "#ff77ff", Group: "ItemArms", magic: false, power: 0, weight: 1, freeze: true, escapeChance: {"Struggle": 10.0, "Cut": 10.0, "Remove": 10.0}, enemyTags: {"slime":100}, playerTags: {}, minLevel: 0, floors: []},
+	{name: "StickySlime", Asset: "Web", Type: "Wrapped", Color: "#ff77ff", Group: "ItemArms", magic: false, power: 0, weight: 1, freeze: true, escapeChance: {"Struggle": 10.0, "Cut": 10.0, "Remove": 10.0}, enemyTags: {"slime":100}, playerTags: {}, minLevel: 0, floors: []},
 	
 	{name: "TrapArmbinder", Asset: "LeatherArmbinder", Type: "WrapStrap", Group: "ItemArms", magic: false, power: 8, weight: 2, escapeChance: {"Struggle": 0.1, "Cut": 0.33, "Remove": 0.2}, enemyTags: {"trap":100}, playerTags: {}, minLevel: 0, floors: []},
 	
diff --git a/BondageClub/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv b/BondageClub/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv
index 428ccd2bb5dcc94067eb4f2e044d56a6227e943b..33e55ce99d2d9f98d6b55aeb1ae04fad25389849 100644
--- a/BondageClub/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv
+++ b/BondageClub/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv
@@ -65,7 +65,7 @@ LootRubbleSmallGold,You find some gold coins in a corner (+XXX gold)
 LootRubbleKnife,You find a rusty knife among the rocks
 
 LootChestGold,The chest contains gold! (+XXX gold)
-LootChestSpell,The chest contains a magic scroll. (+SpellLearned)
+LootChestSpell,"You find a magic scroll, which you place in your spellbook. (+SpellLearned)"
 LootChestTrapMagic,A restraint appears on you with a puff of smoke. (+RestraintType)
 
 NameBlindZombie,Moaning Zombie
@@ -189,7 +189,7 @@ KinkyDungeonSpellDescriptionIcebolt,A quick shard of ice that does DamageDealt d
 KinkyDungeonSpellCastIcebolt,You a hurl a shard of ice!
 KinkyDungeonSpellTargetIcebolt,Choose aim direction
 KinkyDungeonSpellFireball,Fireball
-KinkyDungeonSpellDescriptionFireball,A slow moving ball of flame that explodes and does DamageDealt damage!
+KinkyDungeonSpellDescriptionFireball,A slow moving ball of flame that explodes for DamageDealt damage, double on a direct hit!
 KinkyDungeonSpellCastFireball,You a hurl a fireball!
 KinkyDungeonSpellTargetFireball,Choose aim direction
 KinkyDungeonSpellSnare,Rope Snare
diff --git a/BondageClub/Screens/Online/ChatRoom/ChatRoom.js b/BondageClub/Screens/Online/ChatRoom/ChatRoom.js
index 6cbbce0844537387d0c933a08da6986d88f38e1d..d3a94798be8d80165c879bfc3c1624b28daaa6b9 100644
--- a/BondageClub/Screens/Online/ChatRoom/ChatRoom.js
+++ b/BondageClub/Screens/Online/ChatRoom/ChatRoom.js
@@ -1587,7 +1587,7 @@ function ChatRoomPublishCustomAction(msg, LeaveDialog, Dictionary) {
 	if (CurrentScreen == "ChatRoom") {
 		ServerSend("ChatRoomChat", { Content: msg, Type: "Action", Dictionary: Dictionary });
 		var C = CharacterGetCurrent();
-		ChatRoomCharacterItemUpdate(C);
+		if (C) ChatRoomCharacterItemUpdate(C);
 		if (LeaveDialog && (C != null)) DialogLeave();
 	}
 }