Beispiel #1
0
def translate(game, print_func = dummy_out):
    onepointfive = game.settings.get('old', False)
    mfa = MFA(ByteReader(open('template.mfa', 'rb')))

    # mfa = MFA()
    mfa.frames = []
    mfa.mfaBuild = 4 #MFA_CURRENT_VERSION
    mfa.product = game.productVersion
    mfa.buildVersion = 251
    mfa.name = game.name or ''
    mfa.description = ''
    mfa.path = game.editorFilename
    mfa.stamp = 6196 * '\x00'

    mfa.fonts = game.fonts or mfa.new(FontBank, compressed = False)
    mfa.sounds = game.sounds or mfa.new(SoundBank, compressed = False)
    mfa.music = game.music or mfa.new(MusicBank, compressed = False)
    for bank in (mfa.fonts, mfa.sounds, mfa.music):
        if bank.items is None:
            continue
        for item in bank.items:
            item.settings = {'compressed' : False}

    # mfa.icons = mfa.new(AGMIBank)
    images = mfa.new(AGMIBank)
    images.items = game.images.items
    for item in images.items:
        item.settings['debug'] = True
    mfa.images = images
    for item in (mfa.images, mfa.icons):
        item.paletteVersion = 768
        item.paletteEntries = 256
        item.palette = mfa.icons.palette
    mfa.author = game.author or ''
    mfa.copyright = game.copyright or ''
    mfa.company = ''
    mfa.version = ''
    if game.files is not None:
        for binaryFile in game.files.items:
            mfa.binaryFiles.append(binaryFile.name)
    header = game.header
    displaySettings = mfa.displaySettings
    graphicSettings = mfa.graphicSettings
    flags = header.flags
    newFlags = header.newFlags
    otherFlags = header.otherFlags
    displaySettings['MDI'] = newFlags['MDI']
    displaySettings['MenuBar'] = flags['MenuBar']
    displaySettings['MenuOnBoot'] = not flags['MenuHidden']
    graphicSettings['MultiSamples'] = flags['MultiSamples']
    mfa.windowSize = (header.windowWidth, header.windowHeight)
    mfa.borderColor = header.borderColor
    mfa.helpFile = ''
    mfa.vitalizePreview = ''
    mfa.initialScore = header.initialScore
    mfa.initialLifes = header.initialLives
    mfa.frameRate = header.frameRate or 50
    mfa.buildType = 0
    mfa.buildPath = game.targetFilename
    mfa.commandLine = ''
    mfa.aboutBox = game.aboutText or ''
    controls = mfa.new(Controls)
    for control in header.controls.items:
        newControl = controls.new(PlayerControl)
        newControl.controlType = 4
        keys = control.keys
        for key in ('up', 'down', 'left', 'right', 'button1', 'button2',
        'button3', 'button4'):
            try:
                key_value = getattr(keys, key).getValue()
            except AttributeError:
                key_value = 0
            getattr(newControl, key).setValue(key_value)
        controls.controls.append(newControl)
    mfa.controls = controls
    mfa.menu = game.menu
    mfa.windowMenuIndex = header.windowsMenuIndex or 0
    mfa.menuImages = {}
    globalValues = mfa.new(ValueList)
    if game.globalValues is not None:
        for index, item in enumerate(game.globalValues.items):
            newValue = ValueItem()
            newValue.name = 'Global Value %s' % (index + 1)
            newValue.value = item
            globalValues.items.append(newValue)
    globalStrings = mfa.new(ValueList)
    if game.globalStrings is not None:
        for index, item in enumerate(game.globalStrings.items):
            newValue = ValueItem()
            newValue.name = 'Global String %s' % (index + 1)
            newValue.value = item
            globalStrings.items.append(newValue)

    mfa.globalValues = globalValues
    mfa.globalStrings = globalStrings

    mfa.globalEvents = ''
    mfa.graphicMode = header.mode
    # mfa.iconImages = []
    mfa.customQualifiers = {}
    mfa.chunks = mfa.new(ChunkList)

    frameItems = {}

    for itemIndex, item in enumerate(game.frameItems.items):
    # for itemIndex, item in enumerate([]):
        newItem = mfa.new(FrameItem)
        newItem.name = item.name or ('Unnamed %s' % itemIndex)
        newItem.objectType = item.objectType
        newItem.handle = item.handle
        newItem.transparent = item.transparent
        newItem.inkEffect = item.inkEffect
        newItem.inkEffectParameter = item.inkEffectValue
        newItem.antiAliasing = item.antialias
        newItem.flags.setFlags(item.flags.getFlags())
        newItem.iconHandle = 10
        newItem.chunks = newItem.new(ChunkList)
        itemLoader = item.properties.loader
        if item.objectType >= EXTENSION_BASE:
            objectClass = ExtensionObject
        else:
            objectClass = FRAME_ITEM_LOADERS[item.objectType]
        newLoader = newItem.loader = newItem.new(objectClass)
        if item.objectType in (QUICKBACKDROP, BACKDROP):
            newLoader.obstacleType = itemLoader.obstacleType
            newLoader.collisionType = itemLoader.collisionMode
            if item.objectType == QUICKBACKDROP:
                newLoader.width = itemLoader.width
                newLoader.height = itemLoader.height
                shape = itemLoader.shape
                newLoader.shape = shape.shape
                newLoader.borderSize = shape.borderSize
                newLoader.borderColor = shape.borderColor
                newLoader.fillType = shape.fillType
                newLoader.color1 = shape.color1 or (0, 0, 0)
                newLoader.color2 = shape.color2 or (0, 0, 0)
                newLoader.flags.setFlags(shape.gradientFlags)
                newLoader.image = shape.image
            else:
                newLoader.handle = itemLoader.image
        else:
            newLoader.objectFlags.setFlags(itemLoader.flags.getFlags())
            try:
                newLoader.newObjectFlags.setFlags(
                    itemLoader.newFlags.getFlags())
            except AttributeError:
                # could happen for MMF1.5
                pass
            newLoader.backgroundColor = itemLoader.backColour
            newLoader.qualifiers = itemLoader.qualifiers
            newLoader.values = convert_alterables(itemLoader.values, 'Value')
            newLoader.strings = convert_alterables(itemLoader.strings, 'String')

            newLoader.movements = movements = newLoader.new(Movements)
            for index, movement in enumerate(itemLoader.movements.items):
                newMovement = movements.new(Movement)
                newMovement.name = 'Movement #%s' % (index + 1)
                if movement.getName() == 'Extension':
                    newMovement.extension = movement.loader.name + '.mvx'
                    newMovement.identifier = movement.loader.id
                else:
                    newMovement.extension = ''
                    newMovement.identifier = movement.type
                    newMovement.player = movement.player
                    newMovement.type = movement.type
                    newMovement.movingAtStart = movement.movingAtStart
                    newMovement.directionAtStart = movement.directionAtStart
                newMovement.loader = movement.loader
                movements.items.append(newMovement)

            newLoader.behaviours = newLoader.new(Behaviours)
            newLoader.fadeIn = convert_transition(itemLoader.fadeIn)
            newLoader.fadeOut = convert_transition(itemLoader.fadeOut)
            if itemLoader.animations is not None:
                animationHeader = itemLoader.animations
                newLoader.items = items = []
                for i in xrange(max(animationHeader.loadedAnimations) + 1):
                    newAnimation = newLoader.new(Animation)
                    items.append(newAnimation)
                    newAnimation.directions = newDirections = []
                    try:
                        animation = animationHeader.loadedAnimations[i]
                    except KeyError:
                        continue
                    for n, direction in animation.loadedDirections.iteritems():
                        newDirection = newAnimation.new(AnimationDirection)
                        newDirections.append(newDirection)
                        newDirection.index = n
                        newDirection.minSpeed = direction.minSpeed
                        newDirection.maxSpeed = direction.maxSpeed
                        newDirection.repeat = direction.repeat
                        newDirection.backTo = direction.backTo
                        newDirection.frames = direction.frames
            if item.objectType >= EXTENSION_BASE:
                extension = item.getExtension(game.extensions)
                newLoader.extensionType = -1
                newLoader.extensionName = ''
                newLoader.filename = extension.name + '.mfx'
                newLoader.magic = extension.magicNumber
                newLoader.subType = extension.subType
                newLoader.extensionVersion = itemLoader.extensionVersion
                newLoader.extensionId = itemLoader.extensionId
                newLoader.extensionPrivate = itemLoader.extensionPrivate
                newLoader.extensionData = itemLoader.extensionData or ''
            elif item.objectType == COUNTER:
                counter = itemLoader.counter
                counters = itemLoader.counters
                newLoader.value = counter.initial
                newLoader.minimum = counter.minimum
                newLoader.maximum = counter.maximum
                if counters is None:
                    newLoader.displayType = HIDDEN
                    shape = None
                    newLoader.countType = 0
                    newLoader.width = 0
                    newLoader.height = 0
                    newLoader.images = []
                    newLoader.font = 0
                else:
                    shape = counters.shape
                    newLoader.displayType = counters.displayType
                    newLoader.countType = counters.inverse
                    newLoader.width = counters.width
                    newLoader.height = counters.height
                    newLoader.images = counters.frames or []
                    newLoader.font = counters.font or 0
                if shape is None:
                    color1 = color2 = (0, 0, 0)
                    newLoader.verticalGradient = 0
                    newLoader.flags = 0
                else:
                    color1 = shape.color1 or (0, 0, 0)
                    color2 = shape.color2 or (0, 0, 0)
                    newLoader.verticalGradient = shape.gradientFlags or 0
                    newLoader.flags = shape.fillType
                newLoader.color1 = color1
                newLoader.color2 = color2
            elif item.objectType in (SCORE, LIVES):
                counters = itemLoader.counters
                newLoader.player = counters.player
                newLoader.images = counters.frames or []
                newLoader.displayType = counters.displayType
                newLoader.flags = counters.flags
                newLoader.font = counters.font
                newLoader.width = counters.width
                newLoader.height = counters.height
            elif item.objectType == RTF:
                rtf = itemLoader.rtf
                newLoader.width = rtf.width
                newLoader.height = rtf.height
                newLoader.value = rtf.value
                newLoader.color = rtf.color
                newLoader.flags = rtf.options.getFlags()
            elif item.objectType == SUBAPPLICATION:
                subApplication = itemLoader.subApplication
                newLoader.width = subApplication.width
                newLoader.height = subApplication.height
                newLoader.filename = subApplication.name
                if subApplication.options['Internal']:
                    startFrame = subApplication.startFrame
                else:
                    startFrame = -1
                newLoader.startFrame = startFrame
                newLoader.options.setFlags(subApplication.options.getFlags())
            elif item.objectType == TEXT:
                text = itemLoader.text
                newLoader.width = text.width
                newLoader.height = text.height
                paragraph = text.items[0]
                newLoader.font = paragraph.font
                newLoader.color = paragraph.color
                newLoader.flags = 0
                newLoader.items = paragraphs = []
                for paragraph in text.items:
                    newParagraph = newLoader.new(Paragraph)
                    paragraphs.append(newParagraph)
                    newParagraph.value = paragraph.value
                    newParagraph.flags = paragraph.flags.getFlags()
            elif item.objectType == QUESTION:
                text = itemLoader.text
                newLoader.width = text.width
                newLoader.height = text.height
                question = text.items[0]
                answer = text.items[1]
                print question.font
                newLoader.questionFont = question.font
                newLoader.questionColor = question.color
                newLoader.questionFlags = 0
                newLoader.question = question.value
                newLoader.answerFont = answer.font
                newLoader.answerColor = answer.color
                newLoader.answerFlags = 0
                newLoader.items = paragraphs = []
                for paragraph in text.items[1:]:
                    newParagraph = newLoader.new(Paragraph)
                    paragraphs.append(newParagraph)
                    newParagraph.value = paragraph.value
                    newParagraph.flags = paragraph.flags.getFlags()
        frameItems[newItem.handle] = newItem

    qualifiers = {}

    indexHandles = dict(
        [(v, index) for (index, v) in enumerate(game.frameHandles)])

    for index, frame in enumerate(game.frames[:20]):
        frame.load()
        newFrame = mfa.new(Frame)
        newFrame.handle = indexHandles[index]
        newFrame.name = frame.name or ''
        newFrame.size = (frame.width, frame.height)
        newFrame.background = frame.background
        newFrame.fadeIn = convert_transition(frame.fadeIn)
        newFrame.fadeOut = convert_transition(frame.fadeOut)
        flags = newFrame.flags
        originalFlags = frame.flags
        flags['GrabDesktop'] = originalFlags['GrabDesktop']
        flags['KeepDisplay'] = originalFlags['KeepDisplay']
        flags['BackgroundCollisions'] = originalFlags['TotalCollisionMask']
        flags['ResizeToScreen'] = originalFlags['ResizeAtStart']
        flags['ForceLoadOnCall'] = originalFlags['ForceLoadOnCall']
        flags['NoDisplaySurface'] = False#originalFlags['NoSurface']
        flags['TimerBasedMovements'] = originalFlags['TimedMovements']
        newFrame.maxObjects = frame.maxObjects
        newFrame.password = frame.password or ''
        newFrame.lastViewedX = 320
        newFrame.lastViewedY = 240
        newFrame.palette = newFrame.palette
        newFrame.stampHandle = 12
        newFrame.activeLayer = 0
        newFrame.layers = layers = []
        try:
            for layer in frame.layers.items:
                newLayer = newFrame.new(Layer)
                newLayer.name = layer.name
                flags = newLayer.flags
                originalFlags = layer.flags
                flags['HideAtStart'] = originalFlags['ToHide']
                flags['Visible'] = True
                flags['NoBackground'] = originalFlags['DoNotSaveBackground']
                flags['WrapHorizontally'] = originalFlags['WrapHorizontally']
                flags['WrapVertically'] = originalFlags['WrapVertically']
                newLayer.xCoefficient = layer.xCoefficient
                newLayer.yCoefficient = layer.yCoefficient
                layers.append(newLayer)
        except AttributeError:
            # MMF 1.5
            layer = newFrame.new(Layer)
            layer.name = 'Default Layer'
            layer.xCoefficient = layer.yCoefficient = 1.0
            layers.append(layer)
        newFrameItems = set()
        newFrame.instances = instances = []
        print_func('Translating frame %r (%s)' % (newFrame.name, index))
        if frame.instances is not None:
            for instanceIndex, instance in enumerate(frame.instances.items):
                try:
                    frameItem = frameItems[instance.objectInfo]
                except KeyError:
                    continue
                newFrameItems.add(frameItem)
                newInstance = newFrame.new(FrameInstance)
                newInstance.x = instance.x
                newInstance.y = instance.y
                newInstance.handle = instanceIndex
                if instance.parentType != NONE_PARENT:
                    newInstance.flags = 8
                else:
                    newInstance.flags = 0
                newInstance.parentType = instance.parentType
                newInstance.itemHandle = instance.objectInfo
                parentHandle = instance.parentHandle
                newInstance.parentHandle = parentHandle
                newInstance.layer = instance.layer
                instances.append(newInstance)
        newFrame.items = list(newFrameItems)
        newFrame.folders = folders = []
        for item in newFrame.items:
            newFolder = newFrame.new(ItemFolder)
            newFolder.items = [item.handle]
            folders.append(newFolder)
        events = newFrame.events = frame.new(Events)
        events.version = 1027
        events.frameType = 0
        events.items = frame.events.items
        events.objects = objects = []
        for item in newFrame.items:
            newObject = events.new(EventObject)
            objects.append(newObject)
            newObject.handle = item.handle
            newObject.name = item.name
            newObject.typeName = ''
            newObject.itemType = item.objectType
            newObject.objectType = FRAME_ITEM_TYPE
            newObject.flags = 0
            newObject.itemHandle = item.handle
            newObject.instanceHandle = 0xFFFFFFFF
        for k, item in frame.events.qualifiers.iteritems():
            key = (k, item.type)
            objectInfo = item.objectInfo
            if key in qualifiers:
                newObject = qualifiers[key]
                newHandle = newObject.handle
            else:
                newObject = events.new(EventObject)
                qualifiers[key] = newObject
                newHandle = 0
                while 1:
                    if newHandle not in qualifiers and newHandle not in frameItems:
                        break
                    newHandle += 1
                frameItems[newHandle] = newObject
                newObject.handle = newHandle
                newObject.systemQualifier = item.qualifier
                newObject.name = ''
                newObject.typeName = ''
                newObject.itemType = item.type
                newObject.objectType = SYSTEM_ITEM_TYPE
                newObject.flags = 0
            for eventGroup in frame.events.items:
                for aceList in (eventGroup.actions, eventGroup.conditions):
                    for ace in aceList:
                        if ace.objectInfo == objectInfo:
                            ace.objectInfo = newHandle
                        for parameter in ace.items:
                            parameter = parameter.loader
                            if hasattr(parameter, 'objectInfo'):
                                if parameter.objectInfo == objectInfo:
                                    parameter.objectInfo = newHandle
                            if hasattr(parameter, 'objectInfoParent'):
                                if parameter.objectInfoParent == objectInfo:
                                    parameter.objectInfoParent = newHandle
                            if hasattr(parameter, 'position'):
                                position = parameter.position
                                if position.objectInfoParent == objectInfo:
                                    position.objectInfoParent = newHandle
                            if parameter.isExpression:
                                for expression in parameter.items:
                                    if expression.objectInfo == objectInfo:
                                        expression.objectInfo = newHandle
            objects.append(newObject)
        # group stuff
        groups = {}
        groupId = 0
        def loop_parameters():
            for eventGroup in frame.events.items:
                for aceList in (eventGroup.actions, eventGroup.conditions):
                    for ace in aceList:
                        for parameter in ace.items:
                            yield parameter.getName(), parameter.loader

        for name, parameter in loop_parameters():
            if name == 'GROUP':
                offset = parameter.offset
                if onepointfive:
                    offset = parameter.offset + 2
                groups[offset] = groupId
                parameter.id = groupId
                parameter.password = make_group_checksum('', parameter.name)
                groupId += 1

        for name, parameter in loop_parameters():
            if name == 'GROUPOINTER':
                parameter.id = groups[parameter.pointer]
                parameter.savedPointer = parameter.pointer = 0

        newFrame.chunks = mfa.new(ChunkList)
        mfa.frames.append(save_data_loader(newFrame))
        frame.close()

    return mfa
def translate(game, print_func=dummy_out):
    onepointfive = game.settings.get('old', False)
    mfa = MFA(ByteReader(open('template.mfa', 'rb')))

    # mfa = MFA()
    mfa.frames = []
    mfa.mfaBuild = 4  #MFA_CURRENT_VERSION
    mfa.product = game.productVersion
    mfa.buildVersion = 251
    mfa.name = game.name or ''
    mfa.description = ''
    mfa.path = game.editorFilename
    mfa.stamp = 6196 * '\x00'

    mfa.fonts = game.fonts or mfa.new(FontBank, compressed=False)
    mfa.sounds = game.sounds or mfa.new(SoundBank, compressed=False)
    mfa.music = game.music or mfa.new(MusicBank, compressed=False)
    for bank in (mfa.fonts, mfa.sounds, mfa.music):
        if bank.items is None:
            continue
        for item in bank.items:
            item.settings = {'compressed': False}

    # mfa.icons = mfa.new(AGMIBank)
    images = mfa.new(AGMIBank)
    images.items = game.images.items
    for item in images.items:
        item.settings['debug'] = True
    mfa.images = images
    for item in (mfa.images, mfa.icons):
        item.paletteVersion = 768
        item.paletteEntries = 256
        item.palette = mfa.icons.palette
    mfa.author = game.author or ''
    mfa.copyright = game.copyright or ''
    mfa.company = ''
    mfa.version = ''
    if game.files is not None:
        for binaryFile in game.files.items:
            mfa.binaryFiles.append(binaryFile.name)
    header = game.header
    displaySettings = mfa.displaySettings
    graphicSettings = mfa.graphicSettings
    flags = header.flags
    newFlags = header.newFlags
    otherFlags = header.otherFlags
    displaySettings['MDI'] = newFlags['MDI']
    displaySettings['MenuBar'] = flags['MenuBar']
    displaySettings['MenuOnBoot'] = not flags['MenuHidden']
    graphicSettings['MultiSamples'] = flags['MultiSamples']
    mfa.windowSize = (header.windowWidth, header.windowHeight)
    mfa.borderColor = header.borderColor
    mfa.helpFile = ''
    mfa.vitalizePreview = ''
    mfa.initialScore = header.initialScore
    mfa.initialLifes = header.initialLives
    mfa.frameRate = header.frameRate or 50
    mfa.buildType = 0
    mfa.buildPath = game.targetFilename
    mfa.commandLine = ''
    mfa.aboutBox = game.aboutText or ''
    controls = mfa.new(Controls)
    for control in header.controls.items:
        newControl = controls.new(PlayerControl)
        newControl.controlType = 4
        keys = control.keys
        for key in ('up', 'down', 'left', 'right', 'button1', 'button2',
                    'button3', 'button4'):
            try:
                key_value = getattr(keys, key).getValue()
            except AttributeError:
                key_value = 0
            getattr(newControl, key).setValue(key_value)
        controls.controls.append(newControl)
    mfa.controls = controls
    mfa.menu = game.menu
    mfa.windowMenuIndex = header.windowsMenuIndex or 0
    mfa.menuImages = {}
    globalValues = mfa.new(ValueList)
    if game.globalValues is not None:
        for index, item in enumerate(game.globalValues.items):
            newValue = ValueItem()
            newValue.name = 'Global Value %s' % (index + 1)
            newValue.value = item
            globalValues.items.append(newValue)
    globalStrings = mfa.new(ValueList)
    if game.globalStrings is not None:
        for index, item in enumerate(game.globalStrings.items):
            newValue = ValueItem()
            newValue.name = 'Global String %s' % (index + 1)
            newValue.value = item
            globalStrings.items.append(newValue)

    mfa.globalValues = globalValues
    mfa.globalStrings = globalStrings

    mfa.globalEvents = ''
    mfa.graphicMode = header.mode
    # mfa.iconImages = []
    mfa.customQualifiers = {}
    mfa.chunks = mfa.new(ChunkList)

    frameItems = {}

    for itemIndex, item in enumerate(game.frameItems.items):
        # for itemIndex, item in enumerate([]):
        newItem = mfa.new(FrameItem)
        newItem.name = item.name or ('Unnamed %s' % itemIndex)
        newItem.objectType = item.objectType
        newItem.handle = item.handle
        newItem.transparent = item.transparent
        newItem.inkEffect = item.inkEffect
        newItem.inkEffectParameter = item.inkEffectValue
        newItem.antiAliasing = item.antialias
        newItem.flags.setFlags(item.flags.getFlags())
        newItem.iconHandle = 10
        newItem.chunks = newItem.new(ChunkList)
        itemLoader = item.properties.loader
        if item.objectType >= EXTENSION_BASE:
            objectClass = ExtensionObject
        else:
            objectClass = FRAME_ITEM_LOADERS[item.objectType]
        newLoader = newItem.loader = newItem.new(objectClass)
        if item.objectType in (QUICKBACKDROP, BACKDROP):
            newLoader.obstacleType = itemLoader.obstacleType
            newLoader.collisionType = itemLoader.collisionMode
            if item.objectType == QUICKBACKDROP:
                newLoader.width = itemLoader.width
                newLoader.height = itemLoader.height
                shape = itemLoader.shape
                newLoader.shape = shape.shape
                newLoader.borderSize = shape.borderSize
                newLoader.borderColor = shape.borderColor
                newLoader.fillType = shape.fillType
                newLoader.color1 = shape.color1 or (0, 0, 0)
                newLoader.color2 = shape.color2 or (0, 0, 0)
                newLoader.flags.setFlags(shape.gradientFlags)
                newLoader.image = shape.image
            else:
                newLoader.handle = itemLoader.image
        else:
            newLoader.objectFlags.setFlags(itemLoader.flags.getFlags())
            try:
                newLoader.newObjectFlags.setFlags(
                    itemLoader.newFlags.getFlags())
            except AttributeError:
                # could happen for MMF1.5
                pass
            newLoader.backgroundColor = itemLoader.backColour
            newLoader.qualifiers = itemLoader.qualifiers
            newLoader.values = convert_alterables(itemLoader.values, 'Value')
            newLoader.strings = convert_alterables(itemLoader.strings,
                                                   'String')

            newLoader.movements = movements = newLoader.new(Movements)
            for index, movement in enumerate(itemLoader.movements.items):
                newMovement = movements.new(Movement)
                newMovement.name = 'Movement #%s' % (index + 1)
                if movement.getName() == 'Extension':
                    newMovement.extension = movement.loader.name + '.mvx'
                    newMovement.identifier = movement.loader.id
                else:
                    newMovement.extension = ''
                    newMovement.identifier = movement.type
                    newMovement.player = movement.player
                    newMovement.type = movement.type
                    newMovement.movingAtStart = movement.movingAtStart
                    newMovement.directionAtStart = movement.directionAtStart
                newMovement.loader = movement.loader
                movements.items.append(newMovement)

            newLoader.behaviours = newLoader.new(Behaviours)
            newLoader.fadeIn = convert_transition(itemLoader.fadeIn)
            newLoader.fadeOut = convert_transition(itemLoader.fadeOut)
            if itemLoader.animations is not None:
                animationHeader = itemLoader.animations
                newLoader.items = items = []
                for i in xrange(max(animationHeader.loadedAnimations) + 1):
                    newAnimation = newLoader.new(Animation)
                    items.append(newAnimation)
                    newAnimation.directions = newDirections = []
                    try:
                        animation = animationHeader.loadedAnimations[i]
                    except KeyError:
                        continue
                    for n, direction in animation.loadedDirections.iteritems():
                        newDirection = newAnimation.new(AnimationDirection)
                        newDirections.append(newDirection)
                        newDirection.index = n
                        newDirection.minSpeed = direction.minSpeed
                        newDirection.maxSpeed = direction.maxSpeed
                        newDirection.repeat = direction.repeat
                        newDirection.backTo = direction.backTo
                        newDirection.frames = direction.frames
            if item.objectType >= EXTENSION_BASE:
                extension = item.getExtension(game.extensions)
                newLoader.extensionType = -1
                newLoader.extensionName = ''
                newLoader.filename = extension.name + '.mfx'
                newLoader.magic = extension.magicNumber
                newLoader.subType = extension.subType
                newLoader.extensionVersion = itemLoader.extensionVersion
                newLoader.extensionId = itemLoader.extensionId
                newLoader.extensionPrivate = itemLoader.extensionPrivate
                newLoader.extensionData = itemLoader.extensionData or ''
            elif item.objectType == COUNTER:
                counter = itemLoader.counter
                counters = itemLoader.counters
                newLoader.value = counter.initial
                newLoader.minimum = counter.minimum
                newLoader.maximum = counter.maximum
                if counters is None:
                    newLoader.displayType = HIDDEN
                    shape = None
                    newLoader.countType = 0
                    newLoader.width = 0
                    newLoader.height = 0
                    newLoader.images = []
                    newLoader.font = 0
                else:
                    shape = counters.shape
                    newLoader.displayType = counters.displayType
                    newLoader.countType = counters.inverse
                    newLoader.width = counters.width
                    newLoader.height = counters.height
                    newLoader.images = counters.frames or []
                    newLoader.font = counters.font or 0
                if shape is None:
                    color1 = color2 = (0, 0, 0)
                    newLoader.verticalGradient = 0
                    newLoader.flags = 0
                else:
                    color1 = shape.color1 or (0, 0, 0)
                    color2 = shape.color2 or (0, 0, 0)
                    newLoader.verticalGradient = shape.gradientFlags or 0
                    newLoader.flags = shape.fillType
                newLoader.color1 = color1
                newLoader.color2 = color2
            elif item.objectType in (SCORE, LIVES):
                counters = itemLoader.counters
                newLoader.player = counters.player
                newLoader.images = counters.frames or []
                newLoader.displayType = counters.displayType
                newLoader.flags = counters.flags
                newLoader.font = counters.font
                newLoader.width = counters.width
                newLoader.height = counters.height
            elif item.objectType == RTF:
                rtf = itemLoader.rtf
                newLoader.width = rtf.width
                newLoader.height = rtf.height
                newLoader.value = rtf.value
                newLoader.color = rtf.color
                newLoader.flags = rtf.options.getFlags()
            elif item.objectType == SUBAPPLICATION:
                subApplication = itemLoader.subApplication
                newLoader.width = subApplication.width
                newLoader.height = subApplication.height
                newLoader.filename = subApplication.name
                if subApplication.options['Internal']:
                    startFrame = subApplication.startFrame
                else:
                    startFrame = -1
                newLoader.startFrame = startFrame
                newLoader.options.setFlags(subApplication.options.getFlags())
            elif item.objectType == TEXT:
                text = itemLoader.text
                newLoader.width = text.width
                newLoader.height = text.height
                paragraph = text.items[0]
                newLoader.font = paragraph.font
                newLoader.color = paragraph.color
                newLoader.flags = 0
                newLoader.items = paragraphs = []
                for paragraph in text.items:
                    newParagraph = newLoader.new(Paragraph)
                    paragraphs.append(newParagraph)
                    newParagraph.value = paragraph.value
                    newParagraph.flags = paragraph.flags.getFlags()
            elif item.objectType == QUESTION:
                text = itemLoader.text
                newLoader.width = text.width
                newLoader.height = text.height
                question = text.items[0]
                answer = text.items[1]
                print question.font
                newLoader.questionFont = question.font
                newLoader.questionColor = question.color
                newLoader.questionFlags = 0
                newLoader.question = question.value
                newLoader.answerFont = answer.font
                newLoader.answerColor = answer.color
                newLoader.answerFlags = 0
                newLoader.items = paragraphs = []
                for paragraph in text.items[1:]:
                    newParagraph = newLoader.new(Paragraph)
                    paragraphs.append(newParagraph)
                    newParagraph.value = paragraph.value
                    newParagraph.flags = paragraph.flags.getFlags()
        frameItems[newItem.handle] = newItem

    qualifiers = {}

    indexHandles = dict([(v, index)
                         for (index, v) in enumerate(game.frameHandles)])

    for index, frame in enumerate(game.frames):
        #print 'this application has %s frames. I am currently working on frame %s.' % (len(game.frames), len(frame)) #invalid type lol
        frame.load()
        newFrame = mfa.new(Frame)
        newFrame.handle = indexHandles[index]
        newFrame.name = frame.name or ''
        newFrame.size = (frame.width, frame.height)
        newFrame.background = frame.background
        newFrame.fadeIn = convert_transition(frame.fadeIn)
        newFrame.fadeOut = convert_transition(frame.fadeOut)
        flags = newFrame.flags
        originalFlags = frame.flags
        flags['GrabDesktop'] = originalFlags['GrabDesktop']
        flags['KeepDisplay'] = originalFlags['KeepDisplay']
        flags['BackgroundCollisions'] = originalFlags['TotalCollisionMask']
        flags['ResizeToScreen'] = originalFlags['ResizeAtStart']
        flags['ForceLoadOnCall'] = originalFlags['ForceLoadOnCall']
        flags['NoDisplaySurface'] = False  #originalFlags['NoSurface']
        flags['TimerBasedMovements'] = originalFlags['TimedMovements']
        newFrame.maxObjects = frame.maxObjects
        newFrame.password = frame.password or ''
        newFrame.lastViewedX = 320
        newFrame.lastViewedY = 240
        newFrame.palette = newFrame.palette
        newFrame.stampHandle = 12
        newFrame.activeLayer = 0
        newFrame.layers = layers = []
        try:
            for layer in frame.layers.items:
                newLayer = newFrame.new(Layer)
                newLayer.name = layer.name
                flags = newLayer.flags
                originalFlags = layer.flags
                flags['HideAtStart'] = originalFlags['ToHide']
                flags['Visible'] = True
                flags['NoBackground'] = originalFlags['DoNotSaveBackground']
                flags['WrapHorizontally'] = originalFlags['WrapHorizontally']
                flags['WrapVertically'] = originalFlags['WrapVertically']
                newLayer.xCoefficient = layer.xCoefficient
                newLayer.yCoefficient = layer.yCoefficient
                layers.append(newLayer)
        except AttributeError:
            # MMF 1.5
            layer = newFrame.new(Layer)
            layer.name = 'Default Layer'
            layer.xCoefficient = layer.yCoefficient = 1.0
            layers.append(layer)
        newFrameItems = set()
        newFrame.instances = instances = []
        print_func('Translating frame %r (%s)' % (newFrame.name, index))
        if frame.instances is not None:
            for instanceIndex, instance in enumerate(frame.instances.items):
                try:
                    frameItem = frameItems[instance.objectInfo]
                except KeyError:
                    continue
                newFrameItems.add(frameItem)
                newInstance = newFrame.new(FrameInstance)
                newInstance.x = instance.x
                newInstance.y = instance.y
                newInstance.handle = instanceIndex
                if instance.parentType != NONE_PARENT:
                    newInstance.flags = 8
                else:
                    newInstance.flags = 0
                newInstance.parentType = instance.parentType
                newInstance.itemHandle = instance.objectInfo
                parentHandle = instance.parentHandle
                newInstance.parentHandle = parentHandle
                newInstance.layer = instance.layer
                instances.append(newInstance)
        newFrame.items = list(newFrameItems)
        newFrame.folders = folders = []
        for item in newFrame.items:
            newFolder = newFrame.new(ItemFolder)
            newFolder.items = [item.handle]
            folders.append(newFolder)
        events = newFrame.events = frame.new(Events)
        events.version = 1027
        events.frameType = 0
        events.items = frame.events.items
        events.objects = objects = []
        for item in newFrame.items:
            newObject = events.new(EventObject)
            objects.append(newObject)
            newObject.handle = item.handle
            newObject.name = item.name
            newObject.typeName = ''
            newObject.itemType = item.objectType
            newObject.objectType = FRAME_ITEM_TYPE
            newObject.flags = 0
            newObject.itemHandle = item.handle
            newObject.instanceHandle = 0xFFFFFFFF
        for k, item in frame.events.qualifiers.iteritems():
            key = (k, item.type)
            objectInfo = item.objectInfo
            if key in qualifiers:
                newObject = qualifiers[key]
                newHandle = newObject.handle
            else:
                newObject = events.new(EventObject)
                qualifiers[key] = newObject
                newHandle = 0
                while 1:
                    if newHandle not in qualifiers and newHandle not in frameItems:
                        break
                    newHandle += 1
                frameItems[newHandle] = newObject
                newObject.handle = newHandle
                newObject.systemQualifier = item.qualifier
                newObject.name = ''
                newObject.typeName = ''
                newObject.itemType = item.type
                newObject.objectType = SYSTEM_ITEM_TYPE
                newObject.flags = 0
            for eventGroup in frame.events.items:
                for aceList in (eventGroup.actions, eventGroup.conditions):
                    for ace in aceList:
                        if ace.objectInfo == objectInfo:
                            ace.objectInfo = newHandle
                        for parameter in ace.items:
                            parameter = parameter.loader
                            if hasattr(parameter, 'objectInfo'):
                                if parameter.objectInfo == objectInfo:
                                    parameter.objectInfo = newHandle
                            if hasattr(parameter, 'objectInfoParent'):
                                if parameter.objectInfoParent == objectInfo:
                                    parameter.objectInfoParent = newHandle
                            if hasattr(parameter, 'position'):
                                position = parameter.position
                                if position.objectInfoParent == objectInfo:
                                    position.objectInfoParent = newHandle
                            if parameter.isExpression:
                                for expression in parameter.items:
                                    if expression.objectInfo == objectInfo:
                                        expression.objectInfo = newHandle
            objects.append(newObject)
        # group stuff
        groups = {}
        groupId = 0

        def loop_parameters():
            for eventGroup in frame.events.items:
                for aceList in (eventGroup.actions, eventGroup.conditions):
                    for ace in aceList:
                        for parameter in ace.items:
                            yield parameter.getName(), parameter.loader

        for name, parameter in loop_parameters():
            if name == 'GROUP':
                print "loopname GROUP"
                offset = parameter.offset
                print "offset:"
                print offset
                if onepointfive:
                    offset += 2
                else:
                    offset -= 2
                groups[offset] = groupId
                parameter.id = groupId
                parameter.password = make_group_checksum('', parameter.name)
                groupId += 1

        for name, parameter in loop_parameters():
            if name == 'GROUPOINTER':
                parameter.id = groups[parameter.pointer]
                parameter.savedPointer = parameter.pointer = 0

        newFrame.chunks = mfa.new(ChunkList)
        mfa.frames.append(save_data_loader(newFrame))
        frame.close()

    return mfa