def __readFragile(self, fragileSec): filename = fragileSec.readString("filename") kineticDamageCorrection = fragileSec.readFloat("kineticDamageCorrection", 0.0) desc = { "filename": filename, "health": fragileSec.readInt("health"), "kineticDamageCorrection": kineticDamageCorrection, "type": DESTR_TYPE_FRAGILE, } self.__readAchievementTag(fragileSec, desc) self.__readExplosive(fragileSec, desc) matName = fragileSec.readString("matName") if matName: surface = _parseFragileMaterialName(matName, filename) effectMtrlIdx = EFFECT_MATERIAL_INDEXES_BY_NAMES.get(surface) if effectMtrlIdx is not None: desc["effectMtrlIdx"] = effectMtrlIdx if IS_CLIENT: _readAndMapEffect(desc, fragileSec, "effect", self.__effects["fragiles"], filename) _readAndMapEffect(desc, fragileSec, "hitEffect", self.__effects["fragiles"], filename, False) _readAndMapEffect(desc, fragileSec, "decayEffect", self.__effects["fragiles"], filename) desc["effectHP"] = fragileSec.readString("effectHP") desc["effectScale"] = fragileSec.readFloat("effectScale") _readAndMapEffect(desc, fragileSec, "lifetimeEffect", self.__effects["fragiles"], filename) if fragileSec.has_key("lifetimeEffectChance"): desc["lifetimeEffectChance"] = fragileSec.readFloat("lifetimeEffectChance") else: desc["lifetimeEffectChance"] = self.__defaultLifetimeEffectChance return desc
def __readFragile(self, fragileSec): filename = fragileSec.readString('filename') kineticDamageCorrection = fragileSec.readFloat('kineticDamageCorrection', 0.0) desc = {'filename': filename, 'health': fragileSec.readInt('health'), 'kineticDamageCorrection': kineticDamageCorrection, 'type': DESTR_TYPE_FRAGILE} self.__readAchievementTag(fragileSec, desc) self.__readExplosive(fragileSec, desc) matName = fragileSec.readString('matName') if matName: surface = _parseFragileMaterialName(matName, filename) effectMtrlIdx = EFFECT_MATERIAL_INDEXES_BY_NAMES.get(surface) if effectMtrlIdx is not None: desc['effectMtrlIdx'] = effectMtrlIdx if IS_CLIENT: _readAndMapEffect(desc, fragileSec, 'effect', self.__effects['fragiles'], filename) _readAndMapEffect(desc, fragileSec, 'hitEffect', self.__effects['fragiles'], filename, False) _readAndMapEffect(desc, fragileSec, 'decayEffect', self.__effects['fragiles'], filename) desc['effectHP'] = fragileSec.readString('effectHP') desc['effectScale'] = fragileSec.readFloat('effectScale') _readAndMapEffect(desc, fragileSec, 'lifetimeEffect', self.__effects['fragiles'], filename) if fragileSec.has_key('lifetimeEffectChance'): desc['lifetimeEffectChance'] = fragileSec.readFloat('lifetimeEffectChance') else: desc['lifetimeEffectChance'] = self.__defaultLifetimeEffectChance return desc
def _readMaterials(parentXmlCtx, section): materials = {} if IS_BASEAPP or IS_BOT: return materials else: for matName, (xmlCtx, matSection) in _xml.getItemsWithContext(parentXmlCtx, section): matKind = material_kinds.IDS_BY_NAMES.get(matName) if matKind is None: _xml.raiseWrongXml(xmlCtx, matName, 'material kind name is unknown') if matKind in materials: _xml.raiseWrongXml(xmlCtx, matName, 'duplicate material kind') effectMaterialName = _xml.readString(xmlCtx, matSection, 'effectMaterial') effectMaterialIdx = EFFECT_MATERIAL_INDEXES_BY_NAMES.get(effectMaterialName) if effectMaterialIdx is None: _xml.raiseWrongXml(xmlCtx, matName, 'Unknown effect material %s' % effectMaterialName) materials[matKind] = DestructibleMaterialInfo(kind=matKind, armor=_xml.readInt(xmlCtx, matSection, 'armor'), extra=None, vehicleDamageFactor=_xml.readFraction(xmlCtx, matSection, 'vehicleDamageFactor'), useHitAngle=_xml.readBool(xmlCtx, matSection, 'useHitAngle'), mayRicochet=_xml.readBool(xmlCtx, matSection, 'mayRicochet'), collideOnceOnly=True, checkCaliberForRichet=_xml.readBool(xmlCtx, matSection, 'checkCaliberForRichet'), checkCaliberForHitAngleNorm=_xml.readBool(xmlCtx, matSection, 'checkCaliberForHitAngleNorm'), effectMaterialIdx=effectMaterialIdx) return materials
def __readStructure(self, structSec): filename = structSec.readString('filename') ids = [] idMap = {} for moduleSec in structSec['modules'].values(): module = {'health': moduleSec.readInt('health')} matName = moduleSec.readString('matName') res = _parseMaterialName(matName, filename) if res: type, surface, id, depends = res else: continue effectMtrlIdx = EFFECT_MATERIAL_INDEXES_BY_NAMES.get(surface) if effectMtrlIdx is not None: module['effectMtrlIdx'] = effectMtrlIdx else: LOG_ERROR('Wrong effect material in structure %s' % filename) if IS_CLIENT: _readAndMapEffect(module, moduleSec, 'ramEffect', self.__effects['structures'], filename) _readAndMapEffect(module, moduleSec, 'hitEffect', self.__effects['structures'], filename) _readAndMapEffect(module, moduleSec, 'decayEffect', self.__effects['structures'], filename) module['effectHP'] = moduleSec.readString('effectHP') module['effectScale'] = moduleSec.readFloat('effectScale') ids.append(id) idMap[id] = (module, depends) destrMatkindCnt = DESTRUCTIBLE_MATKIND.NORMAL_MAX - DESTRUCTIBLE_MATKIND.NORMAL_MIN if len(ids) > destrMatkindCnt: LOG_ERROR( 'Number of modules in structure %s exceeds destructibles material kinds range' % filename) ids = ids[:destrMatkindCnt] ids.sort() map = {} modules = {} matkindNMin = DESTRUCTIBLE_MATKIND.NORMAL_MIN matkindDMin = DESTRUCTIBLE_MATKIND.DAMAGED_MIN matkindsNormal = [] for i, id in enumerate(ids): module, depends = idMap[id] destroyedMat = matkindDMin + i module['destroyedMat'] = destroyedMat normalMat = matkindNMin + i matkindsNormal.append(normalMat) modules[normalMat] = module map[normalMat] = tuple( (ids.index(id) + matkindNMin for id in depends)) destroyDepends = {} for root in map.iterkeys(): rootDepends = set() stack = [root] while len(stack) > 0: cur = stack.pop() if cur in rootDepends: continue rootDepends.add(cur) depends = map.get(cur) if depends is None: continue stack += depends rootDepends.remove(root) if len(rootDepends) > 0: destroyDepends[root] = rootDepends inversedDestroyDepends = {} for keyMat, depends in destroyDepends.iteritems(): for mat in depends: inversedDestroyDepends.setdefault(mat, set()).add(keyMat) statePresets = { DESTR_STATE_NAME_UNDAMAGED: [], DESTR_STATE_NAME_DESTROYED: matkindsNormal } if structSec.has_key('states'): for stateSec in structSec['states'].values(): name = stateSec.readString('name').strip() matNames = stateSec.readString('destroyedMaterials').split(' ') matKinds = [] for matName in matNames: res = _parseMaterialName(matName, filename) if res: type, surface, id, depends = res else: continue matKinds.append(ids.index(id) + matkindNMin) statePresets[name] = matKinds desc = { 'filename': filename, 'type': DESTR_TYPE_STRUCTURE, 'modules': modules, 'destroyDepends': destroyDepends, 'inversedDestroyDepends': inversedDestroyDepends, 'statePresets': statePresets } self.__readAchievementTag(structSec, desc) return desc
def __readStructure(self, structSec): filename = structSec.readString("filename") ids = [] idMap = {} for moduleSec in structSec["modules"].values(): module = {"health": moduleSec.readInt("health")} matName = moduleSec.readString("matName") res = _parseMaterialName(matName, filename) if res: type, surface, id, depends = res else: continue effectMtrlIdx = EFFECT_MATERIAL_INDEXES_BY_NAMES.get(surface) if effectMtrlIdx is not None: module["effectMtrlIdx"] = effectMtrlIdx else: LOG_ERROR("Wrong effect material in structure %s" % filename) if IS_CLIENT: _readAndMapEffect(module, moduleSec, "ramEffect", self.__effects["structures"], filename) _readAndMapEffect(module, moduleSec, "hitEffect", self.__effects["structures"], filename) _readAndMapEffect(module, moduleSec, "decayEffect", self.__effects["structures"], filename) module["effectHP"] = moduleSec.readString("effectHP") module["effectScale"] = moduleSec.readFloat("effectScale") ids.append(id) idMap[id] = (module, depends) destrMatkindCnt = DESTRUCTIBLE_MATKIND.NORMAL_MAX - DESTRUCTIBLE_MATKIND.NORMAL_MIN if len(ids) > destrMatkindCnt: LOG_ERROR("Number of modules in structure %s exceeds destructibles material kinds range" % filename) ids = ids[:destrMatkindCnt] ids.sort() map = {} modules = {} matkindNMin = DESTRUCTIBLE_MATKIND.NORMAL_MIN matkindDMin = DESTRUCTIBLE_MATKIND.DAMAGED_MIN matkindsNormal = [] for i, id in enumerate(ids): module, depends = idMap[id] destroyedMat = matkindDMin + i module["destroyedMat"] = destroyedMat normalMat = matkindNMin + i matkindsNormal.append(normalMat) modules[normalMat] = module map[normalMat] = tuple((ids.index(id) + matkindNMin for id in depends)) destroyDepends = {} for root in map.iterkeys(): rootDepends = set() stack = [root] while len(stack) > 0: cur = stack.pop() if cur in rootDepends: continue rootDepends.add(cur) depends = map.get(cur) if depends is None: continue stack += depends rootDepends.remove(root) if len(rootDepends) > 0: destroyDepends[root] = rootDepends inversedDestroyDepends = {} for keyMat, depends in destroyDepends.iteritems(): for mat in depends: inversedDestroyDepends.setdefault(mat, set()).add(keyMat) statePresets = {DESTR_STATE_NAME_UNDAMAGED: [], DESTR_STATE_NAME_DESTROYED: matkindsNormal} if structSec.has_key("states"): for stateSec in structSec["states"].values(): name = stateSec.readString("name").strip() matNames = stateSec.readString("destroyedMaterials").split(" ") matKinds = [] for matName in matNames: res = _parseMaterialName(matName, filename) if res: type, surface, id, depends = res else: continue matKinds.append(ids.index(id) + matkindNMin) statePresets[name] = matKinds desc = { "filename": filename, "type": DESTR_TYPE_STRUCTURE, "modules": modules, "destroyDepends": destroyDepends, "inversedDestroyDepends": inversedDestroyDepends, "statePresets": statePresets, } self.__readAchievementTag(structSec, desc) return desc