summaryrefslogtreecommitdiffstats
path: root/Scripts/emotes_v2.py
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-07-23 22:53:08 -0700
committeryum <yum.food.vr@gmail.com>2025-07-23 22:53:08 -0700
commit4539f87e36cb3ca554e1e174c19206b552107c57 (patch)
tree6f9aca818989773cc10f3c465224a07f847eb279 /Scripts/emotes_v2.py
parentf6b93a20d754579008076e85f5c0a97e1bcbc258 (diff)
Delete unused filesv1.0.0-beta00
Diffstat (limited to 'Scripts/emotes_v2.py')
-rw-r--r--Scripts/emotes_v2.py149
1 files changed, 0 insertions, 149 deletions
diff --git a/Scripts/emotes_v2.py b/Scripts/emotes_v2.py
deleted file mode 100644
index a9c037f..0000000
--- a/Scripts/emotes_v2.py
+++ /dev/null
@@ -1,149 +0,0 @@
-#!/usr/bin/env python3
-
-import argparse
-import os
-import pickle
-import sys
-
-from math import floor
-from PIL import Image
-from typing import Any, Dict, List, Tuple
-
-# The character range [0x0000, 0xDFFF] is reserved for text.
-# The range [0xE000, infinity) is left over for emotes.
-EMOTES_LETTER_OFFSET = 0xE000
-EMOTES_HEIGHT = 512
-EMOTES_TEX_SZ = 4096
-
-def superimpose_image(base_img: Image, overlay_img: Image, position: Tuple[int, int]) -> Image:
- base_img.paste(overlay_img, position, overlay_img)
- return base_img
-
-def i_to_pos(i, sm_wd, sm_ht, big_wd, big_ht) -> Tuple[int, int]:
- x = i * sm_wd % big_wd
- row = floor((i * sm_wd) / big_wd)
- y = row * sm_ht
- return int(x), int(y)
-
-def get_images_from_directory(directory_path: str) -> List[Tuple[Any, str]]:
- images = []
- for filename in os.listdir(directory_path):
- file_path = os.path.join(directory_path, filename)
- if os.path.isfile(file_path) and file_path.endswith(".png"):
- image = Image.open(file_path).convert("RGBA")
- name = os.path.basename(filename).split('.')[0]
- images.append((image, name))
- return images
-
-def split_resized_image(img, wd: int, ht: int) -> List[Any]:
- aspect_ratio = img.width / img.height
- width = int(ht * aspect_ratio)
- img = img.resize((width, ht))
-
- split_images = []
- for i in range(0, img.width, wd):
- split_image = img.crop((i, 0, i + wd, ht))
- split_images.append(split_image)
-
- return split_images
-
-def resize_image_with_aspect_ratio(img: Image, aspect_ratio: float) -> Image:
- original_width, original_height = img.size
- new_width = int(original_height * aspect_ratio)
- new_height = original_height
- return img.resize((new_width, new_height))
-
-def resize_image_to_height(img: Image, height: int) -> Image:
- aspect_ratio = img.width / img.height
- new_width = int(height * aspect_ratio)
- return img.resize((new_width, height))
-
-class EmotesState:
- def __init__(self):
- self.bits = {}
-
- def load(self, pickle_path):
- try:
- with open(pickle_path, 'rb') as f:
- self.bits = pickle.load(f)
- except FileNotFoundError:
- print(f"Emotes map does not exist at {pickle_path}",
- file=sys.stderr)
-
- # This is quite slow since we do a search and replace (O(n))
- # for each keyword O(m) times each variant of said keyword (O(k)).
- # Thus total complexity is O(m*n*k). All three of these numbers are
- # typically small: m and k typically < 10, n typically < 200.
- #
- # Naively one might split the input into words, but this only works for
- # English-like languages. Eastern Asian languages like Japanese don't
- # really divide into words AFAIK so this wouldn't work for them.
- #
- # Unless the performance becomes a user-reported problem, stick with this
- # inefficient but reliable method.
- def encode_emotes(self, msg: str):
- for keyword, bits in self.bits.items():
- bits_str = ""
- for bit in bits:
- bits_str += chr(bit)
- # ALL CAPS
- tmp = keyword.upper()
- msg = msg.replace(tmp, bits_str)
- # lowercase
- tmp = keyword.lower()
- msg = msg.replace(tmp, bits_str)
- # Capitalized
- tmp = keyword.lower().capitalize()
- msg = msg.replace(tmp, bits_str)
- # dashes inserted
- tmp = '-'.join(keyword.upper())
- msg = msg.replace(tmp, bits_str)
- # uppercase, spaces inserted
- tmp = ' '.join(keyword.upper())
- msg = msg.replace(tmp, bits_str)
- # lowercase, spaces inserted
- tmp = ' '.join(keyword.lower())
- msg = msg.replace(tmp, bits_str)
- # uppercase, commas and spaces inserted
- tmp = ', '.join(keyword.upper())
- msg = msg.replace(tmp, bits_str)
- return msg
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument("dir", type=str, help="directory to get images from")
- parser.add_argument("board_aspect_ratio", help="aspect ratio of a cell in the board")
- parser.add_argument("texture_aspect_ratio", help="aspect ratio of a cell in the texture")
- parser.add_argument("tex_path", type=str, help="path to save the texture to")
- parser.add_argument("pickle_path", type=str, help="path to save the texture index to")
- args = parser.parse_args()
-
- directory_path = args.dir
- board_aspect_ratio = int(args.board_aspect_ratio)
- texture_aspect_ratio = int(args.texture_aspect_ratio)
-
- base_img = Image.new("RGBA", (EMOTES_TEX_SZ, EMOTES_TEX_SZ), (0, 0, 0, 0))
- images_and_filenames = get_images_from_directory(directory_path)
- i = 0
- bits = {} # Dict[str, List[int]]
- for img, filename in images_and_filenames:
- print(f"Adding {filename}")
- img = resize_image_with_aspect_ratio(img, board_aspect_ratio)
- img = resize_image_to_height(img, EMOTES_HEIGHT)
- img_fragments = split_resized_image(img, int(EMOTES_HEIGHT / texture_aspect_ratio), EMOTES_HEIGHT)
- img_bits = [] # List[int]
- for img_fragment in img_fragments:
- i = i + 1
- img_pos = i_to_pos(i,
- EMOTES_HEIGHT / texture_aspect_ratio, EMOTES_HEIGHT,
- EMOTES_TEX_SZ, EMOTES_TEX_SZ)
- print(f"{img_pos}")
- superimpose_image(base_img, img_fragment, img_pos)
- img_bits.append(EMOTES_LETTER_OFFSET + i)
- emote_name = os.path.basename(filename).split('.')[0]
- print(f"{emote_name} -> {img_bits}")
- bits[emote_name] = img_bits
- base_img.save(args.tex_path)
- with open(args.pickle_path, 'wb') as f:
- pickle.dump(bits, f)
-