Example #1
0
 public Unity_Object_SNES(SNES_Proto_Object obj, Unity_ObjectManager_SNES objManager)
 {
     Object     = obj;
     ObjManager = objManager;
 }
Example #2
0
        public async UniTask <Unity_Level> LoadAsync(Context context, bool loadTextures)
        {
            Controller.DetailedState = $"Loading data";
            await Controller.WaitIfNecessary();

            // Read the rom
            var rom = FileFactory.Read <SNES_Proto_ROM>(GetROMFilePath, context);

            Controller.DetailedState = $"Loading maps";
            await Controller.WaitIfNecessary();

            // Get the tilesets
            var tileSet_0000_shadow = LoadTileSet(rom.TileSet_0000, rom.TilePalette, false, true, animatedTiles: rom.AnimatedTiles, shadow: true);
            var tileSet_0000        = LoadTileSet(rom.TileSet_0000, rom.TilePalette, false, true, animatedTiles: rom.AnimatedTiles);
            var tileSet_8000        = LoadTileSet(rom.TileSet_8000, rom.TilePalette, true, false);

            // Load the primary map
            var map = LoadMap(rom.BG1_Map, rom.BG1_Tiles).Select(x =>
            {
                x.TileMapY = (ushort)(x.PaletteIndex * tileSet_0000.SNES_BaseLength + x.TileMapY);
                return(new Unity_Tile(x));
            }).ToArray();

            var maps = new Unity_Map[]
            {
                // Background
                new Unity_Map()
                {
                    Type    = Unity_Map.MapType.Graphics,
                    Width   = 32,
                    Height  = 32,
                    TileSet = new Unity_TileSet[]
                    {
                        tileSet_8000
                    },
                    MapTiles = rom.BG3_Tiles.Select(x =>
                    {
                        x.TileMapY = (ushort)(x.PaletteIndex * tileSet_8000.SNES_BaseLength + x.TileMapY);
                        return(new Unity_Tile(x));
                    }).ToArray(),
                },
                // Map (no priority)
                new Unity_Map()
                {
                    Type    = Unity_Map.MapType.Graphics,
                    Width   = (ushort)(rom.BG1_Map.Width * 2),
                    Height  = (ushort)(rom.BG1_Map.Height * 2),
                    TileSet = new Unity_TileSet[]
                    {
                        tileSet_0000
                    },
                    MapTiles = map.Select(x => x.Data.Priority ? new Unity_Tile(new MapTile()) : x).ToArray(),
                },
                // Map (no priority)
                new Unity_Map()
                {
                    Type    = Unity_Map.MapType.Graphics,
                    Width   = (ushort)(rom.BG1_Map.Width * 2),
                    Height  = (ushort)(rom.BG1_Map.Height * 2),
                    TileSet = new Unity_TileSet[]
                    {
                        tileSet_0000_shadow
                    },
                    MapTiles = map.Select(x => x.Data.Priority ? x : new Unity_Tile(new MapTile())).ToArray(),
                },
                // Map (priority)
                new Unity_Map()
                {
                    Type    = Unity_Map.MapType.Graphics,
                    Width   = (ushort)(rom.BG1_Map.Width * 2),
                    Height  = (ushort)(rom.BG1_Map.Height * 2),
                    TileSet = new Unity_TileSet[]
                    {
                        tileSet_0000
                    },
                    MapTiles   = map.Select(x => !x.Data.Priority ? new Unity_Tile(new MapTile()) : x).ToArray(),
                    Layer      = Unity_Map.MapLayer.Front,
                    IsAdditive = true,
                    Alpha      = 1f
                },
                // Foreground
                new Unity_Map()
                {
                    Type    = Unity_Map.MapType.Graphics,
                    Width   = 32,
                    Height  = 32,
                    TileSet = new Unity_TileSet[]
                    {
                        tileSet_0000
                    },
                    MapTiles = rom.BG2_Tiles.Select(x =>
                    {
                        x.TileMapY = (ushort)(x.PaletteIndex * tileSet_0000.SNES_BaseLength + x.TileMapY);
                        return(new Unity_Tile(x));
                    }).ToArray(),
                    Layer = Unity_Map.MapLayer.Front,
                },
                // Collision
                new Unity_Map()
                {
                    Type     = Unity_Map.MapType.Collision,
                    Width    = rom.BG1_Map.Width,
                    Height   = rom.BG1_Map.Height,
                    TileSet  = new Unity_TileSet[0],
                    MapTiles = rom.BG1_Map.Tiles.Select(x => new Unity_Tile(x)).ToArray()
                },
            };

            Controller.DetailedState = $"Loading sprites";
            await Controller.WaitIfNecessary();

            var objManager = new Unity_ObjectManager_SNES(context, GetGraphicsGroups(rom));

            // Create Rayman
            var rayman = new Unity_Object_SNES(rom.Rayman, objManager);

            // Convert levelData to common level format
            return(new Unity_Level(
                       maps: maps,
                       objManager: objManager,
                       getCollisionTypeNameFunc: x => ((R1Jaguar_TileCollisionType)x).ToString(),
                       getCollisionTypeGraphicFunc: x => ((R1Jaguar_TileCollisionType)x).GetCollisionTypeGraphic(),
                       rayman: rayman,
                       cellSize: 8)
            {
                CellSizeOverrideCollision = 16
            });
        }