{ "version": 3, "sources": ["../../../../server/chat-plugins/rock-paper-scissors.tsx"], "sourcesContent": ["/**\r\n * Rock Paper Scissors plugin by Mia\r\n * @author mia-pi-git\r\n */\r\nconst MAX_ROUNDS = 200;\r\nconst TIMEOUT = 10 * 1000;\r\nconst ICONS: {[k: string]: Chat.VNode} = {\r\n\tRock: ,\r\n\tPaper: ,\r\n\tScissors: ,\r\n};\r\n\r\nconst MATCHUPS = new Map([\r\n\t['Scissors', 'Paper'],\r\n\t['Rock', 'Scissors'],\r\n\t['Paper', 'Rock'],\r\n]);\r\n\r\nfunction toChoice(str: string) {\r\n\tconst id = toID(str);\r\n\treturn id.charAt(0).toUpperCase() + id.slice(1);\r\n}\r\n\r\nexport class RPSPlayer extends Rooms.RoomGamePlayer {\r\n\tchoice = '';\r\n\tprevChoice = '';\r\n\tprevWinner = false;\r\n\tscore = 0;\r\n\tsendControls(jsx: Chat.VNode) {\r\n\t\tthis.sendRoom(Chat.html`|controlshtml|${jsx}`);\r\n\t}\r\n}\r\n\r\nexport class RPSGame extends Rooms.RoomGame {\r\n\tcurrentRound: number;\r\n\treadonly checkChat = true;\r\n\troundTimer: NodeJS.Timeout | null = null;\r\n\tconstructor(room: Room) {\r\n\t\tsuper(room);\r\n\t\tthis.currentRound = 0;\r\n\t\tthis.title = 'Rock Paper Scissors';\r\n\t\tthis.gameid = 'rockpaperscissors' as ID;\r\n\r\n\t\tthis.room.update();\r\n\t\tthis.controls(
Waiting for another player to join....
);\r\n\t\tthis.sendField();\r\n\t}\r\n\tcontrols(node: Chat.VNode) {\r\n\t\tthis.room.send(Chat.html`|controlshtml|${node}`);\r\n\t}\r\n\tonConnect(user: User, connection: Connection) {\r\n\t\tthis.room.sendUser(connection, Chat.html`|fieldhtml|${this.getField()}`);\r\n\t}\r\n\tstatic getWinner(p1: RPSPlayer, p2: RPSPlayer) {\r\n\t\tconst p1Choice = p1.choice;\r\n\t\tconst p2Choice = p2.choice;\r\n\t\tif (!p1Choice && p2Choice) return p2;\r\n\t\tif (!p2Choice && p1Choice) return p1;\r\n\t\tif (MATCHUPS.get(p1Choice) === p2Choice) return p1;\r\n\t\tif (MATCHUPS.get(p2Choice) === p1Choice) return p2;\r\n\t\treturn null;\r\n\t}\r\n\tsendControls(player: RPSPlayer) {\r\n\t\tif (!this.roundTimer) {\r\n\t\t\treturn player.sendControls(
\r\n\t\t\t\tThe game is paused.

\r\n\t\t\t\t\r\n\t\t\t
);\r\n\t\t}\r\n\t\tif (player.choice) {\r\n\t\t\tplayer.sendControls(\r\n\t\t\t\t
You have selected {player.choice}. Now to wait for your foe.
\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tplayer.sendControls(
\r\n\t\t\tMake your choice, quick! You have {Chat.toDurationString(TIMEOUT)}!
\r\n\t\t\t{['Rock', 'Paper', 'Scissors'].map(choice => (\r\n\t\t\t\t\r\n\t\t\t))}

\r\n\t\t\t
\r\n\t\t\t\r\n\t\t
);\r\n\t}\r\n\tgetField() {\r\n\t\tif (this.players.length < 2) {\r\n\t\t\treturn

Waiting to start the game...

;\r\n\t\t}\r\n\r\n\t\tconst [p1, p2] = this.players;\r\n\r\n\t\tfunction renderBigChoice(choice: string, isWinner?: boolean) {\r\n\t\t\treturn
\r\n\t\t\t\t{ICONS[choice] || '\\u00A0'}
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{choice || '\\u00A0'}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t
;\r\n\t\t}\r\n\r\n\t\tfunction renderCurrentChoice(exists?: boolean) {\r\n\t\t\treturn
{exists ? : '\\u00A0'}
;\r\n\t\t}\r\n\r\n\t\treturn \r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t
\r\n\t\t\t\t
{p1.name} ({p1.score})
\r\n\t\t\t\t{renderBigChoice(p1.prevChoice, p1.prevWinner)}\r\n\t\t\t\t{renderCurrentChoice(!!p1.choice)}\r\n\t\t\t
\r\n\t\t\t\tvs\r\n\t\t\t\r\n\t\t\t\t
{p2.name} ({p2.score})
\r\n\t\t\t\t{renderBigChoice(p2.prevChoice, p2.prevWinner)}\r\n\t\t\t\t{renderCurrentChoice(!!p2.choice)}\r\n\t\t\t
;\r\n\t}\r\n\tsendField() {\r\n\t\tthis.room.send(Chat.html`|fieldhtml|${this.getField()}`);\r\n\t}\r\n\tend() {\r\n\t\tconst [p1, p2] = this.players;\r\n\t\tif (p1.score === p2.score) {\r\n\t\t\tthis.message(`**Tie** at score ${p1.score}!`);\r\n\t\t} else {\r\n\t\t\tconst [winner, loser] = p1.score > p2.score ? [p1, p2] : [p2, p1];\r\n\t\t\tthis.message(`**${winner.name}** wins with score ${winner.score} to ${loser.score}!`);\r\n\t\t}\r\n\r\n\t\tif (this.roundTimer) {\r\n\t\t\tclearTimeout(this.roundTimer);\r\n\t\t\tthis.roundTimer = null;\r\n\t\t}\r\n\r\n\t\tthis.room.pokeExpireTimer();\r\n\t\tthis.ended = true;\r\n\t\tthis.room.add(`|-message|The game has ended.`); // for the benefit of those in the room\r\n\t\tfor (const player of this.players) {\r\n\t\t\tplayer.sendControls(
The game has ended.
);\r\n\t\t\tplayer.unlinkUser();\r\n\t\t}\r\n\t}\r\n\trunMatch() {\r\n\t\tconst [p1, p2] = this.players;\r\n\t\tconst winner = RPSGame.getWinner(p1, p2);\r\n\t\tif (!winner) { // tie\r\n\t\t\tif (!p1.choice) {\r\n\t\t\t\tthis.message(`${p1.name} and ${p2.name} both **timed out**.`);\r\n\t\t\t} else {\r\n\t\t\t\tthis.message(`${p1.name} and ${p2.name} **tie** with ${p1.choice}.`);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconst loser = p1 === winner ? p2 : p1;\r\n\t\t\tif (!loser.choice) {\r\n\t\t\t\tthis.message(`**${winner.name}**'s ${winner.choice} wins; ${loser.name} timed out.`);\r\n\t\t\t} else {\r\n\t\t\t\tthis.message(`**${winner.name}**'s ${winner.choice} beats ${loser.name}'s ${loser.choice}.`);\r\n\t\t\t}\r\n\t\t\twinner.score++;\r\n\t\t}\r\n\r\n\t\tif (!winner && !p1.choice) {\r\n\t\t\tthis.pause();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this.currentRound >= MAX_ROUNDS) {\r\n\t\t\tthis.message(`The game is ending automatically at ${this.currentRound} rounds.`);\r\n\t\t\treturn this.end();\r\n\t\t}\r\n\r\n\t\tfor (const player of this.players) {\r\n\t\t\tplayer.prevChoice = player.choice;\r\n\t\t\tplayer.prevWinner = false;\r\n\t\t\tplayer.choice = '';\r\n\t\t}\r\n\t\tif (winner) winner.prevWinner = true;\r\n\r\n\t\tthis.sendField();\r\n\t\tthis.nextRound();\r\n\t}\r\n\tsmallMessage(message: string) {\r\n\t\tthis.room.add(`|-message|${message}`).update();\r\n\t}\r\n\tmessage(message: string) {\r\n\t\tthis.room.add(`|message|${message}`).update();\r\n\t}\r\n\tstart() {\r\n\t\tif (this.players.length < 2) {\r\n\t\t\tthrow new Chat.ErrorMessage(`There are not enough players to start. Use /rps start to start when all players are ready.`);\r\n\t\t}\r\n\t\tif (this.room.log.log.length > 1000) {\r\n\t\t\t// prevent logs from ballooning too much\r\n\t\t\tthis.room.log.log = [];\r\n\t\t}\r\n\t\tconst [p1, p2] = this.players;\r\n\t\tthis.room.add(\r\n\t\t\t`|raw|

Rock Paper Scissors: ${p1.name} vs ${p2.name}!

\\n` +\r\n\t\t\t`|message|Game started!\\n` +\r\n\t\t\t`|notify|Game started!`\r\n\t\t).update();\r\n\t\tthis.nextRound();\r\n\t}\r\n\tgetPlayer(user: User) {\r\n\t\tconst player = this.playerTable[user.id];\r\n\t\tif (!player) throw new Chat.ErrorMessage(`You are not a player in this game.`);\r\n\t\treturn player;\r\n\t}\r\n\tpause(user?: User) {\r\n\t\tif (!this.roundTimer) throw new Chat.ErrorMessage(`The game is not running, and cannot be paused.`);\r\n\r\n\t\tconst player = user ? this.getPlayer(user) : null;\r\n\t\tclearTimeout(this.roundTimer);\r\n\t\tthis.roundTimer = null;\r\n\t\tfor (const curPlayer of this.players) this.sendControls(curPlayer);\r\n\t\tif (player) this.message(`The game was paused by ${player.name}.`);\r\n\t}\r\n\tunpause(user: User) {\r\n\t\tif (this.roundTimer) throw new Chat.ErrorMessage(`The game is not paused.`);\r\n\r\n\t\tconst player = this.getPlayer(user);\r\n\t\tthis.message(`The game was resumed by ${player.name}.`);\r\n\t\tthis.nextRound();\r\n\t}\r\n\tnextRound() {\r\n\t\tthis.currentRound++;\r\n\t\tthis.sendField();\r\n\t\tthis.room.add(`|html|

Round ${this.currentRound}

`).update();\r\n\t\tthis.roundTimer = setTimeout(() => {\r\n\t\t\tthis.runMatch();\r\n\t\t}, TIMEOUT);\r\n\t\tfor (const player of this.players) this.sendControls(player);\r\n\t}\r\n\tchoose(user: User, option: string) {\r\n\t\toption = toChoice(option);\r\n\t\tconst player = this.getPlayer(user);\r\n\t\tif (!MATCHUPS.get(option)) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Invalid choice: ${option}.`);\r\n\t\t}\r\n\t\tif (player.choice) throw new Chat.ErrorMessage(\"You have already made your choice!\");\r\n\t\tplayer.choice = option;\r\n\t\tthis.smallMessage(`${user.name} made a choice.`);\r\n\t\tthis.sendControls(player);\r\n\t\tif (this.players.filter(item => item.choice).length > 1) {\r\n\t\t\tclearTimeout(this.roundTimer!);\r\n\t\t\tthis.roundTimer = null;\r\n\t\t\treturn this.runMatch();\r\n\t\t}\r\n\t\tthis.sendField();\r\n\t\treturn true;\r\n\t}\r\n\tleaveGame(user: User) {\r\n\t\tconst player = this.getPlayer(user);\r\n\t\tplayer.sendRoom(`You left the game.`);\r\n\t\tdelete this.playerTable[user.id];\r\n\t\tthis.end();\r\n\t}\r\n\taddPlayer(user: User) {\r\n\t\tif (this.playerTable[user.id]) throw new Chat.ErrorMessage(`You are already a player in this game.`);\r\n\t\tthis.playerTable[user.id] = this.makePlayer(user);\r\n\t\tthis.players.push(this.playerTable[user.id]);\r\n\t\tthis.room.auth.set(user.id, Users.PLAYER_SYMBOL);\r\n\t\treturn this.playerTable[user.id];\r\n\t}\r\n\tmakePlayer(user: string | User | null): RPSPlayer {\r\n\t\treturn new RPSPlayer(user, this);\r\n\t}\r\n}\r\n\r\nfunction findExisting(user1: string, user2: string) {\r\n\treturn Rooms.get(`game-rps-${user1}-${user2}`) || Rooms.get(`game-rps-${user2}-${user1}`);\r\n}\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\trps: 'rockpaperscissors',\r\n\trockpaperscissors: {\r\n\t\tchallenge: 'create',\r\n\t\tchall: 'create',\r\n\t\tchal: 'create',\r\n\t\tcreate(target, room, user) {\r\n\t\t\ttarget = target.trim();\r\n\t\t\tif (!target && this.pmTarget) {\r\n\t\t\t\ttarget = this.pmTarget.id;\r\n\t\t\t}\r\n\t\t\tconst {targetUser, targetUsername} = this.splitUser(target);\r\n\t\t\tif (!targetUser) {\r\n\t\t\t\treturn this.errorReply(`User ${targetUsername} not found. Either specify a username or use this command in PMs.`);\r\n\t\t\t}\r\n\t\t\tif (targetUser === user) return this.errorReply(`You cannot challenge yourself.`);\r\n\t\t\tif (targetUser.settings.blockChallenges && !user.can('bypassblocks', targetUser)) {\r\n\t\t\t\tChat.maybeNotifyBlocked('challenge', targetUser, user);\r\n\t\t\t\treturn this.errorReply(this.tr`The user '${targetUser.name}' is not accepting challenges right now.`);\r\n\t\t\t}\r\n\t\t\tconst existingRoom = findExisting(user.id, targetUser.id);\r\n\t\t\tif (existingRoom?.game && !existingRoom.game.ended) {\r\n\t\t\t\treturn this.errorReply(`You're already playing a Rock Paper Scissors game against ${targetUser.name}!`);\r\n\t\t\t}\r\n\r\n\t\t\tLadders.challenges.add(\r\n\t\t\t\tnew Ladders.GameChallenge(user.id, targetUser.id, \"Rock Paper Scissors\", {\r\n\t\t\t\t\tacceptCommand: `/rps accept ${user.id}`,\r\n\t\t\t\t})\r\n\t\t\t);\r\n\r\n\t\t\tif (!this.pmTarget) this.pmTarget = targetUser;\r\n\t\t\tthis.sendChatMessage(\r\n\t\t\t\t`/raw ${user.name} wants to play Rock Paper Scissors!`\r\n\t\t\t);\r\n\t\t},\r\n\r\n\t\taccept(target, room, user) {\r\n\t\t\tconst fromUser = Ladders.challenges.accept(this);\r\n\r\n\t\t\tconst existingRoom = findExisting(user.id, fromUser.id);\r\n\t\t\tconst roomid = `game-rps-${fromUser.id}-${user.id}`;\r\n\t\t\tconst gameRoom = existingRoom || Rooms.createGameRoom(\r\n\t\t\t\troomid as RoomID, `[RPS] ${user.name} vs ${fromUser.name}`, {}\r\n\t\t\t);\r\n\r\n\t\t\tconst game = new RPSGame(gameRoom);\r\n\t\t\tgameRoom.game = game;\r\n\r\n\t\t\tgame.addPlayer(fromUser);\r\n\t\t\tgame.addPlayer(user);\r\n\t\t\tuser.joinRoom(gameRoom.roomid);\r\n\t\t\tfromUser.joinRoom(gameRoom.roomid);\r\n\t\t\t(gameRoom.game as RPSGame).start();\r\n\r\n\t\t\tthis.pmTarget = fromUser;\r\n\t\t\tthis.sendChatMessage(`/text ${user.name} accepted <<${gameRoom.roomid}>>`);\r\n\t\t},\r\n\r\n\t\tdeny: 'reject',\r\n\t\treject(target, room, user) {\r\n\t\t\treturn this.parse(`/reject ${target}`);\r\n\t\t},\r\n\r\n\t\tend(target, room, user) {\r\n\t\t\tconst game = this.requireGame(RPSGame);\r\n\t\t\tif (!game.playerTable[user.id]) {\r\n\t\t\t\treturn this.errorReply(`You are not a player, and so cannot end the game.`);\r\n\t\t\t}\r\n\t\t\tgame.end();\r\n\t\t},\r\n\r\n\t\tchoose(target, room, user) {\r\n\t\t\tthis.parse(`/choose ${target}`);\r\n\t\t},\r\n\r\n\t\tleave(target, room, user) {\r\n\t\t\tthis.parse(`/leavegame`);\r\n\t\t},\r\n\r\n\t\tpause(target, room, user) {\r\n\t\t\tconst game = this.requireGame(RPSGame);\r\n\t\t\tgame.pause(user);\r\n\t\t},\r\n\r\n\t\tunpause: 'resume',\r\n\t\tresume(target, room, user) {\r\n\t\t\tconst game = this.requireGame(RPSGame);\r\n\t\t\tgame.unpause(user);\r\n\t\t},\r\n\r\n\t\t'': 'help',\r\n\t\thelp() {\r\n\t\t\tthis.runBroadcast();\r\n\t\t\tconst strings = [\r\n\t\t\t\t`/rockpaperscissors OR /rps
`,\r\n\t\t\t\t`/rps challenge [user] - Challenges a user to a game of Rock Paper Scissors`,\r\n\t\t\t\t`(in PM) /rps challenge - Challenges a user to a game of Rock Paper Scissors`,\r\n\t\t\t\t`/rps leave - Leave the game.`,\r\n\t\t\t\t`/rps start - Start the Rock Paper Scissors game.`,\r\n\t\t\t\t`/rps end - End the Rock Paper Scissors game`,\r\n\t\t\t\t`/rps pause - Pauses the game, if it's in progress.`,\r\n\t\t\t\t`/rps resume - Resumes the game, if it's paused.`,\r\n\t\t\t];\r\n\t\t\treturn this.sendReplyBox(strings.join('
'));\r\n\t\t},\r\n\t},\r\n};\r\n"], "mappings": "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", "names": [] }