From 62b57cb5041d1e031ec231d35b31f17983b673b9 Mon Sep 17 00:00:00 2001 From: John Cote Date: Sun, 8 Sep 2024 21:34:16 -0400 Subject: [PATCH] otpgo: Add ToonDNA.lua --- otpgo/lua/ToonDNA.lua | 185 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 otpgo/lua/ToonDNA.lua diff --git a/otpgo/lua/ToonDNA.lua b/otpgo/lua/ToonDNA.lua new file mode 100644 index 0000000..61d66d8 --- /dev/null +++ b/otpgo/lua/ToonDNA.lua @@ -0,0 +1,185 @@ +NumToColor = { + 'White', 'Peach', 'Bright Red', 'Red', 'Maroon', 'Sienna', 'Brown', 'Tan', + 'Coral', 'Orange', 'Yellow', 'Cream', 'Citrine', 'Lime', 'Sea Green', + 'Green', 'Light Blue', 'Aqua', 'Blue', 'Periwinkle', 'Royal Blue', + 'Slate Blue', 'Purple', 'Lavender', 'Pink', 'Plum', 'Black' +} + +AnimalToSpecies = { + dog = 'Dog', + cat = 'Cat', + mouse = 'Mouse', + horse = 'Horse', + rabbit = 'Rabbit', + duck = 'Duck', + monkey = 'Monkey', + bear = 'Bear', + pig = 'Pig' +} + +toonHeadTypes = {'dls', + 'dss', + 'dsl', + 'dll', + 'cls', + 'css', + 'csl', + 'cll', + 'hls', + 'hss', + 'hsl', + 'hll', + 'mls', + 'mss', + 'rls', + 'rss', + 'rsl', + 'rll', + 'fls', + 'fss', + 'fsl', + 'fll', + 'pls', + 'pss', + 'psl', + 'pll', + 'bls', + 'bss', + 'bsl', + 'bll', + 'sls', + 'sss', + 'ssl', + 'sll'} + +toonHeadTypeToAnimalName = { + d = 'dog', + c = 'cat', + m = 'mouse', + h = 'horse', + r = 'rabbit', + f = 'duck', + p = 'monkey', + b = 'bear', + s = 'pig' +} + +-- DNA validation: +DNA_FIRST_CHAR = "t" +DNA_LENGTH = 15 + +DNA_MAX_HEAD_INDEX = 34 +DNA_MAX_TORSO_INDEX = 9 +DNA_MAX_LEG_INDEX = 3 + +DNA_MAX_SHIRTS = 151 +DNA_MAX_CLOTHING_COLORS = 31 +DNA_MAX_SLEEVES = 138 + +DNA_MAX_MALE_BOTTOMS = 58 +DNA_MAX_FEMALE_BOTTOMS = 63 + +DNA_MAX_COLOR = 27 + +function isValidNetString(dnaString) + local validDna = true + + local dg = datagram:new() + dg:addString(dnaString) + + local _dgi = datagramiterator.new(dg) + _dgi:readUint16() -- length, unused + + if _dgi:getRemainingSize() ~= DNA_LENGTH then + validDna = false + end + + if _dgi:readFixedString(1) ~= DNA_FIRST_CHAR then + validDna = false + end + + -- headIndex + local headIndex = _dgi:readUint8() + if headIndex >= DNA_MAX_HEAD_INDEX then + validDna = false + end + + -- torsoIndex + if _dgi:readUint8() >= DNA_MAX_TORSO_INDEX then + validDna = false + end + + -- legsIndex + if _dgi:readUint8() >= DNA_MAX_LEG_INDEX then + validDna = false + end + + -- gender + local validForGender + + if _dgi:readUint8() == 1 then + validForGender = DNA_MAX_MALE_BOTTOMS + else + validForGender = DNA_MAX_FEMALE_BOTTOMS + end + + local topTex = _dgi:readUint8() + local topTexColor = _dgi:readUint8() + local sleeveTex = _dgi:readUint8() + local sleeveTexColor = _dgi:readUint8() + local botTex = _dgi:readUint8() + local botTexColor = _dgi:readUint8() + local armColor = _dgi:readUint8() + local gloveColor = _dgi:readUint8() + local legColor = _dgi:readUint8() + local headColor = _dgi:readUint8() + + -- Shirts + if topTex >= DNA_MAX_SHIRTS then + validDna = false + end + + -- ClothesColors + if topTexColor >= DNA_MAX_CLOTHING_COLORS then + validDna = false + end + + -- Sleeves + if sleeveTex >= DNA_MAX_SLEEVES then + validDna = false + end + + -- ClothesColors + if sleeveTexColor >= DNA_MAX_CLOTHING_COLORS then + validDna = false + end + + if botTex >= validForGender then + validDna = false + end + + -- ClothesColors + if botTexColor >= DNA_MAX_CLOTHING_COLORS then + validDna = false + end + + -- allColorsList + if armColor >= DNA_MAX_COLOR then + validDna = false + end + + if gloveColor ~= 0 then + validDna = false + end + + if legColor >= DNA_MAX_COLOR then + validDna = false + end + + if headColor >= DNA_MAX_COLOR then + validDna = false + end + + local head = toonHeadTypes[headIndex + 1] + return validDna, {headColor + 1, toonHeadTypeToAnimalName[head:sub(1, 1)]} +end