trucoshi 12.2.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,12 +34,18 @@ Run the three-repo local stack from this repo with:
34
34
 
35
35
  If your user cannot run Docker directly, use `yarn dev:all:sudo-docker`. Do not prefix either command with `sudo`; that mode only elevates Docker commands, so Yarn, Vite, generated Prisma files, and local links remain owned by your user.
36
36
 
37
- The launcher keeps the local stack in development mode: Lightning Accounts, Trucoshi, and the Vite client. Its interactive control panel can show one service's logs at a time, display stack status, restart a service, and optionally build and host a client snapshot at `http://10.10.1.106:2993`. The snapshot is off by default, so it never slows Vite's hot-reload loop. Set `DEV_ALL_PUBLIC_HOST`, `DEV_ALL_CLIENT_HOST_PORT`, or `DEV_ALL_LOG_DIR` if you need different defaults.
37
+ The launcher keeps the local stack in development mode: Lightning Accounts, Trucoshi, and the Vite client. Its home screen continuously refreshes the stack status and service URLs. Use the numbered shortcuts or ↑/↓ to move, Enter or → to select, and or Esc to go back. It can also build and host a client snapshot at `http://10.10.1.106:2993`. The snapshot is off by default, so it never slows Vite's hot-reload loop. Set `DEV_ALL_PUBLIC_HOST`, `DEV_ALL_CLIENT_HOST_PORT`, or `DEV_ALL_LOG_DIR` if you need different defaults.
38
38
 
39
39
  # Test
40
40
 
41
41
  `yarn test`
42
42
 
43
+ ### Card skins
44
+
45
+ Skin metadata and user inventory behavior live in this repository; image files
46
+ live in the sibling client. See [`docs/card-skins.md`](docs/card-skins.md) for
47
+ the publish, synchronization, validation, and stable-ID workflow.
48
+
43
49
  ### Docker e2e
44
50
 
45
51
  Trucoshi e2e tests depend on a running Lightning Accounts e2e server. Start that first in one
@@ -7,329 +7,330 @@
7
7
  "id": "argentino/1b_argentino_001",
8
8
  "card": "1b",
9
9
  "fileName": "1b_argentino_001.png",
10
- "assetPath": "skins/argentino/1b_argentino_001.png",
11
10
  "rarity": "COMMON"
12
11
  },
13
12
  {
14
13
  "id": "argentino/4e_argentino_001",
15
14
  "card": "4e",
16
15
  "fileName": "4e_argentino_001.png",
17
- "assetPath": "skins/argentino/4e_argentino_001.png",
18
16
  "rarity": "COMMON"
19
17
  },
20
18
  {
21
19
  "id": "argentino/4b_argentino_001",
22
20
  "card": "4b",
23
21
  "fileName": "4b_argentino_001.png",
24
- "assetPath": "skins/argentino/4b_argentino_001.png",
25
22
  "rarity": "COMMON"
26
23
  },
27
24
  {
28
25
  "id": "argentino/3b_argentino_001",
29
26
  "card": "3b",
30
27
  "fileName": "3b_argentino_001.png",
31
- "assetPath": "skins/argentino/3b_argentino_001.png",
32
28
  "rarity": "COMMON"
33
29
  },
34
30
  {
35
31
  "id": "argentino/7b_argentino_001",
36
32
  "card": "7b",
37
33
  "fileName": "7b_argentino_001.png",
38
- "assetPath": "skins/argentino/7b_argentino_001.png",
39
34
  "rarity": "COMMON"
40
35
  },
41
36
  {
42
37
  "id": "argentino/2c_argentino_001",
43
38
  "card": "2c",
44
39
  "fileName": "2c_argentino_001.png",
45
- "assetPath": "skins/argentino/2c_argentino_001.png",
46
40
  "rarity": "COMMON"
47
41
  },
48
42
  {
49
43
  "id": "argentino/2b_argentino_001",
50
44
  "card": "2b",
51
45
  "fileName": "2b_argentino_001.png",
52
- "assetPath": "skins/argentino/2b_argentino_001.png",
53
46
  "rarity": "COMMON"
54
47
  },
55
48
  {
56
49
  "id": "argentino/3b_argentino_002",
57
50
  "card": "3b",
58
51
  "fileName": "3b_argentino_002.png",
59
- "assetPath": "skins/argentino/3b_argentino_002.png",
60
52
  "rarity": "COMMON"
61
53
  },
62
54
  {
63
55
  "id": "argentino/3o_argentino_001",
64
56
  "card": "3o",
65
57
  "fileName": "3o_argentino_001.png",
66
- "assetPath": "skins/argentino/3o_argentino_001.png",
67
58
  "rarity": "COMMON"
68
59
  },
69
60
  {
70
61
  "id": "argentino/4b_argentino_002",
71
62
  "card": "4b",
72
63
  "fileName": "4b_argentino_002.png",
73
- "assetPath": "skins/argentino/4b_argentino_002.png",
74
64
  "rarity": "COMMON"
75
65
  },
76
66
  {
77
67
  "id": "argentino/5b_argentino_001",
78
68
  "card": "5b",
79
69
  "fileName": "5b_argentino_001.png",
80
- "assetPath": "skins/argentino/5b_argentino_001.png",
81
70
  "rarity": "COMMON"
82
71
  },
83
72
  {
84
73
  "id": "argentino/6b_argentino_001",
85
74
  "card": "6b",
86
75
  "fileName": "6b_argentino_001.png",
87
- "assetPath": "skins/argentino/6b_argentino_001.png",
88
76
  "rarity": "COMMON"
89
77
  },
90
78
  {
91
79
  "id": "argentino/7b_argentino_002",
92
80
  "card": "7b",
93
81
  "fileName": "7b_argentino_002.png",
94
- "assetPath": "skins/argentino/7b_argentino_002.png",
95
82
  "rarity": "COMMON"
96
83
  },
97
84
  {
98
85
  "id": "argentino/cb_argentino_002",
99
86
  "card": "cb",
100
87
  "fileName": "cb_argentino_002.png",
101
- "assetPath": "skins/argentino/cb_argentino_002.png",
102
88
  "rarity": "COMMON"
103
89
  },
104
90
  {
105
91
  "id": "argentino/ro_argentino_001",
106
92
  "card": "ro",
107
93
  "fileName": "ro_argentino_001.png",
108
- "assetPath": "skins/argentino/ro_argentino_001.png",
109
94
  "rarity": "COMMON"
110
95
  },
96
+ {
97
+ "id": "argentino/7c_argentino_001",
98
+ "card": "7c",
99
+ "fileName": "7c_argentino_001.png",
100
+ "rarity": "COMMON"
101
+ },
102
+ {
103
+ "id": "argentino/3e_argentino_002",
104
+ "card": "3e",
105
+ "fileName": "3e_argentino_002.png",
106
+ "rarity": "RARE"
107
+ },
108
+ {
109
+ "id": "argentino/5c_argentino_002",
110
+ "card": "5c",
111
+ "fileName": "5c_argentino_002.png",
112
+ "rarity": "RARE"
113
+ },
114
+ {
115
+ "id": "argentino/rb_argentino_004",
116
+ "card": "rb",
117
+ "fileName": "rb_argentino_004.png",
118
+ "rarity": "RARE"
119
+ },
111
120
  {
112
121
  "id": "argentino/1b_argentino_002",
113
122
  "card": "1b",
114
123
  "fileName": "1b_argentino_002.png",
115
- "assetPath": "skins/argentino/1b_argentino_002.png",
116
124
  "rarity": "RARE"
117
125
  },
118
126
  {
119
127
  "id": "argentino/1c_argentino_001",
120
128
  "card": "1c",
121
129
  "fileName": "1c_argentino_001.png",
122
- "assetPath": "skins/argentino/1c_argentino_001.png",
123
130
  "rarity": "RARE"
124
131
  },
125
132
  {
126
133
  "id": "argentino/1e_argentino_001",
127
134
  "card": "1e",
128
135
  "fileName": "1e_argentino_001.png",
129
- "assetPath": "skins/argentino/1e_argentino_001.png",
130
136
  "rarity": "RARE"
131
137
  },
132
138
  {
133
139
  "id": "argentino/1e_argentino_002",
134
140
  "card": "1e",
135
141
  "fileName": "1e_argentino_002.png",
136
- "assetPath": "skins/argentino/1e_argentino_002.png",
137
142
  "rarity": "RARE"
138
143
  },
139
144
  {
140
145
  "id": "argentino/pb_argentino_001",
141
146
  "card": "pb",
142
147
  "fileName": "pb_argentino_001.png",
143
- "assetPath": "skins/argentino/pb_argentino_001.png",
144
148
  "rarity": "RARE"
145
149
  },
146
150
  {
147
151
  "id": "argentino/pc_argentino_001",
148
152
  "card": "pc",
149
153
  "fileName": "pc_argentino_001.png",
150
- "assetPath": "skins/argentino/pc_argentino_001.png",
151
154
  "rarity": "RARE"
152
155
  },
153
156
  {
154
157
  "id": "argentino/pe_argentino_001",
155
158
  "card": "pe",
156
159
  "fileName": "pe_argentino_001.png",
157
- "assetPath": "skins/argentino/pe_argentino_001.png",
158
160
  "rarity": "RARE"
159
161
  },
160
162
  {
161
163
  "id": "argentino/1o_argentino_001",
162
164
  "card": "1o",
163
165
  "fileName": "1o_argentino_001.png",
164
- "assetPath": "skins/argentino/1o_argentino_001.png",
165
166
  "rarity": "RARE"
166
167
  },
167
168
  {
168
169
  "id": "argentino/2e_argentino_001",
169
170
  "card": "2e",
170
171
  "fileName": "2e_argentino_001.png",
171
- "assetPath": "skins/argentino/2e_argentino_001.png",
172
172
  "rarity": "RARE"
173
173
  },
174
174
  {
175
175
  "id": "argentino/2o_argentino_001",
176
176
  "card": "2o",
177
177
  "fileName": "2o_argentino_001.png",
178
- "assetPath": "skins/argentino/2o_argentino_001.png",
179
178
  "rarity": "RARE"
180
179
  },
181
180
  {
182
181
  "id": "argentino/cb_argentino_003",
183
182
  "card": "cb",
184
183
  "fileName": "cb_argentino_003.png",
185
- "assetPath": "skins/argentino/cb_argentino_003.png",
186
184
  "rarity": "RARE"
187
185
  },
188
186
  {
189
187
  "id": "argentino/cc_argentino_001",
190
188
  "card": "cc",
191
189
  "fileName": "cc_argentino_001.png",
192
- "assetPath": "skins/argentino/cc_argentino_001.png",
193
190
  "rarity": "RARE"
194
191
  },
195
192
  {
196
193
  "id": "argentino/rc_argentino_001",
197
194
  "card": "rc",
198
195
  "fileName": "rc_argentino_001.png",
199
- "assetPath": "skins/argentino/rc_argentino_001.png",
200
196
  "rarity": "RARE"
201
197
  },
198
+ {
199
+ "id": "argentino/cb_argentino_004",
200
+ "card": "cb",
201
+ "fileName": "cb_argentino_004.png",
202
+ "rarity": "EPIC"
203
+ },
204
+ {
205
+ "id": "argentino/cc_argentino_002",
206
+ "card": "cc",
207
+ "fileName": "cc_argentino_002.png",
208
+ "rarity": "EPIC"
209
+ },
210
+ {
211
+ "id": "argentino/po_argentino_001",
212
+ "card": "po",
213
+ "fileName": "po_argentino_001.png",
214
+ "rarity": "EPIC"
215
+ },
216
+ {
217
+ "id": "argentino/re_argentino_002",
218
+ "card": "re",
219
+ "fileName": "re_argentino_002.png",
220
+ "rarity": "EPIC"
221
+ },
202
222
  {
203
223
  "id": "argentino/1e_argentino_003",
204
224
  "card": "1e",
205
225
  "fileName": "1e_argentino_003.png",
206
- "assetPath": "skins/argentino/1e_argentino_003.png",
207
226
  "rarity": "EPIC"
208
227
  },
209
228
  {
210
229
  "id": "argentino/1e_argentino_004",
211
230
  "card": "1e",
212
231
  "fileName": "1e_argentino_004.png",
213
- "assetPath": "skins/argentino/1e_argentino_004.png",
214
232
  "rarity": "EPIC"
215
233
  },
216
234
  {
217
235
  "id": "argentino/7e_argentino_001",
218
236
  "card": "7e",
219
237
  "fileName": "7e_argentino_001.png",
220
- "assetPath": "skins/argentino/7e_argentino_001.png",
221
238
  "rarity": "EPIC"
222
239
  },
223
240
  {
224
241
  "id": "argentino/pc_argentino_002",
225
242
  "card": "pc",
226
243
  "fileName": "pc_argentino_002.png",
227
- "assetPath": "skins/argentino/pc_argentino_002.png",
228
244
  "rarity": "EPIC"
229
245
  },
230
246
  {
231
247
  "id": "argentino/rb_argentino_001",
232
248
  "card": "rb",
233
249
  "fileName": "rb_argentino_001.png",
234
- "assetPath": "skins/argentino/rb_argentino_001.png",
235
250
  "rarity": "EPIC"
236
251
  },
237
252
  {
238
253
  "id": "argentino/rb_argentino_002",
239
254
  "card": "rb",
240
255
  "fileName": "rb_argentino_002.png",
241
- "assetPath": "skins/argentino/rb_argentino_002.png",
242
256
  "rarity": "EPIC"
243
257
  },
244
258
  {
245
259
  "id": "argentino/pb_argentino_002",
246
260
  "card": "pb",
247
261
  "fileName": "pb_argentino_002.png",
248
- "assetPath": "skins/argentino/pb_argentino_002.png",
249
262
  "rarity": "EPIC"
250
263
  },
251
264
  {
252
265
  "id": "argentino/5c_argentino_001",
253
266
  "card": "5c",
254
267
  "fileName": "5c_argentino_001.png",
255
- "assetPath": "skins/argentino/5c_argentino_001.png",
256
268
  "rarity": "EPIC"
257
269
  },
258
270
  {
259
271
  "id": "argentino/3c_argentino_001",
260
272
  "card": "3c",
261
273
  "fileName": "3c_argentino_001.png",
262
- "assetPath": "skins/argentino/3c_argentino_001.png",
263
274
  "rarity": "EPIC"
264
275
  },
265
276
  {
266
277
  "id": "argentino/3o_argentino_002",
267
278
  "card": "3o",
268
279
  "fileName": "3o_argentino_002.png",
269
- "assetPath": "skins/argentino/3o_argentino_002.png",
270
280
  "rarity": "EPIC"
271
281
  },
272
282
  {
273
283
  "id": "argentino/4c_argentino_001",
274
284
  "card": "4c",
275
285
  "fileName": "4c_argentino_001.png",
276
- "assetPath": "skins/argentino/4c_argentino_001.png",
277
286
  "rarity": "EPIC"
278
287
  },
279
288
  {
280
289
  "id": "argentino/cb_argentino_001",
281
290
  "card": "cb",
282
291
  "fileName": "cb_argentino_001.png",
283
- "assetPath": "skins/argentino/cb_argentino_001.png",
284
292
  "rarity": "EPIC"
285
293
  },
286
294
  {
287
295
  "id": "argentino/co_argentino_001",
288
296
  "card": "co",
289
297
  "fileName": "co_argentino_001.png",
290
- "assetPath": "skins/argentino/co_argentino_001.png",
291
298
  "rarity": "EPIC"
292
299
  },
293
300
  {
294
301
  "id": "argentino/rb_argentino_003",
295
302
  "card": "rb",
296
303
  "fileName": "rb_argentino_003.png",
297
- "assetPath": "skins/argentino/rb_argentino_003.png",
298
304
  "rarity": "LEGENDARY"
299
305
  },
300
306
  {
301
307
  "id": "argentino/ce_argentino_001",
302
308
  "card": "ce",
303
309
  "fileName": "ce_argentino_001.png",
304
- "assetPath": "skins/argentino/ce_argentino_001.png",
305
310
  "rarity": "LEGENDARY"
306
311
  },
307
312
  {
308
313
  "id": "argentino/7o_argentino_001",
309
314
  "card": "7o",
310
315
  "fileName": "7o_argentino_001.png",
311
- "assetPath": "skins/argentino/7o_argentino_001.png",
312
316
  "rarity": "LEGENDARY"
313
317
  },
314
318
  {
315
319
  "id": "argentino/3e_argentino_001",
316
320
  "card": "3e",
317
321
  "fileName": "3e_argentino_001.png",
318
- "assetPath": "skins/argentino/3e_argentino_001.png",
319
322
  "rarity": "LEGENDARY"
320
323
  },
321
324
  {
322
325
  "id": "argentino/3c_argentino_002",
323
326
  "card": "3c",
324
327
  "fileName": "3c_argentino_002.png",
325
- "assetPath": "skins/argentino/3c_argentino_002.png",
326
328
  "rarity": "LEGENDARY"
327
329
  },
328
330
  {
329
331
  "id": "argentino/re_argentino_001",
330
332
  "card": "re",
331
333
  "fileName": "re_argentino_001.png",
332
- "assetPath": "skins/argentino/re_argentino_001.png",
333
334
  "rarity": "LEGENDARY"
334
335
  }
335
336
  ]
package/dist/events.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { SocketError } from "./server";
2
- import { EMatchState, IAdminCreateChestRewardCodeInput, IAdminCreateChestRewardCodeResult, IAdminDashboard, IAdminSetNoticeBannerInput, IAdminSetNoticeBannerResult, IAccountDetails, CardSkinId, ICard, IChatMessage, IEquippedDeck, ILobbyOptions, IInventoryCardGroup, IMatchDetails, IPlayerRanking, IPublicChatRoom, IPublicMatch, IPublicMatchInfo, IPublicMatchStats, IJoinQueueOptions, IQueueMatchFound, IQueueMatchCancelled, IQueueMatchStarting, IQueueReadyUpdate, IQueueStatus, IRewardCodeRedeemResult, IPublicNoticeBanner, ITreasureOpenResult, ITreasureStatus, ITrucoshiStats, IUserData, IWaitingPlayData, IWaitingSayData } from "./types";
2
+ import { EMatchState, IAdminCreateChestRewardCodeInput, IAdminCreateChestRewardCodeResult, IAdminDashboard, IAdminSetNoticeBannerInput, IAdminSetNoticeBannerResult, IAccountDetails, CardSkinId, ICard, IChatMessage, IEquippedDeck, ILobbyOptions, IInventoryCardGroup, IMatchDetails, IPlayerRanking, IPublicChatRoom, IPublicMatch, IPublicMatchInfo, IPublicMatchStats, IJoinQueueOptions, IQueueMatchFound, IQueueMatchCancelled, IQueueMatchStarting, IQueueReadyUpdate, IQueueStatus, IRewardCodeRedeemResult, IPublicNoticeBanner, ITreasureOpenResult, ITreasureStatus, ISkinRollResult, ITrucoshiStats, IUserData, IWaitingPlayData, IWaitingSayData } from "./types";
3
3
  export type IEventCallback<T = {}> = (args: {
4
4
  success: boolean;
5
5
  error?: SocketError;
@@ -32,7 +32,7 @@ export interface ServerToClientEvents {
32
32
  [EServerEvent.PONG]: (serverTime: number, clientTime: number) => void;
33
33
  [EServerEvent.UPDATE_CHAT]: (room: IPublicChatRoom) => void;
34
34
  [EServerEvent.UPDATE_STATS]: (room: ITrucoshiStats) => void;
35
- [EServerEvent.QUEUE_UPDATE]: (status: IQueueStatus) => void;
35
+ [EServerEvent.QUEUE_UPDATE]: (status: IQueueStatus | null) => void;
36
36
  [EServerEvent.QUEUE_MATCH_FOUND]: (match: IQueueMatchFound) => void;
37
37
  [EServerEvent.QUEUE_READY_UPDATE]: (update: IQueueReadyUpdate) => void;
38
38
  [EServerEvent.QUEUE_MATCH_STARTING]: (starting: IQueueMatchStarting) => void;
@@ -74,6 +74,7 @@ export declare enum EClientEvent {
74
74
  DECLINE_QUEUE_MATCH = "DECLINE_QUEUE_MATCH",
75
75
  FETCH_INVENTORY = "FETCH_INVENTORY",
76
76
  SET_DECK_CARD_SKIN = "SET_DECK_CARD_SKIN",
77
+ ROLL_CARD_SKINS = "ROLL_CARD_SKINS",
77
78
  FETCH_TREASURE_STATUS = "FETCH_TREASURE_STATUS",
78
79
  OPEN_TREASURE_CHEST = "OPEN_TREASURE_CHEST",
79
80
  DEV_GRANT_TREASURE_CHEST = "DEV_GRANT_TREASURE_CHEST",
@@ -154,6 +155,11 @@ export interface ClientToServerEvents {
154
155
  inventory: IInventoryCardGroup[];
155
156
  equippedDeck: IEquippedDeck;
156
157
  }>) => void;
158
+ [EClientEvent.ROLL_CARD_SKINS]: (cardSkinIds: CardSkinId[], callback: IEventCallback<{
159
+ rollResult?: ISkinRollResult;
160
+ inventory: IInventoryCardGroup[];
161
+ equippedDeck: IEquippedDeck;
162
+ }>) => void;
157
163
  [EClientEvent.FETCH_TREASURE_STATUS]: (callback: IEventCallback<{
158
164
  treasureStatus: ITreasureStatus;
159
165
  }>) => void;
package/dist/events.js CHANGED
@@ -46,6 +46,7 @@ export var EClientEvent;
46
46
  EClientEvent["DECLINE_QUEUE_MATCH"] = "DECLINE_QUEUE_MATCH";
47
47
  EClientEvent["FETCH_INVENTORY"] = "FETCH_INVENTORY";
48
48
  EClientEvent["SET_DECK_CARD_SKIN"] = "SET_DECK_CARD_SKIN";
49
+ EClientEvent["ROLL_CARD_SKINS"] = "ROLL_CARD_SKINS";
49
50
  EClientEvent["FETCH_TREASURE_STATUS"] = "FETCH_TREASURE_STATUS";
50
51
  EClientEvent["OPEN_TREASURE_CHEST"] = "OPEN_TREASURE_CHEST";
51
52
  EClientEvent["DEV_GRANT_TREASURE_CHEST"] = "DEV_GRANT_TREASURE_CHEST";
package/dist/lib/Skins.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import skinReleases from "../cosmetics/skins.json";
2
- const normalizeSkin = (release, skin) => (Object.assign({ enabled: true, unlockable: true, release }, skin));
2
+ const normalizeSkin = (release, skin) => (Object.assign(Object.assign({ enabled: true, unlockable: true }, skin), { release, assetPath: `web/releases/${release}/${skin.fileName}` }));
3
3
  export const SKIN_RELEASES = skinReleases.map(({ release, grantOnInventory = false, grantSource, skins }) => ({
4
4
  release,
5
5
  grantOnInventory,
@@ -96,5 +96,9 @@ export declare const SUITS_HUMAN_READABLE: {
96
96
  c: string;
97
97
  };
98
98
  export declare const TEAM_SIZE_VALUES: number[];
99
- export declare const PICA_PICA_TRIGGER_PERCENT = 0.5;
99
+ export declare const DEFAULT_TEAM_NAMES: Record<0 | 1, string>;
100
+ export declare const getDefaultTeamName: (teamIdx: 0 | 1) => string;
101
+ export declare const PICA_PICA_TRIGGER_PERCENT: number;
102
+ export declare const PICA_PICA_END_PERCENT: number;
100
103
  export declare const PICA_PICA_TEAM_SIZE = 6;
104
+ export declare const getQueueMatchPoint: (maxPlayers: 2 | 4 | 6) => 9 | 12 | 15;
@@ -95,5 +95,18 @@ export const SUITS_HUMAN_READABLE = {
95
95
  c: "🍷",
96
96
  };
97
97
  export const TEAM_SIZE_VALUES = [1, 2, 3];
98
- export const PICA_PICA_TRIGGER_PERCENT = 0.5;
98
+ export const DEFAULT_TEAM_NAMES = {
99
+ 0: "Naranja",
100
+ 1: "Violeta",
101
+ };
102
+ export const getDefaultTeamName = (teamIdx) => DEFAULT_TEAM_NAMES[teamIdx];
103
+ export const PICA_PICA_TRIGGER_PERCENT = 1 / 3;
104
+ export const PICA_PICA_END_PERCENT = 2 / 3;
99
105
  export const PICA_PICA_TEAM_SIZE = 6;
106
+ export const getQueueMatchPoint = (maxPlayers) => {
107
+ if (maxPlayers === 6)
108
+ return 15;
109
+ if (maxPlayers === 4)
110
+ return 12;
111
+ return 9;
112
+ };
package/dist/types.d.ts CHANGED
@@ -376,6 +376,7 @@ export type IEquippedDeck = Partial<Record<ICard, CardSkinId>>;
376
376
  export interface IInventoryCardSkin extends ICardSkin {
377
377
  unlocked: boolean;
378
378
  equipped: boolean;
379
+ quantity: number;
379
380
  }
380
381
  export interface IInventoryCardGroup {
381
382
  card: ICard;
@@ -403,6 +404,13 @@ export interface ITreasureOpenResult {
403
404
  duplicate: boolean;
404
405
  granted: boolean;
405
406
  }
407
+ export interface ISkinRollResult {
408
+ rollId: number;
409
+ inputRarity: CardSkinRarity;
410
+ outputRarity: CardSkinRarity;
411
+ consumedSkinIds: CardSkinId[];
412
+ rewardedSkin: ICardSkin;
413
+ }
406
414
  export interface IAdminOnlineAccount {
407
415
  accountId: number;
408
416
  name: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trucoshi",
3
- "version": "12.2.0",
3
+ "version": "13.0.0",
4
4
  "description": "Truco Game Server",
5
5
  "main": "dist/types.js",
6
6
  "license": "GPL-3.0",