1 #include "pagecreatures.h"
2 #include "dfcreatures.h"
3 #include <wx/wx.h>
4 #include <wx/listbook.h>
5 #include <wx/spinctrl.h>
6 #include "listadddel.h"
7 #include "common.h"
8 
PageCreatures()9 PageCreatures::PageCreatures()
10 {
11 	//ctor
12 	pageHelp = "If you want an npc to have a random start point (as in most cases) set NPC Start to (-1,-1)";
13 	invList = new ListAddDel;
14 	spellList = new ListAddDel;
15 }
16 
~PageCreatures()17 PageCreatures::~PageCreatures()
18 {
19 	//dtor
20 	delete invList;
21 	delete spellList;
22 }
23 
Init(wxNotebook * notebook,DF * dataFile)24 void PageCreatures::Init(wxNotebook *notebook, DF *dataFile)
25 {
26 	dfCreatures = (DFCreatures*)dataFile;
27 	this->dataFile = dataFile;
28 	page = new wxNotebookPage(notebook, ID_CreaturesPage);
29 
30 	Creature *creature = dfCreatures->GetCurrent();
31 
32 	// name
33 	new wxStaticText(page, -1, _("Name"), wxPoint(10,10));
34 	nameEdit = new wxTextCtrl(page, -1, std2wx(creature->name), wxPoint(10,30), wxSize(200,25));
35 
36 	// portrait
37 	new wxStaticText(page, -1, _("Portrait"), wxPoint(220,10));
38 	portraitEdit = new wxTextCtrl(page, -1, std2wx(creature->portrait), wxPoint(220,30), wxSize(200,25));
39 
40 	// md2
41 	new wxStaticText(page, -1, _("MD2 Dir"), wxPoint(430,10));
42 	md2Edit = new wxTextCtrl(page, -1, std2wx(creature->md2), wxPoint(430,30), wxSize(200,25));
43 
44 	// skin
45 	new wxStaticText(page, -1, _("Skin"), wxPoint(640,10));
46 	skinEdit = new wxTextCtrl(page, -1, std2wx(creature->skin), wxPoint(640,30), wxSize(150,25));
47 
48 	// level
49 	new wxStaticText(page, -1, _("Level"), wxPoint(10,70));
50 	levelSpin = new wxSpinCtrl(page, -1, L"", wxPoint(10,90),wxSize(45,-1), wxSP_ARROW_KEYS, 1,100, atoi(creature->level.c_str()));
51 
52 	// hp
53 	new wxStaticText(page, -1, _("HP"), wxPoint(70,70));
54 	hpSpin = new wxSpinCtrl(page, -1, L"", wxPoint(70,90),wxSize(45,-1), wxSP_ARROW_KEYS, 1,100, atoi(creature->hp.c_str()));
55 
56 	// mp
57 	new wxStaticText(page, -1, _("MP"), wxPoint(130,70));
58 	mpSpin = new wxSpinCtrl(page, -1, L"", wxPoint(130,90),wxSize(45,-1), wxSP_ARROW_KEYS, 1,100, atoi(creature->mp.c_str()));
59 
60 	// armor
61 	new wxStaticText(page, -1, _("Armor"), wxPoint(190,70));
62 	armorSpin = new wxSpinCtrl(page, -1, L"", wxPoint(190,90),wxSize(45,-1), wxSP_ARROW_KEYS, 1,100, atoi(creature->armor.c_str()));
63 
64 	// rareness
65 	new wxStaticText(page, -1, _("Rareness"), wxPoint(250,70));
66 	rarenessSpin = new wxSpinCtrl(page, -1, L"", wxPoint(250,90),wxSize(45,-1), wxSP_ARROW_KEYS, 1,10, atoi(creature->rareness.c_str()));
67 
68 	// speed
69 	new wxStaticText(page, -1, _("Speed"), wxPoint(310,70));
70 	speedSpin = new wxSpinCtrl(page, -1, L"", wxPoint(310,90),wxSize(45,-1), wxSP_ARROW_KEYS, 1,10, atoi(creature->speed.c_str()));
71 
72 	// scale
73 	new wxStaticText(page, -1, _("Scale"), wxPoint(370,70));
74 	scaleEdit = new wxTextCtrl(page, -1, std2wx(creature->scale), wxPoint(370,90), wxSize(50,25));
75 
76 	// npc
77 	new wxStaticText(page, -1, _("NPC"), wxPoint(430,70));
78 	npcEdit = new wxTextCtrl(page, -1, std2wx(creature->npc), wxPoint(430,90), wxSize(50,25));
79 
80 	// npcStartX
81 	new wxStaticText(page, -1, _("NPC Start (X,Y)"), wxPoint(495,70));
82 	npcStartXSpin = new wxSpinCtrl(page, -1, L"", wxPoint(500,90),wxSize(45,-1), wxSP_ARROW_KEYS, -1,500, atoi(creature->npcStartX.c_str()));
83 	npcStartYSpin = new wxSpinCtrl(page, -1, L"", wxPoint(550,90),wxSize(45,-1), wxSP_ARROW_KEYS, -1,500, atoi(creature->npcStartY.c_str()));
84 
85 	// backpack
86 	invList->Init(page, L"Backpack", creature->backpack, 10,120, 150);
87 	// spells
88 	spellList->Init(page, L"Spells", creature->spells, 170,120, 170);
89 
90 	// skills
91 	skillList = new wxListView(page, -1, wxPoint(350,140),wxSize(250,100), wxLC_REPORT|wxLC_EDIT_LABELS);
92 		skillList->InsertColumn(0,L"Skill");
93 		skillList->InsertColumn(1,L"");
94 
95 	std::map<std::string,std::string>::iterator itr = creature->skills.begin();
96 	for ( int i = 0; itr != creature->skills.end(); itr++, i++ )
97 	{
98 		skillList->InsertItem(i,L"");
99 		skillList->SetItem(i,0, std2wx(itr->first));
100 		skillList->SetItem(i,1, std2wx(itr->second));
101 	}
102 	skillList->SetColumnWidth(0,-1);
103 	skillList->SetColumnWidth(1,-1);
104 
105 	wxButton *addSkill = new wxButton(page, -1, L"Add/Edit", wxPoint(350,245), wxSize(70,-1));
106 	addSkill->Connect( wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&PageCreatures::OnAddSkill, NULL, (wxEvtHandler*)this);
107 	wxButton *delSkill = new wxButton(page, -1, L"Del", wxPoint(425,245), wxSize(50,-1));
108 	delSkill->Connect( wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&PageCreatures::OnDelSkill, NULL, (wxEvtHandler*)this);
109 
110 	notebook->AddPage(page, _("Creatures"));
111 }
112 
UpdatePage()113 void PageCreatures::UpdatePage()
114 {
115 }
116 
GetCurrent()117 void PageCreatures::GetCurrent()
118 {
119 	Creature *creature = dfCreatures->GetCurrent();
120 
121 	nameEdit->SetValue(std2wx(creature->name));
122 	portraitEdit->SetValue(std2wx(creature->portrait));
123 	md2Edit->SetValue(std2wx(creature->md2));
124 	skinEdit->SetValue(std2wx(creature->skin));
125 	levelSpin->SetValue( atoi(creature->level.c_str()) );
126 	hpSpin->SetValue( atoi(creature->hp.c_str()) );
127 	mpSpin->SetValue( atoi(creature->mp.c_str()) );
128 	armorSpin->SetValue( atoi(creature->armor.c_str()) );
129 	rarenessSpin->SetValue( atoi(creature->rareness.c_str()) );
130 	speedSpin->SetValue( atoi(creature->speed.c_str()) );
131 	scaleEdit->SetValue(std2wx(creature->scale));
132 	npcEdit->SetValue(std2wx(creature->npc));
133 	npcStartXSpin->SetValue( atoi(creature->npcStartX.c_str()) );
134 	npcStartYSpin->SetValue( atoi(creature->npcStartY.c_str()) );
135 
136 	invList->Get( creature->backpack );
137 	spellList->Get( creature->spells );
138 
139 	skillList->DeleteAllItems();
140 	std::map<std::string,std::string>::iterator itr = creature->skills.begin();
141 	for ( int i = 0; itr != creature->skills.end(); itr++, i++ )
142 	{
143 		skillList->InsertItem(i,L"");
144 		skillList->SetItem(i,0, std2wx(itr->first));
145 		skillList->SetItem(i,1, std2wx(itr->second));
146 	}
147 }
SetCurrent()148 void PageCreatures::SetCurrent()
149 {
150 	Creature *creature = dfCreatures->GetCurrent();
151 	char buffer[16];
152 
153 	creature->name = wx2std( nameEdit->GetValue() );
154 	creature->portrait = wx2std( portraitEdit->GetValue() );
155 	creature->md2 = wx2std( md2Edit->GetValue() );
156 	creature->skin = wx2std( skinEdit->GetValue() );
157 
158 	sprintf(buffer, "%i", levelSpin->GetValue());
159 	creature->level = buffer;
160 	sprintf(buffer, "%i", hpSpin->GetValue());
161 	creature->hp = buffer;
162 	sprintf(buffer, "%i", mpSpin->GetValue());
163 	creature->mp = buffer;
164 	sprintf(buffer, "%i", armorSpin->GetValue());
165 	creature->armor = buffer;
166 	sprintf(buffer, "%i", rarenessSpin->GetValue());
167 	creature->rareness = buffer;
168 	sprintf(buffer, "%i", speedSpin->GetValue());
169 	creature->speed = buffer;
170 
171 	creature->scale = wx2std( scaleEdit->GetValue() );
172 	creature->npc = wx2std( npcEdit->GetValue() );
173 
174 	sprintf(buffer, "%i", npcStartXSpin->GetValue());
175 	creature->npcStartX = buffer;
176 	sprintf(buffer, "%i", npcStartYSpin->GetValue());
177 	creature->npcStartY = buffer;
178 
179 	invList->Set( creature->backpack );
180 	spellList->Set( creature->spells );
181 
182 	creature->skills.clear();
183 	wxListItem l;
184 	for ( int i = 0; i < skillList->GetItemCount(); i++ )
185 	{
186 		l.SetId(i);
187 
188 		l.SetColumn(0);
189 		skillList->GetItem(l);
190 		std::string str = wx2std( l.GetText() );
191 
192 		l.SetColumn(1);
193 		skillList->GetItem(l);
194 		creature->skills[ str ] = wx2std( l.GetText() );
195 	}
196 }
ClearCurrent()197 void PageCreatures::ClearCurrent()
198 {
199 	Creature *creature = dfCreatures->GetCurrent();
200 
201 	creature->name = "";
202 	creature->portrait = "";
203 	creature->md2 = "";
204 	creature->skin = "";
205 	creature->level = "";
206 	creature->hp = "";
207 	creature->mp = "";
208 	creature->armor = "";
209 	creature->rareness = "";
210 	creature->speed = "";
211 	creature->scale = "";
212 	creature->npc = "";
213 	creature->npcStartX = "";
214 	creature->npcStartY = "";
215 
216 	creature->backpack.clear();
217 	creature->spells.clear();
218 	creature->skills.clear();
219 }
220 
221 class CreatureSkillEntryDialog : public wxTextEntryDialog
222 {
223 public:
CreatureSkillEntryDialog(wxListView * skillList)224 	CreatureSkillEntryDialog(wxListView *skillList) : wxTextEntryDialog(0,L"Enter skill",L"Skill Entry")
225 	{
226 		skillSpin = new wxSpinCtrl(this, -1, L"", wxPoint(235,10),wxSize(45,-1), wxSP_ARROW_KEYS, 1,100,1);
227 
228 		wxString skill;
229 		if ( skillList->GetSelectedItemCount() == 1 )
230 			skill = skillList->GetItemText ( skillList->GetFirstSelected() );
231 		this->SetValue(skill);
232 
233 		if ( wxTextEntryDialog::ShowModal() == wxID_CANCEL )
234 			return;
235 
236 
237 		skill = wxTextEntryDialog::GetValue();
238 		if ( skill == L"" )
239 			return;
240 
241 		char buffer[16];
242 		sprintf( buffer, "%i", skillSpin->GetValue() );
243 
244 		long itemPos = skillList->FindItem(-1, skill);
245 		if ( itemPos == -1)
246 		{
247 			itemPos = skillList->InsertItem( skillList->GetItemCount(), skill );
248 			skillList->SetItem( itemPos, 1, std2wx(buffer));
249 		}
250 		else
251 			skillList->SetItem( itemPos, 1, std2wx(buffer));
252 	}
253 protected:
254 	wxSpinCtrl *skillSpin;
255 };
OnAddSkill()256 void PageCreatures::OnAddSkill()
257 {
258 	CreatureSkillEntryDialog skillDialog( skillList );
259 }
OnDelSkill()260 void PageCreatures::OnDelSkill()
261 {
262 	long selected = skillList->GetFirstSelected();
263 
264 	while ( selected != -1 )
265 	{
266 		skillList->DeleteItem( selected );
267 
268 		selected = skillList->GetFirstSelected();
269 	}
270 }
271