open-toontown/otpgo/lua/ToonDNA.lua

186 lines
3.5 KiB
Lua

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