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 }); } } }
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 }); } } }
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); } }
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); } } } }