520 lines
7.7 KiB
Python
520 lines
7.7 KiB
Python
from toontown.suit import SuitDNA
|
|
from toontown.toonbase import TTLocalizer
|
|
from otp.otpbase import OTPGlobals
|
|
from enum import IntEnum
|
|
PartsPerSuit = (17,
|
|
14,
|
|
12,
|
|
10)
|
|
PartsPerSuitBitmasks = (131071,
|
|
130175,
|
|
56447,
|
|
56411)
|
|
AllBits = 131071
|
|
MinPartLoss = 2
|
|
MaxPartLoss = 4
|
|
MeritsPerLevel = ((100,
|
|
130,
|
|
160,
|
|
190,
|
|
800),
|
|
(160,
|
|
210,
|
|
260,
|
|
310,
|
|
1300),
|
|
(260,
|
|
340,
|
|
420,
|
|
500,
|
|
2100),
|
|
(420,
|
|
550,
|
|
680,
|
|
810,
|
|
3400),
|
|
(680,
|
|
890,
|
|
1100,
|
|
1310,
|
|
5500),
|
|
(1100,
|
|
1440,
|
|
1780,
|
|
2120,
|
|
8900),
|
|
(1780,
|
|
2330,
|
|
2880,
|
|
3430,
|
|
14400),
|
|
(2880,
|
|
3770,
|
|
4660,
|
|
5500,
|
|
23300,
|
|
2880,
|
|
23300,
|
|
2880,
|
|
3770,
|
|
4660,
|
|
5500,
|
|
23300,
|
|
2880,
|
|
3770,
|
|
4660,
|
|
5500,
|
|
6440,
|
|
7330,
|
|
8220,
|
|
9110,
|
|
10000,
|
|
23300,
|
|
2880,
|
|
3770,
|
|
4660,
|
|
5500,
|
|
6440,
|
|
7330,
|
|
8220,
|
|
9110,
|
|
10000,
|
|
23300,
|
|
2880,
|
|
3770,
|
|
4660,
|
|
5500,
|
|
6440,
|
|
7330,
|
|
8220,
|
|
9110,
|
|
10000,
|
|
23300,
|
|
0),
|
|
(60,
|
|
80,
|
|
100,
|
|
120,
|
|
500),
|
|
(100,
|
|
130,
|
|
160,
|
|
190,
|
|
800),
|
|
(160,
|
|
210,
|
|
260,
|
|
310,
|
|
1300),
|
|
(260,
|
|
340,
|
|
420,
|
|
500,
|
|
2100),
|
|
(420,
|
|
550,
|
|
680,
|
|
810,
|
|
3400),
|
|
(680,
|
|
890,
|
|
1100,
|
|
1310,
|
|
5500),
|
|
(1100,
|
|
1440,
|
|
1780,
|
|
2120,
|
|
8900),
|
|
(1780,
|
|
2330,
|
|
2880,
|
|
3430,
|
|
14400,
|
|
1780,
|
|
14400,
|
|
1780,
|
|
2330,
|
|
2880,
|
|
3430,
|
|
14400,
|
|
1780,
|
|
2330,
|
|
2880,
|
|
3430,
|
|
3980,
|
|
4530,
|
|
5080,
|
|
5630,
|
|
6180,
|
|
14400,
|
|
1780,
|
|
2330,
|
|
2880,
|
|
3430,
|
|
3980,
|
|
4530,
|
|
5080,
|
|
5630,
|
|
6180,
|
|
14400,
|
|
1780,
|
|
2330,
|
|
2880,
|
|
3430,
|
|
3980,
|
|
4530,
|
|
5080,
|
|
5630,
|
|
6180,
|
|
14400,
|
|
0),
|
|
(40,
|
|
50,
|
|
60,
|
|
70,
|
|
300),
|
|
(60,
|
|
80,
|
|
100,
|
|
120,
|
|
500),
|
|
(100,
|
|
130,
|
|
160,
|
|
190,
|
|
800),
|
|
(160,
|
|
210,
|
|
260,
|
|
310,
|
|
1300),
|
|
(260,
|
|
340,
|
|
420,
|
|
500,
|
|
2100),
|
|
(420,
|
|
550,
|
|
680,
|
|
810,
|
|
3400),
|
|
(680,
|
|
890,
|
|
1100,
|
|
1310,
|
|
5500),
|
|
(1100,
|
|
1440,
|
|
1780,
|
|
2120,
|
|
8900,
|
|
1100,
|
|
8900,
|
|
1100,
|
|
1440,
|
|
1780,
|
|
2120,
|
|
8900,
|
|
1100,
|
|
1440,
|
|
1780,
|
|
2120,
|
|
2460,
|
|
2800,
|
|
3140,
|
|
3480,
|
|
3820,
|
|
8900,
|
|
1100,
|
|
1440,
|
|
1780,
|
|
2120,
|
|
2460,
|
|
2800,
|
|
3140,
|
|
3480,
|
|
3820,
|
|
8900,
|
|
1100,
|
|
1440,
|
|
1780,
|
|
2120,
|
|
2460,
|
|
2800,
|
|
3140,
|
|
3480,
|
|
3820,
|
|
8900,
|
|
0),
|
|
(20,
|
|
30,
|
|
40,
|
|
50,
|
|
200),
|
|
(40,
|
|
50,
|
|
60,
|
|
70,
|
|
300),
|
|
(60,
|
|
80,
|
|
100,
|
|
120,
|
|
500),
|
|
(100,
|
|
130,
|
|
160,
|
|
190,
|
|
800),
|
|
(160,
|
|
210,
|
|
260,
|
|
310,
|
|
1300),
|
|
(260,
|
|
340,
|
|
420,
|
|
500,
|
|
2100),
|
|
(420,
|
|
550,
|
|
680,
|
|
810,
|
|
3400),
|
|
(680,
|
|
890,
|
|
1100,
|
|
1310,
|
|
5500,
|
|
680,
|
|
5500,
|
|
680,
|
|
890,
|
|
1100,
|
|
1310,
|
|
5500,
|
|
680,
|
|
890,
|
|
1100,
|
|
1310,
|
|
1520,
|
|
1730,
|
|
1940,
|
|
2150,
|
|
2360,
|
|
5500,
|
|
680,
|
|
890,
|
|
1100,
|
|
1310,
|
|
1520,
|
|
1730,
|
|
1940,
|
|
2150,
|
|
2360,
|
|
5500,
|
|
680,
|
|
890,
|
|
1100,
|
|
1310,
|
|
1520,
|
|
1730,
|
|
1940,
|
|
2150,
|
|
2360,
|
|
5500,
|
|
0))
|
|
leftLegUpper = 1
|
|
leftLegLower = 2
|
|
leftLegFoot = 4
|
|
rightLegUpper = 8
|
|
rightLegLower = 16
|
|
rightLegFoot = 32
|
|
torsoLeftShoulder = 64
|
|
torsoRightShoulder = 128
|
|
torsoChest = 256
|
|
torsoHealthMeter = 512
|
|
torsoPelvis = 1024
|
|
leftArmUpper = 2048
|
|
leftArmLower = 4096
|
|
leftArmHand = 8192
|
|
rightArmUpper = 16384
|
|
rightArmLower = 32768
|
|
rightArmHand = 65536
|
|
upperTorso = torsoLeftShoulder
|
|
leftLegIndex = 0
|
|
rightLegIndex = 1
|
|
torsoIndex = 2
|
|
leftArmIndex = 3
|
|
rightArmIndex = 4
|
|
PartsQueryShifts = (leftLegUpper,
|
|
rightLegUpper,
|
|
torsoLeftShoulder,
|
|
leftArmUpper,
|
|
rightArmUpper)
|
|
PartsQueryMasks = (leftLegFoot + leftLegLower + leftLegUpper,
|
|
rightLegFoot + rightLegLower + rightLegUpper,
|
|
torsoPelvis + torsoHealthMeter + torsoChest + torsoRightShoulder + torsoLeftShoulder,
|
|
leftArmHand + leftArmLower + leftArmUpper,
|
|
rightArmHand + rightArmLower + rightArmUpper)
|
|
PartNameStrings = TTLocalizer.CogPartNames
|
|
SimplePartNameStrings = TTLocalizer.CogPartNamesSimple
|
|
PartsQueryNames = ({1: PartNameStrings[0],
|
|
2: PartNameStrings[1],
|
|
4: PartNameStrings[2],
|
|
8: PartNameStrings[3],
|
|
16: PartNameStrings[4],
|
|
32: PartNameStrings[5],
|
|
64: PartNameStrings[6],
|
|
128: PartNameStrings[7],
|
|
256: PartNameStrings[8],
|
|
512: PartNameStrings[9],
|
|
1024: PartNameStrings[10],
|
|
2048: PartNameStrings[11],
|
|
4096: PartNameStrings[12],
|
|
8192: PartNameStrings[13],
|
|
16384: PartNameStrings[14],
|
|
32768: PartNameStrings[15],
|
|
65536: PartNameStrings[16]},
|
|
{1: PartNameStrings[0],
|
|
2: PartNameStrings[1],
|
|
4: PartNameStrings[2],
|
|
8: PartNameStrings[3],
|
|
16: PartNameStrings[4],
|
|
32: PartNameStrings[5],
|
|
64: SimplePartNameStrings[0],
|
|
128: SimplePartNameStrings[0],
|
|
256: SimplePartNameStrings[0],
|
|
512: SimplePartNameStrings[0],
|
|
1024: PartNameStrings[10],
|
|
2048: PartNameStrings[11],
|
|
4096: PartNameStrings[12],
|
|
8192: PartNameStrings[13],
|
|
16384: PartNameStrings[14],
|
|
32768: PartNameStrings[15],
|
|
65536: PartNameStrings[16]},
|
|
{1: PartNameStrings[0],
|
|
2: PartNameStrings[1],
|
|
4: PartNameStrings[2],
|
|
8: PartNameStrings[3],
|
|
16: PartNameStrings[4],
|
|
32: PartNameStrings[5],
|
|
64: SimplePartNameStrings[0],
|
|
128: SimplePartNameStrings[0],
|
|
256: SimplePartNameStrings[0],
|
|
512: SimplePartNameStrings[0],
|
|
1024: PartNameStrings[10],
|
|
2048: PartNameStrings[11],
|
|
4096: PartNameStrings[12],
|
|
8192: PartNameStrings[12],
|
|
16384: PartNameStrings[14],
|
|
32768: PartNameStrings[15],
|
|
65536: PartNameStrings[15]},
|
|
{1: PartNameStrings[0],
|
|
2: PartNameStrings[1],
|
|
4: PartNameStrings[1],
|
|
8: PartNameStrings[3],
|
|
16: PartNameStrings[4],
|
|
32: PartNameStrings[4],
|
|
64: SimplePartNameStrings[0],
|
|
128: SimplePartNameStrings[0],
|
|
256: SimplePartNameStrings[0],
|
|
512: SimplePartNameStrings[0],
|
|
1024: PartNameStrings[10],
|
|
2048: PartNameStrings[11],
|
|
4096: PartNameStrings[12],
|
|
8192: PartNameStrings[12],
|
|
16384: PartNameStrings[14],
|
|
32768: PartNameStrings[15],
|
|
65536: PartNameStrings[15]})
|
|
suitTypes = IntEnum('suitTypes', ('NoSuit', 'NoMerits', 'FullSuit'), start=0)
|
|
|
|
def getNextPart(parts, partIndex, dept):
|
|
dept = dept2deptIndex(dept)
|
|
needMask = PartsPerSuitBitmasks[dept] & PartsQueryMasks[partIndex]
|
|
haveMask = parts[dept] & PartsQueryMasks[partIndex]
|
|
nextPart = ~needMask | haveMask
|
|
nextPart = nextPart ^ nextPart + 1
|
|
nextPart = nextPart + 1 >> 1
|
|
return nextPart
|
|
|
|
|
|
def getPartName(partArray):
|
|
index = 0
|
|
for part in partArray:
|
|
if part:
|
|
return PartsQueryNames[index][part]
|
|
index += 1
|
|
|
|
|
|
def isSuitComplete(parts, dept):
|
|
dept = dept2deptIndex(dept)
|
|
for p in range(len(PartsQueryMasks)):
|
|
if getNextPart(parts, p, dept):
|
|
return 0
|
|
|
|
return 1
|
|
|
|
|
|
def isPaidSuitComplete(av, parts, dept):
|
|
isPaid = 0
|
|
base = getBase()
|
|
if av and av.getGameAccess() == OTPGlobals.AccessFull:
|
|
isPaid = 1
|
|
if isPaid:
|
|
if isSuitComplete(parts, dept):
|
|
return 1
|
|
return 0
|
|
|
|
|
|
def getTotalMerits(toon, index):
|
|
from toontown.battle import SuitBattleGlobals
|
|
cogIndex = toon.cogTypes[index] + SuitDNA.suitsPerDept * index
|
|
cogTypeStr = SuitDNA.suitHeadTypes[cogIndex]
|
|
cogBaseLevel = SuitBattleGlobals.SuitAttributes[cogTypeStr]['level']
|
|
cogLevel = toon.cogLevels[index] - cogBaseLevel
|
|
cogLevel = max(min(cogLevel, len(MeritsPerLevel[cogIndex]) - 1), 0)
|
|
return MeritsPerLevel[cogIndex][cogLevel]
|
|
|
|
|
|
def getTotalParts(bitString, shiftWidth = 32):
|
|
sum = 0
|
|
for shift in range(0, shiftWidth):
|
|
sum = sum + (bitString >> shift & 1)
|
|
|
|
return sum
|
|
|
|
|
|
def asBitstring(number):
|
|
array = []
|
|
shift = 0
|
|
if number == 0:
|
|
array.insert(0, '0')
|
|
while pow(2, shift) <= number:
|
|
if number >> shift & 1:
|
|
array.insert(0, '1')
|
|
else:
|
|
array.insert(0, '0')
|
|
shift += 1
|
|
|
|
str = ''
|
|
for i in range(0, len(array)):
|
|
str = str + array[i]
|
|
|
|
return str
|
|
|
|
|
|
def asNumber(bitstring):
|
|
num = 0
|
|
for i in range(0, len(bitstring)):
|
|
if bitstring[i] == '1':
|
|
num += pow(2, len(bitstring) - 1 - i)
|
|
|
|
return num
|
|
|
|
|
|
def dept2deptIndex(dept):
|
|
if type(dept) == str:
|
|
dept = SuitDNA.suitDepts.index(dept)
|
|
return dept
|