guandan.dev

guandan.dev

https://git.tonybtw.com/guandan.dev.git git://git.tonybtw.com/guandan.dev.git
2,247 bytes raw
1
export type Suit = 0 | 1 | 2 | 3 | 4
2
3
export const Suit_Hearts: Suit = 0
4
export const Suit_Diamonds: Suit = 1
5
export const Suit_Clubs: Suit = 2
6
export const Suit_Spades: Suit = 3
7
export const Suit_Joker: Suit = 4
8
9
export type Rank = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14
10
11
export const Rank_Two: Rank = 0
12
export const Rank_Three: Rank = 1
13
export const Rank_Four: Rank = 2
14
export const Rank_Five: Rank = 3
15
export const Rank_Six: Rank = 4
16
export const Rank_Seven: Rank = 5
17
export const Rank_Eight: Rank = 6
18
export const Rank_Nine: Rank = 7
19
export const Rank_Ten: Rank = 8
20
export const Rank_Jack: Rank = 9
21
export const Rank_Queen: Rank = 10
22
export const Rank_King: Rank = 11
23
export const Rank_Ace: Rank = 12
24
export const Rank_Black_Joker: Rank = 13
25
export const Rank_Red_Joker: Rank = 14
26
27
export interface Card {
28
  Suit: Suit
29
  Rank: Rank
30
  Id: number
31
}
32
33
export interface Player_Info {
34
  id: string
35
  name: string
36
  seat: number
37
  team: number
38
  is_ready: boolean
39
}
40
41
export interface Room_State {
42
  room_id: string
43
  players: Player_Info[]
44
  game_active: boolean
45
}
46
47
export interface Game_State {
48
  hand: Card[]
49
  level: Rank
50
  current_turn: number
51
  my_seat: number
52
  can_pass: boolean
53
  table_cards: Card[]
54
  player_card_counts: number[]
55
  finish_order: string[]
56
  team_levels: [number, number]
57
}
58
59
export type Msg_Type =
60
  | 'join_room'
61
  | 'create_room'
62
  | 'room_state'
63
  | 'game_start'
64
  | 'deal_cards'
65
  | 'play_cards'
66
  | 'pass'
67
  | 'turn'
68
  | 'play_made'
69
  | 'hand_end'
70
  | 'tribute'
71
  | 'tribute_give'
72
  | 'tribute_recv'
73
  | 'game_end'
74
  | 'error'
75
  | 'player_joined'
76
  | 'player_left'
77
  | 'fill_bots'
78
79
export interface Message<T = unknown> {
80
  type: Msg_Type
81
  payload: T
82
}
83
84
export function get_suit_symbol(suit: Suit): string {
85
  const symbols = ['♥', '♦', '♣', '♠', '']
86
  return symbols[suit]
87
}
88
89
export function get_rank_symbol(rank: Rank): string {
90
  const symbols = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '🃏', '🃏']
91
  return symbols[rank]
92
}
93
94
export function is_red_suit(suit: Suit): boolean {
95
  return suit === Suit_Hearts || suit === Suit_Diamonds
96
}
97
98
export function is_wild(card: Card, level: Rank): boolean {
99
  return card.Suit === Suit_Hearts && card.Rank === level
100
}