Skip to content

Commit 59f4a70

Browse files
committed
More game logic
1 parent 69e3f8c commit 59f4a70

File tree

5 files changed

+57
-16
lines changed

5 files changed

+57
-16
lines changed

package-lock.json

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
"author": "Rayzr522 <[email protected]>",
88
"license": "MIT",
99
"dependencies": {
10+
"@types/common-tags": "^1.8.0",
1011
"@types/lodash": "^4.14.161",
1112
"@types/node": "^14.11.2",
13+
"common-tags": "^1.8.0",
1214
"discord.js": "^12.3.1",
1315
"dotenv": "^8.2.0",
1416
"lodash": "^4.17.20"

src/gameManager.ts

+9-11
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
1-
import { Snowflake, GuildMember, GuildChannel, TextChannel, Message } from 'discord.js'
2-
import { Arena, Game } from './types/game'
1+
import { Snowflake, Message } from 'discord.js'
2+
import { Invite, Game } from './types/game'
33
import { createGame } from './logic/game'
44
import { shuffle } from 'lodash'
55

6-
export type Invite = {
7-
from: GuildMember
8-
to: GuildMember
9-
arena: Arena
10-
channel: GuildChannel & TextChannel
11-
}
12-
136
export const GameManager = {
147
games: [] as Game[],
158
invites: [] as Invite[],
9+
1610
findGame(id: Snowflake): Game | undefined {
1711
return this.games.find(game => game.players.some(player => player.user.id === id))
1812
},
@@ -41,11 +35,15 @@ export const GameManager = {
4135

4236
const message = await invite.channel.send(':hourglass: Generating game, please wait...')
4337

44-
this.games.push(createGame({
38+
const game = createGame({
4539
users: shuffle([invite.to, invite.from]),
4640
arena: invite.arena,
4741
message
48-
}))
42+
})
43+
44+
this.games.push(game)
45+
46+
await renderGame(game)
4947

5048
return true
5149
}

src/logic/game.ts

+27-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { GuildMember, Message, ReactionEmoji } from 'discord.js'
1+
import { stripIndents } from 'common-tags'
2+
import { GuildMember, Message, MessageEmbed, ReactionEmoji } from 'discord.js'
23
import { Arena, Game, Player } from '../types/game'
34

45
export const createPlayer = (user: GuildMember): Player => ({
@@ -9,20 +10,42 @@ export const createPlayer = (user: GuildMember): Player => ({
910

1011
export const createGame = (options: {users: GuildMember[], arena: Arena, message: Message}): Game => ({
1112
players: options.users.map(createPlayer),
13+
currentPlayer: 0,
1214
arena: options.arena,
1315
message: options.message,
1416
})
1517

18+
export const getCurrentPlayers = (game: Game): [currentPlayer: Player, target: Player] => {
19+
return [game.players[game.currentPlayer], game.players[(game.currentPlayer + 1) % 2]]
20+
}
21+
22+
export const renderGame = async (game: Game): Promise<Game> => {
23+
const [currentPlayer, target] = getCurrentPlayers(game)
24+
25+
await game.message.edit({
26+
embed: new MessageEmbed()
27+
.setColor(0X36393F)
28+
.setDescription(stripIndents`
29+
**${currentPlayer.user.toString()}'s turn**
30+
${currentPlayer.health} :heart:
31+
32+
**${target.user.toString()}: ${target.health} :heart:**
33+
`)
34+
})
35+
36+
return game
37+
}
38+
1639
export const getCurrentPlayer = (game: Game): Player => game.players[0]
1740

1841
export const handleReaction = (game: Game, reaction: ReactionEmoji): Game => {
19-
const currentPlayer = game.players[0]
20-
const target = game.players[1]
42+
const [currentPlayer, target] = getCurrentPlayers(game)
2143

2244
const newState = {
2345
...game,
24-
players: [...game.players.slice(1), game.players[0]]
46+
currentPlayer: (game.currentPlayer + 1) % 2
2547
}
2648

2749
return newState
2850
}
51+

src/types/game.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
import { Message, GuildMember } from 'discord.js'
1+
import { Message, GuildMember, GuildChannel, TextChannel } from 'discord.js'
22
import { IntRange } from './utils'
33

4+
export type Invite = {
5+
from: GuildMember
6+
to: GuildMember
7+
arena: Arena
8+
channel: GuildChannel & TextChannel
9+
}
10+
411
export type Arena = {
512
name: string
613
background: string
@@ -27,6 +34,7 @@ export type Player = {
2734

2835
export type Game = {
2936
players: Player[]
37+
currentPlayer: number
3038
arena: Arena
3139
message: Message
3240
}

0 commit comments

Comments
 (0)