+# uncompyle6 version 3.7.0
+# Python bytecode 2.7 (62211)
+# Decompiled from: Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 20 2020, 13:19:08) [MSC v.1500 32 bit (Intel)]
+# Embedded file name: scripts/common/DictPackers.py
+#from debug_utils import LOG_ERROR
+from binascii import crc32
+from functools import partial
+class DeltaPacker(object):
+ def __init__(self, packPredicate=None):
+ self.packPredicate = packPredicate
+ s = [ p(v) for v in s ]
+ for index, v in enumerate(s[1:]):
+ for index in xrange(1, len(seq)):
+ ret[index] = ret[(index - 1)] + seq[index]
+class ValueReplayPacker:
+ if isinstance(value, str):
+ def unpack(self, value):
+class DictPacker(object):
+ def __init__(self, *metaData):
+ self._metaData = metaData[0]
+ self._checksum = self.checksum(self._metaData)
+ def pack(self, dataDict):
+ metaData = self._metaData
+ l = [None] * (len(metaData) + 1)
+ for index, metaEntry in enumerate(metaData):
+ name, transportType, default, packer, aggFunc = metaEntry
+ v = dataDict.get(name, default)
+ elif packer is not None:
+ elif transportType is not None and not isinstance(v, transportType):
+ #LOG_ERROR('error while packing:', index, metaEntry, str(e))
+ def unpack(self, dataList):
+ if len(dataList) == 0 or dataList[0] != self._checksum:
+ for index, meta in enumerate(self._metaData):
+ val = dataList[(index + 1)]
+ val = self.getDefaultValue(index)
+ elif packer is not None:
+ val = packer.unpack(val)
+ def unpackWthoutChecksum(self, dataList):
+ for index, meta in enumerate(self._metaData):
+ val = dataList[(index + 1)]
+ val = self.getDefaultValue(index)
+ elif packer is not None:
+ val = packer.unpack(val)
+ # def getChecksum(self):
+ # return self._checksum
+ def getDefaultValue(self, index):
+ default = self._metaData[index][2]
+ return copy.deepcopy(default)
+ def checksum(metaData):
+ name, entry_type, default, packer, aggregatorName, battle_result_entry_type = entry
+ meta_descriptor.append(('').join([name, str(entry_type),
+ str(default), str(type(packer)), str(aggregatorName), str(battle_result_entry_type)]))
+ return crc32(('').join(meta_descriptor))
+class SimpleDictPacker(object):
+ def __init__(self, packPredicate, keys):
+ self.__packPredicate = packPredicate
+ self.__keys = tuple(keys)
+ def pack(self, dataDict):
+ packPredicate = self.__packPredicate
+ ret = [None] * len(self.__keys)
+ for index, key in enumerate(self.__keys):
+ val = dataDict.get(key, None)
+ val = packPredicate(val)
+ def unpack(self, dataList):
+ for index, value in enumerate(dataList):
+ ret[self.__keys[index]] = value
+class MetaEntry(object):
+ __slots__ = ('name', 'transportType', 'default', 'packer', 'aggFunc')
+ def __init__(self, *data):
+ self.name, self.transportType, default, self.packer, self.aggFunc = data
+ self.default = copy.deepcopy(default)
+ def __init__(self, *metaData):
+ DictPacker.__init__(self, *metaData)
+ self.__nameToData = {name:(index, transportType, default, packer, aggFunc) for index, (name, transportType, default, packer, aggFunc, battle_result_entry_type) in enumerate(self._metaData)}
+ self.__names = set(self.__nameToData.keys())
+ # result = self.__defaultsImmutable.copy()
+ # for key, value in self.__defaultsMutable.iteritems():
+ # result[key] = value()
+ # def indexOf(self, name):
+ # return self.__nameToData[name][0]
+ # def nameOf(self, index):
+ # return self._metaData[index][0]
+ # def getDataByName(self, name):
+ # return self.__nameToData[name]
+ # def getDefaultValue(self, index):
+ # name, _, _, _, _ = self._metaData[index]
+ # return self.getDefaultValueByName(name)
+ # def getDefaultValueByName(self, name):
+ # if name in self.__defaultsImmutable:
+ # return self.__defaultsImmutable[name]
+ # return self.__defaultsMutable[name]()
+ def __add__(self, other):
+ newMeta = self._metaData + other._metaData
+ return self._metaData.__iter__()
+ return len(self._metaData)
+ def __getitem__(self, index):
+ return MetaEntry(*self._metaData[index])
+ # def __initDefaults(self):
+ # self.__defaultsImmutable = {}
+ # self.__defaultsMutable = {}
+ # for name, transportType, default, _, _ in self._metaData:
+ # mutableType = getMutability(transportType, default)
+ # if mutableType == 'immutable':
+ # self.__defaultsImmutable[name] = default
+ # lambdas = {'mutableList': partial(lambda x: x[:], default),
+ # 'mutableDeep': partial(copy.deepcopy, default),
+ # 'mutableCopy': partial(lambda x: x.copy(), default)}
+ # self.__defaultsMutable[name] = lambdas[mutableType]
+# def getMutability(transportType, default):
+ # if transportType in (int, float, str, bool, None):
+ # if transportType in (list, tuple, set):
+ # if all(getMutability(type(value), value) == 'immutable' for value in default):
+ # if transportType == list:
+ # if transportType == tuple:
+ # if default or transportType != dict: