summaryrefslogtreecommitdiff
path: root/src/gizmo/wasp-tcg.el
diff options
context:
space:
mode:
Diffstat (limited to 'src/gizmo/wasp-tcg.el')
-rw-r--r--src/gizmo/wasp-tcg.el115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/gizmo/wasp-tcg.el b/src/gizmo/wasp-tcg.el
new file mode 100644
index 00000000..b989eb31
--- /dev/null
+++ b/src/gizmo/wasp-tcg.el
@@ -0,0 +1,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