summaryrefslogtreecommitdiff
path: root/src/gizmo/wasp-tcg.el
blob: b989eb313b843a08ba486cac6c827456636e1e9f (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
;;; wasp-tcg --- trading card game -*- lexical-binding: t; -*-
;;; Commentary:
;;; Code:

(require 'cl-lib)
(require 'ht)
(require 'f)

(require 'wasp-twitch)
(require 'wasp-user)

(defconst w/tcg-bases
  (-map #'f-base
    (f-entries "/home/llll/src/newton/crates/renderer/src/assets/textures/tcg/bases")))

(defvar w/tcg-request-sequence 0)
(defvar w/tcg-request-handlers (ht-create))

(cl-defstruct (w/tcg-card (:constructor w/make-tcg-card))
  name
  type
  depicted-subject
  element
  color
  faction
  equity
  boost-level
  rarity
  rarity-level
  body-text
  base-image-name
  flags ;; comma-separated strings: inverse, etc.
  )

(defun w/tcg-determine-rarity ()
  "Return a rarity level."
  (let ((ret 0))
    (while (= (random 2) 0)
      (cl-incf ret))
    ret))

(defun w/tcg-render-rarity (r)
  "Convert rarity R to a string."
  (cond
    ((= 0 r) "C")
    ((= 1 r) "R")
    (t (s-concat (s-repeat (- r 1) "S") "R"))))

(defun w/tcg-pick-flags (u)
  "Return flags for the user U."
  (ignore u)
  (-concat
    (when (= (random 20) 0) (list "inverse"))))

(defun w/tcg-random-user-card (k)
  "Generate a random `w/tcg-card' and pass it to K."
  (let* ( (users (-map #'car w/twitch-chat-history))
          (name (w/pick-random users))
          (ud (w/user-cache-get name))
          (element (alist-get :element ud))
          (colornm (or (cadr (alist-get element w/user-elements nil nil #'s-equals?)) "grey"))
          (color (w/color-value-to-html-code (color-values colornm)))
          (faction (format "%s" (or (alist-get :faction ud) 'none)))
          (equity (format "%s" (or (alist-get :equity ud) 0)))
          (boost-level (format "%s" (or (alist-get :boost ud) "ABSTAINER")))
          (rarity-level (w/tcg-determine-rarity))
          (rarity (w/tcg-render-rarity rarity-level)))
    (funcall k
      (w/make-tcg-card
        :name name
        :type "user"
        :depicted-subject name
        :element (or element "neutral")
        :color color
        :faction faction
        :equity equity
        :boost-level boost-level
        :rarity rarity
        :rarity-level (format "%s" rarity-level)
        :body-text ""
        :base-image-name (w/pick-random w/tcg-bases)
        :flags (s-join "," (w/tcg-pick-flags ud))))
    nil))

(defun w/tcg-encode-card (c)
  "Encode C to a string."
  (s-join "\t"
    (list
      (w/. name c)
      (w/. type c)
      (w/. depicted-subject c)
      (w/. element c)
      (w/. color c)
      (w/. faction c)
      (w/. equity c)
      (w/. boost-level c)
      (w/. rarity c)
      (w/. rarity-level c)
      (w/. body-text c)
      (w/. base-image-name c)
      (w/. flags c))))

(defun w/tcg-generate-card (c k)
  "Generate the card C.
Pass the resulting PNG to K."
  (let* ( (seq (cl-incf w/tcg-request-sequence))
          (msg (format "%s\t%s" seq (w/tcg-encode-card c))))
    (ht-set w/tcg-request-handlers seq
      (lambda (resp)
        (ht-remove w/tcg-request-handlers seq)
        (funcall k resp)))
    (w/binary-pub "overlay tcg generate" msg)))

(provide 'wasp-tcg)
;;; wasp-tcg.el ends here