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 __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
Beispiel #4
0
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
Beispiel #5
0
    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