@@ -2195,7 +2195,7 @@ class MreAchr(MelRecord):
21952195 MelFid('TNAM','topic'),
21962196 ),
21972197 MelStruct('XLCM','i','levelModifier'),
2198- MelFid('XMRC','merchantContainer'),
2198+ MelFid('XMRC','merchantContainer', ),
21992199 MelStruct('XCNT','i','count'),
22002200 MelStruct('XRDS','f','radius',),
22012201 MelStruct('XHLP','f','health',),
@@ -2346,7 +2346,8 @@ class MreAmmo(MelRecord):
23462346 MelDestructible(),
23472347 MelFid('YNAM','pickupSound'),
23482348 MelFid('ZNAM','dropSound'),
2349- MelStruct('DATA','fB3siB','speed',(_flags,'flags',0L),('unused1',null3),'value','clipRounds'),
2349+ MelStruct('DATA','fB3siB','speed',(_flags,'flags',0L),('ammoData1',null3),
2350+ 'value','clipRounds'),
23502351 MelString('ONAM','shortName'),
23512352 )
23522353 __slots__ = MelRecord.__slots__ + melSet.getSlotsUsed()
@@ -2407,7 +2408,7 @@ class MreArma(MelRecord):
24072408 #9:Hand Wear,10:Chems,11:Stimpack,12:Food,13:Alcohol
24082409 MelStruct('ETYP','i',('etype',-1)),
24092410 MelStruct('DATA','IIf','value','health','weight'),
2410- MelStruct('DNAM','HH ','ar','flags'),
2411+ MelStruct('DNAM','hH ','ar','flags'),
24112412 )
24122413 __slots__ = MelRecord.__slots__ + melSet.getSlotsUsed()
24132414
@@ -2429,7 +2430,8 @@ class MreArmo(MelRecord):
24292430 MelString('FULL','full'),
24302431 MelFid('SCRI','script'),
24312432 MelFid('EITM','objectEffect'),
2432- MelStruct('BMDT','=IB3s',(_flags,'bipedFlags',0L),(_generalFlags,'generalFlags',0L),'unused',),
2433+ MelStruct('BMDT','=IB3s',(_flags,'bipedFlags',0L),
2434+ (_generalFlags,'generalFlags',0L),'armoBMDT1',),
24332435 MelModel('maleBody'),
24342436 MelModel('maleWorld',2),
24352437 MelString('ICON','maleIconPath'),
@@ -2512,10 +2514,28 @@ class MreBptd(MelRecord):
25122514 classType = 'BPTD'
25132515 _flags = Flags(0L,Flags.getNames('severable','ikData','ikBipedData',
25142516 'explodable','ikIsHead','ikHeadtracking','toHitChanceAbsolute'))
2517+ class MelBptdGroups(MelGroups):
2518+ def loadData(self,record,ins,type,size,readId):
2519+ """Reads data from ins into record attribute."""
2520+ if type == self.type0:
2521+ target = self.getDefault()
2522+ record.__getattribute__(self.attr).append(target)
2523+ else:
2524+ targets = record.__getattribute__(self.attr)
2525+ if targets:
2526+ target = targets[-1]
2527+ elif type == 'BPNN': # for RadScorpionBodyPart
2528+ target = self.getDefault()
2529+ record.__getattribute__(self.attr).append(target)
2530+ slots = []
2531+ for element in self.elements:
2532+ slots.extend(element.getSlotsUsed())
2533+ target.__slots__ = slots
2534+ self.loaders[type].loadData(target,ins,type,size,readId)
25152535 melSet = MelSet(
25162536 MelString('EDID','eid'),
25172537 MelModel(),
2518- MelGroups ('bodyParts',
2538+ MelBptdGroups ('bodyParts',
25192539 MelString('BPTN','partName'),
25202540 MelString('BPNN','nodeName'),
25212541 MelString('BPNT','vatsTarget'),
@@ -2733,7 +2753,8 @@ class MreClmt(MelRecord):
27332753 MelString('FNAM','sunPath'),
27342754 MelString('GNAM','glarePath'),
27352755 MelModel(),
2736- MelStruct('TNAM','6B','riseBegin','riseEnd','setBegin','setEnd','volatility','phaseLength'),
2756+ MelStruct('TNAM','6B','riseBegin','riseEnd','setBegin','setEnd',
2757+ 'volatility','phaseLength',),
27372758 )
27382759 __slots__ = MelRecord.__slots__ + melSet.getSlotsUsed()
27392760
@@ -2923,8 +2944,9 @@ class MreCrea(MreActor):
29232944 MelFids('PKID','aiPackages'),
29242945 MelStrings('KFFZ','animations'),
29252946 MelStruct('DATA','=4Bh2sh7B','type','combatSkill','magicSkill',
2926- 'stealthSkill','health','unused2','damage','strength','perception',
2927- 'endurance','charisma','intelligence','agility','luck'),
2947+ 'stealthSkill','health',('unused2',null2),'damage','strength',
2948+ 'perception','endurance','charisma','intelligence','agility',
2949+ 'luck'),
29282950 MelStruct('RNAM','B','attackReach'),
29292951 MelFid('ZNAM','combatStyle'),
29302952 MelFid('PNAM','bodyPartData'),
@@ -2990,9 +3012,11 @@ class MreCsty(MelRecord):
29903012class MreDebr(MelRecord):
29913013 """Debris record."""
29923014 classType = 'DEBR'
3015+
3016+ dataFlags = Flags(0L,Flags.getNames('hasCollissionData'))
29933017 class MelDebrData(MelStruct):
29943018 subType = 'DATA'
2995- _elements = (('percentage',0),('modPath',null1),('flags',0))
3019+ _elements = (('percentage',0),('modPath',null1),('flags',0), )
29963020 def __init__(self):
29973021 """Initialize."""
29983022 self.attrs,self.defaults,self.actions,self.formAttrs = self.parseElements(*self._elements)
@@ -3236,7 +3260,8 @@ class MreEnch(MelRecord,MreHasEffects):
32363260 melSet = MelSet(
32373261 MelString('EDID','eid'),
32383262 MelFull0(), #--At least one mod has this. Odd.
3239- MelStruct('ENIT','3IB3s','itemType','chargeAmount','enchantCost',(_flags,'flags',0L),('unused1',null3)),
3263+ MelStruct('ENIT','3IB3s','itemType','chargeAmount','enchantCost',
3264+ (_flags,'flags',0L),('unused1',null3)),
32403265 #--itemType = 0: Scroll, 1: Staff, 2: Weapon, 3: Apparel
32413266 MelEffects(),
32423267 )
@@ -3246,13 +3271,14 @@ class MreEnch(MelRecord,MreHasEffects):
32463271class MreExpl(MelRecord):
32473272 """Explosion record."""
32483273 classType = 'EXPL'
3249- _flags = Flags(0,Flags.getNames('unknown1',
3250- 'alwaysUsesWorldOrientation',
3251- 'knockDownAlways',
3252- 'knockDownByFormular',
3253- 'IgnoreLosCheck',
3254- 'pushExplosionSourceRefOnly',
3255- 'ignoreImageSpaceSwap'))
3274+ _flags = Flags(0,Flags.getNames(
3275+ (1, 'alwaysUsesWorldOrientation'),
3276+ (2, 'knockDownAlways'),
3277+ (3, 'knockDownByFormular'),
3278+ (4, 'ignoreLosCheck'),
3279+ (5, 'pushExplosionSourceRefOnly'),
3280+ (6, 'ignoreImageSpaceSwap'),
3281+ ))
32563282 melSet = MelSet(
32573283 MelString('EDID','eid'),
32583284 MelStruct('OBND','=6h',
@@ -3273,7 +3299,11 @@ class MreExpl(MelRecord):
32733299class MreEyes(MelRecord):
32743300 """Eyes record."""
32753301 classType = 'EYES'
3276- _flags = Flags(0L,Flags.getNames('playable','notMale','notFemale',))
3302+ _flags = Flags(0L,Flags.getNames(
3303+ (0, 'playable'),
3304+ (1, 'notMale'),
3305+ (2, 'notFemale'),
3306+ ))
32773307 melSet = MelSet(
32783308 MelString('EDID','eid'),
32793309 MelString('FULL','full'),
@@ -4392,7 +4422,8 @@ def dumpData(self,record,out):
43924422 MelModel(),
43934423 MelStruct('ACBS','=I2Hh3Hf2H',
43944424 (_flags,'flags',0L),'fatigue','barterGold',
4395- ('level',1),'calcMin','calcMax','speedMultiplier','karma','dispotionBase','templateFlags'),
4425+ ('level',1),'calcMin','calcMax','speedMultiplier','karma',
4426+ 'dispotionBase','templateFlags'),
43964427 MelStructs('SNAM','=IB3s','factions',
43974428 (FID,'faction',None),'rank',('unused1','ODB')),
43984429 MelFid('INAM','deathItem'),
@@ -4458,7 +4489,7 @@ def setRace(self,race):
44584489 else:
44594490 self.model.modPath = r"Characters\_Male\skeleton.nif"
44604491 #--FNAM
4461- # Needs Updating for Fallout #
4492+ # Needs Updating for Fallout 3
44624493 # American
44634494 fnams = {
44644495 0x23fe9 : 0x3cdc ,#--Argonian
@@ -4703,7 +4734,7 @@ class MrePerk(MelRecord):
47034734 """Perk record."""
47044735 classType = 'PERK'
47054736 class MelPerkData(MelStruct):
4706- """Handle older trucated DATA for PERK subrecord."""
4737+ """Handle older truncated DATA for PERK subrecord."""
47074738 def loadData(self,record,ins,type,size,readId):
47084739 if size == 5:
47094740 MelStruct.loadData(self,record,ins,type,size,readId)
0 commit comments