Skip to content

Commit e335f3d

Browse files
UtumnoSharlikran
authored andcommitted
Common code of Dial in brec - untested could use some more refatoring
Chopped off a couple stray tabs
1 parent ffdfa2b commit e335f3d

5 files changed

Lines changed: 63 additions & 170 deletions

File tree

Mopy/bash/brec.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1685,7 +1685,6 @@ def updateMasters(self,masters):
16851685

16861686
#------------------------------------------------------------------------------
16871687
#-- Common Records
1688-
16891688
#------------------------------------------------------------------------------
16901689
class MreHeaderBase(MelRecord):
16911690
"""File header. Base class for all 'TES4' like records"""
@@ -1873,6 +1872,59 @@ def mergeWith(self,other,otherMod):
18731872
#--Done
18741873
self.setChanged(self.mergeOverLast)
18751874

1875+
class MreDial(MelRecord):
1876+
"""Dialog record."""
1877+
classType = 'DIAL'
1878+
__slots__ = []
1879+
1880+
def __init__(self, header, ins=None, do_unpack=False):
1881+
"""Initialize."""
1882+
MelRecord.__init__(self, header, ins, do_unpack)
1883+
self.infoStamp = 0 #--Stamp for info GRUP
1884+
self.infoStamp2 = 0 #--Stamp for info GRUP
1885+
self.infos = []
1886+
1887+
def loadInfos(self,ins,endPos,infoClass):
1888+
"""Load infos from ins. Called from MobDials."""
1889+
infos = self.infos
1890+
recHead = ins.unpackRecHeader
1891+
infosAppend = infos.append
1892+
while not ins.atEnd(endPos,'INFO Block'):
1893+
#--Get record info and handle it
1894+
header = recHead()
1895+
recType = header[0]
1896+
if recType == 'INFO':
1897+
info = infoClass(header,ins,True)
1898+
infosAppend(info)
1899+
else:
1900+
raise exception.ModError(ins.inName,
1901+
_(u'Unexpected %s record in %s group.') % (recType, "INFO"))
1902+
1903+
def dump(self,out):
1904+
"""Dumps self., then group header and then records."""
1905+
MreRecord.dump(self,out)
1906+
if not self.infos: return
1907+
# Magic number '24': size of game's record header - override for Oblivion
1908+
# Magic format '4sIIIII': format for game's GRUP record - override for Oblivion
1909+
dial_size = 24 + sum([24 + info.getSize() for info in self.infos])
1910+
out.pack('4sIIIII', 'GRUP', dial_size, self.fid, 7, self.infoStamp,
1911+
self.infoStamp2)
1912+
for info in self.infos: info.dump(out)
1913+
1914+
def updateMasters(self,masters):
1915+
"""Updates set of master names according to masters actually used."""
1916+
MelRecord.updateMasters(self,masters)
1917+
for info in self.infos:
1918+
info.updateMasters(masters)
1919+
1920+
def convertFids(self,mapper,toLong):
1921+
"""Converts fids between formats according to mapper.
1922+
toLong should be True if converting to long format or False if
1923+
converting to short format."""
1924+
MelRecord.convertFids(self,mapper,toLong)
1925+
for info in self.infos:
1926+
info.convertFids(mapper,toLong)
1927+
18761928
#------------------------------------------------------------------------------
18771929
# Skyrim and Fallout ----------------------------------------------------------
18781930
#------------------------------------------------------------------------------

Mopy/bash/game/fallout3/records.py

Lines changed: 3 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
from ...bolt import Flags, DataDict, GPath, struct_unpack, struct_pack
3434
from ...brec import MelRecord, MelStructs, MelObject, MelGroups, MelStruct, \
3535
FID, MelGroup, MelString, MelSet, MelFid, MelNull, MelOptStruct, MelFids, \
36-
MreHeaderBase, MelBase, MelUnicode, MelFidList, MelStructA, MreRecord, \
37-
MreGmstBase, MelStrings, MelFull0, MelTuple, MelMODS, MreHasEffects
36+
MreHeaderBase, MelBase, MelUnicode, MelFidList, MelStructA, MreGmstBase, \
37+
MelStrings, MelFull0, MelTuple, MelMODS, MreHasEffects
3838
from ...exception import BoltError, ModError, ModSizeError, StateError
3939
# Set MelModel in brec but only if unset
4040
if brec.MelModel is None:
@@ -1252,9 +1252,8 @@ def dumpData(self,record,out):
12521252
__slots__ = melSet.getSlotsUsed()
12531253

12541254
#------------------------------------------------------------------------------
1255-
class MreDial(MelRecord):
1255+
class MreDial(brec.MreDial):
12561256
"""Dialog record."""
1257-
classType = 'DIAL'
12581257
_flags = Flags(0,Flags.getNames('rumors','toplevel',))
12591258
class MelDialData(MelStruct):
12601259
"""Handle older truncated DATA for DIAL subrecord."""
@@ -1284,53 +1283,6 @@ def loadData(self, record, ins, sub_type, size_, readId):
12841283
)
12851284
__slots__ = melSet.getSlotsUsed() + ['infoStamp', 'infoStamp2', 'infos']
12861285

1287-
def __init__(self, header, ins=None, do_unpack=False):
1288-
"""Initialize."""
1289-
MelRecord.__init__(self, header, ins, do_unpack)
1290-
self.infoStamp = 0 #--Stamp for info GRUP
1291-
self.infoStamp2 = 0 #--Stamp for info GRUP
1292-
self.infos = []
1293-
1294-
def loadInfos(self,ins,endPos,infoClass):
1295-
"""Load infos from ins. Called from MobDials."""
1296-
infos = self.infos
1297-
recHead = ins.unpackRecHeader
1298-
infosAppend = infos.append
1299-
while not ins.atEnd(endPos,'INFO Block'):
1300-
#--Get record info and handle it
1301-
header = recHead()
1302-
recType = header[0]
1303-
if recType == 'INFO':
1304-
info = infoClass(header,ins,True)
1305-
infosAppend(info)
1306-
else:
1307-
raise ModError(ins.inName, _('Unexpected %s record in %s group.')
1308-
% (recType,"INFO"))
1309-
1310-
def dump(self,out):
1311-
"""Dumps self., then group header and then records."""
1312-
MreRecord.dump(self,out)
1313-
if not self.infos: return
1314-
# Magic number '24': size of Fallout 3's record header
1315-
# Magic format '4sIIIII': format for Fallout 3's GRUP record
1316-
dial_size = 24 + sum([24 + info.getSize() for info in self.infos])
1317-
out.pack('4sIIIII', 'GRUP', dial_size, self.fid, 7, self.infoStamp,
1318-
self.infoStamp2)
1319-
for info in self.infos: info.dump(out)
1320-
1321-
def updateMasters(self,masters):
1322-
"""Updates set of master names according to masters actually used."""
1323-
MelRecord.updateMasters(self,masters)
1324-
for info in self.infos:
1325-
info.updateMasters(masters)
1326-
1327-
def convertFids(self,mapper,toLong):
1328-
"""Converts fids between formats according to mapper.
1329-
toLong should be True if converting to long format or False if converting to short format."""
1330-
MelRecord.convertFids(self,mapper,toLong)
1331-
for info in self.infos:
1332-
info.convertFids(mapper,toLong)
1333-
13341286
#------------------------------------------------------------------------------
13351287
class MreDobj(MelRecord):
13361288
"""Default object manager record."""

Mopy/bash/game/falloutnv/records.py

Lines changed: 3 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
from ...brec import MelModel # set in Mopy/bash/game/fallout3/records.py
3333
from ...brec import MelRecord, MelStructs, MelGroups, MelStruct, FID, \
3434
MelGroup, MelString, MelSet, MelFid, MelNull, MelOptStruct, MelFids, \
35-
MelBase, MelFidList, MelStructA, MreRecord, MreGmstBase, MelFull0, \
36-
MreHeaderBase, MelUnicode
35+
MelBase, MelFidList, MelStructA, MreGmstBase, MelFull0, MreHeaderBase, \
36+
MelUnicode, MreDial
3737
from ...exception import ModError, ModSizeError
3838

3939
# Those are unused here, but need be in this file as are accessed via it
@@ -719,9 +719,8 @@ class MreDehy(MelRecord):
719719
__slots__ = melSet.getSlotsUsed()
720720

721721
#------------------------------------------------------------------------------
722-
class MreDial(MelRecord):
722+
class MreDial(MreDial):
723723
"""Dialog record."""
724-
classType = 'DIAL'
725724
_flags = Flags(0,Flags.getNames('rumors','toplevel',))
726725
class MelDialData(MelStruct):
727726
"""Handle older truncated DATA for DIAL subrecord."""
@@ -786,53 +785,6 @@ def loadData(self, record, ins, sub_type, size_, readId):
786785

787786
__slots__ = melSet.getSlotsUsed() + ['infoStamp', 'infoStamp2', 'infos']
788787

789-
def __init__(self, header, ins=None, do_unpack=False):
790-
"""Initialize."""
791-
MelRecord.__init__(self, header, ins, do_unpack)
792-
self.infoStamp = 0 #--Stamp for info GRUP
793-
self.infoStamp2 = 0 #--Stamp for info GRUP
794-
self.infos = []
795-
796-
def loadInfos(self,ins,endPos,infoClass):
797-
"""Load infos from ins. Called from MobDials."""
798-
infos = self.infos
799-
recHead = ins.unpackRecHeader
800-
infosAppend = infos.append
801-
while not ins.atEnd(endPos,'INFO Block'):
802-
#--Get record info and handle it
803-
header = recHead()
804-
recType = header[0]
805-
if recType == 'INFO':
806-
info = infoClass(header,ins,True)
807-
infosAppend(info)
808-
else:
809-
raise ModError(ins.inName, _('Unexpected %s record in %s group.')
810-
% (recType,"INFO"))
811-
812-
def dump(self,out):
813-
"""Dumps self., then group header and then records."""
814-
MreRecord.dump(self,out)
815-
if not self.infos: return
816-
# Magic number '24': size of Fallout New Vegas's record header
817-
# Magic format '4sIIIII': format for Fallout New Vegas's GRUP record
818-
dial_size = 24 + sum([24 + info.getSize() for info in self.infos])
819-
out.pack('4sIIIII', 'GRUP', dial_size, self.fid, 7, self.infoStamp,
820-
self.infoStamp2)
821-
for info in self.infos: info.dump(out)
822-
823-
def updateMasters(self,masters):
824-
"""Updates set of master names according to masters actually used."""
825-
MelRecord.updateMasters(self,masters)
826-
for info in self.infos:
827-
info.updateMasters(masters)
828-
829-
def convertFids(self,mapper,toLong):
830-
"""Converts fids between formats according to mapper.
831-
toLong should be True if converting to long format or False if converting to short format."""
832-
MelRecord.convertFids(self,mapper,toLong)
833-
for info in self.infos:
834-
info.convertFids(mapper,toLong)
835-
836788
#------------------------------------------------------------------------------
837789
class MreDobj(MelRecord):
838790
"""Default object manager record."""

Mopy/bash/game/oblivion/records.py

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -785,9 +785,8 @@ def loadData(self, record, ins, sub_type, size_, readId):
785785
)
786786
__slots__ = melSet.getSlotsUsed()
787787

788-
class MreDial(MelRecord):
788+
class MreDial(brec.MreDial):
789789
"""Dialog record."""
790-
classType = 'DIAL'
791790
melSet = MelSet(
792791
MelString('EDID','eid'),
793792
MelFids('QSTI','quests'), ### QSTRs?
@@ -828,20 +827,6 @@ def dump(self,out):
828827
out.pack('4sIIII', 'GRUP', dial_size, self.fid, 7, self.infoStamp)
829828
for info in self.infos: info.dump(out)
830829

831-
def updateMasters(self,masters):
832-
"""Updates set of master names according to masters actually used."""
833-
MelRecord.updateMasters(self,masters)
834-
for info in self.infos:
835-
info.updateMasters(masters)
836-
837-
def convertFids(self,mapper,toLong):
838-
"""Converts fids between formats according to mapper.
839-
toLong should be True if converting to long format or False if
840-
converting to short format."""
841-
MelRecord.convertFids(self,mapper,toLong)
842-
for info in self.infos:
843-
info.convertFids(mapper,toLong)
844-
845830
class MreDoor(MelRecord):
846831
"""Container record."""
847832
classType = 'DOOR'

Mopy/bash/game/skyrim/records.py

Lines changed: 3 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ def __init__(self):
175175
#------------------------------------------------------------------------------
176176
class MelCoed(MelOptStruct):
177177
"""Needs custom unpacker to look at FormID type of owner. If owner is an
178-
NPC then it is followed by a FormID. If owner is a faction then it is
179-
followed by an signed integer or '=Iif' instead of '=IIf' """ # see #282
178+
NPC then it is followed by a FormID. If owner is a faction then it is
179+
followed by an signed integer or '=Iif' instead of '=IIf' """ # see #282
180180
def __init__(self):
181181
MelOptStruct.__init__(self,'COED','=IIf',(FID,'owner'),(FID,'glob'),
182182
'itemCondition')
@@ -2144,9 +2144,8 @@ def dumpData(self,record,out):
21442144

21452145
# Verified for 305
21462146
#------------------------------------------------------------------------------
2147-
class MreDial(MelRecord):
2147+
class MreDial(brec.MreDial):
21482148
"""Dialogue Records"""
2149-
classType = 'DIAL'
21502149

21512150
# DATA has wbEnum in TES5Edit
21522151
# Assigned to 'subtype' for WB
@@ -2182,53 +2181,6 @@ class MreDial(MelRecord):
21822181
)
21832182
__slots__ = melSet.getSlotsUsed() + ['infoStamp','infoStamp2','infos']
21842183

2185-
def __init__(self, header, ins=None, do_unpack=False):
2186-
"""Initialize."""
2187-
MelRecord.__init__(self, header, ins, do_unpack)
2188-
self.infoStamp = 0 #--Stamp for info GRUP
2189-
self.infoStamp2 = 0 #--Stamp for info GRUP
2190-
self.infos = []
2191-
2192-
def loadInfos(self,ins,endPos,infoClass):
2193-
"""Load infos from ins. Called from MobDials."""
2194-
infos = self.infos
2195-
recHead = ins.unpackRecHeader
2196-
infosAppend = infos.append
2197-
while not ins.atEnd(endPos,'INFO Block'):
2198-
#--Get record info and handle it
2199-
header = recHead()
2200-
recType = header[0]
2201-
if recType == 'INFO':
2202-
info = infoClass(header,ins,True)
2203-
infosAppend(info)
2204-
else:
2205-
raise ModError(ins.inName, _('Unexpected %s record in %s group.')
2206-
% (recType,"INFO"))
2207-
2208-
def dump(self,out):
2209-
"""Dumps self., then group header and then records."""
2210-
MreRecord.dump(self,out)
2211-
if not self.infos: return
2212-
# Magic number '24': size of Skyrim's record header
2213-
# Magic format '4sIIIII': format for Skyrim's GRUP record
2214-
dial_size = 24 + sum([24 + info.getSize() for info in self.infos])
2215-
out.pack('4sIIIII', 'GRUP', dial_size, self.fid, 7, self.infoStamp,
2216-
self.infoStamp2)
2217-
for info in self.infos: info.dump(out)
2218-
2219-
def updateMasters(self,masters):
2220-
"""Updates set of master names according to masters actually used."""
2221-
MelRecord.updateMasters(self,masters)
2222-
for info in self.infos:
2223-
info.updateMasters(masters)
2224-
2225-
def convertFids(self,mapper,toLong):
2226-
"""Converts fids between formats according to mapper.
2227-
toLong should be True if converting to long format or False if converting to short format."""
2228-
MelRecord.convertFids(self,mapper,toLong)
2229-
for info in self.infos:
2230-
info.convertFids(mapper,toLong)
2231-
22322184
# Verified for 305
22332185
#------------------------------------------------------------------------------
22342186
class MreDlbr(MelRecord):

0 commit comments

Comments
 (0)