482 lines
13 KiB
C#
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 = "";
|
|
}
|
|
}
|
|
}
|
|
}
|