summaryrefslogtreecommitdiff
blob: 16d0bf7cafc8229818cc082c7c930fd3b8aa06ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
(fate_version 1)

(declare_structure card
   (text name)
   (int number)
   (int score)
)

(local (lambda (list card) (string)) card_generator)

(set card_generator
   (lambda ( (string family) )
      (map
         (lambda
            (
               (int number)
               (string family)
            )
         )
         (set_fields (default card)
            (number (var number))
            (name
               (text
                  (switch (var number)
                     (1 Ace)
                     (11 Jack)
                     (12 Queen)
                     (13 Kind)
                     (cast string (var number))
                  )
                  of (var name)
               )
            )
            (score (max 10 number))
         )
         (range 1 13 1)
         (var family)
      )
   )
)

(global (list card) deck_template)

(add_all! (eval card_generator Hearts) deck_template)
(add_all! (eval card_generator Spades) deck_template)
(add_all! (eval card_generator Diamonds) deck_template)
(add_all! (eval card_generator Clubs) deck_template)

(define_sequence compute_score (((ptr (list card)) deck) ((ptr int) result))
   (local int aces_count)
   (local int maybe_better_score)

   (set (at result) 0)

   (foreach (at deck) card
      (set (at result) (+ card.score (at result)))
      (if (= card.number 1)
         (set aces_count (+ aces_count 1))
      )
   )

   (while (> aces_count 0)
      (set maybe_better_score (+ (at result) 10))
      (if (=< maybe_better_score 21)
         (set (at result) (var maybe_better_score))
      )
      (set aces_count (- aces_count 1))
   )
)