public Unity_Object_SNES(SNES_Proto_Object obj, Unity_ObjectManager_SNES objManager) { Object = obj; ObjManager = objManager; }
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 }); }