Editor.cs 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Diagnostics;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using CommonAI.Zone;
  11. using CommonFroms.Utils;
  12. using CommonAI.Zone.ZoneEditor;
  13. using CommonLang.Xml;
  14. using System.Xml;
  15. using CommonAIEditor.Plugins.Win32;
  16. using CommonLang.IO;
  17. using CommonAI.Zone.Attributes;
  18. using CommonLang.File;
  19. using System.Threading;
  20. using GameEditorPlugin.Utils;
  21. using CommonLang;
  22. using CommonLang.Property;
  23. using CommonLang.Concurrent;
  24. using CommonAIEditor.Scene;
  25. using CommonAI.Zone.ZoneEditor.EventTrigger;
  26. using CommonLang.Protocol;
  27. using CommonLang.XCSV;
  28. using GameEditorPlugin.Win32.Runtime;
  29. using CommonAI.Zone.Replay;
  30. using CommonAIEditor.EventEditor;
  31. using CommonFroms.G2D;
  32. using CommonFroms.G2D.DataGrid;
  33. namespace CommonAIEditor
  34. {
  35. public partial class Editor : Form
  36. {
  37. //------------------------------------------------------------------------------
  38. #region static_fields
  39. public static string EditorRootDir { get { return s_editroot.FullName; } }
  40. public static string EditorSettingDir { get { return s_proj_setting_root.FullName; } }
  41. public static string DataDir { get { return s_datadir.FullName; } }
  42. public static string DataDir_units { get { return Editor.DataDir + "/units"; } }
  43. public static string DataDir_skills { get { return Editor.DataDir + "/skills"; } }
  44. public static string DataDir_spells { get { return Editor.DataDir + "/spells"; } }
  45. public static string DataDir_buffs { get { return Editor.DataDir + "/buffs"; } }
  46. public static string DataDir_items { get { return Editor.DataDir + "/items"; } }
  47. public static string DataDir_unit_triggers { get { return Editor.DataDir + "/unit_triggers"; } }
  48. public static string DataDir_unit_events { get { return Editor.DataDir + "/unit_events"; } }
  49. public static string DataDir_scenes { get { return Editor.DataDir + "/scenes"; } }
  50. public static string ResDir { get { return s_resdir.FullName; } }
  51. public static Font EditorFont = new System.Drawing.Font(
  52. "微软雅黑", 9F,
  53. System.Drawing.FontStyle.Regular,
  54. System.Drawing.GraphicsUnit.Point,
  55. ((byte)(134)));
  56. public static Editor Instance { get { return s_instance; } }
  57. private static Editor s_instance;
  58. private static DirectoryInfo s_editroot;// GameEditor
  59. private static DirectoryInfo s_proj_setting_root;// GameEditor/.setting
  60. private static DirectoryInfo s_datadir;// GameEditor/data
  61. private static DirectoryInfo s_resdir;// GameEditor/res
  62. internal static void SetDataRoot(string root)
  63. {
  64. s_editroot = new DirectoryInfo(root);
  65. s_proj_setting_root = new DirectoryInfo(root + "\\.setting");
  66. s_datadir = new DirectoryInfo(root + "\\data");
  67. s_resdir = new DirectoryInfo(root + "\\res");
  68. DefaultResourceLoader.SetRoot(root);
  69. }
  70. #endregion
  71. //------------------------------------------------------------------------------
  72. #region fields
  73. private bool autoSave = false;
  74. private HashMap<Type, IDataManager> template_panels = new HashMap<Type, IDataManager>();
  75. private HashMap<TabPage, IDataManager> page_panels = new HashMap<TabPage, IDataManager>();
  76. private DataManagerPanel<UnitInfo> units;
  77. private DataManagerPanel<SkillTemplate> skills;
  78. private DataManagerPanel<SpellTemplate> spells;
  79. private DataManagerPanel<BuffTemplate> buffs;
  80. private DataManagerPanel<ItemTemplate> items;
  81. private DataManagerPanel<UnitTriggerTemplate> unit_triggers;
  82. private DataManagerPanel<UnitEventTemplate> unit_events;
  83. private DataManagerPanel<SceneData> scenes;
  84. public MessageFactoryGenerator MessageFactory { get { return TemplateManager.MessageCodec; } }
  85. public ImageList Icons
  86. {
  87. get { return imageList1; }
  88. }
  89. #endregion
  90. //------------------------------------------------------------------------------
  91. public Editor(bool autoSave = false)
  92. {
  93. InitializeComponent();
  94. Editor.s_instance = this;
  95. if (!s_proj_setting_root.Exists)
  96. {
  97. s_proj_setting_root.Create();
  98. }
  99. GameEditorPropertyAdapter.Init();
  100. this.autoSave = autoSave;
  101. }
  102. //-----------------------------------------------------------------------------------------------------------
  103. public Config CFG { get; private set; }
  104. public ICommonConfig ExtCFG { get; private set; }
  105. public TerrainDefinitionMap TerrainDefinition { get; private set; }
  106. public UnitActionDefinitionMap UnitActionDefinition { get; private set; }
  107. public FileInfo SaveCfgFile { get { return new FileInfo(Editor.DataDir + "/config.xml"); } }
  108. public FileInfo SaveCfgExtFile { get { return new FileInfo(Editor.DataDir + "/config_ext.xml"); } }
  109. public FileInfo SaveTerrainDefinitionFile { get { return new FileInfo(Editor.DataDir + "/terrain_definition.xml"); } }
  110. public FileInfo SaveUnitActionDefinition { get { return new FileInfo(Editor.DataDir + "/unit_action_definition.xml"); } }
  111. public TerrainDefinitionMap.MapBlockBrush DefaultTerrainBrush
  112. {
  113. get
  114. {
  115. foreach (var b in TerrainDefinition.Brushes)
  116. {
  117. if (b.IsBlock)
  118. {
  119. return b;
  120. }
  121. }
  122. return null;
  123. }
  124. }
  125. private void InitAllTempaltes()
  126. {
  127. this.units = new DataManagerPanel<UnitInfo>("单位",
  128. Editor.DataDir + "/units",
  129. Editor.EditorSettingDir + "/units",
  130. imageList1,
  131. "icons_tool_bar2.png",
  132. tabPageUnits.ImageKey);
  133. this.skills = new DataManagerPanel<SkillTemplate>("技能",
  134. Editor.DataDir + "/skills",
  135. Editor.EditorSettingDir + "/skills",
  136. imageList1,
  137. "icons_tool_bar2.png",
  138. tabPageSkills.ImageKey);
  139. this.spells = new DataManagerPanel<SpellTemplate>("法术",
  140. Editor.DataDir + "/spells",
  141. Editor.EditorSettingDir + "/spells",
  142. imageList1,
  143. "icons_tool_bar2.png",
  144. tabPageSpells.ImageKey);
  145. this.buffs = new DataManagerPanel<BuffTemplate>("BUFF",
  146. Editor.DataDir + "/buffs",
  147. Editor.EditorSettingDir + "/buffs",
  148. imageList1,
  149. "icons_tool_bar2.png",
  150. tabPageBuffs.ImageKey);
  151. this.items = new DataManagerPanel<ItemTemplate>("物品",
  152. Editor.DataDir + "/items",
  153. Editor.EditorSettingDir + "/items",
  154. imageList1,
  155. "icons_tool_bar2.png",
  156. tabPageItems.ImageKey);
  157. this.unit_triggers = new DataManagerPanel<UnitTriggerTemplate>("单位触发器",
  158. Editor.DataDir + "/unit_triggers",
  159. Editor.EditorSettingDir + "/unit_triggers",
  160. imageList1,
  161. "icons_tool_bar2.png",
  162. tabPageUnitTriggers.ImageKey);
  163. this.unit_events = new DataManagerPanel<UnitEventTemplate>("单位事件",
  164. Editor.DataDir + "/unit_events",
  165. Editor.EditorSettingDir + "/unit_events",
  166. imageList1,
  167. "icons_tool_bar2.png",
  168. tabPageUnitEvents.ImageKey);
  169. this.scenes = new DataManagerPanel<SceneData>("场景",
  170. Editor.DataDir + "/scenes",
  171. Editor.EditorSettingDir + "/scenes",
  172. imageList1,
  173. "icons_tool_bar2.png",
  174. tabPageScene.ImageKey);
  175. this.scenes.SetEnableDataGrid(false);
  176. tabPageUnits.Controls.Add(units);
  177. tabPageSkills.Controls.Add(skills);
  178. tabPageSpells.Controls.Add(spells);
  179. tabPageBuffs.Controls.Add(buffs);
  180. tabPageItems.Controls.Add(items);
  181. tabPageUnitTriggers.Controls.Add(unit_triggers);
  182. tabPageUnitEvents.Controls.Add(unit_events);
  183. tabPageScene.Controls.Add(scenes);
  184. //模板类型和DataManagerPanel映射关系//
  185. this.template_panels.Add(typeof(UnitInfo), units);
  186. this.template_panels.Add(typeof(SkillTemplate), skills);
  187. this.template_panels.Add(typeof(SpellTemplate), spells);
  188. this.template_panels.Add(typeof(BuffTemplate), buffs);
  189. this.template_panels.Add(typeof(ItemTemplate), items);
  190. this.template_panels.Add(typeof(UnitTriggerTemplate), unit_triggers);
  191. this.template_panels.Add(typeof(UnitEventTemplate), unit_events);
  192. this.template_panels.Add(typeof(SceneData), scenes);
  193. //TabPage和DataManagerPanel映射关系//
  194. this.page_panels.Add(tabPageUnits, units);
  195. this.page_panels.Add(tabPageSkills, skills);
  196. this.page_panels.Add(tabPageSpells, spells);
  197. this.page_panels.Add(tabPageBuffs, buffs);
  198. this.page_panels.Add(tabPageItems, items);
  199. this.page_panels.Add(tabPageUnitTriggers, unit_triggers);
  200. this.page_panels.Add(tabPageUnitEvents, unit_events);
  201. this.page_panels.Add(tabPageScene, scenes);
  202. //unit events//
  203. {
  204. ToolStripMenuItem open = new ToolStripMenuItem("单位事件编辑器");
  205. open.Size = new System.Drawing.Size(136, 22);
  206. open.Click += openUnitEvent_Click;
  207. unit_events.AddChildMenuItem(0, open);
  208. unit_events.AddChildMenuItem(1, new ToolStripSeparator());
  209. unit_events.GetTreeView().NodeMouseDoubleClick +=
  210. new TreeNodeMouseClickEventHandler(openUnitEvent_Click);
  211. }
  212. //scene menu//
  213. {
  214. {
  215. ToolStripMenuItem open_group = new ToolStripMenuItem("场景编辑器");
  216. open_group.Size = new System.Drawing.Size(136, 22);
  217. {
  218. ToolStripMenuItem open_btn = new ToolStripMenuItem("打开(" + EditorPlugin.CurrentPlugin.Name + ")");
  219. open_btn.Size = new System.Drawing.Size(136, 22);
  220. open_btn.Click += new EventHandler(sceneBtn_OpenNode_Click);
  221. open_group.DropDownItems.Add(open_btn);
  222. ToolStripMenuItem open_win32 = new ToolStripMenuItem("打开(Win32)");
  223. open_win32.Size = new System.Drawing.Size(136, 22);
  224. open_win32.Click += new EventHandler(sceneBtn_OpenNodeWin32_Click);
  225. open_group.DropDownItems.Add(open_win32);
  226. }
  227. scenes.AddChildMenuItem(0, open_group);
  228. }
  229. {
  230. ToolStripMenuItem run_btn = new ToolStripMenuItem("运行");
  231. run_btn.Size = new System.Drawing.Size(136, 22);
  232. ToolStripMenuItem run_game = new ToolStripMenuItem("运行(" + EditorPlugin.CurrentPlugin.Name + ")");
  233. run_game.Size = new System.Drawing.Size(136, 22);
  234. run_game.Click += new EventHandler(sceneBtn_RunGAME_Click);
  235. run_btn.DropDownItems.Add(run_game);
  236. ToolStripMenuItem run_emu = new ToolStripMenuItem("运行(Win32)");
  237. run_emu.Size = new System.Drawing.Size(136, 22);
  238. run_emu.Click += new EventHandler(sceneBtn_RunEMU_Click);
  239. run_btn.DropDownItems.Add(run_emu);
  240. ToolStripMenuItem run_server = new ToolStripMenuItem("运行(Win32)服务器");
  241. run_server.Size = new System.Drawing.Size(136, 22);
  242. run_server.Click += new EventHandler(sceneBtn_RunEMUServer_Click);
  243. run_btn.DropDownItems.Add(run_server);
  244. run_btn.DropDownItems.Add(new ToolStripSeparator());
  245. ToolStripMenuItem run_rec = new ToolStripMenuItem("运行并录制战报(Win32)");
  246. run_rec.Size = new System.Drawing.Size(136, 22);
  247. run_rec.Click += new EventHandler(sceneBtn_RunREC_Click);
  248. run_btn.DropDownItems.Add(run_rec);
  249. ToolStripMenuItem run_rec_play = new ToolStripMenuItem("播放战报(Win32)");
  250. run_rec_play.Size = new System.Drawing.Size(136, 22);
  251. run_rec_play.Click += new EventHandler(sceneBtn_LoadREC_Click);
  252. run_btn.DropDownItems.Add(run_rec_play);
  253. scenes.AddChildMenuItem(1, run_btn);
  254. }
  255. {
  256. ToolStripMenuItem test_astar = new ToolStripMenuItem("测试寻路");
  257. test_astar.Size = new System.Drawing.Size(136, 22);
  258. test_astar.Click += new EventHandler(sceneBtn_TestAstar_Click);
  259. scenes.AddChildMenuItem(2, test_astar);
  260. }
  261. {
  262. scenes.AddChildMenuItem(3, new ToolStripSeparator());
  263. }
  264. scenes.GetTreeView().NodeMouseDoubleClick +=
  265. new TreeNodeMouseClickEventHandler(sceneBtn_DoubleClickNode);
  266. }
  267. LoadDataTask task = new LoadDataTask();
  268. new G2DProgressDialog(task).ShowDialog(this);
  269. }
  270. //-----------------------------------------------------------------------------------------------------------
  271. public EditorTemplatesData GetEditorTemplatesData()
  272. {
  273. return new EditorTemplatesData(
  274. TerrainDefinition,
  275. UnitActionDefinition,
  276. this.units.GetAllNodeData(),
  277. this.skills.GetAllNodeData(),
  278. this.spells.GetAllNodeData(),
  279. this.buffs.GetAllNodeData(),
  280. this.items.GetAllNodeData(),
  281. this.unit_triggers.GetAllNodeData(),
  282. this.unit_events.GetAllNodeData(),
  283. this.scenes.GetAllNodeData());
  284. }
  285. public void RefreshAll()
  286. {
  287. this.units.RefreshData();
  288. this.skills.RefreshData();
  289. this.spells.RefreshData();
  290. this.buffs.RefreshData();
  291. this.items.RefreshData();
  292. this.unit_triggers.RefreshData();
  293. this.unit_events.RefreshData();
  294. this.scenes.RefreshData();
  295. }
  296. public void SaveEditorStatus()
  297. {
  298. foreach (var temp in template_panels.Values)
  299. {
  300. temp.SaveEditorStatus();
  301. }
  302. }
  303. //-----------------------------------------------------------------------------------------------------------
  304. #region _SaveLoad_
  305. //-----------------------------------------------------------------------------------------------------------
  306. private void loadCFG()
  307. {
  308. try
  309. {
  310. this.CFG = EditorTemplates.LoadXmlAs(SaveCfgFile.FullName, new Config());
  311. this.ExtCFG = EditorTemplates.LoadXmlAs(SaveCfgExtFile.FullName, TemplateManager.Factory.CreateCommonCFG());
  312. this.TerrainDefinition = EditorTemplates.LoadXmlAs(SaveTerrainDefinitionFile.FullName, new TerrainDefinitionMap());
  313. this.UnitActionDefinition = EditorTemplates.LoadXmlAs(SaveUnitActionDefinition.FullName, new UnitActionDefinitionMap());
  314. }
  315. catch (Exception err)
  316. {
  317. MessageBox.Show(err.Message);
  318. }
  319. }
  320. private static void saveCFG(object obj, FileInfo file)
  321. {
  322. try
  323. {
  324. string file1 = file.FullName;
  325. using (FileStream xmlfs = new FileStream(file1, FileMode.Create, FileAccess.Write))
  326. {
  327. XmlUtil.SaveToXML(xmlfs, obj, true);
  328. }
  329. }
  330. catch (Exception err)
  331. {
  332. MessageBox.Show(err.Message);
  333. }
  334. }
  335. private void saveCFG()
  336. {
  337. saveCFG(this.CFG, SaveCfgFile);
  338. saveCFG(this.ExtCFG, SaveCfgExtFile);
  339. saveCFG(this.TerrainDefinition, SaveTerrainDefinitionFile);
  340. saveCFG(this.UnitActionDefinition, SaveUnitActionDefinition);
  341. }
  342. private void saveAll(bool check = false)
  343. {
  344. SaveDataTask task = new SaveDataTask(this, check);
  345. new G2DProgressDialog(task).ShowDialog(this);
  346. }
  347. private void sceneEditor_onSavedScene(SceneEditor editor, G2DTreeNode<SceneData> node)
  348. {
  349. scenes.SaveNode(node);
  350. }
  351. private class LoadDataTask : IProgress
  352. {
  353. private readonly Editor editor = Editor.Instance;
  354. private AtomicInteger mNodeProgress = new AtomicInteger(0);
  355. public LoadDataTask()
  356. {
  357. this.Title = "加载中...";
  358. this.Maximum =
  359. editor.units.GetTryLoadCount() +
  360. editor.skills.GetTryLoadCount() +
  361. editor.spells.GetTryLoadCount() +
  362. editor.buffs.GetTryLoadCount() +
  363. editor.items.GetTryLoadCount() +
  364. editor.unit_triggers.GetTryLoadCount() +
  365. editor.unit_events.GetTryLoadCount() +
  366. editor.scenes.GetTryLoadCount() +
  367. 0;
  368. }
  369. public override int Value
  370. {
  371. get
  372. {
  373. return mNodeProgress.Value;
  374. }
  375. }
  376. public override void Run()
  377. {
  378. this.Text = "加载单位";
  379. editor.units.LoadAll(mNodeProgress);
  380. this.Text = "加载技能";
  381. editor.skills.LoadAll(mNodeProgress);
  382. this.Text = "加载法术";
  383. editor.spells.LoadAll(mNodeProgress);
  384. this.Text = "加载BUFF";
  385. editor.buffs.LoadAll(mNodeProgress);
  386. this.Text = "加载物品";
  387. editor.items.LoadAll(mNodeProgress);
  388. this.Text = "加载单位触发器";
  389. editor.unit_triggers.LoadAll(mNodeProgress);
  390. this.Text = "加载单位事件";
  391. editor.unit_events.LoadAll(mNodeProgress);
  392. this.Text = "加载场景";
  393. editor.scenes.LoadAll(mNodeProgress);
  394. }
  395. public override void Done()
  396. {
  397. editor.units.Refresh();
  398. editor.skills.Refresh();
  399. editor.spells.Refresh();
  400. editor.buffs.Refresh();
  401. editor.items.Refresh();
  402. editor.unit_triggers.Refresh();
  403. editor.unit_events.Refresh();
  404. editor.scenes.Refresh();
  405. }
  406. }
  407. private class SaveDataTask : IProgress
  408. {
  409. private bool check;
  410. private readonly Editor editor;
  411. private readonly EditorTemplatesData all_nodes;
  412. private readonly List<FileInfo> plugin_files;
  413. private string mState = "";
  414. private bool mIsDone = false;
  415. private AtomicInteger mNodeProgress = new AtomicInteger(0);
  416. private AtomicFloat mXLSProgress = new AtomicFloat(0);
  417. private AtomicFloat mPluginProgress = new AtomicFloat(0);
  418. private AtomicFloat mPluginCSVProgress = new AtomicFloat(0);
  419. private AtomicFloat mLanguageProgress = new AtomicFloat(0);
  420. private int mNodeMax = 0;
  421. private float mXLSMax = 0;
  422. public SaveDataTask(Editor editor, bool check)
  423. {
  424. this.check = check;
  425. this.editor = editor;
  426. this.all_nodes = editor.GetEditorTemplatesData();
  427. this.plugin_files = checkPlugins();
  428. this.mNodeMax = all_nodes.FileCount;
  429. this.mXLSMax = plugin_files.Count;
  430. }
  431. public override string Title
  432. {
  433. get { return "保存中..."; }
  434. }
  435. public override string Text
  436. {
  437. get { return mState; }
  438. }
  439. public override int Minimum
  440. {
  441. get { return 0; }
  442. }
  443. public override int Maximum
  444. {
  445. get
  446. {
  447. return (int)(0
  448. + (100f) // nodes 100%
  449. + (100f * (CommonAIEditor.Program.g_SimpleGen ? 0 : 1)) // language 100%
  450. + (10f) // plugins saving 100%
  451. + (100f * mXLSMax) // plugins csv 100%
  452. + (100f * mXLSMax) // xls 2 csv 100%
  453. );
  454. }
  455. }
  456. public override int Value
  457. {
  458. get
  459. {
  460. return (int)(0
  461. + (100f * mNodeProgress.Value / mNodeMax)
  462. + (100f * mLanguageProgress.Value)
  463. + (100f * mPluginProgress.Value)
  464. + (100f * mPluginCSVProgress.Value)
  465. + (100f * mXLSProgress.Value)
  466. );
  467. }
  468. }
  469. public override bool IsDone
  470. {
  471. get { return mIsDone; }
  472. }
  473. public override void Run()
  474. {
  475. mState = "生成序列号";
  476. new SerialMaker().Gen(all_nodes);
  477. List<FileInfo> gen_md5_files = new List<FileInfo>();
  478. // save all xml
  479. {
  480. editor.saveCFG();
  481. mState = "保存单位";
  482. editor.units.SaveAll(mNodeProgress, check);
  483. mState = "保存技能";
  484. editor.skills.SaveAll(mNodeProgress, check);
  485. mState = "保存法术";
  486. editor.spells.SaveAll(mNodeProgress, check);
  487. mState = "保存BUFF";
  488. editor.buffs.SaveAll(mNodeProgress, check);
  489. mState = "保存物品";
  490. editor.items.SaveAll(mNodeProgress, check);
  491. mState = "保存单位触发器";
  492. editor.unit_triggers.SaveAll(mNodeProgress, check);
  493. mState = "保存单位事件";
  494. editor.unit_events.SaveAll(mNodeProgress, check);
  495. mState = "保存场景";
  496. editor.scenes.SaveAll(mNodeProgress, check);
  497. if (!CommonAIEditor.Program.g_SimpleGen)
  498. {
  499. mState = "生成语言文件";
  500. string language = EditorTemplates.GenLocalizationCsv(all_nodes, mLanguageProgress); // +=1
  501. File.WriteAllText(EditorRootDir + "\\language.csv", language, CUtils.UTF8);
  502. }
  503. }
  504. // add base md5 files
  505. {
  506. gen_md5_files.Add(editor.SaveCfgFile);
  507. gen_md5_files.Add(editor.SaveCfgExtFile);
  508. gen_md5_files.Add(editor.SaveTerrainDefinitionFile);
  509. gen_md5_files.Add(editor.units.GetMd5File());
  510. gen_md5_files.Add(editor.skills.GetMd5File());
  511. gen_md5_files.Add(editor.spells.GetMd5File());
  512. gen_md5_files.Add(editor.buffs.GetMd5File());
  513. gen_md5_files.Add(editor.items.GetMd5File());
  514. gen_md5_files.Add(editor.unit_triggers.GetMd5File());
  515. gen_md5_files.Add(editor.unit_events.GetMd5File());
  516. gen_md5_files.Add(editor.scenes.GetMd5File());
  517. }
  518. // save all game plugins
  519. try
  520. {
  521. mState = "保存各游戏扩展插件:" + TemplateManager.Factory.GetType().Name;
  522. TemplateManager.Factory.Formula.OnEditorSaving(
  523. all_nodes,
  524. new DirectoryInfo(DataDir),
  525. gen_md5_files,
  526. mPluginProgress); // += 1
  527. List<XCSVMeta> xls2csv = new List<XCSVMeta>();
  528. foreach (FileInfo xls in plugin_files)
  529. {
  530. mState = "生成插件数据:" + xls.Name;
  531. XLS2XCSV csv = new XLS2XCSV(xls);
  532. csv.Load(mXLSProgress); // += 1
  533. savedPluginFileTimes.Put(xls.FullName, xls.LastWriteTime);
  534. xls2csv.Add(csv.Meta);
  535. }
  536. mState = "解析插件数据:" + TemplateManager.Factory.GetType().Name;
  537. TemplateManager.Factory.Formula.OnEditorPluginSaved(all_nodes, xls2csv, gen_md5_files, mPluginCSVProgress); // += 1
  538. mState = "生成资源版本号";
  539. genResourceVersion(gen_md5_files);
  540. if (new FileInfo("../../Http/ResBuilder.exe").Exists)
  541. {
  542. Process process = Process.Start(new ProcessStartInfo("cmd.exe", "/C ResBuilder.exe -np -!uires -!lua -!uiconvertbin")
  543. {
  544. CreateNoWindow = true,
  545. UseShellExecute = false,
  546. WorkingDirectory = "../../Http"
  547. });
  548. process.WaitForExit();
  549. process.Close();
  550. }
  551. }
  552. finally
  553. {
  554. mState = "完成";
  555. mIsDone = true;
  556. }
  557. }
  558. private void genResourceVersion(List<FileInfo> gen_md5_files)
  559. {
  560. DirectoryInfo root = new DirectoryInfo(DataDir);
  561. StringBuilder lines = new StringBuilder();
  562. {
  563. foreach (FileInfo sub in gen_md5_files)
  564. {
  565. string md5 = CMD5.CalculateMD5(sub);
  566. long size = sub.Length;
  567. lines.AppendLine(string.Format(string.Format("{0} : {1,12} : {2}", md5, size, sub.FullName.Substring(root.FullName.Length))));
  568. }
  569. lines.Insert(0, CMD5.CalculateMD5(lines.ToString(), CUtils.UTF8) + "\r\n");
  570. }
  571. File.WriteAllText(DataDir + "\\ver.md5", lines.ToString(), CUtils.UTF8);
  572. }
  573. /// <summary>
  574. /// 记录文件更新日期
  575. /// </summary>
  576. private static HashMap<string, DateTime> savedPluginFileTimes = new HashMap<string, DateTime>();
  577. // 检测xls目录下游戏插件是否需要存储//
  578. private List<FileInfo> checkPlugins()
  579. {
  580. List<FileInfo> xls_files = new List<FileInfo>();
  581. TemplateManager.Factory.Formula.ListXCSVFiles(new DirectoryInfo(DataDir), xls_files);
  582. // foreach (FileInfo sub in CFiles.listAllFiles(xls_dir))
  583. // {
  584. // try
  585. // {
  586. // string ext = sub.Extension.ToLower();
  587. // if (ext.EndsWith(".xls"))
  588. // {
  589. // string fullname = sub.FullName;
  590. // // 检测文件有没有更新
  591. // DateTime lastSaved;
  592. // if (!savedPluginFileTimes.TryGetValue(fullname, out lastSaved) || (lastSaved != sub.LastWriteTime))
  593. // {
  594. // xls_files.Add(sub);
  595. // }
  596. // Console.WriteLine("Skip Save : " + fullname);
  597. // }
  598. // }
  599. // catch (Exception err)
  600. // {
  601. // MessageBox.Show(err.Message);
  602. // }
  603. // }
  604. return xls_files;
  605. }
  606. }
  607. //-----------------------------------------------------------------------------------------------------------
  608. class SerialMaker
  609. {
  610. public void Gen(EditorTemplatesData alldata)
  611. {
  612. HashMap<uint, ISNData> savedID = new HashMap<uint, ISNData>();
  613. List<ISNData> datas = new List<ISNData>();
  614. List<ISNData> regens = new List<ISNData>();
  615. while (true)
  616. {
  617. savedID.Clear();
  618. datas.Clear();
  619. regens.Clear();
  620. PropertyUtil.CollectFieldTypeValues<ISNData>(alldata, datas);
  621. foreach (ISNData sn in datas)
  622. {
  623. if (savedID.ContainsKey(sn.SerialNumber))
  624. {
  625. regens.Add(sn);
  626. }
  627. else
  628. {
  629. savedID.Put(sn.SerialNumber, sn);
  630. }
  631. }
  632. if (regens.Count > 0)
  633. {
  634. uint nid = 1;
  635. foreach (ISNData sn in regens)
  636. {
  637. for (; nid < uint.MaxValue; nid++)
  638. {
  639. if (!savedID.ContainsKey(nid))
  640. {
  641. sn.RegenSerialNumber(nid);
  642. break;
  643. }
  644. }
  645. }
  646. }
  647. else
  648. {
  649. break;
  650. }
  651. }
  652. }
  653. }
  654. //-----------------------------------------------------------------------------------------------------------
  655. private class LoadLanguageTask : IProgress
  656. {
  657. public override int Value { get { return progress.Value; } }
  658. private Editor editor;
  659. private EditorTemplatesData allnodes;
  660. private AtomicInteger progress = new AtomicInteger(0);
  661. private CsvTable table = new CsvTable();
  662. public LoadLanguageTask(string file, Editor editor)
  663. {
  664. this.editor = editor;
  665. this.allnodes = editor.GetEditorTemplatesData();
  666. this.table.LoadFromText(File.ReadAllText(file, CUtils.UTF8));
  667. base.Title = "Load Language : " + file;
  668. base.Text = "替换字段中...";
  669. base.Maximum = table.MaxRow;
  670. base.Minimum = 0;
  671. base.IsDone = false;
  672. }
  673. public override void Run()
  674. {
  675. EditorTemplates.LoadLocalizationCsv(allnodes, table, progress);
  676. this.IsDone = true;
  677. }
  678. public override void Done()
  679. {
  680. editor.RefreshAll();
  681. }
  682. }
  683. //-----------------------------------------------------------------------------------------------------------
  684. #endregion // _SaveLoad_
  685. //-----------------------------------------------------------------------------------------------------------
  686. //------------------------------------------------------------------------------
  687. #region _Templates_
  688. //------------------------------------------------------------------------------
  689. /// <summary>
  690. /// 获取模板管理器
  691. /// </summary>
  692. /// <typeparam name="T"></typeparam>
  693. /// <returns></returns>
  694. public DataManagerPanel<T> GetTemplateManager<T>() where T : class, ITemplateData, new()
  695. {
  696. Type type = typeof(T);
  697. return template_panels[type] as DataManagerPanel<T>;
  698. }
  699. /// <summary>
  700. /// 获取模板管理器根节点
  701. /// </summary>
  702. /// <param name="type"></param>
  703. /// <returns></returns>
  704. public TreeNode GetTemplateManagerTreeRoot<T>() where T : class, ITemplateData, new()
  705. {
  706. Type type = typeof(T);
  707. DataManagerPanel<T> panel = template_panels[type] as DataManagerPanel<T>;
  708. if (panel != null)
  709. {
  710. return panel.TreeRoot;
  711. }
  712. return null;
  713. }
  714. public object GetSelectedObject()
  715. {
  716. IDataManager dm = page_panels[tabControl1.SelectedTab];
  717. if (dm != null)
  718. {
  719. return dm.SelectedData;
  720. }
  721. return null;
  722. }
  723. /// <summary>
  724. /// 获取模板ID和类型对应的模板对象
  725. /// </summary>
  726. /// <param name="id"></param>
  727. /// <param name="type"></param>
  728. /// <returns></returns>
  729. public T GetTemplateByType<T>(int id) where T : class, ITemplateData, new()
  730. {
  731. Type type = typeof(T);
  732. DataManagerPanel<T> panel = template_panels[type] as DataManagerPanel<T>;
  733. if (panel != null)
  734. {
  735. return panel.GetNodeData(id.ToString());
  736. }
  737. return default(T);
  738. }
  739. public object GetTemplateByType(int id, Type type)
  740. {
  741. IDataManager panel = template_panels[type] as IDataManager;
  742. if (panel != null)
  743. {
  744. return panel.GetNodeData(id.ToString());
  745. }
  746. return null;
  747. }
  748. /// <summary>
  749. /// 获取场景中,玩家出生点对应的UnitTemplateID
  750. /// </summary>
  751. /// <param name="mData"></param>
  752. /// <param name="force"></param>
  753. /// <returns></returns>
  754. public static int GetTestActorTemplateID(SceneData mData, int force)
  755. {
  756. foreach (RegionData rd in mData.Regions)
  757. {
  758. foreach (AbilityData tg in rd.Abilities)
  759. {
  760. if (tg is PlayerStartAbilityData)
  761. {
  762. PlayerStartAbilityData start = tg as PlayerStartAbilityData;
  763. if (start.START_Force == force)
  764. {
  765. return start.TestActorTemplateID;
  766. }
  767. }
  768. }
  769. }
  770. return 1;
  771. }
  772. /// <summary>
  773. /// 获取 模板数据 对应的 ID
  774. /// </summary>
  775. /// <param name="obj"></param>
  776. /// <param name="elementType"></param>
  777. /// <param name="id"></param>
  778. /// <returns></returns>
  779. public bool ConvertTemplateID(object obj, out int id)
  780. {
  781. if (obj != null)
  782. {
  783. if (obj is ITemplateData)
  784. {
  785. id = (obj as ITemplateData).TemplateID;
  786. return true;
  787. }
  788. }
  789. id = 0;
  790. return false;
  791. }
  792. /// <summary>
  793. /// 显示选择Template对象对话框
  794. /// </summary>
  795. /// <param name="obj"></param>
  796. /// <param name="elementType"></param>
  797. /// <param name="id"></param>
  798. /// <returns></returns>
  799. public object ShowSelectTemplateDialog(object obj, Type elementType)
  800. {
  801. IDataManager panel = template_panels[elementType] as IDataManager;
  802. if (panel != null)
  803. {
  804. return panel.ShowSelectTemplateDialog(obj);
  805. }
  806. return null;
  807. }
  808. /// <summary>
  809. /// 显示选择TemplateID对话框
  810. /// </summary>
  811. /// <param name="obj"></param>
  812. /// <param name="elementType"></param>
  813. /// <param name="id"></param>
  814. /// <returns></returns>
  815. public bool ShowSelectTemplateIDDialog(object obj, Type elementType, out int id)
  816. {
  817. IDataManager panel = template_panels[elementType] as IDataManager;
  818. if (panel != null)
  819. {
  820. return panel.ShowSelectTemplateIDDialog(obj, out id);
  821. }
  822. id = 0;
  823. return false;
  824. }
  825. /// <summary>
  826. /// 选择地块
  827. /// </summary>
  828. /// <param name="color"></param>
  829. /// <returns></returns>
  830. public FormTerrainDefinition ShowTerrainDefinitionDialog(IWin32Window owner, int color = 0)
  831. {
  832. var editor = new FormTerrainDefinition();
  833. editor.SelectedColor = color;
  834. editor.ShowDialog(owner);
  835. this.TerrainDefinition = editor.Data;
  836. saveCFG(this.TerrainDefinition, this.SaveTerrainDefinitionFile);
  837. return editor;
  838. }
  839. /// <summary>
  840. ///
  841. /// </summary>
  842. /// <param name="owner"></param>
  843. /// <param name="color"></param>
  844. /// <returns></returns>
  845. public FormUnitActionDefinition ShowUnitActionDefinitionDialog(IWin32Window owner)
  846. {
  847. var editor = new FormUnitActionDefinition();
  848. editor.ShowDialog(owner);
  849. this.UnitActionDefinition = editor.Data;
  850. saveCFG(this.UnitActionDefinition, this.SaveUnitActionDefinition);
  851. return editor;
  852. }
  853. #endregion
  854. //-----------------------------------------------------------------------------------------------------------
  855. #region _Resource_
  856. //-----------------------------------------------------------------------------------------------------------
  857. private void InitAllResNode()
  858. {
  859. TreeNode root = new TreeNode("资源");
  860. root.ImageKey = "icons_tool_bar2.png";
  861. root.SelectedImageKey = "icons_tool_bar2.png";
  862. InitResNode(root, new DirectoryInfo(Editor.EditorRootDir));
  863. treeViewRes.Nodes.Clear();
  864. treeViewRes.Nodes.Add(root);
  865. treeViewRes.CollapseAll();
  866. }
  867. private int InitResNode(TreeNode parent, DirectoryInfo dir)
  868. {
  869. int count = 0;
  870. foreach (FileInfo f in dir.GetFiles())
  871. {
  872. if (EditorPlugin.CurrentPlugin.AcceptResource(EditorPlugin.DefaultPlugin, f.Name))
  873. {
  874. TreeNode sub = new TreeNode(f.Name);
  875. sub.Tag = f;
  876. sub.ImageKey = "icon_res.png";
  877. sub.SelectedImageKey = "icon_res.png";
  878. parent.Nodes.Add(sub);
  879. count++;
  880. }
  881. }
  882. foreach (DirectoryInfo d in dir.GetDirectories())
  883. {
  884. TreeNode sub = new TreeNode(d.Name);
  885. int scount = InitResNode(sub, d);
  886. if (scount > 0)
  887. {
  888. sub.Tag = d;
  889. sub.ImageKey = "icons_tool_bar2.png";
  890. sub.SelectedImageKey = "icons_tool_bar2.png";
  891. parent.Nodes.Add(sub);
  892. }
  893. count += scount;
  894. }
  895. return count;
  896. }
  897. private void treeViewRes_ItemDrag(object sender, ItemDragEventArgs e)
  898. {
  899. treeViewRes.DoDragDrop(e.Item, DragDropEffects.Move);
  900. }
  901. private void listView1_DragDrop(object sender, DragEventArgs e)
  902. {
  903. if (e.Data.GetDataPresent(typeof(TreeNode)))
  904. {
  905. TreeNode node = e.Data.GetData(typeof(TreeNode)) as TreeNode;
  906. if (node.Tag is FileInfo)
  907. {
  908. FileInfo fi = node.Tag as FileInfo;
  909. ListViewItem item = new ListViewItem(fi.Name);
  910. item.ImageKey = "icon_res.png";
  911. item.Tag = fi;
  912. listViewRes.Items.Add(item);
  913. }
  914. }
  915. }
  916. private void listView1_DragEnter(object sender, DragEventArgs e)
  917. {
  918. if (e.Data.GetDataPresent(typeof(TreeNode)))
  919. {
  920. TreeNode node = e.Data.GetData(typeof(TreeNode)) as TreeNode;
  921. if (node.Tag is FileInfo)
  922. {
  923. e.Effect = DragDropEffects.Move;
  924. return;
  925. }
  926. }
  927. e.Effect = DragDropEffects.None;
  928. }
  929. private void listView1_DragOver(object sender, DragEventArgs e)
  930. {
  931. if (e.Data.GetDataPresent(typeof(TreeNode)))
  932. {
  933. TreeNode node = e.Data.GetData(typeof(TreeNode)) as TreeNode;
  934. if (node.Tag is FileInfo)
  935. {
  936. e.Effect = DragDropEffects.Move;
  937. return;
  938. }
  939. }
  940. e.Effect = DragDropEffects.None;
  941. }
  942. private void treeViewRes_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
  943. {
  944. if (e.Node.Tag is FileInfo)
  945. {
  946. try
  947. {
  948. FileInfo ff = e.Node.Tag as FileInfo;
  949. EditorPlugin.CurrentPlugin.RunModelView(EditorPlugin.DefaultPlugin, new string[] { ff.FullName });
  950. }
  951. catch (Exception err)
  952. {
  953. MessageBox.Show(err.Message);
  954. }
  955. }
  956. }
  957. private void btnRunRes_Click(object sender, EventArgs e)
  958. {
  959. List<string> ffs = new List<string>();
  960. foreach (ListViewItem item in listViewRes.Items)
  961. {
  962. if (item.Tag is FileInfo)
  963. {
  964. FileInfo ffi = item.Tag as FileInfo;
  965. ffs.Add(ffi.FullName);
  966. }
  967. }
  968. try
  969. {
  970. EditorPlugin.CurrentPlugin.RunModelView(EditorPlugin.DefaultPlugin, ffs.ToArray());
  971. }
  972. catch (Exception err)
  973. {
  974. MessageBox.Show(err.Message);
  975. }
  976. }
  977. private void btnRemoveRes_Click(object sender, EventArgs e)
  978. {
  979. foreach (ListViewItem item in listViewRes.SelectedItems)
  980. {
  981. listViewRes.Items.Remove(item);
  982. }
  983. }
  984. private void btnRefreshRes_Click(object sender, EventArgs e)
  985. {
  986. listViewRes.Items.Clear();
  987. }
  988. private void btn_CleanRes_Click(object sender, EventArgs e)
  989. {
  990. new G2DProgressDialog(new CleanResTask(this)).ShowDialog(this);
  991. }
  992. private void btn_OutputRes_Click(object sender, EventArgs e)
  993. {
  994. FolderBrowserDialog dialog = new FolderBrowserDialog();
  995. dialog.SelectedPath = DataDir;
  996. if (dialog.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
  997. {
  998. if (!dialog.SelectedPath.Equals(DataDir))
  999. {
  1000. new G2DProgressDialog(new CleanResTask(this, dialog.SelectedPath)).ShowDialog(this);
  1001. }
  1002. }
  1003. }
  1004. public class CleanResTask : IProgress
  1005. {
  1006. private readonly Editor editor;
  1007. private EditorTemplates templates;
  1008. private EditorTemplatesData datas;
  1009. private List<int> scenes_list;
  1010. private AtomicInteger used_progress = new AtomicInteger(0);
  1011. private SortedDictionary<string, AtomicInteger> file_list = new SortedDictionary<string, AtomicInteger>();
  1012. private int used_count = 0;
  1013. private int unused_count = 0;
  1014. private int miss_count = 0;
  1015. private StringBuilder logs = new StringBuilder();
  1016. private AtomicInteger copy_progress = new AtomicInteger(0);
  1017. private List<FileInfo> copyres = new List<FileInfo>();
  1018. private HashSet<string> ignores = new HashSet<string>();
  1019. private DirectoryInfo output_dir;
  1020. public override int Value
  1021. {
  1022. get
  1023. {
  1024. return used_progress.Value + copy_progress.Value;
  1025. }
  1026. }
  1027. public CleanResTask(Editor editor, string outputDir = null)
  1028. {
  1029. this.editor = editor;
  1030. this.templates = new EditorTemplates(DataDir, TemplateManager.MessageCodec);
  1031. this.templates.LoadAllTemplates();
  1032. this.datas = templates.AllTemplatesExcludeScenes;
  1033. this.scenes_list = templates.ListScenes();
  1034. List<FileInfo> allfiles = CFiles.listAllFiles(new DirectoryInfo(ResDir));
  1035. foreach (FileInfo file in allfiles)
  1036. {
  1037. file_list.Add(file.FullName, new AtomicInteger(0));
  1038. }
  1039. if (outputDir != null)
  1040. {
  1041. output_dir = new DirectoryInfo(outputDir);
  1042. CFiles.listAllFiles(copyres, new DirectoryInfo(DataDir));
  1043. CFiles.listAllFiles(copyres, new DirectoryInfo(ResDir));
  1044. }
  1045. base.Maximum = datas.FileCount + scenes_list.Count + copyres.Count;
  1046. base.Minimum = 0;
  1047. base.Value = 0;
  1048. base.Title = "检测资源文件使用";
  1049. }
  1050. public override void Run()
  1051. {
  1052. logs.AppendLine("------------------------------------------------------------------");
  1053. logs.AppendLine("- 缺失文件统计 -");
  1054. logs.AppendLine("------------------------------------------------------------------");
  1055. //检测所有模板资源使用率//
  1056. foreach (ITemplateData data in datas.AllTemplates())
  1057. {
  1058. base.Text = string.Format("{0}/{1} : {2}", Value, Maximum, data);
  1059. try
  1060. {
  1061. MarkInResources(data);
  1062. }
  1063. catch (Exception err)
  1064. {
  1065. logs.AppendLine(err.Message);
  1066. }
  1067. finally { this.used_progress.IncrementAndGet(); }
  1068. }
  1069. //检测所有场景资源使用率//
  1070. foreach (int scene_id in scenes_list)
  1071. {
  1072. try
  1073. {
  1074. SceneData sdata = templates.LoadScene(scene_id);
  1075. if (sdata != null)
  1076. {
  1077. base.Text = string.Format("{0}/{1} : scene : {2}", Value, Maximum, sdata);
  1078. MarkInResources(sdata);
  1079. }
  1080. }
  1081. catch (Exception err)
  1082. {
  1083. logs.AppendLine(err.Message);
  1084. }
  1085. finally { this.used_progress.IncrementAndGet(); }
  1086. }
  1087. logs.AppendLine("------------------------------------------------------------------");
  1088. logs.AppendLine("- 已使用文件统计 -");
  1089. logs.AppendLine("------------------------------------------------------------------");
  1090. //生成报表//
  1091. foreach (KeyValuePair<string, AtomicInteger> used in file_list)
  1092. {
  1093. string res = used.Key.Substring(EditorRootDir.Length);
  1094. int count = used.Value.Value;
  1095. if (count > 0)
  1096. {
  1097. used_count++;
  1098. logs.AppendLine(string.Format("已使用文件:,{0} ,次数:{1}", res, count));
  1099. }
  1100. }
  1101. logs.AppendLine("------------------------------------------------------------------");
  1102. logs.AppendLine("- 未使用文件统计 -");
  1103. logs.AppendLine("------------------------------------------------------------------");
  1104. foreach (KeyValuePair<string, AtomicInteger> used in file_list)
  1105. {
  1106. string res = used.Key.Substring(EditorRootDir.Length);
  1107. int count = used.Value.Value;
  1108. if (count <= 0)
  1109. {
  1110. ignores.Add(used.Key);
  1111. unused_count++;
  1112. logs.AppendLine(string.Format("未使用文件:,{0}", res));
  1113. }
  1114. }
  1115. logs.AppendLine("------------------------------------------------------------------");
  1116. File.WriteAllText(EditorRootDir + "\\resource_info.csv", logs.ToString(), CUtils.UTF8);
  1117. //复制资源//
  1118. if (output_dir != null && output_dir.Exists)
  1119. {
  1120. CFiles.DirectoryCopy(DataDir, output_dir.FullName + "\\data", true, CopyResFilter, copy_progress);
  1121. CFiles.DirectoryCopy(ResDir, output_dir.FullName + "\\res", true, CopyResFilter, copy_progress);
  1122. }
  1123. }
  1124. private void CopyResFilter(FileInfo src, out bool ignore)
  1125. {
  1126. ignore = ignores.Contains(src.FullName);
  1127. if (!ignore)
  1128. {
  1129. base.Text = string.Format("复制资源 : " + src);
  1130. }
  1131. }
  1132. public override void Done()
  1133. {
  1134. MessageBox.Show(
  1135. "资源检测结束!" +
  1136. "\n * 已使用文件:" + used_count +
  1137. "\n * 未使用文件:" + unused_count +
  1138. "\n * 缺失文件数:" + miss_count +
  1139. "\n报告已存入:" + EditorRootDir + "\\resource_info.csv"
  1140. );
  1141. }
  1142. private void MarkInResources(object data)
  1143. {
  1144. HashMap<string, FieldAttributeValue> reses = templates.SelectTemplatesAsMap(data);
  1145. foreach (KeyValuePair<string, FieldAttributeValue> res in reses)
  1146. {
  1147. if (!string.IsNullOrWhiteSpace(res.Key))
  1148. {
  1149. FileInfo file = new FileInfo((Editor.EditorRootDir + "\\" + res.Key).Trim());
  1150. AtomicInteger usecount;
  1151. if (file_list.TryGetValue(file.FullName, out usecount))
  1152. {
  1153. usecount.IncrementAndGet();
  1154. }
  1155. else
  1156. {
  1157. miss_count++;
  1158. logs.AppendLine(string.Format("缺失文件:,{0} ,对象:{1}, 类型:{2},字段:{3}", res.Key, data, data.GetType(), res.Value.Field.Name));
  1159. }
  1160. }
  1161. }
  1162. }
  1163. }
  1164. #endregion
  1165. //------------------------------------------------------------------------------
  1166. #region _Editor_Delegate_And_Events_
  1167. //------------------------------------------------------------------------------
  1168. private void Editor_Load(object sender, EventArgs e)
  1169. {
  1170. try
  1171. {
  1172. this.Text = "GameEditor : " + EditorRootDir;
  1173. loadCFG();
  1174. InitAllResNode();
  1175. InitAllTempaltes();
  1176. if (autoSave)
  1177. {
  1178. saveAll();
  1179. SaveEditorStatus();
  1180. Dispose(true);
  1181. }
  1182. // CommonSecure.ConnectWS.Run(this);
  1183. }
  1184. catch (Exception err)
  1185. {
  1186. MessageBox.Show(err.Message);
  1187. }
  1188. }
  1189. private void Editor_FormClosing(object sender, FormClosingEventArgs e)
  1190. {
  1191. if (MessageBox.Show(this,
  1192. "确认关闭?",
  1193. "确认关闭?",
  1194. MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
  1195. {
  1196. this.SaveEditorStatus();
  1197. }
  1198. else
  1199. {
  1200. e.Cancel = true;
  1201. }
  1202. }
  1203. private void btn_saveAll_Click(object sender, EventArgs e)
  1204. {
  1205. saveAll();
  1206. }
  1207. private void btn_saveALLCheck_Click(object sender, EventArgs e)
  1208. {
  1209. saveAll(true);
  1210. }
  1211. private void sceneBtn_DoubleClickNode(object sender, TreeNodeMouseClickEventArgs e)
  1212. {
  1213. OpenScene(scenes.GetSelectedNode(), new Win32ScenePlugin());
  1214. }
  1215. private void sceneBtn_OpenNodeWin32_Click(object sender, EventArgs e)
  1216. {
  1217. OpenScene(scenes.GetSelectedNode(), new Win32ScenePlugin());
  1218. }
  1219. private void sceneBtn_OpenNode_Click(object sender, EventArgs e)
  1220. {
  1221. OpenScene(scenes.GetSelectedNode(), EditorPlugin.CurrentPlugin.CreateScenePlugin(EditorPlugin.DefaultPlugin));
  1222. }
  1223. private void sceneBtn_TestAstar_Click(object sender, EventArgs e)
  1224. {
  1225. var sd = scenes.GetSelectedData();
  1226. if (sd != null)
  1227. {
  1228. new GameEditorPlugin.Tools.FormAstar(DataDir_scenes, Editor.Instance.TerrainDefinition, sd).Show();
  1229. }
  1230. }
  1231. private void btn_CopyText_Click(object sender, EventArgs e)
  1232. {
  1233. object node = GetSelectedObject();
  1234. if (node is ITemplateData)
  1235. {
  1236. Clipboard.SetText((node as ITemplateData).TemplateID.ToString());
  1237. }
  1238. }
  1239. private void sceneBtn_RunEMU_Click(object sender, EventArgs e)
  1240. {
  1241. SceneData data = scenes.GetSelectedData();
  1242. if (data != null)
  1243. {
  1244. IGameEditorPlugin plugin = EditorPlugin.CurrentPlugin;
  1245. plugin.RunLocalPlay(EditorPlugin.DefaultPlugin, new DirectoryInfo(DataDir), data.ID, false);
  1246. }
  1247. }
  1248. private void sceneBtn_RunEMUServer_Click(object sender, EventArgs e)
  1249. {
  1250. SceneData data = scenes.GetSelectedData();
  1251. if (data != null)
  1252. {
  1253. IGameEditorPlugin plugin = EditorPlugin.CurrentPlugin;
  1254. plugin.RunServerPlay(EditorPlugin.DefaultPlugin, new DirectoryInfo(DataDir), data.ID);
  1255. }
  1256. }
  1257. private void sceneBtn_RunREC_Click(object sender, EventArgs e)
  1258. {
  1259. SceneData data = scenes.GetSelectedData();
  1260. if (data != null)
  1261. {
  1262. IGameEditorPlugin plugin = EditorPlugin.CurrentPlugin;
  1263. plugin.RunLocalPlay(EditorPlugin.DefaultPlugin, new DirectoryInfo(DataDir), data.ID, true);
  1264. }
  1265. }
  1266. private void sceneBtn_LoadREC_Click(object sender, EventArgs e)
  1267. {
  1268. LoadBattleRecord();
  1269. }
  1270. private void sceneBtn_RunGAME_Click(object sender, EventArgs e)
  1271. {
  1272. SceneData data = scenes.GetSelectedData();
  1273. if (data != null)
  1274. {
  1275. try
  1276. {
  1277. IGameEditorPlugin plugin = EditorPlugin.CurrentPlugin;
  1278. plugin.RunTest(EditorPlugin.DefaultPlugin, DataDir, data.ID, GetTestActorTemplateID(data, 0));
  1279. }
  1280. catch (Exception err)
  1281. {
  1282. MessageBox.Show(err.Message);
  1283. }
  1284. }
  1285. }
  1286. private void btn_SetTemplateConfig_Click(object sender, EventArgs e)
  1287. {
  1288. G2DFieldEditor editor = new G2DFieldEditor(this.CFG.GetType(), this.CFG, false);
  1289. if (editor.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
  1290. {
  1291. if (editor.EditObject != null)
  1292. {
  1293. this.CFG = (Config)editor.EditObject;
  1294. saveCFG(this.CFG, this.SaveCfgFile);
  1295. }
  1296. }
  1297. }
  1298. private void btn_DefineTerrain_Click(object sender, EventArgs e)
  1299. {
  1300. ShowTerrainDefinitionDialog(this);
  1301. }
  1302. private void btn_DefineUnitAction_Click(object sender, EventArgs e)
  1303. {
  1304. ShowUnitActionDefinitionDialog(this);
  1305. }
  1306. private void btn_SetTemplateExtConfig_Click(object sender, EventArgs e)
  1307. {
  1308. G2DFieldEditor editor = new G2DFieldEditor(this.ExtCFG.GetType(), this.ExtCFG, false);
  1309. if (editor.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
  1310. {
  1311. if (editor.EditObject != null)
  1312. {
  1313. this.ExtCFG = (ICommonConfig)editor.EditObject;
  1314. saveCFG(this.ExtCFG, this.SaveCfgExtFile);
  1315. }
  1316. }
  1317. }
  1318. private void btn_ScriptEdit_Click(object sender, EventArgs e)
  1319. {
  1320. }
  1321. private void btn_LoadLanguageCsv_Click(object sender, EventArgs e)
  1322. {
  1323. OpenFileDialog ofd = new OpenFileDialog();
  1324. ofd.InitialDirectory = EditorRootDir;
  1325. ofd.Filter = "CSV语言配置(*.csv)|*.csv|文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
  1326. if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  1327. {
  1328. try
  1329. {
  1330. LoadLanguageTask task = new LoadLanguageTask(ofd.FileName, this);
  1331. new G2DProgressDialog(task).ShowDialog(this);
  1332. }
  1333. catch (Exception err)
  1334. {
  1335. MessageBox.Show(err.Message);
  1336. }
  1337. }
  1338. }
  1339. private void btn_PlayBattleRecord_Click(object sender, EventArgs e)
  1340. {
  1341. LoadBattleRecord();
  1342. }
  1343. private void openUnitEvent_Click(object sender, EventArgs e)
  1344. {
  1345. UnitEventTemplate temp = unit_events.GetSelectedData();
  1346. if (temp != null)
  1347. {
  1348. CommonAIEditor.Unit.UnitEventEditor eventEditor = new CommonAIEditor.Unit.UnitEventEditor(unit_events, temp);
  1349. eventEditor.FormClosed += new FormClosedEventHandler(
  1350. (object sender2, FormClosedEventArgs e2) =>
  1351. {
  1352. eventEditor.Save();
  1353. eventEditor = null;
  1354. }
  1355. );
  1356. eventEditor.Show();
  1357. }
  1358. }
  1359. //-----------------------------------------------------------------------------------------------------------
  1360. #endregion // Events //
  1361. //-----------------------------------------------------------------------------------------------------------
  1362. private void OpenScene(G2DTreeNode<SceneData> node, ISceneEditorPlugin plugin = null)
  1363. {
  1364. if (plugin == null)
  1365. {
  1366. plugin = EditorPlugin.CurrentPlugin.CreateScenePlugin(EditorPlugin.DefaultPlugin);
  1367. }
  1368. if (node != null)
  1369. {
  1370. SceneEditor editor = new SceneEditor(scenes, node, plugin);
  1371. editor.OnSaved += this.sceneEditor_onSavedScene;
  1372. editor.Show();
  1373. }
  1374. }
  1375. private void LoadBattleRecord()
  1376. {
  1377. OpenFileDialog ofd = new OpenFileDialog();
  1378. ofd.InitialDirectory = EditorRootDir;
  1379. ofd.Filter = "REC战报文件(*.rec)|*.rec|所有文件(*.*)|*.*";
  1380. if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  1381. {
  1382. try
  1383. {
  1384. FileStream fis = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read);
  1385. FormRuntimeGameReplay view = new FormRuntimeGameReplay();
  1386. view.StartPlay(DataDir, fis);
  1387. view.Show();
  1388. }
  1389. catch (Exception err)
  1390. {
  1391. MessageBox.Show(err.Message);
  1392. }
  1393. }
  1394. }
  1395. private void btn_exportAll_Click(object sender, EventArgs e)
  1396. {
  1397. Process p = Process.Start("ResBuilder.exe");
  1398. p.WaitForExit();
  1399. string sPath = null;
  1400. string tmpCfg = "./lastSave.cfg";
  1401. if (File.Exists(tmpCfg))
  1402. {
  1403. try
  1404. {
  1405. FileStream fs = new FileStream(tmpCfg, FileMode.Open, FileAccess.Read);
  1406. byte[] bytes = new byte[256];
  1407. int len = fs.Read(bytes, 0, bytes.Length - 1);
  1408. if (len > 0)
  1409. {
  1410. sPath = System.Text.Encoding.UTF8.GetString(bytes, 0, len);
  1411. if (!Directory.Exists(sPath))
  1412. {
  1413. sPath = null;
  1414. }
  1415. }
  1416. fs.Close();
  1417. }
  1418. catch (Exception) { }
  1419. }
  1420. if (sPath == null)
  1421. {
  1422. FolderBrowserDialog folder = new FolderBrowserDialog();
  1423. folder.Description = "选择文件所在文件夹目录"; //定义在对话框上显示的文本
  1424. if (folder.ShowDialog() == DialogResult.OK)
  1425. {
  1426. sPath = folder.SelectedPath;
  1427. try
  1428. {
  1429. FileStream fs = new FileStream(tmpCfg, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  1430. byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sPath);
  1431. fs.Write(bytes, 0, bytes.Length);
  1432. fs.Close();
  1433. }
  1434. catch (Exception) { }
  1435. }
  1436. else
  1437. {
  1438. return;
  1439. }
  1440. }
  1441. File.Copy("./resBuilder/out/bin/e1.bin", Path.Combine(sPath, "e1.bin"), true);
  1442. File.Copy("./resBuilder/out/bin/ex.bin", Path.Combine(sPath, "ex.bin"), true);
  1443. }
  1444. }
  1445. }