Esempio n. 1
0
        private Texture GetTilesChunkTexture(DevicePanel d, int x, int y)
        {
            if (this.TileChunksTextures[y][x] != null)
            {
                return(this.TileChunksTextures[y][x]);
            }

            Rectangle rect = GetTilesChunkArea(x, y);

            using (Bitmap bmp = new Bitmap(rect.Width * TILE_SIZE, rect.Height * TILE_SIZE, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    for (int ty = rect.Y; ty < rect.Y + rect.Height; ++ty)
                    {
                        for (int tx = rect.X; tx < rect.X + rect.Width; ++tx)
                        {
                            if (this.Layer.Tiles[ty][tx] != 0xffff)
                            {
                                DrawTile(g, Layer.Tiles[ty][tx], tx - rect.X, ty - rect.Y);
                            }
                        }
                    }
                }
                this.TileChunksTextures[y][x] = TextureCreator.FromBitmap(d._device, bmp);
            }
            return(this.TileChunksTextures[y][x]);
        }
Esempio n. 2
0
        public void LoadNextAnimation()
        {
            if (AnimsToLoad.Count == 0)
            {
                return;
            }
            var val = AnimsToLoad[0];

            if (val.anim == null)
            {
                string key = $"{val.name}-{val.AnimId}-{val.frameId}-{val.fliph}-{val.flipv}-{val.rotate}";
                if (!Animations.ContainsKey(key))
                {
                    if (!Working)
                    {
                        try
                        {
                            LoadAnimation(val.name, val.d, val.AnimId, val.frameId, val.fliph, val.flipv, val.rotate, false);
                        }
                        catch (Exception)
                        {
                            // lots of changes introduced by Plus, just hide errors for now (evil I know!)
                            //Console.WriteLine($"Pop loading next animiation. {val.name}, {val.AnimId}, {val.frameId}, {val.fliph}, {val.flipv}, {val.rotate}", e);
                        }
                    }
                }
                else
                {
                    val.anim = Animations[key];
                }
            }
            if (val.anim == null)
            {
                return;
            }
            if (val.anim.Ready)
            {
                AnimsToLoad.RemoveAt(0);
            }
            else
            {
                if (val.anim.Frames.Count == 0)
                {
                    val.anim.Ready = true;
                    AnimsToLoad.RemoveAt(0);
                    return;
                }
                val.anim.Frames[val.anim.loadedFrames].Texture = TextureCreator.FromBitmap(val.d._device, val.anim.Frames[val.anim.loadedFrames]._Bitmap);
                val.anim.Frames[val.anim.loadedFrames]._Bitmap.Dispose();
                ++val.anim.loadedFrames;
                if (val.anim.loadedFrames == val.anim.Frames.Count)
                {
                    val.anim.Ready = true;
                }
            }
        }
Esempio n. 3
0
        public void InitDeviceResources()
        {
            sprite  = new Sprite(_device);
            sprite2 = new Sprite(_device);

            tx       = TextureCreator.FromBitmap(_device, txb);
            tcircle  = TextureCreator.FromBitmap(_device, tcircleb);
            tecircle = TextureCreator.FromBitmap(_device, tecircleb);
            hcursor  = TextureCreator.FromBitmap(_device, hcursorb);
            vcursor  = TextureCreator.FromBitmap(_device, vcursorb);
            hvcursor = TextureCreator.FromBitmap(_device, hvcursorb);

            FontDescription fontDescription = new FontDescription()
            {
                Height          = 18,
                Italic          = false,
                CharacterSet    = FontCharacterSet.Ansi,
                FaceName        = "Microsoft Sans Serif",
                MipLevels       = 0,
                OutputPrecision = FontPrecision.TrueType,
                PitchAndFamily  = FontPitchAndFamily.Default,
                Quality         = FontQuality.Antialiased,
                Weight          = FontWeight.Regular
            };

            FontDescription fontDescriptionBold = new FontDescription()
            {
                Height          = 18,
                Italic          = false,
                CharacterSet    = FontCharacterSet.Ansi,
                FaceName        = "Microsoft Sans Serif",
                MipLevels       = 0,
                OutputPrecision = FontPrecision.TrueType,
                PitchAndFamily  = FontPitchAndFamily.Default,
                Quality         = FontQuality.Antialiased,
                Weight          = FontWeight.Bold
            };

            font     = new Font(_device, fontDescription);
            fontBold = new Font(_device, fontDescriptionBold);
        }
Esempio n. 4
0
        /// <summary>
        /// Loads / Gets the Sprite Animation
        /// NOTE:
        /// </summary>
        /// <param name="name">The Name of the object</param>
        /// <param name="d">The DevicePanel</param>
        /// <param name="AnimId">The Animation ID (-1 to Load Normal)</param>
        /// <param name="frameId">The Frame ID for the specified Animation (-1 to load all frames)</param>
        /// <param name="fliph">Flip the Texture Horizontally</param>
        /// <param name="flipv">Flip the Texture Vertically</param>
        /// <returns>The fully loaded Animation</returns>
        public EditorAnimation LoadAnimation(string name, DevicePanel d, int AnimId, int frameId, bool fliph, bool flipv, bool rotate, bool loadImageToDX = true)
        {
            string key  = $"{name}-{AnimId}-{frameId}-{fliph}-{flipv}-{rotate}";
            var    anim = new EditorAnimation();

            if (Animations.ContainsKey(key))
            {
                if (Animations[key].Ready)
                {
                    // Use the already loaded Amination
                    return(Animations[key]);
                }
                else
                {
                    return(null);
                }
            }

            Animations.Add(key, anim);


            string path, path2;

            if (name == "EditorAssets" || name == "SuperSpecialRing" || name == "EditorIcons2" || name == "TransportTubes")
            {
                if (name == "EditorAssets")
                {
                    path2 = Path.Combine(Environment.CurrentDirectory, "EditorAssets.bin");
                    if (!File.Exists(path2))
                    {
                        return(null);
                    }
                }
                else if (name == "EditorIcons2")
                {
                    path2 = Path.Combine(Environment.CurrentDirectory, "EditorIcons2.bin");
                    if (!File.Exists(path2))
                    {
                        return(null);
                    }
                }
                else if (name == "TransportTubes")
                {
                    path2 = Path.Combine(Environment.CurrentDirectory, "Global\\", "TransportTubes.bin");
                    if (!File.Exists(path2))
                    {
                        return(null);
                    }
                }
                else
                {
                    path2 = Path.Combine(Environment.CurrentDirectory, "Global\\", "SuperSpecialRing.bin");
                    Debug.Print(path2);
                    if (!File.Exists(path2))
                    {
                        return(null);
                    }
                }
            }
            else
            {
                if (DataDirectoryList == null)
                {
                    DataDirectoryList = Directory.GetFiles(Path.Combine(Editor.DataDirectory, "Sprites"), $"*.bin", SearchOption.AllDirectories);
                }


                // Checks Global frist
                path  = Editor.Instance.SelectedZone + "\\" + name + ".bin";
                path2 = Path.Combine(Editor.DataDirectory, "sprites") + '\\' + path;
                if (!File.Exists(path2))
                {
                    // Checks without last character
                    path  = path = Editor.Instance.SelectedZone.Substring(0, Editor.Instance.SelectedZone.Length - 1) + "\\" + name + ".bin";
                    path2 = Path.Combine(Editor.DataDirectory, "sprites") + '\\' + path;
                }

                /*if (!File.Exists(path2))
                 * {
                 *  // Checks Editor Global
                 *  path2 = Environment.CurrentDirectory + "\\Global\\" + name + ".bin";
                 * }*/
                if (!File.Exists(path2))
                {
                    // Checks Global
                    path  = "Global\\" + name + ".bin";
                    path2 = Path.Combine(Editor.DataDirectory, "sprites") + '\\' + path;
                }
                if (!File.Exists(path2))
                {
                    // Checks the Stage folder
                    foreach (string dir in Directory.GetDirectories(Path.Combine(Editor.DataDirectory, "Sprites"), $"*", SearchOption.TopDirectoryOnly))
                    {
                        path  = Path.GetFileName(dir) + "\\" + name + ".bin";
                        path2 = Path.Combine(Editor.DataDirectory, "sprites") + '\\' + path;
                        if (File.Exists(path2))
                        {
                            break;
                        }
                    }
                }
                if (!File.Exists(path2))
                {
                    // Seaches all around the Data directory
                    var list = DataDirectoryList;
                    if (list.Any(t => Path.GetFileName(t.ToLower()).Contains(name.ToLower())))
                    {
                        list = list.Where(t => Path.GetFileName(t.ToLower()).Contains(name.ToLower())).ToArray();
                        if (list.Any(t => t.ToLower().Contains(Editor.Instance.SelectedZone)))
                        {
                            path2 = list.Where(t => t.ToLower().Contains(Editor.Instance.SelectedZone)).First();
                        }
                        else
                        {
                            path2 = list.First();
                        }
                    }
                }
                if (!File.Exists(path2))
                {
                    // No animation found
                    return(null);
                }
            }

            using (var stream = File.OpenRead(path2))
            {
                rsdkAnim = new Animation();
                rsdkAnim.Load(new BinaryReader(stream));
            }
            if (AnimId == -1)
            {
                if (rsdkAnim.Animations.Any(t => t.AnimName.Contains("Normal")))
                {
                    AnimId = rsdkAnim.Animations.FindIndex(t => t.AnimName.Contains("Normal"));
                }
                else
                {
                    AnimId = 0;
                }
                // Use Vertical Amination if one exists
                if (rotate && rsdkAnim.Animations.Any(t => t.AnimName.EndsWith(" V")))
                {
                    AnimId = rsdkAnim.Animations.FindIndex(t => t.AnimName.EndsWith(" V"));
                }
            }
            if (AnimId >= rsdkAnim.Animations.Count)
            {
                AnimId = rsdkAnim.Animations.Count - 1;
            }
            for (int i = 0; i < rsdkAnim.Animations[AnimId].Frames.Count; ++i)
            {
                // check we don't stray outside our loaded animations/frames
                // if user enters a value that would take us there, just show
                // a valid frame instead
                var animiation = rsdkAnim.Animations[AnimId];
                var frame      = animiation.Frames[i];
                if (frameId >= 0 && frameId < animiation.Frames.Count)
                {
                    frame = animiation.Frames[frameId];
                }
                Bitmap map;

                if (!Sheets.ContainsKey(rsdkAnim.SpriteSheets[frame.SpriteSheet]))
                {
                    string targetFile;
                    if (name == "EditorAssets" || name == "SuperSpecialRing" || name == "EditorIcons2" || name == "TransportTubes")
                    {
                        if (name == "EditorAssets")
                        {
                            targetFile = Path.Combine(Environment.CurrentDirectory, "EditorAssets.gif");
                        }
                        else if (name == "EditorIcons2")
                        {
                            targetFile = Path.Combine(Environment.CurrentDirectory, "EditorIcons2.gif");
                        }
                        else if (name == "TransportTubes")
                        {
                            targetFile = Path.Combine(Environment.CurrentDirectory, "Global\\", "TransportTubes.gif");
                        }
                        else
                        {
                            targetFile = Path.Combine(Environment.CurrentDirectory, "Global\\", "SuperSpecialRing.gif");
                        }
                    }
                    else
                    {
                        targetFile = Path.Combine(Editor.DataDirectory, "sprites", rsdkAnim.SpriteSheets[frame.SpriteSheet].Replace('/', '\\'));
                    }
                    if (!File.Exists(targetFile))
                    {
                        map = null;

                        // add a Null to our lookup, so we can avoid looking again in the future
                        Sheets.Add(rsdkAnim.SpriteSheets[frame.SpriteSheet], map);
                    }
                    else
                    {
                        map = new Bitmap(targetFile);
                        Sheets.Add(rsdkAnim.SpriteSheets[frame.SpriteSheet], map);
                    }
                }
                else
                {
                    map = Sheets[rsdkAnim.SpriteSheets[frame.SpriteSheet]];
                }


                if (frame.Width == 0 || frame.Height == 0)
                {
                    continue;
                }

                // can't load the animation, it probably doesn't exist in the User's Sprites folder
                if (map == null)
                {
                    return(null);
                }

                // We are storing the first colour from the palette so we can use it to make sprites transparent
                var colour = map.Palette.Entries[0];
                // Slow
                map = CropImage(map, new Rectangle(frame.X, frame.Y, frame.Width, frame.Height), fliph, flipv);
                RemoveColourImage(map, colour, frame.Width, frame.Height);

                Texture texture = null;
                if (loadImageToDX)
                {
                    texture = TextureCreator.FromBitmap(d._device, map);
                }
                var editorFrame = new EditorAnimation.EditorFrame()
                {
                    Texture = texture,
                    Frame   = frame,
                    Entry   = rsdkAnim.Animations[AnimId]
                };
                if (!loadImageToDX)
                {
                    editorFrame._Bitmap = map;
                }
                anim.Frames.Add(editorFrame);
                if (frameId != -1)
                {
                    break;
                }
            }
            anim.ImageLoaded = true;
            if (loadImageToDX)
            {
                anim.Ready = true;
            }
            Working = false;
            return(anim);
        }