コード例 #1
0
        public override void ConvertProject(ProjectFile pf)
        {
            GMList <GMPath> dataAssets = pf.DataHandle.GetChunk <GMChunkPATH>().List;

            dataAssets.Clear();
            for (int i = 0; i < pf.Paths.Count; i++)
            {
                AssetPath assetPath = pf.Paths[i].Asset;
                if (assetPath == null)
                {
                    // This asset was never converted
                    dataAssets.Add((GMPath)pf.Paths[i].DataAsset);
                    continue;
                }

                dataAssets.Add(new GMPath()
                {
                    Name      = pf.DataHandle.DefineString(assetPath.Name),
                    Smooth    = assetPath.Smooth,
                    Closed    = assetPath.Closed,
                    Precision = assetPath.Precision,
                    Points    = new GMList <GMPath.Point>()
                });

                GMPath gmPath = dataAssets[dataAssets.Count - 1];
                foreach (AssetPath.Point point in assetPath.Points)
                {
                    gmPath.Points.Add(new GMPath.Point()
                    {
                        X = point.X, Y = point.Y, Speed = point.Speed
                    });
                }
            }
        }
コード例 #2
0
        private static void ConvertPaths(ProjectFile pf)
        {
            GMList <GMPath> dataAssets = ((GMChunkPATH)pf.DataHandle.Chunks["PATH"]).List;

            dataAssets.Clear();
            for (int i = 0; i < pf.Paths.Count; i++)
            {
                AssetPath assetPath = pf.Paths[i];
                dataAssets.Add(new GMPath()
                {
                    Name      = pf.DataHandle.DefineString(assetPath.Name),
                    Smooth    = assetPath.Smooth,
                    Closed    = assetPath.Closed,
                    Precision = assetPath.Precision,
                    Points    = new GMList <GMPath.Point>()
                });

                GMPath gmPath = dataAssets[dataAssets.Count - 1];
                foreach (AssetPath.Point point in assetPath.Points)
                {
                    gmPath.Points.Add(new GMPath.Point()
                    {
                        X = point.X, Y = point.Y, Speed = point.Speed
                    });
                }
            }
        }
コード例 #3
0
        private static void ConvertObjects(ProjectFile pf)
        {
            GMList <GMObject> dataAssets  = ((GMChunkOBJT)pf.DataHandle.Chunks["OBJT"]).List;
            GMList <GMSprite> dataSprites = ((GMChunkSPRT)pf.DataHandle.Chunks["SPRT"]).List;
            GMList <GMCode>   dataCode    = ((GMChunkCODE)pf.DataHandle.Chunks["CODE"]).List;

            int getSprite(string name)
            {
                if (name == null)
                {
                    return(-1);
                }
                try
                {
                    return(dataSprites.Select((elem, index) => new { elem, index }).First(p => p.elem.Name.Content == name).index);
                }
                catch (InvalidOperationException)
                {
                    return(-1);
                }
            }

            int getCode(string name)
            {
                try
                {
                    return(dataCode.Select((elem, index) => new { elem, index }).First(p => p.elem.Name.Content == name).index);
                }
                catch (InvalidOperationException)
                {
                    return(-1);
                }
            }

            int getObject(string name)
            {
                if (name == null)
                {
                    return(-1);
                }
                if (name == "<undefined>")
                {
                    return(-100);
                }
                try
                {
                    return(dataAssets.Select((elem, index) => new { elem, index }).First(p => p.elem.Name.Content == name).index);
                }
                catch (InvalidOperationException)
                {
                    return(-1);
                }
            }

            List <GMObject> newList = new List <GMObject>();

            for (int i = 0; i < pf.Objects.Count; i++)
            {
                AssetObject projectAsset = pf.Objects[i];
                GMObject    dataAsset    = new GMObject()
                {
                    Name                  = pf.DataHandle.DefineString(projectAsset.Name),
                    SpriteID              = getSprite(projectAsset.Sprite),
                    Visible               = projectAsset.Visible,
                    Solid                 = projectAsset.Solid,
                    Depth                 = projectAsset.Depth,
                    Persistent            = projectAsset.Persistent,
                    ParentObjectID        = getObject(projectAsset.ParentObject),
                    MaskSpriteID          = getSprite(projectAsset.MaskSprite),
                    Physics               = projectAsset.Physics,
                    PhysicsSensor         = projectAsset.PhysicsSensor,
                    PhysicsShape          = projectAsset.PhysicsShape,
                    PhysicsDensity        = projectAsset.PhysicsDensity,
                    PhysicsRestitution    = projectAsset.PhysicsRestitution,
                    PhysicsGroup          = projectAsset.PhysicsGroup,
                    PhysicsLinearDamping  = projectAsset.PhysicsLinearDamping,
                    PhysicsAngularDamping = projectAsset.PhysicsAngularDamping,
                    PhysicsVertices       = new List <GMObject.PhysicsVertex>(),
                    PhysicsFriction       = projectAsset.PhysicsFriction,
                    PhysicsAwake          = projectAsset.PhysicsAwake,
                    PhysicsKinematic      = projectAsset.PhysicsKinematic,
                    Events                = new GMPointerList <GMPointerList <GMObject.Event> >()
                };

                foreach (AssetObject.PhysicsVertex v in projectAsset.PhysicsVertices)
                {
                    dataAsset.PhysicsVertices.Add(new GMObject.PhysicsVertex()
                    {
                        X = v.X, Y = v.Y
                    });
                }

                foreach (var events in projectAsset.Events.Values)
                {
                    var newEvents = new GMPointerList <GMObject.Event>();
                    foreach (var ev in events)
                    {
                        GMObject.Event newEv = new GMObject.Event()
                        {
                            Subtype = 0,
                            Actions = new GMPointerList <GMObject.Event.Action>()
                            {
                                new GMObject.Event.Action()
                                {
                                    LibID                                              = 1,
                                    ID                                                 = ev.Actions[0].ID,
                                    Kind                                               = 7,
                                    UseRelative                                        = false,
                                    IsQuestion                                         = false,
                                    UseApplyTo                                         = ev.Actions[0].UseApplyTo,
                                    ExeType                                            = 2,
                                    ActionName                                         = ev.Actions[0].ActionName != null?pf.DataHandle.DefineString(ev.Actions[0].ActionName) : null,
                                                                         CodeID        = getCode(ev.Actions[0].Code),
                                                                         ArgumentCount = ev.Actions[0].ArgumentCount,
                                                                         Who           = -1,
                                                                         Relative      = false,
                                                                         IsNot         = false
                                }
                            }
                        };

                        // Handle subtype
                        switch (ev)
                        {
                        case AssetObject.EventAlarm e:
                            newEv.Subtype = e.AlarmNumber;
                            break;

                        case AssetObject.EventStep e:
                            newEv.Subtype = (int)e.SubtypeStep;
                            break;

                        case AssetObject.EventCollision e:
                            newEv.Subtype = getObject(e.ObjectName);
                            break;

                        case AssetObject.EventKeyboard e:
                            newEv.Subtype = (int)e.SubtypeKey;
                            break;

                        case AssetObject.EventMouse e:
                            newEv.Subtype = (int)e.SubtypeMouse;
                            break;

                        case AssetObject.EventOther e:
                            newEv.Subtype = (int)e.SubtypeOther;
                            break;

                        case AssetObject.EventDraw e:
                            newEv.Subtype = (int)e.SubtypeDraw;
                            break;

                        case AssetObject.EventGesture e:
                            newEv.Subtype = (int)e.SubtypeGesture;
                            break;
                        }
                        newEvents.Add(newEv);
                    }
                    dataAsset.Events.Add(newEvents);
                }

                newList.Add(dataAsset);
            }

            dataAssets.Clear();
            foreach (var obj in newList)
            {
                dataAssets.Add(obj);
            }
        }
コード例 #4
0
        public override void ConvertProject(ProjectFile pf)
        {
            // TODO: use asset refs whenever code is implemented
            var dataCode = pf.DataHandle.GetChunk <GMChunkCODE>()?.List;
            var dataSeqn = pf.DataHandle.GetChunk <GMChunkSEQN>()?.List;

            int getCode(string name)
            {
                if (name == null)
                {
                    return(-1);
                }
                if (dataCode == null)
                {
                    return(-1); // not sure?
                }
                try
                {
                    return(dataCode.Select((elem, index) => new { elem, index }).First(p => p.elem.Name.Content == name).index);
                }
                catch (InvalidOperationException)
                {
                    return(-1);
                }
            }

            int getSeqn(string name)
            {
                try
                {
                    return(dataSeqn.Select((elem, index) => new { elem, index }).First(p => p.elem.Name.Content == name).index);
                }
                catch (InvalidOperationException)
                {
                    return(-1);
                }
            }

            GMList <GMRoom> dataAssets = pf.DataHandle.GetChunk <GMChunkROOM>().List;

            dataAssets.Clear();
            for (int i = 0; i < pf.Rooms.Count; i++)
            {
                AssetRoom asset = pf.Rooms[i].Asset;
                if (asset == null)
                {
                    // This asset was never converted
                    dataAssets.Add((GMRoom)pf.Rooms[i].DataAsset);
                    continue;
                }

                GMRoom data = new GMRoom()
                {
                    Name                = pf.DataHandle.DefineString(asset.Name),
                    Caption             = pf.DataHandle.DefineString(asset.Caption),
                    Width               = asset.Width,
                    Height              = asset.Height,
                    Speed               = asset.Speed,
                    Persistent          = asset.Persistent,
                    BackgroundColor     = asset.BackgroundColor,
                    DrawBackgroundColor = asset.DrawBackgroundColor,
                    CreationCodeID      = getCode(asset.CreationCode),
                    Backgrounds         = new(),
                    Views               = new(),
                    GameObjects         = new(),
                    Tiles               = new(),
                    Physics             = asset.Physics.Enabled,
                    Top            = asset.Physics.Top,
                    Left           = asset.Physics.Left,
                    Right          = asset.Physics.Right,
                    Bottom         = asset.Physics.Bottom,
                    GravityX       = asset.Physics.GravityX,
                    GravityY       = asset.Physics.GravityY,
                    PixelsToMeters = asset.Physics.PixelsToMeters
                };

                foreach (var bg in asset.Backgrounds)
                {
                    data.Backgrounds.Add(new()
                    {
                        Enabled      = bg.Enabled,
                        Foreground   = bg.Foreground,
                        BackgroundID = pf.Backgrounds.FindIndex(bg.Asset),
                        X            = bg.X, Y = bg.Y,
                        TileX        = bg.TileX, TileY = bg.TileY,
                        SpeedX       = bg.SpeedX, SpeedY = bg.SpeedY,
                        Stretch      = bg.Stretch
                    });
                }

                foreach (var view in asset.Views)
                {
                    data.Views.Add(new()
                    {
                        Enabled        = view.Enabled,
                        ViewX          = view.ViewX, ViewY = view.ViewY,
                        ViewWidth      = view.ViewWidth, ViewHeight = view.ViewHeight,
                        PortX          = view.PortX, PortY = view.PortY,
                        PortWidth      = view.PortWidth, PortHeight = view.PortHeight,
                        BorderX        = view.BorderX, BorderY = view.BorderY,
                        SpeedX         = view.SpeedX, SpeedY = view.SpeedY,
                        FollowObjectID = pf.Objects.FindIndex(view.FollowObject)
                    });
                }

                foreach (var obj in asset.GameObjects)
                {
                    var newObj = new GMRoom.GameObject()
                    {
                        X              = obj.X, Y = obj.Y,
                        ObjectID       = pf.Objects.FindIndex(obj.Asset),
                        InstanceID     = obj.InstanceID,
                        CreationCodeID = getCode(obj.CreationCode),
                        ScaleX         = obj.ScaleX,
                        ScaleY         = obj.ScaleY,
                        Color          = obj.Color,
                        Angle          = obj.Angle,
                        ImageSpeed     = obj.ImageSpeed,
                        ImageIndex     = obj.ImageIndex
                    };

                    if (pf.DataHandle.VersionInfo.RoomObjectPreCreate)
                    {
                        newObj.PreCreateCodeID = getCode(obj.PreCreateCode);
                    }

                    data.GameObjects.Add(newObj);
                }

                foreach (var tile in asset.Tiles)
                {
                    var newTile = new GMRoom.Tile()
                    {
                        X       = tile.X, Y = tile.Y,
                        SourceX = tile.SourceX, SourceY = tile.SourceY,
                        Width   = tile.Width, Height = tile.Height,
                        Depth   = tile.Depth, ID = tile.ID,
                        ScaleX  = tile.ScaleX, ScaleY = tile.ScaleY,
                        Color   = tile.Color
                    };

                    if (pf.DataHandle.VersionInfo.IsNumberAtLeast(2))
                    {
                        newTile.AssetID = pf.Sprites.FindIndex(tile.Asset);
                    }
                    else
                    {
                        newTile.AssetID = pf.Backgrounds.FindIndex(tile.Asset);
                    }

                    data.Tiles.Add(newTile);
                }

                if (pf.DataHandle.VersionInfo.IsNumberAtLeast(2))
                {
                    data.Layers = new(asset.Layers.Count);
                    foreach (var layer in asset.Layers)
                    {
                        var newLayer = new GMRoom.Layer()
                        {
                            Name    = pf.DataHandle.DefineString(layer.Name),
                            ID      = layer.ID,
                            Depth   = layer.Depth,
                            OffsetX = layer.OffsetX,
                            OffsetY = layer.OffsetY,
                            HSpeed  = layer.HSpeed,
                            VSpeed  = layer.VSpeed,
                            Visible = layer.Visible
                        };

                        if (layer.Background != null)
                        {
                            newLayer.Kind       = GMRoom.Layer.LayerKind.Background;
                            newLayer.Background = new()
                            {
                                Visible            = layer.Background.Visible,
                                Foreground         = layer.Background.Foreground,
                                SpriteID           = pf.Sprites.FindIndex(layer.Background.Sprite),
                                TileHorz           = layer.Background.TileHorz,
                                TileVert           = layer.Background.TileVert,
                                Stretch            = layer.Background.Stretch,
                                Color              = layer.Background.Color,
                                FirstFrame         = layer.Background.FirstFrame,
                                AnimationSpeed     = layer.Background.AnimationSpeed,
                                AnimationSpeedType = layer.Background.AnimationSpeedType
                            };
                        }
                        else if (layer.Instances != null)
                        {
                            newLayer.Kind      = GMRoom.Layer.LayerKind.Instances;
                            newLayer.Instances = layer.Instances;
                        }
                        else if (layer.Assets != null)
                        {
                            newLayer.Kind   = GMRoom.Layer.LayerKind.Assets;
                            newLayer.Assets = new()
                            {
                                LegacyTiles = new(),
                                Sprites     = new()
                            };

                            foreach (var tile in layer.Assets.LegacyTiles)
                            {
                                newLayer.Assets.LegacyTiles.Add(new()
                                {
                                    X       = tile.X,
                                    Y       = tile.Y,
                                    SourceX = tile.SourceX,
                                    SourceY = tile.SourceY,
                                    Width   = tile.Width,
                                    Height  = tile.Height,
                                    Depth   = tile.Depth,
                                    ID      = tile.ID,
                                    ScaleX  = tile.ScaleX,
                                    ScaleY  = tile.ScaleY,
                                    Color   = tile.Color,
                                    AssetID = pf.Sprites.FindIndex(tile.Asset)
                                });
                            }

                            foreach (var spr in layer.Assets.Sprites)
                            {
                                newLayer.Assets.Sprites.Add(new()
                                {
                                    Name               = pf.DataHandle.DefineString(spr.Name),
                                    AssetID            = pf.Sprites.FindIndex(spr.Asset),
                                    X                  = spr.X, Y = spr.Y,
                                    ScaleX             = spr.ScaleX, ScaleY = spr.ScaleY,
                                    Color              = spr.Color,
                                    AnimationSpeed     = spr.AnimationSpeed,
                                    AnimationSpeedType = spr.AnimationSpeedType,
                                    FrameIndex         = spr.FrameIndex,
                                    Rotation           = spr.Rotation
                                });
                            }

                            if (pf.DataHandle.VersionInfo.IsNumberAtLeast(2, 3))
                            {
                                newLayer.Assets.Sequences = new(layer.Assets.Sequences.Count);
                                foreach (var seq in layer.Assets.Sequences)
                                {
                                    newLayer.Assets.Sequences.Add(new()
                                    {
                                        Name               = pf.DataHandle.DefineString(seq.Name),
                                        AssetID            = getSeqn(seq.Asset),
                                        X                  = seq.X,
                                        Y                  = seq.Y,
                                        ScaleX             = seq.ScaleX,
                                        ScaleY             = seq.ScaleY,
                                        Color              = seq.Color,
                                        AnimationSpeed     = seq.AnimationSpeed,
                                        AnimationSpeedType = seq.AnimationSpeedType,
                                        FrameIndex         = seq.FrameIndex,
                                        Rotation           = seq.Rotation
                                    });
                                }

                                if (!pf.DataHandle.VersionInfo.IsNumberAtLeast(2, 3, 2))
                                {
                                    newLayer.Assets.NineSlices = new(layer.Assets.NineSlices.Count);
                                    foreach (var spr in layer.Assets.NineSlices)
                                    {
                                        newLayer.Assets.NineSlices.Add(new()
                                        {
                                            Name               = pf.DataHandle.DefineString(spr.Name),
                                            AssetID            = pf.Sprites.FindIndex(spr.Asset),
                                            X                  = spr.X,
                                            Y                  = spr.Y,
                                            ScaleX             = spr.ScaleX,
                                            ScaleY             = spr.ScaleY,
                                            Color              = spr.Color,
                                            AnimationSpeed     = spr.AnimationSpeed,
                                            AnimationSpeedType = spr.AnimationSpeedType,
                                            FrameIndex         = spr.FrameIndex,
                                            Rotation           = spr.Rotation
                                        });
                                    }
                                }
                            }
                        }
                        else if (layer.Tiles != null)
                        {
                            newLayer.Kind  = GMRoom.Layer.LayerKind.Tiles;
                            newLayer.Tiles = new()
                            {
                                BackgroundID = pf.Backgrounds.FindIndex(layer.Tiles.Background),
                                TilesX       = layer.Tiles.TilesX,
                                TilesY       = layer.Tiles.TilesY,
                                TileData     = layer.Tiles.TileData
                            };
                        }
                        else if (layer.Effect != null)
                        {
                            newLayer.Kind   = GMRoom.Layer.LayerKind.Effect;
                            newLayer.Effect = new()
                            {
                                EffectType = pf.DataHandle.DefineString(layer.Effect.EffectType),
                                Properties = new(layer.Effect.Properties.Count)
                            };

                            foreach (var prop in layer.Effect.Properties)
                            {
                                newLayer.Effect.Properties.Add(new()
                                {
                                    Kind  = prop.Kind,
                                    Name  = pf.DataHandle.DefineString(prop.Name),
                                    Value = pf.DataHandle.DefineString(prop.Value)
                                });
                            }
                        }
                        // maybe throw exception if nothing else matched?
                    }

                    if (pf.DataHandle.VersionInfo.IsNumberAtLeast(2, 3))
                    {
                        data.SequenceIDs = new();
                        foreach (string seq in asset.Sequences)
                        {
                            data.SequenceIDs.Add(getSeqn(seq));
                        }
                    }
                }

                if (asset.EnableViews)
                {
                    data.Flags &= GMRoom.RoomFlags.EnableViews;
                }
                if (asset.ShowColor)
                {
                    data.Flags &= GMRoom.RoomFlags.ShowColor;
                }
                if (asset.ClearDisplayBuffer)
                {
                    data.Flags &= GMRoom.RoomFlags.ClearDisplayBuffer;
                }

                dataAssets.Add(data);
            }
        }
    }
}