Files
2026-11-07 13:30:45 +07:00

482 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using S16.Drawing;
using XMLLoader;
using System.Xml;
using INILoader;
namespace ItemDictionary
{
public partial class ItemDictionary : Form
{
String main_path;
String cur_pack;
List<ItemData> item_data_list;
List<PackData> icon_pack_list;
List<ItemCustomData> item_custom_list;
private xmlLoader m_xmlLoader;
public ItemDictionary()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
icon_pack_list = new List<PackData>();
INILoader.INILoader loader = new INILoader.INILoader("./ItemDictionary.ini", false);
loader.SetTitle("path");
main_path = loader.LoadString( "path", "" );
m_xmlLoader = new xmlLoader(String.Format("{0}/XML/uiimageset.xml", main_path ) );
LoadData();
imagetreeView.SuspendLayout();
XmlElement element = m_xmlLoader.GetElement();
foreach (XmlNode ImageSetNode in element.ChildNodes)
{
if (ImageSetNode.Name == "#comment")
continue;
ImageTreeNode node = new ImageTreeNode( "Imageset",
"",
ImageSetNode.Attributes["Name"].Value,
ImageSetNode.Attributes["File"].Value,
0, 0, 0, 0, 0, 0 );
imagetreeView.Nodes.Add( node );
String set_name = ImageSetNode.Attributes["Name"].Value.ToString();
foreach( XmlNode ImageNode in ImageSetNode.ChildNodes )
{
if (ImageNode.Name == "#comment")
continue;
int offsetX = 0;
int offsetY = 0;
foreach ( XmlAttribute att in ImageNode.Attributes )
{
if( att.Name == "OffsetX" )
offsetX = Int32.Parse( att.Value );
else if( att.Name == "OffsetY" )
offsetY = Int32.Parse( att.Value );
}
String pack_name = String.Format( "{0}#{1}", set_name, ImageNode.Attributes["Name"].Value );
ImageTreeNode child_node = new ImageTreeNode( "Image",
pack_name,
ImageNode.Attributes["Name"].Value,
ImageSetNode.Attributes["File"].Value,
Int32.Parse( ImageNode.Attributes["X"].Value ),
Int32.Parse( ImageNode.Attributes["Y"].Value ),
Int32.Parse( ImageNode.Attributes["Width"].Value ),
Int32.Parse( ImageNode.Attributes["Height"].Value ),
offsetX,
offsetY );
node.Nodes.Add( child_node );
PackData data;
data.file = ImageSetNode.Attributes["File"].Value.ToString();
data.pack = pack_name;
data.x = Int32.Parse( ImageNode.Attributes["X"].Value );
data.y = Int32.Parse( ImageNode.Attributes["Y"].Value );
data.width = Int32.Parse( ImageNode.Attributes["Width"].Value );
data.height = Int32.Parse( ImageNode.Attributes["Height"].Value );
data.offset_x = offsetX;
data.offset_y = offsetY;
icon_pack_list.Add(data);
}
}
imagetreeView.Sort();
imagetreeView.ResumeLayout(false);
}
private void RefreshTextureBox( String _path )
{
if( Path.GetExtension(_path) != ".dds" )
return;
String path = String.Format( "{0}/resource/texture/{1}", main_path, _path );
if (File.Exists(path) == false)
{
TextureBox.Image = null;
return;
}
TextureBox.Image = null;
DDSImage image = new DDSImage(File.ReadAllBytes(path));
if( image.BitmapImage.Width > 512 || image.BitmapImage.Height > 512 )
{
TextureBox.SizeMode = PictureBoxSizeMode.Zoom;
TextureBox.Image = image.BitmapImage;
}
else
{
TextureBox.SizeMode = PictureBoxSizeMode.Normal;
TextureBox.Image = image.BitmapImage;
}
}
private void TextureBox_Click(object sender, EventArgs e)
{
if( String.IsNullOrEmpty(cur_pack) )
return;
MouseEventArgs me = e as MouseEventArgs;
Point pos = me.Location;
foreach ( PackData data in icon_pack_list )
{
if( data.file != cur_pack )
continue;
Rectangle rec = new Rectangle( data.x, data.y, data.width, data.height );
if( rec.Contains(pos) )
{
RefreshTextureBox(cur_pack);
Graphics g = Graphics.FromImage(TextureBox.Image);
Pen pen = new Pen(Color.Red, 2);
g.DrawRectangle(pen, data.x, data.y, data.width, data.height);
//MessageBox.Show( data.pack );
String[] token = data.pack.Split('#');
FocusTreeViewNode( token[0], token[1] );
return;
}
}
}
private void ImageTree_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeView tree = (TreeView)sender;
if (tree.SelectedNode.Parent == null)
{
ImageTreeNode node = tree.SelectedNode as ImageTreeNode;
RefreshTextureBox( node.file );
SetDesc("");
cur_pack = node.file;
}
else
{
ImageTreeNode parent_node = tree.SelectedNode.Parent as ImageTreeNode;
ImageTreeNode node = tree.SelectedNode as ImageTreeNode;
SetDesc(node.pack_name);
PackData data = icon_pack_list.Find( p => p.pack == node.pack_name );
RefreshTextureBox( data.file );
Graphics g = Graphics.FromImage(TextureBox.Image);
Pen pen = new Pen(Color.Red, 2);
g.DrawRectangle(pen, data.x, data.y, data.width, data.height);
cur_pack = parent_node.file;
}
}
private void LoadData()
{
if( item_data_list == null )
item_data_list = new List<ItemData>();
else
item_data_list.Clear();
LoadItemData();
LoadExtraItemData();
LoadSkillData();
LoadMedalData();
LoadQuestData();
LoadEtcItemData();
LoadCostumeData();
LoadAccessoryData();
LoadDecoManData();
LoadDecoWomanData();
LoadCustomDesc();
/*StreamWriter sw = new StreamWriter("test.txt");
foreach( ItemData data in item_data_list )
{
String line = String.Format( "{0},{1},{2},{3}", data.pack_name, data.name, data.desc, "" );
sw.WriteLine(line);
}
sw.Close();*/
item_grideView.SuspendLayout();
item_grideView.RowHeadersVisible = false;
item_grideView.Rows.Clear();
item_grideView.Columns.Add("pack", "팩");
item_grideView.Columns.Add("type", "타입");
item_grideView.Columns.Add("name", "이름");
item_grideView.Columns.Add("desc", "설명");
item_grideView.ResumeLayout(false);
}
private void SetGridView( List<ItemData> list )
{
item_grideView.SuspendLayout();
item_grideView.Rows.Clear();
foreach (ItemData data in list)
{
DataGridViewRow r = item_grideView.Rows[item_grideView.Rows.Add(new DataGridViewRow())];
r.Cells["pack"].Value = data.pack_name;
r.Cells["type"].Value = data.type;
r.Cells["name"].Value = data.name;
r.Cells["desc"].Value = data.desc;
}
item_grideView.AutoResizeColumns();
item_grideView.ResumeLayout(false);
}
private void FocusTreeViewNode( String value1, String value2 )
{
if( String.IsNullOrEmpty(value2) )
{
TreeNode[] node = imagetreeView.Nodes.Find(value1, false);
if (node.Length > 0)
{
imagetreeView.SelectedNode = node[0];
}
}
else
{
TreeNode[] parent_node = imagetreeView.Nodes.Find(value1, false);
if (parent_node.Length > 0)
{
TreeNode[] node = parent_node[0].Nodes.Find(value2, false);
if (node.Length > 0)
{
imagetreeView.SelectedNode = node[0];
}
}
}
}
private void item_CellMouseClick(object sender, DataGridViewCellEventArgs e)
{
if( e.RowIndex < 0 )
return;
DataGridViewCell cell = (DataGridViewCell)item_grideView.Rows[e.RowIndex].Cells["pack"];
PackData data = icon_pack_list.Find( p => p.pack == cell.Value.ToString() );
if( String.IsNullOrEmpty(data.pack) )
{
MessageBox.Show("!?");
return;
}
RefreshTextureBox( data.file );
if( !String.IsNullOrEmpty(data.pack) )
{
Graphics g = Graphics.FromImage(TextureBox.Image);
Pen pen = new Pen(Color.Red, 2);
g.DrawRectangle(pen, data.x, data.y, data.width, data.height);
SetDesc(data.pack);
String[] token = data.pack.Split('#');
if( token.Length == 1 )
{
FocusTreeViewNode( token[0], "" );
}
else if( token.Length == 2 )
{
FocusTreeViewNode( token[0], token[1] );
}
cur_pack = data.file;
}
}
private void search_TextBox_KeyDown(object sender, KeyEventArgs e)
{
if( e.KeyCode != Keys.Return )
return;
if (String.IsNullOrEmpty(search_TextBox.Text))
return;
List<ItemData> list = new List<ItemData>();
foreach (ItemData data in item_data_list)
{
if (data.name.Contains(search_TextBox.Text))
{
list.Add(data);
}
else if (data.desc.Contains(search_TextBox.Text))
{
list.Add(data);
}
else if (data.type.Contains(search_TextBox.Text))
{
list.Add(data);
}
else if( Regex.IsMatch(data.pack_name, search_TextBox.Text, RegexOptions.IgnoreCase) )
{
list.Add(data);
}
}
String search_pack_name = String.Empty;
foreach (ItemCustomData data in item_custom_list)
{
if (data.desc.Contains(search_TextBox.Text))
{
search_pack_name = data.pack_name;
}
if (!String.IsNullOrEmpty(search_pack_name))
{
ItemData item_data = list.Find(p => p.pack_name == search_pack_name);
if (String.IsNullOrEmpty(item_data.pack_name))
{
ItemData temp = new ItemData();
temp.pack_name = search_pack_name;
list.Add(temp);
}
}
}
foreach (PackData data in icon_pack_list)
{
if (Regex.IsMatch(data.pack, search_TextBox.Text, RegexOptions.IgnoreCase))
{
ItemData item_data = list.Find(p => p.pack_name == data.pack);
if (String.IsNullOrEmpty(item_data.pack_name))
{
ItemData temp = new ItemData();
temp.pack_name = data.pack;
list.Add(temp);
}
}
}
if (list.Count > 0)
{
SetGridView(list);
}
else
{
MessageBox.Show( "검색결과가 없습니다.", "검색실패", MessageBoxButtons.OK, MessageBoxIcon.Information );
}
}
private void refresh_custom_desc(object sender, KeyEventArgs e)
{
if (e.KeyCode != Keys.Return)
return;
if (String.IsNullOrEmpty(pack_textBox.Text))
return;
bool is_refresh = false;
for( int i=0; i<item_custom_list.Count; ++i )
{
if( item_custom_list[i].pack_name == pack_textBox.Text )
{
ItemCustomData data;
data.pack_name = pack_textBox.Text;
data.desc = custom_desc_textBox.Text;
item_custom_list[i] = data;
is_refresh = true;
break;
}
}
if( !is_refresh && !String.IsNullOrEmpty(custom_desc_textBox.Text) )
{
ItemCustomData data;
data.pack_name = pack_textBox.Text;
data.desc = custom_desc_textBox.Text;
item_custom_list.Add(data);
}
SaveCustomDesc();
}
private void Form1_Shown(object sender, EventArgs e)
{
search_TextBox.Focus();
}
private void SetDesc( String pack_name )
{
PackData data = icon_pack_list.Find( p => p.pack == pack_name );
pack_textBox.Clear();
desc_textBox.Clear();
if( !String.IsNullOrEmpty(data.pack) )
{
pack_textBox.Text = data.pack;
String info = String.Format("[이미지정보]{0}",Environment.NewLine);
info += String.Format("위치 : {0}, {1}{2}", data.x, data.y, Environment.NewLine);
info += String.Format("크기 : {0}*{1}{2}", data.width, data.height, Environment.NewLine);
info += String.Format("옵셋 : {0}, {1}", data.offset_x, data.offset_y);
desc_textBox.Text = info;
int add_count = 0;
List<ItemData> item_datas = item_data_list.FindAll( p => p.pack_name == pack_name );
foreach( ItemData item_data in item_datas )
{
String desc = String.Format( "{0} / {1} 아이콘{2}{3}{4}", item_data.name, item_data.type, Environment.NewLine, Environment.NewLine, item_data.desc );
desc_textBox.Text += Environment.NewLine;
desc_textBox.Text += Environment.NewLine;
desc_textBox.Text += "------------------------------------------------";
desc_textBox.Text += Environment.NewLine;
desc_textBox.Text += desc;
add_count++;
if( add_count >= 10 )
{
desc_textBox.Text += Environment.NewLine;
desc_textBox.Text += Environment.NewLine;
desc_textBox.Text += "------------------------------------------------";
desc_textBox.Text += Environment.NewLine;
desc_textBox.Text += String.Format( "사용하는 위치가 너무 많아 검색을 종료합니다." );
desc_textBox.Text += Environment.NewLine;
desc_textBox.Text += String.Format( "총 사용량 {0}건.", item_datas.Count );
break;
}
}
}
ItemCustomData custom_data = item_custom_list.Find( p => p.pack_name == pack_name );
if( !String.IsNullOrEmpty(custom_data.pack_name) )
{
custom_desc_textBox.Text = custom_data.desc;
}
else
{
custom_desc_textBox.Text = "";
}
}
}
}