Advertisement
namofure

DQMJ2P NICA Viewer

Feb 7th, 2025
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.19 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.IO;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using static System.Windows.Forms.VisualStyles.VisualStyleElement;
  12.  
  13. namespace viewer_test
  14. {
  15.     public partial class Form1 : Form
  16.     {
  17.         private string currentFilePath;
  18.         private const int TILE_SIZE = 8;
  19.         private const int TILES_PER_ROW = 5;
  20.         private const int TILE_COUNT = 25;
  21.         private const int IMAGE_SIZE = TILE_SIZE * TILES_PER_ROW;
  22.         private Color[] palette = new Color[16];
  23.  
  24.         public Form1()
  25.         {
  26.             InitializeComponent();
  27.             listView.View = View.Details;
  28.             listView.Columns.Add("File", 150);
  29.             listView.Columns.Add("Offset", 120);
  30.             listView.Columns.Add("PaletteOffset", 110);
  31.             listView.SelectedIndexChanged += ListView_SelectedIndexChanged;
  32.             btnOpenFile.Click += BtnOpenFile_Click;
  33.         }
  34.  
  35.         private void BtnOpenFile_Click(object sender, EventArgs e)
  36.         {
  37.             using (OpenFileDialog ofd = new OpenFileDialog())
  38.             {
  39.                 ofd.Filter = "NICA Files (*.nica)|*.nica|All Files (*.*)|*.*";
  40.                 if (ofd.ShowDialog() == DialogResult.OK)
  41.                 {
  42.                     currentFilePath = ofd.FileName;
  43.                     LoadNICAFile(currentFilePath);
  44.                 }
  45.             }
  46.         }
  47.  
  48.         private void LoadNICAFile(string filePath)
  49.         {
  50.             byte[] data = File.ReadAllBytes(filePath);
  51.             listView.Items.Clear();
  52.  
  53.             // データ部を読み込む
  54.             int dataOffset = 0x08;
  55.             for (int i = 0; i < 489; i++)
  56.             {
  57.                 string dataName = Encoding.ASCII.GetString(data, dataOffset, 12).Trim();
  58.                 int offset = BitConverter.ToInt32(data, dataOffset + 0x20);
  59.                 int size = BitConverter.ToInt32(data, dataOffset + 0x24);
  60.                 int paOffset = BitConverter.ToInt32(data, dataOffset + 0x4C88);
  61.                 int paletteSize = BitConverter.ToInt32(data, dataOffset + 0x4C8C);
  62.                 listView.Items.Add(new ListViewItem(new[] { dataName, $"0x{offset:X}", $"0x{paOffset:X}" }));
  63.  
  64.                 dataOffset += 40; // 次のデータへ
  65.             }
  66.  
  67.             // パレット部を読み込む(517 個)
  68.             int paletteOffset = 0x4C70;
  69.             for (int i = 0; i < 489; i++)
  70.             {
  71.                 string paletteName = Encoding.ASCII.GetString(data, paletteOffset, 12).Trim();
  72.                 int paletteDataOffset = BitConverter.ToInt32(data, paletteOffset + 0x20);
  73.                 int paletteDataSize = BitConverter.ToInt32(data, paletteOffset + 0x24);
  74.  
  75.                 paletteOffset += 40; // 次のパレットデータへ
  76.             }
  77.         }
  78.  
  79.         private void ListView_SelectedIndexChanged(object sender, EventArgs e)
  80.         {
  81.             if (listView.SelectedItems.Count > 0 && !string.IsNullOrEmpty(currentFilePath))
  82.             {
  83.                 // 選択されたアイテムからオフセットを取得
  84.                 string offsetString1 = listView.SelectedItems[0].SubItems[1].Text; // オフセットが表示されている列
  85.                 string offsetString2 = listView.SelectedItems[0].SubItems[2].Text;
  86.                 int offset = Convert.ToInt32(offsetString1, 16); // 16進数を整数に変換
  87.                 int paOffset = Convert.ToInt32(offsetString2, 16);
  88.  
  89.                 // そのオフセットを基にデータを読み込む
  90.                 LoadNCGRData(currentFilePath, offset, paOffset);
  91.             }
  92.         }
  93.  
  94.         private void LoadNCGRData(string filePath, int offset, int paOffset)
  95.         {
  96.             byte[] data = File.ReadAllBytes(filePath); // ファイルをバイト配列で読み込む
  97.  
  98.  
  99.  
  100.  
  101.  
  102.             // パレットデータをデコード(16色 × 2バイト = 32バイト)
  103.             Color[] palette = new Color[16];
  104.             for (int i = 0; i < 16; i++)
  105.             {
  106.                 int Aoffset = 0x915C8;
  107.  
  108.                 int colorData = BitConverter.ToUInt16(data, paOffset + (i * 2)); // 2バイトずつ取得
  109.                 int r = (colorData & 0x1F) * 8;
  110.                 int g = ((colorData >> 5) & 0x1F) * 8;
  111.                 int b = ((colorData >> 10) & 0x1F) * 8;
  112.                 palette[i] = Color.FromArgb(r, g, b);
  113.             }
  114.  
  115.             // 画像データをデコード
  116.             int TILE_SIZE = 8;
  117.             int TILES_PER_ROW = 5;
  118.             int TILE_COUNT = 25;
  119.             int IMAGE_SIZE = TILE_SIZE * TILES_PER_ROW;
  120.  
  121.             Bitmap bitmap = new Bitmap(IMAGE_SIZE, IMAGE_SIZE);
  122.  
  123.             for (int tile = 0; tile < TILE_COUNT; tile++)
  124.             {
  125.                 int newTileIndex = tile;
  126.  
  127.                 if (tile < 20)
  128.                 {
  129.                     newTileIndex = ((tile % 4) * 5) + (tile / 4);
  130.                     if (tile < 16)
  131.                     {
  132.                         newTileIndex = ((tile / 4) * 5) + (tile % 4);
  133.                     }
  134.                 }
  135.  
  136.                 int tileX = (newTileIndex % TILES_PER_ROW) * TILE_SIZE;
  137.                 int tileY = (newTileIndex / TILES_PER_ROW) * TILE_SIZE;
  138.  
  139.                 int Boffset = offset + 0x30 + (tile * 32);
  140.  
  141.                 for (int y = 0; y < TILE_SIZE; y++)
  142.                 {
  143.                     for (int x = 0; x < TILE_SIZE; x += 2)
  144.                     {
  145.                         if (Boffset + (y * 4) + (x / 2) >= data.Length)
  146.                             continue; // 範囲外ならスキップ
  147.  
  148.                         byte pixelData = data[Boffset + (y * 4) + (x / 2)];
  149.  
  150.                         byte index1 = (byte)(pixelData & 0x0F);
  151.                         byte index2 = (byte)((pixelData >> 4) & 0x0F);
  152.  
  153.                         bitmap.SetPixel(tileX + x, tileY + y, palette[index1]);
  154.                         bitmap.SetPixel(tileX + x + 1, tileY + y, palette[index2]);
  155.                     }
  156.                 }
  157.             }
  158.  
  159.             // `PictureBox` に画像を表示
  160.             pictureBox.Image = bitmap;
  161.         }
  162.  
  163.     }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement