desck 0.4.2
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/.gitlab-ci.yml +21 -0
- package/README.md +176 -0
- package/desck.cjs +2 -0
- package/elm.json +39 -0
- package/justfile +13 -0
- package/package.json +25 -0
- package/public/index.html +30 -0
- package/public/palette.json +16 -0
- package/public/projects/something.json +139 -0
- package/public/projects/template.json +69 -0
- package/public/script.js +490 -0
- package/public/style.css +471 -0
- package/public/svg/backface.svg +1 -0
- package/public/svg/courts.svg +30 -0
- package/public/svg/digits.svg +18 -0
- package/public/svg/suits.svg +43 -0
- package/server.cjs +316 -0
- package/settings.json +10 -0
- package/src/Card.elm +38 -0
- package/src/ColorPicker.elm +113 -0
- package/src/Deck.elm +571 -0
- package/src/DeckView.elm +415 -0
- package/src/Layout.elm +224 -0
- package/src/Main.elm +3743 -0
- package/src/Palette.elm +302 -0
- package/src/Project.elm +1029 -0
- package/src/Rect.elm +292 -0
- package/src/SaveFile.elm +422 -0
- package/src/Theme.elm +99 -0
- package/src/Util.elm +337 -0
- package/src/Vec.elm +196 -0
- package/src/Zone.elm +364 -0
package/src/Deck.elm
ADDED
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
module Deck exposing (..)
|
|
2
|
+
|
|
3
|
+
import Json.Decode as D exposing (Decoder)
|
|
4
|
+
import Json.Encode exposing (Value, string)
|
|
5
|
+
import Ordering exposing (Ordering)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
jokerCardOrdering : Ordering CardModel
|
|
9
|
+
jokerCardOrdering =
|
|
10
|
+
Ordering.byRank
|
|
11
|
+
(\card ->
|
|
12
|
+
case card of
|
|
13
|
+
Ranked _ _ ->
|
|
14
|
+
1
|
|
15
|
+
|
|
16
|
+
Joker _ ->
|
|
17
|
+
2
|
|
18
|
+
)
|
|
19
|
+
(\x y ->
|
|
20
|
+
case ( x, y ) of
|
|
21
|
+
( Ranked v1 s1, Ranked v2 s2 ) ->
|
|
22
|
+
suitOrdering s1 s2
|
|
23
|
+
|> Ordering.ifStillTiedThen
|
|
24
|
+
(valueOrdering v1 v2)
|
|
25
|
+
|
|
26
|
+
_ ->
|
|
27
|
+
Ordering.noConflicts
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
suitOrdering : Ordering Suit
|
|
32
|
+
suitOrdering =
|
|
33
|
+
Ordering.explicit [ Club, Heart, Diamond, Spade ]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
valueOrdering : Ordering Rank
|
|
37
|
+
valueOrdering =
|
|
38
|
+
Ordering.explicit
|
|
39
|
+
[ Ace
|
|
40
|
+
, Two
|
|
41
|
+
, Three
|
|
42
|
+
, Four
|
|
43
|
+
, Five
|
|
44
|
+
, Six
|
|
45
|
+
, Seven
|
|
46
|
+
, Eight
|
|
47
|
+
, Nine
|
|
48
|
+
, Ten
|
|
49
|
+
, Jack
|
|
50
|
+
, Queen
|
|
51
|
+
, King
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
type Orientation
|
|
56
|
+
= Up
|
|
57
|
+
| Side
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
type Suit
|
|
61
|
+
= Spade
|
|
62
|
+
| Heart
|
|
63
|
+
| Diamond
|
|
64
|
+
| Club
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
type Rank
|
|
68
|
+
= Ace
|
|
69
|
+
| Two
|
|
70
|
+
| Three
|
|
71
|
+
| Four
|
|
72
|
+
| Five
|
|
73
|
+
| Six
|
|
74
|
+
| Seven
|
|
75
|
+
| Eight
|
|
76
|
+
| Nine
|
|
77
|
+
| Ten
|
|
78
|
+
| Jack
|
|
79
|
+
| Queen
|
|
80
|
+
| King
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
type CardModel
|
|
84
|
+
= Ranked Rank Suit
|
|
85
|
+
| Joker Bool
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
suitFromInt : Int -> Suit
|
|
89
|
+
suitFromInt i =
|
|
90
|
+
case i of
|
|
91
|
+
0 ->
|
|
92
|
+
Spade
|
|
93
|
+
|
|
94
|
+
1 ->
|
|
95
|
+
Heart
|
|
96
|
+
|
|
97
|
+
2 ->
|
|
98
|
+
Diamond
|
|
99
|
+
|
|
100
|
+
_ ->
|
|
101
|
+
Club
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
suitAsUnicode : Suit -> String
|
|
105
|
+
suitAsUnicode s =
|
|
106
|
+
case s of
|
|
107
|
+
Spade ->
|
|
108
|
+
"♠"
|
|
109
|
+
|
|
110
|
+
Heart ->
|
|
111
|
+
"♥"
|
|
112
|
+
|
|
113
|
+
Diamond ->
|
|
114
|
+
"♦"
|
|
115
|
+
|
|
116
|
+
Club ->
|
|
117
|
+
"♣"
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
suitAsString : Suit -> String
|
|
121
|
+
suitAsString s =
|
|
122
|
+
case s of
|
|
123
|
+
Spade ->
|
|
124
|
+
"spade"
|
|
125
|
+
|
|
126
|
+
Heart ->
|
|
127
|
+
"heart"
|
|
128
|
+
|
|
129
|
+
Diamond ->
|
|
130
|
+
"diamond"
|
|
131
|
+
|
|
132
|
+
Club ->
|
|
133
|
+
"club"
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
maybeSuit : CardModel -> Maybe Suit
|
|
137
|
+
maybeSuit m =
|
|
138
|
+
case m of
|
|
139
|
+
Ranked _ suit ->
|
|
140
|
+
Just suit
|
|
141
|
+
|
|
142
|
+
Joker _ ->
|
|
143
|
+
Nothing
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
maybeRank : CardModel -> Maybe Rank
|
|
147
|
+
maybeRank m =
|
|
148
|
+
case m of
|
|
149
|
+
Ranked rank _ ->
|
|
150
|
+
Just rank
|
|
151
|
+
|
|
152
|
+
Joker _ ->
|
|
153
|
+
Nothing
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
suitFromString : String -> Maybe Suit
|
|
157
|
+
suitFromString s =
|
|
158
|
+
case s of
|
|
159
|
+
"spade" ->
|
|
160
|
+
Just Spade
|
|
161
|
+
|
|
162
|
+
"heart" ->
|
|
163
|
+
Just Heart
|
|
164
|
+
|
|
165
|
+
"diamond" ->
|
|
166
|
+
Just Diamond
|
|
167
|
+
|
|
168
|
+
"club" ->
|
|
169
|
+
Just Club
|
|
170
|
+
|
|
171
|
+
_ ->
|
|
172
|
+
Nothing
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
suitAsChar : Suit -> String
|
|
176
|
+
suitAsChar s =
|
|
177
|
+
suitAsString s
|
|
178
|
+
|> String.left 1
|
|
179
|
+
|> String.toLower
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
suits : List Suit
|
|
183
|
+
suits =
|
|
184
|
+
[ Spade, Heart, Diamond, Club ]
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
ranks : List Rank
|
|
188
|
+
ranks =
|
|
189
|
+
[ Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King ]
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
rankFromInt : Int -> Rank
|
|
193
|
+
rankFromInt i =
|
|
194
|
+
case i of
|
|
195
|
+
1 ->
|
|
196
|
+
Ace
|
|
197
|
+
|
|
198
|
+
2 ->
|
|
199
|
+
Two
|
|
200
|
+
|
|
201
|
+
3 ->
|
|
202
|
+
Three
|
|
203
|
+
|
|
204
|
+
4 ->
|
|
205
|
+
Four
|
|
206
|
+
|
|
207
|
+
5 ->
|
|
208
|
+
Five
|
|
209
|
+
|
|
210
|
+
6 ->
|
|
211
|
+
Six
|
|
212
|
+
|
|
213
|
+
7 ->
|
|
214
|
+
Seven
|
|
215
|
+
|
|
216
|
+
8 ->
|
|
217
|
+
Eight
|
|
218
|
+
|
|
219
|
+
9 ->
|
|
220
|
+
Nine
|
|
221
|
+
|
|
222
|
+
10 ->
|
|
223
|
+
Ten
|
|
224
|
+
|
|
225
|
+
11 ->
|
|
226
|
+
Jack
|
|
227
|
+
|
|
228
|
+
12 ->
|
|
229
|
+
Queen
|
|
230
|
+
|
|
231
|
+
_ ->
|
|
232
|
+
King
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
rankAsInt : Rank -> Int
|
|
236
|
+
rankAsInt r =
|
|
237
|
+
case r of
|
|
238
|
+
Ace ->
|
|
239
|
+
1
|
|
240
|
+
|
|
241
|
+
Two ->
|
|
242
|
+
2
|
|
243
|
+
|
|
244
|
+
Three ->
|
|
245
|
+
3
|
|
246
|
+
|
|
247
|
+
Four ->
|
|
248
|
+
4
|
|
249
|
+
|
|
250
|
+
Five ->
|
|
251
|
+
5
|
|
252
|
+
|
|
253
|
+
Six ->
|
|
254
|
+
6
|
|
255
|
+
|
|
256
|
+
Seven ->
|
|
257
|
+
7
|
|
258
|
+
|
|
259
|
+
Eight ->
|
|
260
|
+
8
|
|
261
|
+
|
|
262
|
+
Nine ->
|
|
263
|
+
9
|
|
264
|
+
|
|
265
|
+
Ten ->
|
|
266
|
+
10
|
|
267
|
+
|
|
268
|
+
Jack ->
|
|
269
|
+
11
|
|
270
|
+
|
|
271
|
+
Queen ->
|
|
272
|
+
12
|
|
273
|
+
|
|
274
|
+
King ->
|
|
275
|
+
13
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
printRank : CardModel -> String
|
|
279
|
+
printRank m =
|
|
280
|
+
case m of
|
|
281
|
+
Ranked rank _ ->
|
|
282
|
+
case rank of
|
|
283
|
+
Ten ->
|
|
284
|
+
"I0"
|
|
285
|
+
|
|
286
|
+
_ ->
|
|
287
|
+
rankAsString rank |> String.toUpper
|
|
288
|
+
|
|
289
|
+
Joker _ ->
|
|
290
|
+
"★"
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
rankAsChar : Rank -> String
|
|
294
|
+
rankAsChar r =
|
|
295
|
+
case r of
|
|
296
|
+
Ten ->
|
|
297
|
+
"0"
|
|
298
|
+
|
|
299
|
+
_ ->
|
|
300
|
+
rankAsString r
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
rankAsString : Rank -> String
|
|
304
|
+
rankAsString r =
|
|
305
|
+
case r of
|
|
306
|
+
Ace ->
|
|
307
|
+
"a"
|
|
308
|
+
|
|
309
|
+
Ten ->
|
|
310
|
+
"10"
|
|
311
|
+
|
|
312
|
+
Jack ->
|
|
313
|
+
"j"
|
|
314
|
+
|
|
315
|
+
Queen ->
|
|
316
|
+
"q"
|
|
317
|
+
|
|
318
|
+
King ->
|
|
319
|
+
"k"
|
|
320
|
+
|
|
321
|
+
_ ->
|
|
322
|
+
rankAsInt r
|
|
323
|
+
|> String.fromInt
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
parseRank : String -> Maybe Rank
|
|
327
|
+
parseRank r =
|
|
328
|
+
let
|
|
329
|
+
int =
|
|
330
|
+
String.toInt r
|
|
331
|
+
|
|
332
|
+
upper =
|
|
333
|
+
String.toUpper r
|
|
334
|
+
in
|
|
335
|
+
case int of
|
|
336
|
+
Just i ->
|
|
337
|
+
case i of
|
|
338
|
+
1 ->
|
|
339
|
+
Just Ace
|
|
340
|
+
|
|
341
|
+
2 ->
|
|
342
|
+
Just Two
|
|
343
|
+
|
|
344
|
+
3 ->
|
|
345
|
+
Just Three
|
|
346
|
+
|
|
347
|
+
4 ->
|
|
348
|
+
Just Four
|
|
349
|
+
|
|
350
|
+
5 ->
|
|
351
|
+
Just Five
|
|
352
|
+
|
|
353
|
+
6 ->
|
|
354
|
+
Just Six
|
|
355
|
+
|
|
356
|
+
7 ->
|
|
357
|
+
Just Seven
|
|
358
|
+
|
|
359
|
+
8 ->
|
|
360
|
+
Just Eight
|
|
361
|
+
|
|
362
|
+
9 ->
|
|
363
|
+
Just Nine
|
|
364
|
+
|
|
365
|
+
10 ->
|
|
366
|
+
Just Ten
|
|
367
|
+
|
|
368
|
+
0 ->
|
|
369
|
+
Just Ten
|
|
370
|
+
|
|
371
|
+
_ ->
|
|
372
|
+
Nothing
|
|
373
|
+
|
|
374
|
+
Nothing ->
|
|
375
|
+
case upper of
|
|
376
|
+
"J" ->
|
|
377
|
+
Just Jack
|
|
378
|
+
|
|
379
|
+
"Q" ->
|
|
380
|
+
Just Queen
|
|
381
|
+
|
|
382
|
+
"K" ->
|
|
383
|
+
Just King
|
|
384
|
+
|
|
385
|
+
"A" ->
|
|
386
|
+
Just Ace
|
|
387
|
+
|
|
388
|
+
_ ->
|
|
389
|
+
Nothing
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
parseSuit : String -> Maybe Suit
|
|
393
|
+
parseSuit s =
|
|
394
|
+
case String.toUpper s of
|
|
395
|
+
"S" ->
|
|
396
|
+
Just Spade
|
|
397
|
+
|
|
398
|
+
"D" ->
|
|
399
|
+
Just Diamond
|
|
400
|
+
|
|
401
|
+
"C" ->
|
|
402
|
+
Just Club
|
|
403
|
+
|
|
404
|
+
"H" ->
|
|
405
|
+
Just Heart
|
|
406
|
+
|
|
407
|
+
_ ->
|
|
408
|
+
Nothing
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
isJust : Maybe a -> Bool
|
|
412
|
+
isJust m =
|
|
413
|
+
case m of
|
|
414
|
+
Just _ ->
|
|
415
|
+
True
|
|
416
|
+
|
|
417
|
+
Nothing ->
|
|
418
|
+
False
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
parseCard : List Char -> List CardModel
|
|
422
|
+
parseCard chars =
|
|
423
|
+
let
|
|
424
|
+
mrank c =
|
|
425
|
+
parseRank <| String.fromChar c
|
|
426
|
+
|
|
427
|
+
msuit c =
|
|
428
|
+
parseSuit <| String.fromChar c
|
|
429
|
+
in
|
|
430
|
+
case chars of
|
|
431
|
+
[] ->
|
|
432
|
+
[]
|
|
433
|
+
|
|
434
|
+
[ c ] ->
|
|
435
|
+
case mrank c of
|
|
436
|
+
Just rank ->
|
|
437
|
+
List.map (\suit -> Ranked rank suit) suits
|
|
438
|
+
|
|
439
|
+
Nothing ->
|
|
440
|
+
if c == 'x' then
|
|
441
|
+
[ Joker True, Joker False ]
|
|
442
|
+
|
|
443
|
+
else
|
|
444
|
+
case msuit c of
|
|
445
|
+
Just suit ->
|
|
446
|
+
List.map (\rank -> Ranked rank suit) ranks
|
|
447
|
+
|> List.reverse
|
|
448
|
+
|
|
449
|
+
Nothing ->
|
|
450
|
+
[]
|
|
451
|
+
|
|
452
|
+
[ a, b ] ->
|
|
453
|
+
case ( mrank a, msuit b ) of
|
|
454
|
+
( Just rank, Just suit ) ->
|
|
455
|
+
[ Ranked rank suit ]
|
|
456
|
+
|
|
457
|
+
_ ->
|
|
458
|
+
case ( a, b ) of
|
|
459
|
+
( 'x', 'r' ) ->
|
|
460
|
+
[ Joker True ]
|
|
461
|
+
|
|
462
|
+
( 'x', 'b' ) ->
|
|
463
|
+
[ Joker False ]
|
|
464
|
+
|
|
465
|
+
_ ->
|
|
466
|
+
[]
|
|
467
|
+
|
|
468
|
+
_ ->
|
|
469
|
+
[]
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
parseCards : String -> List CardModel
|
|
473
|
+
parseCards s =
|
|
474
|
+
if s == "all" then
|
|
475
|
+
parseDeck "c d h s"
|
|
476
|
+
|
|
477
|
+
else
|
|
478
|
+
let
|
|
479
|
+
words =
|
|
480
|
+
String.split " " s
|
|
481
|
+
|> List.map String.toList
|
|
482
|
+
in
|
|
483
|
+
List.map parseCard words
|
|
484
|
+
|> List.concat
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
parseDeck : String -> List CardModel
|
|
488
|
+
parseDeck s =
|
|
489
|
+
s |> String.words |> List.map parseCards |> List.reverse |> List.concat
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
suitAsColor : Suit -> String
|
|
493
|
+
suitAsColor s =
|
|
494
|
+
case s of
|
|
495
|
+
Spade ->
|
|
496
|
+
"black"
|
|
497
|
+
|
|
498
|
+
Club ->
|
|
499
|
+
"black"
|
|
500
|
+
|
|
501
|
+
_ ->
|
|
502
|
+
"red"
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
modelAsColor : CardModel -> String
|
|
506
|
+
modelAsColor m =
|
|
507
|
+
case m of
|
|
508
|
+
Ranked _ suit ->
|
|
509
|
+
suitAsColor suit
|
|
510
|
+
|
|
511
|
+
Joker isRed ->
|
|
512
|
+
if isRed then
|
|
513
|
+
"red"
|
|
514
|
+
|
|
515
|
+
else
|
|
516
|
+
"black"
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
modelAsShort : CardModel -> String
|
|
520
|
+
modelAsShort m =
|
|
521
|
+
case m of
|
|
522
|
+
Ranked rank suit ->
|
|
523
|
+
rankAsChar rank ++ suitAsChar suit
|
|
524
|
+
|
|
525
|
+
Joker red ->
|
|
526
|
+
"x"
|
|
527
|
+
++ (if red then
|
|
528
|
+
"r"
|
|
529
|
+
|
|
530
|
+
else
|
|
531
|
+
"b"
|
|
532
|
+
)
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
defaultModel : CardModel
|
|
536
|
+
defaultModel =
|
|
537
|
+
Ranked Ace Spade
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
modelUsing : CardModel -> List String
|
|
541
|
+
modelUsing m =
|
|
542
|
+
case m of
|
|
543
|
+
Ranked rank suit ->
|
|
544
|
+
[ modelAsShort m
|
|
545
|
+
, rankAsChar rank
|
|
546
|
+
, suitAsString suit
|
|
547
|
+
]
|
|
548
|
+
|
|
549
|
+
Joker _ ->
|
|
550
|
+
[ modelAsShort m
|
|
551
|
+
, "x"
|
|
552
|
+
]
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
modelDecoder : Decoder CardModel
|
|
556
|
+
modelDecoder =
|
|
557
|
+
D.string
|
|
558
|
+
|> D.andThen
|
|
559
|
+
(\str ->
|
|
560
|
+
case List.head <| parseCards str of
|
|
561
|
+
Just card ->
|
|
562
|
+
D.succeed card
|
|
563
|
+
|
|
564
|
+
Nothing ->
|
|
565
|
+
D.fail ""
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
encodeModel : CardModel -> Value
|
|
570
|
+
encodeModel m =
|
|
571
|
+
string <| modelAsShort m
|