from direct.directnotify import DirectNotifyGlobal from toontown.toonbase import TTLocalizer from panda3d.core import * from .KartShopGlobals import * from enum import IntEnum if (__debug__): import pdb import copy KartDNA = IntEnum('KartDNA', ('bodyType', 'bodyColor', 'accColor', 'ebType', 'spType', 'fwwType', 'bwwType', 'rimsType', 'decalType'), start=0) InvalidEntry = -1 KartInfo = IntEnum('KartInfo', ('name', 'model', 'cost', 'viewDist', 'decalId', 'LODmodel1', 'LODmodel2'), start=0) AccInfo = IntEnum('AccInfo', ('name', 'model', 'cost', 'texCard', 'attach'), start=0) kNames = TTLocalizer.KartDNA_KartNames KartDict = {0: (kNames[0], 'phase_6/models/karting/Kart1_Final', 100, 7.0, 'kart1', 'phase_6/models/karting/Kart1_LOD_Final', 'phase_6/models/karting/Kart1_LOD_Final', (Point3(1.5, 8.0, -0.5), Point3(1.5, 0.0, 2.0))), 1: (kNames[1], 'phase_6/models/karting/Kart2_Final', 7500, 7.0, 'kart2', 'phase_6/models/karting/Kart2_LOD2_Final', 'phase_6/models/karting/Kart2_LOD3_Final', (Point3(0.25, 7, -2), Point3(1.25, -3, 0))), 2: (kNames[2], 'phase_6/models/karting/Kart3_Final', 2500, 8.5, 'kart3', 'phase_6/models/karting/Kart3_Final_LOD2', 'phase_6/models/karting/Kart3_Final_LOD3', (Point3(1.25, 4.0, 1.0), Point3(1.25, -3.0, 2.5)))} aNames = TTLocalizer.KartDNA_AccNames AccessoryDict = {0: (aNames[1000], 'phase_6/models/karting/accessory_frontMiddle_0', 200, 'accessory_frontMiddle_0_gui', 'ebNode_0'), 1: (aNames[1001], 'phase_6/models/karting/accessory_frontMiddle_1', 1250, 'accessory_frontMiddle_1_gui', 'ebNode_0'), 2: (aNames[1002], 'phase_6/models/karting/accessory_frontMiddle_2', 450, 'accessory_frontMiddle_2_gui', 'ebNode_1'), 3: (aNames[1003], 'phase_6/models/karting/accessory_frontMiddle_3', 5000, 'accessory_frontMiddle_3_gui', 'ebNode_1'), 4: (aNames[1004], 'phase_6/models/karting/accessory_frontMiddle_4', 800, 'accessory_frontMiddle_4_gui', 'ebNode_0'), 5: (aNames[1005], 'phase_6/models/karting/accessory_frontMiddle_5', 200, 'accessory_frontMiddle_5_gui', 'ebNode_0'), 6: (aNames[1006], 'phase_6/models/karting/accessory_frontMiddle_6', 450, 'accessory_frontMiddle_6_gui', 'ebNode_0'), 7: (aNames[1007], 'phase_6/models/karting/accessory_frontMiddle_7', 800, 'accessory_frontMiddle_7_gui', 'ebNode_0'), 8: (aNames[1008], 'phase_6/models/karting/accessory_frontMiddle_8', 200, 'accessory_frontMiddle_8_gui', 'ebNode_1'), 9: (aNames[1009], 'phase_6/models/karting/accessory_frontMiddle_9', 800, 'accessory_frontMiddle_9_gui', 'ebNode_1'), 10: (aNames[1010], 'phase_6/models/karting/accessory_frontMiddle_10', 1250, 'accessory_frontMiddle_10_gui', 'ebNode_0'), 11: (aNames[2000], 'phase_6/models/karting/accessory_backMiddle_0', 450, 'accessory_backMiddle_0_gui', 'spNode_1'), 12: (aNames[2001], 'phase_6/models/karting/accessory_backMiddle_1', 200, 'accessory_backMiddle_1_gui', 'spNode_0'), 13: (aNames[2002], 'phase_6/models/karting/accessory_backMiddle_2', 800, 'accessory_backMiddle_2_gui', 'spNode_1'), 14: (aNames[2003], 'phase_6/models/karting/accessory_backMiddle_3', 1250, 'accessory_backMiddle_3_gui', 'spNode_1'), 15: (aNames[2004], 'phase_6/models/karting/accessory_backMiddle_4', 5000, 'accessory_backMiddle_4_gui', 'spNode_1'), 16: (aNames[2005], 'phase_6/models/karting/accessory_backMiddle_5', 800, 'accessory_backMiddle_5_gui', 'spNode_1'), 17: (aNames[2006], 'phase_6/models/karting/accessory_backMiddle_6', 450, 'accessory_backMiddle_6_gui', 'spNode_0'), 18: (aNames[2007], 'phase_6/models/karting/accessory_backMiddle_7', 1250, 'accessory_backMiddle_7_gui', 'spNode_1'), 19: (aNames[3000], 'phase_6/models/karting/accessory_front_ww_0', 200, 'accessory_front_ww_0_gui', '%sFWWNode_0'), 20: (aNames[3001], 'phase_6/models/karting/accessory_front_ww_1', 200, 'accessory_front_ww_1_gui', '%sFWWNode_1'), 21: (aNames[3002], 'phase_6/models/karting/accessory_front_ww_2', 800, 'accessory_front_ww_2_gui', '%sFWWNode_2'), 22: (aNames[3003], 'phase_6/models/karting/accessory_front_ww_3', 5000, 'accessory_front_ww_3_gui', '%sFWWNode_2'), 23: (aNames[3004], 'phase_6/models/karting/accessory_front_ww_4', 1250, 'accessory_front_ww_4_gui', '%sFWWNode_2'), 24: (aNames[3005], 'phase_6/models/karting/accessory_front_ww_5', 800, 'accessory_front_ww_5_gui', '%sFWWNode_1'), 25: (aNames[3006], 'phase_6/models/karting/accessory_front_ww_6', 1250, 'accessory_front_ww_6_gui', '%sFWWNode_2'), 26: (aNames[3007], 'phase_6/models/karting/accessory_front_ww_7', 450, 'accessory_front_ww_7_gui', '%sFWWNode_2'), 27: (aNames[4000], 'phase_6/models/karting/accessory_rear_ww_0', 800, 'accessory_rear_ww_0_gui', '%sBWWNode_0'), 28: (aNames[4001], 'phase_6/models/karting/accessory_rear_ww_1', 200, 'accessory_rear_ww_1_gui', '%sBWWNode_1'), 29: (aNames[4002], 'phase_6/models/karting/accessory_rear_ww_2', 200, 'accessory_rear_ww_2_gui', '%sBWWNode_2'), 30: (aNames[4003], 'phase_6/models/karting/accessory_rear_ww_3', 1250, 'accessory_rear_ww_3_gui', '%sBWWNode_0'), 31: (aNames[4004], 'phase_6/models/karting/accessory_rear_ww_4', 200, 'accessory_rear_ww_4_gui', '%sBWWNode_2'), 32: (aNames[4005], 'phase_6/models/karting/accessory_rear_ww_5', 800, 'accessory_rear_ww_5_gui', '%sBWWNode_2'), 33: (aNames[4006], 'phase_6/models/karting/accessory_rear_ww_6', 450, 'accessory_rear_ww_6_gui', '%sBWWNode_2'), 34: (aNames[4007], 'phase_6/models/karting/accessory_rear_ww_7', 5000, 'accessory_rear_ww_7_gui', '%sBWWNode_2'), 35: (aNames[4008], 'phase_6/models/karting/accessory_rear_ww_8', 1250, 'accessory_rear_ww_8_gui', '%sBWWNode_0'), 36: (aNames[4009], 'phase_6/models/karting/accessory_rear_ww_9', 1250, 'accessory_rear_ww_9_gui', '%sBWWNode_0'), 37: (aNames[4010], 'phase_6/models/karting/accessory_rear_ww_10', 450, 'accessory_rear_ww_10_gui', '%sBWWNode_2'), 38: (aNames[4011], 'phase_6/models/karting/accessory_rear_ww_11', 800, 'accessory_rear_ww_11_gui', '%sBWWNode_2'), 39: (aNames[4012], 'phase_6/models/karting/accessory_rear_ww_12', 1250, 'accessory_rear_ww_12_gui', '%sBWWNode_2'), 40: (aNames[5000], 'phase_6/maps/kart_Rim_1', InvalidEntry, 'kart_Rim_1'), 41: (aNames[5001], 'phase_6/maps/kart_Rim_2', 450, 'kart_Rim_2'), 42: (aNames[5002], 'phase_6/maps/kart_Rim_3', 100, 'kart_Rim_3'), 43: (aNames[5003], 'phase_6/maps/kart_Rim_4', 800, 'kart_Rim_4'), 44: (aNames[5004], 'phase_6/maps/kart_Rim_5', 100, 'kart_Rim_5'), 45: (aNames[5005], 'phase_6/maps/kart_Rim_6', 200, 'kart_Rim_6'), 46: (aNames[5006], 'phase_6/maps/kart_Rim_7', 200, 'kart_Rim_7'), 47: (aNames[5007], 'phase_6/maps/kart_Rim_8', 200, 'kart_Rim_8'), 48: (aNames[5008], 'phase_6/maps/kart_Rim_9', 200, 'kart_Rim_9'), 49: (aNames[5009], 'phase_6/maps/kart_Rim_10', 200, 'kart_Rim_10'), 50: (aNames[5010], 'phase_6/maps/kart_Rim_11', 200, 'kart_Rim_11'), 51: (aNames[5011], 'phase_6/maps/kart_Rim_12', 800, 'kart_Rim_12'), 52: (aNames[5012], 'phase_6/maps/kart_Rim_13', 450, 'kart_Rim_13'), 53: (aNames[5013], 'phase_6/maps/kart_Rim_14', 1250, 'kart_Rim_14'), 54: (aNames[5014], 'phase_6/maps/kart_Rim_15', 5000, 'kart_Rim_15'), 55: (aNames[6000], 1, 200, '%s_SideDecal_1'), 56: (aNames[6001], 2, 450, '%s_SideDecal_2'), 57: (aNames[6002], 3, 100, '%s_SideDecal_3'), 58: (aNames[6003], 4, 5000, '%s_SideDecal_4'), 59: (aNames[6004], 5, 200, '%s_SideDecal_5'), 60: (aNames[6005], 6, 200, '%s_SideDecal_6'), 61: (aNames[6006], 7, 450, '%s_SideDecal_7'), 62: (aNames[6007], 8, 100, '%s_SideDecal_8'), 63: (aNames[6008], 9, 1250, '%s_SideDecal_9'), 64: (aNames[6009], 10, 800, '%s_SideDecal_10'), 65: (aNames[7000], VBase4(0.8, 1.0, 0.5, 1.0), 100), 66: (aNames[7001], VBase4(0.96875, 0.691406, 0.699219, 1.0), 100), 67: (aNames[7002], VBase4(0.933594, 0.265625, 0.28125, 1.0), 2500), 68: (aNames[7003], VBase4(0.863281, 0.40625, 0.417969, 1.0), 900), 69: (aNames[7004], VBase4(0.710938, 0.234375, 0.4375, 1.0), 1600), 70: (aNames[7005], VBase4(0.570312, 0.449219, 0.164062, 1.0), 1600), 71: (aNames[7006], VBase4(0.640625, 0.355469, 0.269531, 1.0), 1600), 72: (aNames[7007], VBase4(0.996094, 0.695312, 0.511719, 1.0), 100), 73: (aNames[7008], VBase4(0.832031, 0.5, 0.296875, 1.0), 1600), 74: (aNames[7009], VBase4(0.992188, 0.480469, 0.167969, 1.0), 1600), 75: (aNames[7010], VBase4(0.996094, 0.898438, 0.320312, 1.0), 2500), 76: (aNames[7011], VBase4(0.996094, 0.957031, 0.597656, 1.0), 900), 77: (aNames[7012], VBase4(0.855469, 0.933594, 0.492188, 1.0), 900), 78: (aNames[7013], VBase4(0.550781, 0.824219, 0.324219, 1.0), 900), 79: (aNames[7014], VBase4(0.242188, 0.742188, 0.515625, 1.0), 1600), 80: (aNames[7015], VBase4(0.304688, 0.96875, 0.402344, 1.0), 2500), 81: (aNames[7016], VBase4(0.433594, 0.90625, 0.835938, 1.0), 900), 82: (aNames[7017], VBase4(0.347656, 0.820312, 0.953125, 1.0), 900), 83: (aNames[7018], VBase4(0.191406, 0.5625, 0.773438, 1.0), 1600), 84: (aNames[7019], VBase4(0.558594, 0.589844, 0.875, 1.0), 900), 85: (aNames[7020], VBase4(0.285156, 0.328125, 0.726562, 1.0), 2500), 86: (aNames[7021], VBase4(0.460938, 0.378906, 0.824219, 1.0), 900), 87: (aNames[7022], VBase4(0.546875, 0.28125, 0.75, 1.0), 1600), 88: (aNames[7023], VBase4(0.726562, 0.472656, 0.859375, 1.0), 1600), 89: (aNames[7024], VBase4(0.898438, 0.617188, 0.90625, 1.0), 1600), 90: (aNames[7025], VBase4(0.7, 0.7, 0.8, 1.0), 2500), 91: (aNames[7026], VBase4(0.3, 0.3, 0.35, 1.0), 10000)} AccessoryTypeDict = {KartDNA.ebType: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], KartDNA.spType: [11, 12, 13, 14, 15, 16, 17, 18], KartDNA.fwwType: [19, 20, 21, 22, 23, 24, 25, 26], KartDNA.bwwType: [27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], KartDNA.rimsType: [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54], KartDNA.decalType: [55, 56, 57, 58, 59, 60, 61, 62, 63, 64], KartDNA.bodyColor: [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91]} AccessoryTypeNameDict = [None, 'KartShtikerBodyColor', 'KartShtikerAccColor', 'KartShtikerEngineBlock', 'KartShtikerSpoiler', 'KartShtikerFrontWheelWell', 'KartShtikerBackWheelWell', 'KartShtikerRim', 'KartShtikerDecal'] def checkNumFieldsValidity(numFields): return KartDNA.decalType == numFields - 1 def checkKartFieldValidity(field): if field < KartDNA.bodyType or field > KartDNA.decalType: return 0 return 1 def getNumFields(): return KartDNA.decalType + 1 def getKartModelPath(kartType, lodLevel = 0): if lodLevel == 1: return KartDict.get(kartType)[KartInfo.LODmodel1] if lodLevel == 2: return KartDict.get(kartType)[KartInfo.LODmodel2] return KartDict.get(kartType)[KartInfo.model] def getKartViewDist(kartType): return KartDict.get(kartType)[KartInfo.viewDist] def getDecalId(kartType): return KartDict.get(kartType)[KartInfo.decalId] def getAccessory(accId): return AccessoryDict.get(accId)[KartInfo.model] def getAccessoryAttachNode(accId): accInfo = AccessoryDict.get(accId) if len(accInfo) == 5: return accInfo[4] return None def getTexCardNode(accId): accInfo = AccessoryDict.get(accId) if len(accInfo) <= 5: return accInfo[3] return None def checkKartDNAValidity(dna): if not checkNumFieldsValidity(len(dna)): return 0 for field in range(len(dna)): if field == KartDNA.bodyType: if dna[field] not in list(KartDict.keys()): return 0 elif field == KartDNA.bodyColor or field == KartDNA.accColor: accList = [InvalidEntry] + AccessoryTypeDict.get(KartDNA.bodyColor) if dna[field] not in accList: return 0 else: accList = [InvalidEntry] + AccessoryTypeDict.get(field) if dna[field] not in accList: return 0 return 1 def getDefaultColor(): return VBase4(1, 1, 1, 1) def getDefaultRim(): return AccessoryTypeDict[KartDNA.rimsType][0] def getDefaultAccessory(category): if category in [KartDNA.bodyColor, KartDNA.accColor]: return getDefaultColor() elif category == KartDNA.rimsType: return getDefaultRim() else: return InvalidEntry def getAccessoryItemList(accessoryType): return [ AccessoryDict[itemId] for itemId in AccessoryTypeDict[accessoryType] ] def getKartTypeInfo(type): if type in list(KartDict.keys()): return KartDict[type] return InvalidEntry def getAccessoryInfo(index): if index in list(AccessoryDict.keys()): return AccessoryDict[index] return InvalidEntry def getAccessoryType(accessoryId): for key in list(AccessoryTypeDict.keys()): if accessoryId in AccessoryTypeDict[key]: return key return InvalidEntry def getAccessoryDictFromOwned(accessoryOwnedList, pType = -1): accessDict = copy.deepcopy(AccessoryTypeDict) accessDict[KartDNA.rimsType].remove(getDefaultRim()) for accOwnedId in accessoryOwnedList: type = getAccessoryType(accOwnedId) if type != InvalidEntry and accOwnedId in accessDict[type]: accessDict[type].remove(accOwnedId) if pType != -1: return accessDict[pType] else: return accessDict def getAccessDictByType(accessoryOwnedList): accessDict = {} if type(accessoryOwnedList) == list: for accOwnedId in accessoryOwnedList: accType = getAccessoryType(accOwnedId) if accType != InvalidEntry: if accType not in accessDict: accessDict[accType] = [] accessDict[accType].append(accOwnedId) else: print('KartDNA: getAccessDictByType: bad accessory list: ', accessoryOwnedList) return accessDict def getKartCost(kartID): if kartID in KartDict: return KartDict[kartID][KartInfo.cost] else: return 'key error' def getAccCost(accID): return AccessoryDict[accID][AccInfo.cost] def getAccName(accID): try: return AccessoryDict[accID][AccInfo.name] except: return TTLocalizer.KartShtikerDefault