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