OSDN Git Service

イニシャルコミット。
[marathon/ShapeFusion.git] / Physics / PhysicsView.cpp
1 /*
2  * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
3  *
4  * ShapeFusion is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * ShapeFusion is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with ShapeFusion; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 */
18
19 // For compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
21
22 #ifndef WX_PRECOMP
23 #include "wx/wx.h"
24 #endif
25
26 #include "PhysicsView.h"
27 #include "PhysicsTreeItemData.h"
28
29 #include "../DefaultNames.h"
30
31 const wxSize choiceSize(200, -1);
32
33
34 void PhysicsView::CreateAliens()
35 {
36         aliens_appearance_sizer = new wxBoxSizer(wxHORIZONTAL);
37
38         wxStaticBoxSizer* appearance_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Appearance"));
39
40         wxFlexGridSizer* appearance_grid_sizer = new wxFlexGridSizer(2);
41         appearance_grid_sizer->AddGrowableCol(0);
42         appearance_grid_sizer->SetHGap(10);
43         appearance_grid_sizer->SetVGap(4);
44
45         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Graphic Collection:")), 0, wxALIGN_CENTER_VERTICAL);
46         alien_collection_field = new wxTextCtrl(main_panel, FIELD_ALIEN_COLLECTION);
47         appearance_grid_sizer->Add(alien_collection_field, 0, wxALIGN_CENTER_VERTICAL);
48
49         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Color Table:")), 0, wxALIGN_CENTER_VERTICAL);
50         alien_color_table_field = new wxTextCtrl(main_panel, FIELD_ALIEN_COLOR_TABLE);
51         appearance_grid_sizer->Add(alien_color_table_field, 0, wxALIGN_CENTER_VERTICAL);
52
53         wxStaticText* sequence_label = new wxStaticText(main_panel, wxID_ANY, _("Sequence IDs:"));
54 //      wxFont font = sequence_label->GetFont();
55 //      font.SetWeight(wxFONTWEIGHT_BOLD);
56 //      sequence_label->SetFont(font);
57         appearance_grid_sizer->Add(sequence_label, 0, wxALIGN_CENTER_VERTICAL);
58         appearance_grid_sizer->AddSpacer(30);
59         
60         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Hit:")), 0, wxALIGN_CENTER_VERTICAL);
61         alien_hit_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HIT);
62         appearance_grid_sizer->Add(alien_hit_field, 0, wxALIGN_CENTER_VERTICAL);
63
64         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Hard Dying:")), 0, wxALIGN_CENTER_VERTICAL);
65         alien_hard_dying_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HARD_DYING);
66         appearance_grid_sizer->Add(alien_hard_dying_field, 0, wxALIGN_CENTER_VERTICAL);
67
68         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Soft Dying:")), 0, wxALIGN_CENTER_VERTICAL);
69         alien_soft_dying_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SOFT_DYING);
70         appearance_grid_sizer->Add(alien_soft_dying_field, 0, wxALIGN_CENTER_VERTICAL);
71         
72         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Hard Dead:")), 0, wxALIGN_CENTER_VERTICAL);
73         alien_hard_dead_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HARD_DEAD);
74         appearance_grid_sizer->Add(alien_hard_dead_field, 0, wxALIGN_CENTER_VERTICAL);
75
76         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Soft Dead:")), 0, wxALIGN_CENTER_VERTICAL);
77         alien_soft_dead_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SOFT_DEAD);
78         appearance_grid_sizer->Add(alien_soft_dead_field, 0, wxALIGN_CENTER_VERTICAL);
79
80         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Stationary:")), 0, wxALIGN_CENTER_VERTICAL);
81         alien_stationary_field = new wxTextCtrl(main_panel, FIELD_ALIEN_STATIONARY);
82         appearance_grid_sizer->Add(alien_stationary_field, 0, wxALIGN_CENTER_VERTICAL);
83
84         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Moving:")), 0, wxALIGN_CENTER_VERTICAL);
85         alien_moving_field = new wxTextCtrl(main_panel, FIELD_ALIEN_MOVING);
86         appearance_grid_sizer->Add(alien_moving_field, 0, wxALIGN_CENTER_VERTICAL);
87
88         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Teleport In:")), 0, wxALIGN_CENTER_VERTICAL);
89         alien_teleport_in_field = new wxTextCtrl(main_panel, FIELD_ALIEN_TELEPORT_IN);
90         appearance_grid_sizer->Add(alien_teleport_in_field, 0, wxALIGN_CENTER_VERTICAL);
91
92         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Teleport Out:")), 0, wxALIGN_CENTER_VERTICAL);
93         alien_teleport_out_field = new wxTextCtrl(main_panel, FIELD_ALIEN_TELEPORT_OUT);
94         appearance_grid_sizer->Add(alien_teleport_out_field, 0, wxALIGN_CENTER_VERTICAL);
95
96         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Melee Attack:")), 0, wxALIGN_CENTER_VERTICAL);
97         alien_melee_attack_shape_field = new wxTextCtrl(main_panel, FIELD_ALIEN_MELEE_ATTACK_SHAPE);
98         appearance_grid_sizer->Add(alien_melee_attack_shape_field, 0, wxALIGN_CENTER_VERTICAL);
99
100         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ranged Attack:")), 0, wxALIGN_CENTER_VERTICAL);
101         alien_ranged_attack_shape_field = new wxTextCtrl(main_panel, FIELD_ALIEN_RANGED_ATTACK_SHAPE);
102         appearance_grid_sizer->Add(alien_ranged_attack_shape_field, 0, wxALIGN_CENTER_VERTICAL);
103
104         appearance_sizer->Add(appearance_grid_sizer);
105
106         aliens_appearance_sizer->Add(appearance_sizer);
107         aliens_appearance_sizer->AddSpacer(10);
108
109         wxStaticBoxSizer* sounds_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Sounds"));
110
111         wxFlexGridSizer* sounds_grid_sizer = new wxFlexGridSizer(2);
112         sounds_grid_sizer->AddGrowableCol(0);
113         sounds_grid_sizer->SetHGap(10);
114         sounds_grid_sizer->SetVGap(4);
115
116         std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
117         sound_strings.insert(sound_strings.begin(), GetName(wxT("sound"), -1));
118
119         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Activation:")), 0, wxALIGN_CENTER_VERTICAL);
120         alien_activation_choice = new wxChoice(main_panel, MENU_ALIEN_ACTIVATION, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
121         sounds_grid_sizer->Add(alien_activation_choice, 0, wxALIGN_CENTER_VERTICAL);
122
123         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Friendly Activation:")), 0, wxALIGN_CENTER_VERTICAL);
124         alien_friendly_activation_choice = new wxChoice(main_panel, MENU_ALIEN_FRIENDLY_ACTIVATION, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
125         sounds_grid_sizer->Add(alien_friendly_activation_choice, 0, wxALIGN_CENTER_VERTICAL);
126
127         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Clear:")), 0, wxALIGN_CENTER_VERTICAL);
128         alien_clear_choice = new wxChoice(main_panel, MENU_ALIEN_CLEAR, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
129         sounds_grid_sizer->Add(alien_clear_choice, 0, wxALIGN_CENTER_VERTICAL);
130
131         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Kill:")), 0, wxALIGN_CENTER_VERTICAL);
132         alien_kill_choice = new wxChoice(main_panel, MENU_ALIEN_KILL, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
133         sounds_grid_sizer->Add(alien_kill_choice, 0, wxALIGN_CENTER_VERTICAL);
134
135         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Apology:")), 0, wxALIGN_CENTER_VERTICAL);
136         alien_apology_choice = new wxChoice(main_panel, MENU_ALIEN_APOLOGY, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
137         sounds_grid_sizer->Add(alien_apology_choice, 0, wxALIGN_CENTER_VERTICAL);
138
139         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Friendly Fire:")), 0, wxALIGN_CENTER_VERTICAL);
140         alien_friendly_fire_choice = new wxChoice(main_panel, MENU_ALIEN_FRIENDLY_FIRE, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
141         sounds_grid_sizer->Add(alien_friendly_fire_choice, 0, wxALIGN_CENTER_VERTICAL);
142
143         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Flaming:")), 0, wxALIGN_CENTER_VERTICAL);
144         alien_flaming_choice = new wxChoice(main_panel, MENU_ALIEN_FLAMING, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
145         sounds_grid_sizer->Add(alien_flaming_choice, 0, wxALIGN_CENTER_VERTICAL);
146
147         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Random:")), 0, wxALIGN_CENTER_VERTICAL);
148         alien_random_choice = new wxChoice(main_panel, MENU_ALIEN_RANDOM, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
149         sounds_grid_sizer->Add(alien_random_choice, 0, wxALIGN_CENTER_VERTICAL);
150
151         sounds_grid_sizer->AddSpacer(10);
152         sounds_grid_sizer->AddSpacer(10);
153
154         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Random Sound Mask:")), 0, wxALIGN_CENTER_VERTICAL);
155         alien_random_sound_mask_field = new wxTextCtrl(main_panel, FIELD_ALIEN_RANDOM_SOUND_MASK);
156         sounds_grid_sizer->Add(alien_random_sound_mask_field, 0, wxALIGN_CENTER_VERTICAL);
157
158         sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sound Pitch:")), 0, wxALIGN_CENTER_VERTICAL);
159         alien_sound_pitch_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SOUND_PITCH);
160         sounds_grid_sizer->Add(alien_sound_pitch_field, 0, wxALIGN_CENTER_VERTICAL);
161
162         sounds_sizer->Add(sounds_grid_sizer);
163
164         aliens_appearance_sizer->Add(sounds_sizer);
165         
166         mainbox->Add(aliens_appearance_sizer, 5, wxALL, 10);
167         mainbox->Show(aliens_appearance_sizer, false);
168
169         aliens_combat_sizer = new wxBoxSizer(wxHORIZONTAL);
170
171         wxFlexGridSizer* combat_grid_sizer = new wxFlexGridSizer(2);
172         combat_grid_sizer->SetHGap(10);
173         combat_grid_sizer->SetVGap(10);
174
175         wxBoxSizer* attack_frequency_sizer = new wxBoxSizer(wxHORIZONTAL);
176
177         attack_frequency_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Attack Frequency:")), 1, wxALIGN_CENTER_VERTICAL);
178         attack_frequency_sizer->AddSpacer(10);
179         alien_attack_frequency_field = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_FREQUENCY);
180         attack_frequency_sizer->Add(alien_attack_frequency_field, 0, wxALIGN_CENTER_VERTICAL);
181
182         combat_grid_sizer->Add(attack_frequency_sizer);
183         combat_grid_sizer->AddSpacer(0);
184
185         std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
186         shot_strings.insert(shot_strings.begin(), GetName(wxT("shot"), -1));
187
188         for (int i = 0; i < 2; ++i) {
189                 int id_offset = i * NUM_ALIEN_ATTACK_CONTROLS;
190                 wxStaticBoxSizer* attack_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, i == 0 ? _("Melee Attack") : _("Ranged Attack"));
191                 wxFlexGridSizer* attack_grid_sizer = new wxFlexGridSizer(2);
192                 attack_grid_sizer->AddGrowableCol(0);
193                 attack_grid_sizer->SetHGap(10);
194                 attack_grid_sizer->SetVGap(4);
195                 
196                 attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Type:")), 0, wxALIGN_CENTER_VERTICAL);
197                 alien_attack_type_choices[i] = new wxChoice(main_panel, MENU_ALIEN_ATTACK_TYPE + id_offset, wxDefaultPosition, choiceSize, shot_strings.size(), &shot_strings[0]);
198                 attack_grid_sizer->Add(alien_attack_type_choices[i], 0, wxALIGN_CENTER_VERTICAL);
199
200                 attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Repetitions:")), 0, wxALIGN_CENTER_VERTICAL);
201                 alien_attack_repetitions_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_REPETITIONS + id_offset);
202                 attack_grid_sizer->Add(alien_attack_repetitions_fields[i], 0, wxALIGN_CENTER_VERTICAL);
203
204                 attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Error:")), 0, wxALIGN_CENTER_VERTICAL);
205                 alien_attack_error_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_ERROR + id_offset);
206                 attack_grid_sizer->Add(alien_attack_error_fields[i], 0, wxALIGN_CENTER_VERTICAL);
207
208                 attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Range:")), 0, wxALIGN_CENTER_VERTICAL);
209                 alien_attack_range_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_RANGE + id_offset);
210                 attack_grid_sizer->Add(alien_attack_range_fields[i], 0, wxALIGN_CENTER_VERTICAL);
211
212                 attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sequence ID:")), 0, wxALIGN_CENTER_VERTICAL);
213                 alien_attack_sequence_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_SEQUENCE + id_offset);
214                 attack_grid_sizer->Add(alien_attack_sequence_fields[i], 0, wxALIGN_CENTER_VERTICAL);
215
216                 attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dx:")), 0, wxALIGN_CENTER_VERTICAL);
217                 alien_attack_dx_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_DX + id_offset);
218                 attack_grid_sizer->Add(alien_attack_dx_fields[i], 0, wxALIGN_CENTER_VERTICAL);
219
220                 attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dy:")), 0, wxALIGN_CENTER_VERTICAL);
221                 alien_attack_dy_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_DY + id_offset);
222                 attack_grid_sizer->Add(alien_attack_dy_fields[i], 0, wxALIGN_CENTER_VERTICAL);
223
224                 attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dz:")), 0, wxALIGN_CENTER_VERTICAL);
225                 alien_attack_dz_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_DZ + id_offset);
226                 attack_grid_sizer->Add(alien_attack_dz_fields[i], 0, wxALIGN_CENTER_VERTICAL);
227
228                 attack_sizer->Add(attack_grid_sizer, 0, wxEXPAND);
229
230                 combat_grid_sizer->Add(attack_sizer, 0, wxEXPAND);
231         }
232
233         wxStaticBoxSizer* shrapnel_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Shrapnel"));
234         wxFlexGridSizer* shrapnel_grid_sizer = new wxFlexGridSizer(2);
235         shrapnel_grid_sizer->AddGrowableCol(0);
236         shrapnel_grid_sizer->SetHGap(10);
237         shrapnel_grid_sizer->SetVGap(4);
238
239         shrapnel_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Shrapnel Radius:")), 0, wxALIGN_CENTER_VERTICAL);
240         alien_shrapnel_radius_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SHRAPNEL_RADIUS);
241         shrapnel_grid_sizer->Add(alien_shrapnel_radius_field, 0, wxALIGN_CENTER_VERTICAL);
242
243         std::vector<wxString> damage_strings = DefaultNames::Instance()->GetArray(wxT("damage"));
244         damage_strings.insert(damage_strings.begin(), _("None"));
245
246         shrapnel_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Type:")), 0, wxALIGN_CENTER_VERTICAL);
247         alien_shrapnel_damage_type_choice = new wxChoice(main_panel, MENU_ALIEN_SHRAPNEL_DAMAGE_TYPE, wxDefaultPosition, choiceSize, damage_strings.size(), &damage_strings[0]);
248         shrapnel_grid_sizer->Add(alien_shrapnel_damage_type_choice, 0, wxALIGN_CENTER_VERTICAL);
249
250         shrapnel_sizer->Add(shrapnel_grid_sizer, 0, wxEXPAND);
251         
252         alien_shrapnel_alien_damage_checkbox = new wxCheckBox(main_panel, CB_ALIEN_SHRAPNEL_ALIEN_DAMAGE, _("Alien Damage (varies with level)"));
253         shrapnel_sizer->Add(alien_shrapnel_alien_damage_checkbox, 0, wxEXPAND | wxTOP, 5);
254
255         wxFlexGridSizer* shrapnel_grid_sizer2 = new wxFlexGridSizer(2);
256         shrapnel_grid_sizer2->AddGrowableCol(0);
257         shrapnel_grid_sizer2->SetHGap(10);
258         shrapnel_grid_sizer2->SetVGap(4);
259
260         // make the fields line up with the grid above
261         shrapnel_grid_sizer2->AddSpacer(0);
262         shrapnel_grid_sizer2->Add(choiceSize.GetWidth(), 0);
263
264         shrapnel_grid_sizer2->Add(new wxStaticText(main_panel, wxID_ANY, _("Base Damage:")), 0, wxALIGN_CENTER_VERTICAL);
265         alien_shrapnel_base_damage_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SHRAPNEL_BASE_DAMAGE);
266         shrapnel_grid_sizer2->Add(alien_shrapnel_base_damage_field, 0, wxALIGN_CENTER_VERTICAL);
267
268         shrapnel_grid_sizer2->Add(new wxStaticText(main_panel, wxID_ANY, _("Random Damage:")), 0, wxALIGN_CENTER_VERTICAL);
269         alien_shrapnel_random_damage_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SHRAPNEL_RANDOM_DAMAGE);
270         shrapnel_grid_sizer2->Add(alien_shrapnel_random_damage_field, 0, wxALIGN_CENTER_VERTICAL);
271
272         shrapnel_grid_sizer2->Add(new wxStaticText(main_panel, wxID_ANY, _("Scale:")), 0, wxALIGN_CENTER_VERTICAL);
273         alien_shrapnel_damage_scale_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SHRAPNEL_DAMAGE_SCALE);
274         shrapnel_grid_sizer2->Add(alien_shrapnel_damage_scale_field, 0, wxALIGN_CENTER_VERTICAL);
275
276         shrapnel_sizer->Add(shrapnel_grid_sizer2, 0, wxEXPAND);
277
278         combat_grid_sizer->Add(shrapnel_sizer, 0, wxEXPAND);
279
280         wxStaticBoxSizer* impact_effects_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Impact Effects (hits on monster)"));
281         wxFlexGridSizer* impact_effects_grid_sizer = new wxFlexGridSizer(2);
282         impact_effects_grid_sizer->AddGrowableCol(0);
283         impact_effects_grid_sizer->SetHGap(10);
284         impact_effects_grid_sizer->SetVGap(4);
285
286         std::vector<wxString> effect_strings = DefaultNames::Instance()->GetArray(wxT("effect"));
287         effect_strings.insert(effect_strings.begin(), GetName(wxT("sound"), -1));
288
289         impact_effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ranged:")), 0, wxALIGN_CENTER_VERTICAL);
290         alien_ranged_impact_effect_choice = new wxChoice(main_panel, MENU_ALIEN_RANGED_IMPACT_EFFECT, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
291         impact_effects_grid_sizer->Add(alien_ranged_impact_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
292
293         impact_effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Melee:")), 0, wxALIGN_CENTER_VERTICAL);
294         alien_melee_impact_effect_choice = new wxChoice(main_panel, MENU_ALIEN_MELEE_IMPACT_EFFECT, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
295         impact_effects_grid_sizer->Add(alien_melee_impact_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
296
297         impact_effects_sizer->Add(impact_effects_grid_sizer, 0, wxEXPAND);
298         
299         combat_grid_sizer->Add(impact_effects_sizer, 0, wxEXPAND);
300
301         aliens_combat_sizer->Add(combat_grid_sizer);
302
303         mainbox->Add(aliens_combat_sizer, 5, wxALL, 10);
304         mainbox->Show(aliens_combat_sizer, false);
305
306         aliens_constants_sizer = new wxBoxSizer(wxVERTICAL);
307
308         wxFlexGridSizer* constants_grid_sizer = new wxFlexGridSizer(2);
309         constants_grid_sizer->SetHGap(10);
310         constants_grid_sizer->SetVGap(10);
311
312         wxFlexGridSizer* vitality_grid_sizer = new wxFlexGridSizer(2);
313         vitality_grid_sizer->AddGrowableCol(0);
314         vitality_grid_sizer->SetHGap(10);
315
316         vitality_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Vitality:")), 0, wxALIGN_CENTER_VERTICAL);
317         alien_vitality_field = new wxTextCtrl(main_panel, FIELD_ALIEN_VITALITY);
318         vitality_grid_sizer->Add(alien_vitality_field, 0, wxALIGN_CENTER_VERTICAL);
319
320         constants_grid_sizer->Add(vitality_grid_sizer, 0, wxEXPAND);
321
322         wxFlexGridSizer* radius_height_sizer = new wxFlexGridSizer(2);
323         radius_height_sizer->AddGrowableCol(0);
324         radius_height_sizer->SetHGap(10);
325         radius_height_sizer->SetVGap(4);
326
327         radius_height_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Radius:")), 0, wxALIGN_CENTER_VERTICAL);
328         alien_radius_field = new wxTextCtrl(main_panel, FIELD_ALIEN_RADIUS);
329         radius_height_sizer->Add(alien_radius_field, 0, wxALIGN_CENTER_VERTICAL);
330
331         radius_height_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Height:")), 0, wxALIGN_CENTER_VERTICAL);
332         alien_height_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HEIGHT);
333         radius_height_sizer->Add(alien_height_field, 0, wxALIGN_CENTER_VERTICAL);
334         
335         constants_grid_sizer->Add(radius_height_sizer, 0, wxEXPAND);
336
337         wxStaticBoxSizer* movement_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Movement"));
338         wxFlexGridSizer* movement_grid_sizer = new wxFlexGridSizer(2);
339         movement_grid_sizer->AddGrowableCol(0);
340         movement_grid_sizer->SetHGap(10);
341         movement_grid_sizer->SetVGap(4);
342
343         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Speed:")), 0, wxALIGN_CENTER_VERTICAL);
344         alien_speed_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SPEED);
345         movement_grid_sizer->Add(alien_speed_field, 0, wxALIGN_CENTER_VERTICAL);
346
347         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Terminal Velocity:")), 0, wxALIGN_CENTER_VERTICAL);
348         alien_terminal_velocity_field = new wxTextCtrl(main_panel, FIELD_ALIEN_TERMINAL_VELOCITY);
349         movement_grid_sizer->Add(alien_terminal_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
350
351         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Gravity:")), 0, wxALIGN_CENTER_VERTICAL);
352         alien_gravity_field = new wxTextCtrl(main_panel, FIELD_ALIEN_GRAVITY);
353         movement_grid_sizer->Add(alien_gravity_field, 0, wxALIGN_CENTER_VERTICAL);
354
355         movement_grid_sizer->AddSpacer(10);
356         movement_grid_sizer->AddSpacer(10);
357
358         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Min. Ledge Jump:")), 0, wxALIGN_CENTER_VERTICAL);
359         alien_min_ledge_jump_field = new wxTextCtrl(main_panel, FIELD_ALIEN_MIN_LEDGE_JUMP);
360         movement_grid_sizer->Add(alien_min_ledge_jump_field, 0, wxALIGN_CENTER_VERTICAL);       
361
362         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Max. Ledge Jump:")), 0, wxALIGN_CENTER_VERTICAL);
363         alien_max_ledge_jump_field = new wxTextCtrl(main_panel, FIELD_ALIEN_MAX_LEDGE_JUMP);
364         movement_grid_sizer->Add(alien_max_ledge_jump_field, 0, wxALIGN_CENTER_VERTICAL);       
365
366         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("External Velocity Scale:")), 0, wxALIGN_CENTER_VERTICAL);
367         alien_ext_velocity_scale_field = new wxTextCtrl(main_panel, FIELD_ALIEN_EXT_VELOCITY_SCALE);
368         movement_grid_sizer->Add(alien_ext_velocity_scale_field, 0, wxALIGN_CENTER_VERTICAL);
369
370         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Hover Height:")), 0, wxALIGN_CENTER_VERTICAL);
371         alien_hover_height_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HOVER_HEIGHT);
372         movement_grid_sizer->Add(alien_hover_height_field, 0, wxALIGN_CENTER_VERTICAL);
373
374         movement_grid_sizer->AddSpacer(10);
375         movement_grid_sizer->AddSpacer(10);
376
377         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Door Retry Mask:")), 0, wxALIGN_CENTER_VERTICAL);
378         alien_door_retry_mask_field = new wxTextCtrl(main_panel, FIELD_ALIEN_DOOR_RETRY_MASK);
379         movement_grid_sizer->Add(alien_door_retry_mask_field, 0, wxALIGN_CENTER_VERTICAL);      
380
381         movement_sizer->Add(movement_grid_sizer, 0, wxEXPAND);
382
383         constants_grid_sizer->Add(movement_sizer, 0, wxEXPAND);
384
385         wxStaticBoxSizer* perception_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Perception"));
386         wxFlexGridSizer* perception_grid_sizer = new wxFlexGridSizer(2);
387         perception_grid_sizer->AddGrowableCol(0);
388         perception_grid_sizer->SetHGap(10);
389         perception_grid_sizer->SetVGap(4);
390
391         perception_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Visual Range:")), 0, wxALIGN_CENTER_VERTICAL);
392         alien_visual_range_field = new wxTextCtrl(main_panel, FIELD_ALIEN_VISUAL_RANGE);
393         perception_grid_sizer->Add(alien_visual_range_field, 0, wxALIGN_CENTER_VERTICAL);       
394
395         perception_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Dark Visual Range:")), 0, wxALIGN_CENTER_VERTICAL);
396         alien_dark_visual_range_field = new wxTextCtrl(main_panel, FIELD_ALIEN_DARK_VISUAL_RANGE);
397         perception_grid_sizer->Add(alien_dark_visual_range_field, 0, wxALIGN_CENTER_VERTICAL);
398
399         perception_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Intelligence:")), 0, wxALIGN_CENTER_VERTICAL);
400         alien_intelligence_field = new wxTextCtrl(main_panel, FIELD_ALIEN_INTELLIGENCE);
401         perception_grid_sizer->Add(alien_intelligence_field, 0, wxALIGN_CENTER_VERTICAL);
402
403         perception_sizer->Add(perception_grid_sizer, 0, wxEXPAND);
404
405         constants_grid_sizer->Add(perception_sizer, 0, wxEXPAND);
406
407         aliens_constants_sizer->Add(constants_grid_sizer);
408         aliens_constants_sizer->AddSpacer(10);
409
410         wxFlexGridSizer* carrying_grid_sizer = new wxFlexGridSizer(2);
411         carrying_grid_sizer->AddGrowableCol(0);
412         carrying_grid_sizer->SetHGap(10);
413         carrying_grid_sizer->SetVGap(4);
414
415         std::vector<wxString> item_strings = DefaultNames::Instance()->GetArray(wxT("item"));
416         item_strings.insert(item_strings.begin(), _("None"));
417
418         carrying_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Carrying Item Type:")), 0, wxALIGN_CENTER_VERTICAL);
419         alien_carrying_item_choice = new wxChoice(main_panel, MENU_ALIEN_CARRYING_ITEM, wxDefaultPosition, choiceSize, item_strings.size(), &item_strings[0]);
420         carrying_grid_sizer->Add(alien_carrying_item_choice, 0, wxALIGN_CENTER_VERTICAL);
421
422         carrying_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Contrail Effect:")), 0, wxALIGN_CENTER_VERTICAL);
423         alien_contrail_effect_choice = new wxChoice(main_panel, MENU_ALIEN_CONTRAIL_EFFECT, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
424         carrying_grid_sizer->Add(alien_contrail_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
425
426         aliens_constants_sizer->Add(carrying_grid_sizer);
427         
428         mainbox->Add(aliens_constants_sizer, 5, wxALL, 10);
429         mainbox->Show(aliens_constants_sizer, false);
430
431         aliens_behavior_sizer = new wxBoxSizer(wxVERTICAL);
432
433         wxBoxSizer* class_sizer = new wxBoxSizer(wxHORIZONTAL);
434
435         std::vector<wxString> class_strings = DefaultNames::Instance()->GetArray(wxT("class"));
436
437         class_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Class:")), 0, wxALIGN_CENTER_VERTICAL);
438         alien_class_choice = new wxChoice(main_panel, MENU_ALIEN_CLASS, wxDefaultPosition, choiceSize, class_strings.size(), &class_strings[0]);
439         class_sizer->AddSpacer(10);
440         class_sizer->Add(alien_class_choice, 0, wxALIGN_CENTER_VERTICAL);
441
442         aliens_behavior_sizer->Add(class_sizer);
443
444         wxStaticBoxSizer* friends_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Friends"));
445         wxGridSizer* friends_grid_sizer = new wxGridSizer(4);
446         friends_grid_sizer->SetVGap(2);
447
448         for (int i = 0; i < 16; ++i) {
449                 alien_friends_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_FRIENDS + i, GetName(wxT("class"), i));
450
451         }
452
453         for (int col = 0; col < 4; ++col) {
454                 for (int row = 0; row < 4; ++row) {
455                         friends_grid_sizer->Add(alien_friends_checkboxes[row * 4 + col], 0, wxALIGN_CENTER_VERTICAL);
456                 }
457         }
458         
459         friends_sizer->Add(friends_grid_sizer, 0, wxEXPAND);
460
461         aliens_behavior_sizer->AddSpacer(10);
462         aliens_behavior_sizer->Add(friends_sizer, 0, wxEXPAND);
463
464         wxStaticBoxSizer* enemies_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Enemies"));
465         wxGridSizer* enemies_grid_sizer = new wxGridSizer(4);
466         enemies_grid_sizer->SetVGap(2);
467
468         for (int i = 0; i < 16; ++i) {
469                 alien_enemies_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_ENEMIES + i, GetName(wxT("class"), i));
470         }
471
472         for (int col = 0; col < 4; ++col) {
473                 for (int row = 0; row < 4; ++row) {
474                         enemies_grid_sizer->Add(alien_enemies_checkboxes[row * 4 + col], 0, wxALIGN_CENTER_VERTICAL);
475                 }
476         }
477
478         enemies_sizer->Add(enemies_grid_sizer, 0, wxEXPAND);
479         
480         aliens_behavior_sizer->AddSpacer(10);
481         aliens_behavior_sizer->Add(enemies_sizer, 0, wxEXPAND);
482
483         const wxString flags_strings[] = {
484                 _("Flies"),
485                 _("Is Alien"),
486                 _("Major"),
487                 _("Minor"),
488                 _("Cannot Skip"),
489                 _("Floats"),
490                 _("Cannot Attack"),
491                 _("Uses Sniper Ledges"),
492                 _("Invisible"),
493                 _("Subtly Invisible"),
494                 _("Kamikaze"),
495                 _("Berserker"),
496                 _("Enlarged"),
497                 _("Delayed Hard Death"),
498                 _("Fires Symmetrically"),
499                 _("Nuclear Hard Death"),
500                 _("Can't Fire Backwards"),
501                 _("Die in Flames"),
502                 _("Stay with Clear Shot"),
503                 _("Tiny"),
504                 _("Attacks Immediately"),
505                 _("Not Afraid of Water"),
506                 _("Not Afraid of Sewage"),
507                 _("Not Afraid of Lava"),
508                 _("Not Afraid of Goo"),
509                 _("Can Teleport Under Liquid"),
510                 _("Chooses Weapon Randomly"),
511         };
512
513         const int flags_layout[] = {
514                 0, 8, 17,
515                 1, 9, 18,
516                 2, 10, 19,
517                 3, 11, 20,
518                 4, 12, 21,
519                 5, 13, 22,
520                 6, 14, 23,
521                 7, 15, 24,
522                 26, 16, 25
523         };
524
525         wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
526         wxGridSizer* flags_grid_sizer = new wxGridSizer(3);
527         flags_grid_sizer->SetVGap(2);
528         
529         for (int i = 0; i < 27; ++i) {
530                 alien_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_FLAGS + i, flags_strings[i]);
531         }
532
533         for (int i = 0; i < 27; ++i) {
534                 flags_grid_sizer->Add(alien_flags_checkboxes[flags_layout[i]], 0, wxALIGN_CENTER_VERTICAL);
535         }
536
537         flags_sizer->Add(flags_grid_sizer, 0, wxEXPAND);
538         
539         aliens_behavior_sizer->AddSpacer(10);
540         aliens_behavior_sizer->Add(flags_sizer, 0, wxEXPAND);
541         
542         mainbox->Add(aliens_behavior_sizer, 5, wxALL, 10);
543         mainbox->Show(aliens_behavior_sizer, false);
544
545         aliens_immunities_sizer = new wxBoxSizer(wxVERTICAL);
546
547         wxStaticBoxSizer* immunities_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Immunities"));
548         wxGridSizer* immunities_grid_sizer = new wxGridSizer(4);
549         immunities_grid_sizer->SetVGap(2);
550         
551         for (int i = 0; i < 24; ++i) {
552                 alien_immunities_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_IMMUNITIES + i, GetName(wxT("damage"), i));
553         }
554
555         for (int i = 0; i < 6; ++i) {
556                 for (int j = 0; j < 4; ++j) {
557                         immunities_grid_sizer->Add(alien_immunities_checkboxes[j * 6 + i], 0, wxALIGN_CENTER_VERTICAL);
558                 }
559         }
560
561         immunities_sizer->Add(immunities_grid_sizer, 0, wxEXPAND);
562
563         aliens_immunities_sizer->Add(immunities_sizer, 0, wxEXPAND);
564
565         wxStaticBoxSizer* weaknesses_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Weaknesses"));
566         wxGridSizer* weaknesses_grid_sizer = new wxGridSizer(4);
567         weaknesses_grid_sizer->SetVGap(2);
568
569         for (int i = 0; i < 24; ++i) {
570                 alien_weaknesses_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_WEAKNESSES + i, GetName(wxT("damage"), i));
571         }
572
573         for (int i = 0; i < 6; ++i) {
574                 for (int j = 0; j < 4; ++j) {
575                         weaknesses_grid_sizer->Add(alien_weaknesses_checkboxes[j * 6 + i], 0, wxALIGN_CENTER_VERTICAL);
576                 }
577         }
578
579         weaknesses_sizer->Add(weaknesses_grid_sizer, 0, wxEXPAND);
580         
581         aliens_immunities_sizer->AddSpacer(10);
582         aliens_immunities_sizer->Add(weaknesses_sizer, 0, wxEXPAND);
583
584         mainbox->Add(aliens_immunities_sizer, 5, wxALL, 10);
585         mainbox->Show(aliens_immunities_sizer, false);
586 }
587
588 void PhysicsView::CreateEffects()
589 {
590         effects_sizer = new wxBoxSizer(wxHORIZONTAL);
591
592         wxStaticBoxSizer* effects_static_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Effect"));
593         
594         wxFlexGridSizer* effects_grid_sizer = new wxFlexGridSizer(2);
595         effects_grid_sizer->AddGrowableCol(0);
596         effects_grid_sizer->SetHGap(10);
597         effects_grid_sizer->SetVGap(4);
598         
599         effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Graphic collection:")), 0, wxALIGN_CENTER_VERTICAL);
600         eff_collection_field = new wxTextCtrl(main_panel, FIELD_EFFECT_COLLECTION);
601         effects_grid_sizer->Add(eff_collection_field, 0, wxALIGN_CENTER_VERTICAL);
602
603         effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Color table:")), 0, wxALIGN_CENTER_VERTICAL);
604         eff_color_table_field = new wxTextCtrl(main_panel, FIELD_EFFECT_COLOR_TABLE);
605         effects_grid_sizer->Add(eff_color_table_field, 0, wxALIGN_CENTER_VERTICAL);
606
607         effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sequence:")), 0, wxALIGN_CENTER_VERTICAL);
608         eff_sequence_field = new wxTextCtrl(main_panel, FIELD_EFFECT_SEQUENCE);
609         effects_grid_sizer->Add(eff_sequence_field, 0, wxALIGN_CENTER_VERTICAL);
610
611         effects_grid_sizer->AddSpacer(10);
612         effects_grid_sizer->AddSpacer(10);
613
614         effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sound pitch:")), 0, wxALIGN_CENTER_VERTICAL);
615         eff_pitch_field = new wxTextCtrl(main_panel, FIELD_EFFECT_PITCH);
616         effects_grid_sizer->Add(eff_pitch_field, 0, wxALIGN_CENTER_VERTICAL);
617
618         effects_grid_sizer->AddSpacer(10);
619         effects_grid_sizer->AddSpacer(10);
620
621         effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Delay:")), 0, wxALIGN_CENTER_VERTICAL);
622         eff_delay_field = new wxTextCtrl(main_panel, wxID_ANY);
623         eff_delay_field->Disable();
624         effects_grid_sizer->Add(eff_delay_field, 0, wxALIGN_CENTER_VERTICAL);
625
626         std::vector<wxString> delay_sound_choices = DefaultNames::Instance()->GetArray(wxT("sound"));
627         delay_sound_choices.insert(delay_sound_choices.begin(), GetName(wxT("sound"), -1));
628
629         effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Delay sound:")), 0, wxALIGN_CENTER_VERTICAL);
630         eff_delay_sound_choice = new wxChoice(main_panel, MENU_EFFECT_DELAY_SOUND, wxDefaultPosition, choiceSize, delay_sound_choices.size(), &delay_sound_choices[0]);
631         effects_grid_sizer->Add(eff_delay_sound_choice, 0, wxALIGN_CENTER_VERTICAL);
632
633         effects_static_sizer->Add(effects_grid_sizer);
634         
635         effects_static_sizer->AddSpacer(10);
636
637         eff_end_when_animation_loops_checkbox = new wxCheckBox(main_panel, CB_EFFECT_END_WHEN_ANIMATION_LOOPS, _("End when animation loops"));
638         effects_static_sizer->Add(eff_end_when_animation_loops_checkbox);
639
640         eff_end_when_transfer_animation_loops_checkbox = new wxCheckBox(main_panel, CB_EFFECT_END_WHEN_TRANSFER_ANIMATION_LOOPS, _("End when transfer animation loops"));
641         effects_static_sizer->AddSpacer(2);
642         effects_static_sizer->Add(eff_end_when_transfer_animation_loops_checkbox);
643
644         eff_sound_only_checkbox = new wxCheckBox(main_panel, CB_EFFECT_SOUND_ONLY, _("Sound only"));
645         effects_static_sizer->AddSpacer(2);
646         effects_static_sizer->Add(eff_sound_only_checkbox);
647
648         eff_media_effect_checkbox = new wxCheckBox(main_panel, CB_EFFECT_MEDIA_EFFECT, _("Media effect"));
649         effects_static_sizer->AddSpacer(2);
650         effects_static_sizer->Add(eff_media_effect_checkbox);
651         
652         effects_sizer->Add(effects_static_sizer);
653         
654         mainbox->Add(effects_sizer, 5, wxALL, 10);
655         mainbox->Show(effects_sizer, false);
656 }
657
658 void PhysicsView::CreatePhysicsConstants()
659 {
660         // physics constants
661         physics_sizer = new wxFlexGridSizer(2);
662         physics_sizer->SetHGap(10);
663         physics_sizer->SetVGap(20);
664
665         wxStaticBoxSizer* movement_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Movement"));
666         wxFlexGridSizer* movement_grid_sizer = new wxFlexGridSizer(2);
667
668         movement_grid_sizer->AddGrowableCol(0);
669         movement_grid_sizer->SetHGap(10);
670         movement_grid_sizer->SetVGap(4);
671
672         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Max. forward velocity:")), 0, wxALIGN_CENTER_VERTICAL);
673         max_forward_velocity_field = new wxTextCtrl(main_panel, FIELD_MAX_FORWARD_VELOCITY);
674         movement_grid_sizer->Add(max_forward_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
675
676         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Max. backward velocity:")), 0, wxALIGN_CENTER_VERTICAL);
677         max_backward_velocity_field = new wxTextCtrl(main_panel, FIELD_MAX_BACKWARD_VELOCITY);
678         movement_grid_sizer->Add(max_backward_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
679
680         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Max. perpendicular velocity:")), 0, wxALIGN_CENTER_VERTICAL);
681         max_perpendicular_velocity_field = new wxTextCtrl(main_panel, FIELD_MAX_PERPENDICULAR_VELOCITY);
682         movement_grid_sizer->Add(max_perpendicular_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
683
684         movement_grid_sizer->AddSpacer(10);
685         movement_grid_sizer->AddSpacer(10);
686
687         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Acceleration:")), 0, wxALIGN_CENTER_VERTICAL);
688         acceleration_field = new wxTextCtrl(main_panel, FIELD_ACCELERATION);
689         movement_grid_sizer->Add(acceleration_field, 0, wxALIGN_CENTER_VERTICAL);
690
691         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
692         deceleration_field = new wxTextCtrl(main_panel, FIELD_DECELERATION);
693         movement_grid_sizer->Add(deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
694
695         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Airborne deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
696         airborne_deceleration_field = new wxTextCtrl(main_panel, FIELD_AIRBORNE_DECELERATION);
697         movement_grid_sizer->Add(airborne_deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
698
699         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Gravitational acceleration:")), 0, wxALIGN_CENTER_VERTICAL);
700         gravitational_acceleration_field = new wxTextCtrl(main_panel, FIELD_GRAVITATIONAL_ACCELERATION);
701         movement_grid_sizer->Add(gravitational_acceleration_field, 0, wxALIGN_CENTER_VERTICAL);
702
703         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Climbing acceleration:")), 0, wxALIGN_CENTER_VERTICAL);
704         climbing_acceleration_field = new wxTextCtrl(main_panel, FIELD_CLIMBING_ACCELERATION);
705         movement_grid_sizer->Add(climbing_acceleration_field, 0, wxALIGN_CENTER_VERTICAL);
706
707         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Terminal velocity:")), 0, wxALIGN_CENTER_VERTICAL);
708         terminal_velocity_field = new wxTextCtrl(main_panel, FIELD_TERMINAL_VELOCITY);
709         movement_grid_sizer->Add(terminal_velocity_field, 0, wxALIGN_CENTER_VERTICAL);  
710
711         movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("External deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
712         external_deceleration_field = new wxTextCtrl(main_panel, FIELD_EXTERNAL_DECELERATION);
713         movement_grid_sizer->Add(external_deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
714
715         movement_sizer->Add(movement_grid_sizer, 0, wxEXPAND);
716         physics_sizer->Add(movement_sizer, 0, wxEXPAND);
717
718         wxBoxSizer* steps_player_size_sizer = new wxBoxSizer(wxVERTICAL);
719         wxStaticBoxSizer* steps_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Steps"));
720         wxFlexGridSizer* steps_grid_sizer = new wxFlexGridSizer(2);
721         steps_grid_sizer->AddGrowableCol(0);
722         steps_grid_sizer->SetHGap(10);
723         steps_grid_sizer->SetVGap(4);
724
725         steps_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Step delta:")), 0, wxALIGN_CENTER_VERTICAL);
726         step_delta_field = new wxTextCtrl(main_panel, FIELD_STEP_DELTA);
727         steps_grid_sizer->Add(step_delta_field, 0, wxALIGN_CENTER_VERTICAL);
728
729         steps_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Step amplitude:")), 0, wxALIGN_CENTER_VERTICAL);
730         step_amplitude_field = new wxTextCtrl(main_panel, FIELD_STEP_AMPLITUDE);
731         steps_grid_sizer->Add(step_amplitude_field, 0, wxALIGN_CENTER_VERTICAL);
732         
733         steps_sizer->Add(steps_grid_sizer, 0, wxEXPAND);
734
735         steps_player_size_sizer->Add(steps_sizer, 0, wxEXPAND);
736         steps_player_size_sizer->AddSpacer(10);
737
738         wxStaticBoxSizer* size_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Player Size"));
739         wxFlexGridSizer* size_grid_sizer = new wxFlexGridSizer(2);
740         size_grid_sizer->AddGrowableCol(0);
741         size_grid_sizer->SetHGap(10);
742         size_grid_sizer->SetVGap(4);
743
744         size_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Radius:")), 0, wxALIGN_CENTER_VERTICAL);
745         radius_field = new wxTextCtrl(main_panel, FIELD_RADIUS);
746         size_grid_sizer->Add(radius_field, 0, wxALIGN_CENTER_VERTICAL);
747
748         size_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Height:")), 0, wxALIGN_CENTER_VERTICAL);
749         height_field = new wxTextCtrl(main_panel, FIELD_HEIGHT);
750         size_grid_sizer->Add(height_field, 0, wxALIGN_CENTER_VERTICAL);
751
752         size_sizer->Add(size_grid_sizer, 0, wxEXPAND);
753         
754         steps_player_size_sizer->Add(size_sizer, 0, wxEXPAND);
755         steps_player_size_sizer->AddStretchSpacer();
756
757         physics_sizer->Add(steps_player_size_sizer, 0, wxEXPAND);
758
759         wxStaticBoxSizer* turning_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Turning/Head Movement"));
760         wxFlexGridSizer* turning_grid_sizer = new wxFlexGridSizer(2);
761         turning_grid_sizer->AddGrowableCol(0);
762         turning_grid_sizer->SetHGap(10);
763         turning_grid_sizer->SetVGap(4);
764         
765         turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Angular acceleration:")), 0, wxALIGN_CENTER_VERTICAL);
766         angular_acceleration_field = new wxTextCtrl(main_panel, FIELD_ANGULAR_ACCELERATION);
767         turning_grid_sizer->Add(angular_acceleration_field, 0, wxALIGN_CENTER_VERTICAL);
768
769         turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Angular deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
770         angular_deceleration_field = new wxTextCtrl(main_panel, FIELD_ANGULAR_DECELERATION);
771         turning_grid_sizer->Add(angular_deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
772
773         turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Maximum angular velocity:")), 0, wxALIGN_CENTER_VERTICAL);
774         maximum_angular_velocity_field = new wxTextCtrl(main_panel, FIELD_MAXIMUM_ANGULAR_VELOCITY);
775         turning_grid_sizer->Add(maximum_angular_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
776
777         turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Angular recentering velocity:")), 0, wxALIGN_CENTER_VERTICAL);
778         angular_recentering_velocity_field = new wxTextCtrl(main_panel, FIELD_ANGULAR_RECENTERING_VELOCITY);
779         turning_grid_sizer->Add(angular_recentering_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
780
781         turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Head angular velocity:")), 0, wxALIGN_CENTER_VERTICAL);
782         head_angular_velocity_field = new wxTextCtrl(main_panel, FIELD_HEAD_ANGULAR_VELOCITY);
783         turning_grid_sizer->Add(head_angular_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
784
785         turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Head angular maximum:")), 0, wxALIGN_CENTER_VERTICAL);
786         head_angular_maximum_field = new wxTextCtrl(main_panel, FIELD_HEAD_ANGULAR_MAXIMUM);
787         turning_grid_sizer->Add(head_angular_maximum_field, 0, wxALIGN_CENTER_VERTICAL);
788
789         turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Maximum elevation:")), 0, wxALIGN_CENTER_VERTICAL);
790         maximum_elevation_field = new wxTextCtrl(main_panel, FIELD_MAXIMUM_ELEVATION);
791         turning_grid_sizer->Add(maximum_elevation_field, 0, wxALIGN_CENTER_VERTICAL);
792
793         turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("External angular deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
794         external_angular_deceleration_field = new wxTextCtrl(main_panel, FIELD_EXTERNAL_ANGULAR_DECELERATION);
795         turning_grid_sizer->Add(external_angular_deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
796
797         turning_sizer->Add(turning_grid_sizer, 0, wxEXPAND);
798         physics_sizer->Add(turning_sizer, 0);
799
800         wxStaticBoxSizer* camera_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Heights (for camera)"));
801         wxFlexGridSizer* camera_grid_sizer = new wxFlexGridSizer(2);
802         camera_grid_sizer->AddGrowableCol(0);
803         camera_grid_sizer->SetHGap(10);
804         camera_grid_sizer->SetVGap(4);
805
806         camera_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Dead height:")), 0, wxALIGN_CENTER_VERTICAL);
807         dead_height_field = new wxTextCtrl(main_panel, FIELD_DEAD_HEIGHT);
808         camera_grid_sizer->Add(dead_height_field, 0, wxALIGN_CENTER_VERTICAL);
809
810         camera_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Camera height:")), 0, wxALIGN_CENTER_VERTICAL);
811         camera_height_field = new wxTextCtrl(main_panel, FIELD_CAMERA_HEIGHT);
812         camera_grid_sizer->Add(camera_height_field, 0, wxALIGN_CENTER_VERTICAL);
813
814         camera_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Splash height:")), 0, wxALIGN_CENTER_VERTICAL);
815         splash_height_field = new wxTextCtrl(main_panel, FIELD_SPLASH_HEIGHT);
816         camera_grid_sizer->Add(splash_height_field, 0, wxALIGN_CENTER_VERTICAL);
817
818         camera_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Half camera separation:")), 0, wxALIGN_CENTER_VERTICAL);
819         half_camera_separation_field = new wxTextCtrl(main_panel, FIELD_HALF_CAMERA_SEPARATION);
820         camera_grid_sizer->Add(half_camera_separation_field, 0, wxALIGN_CENTER_VERTICAL);
821
822         camera_sizer->Add(camera_grid_sizer, 0, wxEXPAND);
823         camera_sizer->AddStretchSpacer();
824         physics_sizer->Add(camera_sizer, 0);    
825
826         mainbox->Add(physics_sizer, 5, wxALL, 10);
827         mainbox->Show(physics_sizer, false);
828 }
829
830 void PhysicsView::CreateShots()
831 {
832         shots_sizer = new wxBoxSizer(wxHORIZONTAL);
833         
834         wxStaticBoxSizer* shots_static_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Shot"));
835         
836         wxBoxSizer* column_1_sizer = new wxBoxSizer(wxVERTICAL);
837         
838         wxFlexGridSizer* shape_sizer = new wxFlexGridSizer(2);
839         shape_sizer->AddGrowableCol(1);
840         shape_sizer->SetHGap(10);
841         shape_sizer->SetVGap(4);
842
843         shape_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Graphic Collection:")), 0, wxALIGN_CENTER_VERTICAL);
844         shots_collection_field = new wxTextCtrl(main_panel, FIELD_SHOT_COLLECTION);
845         shape_sizer->Add(shots_collection_field, 0, wxALIGN_CENTER_VERTICAL);
846
847         shape_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Color Table:")), 0, wxALIGN_CENTER_VERTICAL);
848         shots_color_table_field = new wxTextCtrl(main_panel, FIELD_SHOT_COLOR_TABLE);
849         shape_sizer->Add(shots_color_table_field, 0, wxALIGN_CENTER_VERTICAL);
850
851         shape_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sequence:")), 0, wxALIGN_CENTER_VERTICAL);
852         shots_sequence_field = new wxTextCtrl(main_panel, FIELD_SHOT_SEQUENCE);
853         shape_sizer->Add(shots_sequence_field, 0, wxALIGN_CENTER_VERTICAL);
854
855         column_1_sizer->Add(shape_sizer, 0, wxEXPAND);
856
857         wxStaticBoxSizer* damage_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Damage"));
858
859         wxFlexGridSizer* damage_grid_sizer = new wxFlexGridSizer(2);
860         damage_grid_sizer->AddGrowableCol(0);
861         damage_grid_sizer->SetHGap(10);
862         damage_grid_sizer->SetVGap(5);
863
864         damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Type:")), 0, wxALIGN_CENTER_VERTICAL);
865         
866         std::vector<wxString> damage_strings = DefaultNames::Instance()->GetArray(wxT("damage"));
867         damage_strings.insert(damage_strings.begin(), _("None"));
868
869         shots_damage_type_choice = new wxChoice(main_panel, MENU_SHOT_DAMAGE_TYPE, wxDefaultPosition, choiceSize, damage_strings.size(), &damage_strings[0]);
870         damage_grid_sizer->Add(shots_damage_type_choice, 0, wxALIGN_CENTER_VERTICAL);
871
872         damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Base:")), 0, wxALIGN_CENTER_VERTICAL);
873         shots_damage_base_field = new wxTextCtrl(main_panel, FIELD_SHOT_DAMAGE_BASE);
874         damage_grid_sizer->Add(shots_damage_base_field, 0, wxALIGN_CENTER_VERTICAL);
875
876         damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Random:")), 0, wxALIGN_CENTER_VERTICAL);
877         shots_damage_random_field = new wxTextCtrl(main_panel, FIELD_SHOT_DAMAGE_RANDOM);
878         damage_grid_sizer->Add(shots_damage_random_field, 0, wxALIGN_CENTER_VERTICAL);
879
880         damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Scale:")), 0, wxALIGN_CENTER_VERTICAL);
881         shots_damage_scale_field = new wxTextCtrl(main_panel, FIELD_SHOT_DAMAGE_SCALE);
882         damage_grid_sizer->Add(shots_damage_scale_field, 0, wxALIGN_CENTER_VERTICAL);
883         
884         damage_sizer->Add(damage_grid_sizer, 0, wxEXPAND);
885         
886         shots_alien_damage_checkbox = new wxCheckBox(main_panel, CB_SHOT_ALIEN_DAMAGE, _("Alien Damage (varies with level)"));
887         damage_sizer->Add(shots_alien_damage_checkbox, 0, wxTOP, 5);
888
889         column_1_sizer->Add(damage_sizer, 0, wxEXPAND | wxALL, 10);
890
891         wxFlexGridSizer* shots_grid_sizer = new wxFlexGridSizer(2);
892         shots_grid_sizer->AddGrowableCol(0);
893         shots_grid_sizer->SetHGap(10);
894         shots_grid_sizer->SetVGap(4);
895         
896         std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
897         sound_strings.insert(sound_strings.begin(), GetName(wxT("sound"), -1));
898
899         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Flyby Sound:")), 0, wxALIGN_CENTER_VERTICAL);
900         shots_flyby_sound_choice = new wxChoice(main_panel, MENU_SHOT_FLYBY_SOUND, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
901         shots_grid_sizer->Add(shots_flyby_sound_choice, 0, wxALIGN_CENTER_VERTICAL);
902
903         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Rebound Sound:")), 0, wxALIGN_CENTER_VERTICAL);
904         shots_rebound_sound_choice = new wxChoice(main_panel, MENU_SHOT_REBOUND_SOUND, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
905         shots_grid_sizer->Add(shots_rebound_sound_choice, 0, wxALIGN_CENTER_VERTICAL);
906
907         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sound Pitch:")), 0, wxALIGN_CENTER_VERTICAL);
908         shots_sound_pitch_field = new wxTextCtrl(main_panel, FIELD_SHOT_SOUND_PITCH);
909         shots_grid_sizer->Add(shots_sound_pitch_field, 0, wxALIGN_CENTER_VERTICAL);
910
911         shots_grid_sizer->AddSpacer(5);
912         shots_grid_sizer->AddSpacer(5);
913
914         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Radius:")), 0, wxALIGN_CENTER_VERTICAL);
915         shots_radius_field = new wxTextCtrl(main_panel, FIELD_SHOT_RADIUS);
916         shots_grid_sizer->Add(shots_radius_field, 0, wxALIGN_CENTER_VERTICAL);
917
918         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Area of Effect:")), 0, wxALIGN_CENTER_VERTICAL);
919         shots_area_of_effect_field = new wxTextCtrl(main_panel, FIELD_SHOT_AREA_OF_EFFECT);
920         shots_grid_sizer->Add(shots_area_of_effect_field, 0, wxALIGN_CENTER_VERTICAL);
921
922         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Speed:")), 0, wxALIGN_CENTER_VERTICAL);
923         shots_speed_field = new wxTextCtrl(main_panel, FIELD_SHOT_SPEED);
924         shots_grid_sizer->Add(shots_speed_field, 0, wxALIGN_CENTER_VERTICAL);
925
926         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Maximum Range:")), 0, wxALIGN_CENTER_VERTICAL);
927         shots_range_field = new wxTextCtrl(main_panel, FIELD_SHOT_RANGE);
928         shots_grid_sizer->Add(shots_range_field, 0, wxALIGN_CENTER_VERTICAL);
929
930         shots_grid_sizer->AddSpacer(5);
931         shots_grid_sizer->AddSpacer(5);
932
933         std::vector<wxString> effect_strings = DefaultNames::Instance()->GetArray(wxT("effect"));
934         effect_strings.insert(effect_strings.begin(), GetName(wxT("sound"), -1));
935         
936         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Detonation Effect:")), 0, wxALIGN_CENTER_VERTICAL);
937         shots_detonation_effect_choice = new wxChoice(main_panel, MENU_SHOT_DETONATION_EFFECT, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
938         shots_grid_sizer->Add(shots_detonation_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
939
940         static const wxString media_effect_strings[] = {
941                 _("None"),
942                 _("Small Splash"),
943                 _("Medium Splash"),
944         };
945
946         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Media Detonation Effect:")), 0, wxALIGN_CENTER_VERTICAL);
947         shots_media_detonation_effect_choice = new wxChoice(main_panel, MENU_SHOT_MEDIA_DETONATION_EFFECT, wxDefaultPosition, choiceSize, 3, media_effect_strings);
948         shots_grid_sizer->Add(shots_media_detonation_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
949
950         shots_grid_sizer->AddSpacer(5);
951         shots_grid_sizer->AddSpacer(5);
952
953         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Contrail:")), 0, wxALIGN_CENTER_VERTICAL);
954         shots_contrail_choice = new wxChoice(main_panel, MENU_SHOT_CONTRAIL, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
955         shots_grid_sizer->Add(shots_contrail_choice, 0, wxALIGN_CENTER_VERTICAL);
956
957         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ticks between contrails:")), 0, wxALIGN_CENTER_VERTICAL);
958         shots_contrail_ticks_field = new wxTextCtrl(main_panel, FIELD_SHOT_CONTRAIL_TICKS);
959         shots_grid_sizer->Add(shots_contrail_ticks_field, 0, wxALIGN_CENTER_VERTICAL);
960
961         shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Maximum contrails:")), 0, wxALIGN_CENTER_VERTICAL);
962         shots_maximum_contrails_field = new wxTextCtrl(main_panel, FIELD_SHOT_MAXIMUM_CONTRAILS);
963         shots_grid_sizer->Add(shots_maximum_contrails_field, 0, wxALIGN_CENTER_VERTICAL);
964
965         column_1_sizer->Add(shots_grid_sizer);
966
967         shots_static_sizer->Add(column_1_sizer, 0, wxEXPAND);
968         shots_static_sizer->AddSpacer(10);
969
970         wxBoxSizer* column_2_sizer = new wxBoxSizer(wxVERTICAL);
971
972         wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
973
974         static const wxString flags_strings[] = {
975                 _("Guided"),
976                 _("Stop when animation loops"),
977                 _("Persistent"),
978                 _("Alien"),
979                 _("Affected by gravity"),
980                 _("No horizontal error"),
981                 _("No vertical error"),
982                 _("Can toggle control panels"),
983                 _("Positive vertical error"),
984                 _("Melee projectile"),
985                 _("Persistent and virulent"),
986                 _("Usually pass transparent side"),
987                 _("Sometimes pass transparent side"),
988                 _("Doubly affected by gravity"),
989                 _("Rebounds from floor"),
990                 _("Penetrates liquids"),
991                 _("Becomes item on detonation"),
992                 _("Bleeding projectile"),
993                 _("Horizontal wander"),
994                 _("Vertical wander"),
995                 _("Affected by half gravity"),
996                 _("Penetrates liquid boundary (inf)")
997         };
998
999
1000         for (int i = 0; i < 22; ++i) {
1001                 shots_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_SHOT_FLAGS + i, flags_strings[i]);
1002                 if (i > 0) {
1003                         flags_sizer->Add(shots_flags_checkboxes[i], 0, wxTOP, 2);
1004                 } else {
1005                         flags_sizer->Add(shots_flags_checkboxes[i]);
1006                 }
1007         }
1008
1009         column_2_sizer->Add(flags_sizer, 0, wxEXPAND | wxTOP | wxRIGHT | wxBOTTOM, 10);
1010
1011         wxBoxSizer* media_impact_sizer = new wxBoxSizer(wxHORIZONTAL);
1012         
1013         media_impact_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Media impact:")), 0, wxALIGN_CENTER_VERTICAL);
1014         media_impact_sizer->AddSpacer(10);
1015
1016         std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
1017         shot_strings.insert(shot_strings.begin(), GetName(wxT("shot"), -1));
1018
1019         shots_media_impact_choice = new wxChoice(main_panel, MENU_SHOT_MEDIA_IMPACT, wxDefaultPosition, choiceSize, shot_strings.size(), &shot_strings[0]);
1020         media_impact_sizer->Add(shots_media_impact_choice, 0, wxALIGN_CENTER_VERTICAL);
1021         
1022         column_2_sizer->Add(media_impact_sizer);
1023
1024         shots_static_sizer->Add(column_2_sizer, 0, wxEXPAND);
1025
1026         shots_sizer->Add(shots_static_sizer);
1027
1028         mainbox->Add(shots_sizer, 5, wxALL, 10);
1029         mainbox->Show(shots_sizer, false);
1030 }
1031
1032 void PhysicsView::CreateWeapons()
1033 {
1034         weapons_definitions_sizer = new wxBoxSizer(wxHORIZONTAL);
1035
1036         wxBoxSizer* column_1_sizer = new wxBoxSizer(wxVERTICAL);
1037
1038         wxBoxSizer* item_type_sizer = new wxBoxSizer(wxHORIZONTAL);
1039
1040         std::vector<wxString> item_strings = DefaultNames::Instance()->GetArray(wxT("item"));
1041         item_strings.insert(item_strings.begin(), _("None"));
1042
1043         item_type_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Item Type:")), 0, wxALIGN_CENTER_VERTICAL);
1044         weapon_item_type_choice = new wxChoice(main_panel, MENU_WEAPON_ITEM_TYPE, wxDefaultPosition, choiceSize, item_strings.size(), &item_strings[0]);
1045         item_type_sizer->AddSpacer(10);
1046         item_type_sizer->Add(weapon_item_type_choice, 0, wxALIGN_CENTER_VERTICAL);
1047
1048         column_1_sizer->Add(item_type_sizer, 0, wxEXPAND);
1049
1050         wxStaticBoxSizer* appearance_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Appearance"));
1051         wxFlexGridSizer* appearance_grid_sizer = new wxFlexGridSizer(2);
1052         appearance_grid_sizer->AddGrowableCol(0);
1053         appearance_grid_sizer->SetHGap(10);
1054         appearance_grid_sizer->SetVGap(4);
1055
1056         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Graphic Collection:")), 0, wxALIGN_CENTER_VERTICAL);
1057         weapon_collection_field = new wxTextCtrl(main_panel, FIELD_WEAPON_COLLECTION);
1058         appearance_grid_sizer->Add(weapon_collection_field, 0, wxALIGN_CENTER_VERTICAL);
1059
1060         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Color Table:")), 0, wxALIGN_CENTER_VERTICAL);
1061         weapon_color_table_field = new wxTextCtrl(main_panel, FIELD_WEAPON_COLOR_TABLE);
1062         appearance_grid_sizer->Add(weapon_color_table_field, 0, wxALIGN_CENTER_VERTICAL);
1063
1064         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Idle:")), 0, wxALIGN_CENTER_VERTICAL);
1065         weapon_idle_field = new wxTextCtrl(main_panel, FIELD_WEAPON_IDLE);
1066         appearance_grid_sizer->Add(weapon_idle_field, 0, wxALIGN_CENTER_VERTICAL);
1067
1068         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Firing:")), 0, wxALIGN_CENTER_VERTICAL);
1069         weapon_firing_field = new wxTextCtrl(main_panel, FIELD_WEAPON_FIRING);
1070         appearance_grid_sizer->Add(weapon_firing_field, 0, wxALIGN_CENTER_VERTICAL);
1071
1072         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Reloading:")), 0, wxALIGN_CENTER_VERTICAL);
1073         weapon_reloading_field = new wxTextCtrl(main_panel, FIELD_WEAPON_RELOADING);
1074         appearance_grid_sizer->Add(weapon_reloading_field, 0, wxALIGN_CENTER_VERTICAL);
1075
1076         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charging:")), 0, wxALIGN_CENTER_VERTICAL);
1077         weapon_charging_field = new wxTextCtrl(main_panel, FIELD_WEAPON_CHARGING);
1078         appearance_grid_sizer->Add(weapon_charging_field, 0, wxALIGN_CENTER_VERTICAL);
1079
1080         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charged:")), 0, wxALIGN_CENTER_VERTICAL);
1081         weapon_charged_field = new wxTextCtrl(main_panel, FIELD_WEAPON_CHARGED);
1082         appearance_grid_sizer->Add(weapon_charged_field, 0, wxALIGN_CENTER_VERTICAL);
1083
1084         appearance_grid_sizer->AddSpacer(10);
1085         appearance_grid_sizer->AddSpacer(10);
1086
1087         appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Flash Intensity:")), 0, wxALIGN_CENTER_VERTICAL);
1088         weapon_flash_intensity_field = new wxTextCtrl(main_panel, FIELD_WEAPON_FLASH_INTENSITY);
1089         appearance_grid_sizer->Add(weapon_flash_intensity_field, 0, wxALIGN_CENTER_VERTICAL);
1090
1091         appearance_sizer->Add(appearance_grid_sizer, 0, wxEXPAND);
1092
1093         column_1_sizer->AddSpacer(10);
1094         column_1_sizer->Add(appearance_sizer, 0, wxEXPAND);
1095
1096         wxStaticBoxSizer* timing_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Timing (all in ticks)"));
1097         wxFlexGridSizer* timing_grid_sizer = new wxFlexGridSizer(2);
1098         timing_grid_sizer->AddGrowableCol(0);
1099         timing_grid_sizer->SetHGap(10);
1100         timing_grid_sizer->SetVGap(4);
1101
1102         timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ready:")), 0, wxALIGN_CENTER_VERTICAL);
1103         weapon_ready_field = new wxTextCtrl(main_panel, FIELD_WEAPON_READY);
1104         timing_grid_sizer->Add(weapon_ready_field, 0, wxALIGN_CENTER_VERTICAL); 
1105
1106         timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Await Reload:")), 0, wxALIGN_CENTER_VERTICAL);
1107         weapon_await_reload_field = new wxTextCtrl(main_panel, FIELD_WEAPON_AWAIT_RELOAD);
1108         timing_grid_sizer->Add(weapon_await_reload_field, 0, wxALIGN_CENTER_VERTICAL);  
1109
1110         timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Loading:")), 0, wxALIGN_CENTER_VERTICAL);
1111         weapon_loading_field = new wxTextCtrl(main_panel, FIELD_WEAPON_LOADING);
1112         timing_grid_sizer->Add(weapon_loading_field, 0, wxALIGN_CENTER_VERTICAL);       
1113
1114         timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Finish Loading:")), 0, wxALIGN_CENTER_VERTICAL);
1115         weapon_finish_loading_field = new wxTextCtrl(main_panel, FIELD_WEAPON_FINISH_LOADING);
1116         timing_grid_sizer->Add(weapon_finish_loading_field, 0, wxALIGN_CENTER_VERTICAL);
1117
1118         timing_grid_sizer->AddSpacer(10);
1119         timing_grid_sizer->AddSpacer(10);
1120
1121         timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Flash Decay:")), 0, wxALIGN_CENTER_VERTICAL);
1122         weapon_flash_decay_field = new wxTextCtrl(main_panel, FIELD_WEAPON_FLASH_DECAY);
1123         timing_grid_sizer->Add(weapon_flash_decay_field, 0, wxALIGN_CENTER_VERTICAL);
1124
1125         timing_sizer->Add(timing_grid_sizer, 0, wxEXPAND);
1126
1127         column_1_sizer->AddSpacer(10);
1128         column_1_sizer->Add(timing_sizer, 0, wxEXPAND);
1129
1130         weapons_definitions_sizer->Add(column_1_sizer);
1131
1132         wxBoxSizer* column_2_sizer = new wxBoxSizer(wxVERTICAL);
1133
1134         wxBoxSizer* weapon_class_sizer = new wxBoxSizer(wxHORIZONTAL);
1135
1136         const wxString weapon_class_names[] = {
1137                 _("None"),
1138                 _("Melee"),
1139                 _("Single Function"),
1140                 _("Dual Function"),
1141                 _("Two-Fisted"),
1142                 _("Multipurpose")
1143         };
1144
1145         weapon_class_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Weapon Class:")), 0, wxALIGN_CENTER_VERTICAL);
1146         weapon_class_choice = new wxChoice(main_panel, MENU_WEAPON_CLASS, wxDefaultPosition, choiceSize, 6, weapon_class_names);
1147         weapon_class_sizer->AddSpacer(10);
1148         weapon_class_sizer->Add(weapon_class_choice, 0, wxALIGN_CENTER_VERTICAL);
1149
1150         column_2_sizer->Add(weapon_class_sizer, 0, wxEXPAND);
1151
1152         wxStaticBoxSizer* height_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Height and Idle"));
1153         wxFlexGridSizer* height_grid_sizer = new wxFlexGridSizer(2);
1154         height_grid_sizer->AddGrowableCol(0);
1155         height_grid_sizer->SetHGap(10);
1156         height_grid_sizer->SetVGap(4);
1157
1158         height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Idle Height:")), 0, wxALIGN_CENTER_VERTICAL);
1159         weapon_idle_height_field = new wxTextCtrl(main_panel, FIELD_WEAPON_IDLE_HEIGHT);
1160         height_grid_sizer->Add(weapon_idle_height_field, 0, wxALIGN_CENTER_VERTICAL);   
1161
1162         height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Bob Amplitude:")), 0, wxALIGN_CENTER_VERTICAL);
1163         weapon_bob_amplitude_field = new wxTextCtrl(main_panel, FIELD_WEAPON_BOB_AMPLITUDE);
1164         height_grid_sizer->Add(weapon_bob_amplitude_field, 0, wxALIGN_CENTER_VERTICAL); 
1165
1166         height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Kick Height:")), 0, wxALIGN_CENTER_VERTICAL);
1167         weapon_kick_height_field = new wxTextCtrl(main_panel, FIELD_WEAPON_KICK_HEIGHT);
1168         height_grid_sizer->Add(weapon_kick_height_field, 0, wxALIGN_CENTER_VERTICAL);   
1169
1170         height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Reload Height:")), 0, wxALIGN_CENTER_VERTICAL);
1171         weapon_reload_height_field = new wxTextCtrl(main_panel, FIELD_WEAPON_RELOAD_HEIGHT);
1172         height_grid_sizer->Add(weapon_reload_height_field, 0, wxALIGN_CENTER_VERTICAL);
1173
1174         height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Idle Width:")), 0, wxALIGN_CENTER_VERTICAL);
1175         weapon_idle_width_field = new wxTextCtrl(main_panel, FIELD_WEAPON_IDLE_WIDTH);
1176         height_grid_sizer->Add(weapon_idle_width_field, 0, wxALIGN_CENTER_VERTICAL);
1177
1178         height_sizer->Add(height_grid_sizer, 0, wxEXPAND);
1179         
1180         column_2_sizer->AddSpacer(10);
1181         column_2_sizer->Add(height_sizer, 0, wxEXPAND);
1182
1183         wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
1184         static const wxString flags_strings[] = {
1185                 _("Automatic"),
1186                 _("Disappears after use"),
1187                 _("Plays instant shell casing sound"),
1188                 _("Overloads"),
1189                 _("Random ammo on pickup"),
1190                 _("Reloads in one hand"),
1191                 _("Fires out of phase"),
1192                 _("Fires under liquids"),
1193                 _("Triggers share ammo"),
1194                 _("Angular flipping on 2nd trigger")
1195         };
1196
1197         for (int i = 0; i < 10; ++i) {
1198                 weapon_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_WEAPON_FLAGS + i, flags_strings[i]);
1199                 if (i > 0) {
1200                         flags_sizer->Add(weapon_flags_checkboxes[i], 0, wxALIGN_CENTER_VERTICAL | wxTOP, 2);
1201                 } else {
1202                         flags_sizer->Add(weapon_flags_checkboxes[i], 0, wxALIGN_CENTER_VERTICAL);
1203                 }
1204         }
1205
1206         column_2_sizer->AddSpacer(10);
1207         column_2_sizer->Add(flags_sizer, 0, wxEXPAND);
1208
1209         weapons_definitions_sizer->AddSpacer(10);
1210         weapons_definitions_sizer->Add(column_2_sizer);
1211
1212         mainbox->Add(weapons_definitions_sizer, 5, wxALL, 10);
1213         mainbox->Show(weapons_definitions_sizer, false);
1214
1215         weapons_triggers_sizer = new wxBoxSizer(wxVERTICAL);
1216
1217         static const wxString trigger_names[] = {
1218                 _("Main Trigger"),
1219                 _("Secondary Trigger")
1220         };
1221
1222         std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
1223         shot_strings.insert(shot_strings.begin(), _("None"));
1224
1225         std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
1226         sound_strings.insert(sound_strings.begin(), _("None"));
1227
1228         for (int i = 0; i < 2; ++i) {
1229                 int id_offset = i * NUM_TRIGGER_IDS;
1230                 wxStaticBoxSizer* static_box_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, trigger_names[i]);
1231                 wxBoxSizer* column_1_sizer = new wxBoxSizer(wxVERTICAL);
1232
1233                 wxFlexGridSizer* left_grid_sizer = new wxFlexGridSizer(2);
1234                 left_grid_sizer->AddGrowableCol(0);
1235                 left_grid_sizer->SetHGap(10);
1236                 left_grid_sizer->SetVGap(4);
1237
1238                 left_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Projectile:")), 0, wxALIGN_CENTER_VERTICAL);
1239                 trigger_projectile_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_PROJECTILE + id_offset, wxDefaultPosition, choiceSize, shot_strings.size(), &shot_strings[0]);
1240                 left_grid_sizer->Add(trigger_projectile_choices[i]);
1241
1242                 left_grid_sizer->AddSpacer(10);
1243                 left_grid_sizer->AddSpacer(10);
1244
1245                 left_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Rounds/magazine:")), 0, wxALIGN_CENTER_VERTICAL);
1246                 trigger_rounds_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_ROUNDS + id_offset);
1247                 left_grid_sizer->Add(trigger_rounds_fields[i], 0, wxALIGN_CENTER_VERTICAL);
1248
1249                 column_1_sizer->Add(left_grid_sizer, 0, wxEXPAND);
1250
1251                 wxStaticBoxSizer* sounds_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Sounds"));
1252                 wxFlexGridSizer* sounds_grid_sizer = new wxFlexGridSizer(2);
1253                 sounds_grid_sizer->AddGrowableCol(0);
1254                 sounds_grid_sizer->SetHGap(10);
1255                 sounds_grid_sizer->SetVGap(4);
1256
1257                 sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Firing:")), 0, wxALIGN_CENTER_VERTICAL);
1258                 trigger_firing_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_FIRING + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
1259                 sounds_grid_sizer->Add(trigger_firing_choices[i]);
1260
1261                 sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Click:")), 0, wxALIGN_CENTER_VERTICAL);
1262                 trigger_click_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_CLICK + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
1263                 sounds_grid_sizer->Add(trigger_click_choices[i]);
1264
1265                 sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charging:")), 0, wxALIGN_CENTER_VERTICAL);
1266                 trigger_charging_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_CHARGING + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
1267                 sounds_grid_sizer->Add(trigger_charging_choices[i]);
1268
1269                 sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Shell Casing:")), 0, wxALIGN_CENTER_VERTICAL);
1270                 trigger_shell_casing_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_SHELL_CASING + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
1271                 sounds_grid_sizer->Add(trigger_shell_casing_choices[i]);
1272
1273                 sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Reloading:")), 0, wxALIGN_CENTER_VERTICAL);
1274                 trigger_reloading_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_RELOADING + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
1275                 sounds_grid_sizer->Add(trigger_reloading_choices[i]);
1276
1277                 sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charged:")), 0, wxALIGN_CENTER_VERTICAL);
1278                 trigger_charged_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_CHARGED + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
1279                 sounds_grid_sizer->Add(trigger_charged_choices[i]);
1280
1281                 sounds_sizer->Add(sounds_grid_sizer);
1282
1283                 column_1_sizer->Add(sounds_sizer, 0, wxEXPAND | wxALL, 10);
1284
1285                 static_box_sizer->Add(column_1_sizer, 0, wxEXPAND);
1286
1287                 wxFlexGridSizer* right_grid_sizer = new wxFlexGridSizer(2);
1288                 right_grid_sizer->AddGrowableCol(0);
1289                 right_grid_sizer->SetHGap(10);
1290                 right_grid_sizer->SetVGap(4);
1291
1292                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ammo Type:")), 0, wxALIGN_CENTER_VERTICAL);
1293                 trigger_ammo_type_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_AMMO_TYPE + id_offset, wxDefaultPosition, choiceSize, item_strings.size(), &item_strings[0]);
1294                 right_grid_sizer->Add(trigger_ammo_type_choices[i]);
1295
1296                 right_grid_sizer->AddSpacer(10);
1297                 right_grid_sizer->AddSpacer(10);
1298
1299                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ticks/round:")), 0, wxALIGN_CENTER_VERTICAL);
1300                 trigger_ticks_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_TICKS + id_offset);
1301                 right_grid_sizer->Add(trigger_ticks_fields[i], 0, wxALIGN_CENTER_VERTICAL);             
1302
1303                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Recovery Ticks:")), 0, wxALIGN_CENTER_VERTICAL);
1304                 trigger_recovery_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_RECOVERY + id_offset);
1305                 right_grid_sizer->Add(trigger_recovery_fields[i], 0, wxALIGN_CENTER_VERTICAL);          
1306
1307                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charging Ticks:")), 0, wxALIGN_CENTER_VERTICAL);
1308                 trigger_charging_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_CHARGING + id_offset);
1309                 right_grid_sizer->Add(trigger_charging_fields[i], 0, wxALIGN_CENTER_VERTICAL);          
1310
1311                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Recoil Magnitude:")), 0, wxALIGN_CENTER_VERTICAL);
1312                 trigger_recoil_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_RECOIL + id_offset);
1313                 right_grid_sizer->Add(trigger_recoil_fields[i], 0, wxALIGN_CENTER_VERTICAL);            
1314
1315                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Theta Error:")), 0, wxALIGN_CENTER_VERTICAL);
1316                 trigger_theta_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_THETA + id_offset);
1317                 right_grid_sizer->Add(trigger_theta_fields[i], 0, wxALIGN_CENTER_VERTICAL);             
1318
1319                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dx:")), 0, wxALIGN_CENTER_VERTICAL);
1320                 trigger_dx_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_DX + id_offset);
1321                 right_grid_sizer->Add(trigger_dx_fields[i], 0, wxALIGN_CENTER_VERTICAL);                
1322
1323                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dz:")), 0, wxALIGN_CENTER_VERTICAL);
1324                 trigger_dz_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_DZ + id_offset);
1325                 right_grid_sizer->Add(trigger_dz_fields[i], 0, wxALIGN_CENTER_VERTICAL);
1326
1327                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Burst Count:")), 0, wxALIGN_CENTER_VERTICAL);
1328                 trigger_burst_count_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_BURST_COUNT + id_offset);
1329                 right_grid_sizer->Add(trigger_burst_count_fields[i], 0, wxALIGN_CENTER_VERTICAL);
1330
1331                 right_grid_sizer->AddSpacer(10);
1332                 right_grid_sizer->AddSpacer(10);
1333
1334                 static const wxString shell_casing_type_strings[] = {
1335                         _("None"),
1336                         _("Assault Rifle"),
1337                         _("Pistol Center"),
1338                         _("Pistol Left"),
1339                         _("Pistol Right"),
1340                         _("SMG")
1341                 };
1342
1343                 right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Shell casing type:")), 0, wxALIGN_CENTER_VERTICAL);
1344                 trigger_shell_casing_type_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_SHELL_CASING_TYPE + id_offset, wxDefaultPosition, choiceSize, 6, shell_casing_type_strings);
1345                 right_grid_sizer->Add(trigger_shell_casing_type_choices[i]);            
1346
1347                 static_box_sizer->AddSpacer(20);
1348                 static_box_sizer->Add(right_grid_sizer, 0, wxEXPAND);
1349                 
1350                 if (i == 1) {
1351                         weapons_triggers_sizer->AddSpacer(10);
1352                 }
1353
1354                 weapons_triggers_sizer->Add(static_box_sizer);
1355         }
1356
1357         mainbox->Add(weapons_triggers_sizer, 5, wxALL, 10);
1358         mainbox->Show(weapons_triggers_sizer, false);
1359 }
1360
1361 bool PhysicsView::OnCreate(wxDocument* doc, long flags)
1362 {
1363         wxString frameTitle = wxT("ShapeFusion : Physics : ");
1364         frameTitle.Append(doc->GetFilename());
1365
1366         mFrame = wxGetApp().CreateChildFrame(doc, this, frameTitle, wxDefaultPosition, wxDefaultSize);
1367
1368         mainbox = new wxBoxSizer(wxHORIZONTAL);
1369         main_panel = new wxPanel(mFrame);
1370         main_panel->Show();
1371         tree = new wxTreeCtrl(main_panel, -1, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT);
1372         tree->DeleteAllItems();
1373         wxTreeItemId treeroot = tree->AddRoot(doc->GetFilename());
1374         mainbox->Add(tree, 2, wxEXPAND);
1375
1376         // empty space
1377         dummy_sizer = new wxBoxSizer(wxVERTICAL);
1378         wxPanel* dummy_panel = new wxPanel(main_panel);
1379         dummy_sizer->Add(dummy_panel, 1, wxEXPAND);
1380         mainbox->Add(dummy_sizer, 5);
1381
1382         CreateAliens();
1383         CreateEffects();
1384         CreatePhysicsConstants();
1385         CreateShots();
1386         CreateWeapons();
1387
1388         mainbox->Show(dummy_sizer, false);
1389         mainbox->Show(weapons_triggers_sizer, true);
1390
1391         mainbox->Layout();
1392         main_panel->SetSizer(mainbox);
1393         mainbox->SetSizeHints(mFrame);
1394         mainbox->Fit(mFrame);
1395
1396         menubar = mFrame->GetMenuBar();
1397
1398         mainbox->Show(dummy_sizer, true);
1399         mainbox->Show(weapons_triggers_sizer, false);
1400
1401         // because we changed size
1402         mFrame->Centre(wxBOTH);
1403
1404         mFrame->Show(true);
1405         Activate(true);
1406
1407         return true;
1408 }
1409
1410 void PhysicsView::OnUpdate(wxView*, wxObject*)
1411 {
1412         wxTreeItemId aliens = tree->AppendItem(tree->GetRootItem(), _("Aliens"), -1, -1, new PhysicsTreeItemData());
1413         unsigned int monster_count = static_cast<PhysicsDocument*>(GetDocument())->MonsterCount();
1414         for (unsigned int i = 0; i < monster_count; ++i) {
1415                 wxTreeItemId alien = tree->AppendItem(aliens, GetName(wxT("alien"), i), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS));
1416                 
1417                 tree->AppendItem(alien, _("Appearance and Sounds"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_APPEARANCE));
1418                 tree->AppendItem(alien, _("Combat Settings"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_COMBAT));
1419                 tree->AppendItem(alien, _("Physical Constants"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_CONSTANTS));
1420                 tree->AppendItem(alien, _("Behavior Settings"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_BEHAVIOR));
1421                 tree->AppendItem(alien, _("Immunities and Weaknesses"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_IMMUNITIES));
1422         }
1423
1424         wxTreeItemId effects = tree->AppendItem(tree->GetRootItem(), _("Effects"), -1, -1, new PhysicsTreeItemData());
1425         unsigned int effect_count = static_cast<PhysicsDocument*>(GetDocument())->EffectCount();
1426         for (unsigned int i = 0; i < effect_count; ++i) {
1427                 tree->AppendItem(effects, GetName(wxT("effect"), i), -1, -1, new PhysicsTreeItemData(i, TREESECTION_EFFECTS));
1428         }
1429
1430         wxTreeItemId shots = tree->AppendItem(tree->GetRootItem(), _("Shots"), -1, -1, new PhysicsTreeItemData());
1431         unsigned int projectile_count = static_cast<PhysicsDocument*>(GetDocument())->ProjectileCount();
1432         for (unsigned int i = 0; i < projectile_count; ++i) {
1433                 tree->AppendItem(shots, GetName(wxT("shot"), i), -1 ,-1, new PhysicsTreeItemData(i, TREESECTION_PROJECTILES));
1434         }
1435
1436         wxTreeItemId physics = tree->AppendItem(tree->GetRootItem(), _("Physics"), -1, -1, new PhysicsTreeItemData());
1437         tree->AppendItem(physics, _("Walking"), -1, -1, new PhysicsTreeItemData(0, TREESECTION_PHYSICS));
1438         tree->AppendItem(physics, _("Running"), -1, -1, new PhysicsTreeItemData(1, TREESECTION_PHYSICS));
1439
1440         wxTreeItemId weapons = tree->AppendItem(tree->GetRootItem(), _("Weapons"), -1, -1, new PhysicsTreeItemData());
1441         unsigned int weapon_count = static_cast<PhysicsDocument*>(GetDocument())->WeaponCount();
1442         for (unsigned i = 0; i < weapon_count; ++i) {
1443                 wxTreeItemId weapon = tree->AppendItem(weapons, GetName(wxT("weapon"), i), -1, -1, new PhysicsTreeItemData(i, TREESECTION_WEAPONS));
1444                 
1445                 tree->AppendItem(weapon, _("Weapon Definition"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_WEAPONS_SETTINGS));
1446                 tree->AppendItem(weapon, _("Trigger Settings"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_WEAPONS_TRIGGERS));
1447         }
1448 }
1449
1450 void PhysicsView::OnDraw(wxDC* dc)
1451 {
1452 }
1453
1454 bool PhysicsView::OnClose(bool deleteWindow)
1455 {
1456         if (!GetDocument()->Close())
1457                 return false;
1458         Activate(false);
1459         if (deleteWindow) {
1460                 delete mFrame;
1461                 return true;
1462         }
1463         return true;
1464 }
1465