private void tileset_Change(Widget widget) { State.SelectedTileset = ((ComboBox)widget).SelectedIndex; Data.TileSet tileset = State.Data.TileSets[State.SelectedTileset]; for (int i = 0; i < 4; i++) { if (tileset.GetPalette(i) < 0 || tileset.GetPalette(i) >= State.Data.Palettes.Count) { tileset.SetPalette(i, 0); } m_PaletteCombos[i].SelectedIndex = tileset.GetPalette(i); } bool loadtiles = (State.Data.TileSets[State.SelectedTileset] != null); if (loadtiles) { for (int i = 0; i < Data.TileSet.TilesPerSet; i++) { m_MetaTiles[i].Flags = State.Data.TileSets[State.SelectedTileset].GetFlags(i); for (int j = 0; j < 4; j++) { TilePageAttribute tile_page_attrib = State.Data.TileSets[State.SelectedTileset].GetSubTile(i, j); m_MetaTiles[i].SetTile(j, tile_page_attrib.Tile, State.GfxPage(tile_page_attrib.Page).Texture); m_MetaTiles[i].Attribute = tile_page_attrib.Attribute; } } } }
/// <summary> /// Loads data into a chunk in the 'Current Map' panel. /// </summary> /// <param name="p">The x and y indexes of the chunk to load.</param> /// <param name="index">The index of the chunk in the Current Map panel.</param> private void loadChunk(Point p, int ctl_index) { Data.Map map = State.Data.Maps[State.SelectedMap]; MapChunk ctlChunk = m_Chunks[ctl_index]; int chunk_index = p.X + p.Y * State.Data.Maps[State.SelectedMap].WidthInChunks; int chunk_type = map.GetSuperChunk(p.X / 2, p.Y / 2).Chunks[p.X % 2 + (p.Y % 2) * 2]; ctlChunk.Chunk.ChunkIndexXY = p; if (ctlChunk.Chunk.ChunkType != chunk_type) { if (p.X < 0 || p.X >= map.WidthInChunks || p.Y < 0 || p.Y >= map.HeightInChunks) { return; } else { ctlChunk.Chunk.ChunkType = chunk_type; Data.Chunk chunk = State.Data.Chunks[chunk_type]; for (int i = 0; i < 64; i++) { int tile = chunk[i]; for (int j = 0; j < 4; j++) { TilePageAttribute tile_page_attrib = State.Data.TileSets[State.SelectedTileset].GetSubTile(tile, j); ctlChunk.Chunk.SetTile(i, j, tile_page_attrib.Tile, State.GfxPage(tile_page_attrib.Page).Texture); ctlChunk.Chunk.SetAttribute(i, tile_page_attrib.Attribute); } } } } }
private void loadChunkTile(int index, int tile) { Data.Chunk chunk = State.Data.Chunks[State.SelectedChunk]; if (chunk == null) { return; } Data.TileSet tileset = State.Data.TileSets[State.SelectedTileset]; if (tileset == null) { return; } if (index < 0 || index >= 64) { return; } chunk[index] = State.SelectedMetatile; for (int j = 0; j < 4; j++) { TilePageAttribute tile_page_attrib = State.Data.TileSets[State.SelectedTileset].GetSubTile(tile, j); ctlChunk.SetTile(index, j, tile_page_attrib.Tile, State.GfxPage(tile_page_attrib.Page).Texture); ctlChunk.SetAttribute(index, tile_page_attrib.Attribute); } }
private void createMetaTilePanel() { if (m_MetaTiles == null) { m_MetaTiles = new List <Elements.MetaTile>(); int tilesperrow = 8, tilesize = 48, tilemargin = 8; int x = 16, y = 4; bool loadtiles = (State.Data.TileSets[State.SelectedTileset] != null && State.Data.Palettes.Count != 0 && State.Data.TileGfx.PageCount != 0); for (int i = 0; i < Data.TileSet.TilesPerSet; i++) { Elements.MetaTile metatile = new Elements.MetaTile(i, x + (tilesize + tilemargin) * (i % tilesperrow), y + 18 + (tilesize + tilemargin) * (i / tilesperrow), tilesize, tilesize, metatile_OnClick); if (loadtiles) { for (int j = 0; j < 4; j++) { TilePageAttribute tile_page_attrib = State.Data.TileSets[State.SelectedTileset].GetSubTile(i, j); metatile.SetTile(j, tile_page_attrib.Tile, State.GfxPage(tile_page_attrib.Page).Texture); metatile.Attribute = tile_page_attrib.Attribute; } } m_MetaTiles.Add(metatile); } scrMetaTiles.AddWidget( new Label(x, y, "MetaTiles:")); scrMetaTiles.AddWidgets(m_MetaTiles); } }
/// <summary> /// Returns the tile, gfxpage, and attribute for the subtile in tile (index). /// </summary> /// <param name="index"></param> /// <param name="subtile"></param> /// <returns></returns> public TilePageAttribute GetSubTile(int index, int subtile) { if (index < 0 || index >= TilesPerSet) { return(TilePageAttribute.Zero); } TilePage value = m_Tilegfx.GetTileAndPageFromIndex(m_Metatiles[index][subtile]); TilePageAttribute value2 = new TilePageAttribute(value.Tile, value.Page, m_Attributes[index]); return(value2); }
/// <summary> /// Sets an entire chunk at once. /// </summary> /// <param name="chunk"></param> /// <param name="tileset"></param> public void SetChunk(Data.Chunk chunk, Data.TileSet tileset) { for (int i = 0; i < 64; i++) { int tile = chunk[i]; for (int j = 0; j < 4; j++) { TilePageAttribute tile_page_attrib = State.Data.TileSets[State.SelectedTileset].GetSubTile(tile, j); SetTile(i, j, tile_page_attrib.Tile, State.GfxPage(tile_page_attrib.Page).Texture); SetAttribute(i, tile_page_attrib.Attribute); } } }
public void WriteChunk(int x, int y, Data.Chunk chunk, Data.TileSet tileset, Data.TileGfx gfx) { if (m_TilesToBytes == null) { m_TilesToBytes = new Dictionary <int, int[]>(); } for (int i = 0; i < 4; i++) { int[] chunksums = new int[16]; for (int iy = 0; iy < 4; iy++) { for (int ix = 0; ix < 4; ix++) { int metatile = chunk[(iy + (i / 2) * 2) * 8 + (ix + (i % 2) * 2)]; if (!m_TilesToBytes.ContainsKey(metatile)) { int[] tilesums = new int[16]; for (int j = 0; j < 4; j++) { TilePageAttribute value = tileset.GetSubTile(metatile, j); byte[] tile = gfx.GetTile(value.Page, value.Tile); for (int k = 0; k < 16; k++) { int t = (tile[k] & 0x03); tilesums[t + (t == 0 ? 0 : value.Attribute * 4)]++; t = ((tile[k] >> 2) & 0x03); tilesums[t + (t == 0 ? 0 : value.Attribute * 4)]++; t = ((tile[k] >> 4) & 0x03); tilesums[t + (t == 0 ? 0 : value.Attribute * 4)]++; t = ((tile[k] >> 6) & 0x03); tilesums[t + (t == 0 ? 0 : value.Attribute * 4)]++; } } m_TilesToBytes.Add(metatile, tilesums); } for (int j = 0; j < 16; j++) { chunksums[j] += m_TilesToBytes[metatile][j]; } } uint[] mostCommonPixel = new uint[1] { (uint)GreatestIndexInArray(chunksums) }; m_Texture.SetData <uint>(0, new Rectangle(x * 2 + (i % 2), y * 2 + (i / 2), 1, 1), mostCommonPixel, 0, 1); } } }
private void fixData() { for (int ts = 0; ts < m_TileSets.Count; ts++) { for (int i = 0; i < TileSet.TilesPerSet; i++) { for (int j = 0; j < 4; j++) { TilePageAttribute tpa = m_TileSets[ts].GetSubTile(i, j); if (tpa.Page >= m_TileGfx.PageCount) { m_TileSets[ts].SetSubTileAndPage(i, j, 0, 0); } } } } }
private void cmbTilesets_SelectionChanged(Widget widget) { State.SelectedTileset = ((ComboBox)widget).SelectedIndex; Data.Chunk chunk = State.Data.Chunks[State.SelectedChunk]; if (chunk != null) { chunk.Tileset = State.SelectedTileset; } Data.TileSet tileset = State.Data.TileSets[State.SelectedTileset]; if (tileset != null) { for (int i = 0; i < 4; i++) { if (tileset.GetPalette(i) < 0 || tileset.GetPalette(i) >= State.Data.Palettes.Count) { tileset.SetPalette(i, 0); } byte[] palette = new byte[4]; palette[0] = State.Data.Palettes[tileset.GetPalette(0)][0]; for (int j = 1; j < 4; j++) { palette[j] = State.Data.Palettes[tileset.GetPalette(i)][j]; } State.Palette.LoadPalette(i, palette); } for (int i = 0; i < Data.TileSet.TilesPerSet; i++) { for (int j = 0; j < 4; j++) { TilePageAttribute tile_page_attrib = State.Data.TileSets[State.SelectedTileset].GetSubTile(i, j); aioTileset.SetTile(i, j, tile_page_attrib.Tile, State.GfxPage(tile_page_attrib.Page).Texture); aioTileset.SetAttribute(i, tile_page_attrib.Attribute); } } loadChunkElement(); } }