bondage-college-mirr/BondageClub/Screens/MiniGame/KinkyDungeon/KinkyDungeonMultiplayer.js
Ada18980 047e57a434
Fixed crash when spectating kinky dungeon
Should hopefully fix a crash when spectating kinky dungeon by preventing bad data from going through.
2021-12-08 23:12:15 -08:00

249 lines
8.7 KiB
JavaScript

"use strict";
/**
* Sends a multiplayer update, trimming off stuff that doesnt need to get sent yet
* @returns {void}
*/
function KinkyDungeonMultiplayerUpdate(Delay) {
if (KinkyDungeonIsPlayer() && ChatRoomCharacter && ChatRoomCharacter.length > 1 && DialogGamingPreviousRoom == "ChatRoom" && KinkyDungeonNextDataSendTime + Delay < CommonTime()) {
let MN = [];
for (let C = 0; C < ChatRoomCharacter.length; C++) {
let Char = ChatRoomCharacter[C];
if (KinkyDungeonStreamingPlayers.includes(Char.MemberNumber) && Char.ID != 0 && Char.Effect.includes("VR")) MN.push(Char.MemberNumber);
}
if (MN.length > 0) {
let data = KinkyDungeonPackData(KinkyDungeonGrid_Last != KinkyDungeonGrid, true, KinkyDungeonMultiplayerInventoryFlag, CommonTime() > KinkyDungeonNextDataSendStatsTime + KinkyDungeonNextDataSendStatsTimeDelay);
KinkyDungeonSendData(data);
}
KinkyDungeonNextDataSendTime = CommonTime();
if (CommonTime() > KinkyDungeonNextDataSendStatsTime + KinkyDungeonNextDataSendStatsTimeDelay) KinkyDungeonNextDataSendStatsTime = CommonTime();
KinkyDungeonGrid_Last = KinkyDungeonGrid;
KinkyDungeonMultiplayerInventoryFlag = false;
}
}
/**
* Converts a string into Kinky Game Data
* @returns {void}
*/
function KinkyDungeonUnpackData(KinkyData) {
if (CurrentScreen != "KinkyDungeon" || KinkyDungeonState != "Game" || !KinkyDungeonPlayerCharacter) return;
if (KinkyDungeonIsPlayer()) return; // Prevent griefing
let data = JSON.parse(LZString.decompressFromBase64(KinkyData));
if (!KinkyDungeonGameData) KinkyDungeonGameData = {};
if (!data) return;
if (data.enemies != null) {
KinkyDungeonGameData.enemies = data.enemies;
}
if (data.items != null) {
KinkyDungeonGameData.items = data.items;
}
if (data.bullets != null) {
KinkyDungeonGameData.bullets = data.bullets;
}
if (data.map != null) {
KinkyDungeonGameData.map = data.map;
}
if (data.inventory != null) {
KinkyDungeonGameData.inventory = data.inventory;
}
if (data.meta != null) {
KinkyDungeonGameData.meta = data.meta;
}
KinkyDungeonUpdateFromData();
KinkyDungeonNextDataLastTimeReceived = CommonTime();
}
function KinkyDungeonUpdateFromData() {
if (KinkyDungeonGameData.map == null ||
KinkyDungeonGameData.inventory == null ||
KinkyDungeonGameData.bullets == null ||
KinkyDungeonGameData.items == null ||
KinkyDungeonGameData.enemies == null) {
KinkyDungeonGameData = null; // We need the full data before rendering anything!
return false;
}
if (KinkyDungeonGameData.enemies) {
KinkyDungeonEntities = [];
let enemies = JSON.parse(KinkyDungeonGameData.enemies);
for (let N = 0; N < enemies.length; N++) {
let enemy = enemies[N].split('/');
let i = 1;
KinkyDungeonEntities.push({Enemy: {name: enemy[i++]}, stun: enemy[i++], x:enemy[i++], y:enemy[i++]}); // Push the enemy
}
}
if (KinkyDungeonGameData.inventory) {
KinkyDungeonInventory = [];
let inventory = JSON.parse(KinkyDungeonGameData.inventory);
CharacterReleaseTotal(KinkyDungeonPlayer);
for (let N = 0; N < inventory.length; N++) {
let item = inventory[N].split('/');
if (item.length > 1) {
let i = 1;
let restraint = KinkyDungeonGetRestraintByName(item[i++]);
KinkyDungeonAddRestraint(restraint, 0, true); // Add the item
let createdrestraint = KinkyDungeonGetRestraintItem(restraint.Group);
if (createdrestraint)
createdrestraint.lock = ""; // Lock if applicable
}
}
KinkyDungeonUpdateStats(0);
KinkyDungeonDressPlayer();
}
if (KinkyDungeonGameData.bullets) {
KinkyDungeonBullets = [];
let bullets = JSON.parse(KinkyDungeonGameData.bullets);
for (let N = 0; N < bullets.length; N++) {
let bullet = bullets[N].split('/');
let i = 1;
let name = bullet[i++];
KinkyDungeonBullets.push({spriteID:name + CommonTime(), x:bullet[i], xx:bullet[i++], y:bullet[i], yy:bullet[i++], vx:bullet[i++], vy:bullet[i++],
bullet:{name: name, width:bullet[i++], height:bullet[i++]}});
}
}
if (KinkyDungeonGameData.items) {
KinkyDungeonGroundItems = [];
let items = JSON.parse(KinkyDungeonGameData.items);
for (let N = 0; N < items.length; N++) {
let item = items[N].split('/');
let i = 1;
KinkyDungeonGroundItems.push({name:item[i++], x:item[i++], y:item[i++]});
}
}
if (KinkyDungeonGameData.map)
KinkyDungeonGrid = KinkyDungeonGameData.map;
if (KinkyDungeonGameData.meta) {
KinkyDungeonUpdateLightGrid = true;
KinkyDungeonGridWidth = Math.round(KinkyDungeonGameData.meta.w);
KinkyDungeonGridHeight = Math.round(KinkyDungeonGameData.meta.h);
KinkyDungeonPlayerEntity.x = Math.round(KinkyDungeonGameData.meta.x);
KinkyDungeonPlayerEntity.y = Math.round(KinkyDungeonGameData.meta.y);
if (KinkyDungeonGameData.meta.wp != null) KinkyDungeonStatWillpower = Math.round(KinkyDungeonGameData.meta.wp);
if (KinkyDungeonGameData.meta.sp != null) KinkyDungeonStatStamina = Math.round(KinkyDungeonGameData.meta.sp);
if (KinkyDungeonGameData.meta.mp != null) KinkyDungeonStatStaminaMana = Math.round(KinkyDungeonGameData.meta.mp);
if (KinkyDungeonGameData.meta.ap != null) KinkyDungeonStatArousal = Math.round(KinkyDungeonGameData.meta.ap);
if (KinkyDungeonGameData.meta.rk != null) KinkyDungeonRedKeys = Math.round(KinkyDungeonGameData.meta.rk);
if (KinkyDungeonGameData.meta.gk != null) KinkyDungeonGreenKeys = Math.round(KinkyDungeonGameData.meta.gk);
if (KinkyDungeonGameData.meta.bk != null) KinkyDungeonBlueKeys = Math.round(KinkyDungeonGameData.meta.bk);
if (KinkyDungeonGameData.meta.bl != null) KinkyDungeonNormalBlades = Math.round(KinkyDungeonGameData.meta.bl);
if (KinkyDungeonGameData.meta.eb != null) KinkyDungeonEnchantedBlades = Math.round(KinkyDungeonGameData.meta.eb);
if (KinkyDungeonGameData.meta.lp != null) KinkyDungeonLockpicks = Math.round(KinkyDungeonGameData.meta.lp);
if (KinkyDungeonGameData.meta.gp != null) KinkyDungeonGold = Math.round(KinkyDungeonGameData.meta.gp);
if (KinkyDungeonGameData.meta.lv != null) {
MiniGameKinkyDungeonLevel = Math.round(KinkyDungeonGameData.meta.lv);
KinkyDungeonSetCheckPoint();
}
}
}
/**
* Turns the game state into a string that can be sent over
* @returns {string} - String containing game data
*/
function KinkyDungeonPackData(IncludeMap, IncludeItems, IncludeInventory, IncludeStats) {
let enemies = JSON.stringify(KinkyDungeonEntities, (key, value) => {
if (CommonIsNumeric(key) && typeof value === "object") {
if (value.Enemy) {
return "E/" + value.Enemy.name + "/" + (value.stun ? value.stun : 0) + "/"+value.x+"/"+value.y;
}
}
return value;
});
let items = IncludeItems ? JSON.stringify(KinkyDungeonGroundItems, (key, value) => {
if (CommonIsNumeric(key) && typeof value === "object") {
if (value.name) {
return "G/" + value.name + "/"+value.x+"/"+value.y;
}
}
return value;
}) : "";
let bullets = JSON.stringify(KinkyDungeonBullets, (key, value) => {
if (CommonIsNumeric(key) && typeof value === "object") {
if (value.bullet) {
return "B/" + value.bullet.name + "/"+value.x+"/"+value.y + "/"+(Math.round(value.vx*10)/10)+"/"+(Math.round(value.vy*10)/10 + "/"+value.bullet.width + "/"+value.bullet.height);
}
}
return "";
});
let map = IncludeMap ? KinkyDungeonGrid : "";
let inventory = IncludeInventory ? JSON.stringify(KinkyDungeonInventory, (key, value) => {
if (CommonIsNumeric(key) && typeof value === "object") {
if (value.restraint) {
return "I/" + value.restraint.name + "/l" + value.lock;
}
}
return "";
}) : "";
let meta = {w: KinkyDungeonGridWidth, h: KinkyDungeonGridHeight, x:KinkyDungeonPlayerEntity.x, y:KinkyDungeonPlayerEntity.y,};
if (IncludeStats) {
meta.wp = Math.round(KinkyDungeonStatWillpower);
meta.sp = Math.round(KinkyDungeonStatStamina);
meta.mp = Math.round(KinkyDungeonStatStaminaMana);
meta.ap = Math.round(KinkyDungeonStatArousal);
meta.rk = KinkyDungeonRedKeys;
meta.gk = KinkyDungeonGreenKeys;
meta.bk = KinkyDungeonBlueKeys;
meta.bl = KinkyDungeonNormalBlades;
meta.eb = KinkyDungeonEnchantedBlades;
meta.lp = KinkyDungeonLockpicks;
meta.gp = KinkyDungeonGold;
meta.lv = MiniGameKinkyDungeonLevel;
}
let result = {
enemies: enemies,
items: items,
bullets: bullets,
map: map,
inventory: inventory,
meta: meta,
};
let stringToSend = LZString.compressToBase64(JSON.stringify(result));// The replace is needed to avoid artifacts during decompression
return stringToSend;
}
/**
* Sends kinky dungeon data to the target member
* @returns {void}
*/
function KinkyDungeonSendData(data) {
ServerSend("ChatRoomGame", { KinkyDungeon: data });
}
/**
* Handles kinky dungeon data after receiving it from another player
* @returns {void}
*/
function KinkyDungeonHandleData(data, SourceMemberNumber) {
if (CurrentScreen == "KinkyDungeon" && SourceMemberNumber == KinkyDungeonPlayerCharacter.MemberNumber)
KinkyDungeonUnpackData(data); // Unpack the rest of the data
}