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
|