diff options
Diffstat (limited to 'src/gizmo/wasp-tcg.el')
| -rw-r--r-- | src/gizmo/wasp-tcg.el | 115 |
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 |
