2 * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
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.
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.
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
19 // For compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
26 #include "PhysicsView.h"
27 #include "PhysicsTreeItemData.h"
29 #include "../DefaultNames.h"
31 const wxSize choiceSize(200, -1);
34 void PhysicsView::CreateAliens()
36 aliens_appearance_sizer = new wxBoxSizer(wxHORIZONTAL);
38 wxStaticBoxSizer* appearance_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Appearance"));
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
104 appearance_sizer->Add(appearance_grid_sizer);
106 aliens_appearance_sizer->Add(appearance_sizer);
107 aliens_appearance_sizer->AddSpacer(10);
109 wxStaticBoxSizer* sounds_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Sounds"));
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);
116 std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
117 sound_strings.insert(sound_strings.begin(), GetName(wxT("sound"), -1));
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);
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);
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);
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);
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);
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);
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);
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);
151 sounds_grid_sizer->AddSpacer(10);
152 sounds_grid_sizer->AddSpacer(10);
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);
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);
162 sounds_sizer->Add(sounds_grid_sizer);
164 aliens_appearance_sizer->Add(sounds_sizer);
166 mainbox->Add(aliens_appearance_sizer, 5, wxALL, 10);
167 mainbox->Show(aliens_appearance_sizer, false);
169 aliens_combat_sizer = new wxBoxSizer(wxHORIZONTAL);
171 wxFlexGridSizer* combat_grid_sizer = new wxFlexGridSizer(2);
172 combat_grid_sizer->SetHGap(10);
173 combat_grid_sizer->SetVGap(10);
175 wxBoxSizer* attack_frequency_sizer = new wxBoxSizer(wxHORIZONTAL);
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);
182 combat_grid_sizer->Add(attack_frequency_sizer);
183 combat_grid_sizer->AddSpacer(0);
185 std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
186 shot_strings.insert(shot_strings.begin(), GetName(wxT("shot"), -1));
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);
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);
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);
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);
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);
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);
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);
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);
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);
228 attack_sizer->Add(attack_grid_sizer, 0, wxEXPAND);
230 combat_grid_sizer->Add(attack_sizer, 0, wxEXPAND);
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);
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);
243 std::vector<wxString> damage_strings = DefaultNames::Instance()->GetArray(wxT("damage"));
244 damage_strings.insert(damage_strings.begin(), _("None"));
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);
250 shrapnel_sizer->Add(shrapnel_grid_sizer, 0, wxEXPAND);
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);
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);
260 // make the fields line up with the grid above
261 shrapnel_grid_sizer2->AddSpacer(0);
262 shrapnel_grid_sizer2->Add(choiceSize.GetWidth(), 0);
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);
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);
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);
276 shrapnel_sizer->Add(shrapnel_grid_sizer2, 0, wxEXPAND);
278 combat_grid_sizer->Add(shrapnel_sizer, 0, wxEXPAND);
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);
286 std::vector<wxString> effect_strings = DefaultNames::Instance()->GetArray(wxT("effect"));
287 effect_strings.insert(effect_strings.begin(), GetName(wxT("sound"), -1));
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);
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);
297 impact_effects_sizer->Add(impact_effects_grid_sizer, 0, wxEXPAND);
299 combat_grid_sizer->Add(impact_effects_sizer, 0, wxEXPAND);
301 aliens_combat_sizer->Add(combat_grid_sizer);
303 mainbox->Add(aliens_combat_sizer, 5, wxALL, 10);
304 mainbox->Show(aliens_combat_sizer, false);
306 aliens_constants_sizer = new wxBoxSizer(wxVERTICAL);
308 wxFlexGridSizer* constants_grid_sizer = new wxFlexGridSizer(2);
309 constants_grid_sizer->SetHGap(10);
310 constants_grid_sizer->SetVGap(10);
312 wxFlexGridSizer* vitality_grid_sizer = new wxFlexGridSizer(2);
313 vitality_grid_sizer->AddGrowableCol(0);
314 vitality_grid_sizer->SetHGap(10);
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);
320 constants_grid_sizer->Add(vitality_grid_sizer, 0, wxEXPAND);
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);
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);
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);
335 constants_grid_sizer->Add(radius_height_sizer, 0, wxEXPAND);
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);
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);
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);
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);
355 movement_grid_sizer->AddSpacer(10);
356 movement_grid_sizer->AddSpacer(10);
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);
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);
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);
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);
374 movement_grid_sizer->AddSpacer(10);
375 movement_grid_sizer->AddSpacer(10);
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);
381 movement_sizer->Add(movement_grid_sizer, 0, wxEXPAND);
383 constants_grid_sizer->Add(movement_sizer, 0, wxEXPAND);
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);
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);
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);
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);
403 perception_sizer->Add(perception_grid_sizer, 0, wxEXPAND);
405 constants_grid_sizer->Add(perception_sizer, 0, wxEXPAND);
407 aliens_constants_sizer->Add(constants_grid_sizer);
408 aliens_constants_sizer->AddSpacer(10);
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);
415 std::vector<wxString> item_strings = DefaultNames::Instance()->GetArray(wxT("item"));
416 item_strings.insert(item_strings.begin(), _("None"));
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);
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);
426 aliens_constants_sizer->Add(carrying_grid_sizer);
428 mainbox->Add(aliens_constants_sizer, 5, wxALL, 10);
429 mainbox->Show(aliens_constants_sizer, false);
431 aliens_behavior_sizer = new wxBoxSizer(wxVERTICAL);
433 wxBoxSizer* class_sizer = new wxBoxSizer(wxHORIZONTAL);
435 std::vector<wxString> class_strings = DefaultNames::Instance()->GetArray(wxT("class"));
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);
442 aliens_behavior_sizer->Add(class_sizer);
444 wxStaticBoxSizer* friends_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Friends"));
445 wxGridSizer* friends_grid_sizer = new wxGridSizer(4);
446 friends_grid_sizer->SetVGap(2);
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));
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);
459 friends_sizer->Add(friends_grid_sizer, 0, wxEXPAND);
461 aliens_behavior_sizer->AddSpacer(10);
462 aliens_behavior_sizer->Add(friends_sizer, 0, wxEXPAND);
464 wxStaticBoxSizer* enemies_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Enemies"));
465 wxGridSizer* enemies_grid_sizer = new wxGridSizer(4);
466 enemies_grid_sizer->SetVGap(2);
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));
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);
478 enemies_sizer->Add(enemies_grid_sizer, 0, wxEXPAND);
480 aliens_behavior_sizer->AddSpacer(10);
481 aliens_behavior_sizer->Add(enemies_sizer, 0, wxEXPAND);
483 const wxString flags_strings[] = {
491 _("Uses Sniper Ledges"),
493 _("Subtly Invisible"),
497 _("Delayed Hard Death"),
498 _("Fires Symmetrically"),
499 _("Nuclear Hard Death"),
500 _("Can't Fire Backwards"),
502 _("Stay with Clear Shot"),
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"),
513 const int flags_layout[] = {
525 wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
526 wxGridSizer* flags_grid_sizer = new wxGridSizer(3);
527 flags_grid_sizer->SetVGap(2);
529 for (int i = 0; i < 27; ++i) {
530 alien_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_FLAGS + i, flags_strings[i]);
533 for (int i = 0; i < 27; ++i) {
534 flags_grid_sizer->Add(alien_flags_checkboxes[flags_layout[i]], 0, wxALIGN_CENTER_VERTICAL);
537 flags_sizer->Add(flags_grid_sizer, 0, wxEXPAND);
539 aliens_behavior_sizer->AddSpacer(10);
540 aliens_behavior_sizer->Add(flags_sizer, 0, wxEXPAND);
542 mainbox->Add(aliens_behavior_sizer, 5, wxALL, 10);
543 mainbox->Show(aliens_behavior_sizer, false);
545 aliens_immunities_sizer = new wxBoxSizer(wxVERTICAL);
547 wxStaticBoxSizer* immunities_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Immunities"));
548 wxGridSizer* immunities_grid_sizer = new wxGridSizer(4);
549 immunities_grid_sizer->SetVGap(2);
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));
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);
561 immunities_sizer->Add(immunities_grid_sizer, 0, wxEXPAND);
563 aliens_immunities_sizer->Add(immunities_sizer, 0, wxEXPAND);
565 wxStaticBoxSizer* weaknesses_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Weaknesses"));
566 wxGridSizer* weaknesses_grid_sizer = new wxGridSizer(4);
567 weaknesses_grid_sizer->SetVGap(2);
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));
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);
579 weaknesses_sizer->Add(weaknesses_grid_sizer, 0, wxEXPAND);
581 aliens_immunities_sizer->AddSpacer(10);
582 aliens_immunities_sizer->Add(weaknesses_sizer, 0, wxEXPAND);
584 mainbox->Add(aliens_immunities_sizer, 5, wxALL, 10);
585 mainbox->Show(aliens_immunities_sizer, false);
588 void PhysicsView::CreateEffects()
590 effects_sizer = new wxBoxSizer(wxHORIZONTAL);
592 wxStaticBoxSizer* effects_static_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Effect"));
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);
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);
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);
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);
611 effects_grid_sizer->AddSpacer(10);
612 effects_grid_sizer->AddSpacer(10);
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);
618 effects_grid_sizer->AddSpacer(10);
619 effects_grid_sizer->AddSpacer(10);
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);
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));
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);
633 effects_static_sizer->Add(effects_grid_sizer);
635 effects_static_sizer->AddSpacer(10);
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);
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);
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);
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);
652 effects_sizer->Add(effects_static_sizer);
654 mainbox->Add(effects_sizer, 5, wxALL, 10);
655 mainbox->Show(effects_sizer, false);
658 void PhysicsView::CreatePhysicsConstants()
661 physics_sizer = new wxFlexGridSizer(2);
662 physics_sizer->SetHGap(10);
663 physics_sizer->SetVGap(20);
665 wxStaticBoxSizer* movement_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Movement"));
666 wxFlexGridSizer* movement_grid_sizer = new wxFlexGridSizer(2);
668 movement_grid_sizer->AddGrowableCol(0);
669 movement_grid_sizer->SetHGap(10);
670 movement_grid_sizer->SetVGap(4);
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);
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);
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);
684 movement_grid_sizer->AddSpacer(10);
685 movement_grid_sizer->AddSpacer(10);
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);
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);
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);
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);
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);
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);
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);
715 movement_sizer->Add(movement_grid_sizer, 0, wxEXPAND);
716 physics_sizer->Add(movement_sizer, 0, wxEXPAND);
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);
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);
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);
733 steps_sizer->Add(steps_grid_sizer, 0, wxEXPAND);
735 steps_player_size_sizer->Add(steps_sizer, 0, wxEXPAND);
736 steps_player_size_sizer->AddSpacer(10);
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);
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);
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);
752 size_sizer->Add(size_grid_sizer, 0, wxEXPAND);
754 steps_player_size_sizer->Add(size_sizer, 0, wxEXPAND);
755 steps_player_size_sizer->AddStretchSpacer();
757 physics_sizer->Add(steps_player_size_sizer, 0, wxEXPAND);
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);
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);
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);
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);
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);
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);
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);
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);
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);
797 turning_sizer->Add(turning_grid_sizer, 0, wxEXPAND);
798 physics_sizer->Add(turning_sizer, 0);
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);
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);
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);
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);
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);
822 camera_sizer->Add(camera_grid_sizer, 0, wxEXPAND);
823 camera_sizer->AddStretchSpacer();
824 physics_sizer->Add(camera_sizer, 0);
826 mainbox->Add(physics_sizer, 5, wxALL, 10);
827 mainbox->Show(physics_sizer, false);
830 void PhysicsView::CreateShots()
832 shots_sizer = new wxBoxSizer(wxHORIZONTAL);
834 wxStaticBoxSizer* shots_static_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Shot"));
836 wxBoxSizer* column_1_sizer = new wxBoxSizer(wxVERTICAL);
838 wxFlexGridSizer* shape_sizer = new wxFlexGridSizer(2);
839 shape_sizer->AddGrowableCol(1);
840 shape_sizer->SetHGap(10);
841 shape_sizer->SetVGap(4);
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);
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);
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);
855 column_1_sizer->Add(shape_sizer, 0, wxEXPAND);
857 wxStaticBoxSizer* damage_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Damage"));
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);
864 damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Type:")), 0, wxALIGN_CENTER_VERTICAL);
866 std::vector<wxString> damage_strings = DefaultNames::Instance()->GetArray(wxT("damage"));
867 damage_strings.insert(damage_strings.begin(), _("None"));
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);
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);
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);
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);
884 damage_sizer->Add(damage_grid_sizer, 0, wxEXPAND);
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);
889 column_1_sizer->Add(damage_sizer, 0, wxEXPAND | wxALL, 10);
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);
896 std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
897 sound_strings.insert(sound_strings.begin(), GetName(wxT("sound"), -1));
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);
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);
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);
911 shots_grid_sizer->AddSpacer(5);
912 shots_grid_sizer->AddSpacer(5);
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);
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);
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);
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);
930 shots_grid_sizer->AddSpacer(5);
931 shots_grid_sizer->AddSpacer(5);
933 std::vector<wxString> effect_strings = DefaultNames::Instance()->GetArray(wxT("effect"));
934 effect_strings.insert(effect_strings.begin(), GetName(wxT("sound"), -1));
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);
940 static const wxString media_effect_strings[] = {
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);
950 shots_grid_sizer->AddSpacer(5);
951 shots_grid_sizer->AddSpacer(5);
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);
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);
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);
965 column_1_sizer->Add(shots_grid_sizer);
967 shots_static_sizer->Add(column_1_sizer, 0, wxEXPAND);
968 shots_static_sizer->AddSpacer(10);
970 wxBoxSizer* column_2_sizer = new wxBoxSizer(wxVERTICAL);
972 wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
974 static const wxString flags_strings[] = {
976 _("Stop when animation loops"),
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)")
1000 for (int i = 0; i < 22; ++i) {
1001 shots_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_SHOT_FLAGS + i, flags_strings[i]);
1003 flags_sizer->Add(shots_flags_checkboxes[i], 0, wxTOP, 2);
1005 flags_sizer->Add(shots_flags_checkboxes[i]);
1009 column_2_sizer->Add(flags_sizer, 0, wxEXPAND | wxTOP | wxRIGHT | wxBOTTOM, 10);
1011 wxBoxSizer* media_impact_sizer = new wxBoxSizer(wxHORIZONTAL);
1013 media_impact_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Media impact:")), 0, wxALIGN_CENTER_VERTICAL);
1014 media_impact_sizer->AddSpacer(10);
1016 std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
1017 shot_strings.insert(shot_strings.begin(), GetName(wxT("shot"), -1));
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);
1022 column_2_sizer->Add(media_impact_sizer);
1024 shots_static_sizer->Add(column_2_sizer, 0, wxEXPAND);
1026 shots_sizer->Add(shots_static_sizer);
1028 mainbox->Add(shots_sizer, 5, wxALL, 10);
1029 mainbox->Show(shots_sizer, false);
1032 void PhysicsView::CreateWeapons()
1034 weapons_definitions_sizer = new wxBoxSizer(wxHORIZONTAL);
1036 wxBoxSizer* column_1_sizer = new wxBoxSizer(wxVERTICAL);
1038 wxBoxSizer* item_type_sizer = new wxBoxSizer(wxHORIZONTAL);
1040 std::vector<wxString> item_strings = DefaultNames::Instance()->GetArray(wxT("item"));
1041 item_strings.insert(item_strings.begin(), _("None"));
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);
1048 column_1_sizer->Add(item_type_sizer, 0, wxEXPAND);
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);
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);
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);
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);
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);
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);
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);
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);
1084 appearance_grid_sizer->AddSpacer(10);
1085 appearance_grid_sizer->AddSpacer(10);
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);
1091 appearance_sizer->Add(appearance_grid_sizer, 0, wxEXPAND);
1093 column_1_sizer->AddSpacer(10);
1094 column_1_sizer->Add(appearance_sizer, 0, wxEXPAND);
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);
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);
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);
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);
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);
1118 timing_grid_sizer->AddSpacer(10);
1119 timing_grid_sizer->AddSpacer(10);
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);
1125 timing_sizer->Add(timing_grid_sizer, 0, wxEXPAND);
1127 column_1_sizer->AddSpacer(10);
1128 column_1_sizer->Add(timing_sizer, 0, wxEXPAND);
1130 weapons_definitions_sizer->Add(column_1_sizer);
1132 wxBoxSizer* column_2_sizer = new wxBoxSizer(wxVERTICAL);
1134 wxBoxSizer* weapon_class_sizer = new wxBoxSizer(wxHORIZONTAL);
1136 const wxString weapon_class_names[] = {
1139 _("Single Function"),
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);
1150 column_2_sizer->Add(weapon_class_sizer, 0, wxEXPAND);
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);
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);
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);
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);
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);
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);
1178 height_sizer->Add(height_grid_sizer, 0, wxEXPAND);
1180 column_2_sizer->AddSpacer(10);
1181 column_2_sizer->Add(height_sizer, 0, wxEXPAND);
1183 wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
1184 static const wxString flags_strings[] = {
1186 _("Disappears after use"),
1187 _("Plays instant shell casing sound"),
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")
1197 for (int i = 0; i < 10; ++i) {
1198 weapon_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_WEAPON_FLAGS + i, flags_strings[i]);
1200 flags_sizer->Add(weapon_flags_checkboxes[i], 0, wxALIGN_CENTER_VERTICAL | wxTOP, 2);
1202 flags_sizer->Add(weapon_flags_checkboxes[i], 0, wxALIGN_CENTER_VERTICAL);
1206 column_2_sizer->AddSpacer(10);
1207 column_2_sizer->Add(flags_sizer, 0, wxEXPAND);
1209 weapons_definitions_sizer->AddSpacer(10);
1210 weapons_definitions_sizer->Add(column_2_sizer);
1212 mainbox->Add(weapons_definitions_sizer, 5, wxALL, 10);
1213 mainbox->Show(weapons_definitions_sizer, false);
1215 weapons_triggers_sizer = new wxBoxSizer(wxVERTICAL);
1217 static const wxString trigger_names[] = {
1219 _("Secondary Trigger")
1222 std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
1223 shot_strings.insert(shot_strings.begin(), _("None"));
1225 std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
1226 sound_strings.insert(sound_strings.begin(), _("None"));
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);
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);
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]);
1242 left_grid_sizer->AddSpacer(10);
1243 left_grid_sizer->AddSpacer(10);
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);
1249 column_1_sizer->Add(left_grid_sizer, 0, wxEXPAND);
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);
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]);
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]);
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]);
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]);
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]);
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]);
1281 sounds_sizer->Add(sounds_grid_sizer);
1283 column_1_sizer->Add(sounds_sizer, 0, wxEXPAND | wxALL, 10);
1285 static_box_sizer->Add(column_1_sizer, 0, wxEXPAND);
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);
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]);
1296 right_grid_sizer->AddSpacer(10);
1297 right_grid_sizer->AddSpacer(10);
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);
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);
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);
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);
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);
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);
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);
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);
1331 right_grid_sizer->AddSpacer(10);
1332 right_grid_sizer->AddSpacer(10);
1334 static const wxString shell_casing_type_strings[] = {
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]);
1347 static_box_sizer->AddSpacer(20);
1348 static_box_sizer->Add(right_grid_sizer, 0, wxEXPAND);
1351 weapons_triggers_sizer->AddSpacer(10);
1354 weapons_triggers_sizer->Add(static_box_sizer);
1357 mainbox->Add(weapons_triggers_sizer, 5, wxALL, 10);
1358 mainbox->Show(weapons_triggers_sizer, false);
1361 bool PhysicsView::OnCreate(wxDocument* doc, long flags)
1363 wxString frameTitle = wxT("ShapeFusion : Physics : ");
1364 frameTitle.Append(doc->GetFilename());
1366 mFrame = wxGetApp().CreateChildFrame(doc, this, frameTitle, wxDefaultPosition, wxDefaultSize);
1368 mainbox = new wxBoxSizer(wxHORIZONTAL);
1369 main_panel = new wxPanel(mFrame);
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);
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);
1384 CreatePhysicsConstants();
1388 mainbox->Show(dummy_sizer, false);
1389 mainbox->Show(weapons_triggers_sizer, true);
1392 main_panel->SetSizer(mainbox);
1393 mainbox->SetSizeHints(mFrame);
1394 mainbox->Fit(mFrame);
1396 menubar = mFrame->GetMenuBar();
1398 mainbox->Show(dummy_sizer, true);
1399 mainbox->Show(weapons_triggers_sizer, false);
1401 // because we changed size
1402 mFrame->Centre(wxBOTH);
1410 void PhysicsView::OnUpdate(wxView*, wxObject*)
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));
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));
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));
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));
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));
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));
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));
1450 void PhysicsView::OnDraw(wxDC* dc)
1454 bool PhysicsView::OnClose(bool deleteWindow)
1456 if (!GetDocument()->Close())