1 /**
2 * Scourge Data Editor
3 */
4
5 #include <stdio.h>
6 #include <wx/wx.h>
7 #include <wx/glcanvas.h>
8 #include <map>
9 #include "dfbooks.h"
10 #include "dfmissions.h"
11 #include "dfgui.h"
12 #include "dfskills.h"
13 #include "dfspells.h"
14 #include "dfcreatures.h"
15 #include "dflocations.h"
16 #include "dfrpg.h"
17 #include "pagebooks.h"
18 #include "pagemissions.h"
19 #include "pagegui.h"
20 #include "pageskills.h"
21 #include "pagespells.h"
22 #include "subpagespells.h"
23 #include "subpageschools.h"
24 #include "pagecreatures.h"
25 #include "pagelocations.h"
26 #include "pagerpg.h"
27 #include "common.h"
28 #include "../common/constants.h"
29
30 std::map <std::string,DF*> g_DFList;
31
32 std::map <std::string,Page*> g_PageList;
33 wxStaticText *g_pageNumText;
34 Page *g_currentPage;
35
36 class MyApp : public wxApp
37 {
~MyApp()38 ~MyApp()
39 {
40 for ( std::map<std::string,DF*>::iterator itr = g_DFList.begin(); itr != g_DFList.end(); itr++ )
41 {
42 delete itr->second;
43 }
44
45 for ( std::map<std::string,Page*>::iterator itr = g_PageList.begin(); itr != g_PageList.end(); itr++ )
46 {
47 delete itr->second;
48 }
49 }
50 virtual bool OnInit();
51 virtual bool Initialize(int& argc, wxChar **argv);
52 };
53
54 IMPLEMENT_APP(MyApp)
55
56
57 class MyFrame : public wxFrame
58 {
59 public:
60 wxNotebookPage *currentPage;
61 wxNotebook *notebook;
62
63 public:
64 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
65 void OnQuit(wxCommandEvent& event);
66 void OnSave(wxCommandEvent& event);
67 void OnSaveCurrent(wxCommandEvent& event);
68 void OnAbout(wxCommandEvent& event);
69 void OnPageHelp(wxCommandEvent& event);
70 void OnPrev(wxCommandEvent& event);
71 void OnPrevFast(wxCommandEvent& event);
72 void OnNext(wxCommandEvent& event);
73 void OnNextFast(wxCommandEvent& event);
74 void OnNew(wxCommandEvent& event);
75 void OnDel(wxCommandEvent& event);
76 void OnJumpTo(wxCommandEvent& event);
77 void OnButton(wxCommandEvent& event);
78
79 void OnPageChange(wxCommandEvent& event);
80
81 void SaveCurrent();
82 void LoadCurrent();
83
84 };
85
Initialize(int & argc,wxChar ** argv)86 bool MyApp::Initialize( int& argc, wxChar **argv ) {
87 // initialize scourge rootDir
88 int err = Constants::initRootDir( static_cast<int>(argc), (char**)argv );
89 if( err ) return false;
90
91 // continue initializing our app
92 wxApp::Initialize( argc, argv );
93 return true;
94 }
95
OnInit()96 bool MyApp::OnInit()
97 {
98 DFBooks *dfBooks = new DFBooks;
99 dfBooks->Load( GetDataPath("%s/world/books.txt"), "B");
100
101 DFMissions *dfMissions = new DFMissions;
102 dfMissions->Load( GetDataPath("%s/world/missions.txt"), "MT");
103
104 DFGui *dfGui = new DFGui;
105 dfGui->Load( GetDataPath("%s/world/gui.txt"), "T");
106
107 DFSkills *dfSkills = new DFSkills;
108 dfSkills->Load( GetDataPath("%s/world/skills.txt"), "S");
109
110 DFSpells *dfSpells = new DFSpells;
111 dfSpells->Load( GetDataPath("%s/world/spells.txt"), "S");
112
113 DFCreatures *dfCreatures = new DFCreatures;
114 dfCreatures->Load( GetDataPath("%s/world/creatures.txt"), "M");
115
116 DFLocations *dfLocations = new DFLocations;
117 dfLocations->Load( GetDataPath("%s/world/locations.txt"), "L");
118
119 DFRpg *dfRpg = new DFRpg;
120 dfRpg->Load( GetDataPath("%s/world/rpg.txt"), "GTF");
121
122
123 g_DFList["Books"] = dfBooks;
124 g_DFList["Missions"] = dfMissions;
125 g_DFList["GUI"] = dfGui;
126 g_DFList["Skills"] = dfSkills;
127 g_DFList["Spells"] = dfSpells;
128 g_DFList["Creatures"] = dfCreatures;
129 g_DFList["Locations"] = dfLocations;
130 g_DFList["RPG"] = dfRpg;
131
132 g_PageList["Books"] = new PageBooks;
133 g_PageList["Missions"] = new PageMissions;
134 g_PageList["GUI"] = new PageGui;
135 g_PageList["Skills"] = new PageSkills;
136 g_PageList["Spells"] = new PageSpells;
137 g_PageList["Creatures"] = new PageCreatures;
138 g_PageList["Locations"] = new PageLocations;
139 g_PageList["RPG"] = new PageRpg;
140
141 MyFrame *frame = new MyFrame(_("Scourge Data Editor"), wxPoint(50,50),
142 wxSize(840,480));
143
144 frame->Connect( ID_MenuQuit, wxEVT_COMMAND_MENU_SELECTED,
145 (wxObjectEventFunction) &MyFrame::OnQuit );
146 frame->Connect( ID_MenuSave, wxEVT_COMMAND_MENU_SELECTED,
147 (wxObjectEventFunction) &MyFrame::OnSave );
148 frame->Connect( ID_MenuSaveCurrent, wxEVT_COMMAND_MENU_SELECTED,
149 (wxObjectEventFunction) &MyFrame::OnSaveCurrent );
150 frame->Connect( ID_MenuAbout, wxEVT_COMMAND_MENU_SELECTED,
151 (wxObjectEventFunction) &MyFrame::OnAbout );
152 frame->Connect( ID_MenuPageHelp, wxEVT_COMMAND_MENU_SELECTED,
153 (wxObjectEventFunction) &MyFrame::OnPageHelp );
154
155 frame->Connect( ID_Prev, wxEVT_COMMAND_TOOL_CLICKED,
156 (wxObjectEventFunction) &MyFrame::OnPrev );
157 frame->Connect( ID_PrevFast, wxEVT_COMMAND_TOOL_CLICKED,
158 (wxObjectEventFunction) &MyFrame::OnPrevFast );
159 frame->Connect( ID_Next, wxEVT_COMMAND_TOOL_CLICKED,
160 (wxObjectEventFunction) &MyFrame::OnNext );
161 frame->Connect( ID_NextFast, wxEVT_COMMAND_TOOL_CLICKED,
162 (wxObjectEventFunction) &MyFrame::OnNextFast );
163 frame->Connect( ID_New, wxEVT_COMMAND_TOOL_CLICKED,
164 (wxObjectEventFunction) &MyFrame::OnNew );
165 frame->Connect( ID_Del, wxEVT_COMMAND_TOOL_CLICKED,
166 (wxObjectEventFunction) &MyFrame::OnDel );
167 frame->Connect( ID_JumpTo, wxEVT_COMMAND_TOOL_CLICKED,
168 (wxObjectEventFunction) &MyFrame::OnJumpTo );
169 frame->Connect( wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED,
170 (wxObjectEventFunction) &MyFrame::OnQuit );
171
172 frame->Connect( ID_Notebook, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
173 (wxObjectEventFunction) &MyFrame::OnPageChange );
174
175 // Missions page events
176 frame->Connect( ID_MissionStorylineCombo, wxEVT_COMMAND_COMBOBOX_SELECTED,
177 (wxObjectEventFunction) &PageMissions::OnStorylineChange );
178
179 // Gui page events
180 frame->Connect( ID_GuiElementList, wxEVT_COMMAND_LISTBOX_SELECTED,
181 (wxObjectEventFunction) &PageGui::OnElementChange );
182 frame->Connect( ID_GuiColorList, wxEVT_COMMAND_LISTBOX_SELECTED,
183 (wxObjectEventFunction) &PageGui::OnColorChange );
184 frame->Connect( ID_GuiLineWidthScroll, wxEVT_SCROLL_THUMBTRACK,
185 (wxObjectEventFunction) &PageGui::OnLineWidthChange );
186
187 // Skills page events
188 frame->Connect( ID_SkillsTypeCombo, wxEVT_COMMAND_COMBOBOX_SELECTED,
189 (wxObjectEventFunction) &PageSkills::OnTypeChange );
190
191 // Spells page events
192 frame->Connect( ID_subSpellsSchoolList, wxEVT_COMMAND_LISTBOX_SELECTED,
193 (wxObjectEventFunction) &subPageSpells::OnSchoolChange );
194 frame->Connect( ID_subSpellsIconXScroll, wxEVT_SCROLL_THUMBTRACK,
195 (wxObjectEventFunction) &subPageSpells::OnIconXChange );
196 frame->Connect( ID_subSpellsIconYScroll, wxEVT_SCROLL_THUMBTRACK,
197 (wxObjectEventFunction) &subPageSpells::OnIconYChange );
198
199 frame->Show(TRUE);
200 SetTopWindow(frame);
201
202 return TRUE;
203 }
204
MyFrame(const wxString & title,const wxPoint & pos,const wxSize & size)205 MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
206 : wxFrame((wxFrame*)NULL,-1,title,pos,size)
207 {
208 // Create menubar
209 wxMenuBar *menuBar = new wxMenuBar;
210 // Create menus
211 wxMenu *menuFile = new wxMenu;
212 wxMenu *menuHelp = new wxMenu;
213 // Append menu entries
214 menuFile->Append(ID_MenuSave,_("&Save All"));
215 menuFile->Append(ID_MenuSaveCurrent,L"Save &Current");
216 menuFile->AppendSeparator();
217 menuFile->Append(ID_MenuQuit,_("E&xit"));
218 menuHelp->Append(ID_MenuAbout,_("&About"));
219 menuHelp->Append(ID_MenuPageHelp, L"&Page Help");
220 // Append menus to menubar
221 menuBar->Append(menuFile,_("&File"));
222 menuBar->Append(menuHelp,_("&Help"));
223 // Set frame menubar
224 SetMenuBar(menuBar);
225
226 /* TOOLBAR */
227 wxToolBar *toolbar = this->CreateToolBar();
228 wxBitmap bitmap(std2wx(GetDataPath("%s/tools/prevfast.xpm")), wxBITMAP_TYPE_XPM);
229 toolbar->AddTool(ID_PrevFast, L"prevfast", bitmap, wxNullBitmap,wxITEM_NORMAL, L"Back", L"Go back ten data items.");
230 bitmap.LoadFile(std2wx(GetDataPath("%s/tools/prev.xpm")), wxBITMAP_TYPE_XPM);
231 toolbar->AddTool(ID_Prev, L"prev", bitmap, wxNullBitmap,wxITEM_NORMAL, L"Previous", L"Go to previous data item.");
232
233 char buffer[64];
234 sprintf(buffer, "Page %i/%i", g_DFList["Books"]->GetCurrentNum(), g_DFList["Books"]->GetTotal());
235 g_pageNumText = new wxStaticText(toolbar, ID_PageNum, std2wx(buffer));
236 toolbar->AddControl(g_pageNumText);
237
238 bitmap.LoadFile(std2wx(GetDataPath("%s/tools/next.xpm")), wxBITMAP_TYPE_XPM);
239 toolbar->AddTool(ID_Next,L"next", bitmap, wxNullBitmap,wxITEM_NORMAL, L"Next", L"Go to next data item.");
240 bitmap.LoadFile(std2wx(GetDataPath("%s/tools/nextfast.xpm")), wxBITMAP_TYPE_XPM);
241 toolbar->AddTool(ID_NextFast,L"nextfast", bitmap, wxNullBitmap,wxITEM_NORMAL, L"Forward", L"Go forward ten data items.");
242
243 bitmap.LoadFile(std2wx(GetDataPath("%s/tools/go-jump.xpm")), wxBITMAP_TYPE_XPM);
244 toolbar->AddTool(ID_JumpTo,L"jumpto", bitmap, wxNullBitmap,wxITEM_NORMAL, L"Jump To", L"Jump to specified data item.");
245 toolbar->AddSeparator();
246 bitmap.LoadFile(std2wx(GetDataPath("%s/tools/new.xpm")), wxBITMAP_TYPE_XPM);
247 toolbar->AddTool(ID_New,L"new", bitmap, wxNullBitmap,wxITEM_NORMAL, L"New", L"Create new data item.");
248 bitmap.LoadFile(std2wx(GetDataPath("%s/tools/del.xpm")), wxBITMAP_TYPE_XPM);
249 toolbar->AddTool(ID_Del,L"del", bitmap, wxNullBitmap,wxITEM_NORMAL, L"Delete", L"Delete current data item.");
250
251 toolbar->AddSeparator();
252 wxButton *button = new wxButton(toolbar, wxID_EXIT,_(""));
253 toolbar->AddControl(button);
254
255 /* Notebook */
256 notebook = new wxNotebook(this, ID_Notebook);
257
258 // Pages
259 g_PageList["Books"]->Init(notebook,g_DFList["Books"]);
260 g_PageList["Missions"]->Init(notebook,g_DFList["Missions"]);
261 g_PageList["GUI"]->Init(notebook,g_DFList["GUI"]);
262 g_PageList["Skills"]->Init(notebook,g_DFList["Skills"]);
263 g_PageList["Spells"]->Init(notebook,g_DFList["Spells"]);
264 g_PageList["Creatures"]->Init(notebook,g_DFList["Creatures"]);
265 g_PageList["Locations"]->Init(notebook,g_DFList["Locations"]);
266 g_PageList["RPG"]->Init(notebook,g_DFList["RPG"]);
267
268 g_currentPage = g_PageList["Books"];
269 Page::currentPage = g_currentPage;
270 currentPage = g_currentPage->GetPage();
271
272 // create frame statusbar
273 CreateStatusBar();
274 // set statusbar text
275 SetStatusText(_("Welcome to Scourge Data Editor!"));
276 }
277
OnQuit(wxCommandEvent & WXUNUSED (event))278 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
279 {
280 Close(TRUE);
281 }
282
OnSave(wxCommandEvent & WXUNUSED (event))283 void MyFrame::OnSave(wxCommandEvent& WXUNUSED(event))
284 {
285 /*
286 wxMessageDialog dialog(this, L"This will save all data files. Do you want to continue?", L"Save all data files?",
287 wxYES_NO|wxNO_DEFAULT|wxICON_EXCLAMATION);
288 for ( std::map<std::string,Page*>::iterator itr = g_PageList.begin(); itr != g_PageList.end(); itr++ )
289 itr->second->SaveAll();*/
290
291 wxMessageDialog dialog(this, L"This feature is not yet complete. Files to be saved: Books, Missions, GUI, Spells.\nDo you want to continue?",
292 L"Save data files?", wxYES_NO|wxNO_DEFAULT|wxICON_EXCLAMATION);
293 if ( dialog.ShowModal() == wxID_YES )
294 {
295 g_PageList["Books"]->SaveAll();
296 g_PageList["Missions"]->SaveAll();
297 g_PageList["GUI"]->SaveAll();
298 g_PageList["Spells"]->SaveAll();
299 }
300 }
OnSaveCurrent(wxCommandEvent & WXUNUSED (event))301 void MyFrame::OnSaveCurrent(wxCommandEvent& WXUNUSED(event))
302 {
303 wxMessageDialog dialog(this, L"This will save all records in the current data file. Do you want to continue?", L"Save current data file?",
304 wxYES_NO|wxNO_DEFAULT|wxICON_EXCLAMATION);
305 if ( dialog.ShowModal() == wxID_YES )
306 g_currentPage->SaveAll();
307 }
308
OnAbout(wxCommandEvent & WXUNUSED (event))309 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
310 {
311 wxMessageBox(_("Edit the Scourge data files."),_("About Scourge Data Editor"),
312 wxOK|wxICON_INFORMATION, this);
313 }
314
OnPageHelp(wxCommandEvent & WXUNUSED (event))315 void MyFrame::OnPageHelp(wxCommandEvent& WXUNUSED(event))
316 {
317 g_currentPage->OnPageHelp();
318 }
319
OnPrev(wxCommandEvent & WXUNUSED (event))320 void MyFrame::OnPrev(wxCommandEvent& WXUNUSED(event))
321 {
322 g_currentPage->Prev();
323 g_currentPage->UpdatePageNumber();
324 }
OnPrevFast(wxCommandEvent & WXUNUSED (event))325 void MyFrame::OnPrevFast(wxCommandEvent& WXUNUSED(event))
326 {
327 g_currentPage->Prev(10);
328 g_currentPage->UpdatePageNumber();
329 }
OnNext(wxCommandEvent & WXUNUSED (event))330 void MyFrame::OnNext(wxCommandEvent& WXUNUSED(event))
331 {
332 g_currentPage->Next();
333 g_currentPage->UpdatePageNumber();
334 }
OnNextFast(wxCommandEvent & WXUNUSED (event))335 void MyFrame::OnNextFast(wxCommandEvent& WXUNUSED(event))
336 {
337 g_currentPage->Next(10);
338 g_currentPage->UpdatePageNumber();
339 }
OnNew(wxCommandEvent & WXUNUSED (event))340 void MyFrame::OnNew(wxCommandEvent& WXUNUSED(event))
341 {
342 g_currentPage->New();
343 g_currentPage->UpdatePageNumber();
344 }
OnDel(wxCommandEvent & WXUNUSED (event))345 void MyFrame::OnDel(wxCommandEvent& WXUNUSED(event))
346 {
347 g_currentPage->Del();
348 g_currentPage->UpdatePageNumber();
349 }
OnJumpTo(wxCommandEvent & WXUNUSED (event))350 void MyFrame::OnJumpTo(wxCommandEvent& WXUNUSED(event))
351 {
352 wxString str;
353 long n;
354
355 GetTextDialog(L"Enter data item to jump to.",L"Jump To",str);
356 if ( !str.ToLong(&n) )
357 return;
358
359 g_currentPage->JumpTo(n);
360 g_currentPage->UpdatePageNumber();
361 }
362
OnPageChange(wxCommandEvent & WXUNUSED (event))363 void MyFrame::OnPageChange(wxCommandEvent& WXUNUSED(event))
364 {
365 currentPage = notebook->GetCurrentPage();
366 wxString str = notebook->GetPageText( notebook->GetSelection() );
367 g_currentPage = g_PageList[ wx2std(str) ]->SetAsCurrent();
368
369 g_currentPage->UpdatePageNumber();
370 }
371