class ExtendedHeader(DataLoader): flags = None buildType = None buildFlags = None screenRatioTolerance = None screenAngle = None def initialize(self): self.flags = BitDict( 'KeepScreenRatio', 'FrameTransition', # (HWA only) frame has a transition 'ResampleStretch', # (HWA only) resample while resizing 'GlobalRefresh' # (Mobile) force global refresh ) def read(self, reader): self.flags.setFlags(reader.readInt()) self.buildType = reader.readInt(True) self.buildFlags = reader.readInt(True) self.screenRatioTolerance = reader.readShort() self.screenAngle = reader.readShort() reader.readInt() # unused def write(self, reader): reader.writeInt(self.flags.getFlags()) reader.writeInt(self.buildType, True) reader.writeInt(self.buildFlags, True) reader.writeShort(self.screenRatioTolerance) reader.writeShort(self.screenAngle) reader.writeInt(0) # unused
class FrameHeader(DataLoader): width = None height = None flags = None background = None def initialize(self): # 0x8000 == TimedMovements self.flags = BitDict('DisplayName', 'GrabDesktop', 'KeepDisplay', 'FadeIn', 'FadeOut', 'TotalCollisionMask', 'Password', 'ResizeAtStart', 'DoNotCenter', 'ForceLoadOnCall', 'NoSurface', 'Reserved_1', 'Reserved_2', 'RecordDemo', None, 'TimedMovements') def read(self, reader): self.width = reader.readInt() self.height = reader.readInt() self.background = reader.readColor() self.flags.setFlags(reader.readInt(True)) def write(self, reader): reader.writeInt(self.width) reader.writeInt(self.height) reader.writeColor(self.background) reader.writeInt(self.flags.getFlags(), True)
class Transition(DataLoader): module = None name = None id = None transitionId = None duration = None # in ms flags = None color = None parameterData = None def initialize(self): self.flags = BitDict('Color') def read(self, reader): self.module = reader.read(reader.readInt()) self.name = reader.read(reader.readInt()) self.id = reader.read(4) self.transitionId = reader.read(4) self.duration = reader.readInt() self.flags.setFlags(reader.readInt()) self.color = reader.readColor() self.parameterData = reader.read(reader.readInt()) def write(self, reader): reader.writeInt(len(self.module)); reader.write(self.module) reader.writeInt(len(self.name)); reader.write(self.name) reader.write(self.id) reader.write(self.transitionId) reader.writeInt(self.duration) reader.writeInt(self.flags.getFlags()) reader.writeColor(self.color) reader.writeInt(len(self.parameterData)); reader.write( self.parameterData)
class ExtendedHeader(DataLoader): flags = None buildType = None buildFlags = None screenRatioTolerance = None screenAngle = None def initialize(self): self.flags = BitDict( "KeepScreenRatio", "FrameTransition", # (HWA only) frame has a transition "ResampleStretch", # (HWA only) resample while resizing "GlobalRefresh", # (Mobile) force global refresh ) def read(self, reader): self.flags.setFlags(reader.readInt()) self.buildType = reader.readInt(True) self.buildFlags = reader.readInt(True) self.screenRatioTolerance = reader.readShort() self.screenAngle = reader.readShort() reader.readInt() # unused if self.buildType >= 0x10000000: self.parent.settings["compat"] = True def write(self, reader): reader.writeInt(self.flags.getFlags()) reader.writeInt(self.buildType, True) reader.writeInt(self.buildFlags, True) reader.writeShort(self.screenRatioTolerance) reader.writeShort(self.screenAngle) reader.writeInt(0) # unused
class Layer(DataLoader): name = None flags = None xCoefficient = None yCoefficient = None numberOfBackgrounds = None backgroundIndex = None effect = None def initialize(self): self.flags = BitDict( 'XCoefficient', 'YCoefficient', 'DoNotSaveBackground', None, #Wrap (Obsolete) 'Visible', # visible 'WrapHorizontally', 'WrapVertically', None, None, None, None, None, None, None, None, None, 'Redraw', 'ToHide', 'ToShow') def read(self, reader): value = reader.readInt(True) self.flags.setFlags(value) self.xCoefficient = reader.readFloat() self.yCoefficient = reader.readFloat() self.numberOfBackgrounds = reader.readInt() self.backgroundIndex = reader.readInt() self.name = self.readString(reader) def write(self, reader): reader.writeInt(self.flags.getFlags(), True) reader.writeFloat(self.xCoefficient) reader.writeFloat(self.yCoefficient) reader.writeInt(self.numberOfBackgrounds) reader.writeInt(self.backgroundIndex) reader.writeString(self.name) def getBackgrounds(self, objectInstances): return objectInstances.items[self. backgroundIndex:self.backgroundIndex + self.numberOfBackgrounds] def getInstances(self, objectInstances): return self.parent.getObjectInstances(self, objectInstances)
class Layer(DataLoader): name = None flags = None xCoefficient = None yCoefficient = None numberOfBackgrounds = None backgroundIndex = None effect = None def initialize(self): self.flags = BitDict( 'XCoefficient', 'YCoefficient', 'DoNotSaveBackground', None, #Wrap (Obsolete) 'Visible', # visible 'WrapHorizontally', 'WrapVertically', None, None, None, None, None, None, None, None, None, 'Redraw', 'ToHide', 'ToShow' ) def read(self, reader): value = reader.readInt(True) self.flags.setFlags(value) self.xCoefficient = reader.readFloat() self.yCoefficient = reader.readFloat() self.numberOfBackgrounds = reader.readInt() self.backgroundIndex = reader.readInt() self.name = self.readString(reader) def write(self, reader): reader.writeInt(self.flags.getFlags(), True) reader.writeFloat(self.xCoefficient) reader.writeFloat(self.yCoefficient) reader.writeInt(self.numberOfBackgrounds) reader.writeInt(self.backgroundIndex) reader.writeString(self.name) def getBackgrounds(self, objectInstances): return objectInstances.items[ self.backgroundIndex:self.backgroundIndex+self.numberOfBackgrounds] def getInstances(self, objectInstances): return self.parent.getObjectInstances(self, objectInstances)
class FrameHeader(DataLoader): width = None height = None flags = None background = None def initialize(self): # 0x8000 == TimedMovements self.flags = BitDict( 'DisplayName', 'GrabDesktop', 'KeepDisplay', 'FadeIn', 'FadeOut', 'TotalCollisionMask', 'Password', 'ResizeAtStart', 'DoNotCenter', 'ForceLoadOnCall', 'NoSurface', 'Reserved_1', 'Reserved_2', 'RecordDemo', None, 'TimedMovements' ) def read(self, reader): self.width = reader.readInt() self.height = reader.readInt() self.background = reader.readColor() self.flags.setFlags(reader.readInt(True)) def write(self, reader): reader.writeInt(self.width) reader.writeInt(self.height) reader.writeColor(self.background) reader.writeInt(self.flags.getFlags(), True)
class Frame(DataLoader): handle = None name = None size = None background = None maxObjects = None password = None palette = None fadeIn = None fadeOut = None def initialize(self): self.palette = [] self.flags = BitDict( 'GrabDesktop', 'KeepDisplay', 'BackgroundCollisions', 'DisplayFrameTitle', 'ResizeToScreen', 'ForceLoadOnCall', 'NoDisplaySurface', 'ScreenSaverSetup', 'TimerBasedMovements', 'MochiAds', 'NoGlobalEvents' ) def read(self, reader): self.handle = reader.readInt() self.name = reader.read(reader.readInt()) self.size = (reader.readInt(), reader.readInt()) self.background = reader.readColor() self.flags.setFlags(reader.readInt(True)) self.maxObjects = reader.readInt() self.password = reader.read(reader.readInt()) checkDefault(reader, reader.readInt(), 0) self.lastViewedX = reader.readInt() self.lastViewedY = reader.readInt() self.palette = [reader.readColor() for _ in xrange(reader.readInt())] self.stampHandle = reader.readInt() self.activeLayer = reader.readInt() self.layers = [self.new(Layer, reader) for _ in xrange(reader.readInt())] if reader.readByte() != 0: self.fadeIn = self.new(Transition, reader) if reader.readByte() != 0: self.fadeOut = self.new(Transition, reader) self.items = items = [self.new(FrameItem, reader) for _ in xrange(reader.readInt())] self.folders = [self.new(ItemFolder, reader) for _ in xrange(reader.readInt(True))] self.instances = [self.new(FrameInstance, reader) for _ in xrange(reader.readInt())] self.events = self.new(Events, reader) self.chunks = self.new(ChunkList, reader) def write(self, reader): reader.writeInt(self.handle) reader.writeInt(len(self.name)); reader.write(self.name) reader.writeInt(self.size[0]); reader.writeInt(self.size[1]) reader.writeColor(self.background) reader.writeInt(self.flags.getFlags(), True) reader.writeInt(self.maxObjects) reader.writeInt(len(self.password)); reader.write(self.password) reader.writeInt(0) reader.writeInt(self.lastViewedX) reader.writeInt(self.lastViewedY) reader.writeInt(len(self.palette)) for item in self.palette: reader.writeColor(item) reader.writeInt(self.stampHandle) reader.writeInt(self.activeLayer) reader.writeInt(len(self.layers)) for item in self.layers: item.write(reader) for item in (self.fadeIn, self.fadeOut): if item is not None: reader.writeByte(1) item.write(reader) else: reader.writeByte(0) for item in (self.items, self.folders, self.instances): reader.writeInt(len(item), True) for subitem in item: subitem.write(reader) self.events.write(reader) self.chunks.write(reader)
class MMFArray(DataLoader): items = None size = None default = None def initialize(self): self.flags = BitDict("Numeric", "Text", "Base1", "Global") self.flags.setFlags(0) # to prevent BitDict from complaining :) self.flags["Base1"] = True # default self.flags["Text"] = True # default self.default = "" def read(self, reader): if reader.readString() != MAGIC: raise InvalidData("data is invalid") if reader.readShort() != MAJOR_VERSION: raise InvalidData("major version incompatibility") if reader.readShort() != MINOR_VERSION: raise InvalidData("minor version incompatibility") xDimension = reader.readInt(True) yDimension = reader.readInt(True) zDimension = reader.readInt(True) self.size = (xDimension, yDimension, zDimension) items = self.items = {} self.flags.setFlags(reader.readInt()) if self.flags["Numeric"]: self.default = 0 elif self.flags["Text"]: self.default = "" else: raise NotImplementedError('invalid array type (should be "Text" or "Numeric")') for z in xrange(zDimension): currentZ = {} for y in xrange(yDimension): currentY = {} for x in xrange(xDimension): if self.flags["Numeric"]: item = reader.readInt(True) elif self.flags["Text"]: item = reader.read(reader.readInt(True)) else: raise InvalidData("invalid flags") currentY[x] = item currentZ[y] = currentY items[z] = currentZ def write(self, reader): reader.writeString(MAGIC) reader.writeShort(MAJOR_VERSION) reader.writeShort(MINOR_VERSION) xDimension, yDimension, zDimension = self.size reader.writeInt(xDimension) reader.writeInt(yDimension) reader.writeInt(zDimension) reader.writeInt(self.flags.getFlags()) for z in xrange(zDimension): for y in xrange(yDimension): for x in xrange(xDimension): try: item = self.items[z][y][x] except KeyError: item = self.default if self.flags["Numeric"]: reader.writeInt(int(item)) elif self.flags["Text"]: item = str(item) reader.writeInt(len(item)) reader.write(item) else: raise NotImplementedError("invalid flags") def get(self, x, y, z): if self.flags["Base1"]: x -= 1 y -= 1 z -= 1 return self.items[z][y][x] def set(self, x, y, z, value): if self.flags["Base1"]: x -= 1 y -= 1 z -= 1 xDimension, yDimension, zDimension = self.size self.size = (max(x + 1, xDimension), max(y + 1, yDimension), max(z + 1, zDimension)) if not z in self.items: self.items[z] = {} if not y in self.items[z]: self.items[z][y] = {} self.items[z][y][x] = value def setup(self, xDimension, yDimension, zDimension, arrayType): if arrayType == "Text": self.flags["Numeric"] = False self.flags["Text"] = True self.default = "" elif arrayType == "Numeric": self.flags["Numeric"] = True self.flags["Text"] = False self.default = 0 else: raise NotImplementedError('invalid array type (should be "Text" or "Numeric")') self.size = (xDimension, yDimension, zDimension) self.clear() def clear(self): self.items = {}
class MMFArray(DataLoader): items = None size = None default = None def initialize(self): self.flags = BitDict('Numeric', 'Text', 'Base1', 'Global') self.flags.setFlags(0) # to prevent BitDict from complaining :) self.flags['Base1'] = True # default self.flags['Text'] = True # default self.default = '' def read(self, reader): if reader.readString() != MAGIC: raise InvalidData('data is invalid') if reader.readShort() != MAJOR_VERSION: raise InvalidData('major version incompatibility') if reader.readShort() != MINOR_VERSION: raise InvalidData('minor version incompatibility') xDimension = reader.readInt(True) yDimension = reader.readInt(True) zDimension = reader.readInt(True) self.size = (xDimension, yDimension, zDimension) items = self.items = {} self.flags.setFlags(reader.readInt()) if self.flags['Numeric']: self.default = 0 elif self.flags['Text']: self.default = '' else: raise NotImplementedError( 'invalid array type (should be "Text" or "Numeric")') for z in xrange(zDimension): currentZ = {} for y in xrange(yDimension): currentY = {} for x in xrange(xDimension): if self.flags['Numeric']: item = reader.readInt(True) elif self.flags['Text']: item = reader.read(reader.readInt(True)) else: raise InvalidData('invalid flags') currentY[x] = item currentZ[y] = currentY items[z] = currentZ def write(self, reader): reader.writeString(MAGIC) reader.writeShort(MAJOR_VERSION) reader.writeShort(MINOR_VERSION) xDimension, yDimension, zDimension = self.size reader.writeInt(xDimension) reader.writeInt(yDimension) reader.writeInt(zDimension) reader.writeInt(self.flags.getFlags()) for z in xrange(zDimension): for y in xrange(yDimension): for x in xrange(xDimension): try: item = self.items[z][y][x] except KeyError: item = self.default if self.flags['Numeric']: reader.writeInt(int(item)) elif self.flags['Text']: item = str(item) reader.writeInt(len(item)) reader.write(item) else: raise NotImplementedError('invalid flags') def get(self, x, y, z): if self.flags['Base1']: x -= 1 y -= 1 z -= 1 return self.items[z][y][x] def set(self, x, y, z, value): if self.flags['Base1']: x -= 1 y -= 1 z -= 1 xDimension, yDimension, zDimension = self.size self.size = (max(x + 1, xDimension), max(y + 1, yDimension), max(z + 1, zDimension)) if not z in self.items: self.items[z] = {} if not y in self.items[z]: self.items[z][y] = {} self.items[z][y][x] = value def setup(self, xDimension, yDimension, zDimension, arrayType): if arrayType == 'Text': self.flags['Numeric'] = False self.flags['Text'] = True self.default = '' elif arrayType == 'Numeric': self.flags['Numeric'] = True self.flags['Text'] = False self.default = 0 else: raise NotImplementedError( 'invalid array type (should be "Text" or "Numeric")') self.size = (xDimension, yDimension, zDimension) self.clear() def clear(self): self.items = {}