Club Card - Online Play Configuration (WIP)

This commit is contained in:
BondageProjects 2023-07-21 18:13:37 -04:00
parent 7958fde01a
commit df80a09ed2
18 changed files with 305 additions and 14 deletions

Binary file not shown.

After

(image error) Size: 12 KiB

Binary file not shown.

After

(image error) Size: 8 KiB

Binary file not shown.

After

(image error) Size: 11 KiB

View file

@ -313,7 +313,11 @@ StandUpFail,,,SourceCharacter tries to stand up but loses PronounPossessive bala
HelpKneelDown,,,SourceCharacter helps TargetCharacter to kneel down,,
HelpStandUp,,,SourceCharacter helps TargetCharacter to stand up,,
ChangeClothes,,,SourceCharacter changes DestinationCharacter clothes.,,
ClubCardNewPlayerSlot0,,,SourceCharacter will not play Club Card.,,
ClubCardNewPlayerSlot1,,,SourceCharacter chose to be the first player.,,
ClubCardNewPlayerSlot2,,,SourceCharacter chose to be the second player.,,
LARPChangeTeamClass,,,SourceCharacter selects PronounPossessive team and class.,,
ClubCardGameStart,,,SourceCharacter has started the Club Card game.,,
LARPGameStart,,,SourceCharacter has started the LARP game.,,
MagicBattleGameStart,,,SourceCharacter has started the Magic Battle.,,
SafewordDisabled,,,"Your safeword is disabled, it cannot be used at the moment.",,

1 PlayerGagged (You can use or remove items by selecting specific body regions on yourself.)
313 HelpKneelDown SourceCharacter helps TargetCharacter to kneel down
314 HelpStandUp SourceCharacter helps TargetCharacter to stand up
315 ChangeClothes SourceCharacter changes DestinationCharacter clothes.
316 ClubCardNewPlayerSlot0 SourceCharacter will not play Club Card.
317 ClubCardNewPlayerSlot1 SourceCharacter chose to be the first player.
318 ClubCardNewPlayerSlot2 SourceCharacter chose to be the second player.
319 LARPChangeTeamClass SourceCharacter selects PronounPossessive team and class.
320 ClubCardGameStart SourceCharacter has started the Club Card game.
321 LARPGameStart SourceCharacter has started the LARP game.
322 MagicBattleGameStart SourceCharacter has started the Magic Battle.
323 SafewordDisabled Your safeword is disabled, it cannot be used at the moment.

View file

@ -21,6 +21,8 @@ var ClubCardLevelLimit = [0, 5, 8, 13, 20, 40];
var ClubCardLevelCost = [0, 0, 10, 20, 35, 50];
/** @type {ClubCardPlayer[]} */
var ClubCardPlayer = [];
var ClubCardPlayer1MemberNumber = -1;
var ClubCardPlayer2MemberNumber = -1;
/** @type {ClubCard[]} */
var ClubCardList = [
@ -1644,6 +1646,7 @@ function ClubCardEndTurn(Draw = false) {
ClubCardLogAdd(TextGet("VictoryFor" + CCPlayer.Control));
ClubCardCreatePopup("TEXT", TextGet("VictoryFor" + CCPlayer.Control), TextGet("Return"), null, "ClubCardEndGame()", null);
if (MiniGameVictory && (ClubCardReward != null)) ClubCardGetReward();
GameClubCardReset();
return;
}
@ -1965,6 +1968,7 @@ function ClubCardEndGame(Victory) {
if (Victory != null) MiniGameVictory = Victory;
ClubCardOpponentDeck = [];
MiniGameEnd();
GameClubCardReset();
}
function ClubCardTextGet(Text) {
@ -2032,6 +2036,8 @@ function ClubCardCommonLoad() {
*/
function ClubCardLoad() {
ClubCardCommonLoad();
ClubCardPlayer1MemberNumber = -1;
ClubCardPlayer2MemberNumber = -1;
ClubCardTurnCardPlayed = 0;
ClubCardLogText = "";
ClubCardFocus = null;
@ -2044,6 +2050,23 @@ function ClubCardLoad() {
ClubCardCreatePopup("DECK");
}
/**
* Changes the two players structure for online play
* @param {Number} P1 - The first player member number
* @param {number} P2 - The second player member number
* @param {number} RNG - The random RNG number generated by the server
* @returns {void} - Nothing
*/
function ClubCardLoadOnlinePlayers(P1, P2, RNG) {
ClubCardTurnIndex = Math.round(RNG * 2);
ClubCardPlayer1MemberNumber = P1;
ClubCardPlayer2MemberNumber = P2;
for (let C = 0; C < ChatRoomCharacter.length; C++) {
if (ChatRoomCharacter[C].MemberNumber === P1) ClubCardPlayer[0].Character = ChatRoomCharacter[C];
if (ChatRoomCharacter[C].MemberNumber === P2) ClubCardPlayer[1].Character = ChatRoomCharacter[C];
}
}
/**
* Draw the club card player hand on screen, show only sleeves if not controlled by player
* @param {Number} Value - The card to draw

View file

@ -8,7 +8,7 @@ var ChatAdminLocked = false;
/** @type {ChatRoomGame} */
var ChatAdminGame = "";
/** @type {ChatRoomGame[]} */
var ChatAdminGameList = ["", "LARP", "MagicBattle", "GGTS"];
var ChatAdminGameList = ["", "ClubCard", "LARP", "MagicBattle", "GGTS"];
/** @type {null | string} */
var ChatAdminBackgroundSelected = null;
/** @type {null | { Name: string, Language: ChatRoomLanguage, Description: string, Limit: string, AdminList: string, BanList: string, Private: boolean, Locked: boolean }} */

View file

@ -22,6 +22,7 @@ ResponseAccountError,"Account error, please try to relog"
ResponseInvalidRoomData,Invalid chat room data detected
BlockCategory,Block Categories
Game,No Game
GameClubCard,Club Card
GameLARP,LARP
GameMagicBattle,Magic Battle
GameGGTS,GGTS

1 RoomName Room Name
22 ResponseInvalidRoomData Invalid chat room data detected
23 BlockCategory Block Categories
24 Game No Game
25 GameClubCard Club Card
26 GameLARP LARP
27 GameMagicBattle Magic Battle
28 GameGGTS GGTS

View file

@ -9,7 +9,7 @@ var ChatCreateLocked = null;
/** @type {ChatRoomGame} */
var ChatCreateGame = "";
/** @type {ChatRoomGame[]} */
var ChatCreateGameList = ["", "LARP", "MagicBattle", "GGTS"];
var ChatCreateGameList = ["", "ClubCard", "LARP", "MagicBattle", "GGTS"];
var ChatCreateBackgroundIndex = 0;
var ChatCreateBackgroundSelect = "";
/** @type {null | string[]} */
@ -27,15 +27,10 @@ var ChatCreateLanguageList = ["EN", "DE", "FR", "ES", "CN", "RU"];
*/
function ChatCreateLoad() {
// Resets the LARP game status
if ((ChatRoomGame == "LARP") && (GameLARPGetStatus() != "")) {
GameLARPSetStatus("");
}
// Resets the Magic Battle game status
if ((ChatRoomGame == "MagicBattle") && (GameMagicBattleGetStatus() != "")) {
GameMagicBattleSetStatus("");
}
// Resets the online games status
if (GameLARPGetStatus() != "") GameLARPSetStatus("");
if (GameMagicBattleGetStatus() != "") GameMagicBattleSetStatus("");
if (GameClubCardGetStatus() != "") GameClubCardSetStatus("");
// If the current background isn't valid, we pick the first one
ChatCreateBackgroundIndex = ChatCreateBackgroundList.indexOf(ChatCreateBackgroundSelect);

View file

@ -27,6 +27,7 @@ AddLoverAdminList,Add Lovers
Background,Background
BlockCategory,Block Categories
Game,No Game
GameClubCard,Club Card
GameLARP,LARP
GameMagicBattle,Magic Battle
GameGGTS,GGTS

1 EnterRoomInfo Enter your room information
27 Background Background
28 BlockCategory Block Categories
29 Game No Game
30 GameClubCard Club Card
31 GameLARP LARP
32 GameMagicBattle Magic Battle
33 GameGGTS GGTS

View file

@ -4379,6 +4379,7 @@ function ChatRoomGameResponse(data) {
ChatRoomOnlineBountyHandleData(data.Data.OnlineBounty, data.Sender);
else if (ChatRoomGame == "LARP") GameLARPProcess(data);
else if (ChatRoomGame == "MagicBattle") GameMagicBattleProcess(data);
else if (ChatRoomGame == "ClubCard") GameClubCardProcess(data);
}
/**

View file

@ -50,6 +50,7 @@ Photos,Photographs
Arousal,Arousal Activities
Fantasy,Fantasy
GameLabel,Game:
GameClubCard,Club Card
GameLARP,LARP
GameMagicBattle,Magic Battle
GameGGTS,GGTS

1 NoChatRoomFound No chat room found. You can create a new one.
50 Arousal Arousal Activities
51 Fantasy Fantasy
52 GameLabel Game:
53 GameClubCard Club Card
54 GameLARP LARP
55 GameMagicBattle Magic Battle
56 GameGGTS GGTS

View file

@ -119,6 +119,7 @@ function OnlineGameAllowBlockItems() {
* @returns {void} - Nothing
*/
function OnlineGameLoadStatus() {
if (ChatRoomGame == "ClubCard") GameClubCardLoadStatus();
if (ChatRoomGame == "LARP") GameLARPLoadStatus();
if (ChatRoomGame == "MagicBattle") GameMagicBattleLoadStatus();
}
@ -128,6 +129,7 @@ function OnlineGameLoadStatus() {
* @returns {void} - Nothing
*/
function OnlineGameReset() {
if (ChatRoomGame != "ClubCard") GameClubCardReset();
if (ChatRoomGame != "LARP") GameLARPReset();
if (ChatRoomGame != "MagicBattle") GameMagicBattleReset();
if (ChatRoomGame == "GGTS") AsylumGGTSReset();
@ -155,6 +157,7 @@ function OnlineGameCharacterInChatRoom(MemberNumber) {
*/
function OnlineGameDrawCharacter(C, X, Y, Zoom) {
if (ChatRoomGame === "GGTS") AsylumGGTSDrawCharacter(C, X, Y, Zoom);
if (ChatRoomGame === "ClubCard") GameClubCardDrawCharacter(C, X, Y, Zoom);
if (ChatRoomGame === "LARP") GameLARPDrawCharacter(C, X, Y, Zoom);
if (ChatRoomGame === "MagicBattle") GameMagicBattleDrawCharacter(C, X, Y, Zoom);
}

View file

@ -0,0 +1,248 @@
"use strict";
var GameClubCardBackground = "Sheet";
var GameClubCardEntryPlayerSlot = 0;
/**
* Gets the current state of online Club Card.
* @returns {OnlineGameStatus}
*/
function GameClubCardGetStatus() {
if (Player.Game && Player.Game.ClubCard && ["", "Running"].includes(Player.Game.ClubCard.Status))
return Player.Game.ClubCard.Status;
return "";
}
/**
* Set the current state of online Club Card.
* @param {OnlineGameStatus} s
* @returns {void}
*/
function GameClubCardSetStatus(s) {
if (!["", "Running"].includes(s))
return;
if (Player.Game == null || Player.Game.ClubCard == null)
ClubCardCommonLoad();
/* @ts-ignore */
Player.Game.ClubCard.Status = s;
ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
}
/**
* Checks if the character is an admin for the room/game.
* @param {Character} C - Character to check for
* @returns {boolean} - Returns TRUE if that character is an admin/the game administrator
*/
function GameClubCardIsAdmin(C) {
return (ChatRoomData.Admin.indexOf(C.MemberNumber) >= 0);
}
/**
* Draws the Club Card icon of a character
* @param {Character} C - Character for which to draw the icons
* @param {number} X - Position on the X axis of the canvas
* @param {number} Y - Position on the Y axis of the canvas
* @param {number} Zoom - Zoom factor of the character
* @returns {void} - Nothing
*/
function GameClubCardDrawIcon(C, X, Y, Zoom) {
let Icon = 0;
if ((C != null) && (C.Game != null) && (C.Game.ClubCard != null) && ((C.Game.ClubCard.PlayerSlot === 1) || (C.Game.ClubCard.PlayerSlot === 2))) Icon = C.Game.ClubCard.PlayerSlot;
DrawImageZoomCanvas("Icons/ClubCard/PlayerSlot" + Icon.toString() + ".png", MainCanvas, 0, 0, 100, 100, X, Y, 100 * Zoom, 100 * Zoom);
}
/**
* 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 GameClubCardDrawCharacter(C, X, Y, Zoom) {
if ((CurrentModule == "Online") && (CurrentScreen == "ChatRoom")) {
GameClubCardDrawIcon(C, X + 70 * Zoom, Y + 800 * Zoom, Zoom);
}
}
/**
* Loads the online Club Card configuration screen.
* @returns {void} - Nothing
*/
function GameClubCardLoad() {
ClubCardCommonLoad();
if (Player.Game == null) Player.Game = {};
if (Player.Game.ClubCard.PlayerSlot == null) Player.Game.ClubCard.PlayerSlot = 0;
GameClubCardEntryPlayerSlot = Player.Game.ClubCard.PlayerSlot;
}
/**
* Runs the online Club Card configuration screen
* @returns {void} - Nothing
*/
function GameClubCardRun() {
DrawCharacter(Player, 50, 50, 0.9);
DrawText(TextGet("Title"), 1100, 150, "Black", "Gray");
DrawText(TextGet("SelectPlayerSlot"), 750, 300, "Black", "Gray");
DrawText(TextGet((GameClubCardGetStatus() == "") ? "StartCondition" : "RunningGame"), 1100, 450, "Black", "Gray");
DrawButton(1815, 75, 90, 90, "", "White", "Icons/Exit.png");
if (GameClubCardGetStatus() == "") DrawBackNextButton(1000, 268, 400, 64, TextGet("PlayerSlot" + Player.Game.ClubCard.PlayerSlot.toString()), "White", "", () => "", () => "");
else DrawText(TextGet("PlayerSlot" + Player.Game.ClubCard.PlayerSlot.toString()), 1200, 300, "Black", "Gray");
GameClubCardDrawIcon(Player, 1480, 210, 1.8);
if (GameClubCardCanLaunchGame()) DrawButton(900, 600, 400, 64, TextGet("StartGame"), "White");
}
/**
* Handles clicks in the online Club Card configuration screen
* @returns {void} - Nothing
*/
function GameClubCardClick() {
// When the user exits
if (MouseIn(1815, 75, 90, 90)) GameClubCardExit();
// When the user selects a new player slot
if (MouseIn(1000, 268, 200, 64) && (GameClubCardGetStatus() == "")) {
Player.Game.ClubCard.PlayerSlot--;
if (Player.Game.ClubCard.PlayerSlot < 0) Player.Game.ClubCard.PlayerSlot = 2;
}
if (MouseIn(1200, 268, 200, 64) && (GameClubCardGetStatus() == "")) {
Player.Game.ClubCard.PlayerSlot++;
if (Player.Game.ClubCard.PlayerSlot > 2) Player.Game.ClubCard.PlayerSlot = 0;
}
// If the administrator wants to start the game
if (MouseIn(900, 600, 400, 64) && GameClubCardCanLaunchGame()) {
// Updates the player data
ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
ChatRoomCharacterUpdate(Player);
// Notices everyone in the room that the game starts
const Dictionary = new DictionaryBuilder()
.sourceCharacter(Player)
.build();
Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber});
ServerSend("ChatRoomChat", { Content: "ClubCardGameStart", Type: "Action" , Dictionary: Dictionary});
// Sends the 1st and 2nd players in the packet
let P1 = -1;
let P2 = -1;
for (let C = 0; C < ChatRoomCharacter.length; C++) {
if ((ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.ClubCard != null) && (ChatRoomCharacter[C].Game.ClubCard.PlayerSlot === 1)) P1 = ChatRoomCharacter[C].MemberNumber;
if ((ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.ClubCard != null) && (ChatRoomCharacter[C].Game.ClubCard.PlayerSlot === 2)) P2 = ChatRoomCharacter[C].MemberNumber;
}
// Sends the start flag to everyone in the room
ServerSend("ChatRoomGame", { GameProgress: "Start", Player1: P1, Player2: P2 });
GameClubCardSetStatus("Running");
ChatRoomCharacterUpdate(Player);
CommonSetScreen("Online", "ChatRoom");
}
}
/**
* Triggered when the player exits the Club Card config screen.
* @returns {void} - Nothing
*/
function GameClubCardExit() {
// When the game isn't running, we allow to change the class or team
if (GameClubCardGetStatus() == "") {
// Notices everyone in the room of the change in the player slot
if (GameClubCardEntryPlayerSlot != Player.Game.ClubCard.PlayerSlot) {
const Dictionary = new DictionaryBuilder()
.sourceCharacter(Player)
.build();
ServerSend("ChatRoomChat", { Content: "ClubCardNewPlayerSlot" + Player.Game.ClubCard.PlayerSlot.toString(), Type: "Action", Dictionary: Dictionary });
}
// Updates the player and go back to the chat room
ServerAccountUpdate.QueueData({ Game: Player.Game }, true);
ChatRoomCharacterUpdate(Player);
}
// Returns to the chat screen
CommonSetScreen("Online", "ChatRoom");
}
/**
* Checks there's 1 player in slot 1 and slot 2 so we can start the game.
* @returns {boolean} - Returns TRUE if the game can be launched
*/
function GameClubCardCanLaunchGame() {
let P1Count = 0;
let P2Count = 0;
if (GameClubCardGetStatus() != "") return false;
if (!GameClubCardIsAdmin(Player)) return false;
for (let C = 0; C < ChatRoomCharacter.length; C++) {
if ((ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.ClubCard != null) && (ChatRoomCharacter[C].Game.ClubCard.PlayerSlot === 1)) P1Count++;
if ((ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.ClubCard != null) && (ChatRoomCharacter[C].Game.ClubCard.PlayerSlot === 2)) P2Count++;
}
return ((P1Count == 1) && (P2Count == 1));
}
/**
* Resets the online Club Card game so a new game might be started
* @returns {void} - Nothing
*/
function GameClubCardReset() {
GameClubCardSetStatus("");
}
/**
* Ensure all character's Club Card game status are the same
* @returns {void} - Nothing
*/
function GameClubCardLoadStatus() {
for (let C = 0; C < ChatRoomCharacter.length; C++)
if ((ChatRoomData.Admin.indexOf(ChatRoomCharacter[C].MemberNumber) >= 0) && (ChatRoomCharacter[C].Game != null) && (ChatRoomCharacter[C].Game.ClubCard != null) && (ChatRoomCharacter[C].Game.ClubCard.Status != "")) {
GameClubCardSetStatus(ChatRoomCharacter[C].Game.ClubCard.Status);
return;
}
GameClubCardReset();
}
/**
* Processes the club card game data received from the server
* @param {IChatRoomGameResponse} Packet - The data packet to process
* @returns {void} - Nothing
*/
function GameClubCardProcess(Packet) {
// Filters out invalid packets
if ((Packet == null) || (Packet.Data == null) || (Packet.Sender == null)) return;
// Finds the character that sent the packet
let Char = null;
for (let C = 0; C < ChatRoomCharacter.length; C++)
if (ChatRoomCharacter[C].MemberNumber == Packet.Sender)
Char = ChatRoomCharacter[C];
if (Char == null) return;
// If a room admin started the game
if ((Packet.Data.GameProgress === "Start") && GameClubCardIsAdmin(Char)) {
GameClubCardSetStatus("Running");
MiniGameStart("ClubCard", 0, "GameClubCardEnd");
ClubCardOpponent = Player;
ClubCardOpponentDeck = ClubCardBuilderDefaultDeck;
ClubCardLoadOnlinePlayers(Packet.Data.Player1, Packet.Data.Player2, Packet.RNG);
ElementRemove("InputChat");
ElementRemove("TextAreaChatLog");
}
}
/**
* When the game ends, we go back to the online chat room
* @returns {void} - Nothing
*/
function GameClubCardEnd() {
CommonSetScreen("Online", "ChatRoom");
}

View file

@ -0,0 +1,8 @@
Title,Online Club Card Configuration
SelectPlayerSlot,Your player slot:
PlayerSlot0,Not playing
PlayerSlot1,First player
PlayerSlot2,Second player
StartCondition,A room administrator can start the game when two players are selected.
RunningGame,"The Club Card game is running, you cannot change settings."
StartGame,Start the game
1 Title Online Club Card Configuration
2 SelectPlayerSlot Your player slot:
3 PlayerSlot0 Not playing
4 PlayerSlot1 First player
5 PlayerSlot2 Second player
6 StartCondition A room administrator can start the game when two players are selected.
7 RunningGame The Club Card game is running, you cannot change settings.
8 StartGame Start the game

View file

@ -1044,7 +1044,6 @@ function GameLARPLoadStatus() {
GameLARPReset();
}
/**
* Draws the online game images/text needed on the characters
* @param {Character} C - Character to draw the info for

View file

@ -525,7 +525,6 @@ function GameMagicBattleLoadStatus() {
GameMagicBattleReset();
}
/**
* Draws the online game images/text needed on the characters
* @param {Character} C - Character to draw the info for

View file

@ -464,6 +464,7 @@ interface IChatRoomGameResponse {
Data: {
KinkyDungeon: any;
OnlineBounty: any;
/* LARP */
GameProgress?: "Start" | "Stop" | "Next" | "Skip" | "Action";
Action?: undefined;
@ -473,6 +474,10 @@ interface IChatRoomGameResponse {
/* MagicBattle */
Spell?: string;
Time?: number; /* ms */
/* Club Card */
Player1?: number;
Player2?: number;
}
Sender: number;
RNG: number
@ -508,7 +513,7 @@ interface IChatRoomSyncArousalMessage {
type ChatRoomLovershipOption = "" | "CanOfferBeginWedding" | "CanBeginWedding";
type ChatRoomOwnershipOption = "" | "CanOfferEndTrial" | "CanOfferTrial" | "CanEndTrial";
type ChatRoomSpaceType = "X" | "" | "M" | "Asylum";
type ChatRoomGame = "" | "LARP" | "MagicBattle" | "GGTS";
type ChatRoomGame = "" | "ClubCard" | "LARP" | "MagicBattle" | "GGTS";
type ChatRoomBlockCategory = AssetCategory | "Leashing" | "Photos" | "Arousal";
type ChatRoomLanguage = "EN" | "DE" | "FR" | "ES" | "CN" | "RU";
@ -3155,6 +3160,8 @@ interface GamePokerParameters {
interface GameClubCardParameters {
Deck: string[];
Reward?: string;
Status?: OnlineGameStatus;
PlayerSlot?: number;
}
//#endregion

View file

@ -210,6 +210,7 @@
<script src="Screens/Online/ForbiddenWords/ForbiddenWords.js"></script>
<script src="Screens/Online/WheelFortuneCustomize/WheelFortuneCustomize.js"></script>
<script src="Screens/Online/Game/OnlineGame.js"></script>
<script src="Screens/Online/GameClubCard/GameClubCard.js"></script>
<script src="Screens/Online/GameLARP/GameLARP.js"></script>
<script src="Screens/Online/GameMagicBattle/GameMagicBattle.js"></script>
<script src="Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js"></script>