1//#define _CRT_SECURE_NO_WARNINGS
2#define M_PI 3.141593
3#include "GunSim.h"
4#include "al5setp.h"
5#include <fstream>
6//#include <string>
7//#include <stdio.h>
8
9
10GunPhysics gun_phys
;
11const int ZF_SIZE
= 8;
12const float SCREEN_1_Y_LOWER_LIMIT
= 430.
0;
13const float SCREEN_1_Y_UPPER_LIMIT
= 127.
0;
14
15struct record_position
16{
17 double x_pos
;
18 double y_pos
;
19 double velocity
;
20 double angle
;
21 double flight_time
;
22 double mach_no
;
23 double rho
;
24 double Cd
;
25};
26
27struct button_position
28{
29 float x1
;
30 float x2
;
31 float y1
;
32 float y2
;
33 int rgb
[3];
34 string label
;
35};
36//****************************************************
37
38bool set_rho_values
()
39{
40 size_t vec_size
;
41 int i
;
42 ifstream ref_file
("rhos.txt");
43
44 if(ref_file.is_open
())
45 {
46 ref_file
>> gun_phys.rho_alt_gradient
;
47 ref_file
>> gun_phys.rho_at_SL
;
48 ref_file
>> vec_size
;
49 gun_phys.ref_rho_table.resize
(vec_size
);
50 for(i
= 0; i
< (int)vec_size
; i
++)
51 {
52 if(!ref_file.eof
())
53 ref_file
>> gun_phys.ref_rho_table.at
(i
);
54 else
55 {
56 ref_file.close
();
57 return false;
58 }
59 }
60 }
61 else
62 return false;
63
64 ref_file.close
();
65 return true;
66}
67//****************************************************
68bool set_Mach_Cd_values
()
69{
70 //size_t vec_size;
71 int i
;
72 ifstream ref_file
("mach_cd.txt");
73
74 if(ref_file.is_open
())
75 {
76 ref_file
>> gun_phys.Mach_fall_off
;
77 ref_file
>> gun_phys.ref_Mach_1
;
78 ref_file
>> gun_phys.temp_at_SL
;
79 ref_file
>> gun_phys.temp_lapse
;
80 ref_file
>> gun_phys.gravity_accel
;
81 ref_file
>> gun_phys.cd_table_size
;
82
83 gun_phys.ref_Cd_table.resize
(gun_phys.cd_table_size
);
84 gun_phys.ref_Mach_table.resize
(gun_phys.cd_table_size
);
85
86 for(i
= 0; i
< (int)gun_phys.cd_table_size
; i
++)
87 {
88 if(!ref_file.eof
())
89 {
90 ref_file
>> gun_phys.ref_Mach_table.at
(i
);
91 ref_file
>> gun_phys.ref_Cd_table.at
(i
);
92 }
93 else
94 {
95 ref_file.close
();
96 return false;
97 }
98 }
99 }
100 else
101 return false;
102
103 ref_file.close
();
104 return true;
105}
106
107//****************************************************
108
109void reset_gun_params
(/*double gun_ang, double muz_vel*//*, double muz_alt,*/ int &zf_i
)
110{
111 zf_i
= 0;
112 //gun_phys.shell_FP_angle = gun_ang;
113 //gun_phys.shell_velocity = muz_vel;
114 gun_phys.shell_FP_angle
= gun_phys.gun_angle
;
115 gun_phys.shell_velocity
= gun_phys.muzzle_velocity
;
116 gun_phys.shell_FP_degrees
= (gun_phys.shell_FP_angle
/ M_PI
) * 180.
0;
117 gun_phys.init_muzzle_velocity_components
();
118 //gun_phys.shell_y_pos = muz_alt;
119 gun_phys.shell_y_pos
= gun_phys.gun_deck_altitude
;
120 gun_phys.shell_x_pos
= 0;
121 gun_phys.flight_time_100_s
= 0;
122
123}
124
125//****************************************************
126
127void update_shell_trajectory
(double BPS_Tm
)
128{
129 gun_phys.rho_at_alt
= gun_phys.Rho_Calculator
();
130 gun_phys.shell_Mach
= gun_phys.Mach_Calculator
();
131 gun_phys.Cd
= gun_phys.Cd_Calculator
();
132 gun_phys.shell_velocity
= gun_phys.New_Velocity_Calculator
(BPS_Tm
);
133 gun_phys.update_shell_position
(BPS_Tm
);
134 gun_phys.shell_FP_degrees
= (gun_phys.shell_FP_angle
/ M_PI
) * 180;
135 gun_phys.flight_time_100_s
++;
136}
137//****************************************************
138void shell_position_recording
(vector
<record_position>
*posit,
double BPS_Tm
)
139{
140 record_position temp_position
= {0};
141 temp_position.flight_time
= (double)gun_phys.flight_time_100_s
/ BPS_Tm
;//BPS;
142 temp_position.velocity
= gun_phys.shell_velocity
;
143 temp_position.angle
= gun_phys.shell_FP_degrees
;
144 temp_position.x_pos
= gun_phys.shell_x_pos
;
145 temp_position.y_pos
= gun_phys.shell_y_pos
;
146 temp_position.mach_no
= gun_phys.shell_Mach
;
147 temp_position.Cd
= gun_phys.Cd
;
148 temp_position.rho
= gun_phys.rho_at_alt
;
149 posit->push_back
(temp_position
);
150}
151//****************************************************
152
153void init_phase_0_buttons
(button_position
*buts
)
154// Be careful here. the number of buttons on phase 0 is currently 12
155// This one might be a case for a dynamic array or a vector, in future.
156{
157 float posit_xy
[12][2] = {{15,
370},
{15,
410},
{15,
460},
{15,
500},
158 {280,
370},
{280,
410},
{280,
460},
{280,
500},
159 {545,
370},
{545,
410},
{545,
460},
{545,
500}};
160
161 int RGB[12][3] = {{0,
255,
100},
{0,
255,
100},
{0,
255,
100},
{0,
255,
100},
162 {0,
255,
100},
{0,
255,
100},
{0,
255,
100},
{0,
255,
100},
163 {0,
255,
100},
{0,
255,
100},
{170,
205,
0},
{255,
0,
0}};
164
165 int i
;
166 for(i
= 0; i
< 12; i
++)
167 {
168 buts
[i
].x1
= posit_xy
[i
][0];
169 buts
[i
].x2
= posit_xy
[i
][0] + 30;
170 buts
[i
].y1
= posit_xy
[i
][1];
171 buts
[i
].y2
= posit_xy
[i
][1] + 30;
172 buts
[i
].rgb
[0] = RGB[i
][0];
173 buts
[i
].rgb
[1] = RGB[i
][1];
174 buts
[i
].rgb
[2] = RGB[i
][2];
175 }
176 buts
[0].label.assign
("Elevate Gun");
177 buts
[1].label.assign
("Depress Gun");
178 buts
[2].label.assign
("Increase Velocity");
179 buts
[3].label.assign
("Decrease Velocity");
180 buts
[4].label.assign
("Increase Mass");
181 buts
[5].label.assign
("Decrease Mass");
182 buts
[6].label.assign
("Increase Bore");
183 buts
[7].label.assign
("Decrease Bore");
184 buts
[8].label.assign
("Raise Turret");
185 buts
[9].label.assign
("Lower Turret");
186 buts
[10].label.assign
("Toggle Units");
187 buts
[11].label.assign
("FIRE!");
188}
189
190//****************************************************
191
192void init_phase_2_buttons
(button_position
*buts
)
193// Be careful here. the number of buttons on phase 0 is currently 3
194// This one might be a case for a dynamic array or a vector, in future.
195{
196 float posit_xy
[3][2] = {{45,
500},
{45,
540},
{460,
540}};
197
198 int RGB[3][3] = {{0,
255,
100},
{0,
255,
100},
{170,
205,
0}};
199
200 int i
;
201 for(i
= 0; i
< 3; i
++)
202 {
203 buts
[i
].x1
= posit_xy
[i
][0];
204 buts
[i
].x2
= posit_xy
[i
][0] + 30;
205 buts
[i
].y1
= posit_xy
[i
][1];
206 buts
[i
].y2
= posit_xy
[i
][1] + 30;
207 buts
[i
].rgb
[0] = RGB[i
][0];
208 buts
[i
].rgb
[1] = RGB[i
][1];
209 buts
[i
].rgb
[2] = RGB[i
][2];
210 }
211 buts
[0].label.assign
("Next Segment");
212 buts
[1].label.assign
("Previous Segment");
213 buts
[2].label.assign
("End Analysis (Restart)");
214
215}
216
217//****************************************************
218
219int mouse_handler
(int x,
int y, button_position
*buts,
int length
)
220{
221 int i
;
222 bool pressed
= false;
223 for(i
= 0; i
< length
; i
++)
224 {
225 if(x
> buts
[i
].x1
&& x
< buts
[i
].x2
&& y
> buts
[i
].y1
&& y
< buts
[i
].y2
)
226 {
227 pressed
= true;
228 break;
229 }
230 }
231
232 if(pressed
== true)
233 return i
;
234 else
235 return -1;
236}
237//****************************************************
238
239
240void phase_0_action_handler
(int id,
bool go,
int &faze,
bool &moused,
bool &imp_bool
/*, double &gun_ang*//*, double & muz_alt*/)
241{
242 switch(id
)
243 {
244 case 0:
245 if(go
== true) // Only if the timer geow is fed through...
246 {
247
248 gun_phys.shell_FP_angle
+= 0.
001745;
249 if(gun_phys.shell_FP_angle
> gun_phys.elevation_limits
[1])
250 gun_phys.shell_FP_angle
= gun_phys.elevation_limits
[1];
251
252 gun_phys.gun_angle
= gun_phys.shell_FP_angle
;
253 gun_phys.shell_FP_degrees
= (gun_phys.shell_FP_angle
/ M_PI
) * 180;
254 gun_phys.init_muzzle_velocity_components
();
255
256
257 //gun_ang = gun_phys.shell_FP_angle;
258
259 //gun_phys.shell_y_pos = gun_phys.init_muzzle_position();
260 //muz_alt = gun_phys.shell_y_pos;
261 // mouse_down = false; a way to stop the repeat function of mouse press
262 //button_id = -1;
263 }
264
265 break;
266
267 case 1:
268 if(go
== true) // Only if the timer geow is fed through...
269 {
270 gun_phys.shell_FP_angle
-= 0.
001745;
271 if(gun_phys.shell_FP_angle
< gun_phys.elevation_limits
[0])
272 gun_phys.shell_FP_angle
= gun_phys.elevation_limits
[0];
273
274 gun_phys.gun_angle
= gun_phys.shell_FP_angle
;
275 gun_phys.shell_FP_degrees
= (gun_phys.shell_FP_angle
/ M_PI
) * 180;
276 gun_phys.init_muzzle_velocity_components
();
277 //gun_ang = gun_phys.shell_FP_angle;
278
279 //gun_phys.shell_y_pos = gun_phys.init_muzzle_position();
280 //muz_alt = gun_phys.shell_y_pos;
281 }
282 break;
283
284 case 2:
285 if(go
== true) // Only if the timer geow is fed through...
286 {
287 gun_phys.shell_velocity
+= 0.
2;
288 if(gun_phys.shell_velocity
> gun_phys.velocity_limits
[1])
289 gun_phys.shell_velocity
= gun_phys.velocity_limits
[1];
290
291 gun_phys.muzzle_velocity
= gun_phys.shell_velocity
;
292 gun_phys.init_muzzle_velocity_components
();
293 }
294 break;
295
296 case 3:
297 if(go
== true) // Only if the timer geow is fed through...
298 {
299 gun_phys.shell_velocity
-= 0.
2;
300 if(gun_phys.shell_velocity
< gun_phys.velocity_limits
[0])
301 gun_phys.shell_velocity
= gun_phys.velocity_limits
[0];
302
303 gun_phys.muzzle_velocity
= gun_phys.shell_velocity
;
304 gun_phys.init_muzzle_velocity_components
();
305 }
306 break;
307
308 case 4:
309 if(go
== true) // Only if the timer geow is fed through...
310 {
311 gun_phys.shell_mass
+= 0.
5;
312 if(gun_phys.shell_mass
> gun_phys.mass_limits
[1])
313 gun_phys.shell_mass
= gun_phys.mass_limits
[1];
314 }
315 break;
316
317 case 5:
318 if(go
== true) // Only if the timer geow is fed through...
319 {
320 gun_phys.shell_mass
-= 0.
5;
321 if(gun_phys.shell_mass
< gun_phys.mass_limits
[0])
322 gun_phys.shell_mass
= gun_phys.mass_limits
[0];
323 }
324 break;
325
326 case 6: // increase the shell diameter
327 if(go
== true) // Only if the timer geow is fed through...
328 {
329 gun_phys.shell_diameter
+= 0.
1;
330 if(gun_phys.shell_diameter
> gun_phys.bore_limits
[1])
331 gun_phys.shell_diameter
= gun_phys.bore_limits
[1];
332 }
333 break;
334
335 case 7: // decrease shell diameter
336 if(go
== true) // Only if the timer geow is fed through...
337 {
338 gun_phys.shell_diameter
-= 0.
1;
339 if(gun_phys.shell_diameter
< gun_phys.bore_limits
[0])
340 gun_phys.shell_diameter
= gun_phys.bore_limits
[0];
341 }
342 break;
343
344 case 8: // Raise the turret
345 if(go
== true) // Only if the timer geow is fed through...
346 {
347 gun_phys.gun_deck_altitude
+= 0.
1;
348 if(gun_phys.gun_deck_altitude
> gun_phys.deck_limits
[1])
349 gun_phys.gun_deck_altitude
= gun_phys.deck_limits
[1];
350
351 gun_phys.shell_y_pos
= gun_phys.gun_deck_altitude
;
352 }
353 break;
354
355 case 9: // Lower the turret
356 if(go
== true) // Only if the timer geow is fed through...
357 {
358 gun_phys.gun_deck_altitude
-= 0.
1;
359 if(gun_phys.gun_deck_altitude
< gun_phys.deck_limits
[0])
360 gun_phys.gun_deck_altitude
= gun_phys.deck_limits
[0];
361
362 gun_phys.shell_y_pos
= gun_phys.gun_deck_altitude
;
363 }
364 break;
365
366 case 10: // Change between imperial and SI units
367 if(go
== true) // Only if the timer geow is fed through...
368 {
369 if(imp_bool
== true)
370 imp_bool
= false;
371 else
372 imp_bool
= true;
373
374 moused
= false; // a way to stop the repeat function of mouse press
375
376 }
377 break;
378
379 case 11: // Fire the gun
380 if(go
== true) // Only if the timer geow is fed through...
381 {
382 //gun_phys.shell_y_pos = gun_phys.init_muzzle_position();
383 //muz_alt = gun_phys.shell_y_pos;
384
385 faze
= 1;
386 moused
= false;
387 }
388 break;
389
390 default:
391 break;
392 }
393}
394
395// ***************************************************
396
397void phase_2_action_handler
(int id,
bool go,
int &faze,
bool &moused, vector
<record_position>
&posit,
size_t v_sz,
size_t &sel_seg
/*, double gun_ang, double muz_vel*//*, double muz_alt*/,
int &zf_i
)
398{
399 switch(id
)
400 {
401 case 0:
402 if(go
== true) // Only if the timer geow is fed through...
403 {
404 if(sel_seg
< (v_sz
- 1))
405 {
406 sel_seg
++;
407 }
408 moused
= false;
409 }
410 break;
411 case 1:
412 if(go
== true) // Only if the timer geow is fed through...
413 {
414 if(sel_seg
> 1)
415 {
416 sel_seg--
;
417 }
418 moused
= false;
419 }
420 break;
421 case 2:
422 if(go
== true) // Only if the timer geow is fed through...
423 {
424 posit.resize
(0);
425 posit.clear
();
426 reset_gun_params
(/*gun_ang,*/ /*muz_vel*//*, muz_alt,*/ zf_i
);
427 sel_seg
= 1;
428 faze
= 0;
429 // RESET THINGS NOW...
430 moused
= false;
431 }
432 break;
433
434
435 default:
436 break;
437
438 }
439}
440// ***************************************************
441
442void draw_phase_0_screen
(char *buff,
int buffsize,
ALLEGRO_FONT *F_font, button_position
*buts_p0,
ALLEGRO_BITMAP *bmp,
bool imp_bool
)
443{
444
445 al_draw_bitmap(bmp,
0,
300,
0);
446 int i
;
447 for(i
= 0; i
< 12; i
++)
448 {
449 al_draw_rectangle(buts_p0
[i
].x1, buts_p0
[i
].y1, buts_p0
[i
].x2, buts_p0
[i
].y2,
450 al_map_rgb(buts_p0
[i
].rgb
[0],buts_p0
[i
].rgb
[1],buts_p0
[i
].rgb
[2]),
2);
451 al_draw_text(F_font,
al_map_rgb(0,
255,
100), buts_p0
[i
].x2
+ 5, buts_p0
[i
].y1
+ 5, ALLEGRO_ALIGN_LEFT, buts_p0
[i
].label.c_str
());
452 }
453 al_draw_line(0,
300,
800,
300,
al_map_rgb(255,
255,
255),
0);
454
455 al_draw_rectangle(5,
5,
398,
295,
al_map_rgb(0,
220,
175),
0);
456 al_draw_rectangle(403,
5,
795,
295,
al_map_rgb(0,
220,
175),
0);
457
458 snprintf(buff, buffsize,
"GUN PARAMETERS %s",
459 (imp_bool
== true ?
"(Imperial Units)" : "(SI Units)"));
460 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
409,
10, ALLEGRO_ALIGN_LEFT, buff
);
461
462 //-------------------------------
463 // GUN ELEVATION
464 snprintf(buff, buffsize,
"Gun Elevation (deg):" );
465 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
409,
35, ALLEGRO_ALIGN_LEFT, buff
);
466
467 snprintf(buff, buffsize,
"%0.1f", gun_phys.shell_FP_degrees
);
468 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
685,
35, ALLEGRO_ALIGN_LEFT, buff
);
469
470 //-------------------------------
471 // MUZZLE VELOCITY
472 snprintf(buff, buffsize,
"Muzzle Velocity %s",
473 (imp_bool
== true ?
"(ft/s):" : "(m/s):") );
474 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
409,
53, ALLEGRO_ALIGN_LEFT, buff
);
475
476 snprintf(buff, buffsize,
"%0.1f",
477 (imp_bool
== true ?
(gun_phys.shell_velocity
* 3.
281) : gun_phys.shell_velocity
) );
478 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
685,
53, ALLEGRO_ALIGN_LEFT, buff
);
479
480 //-------------------------------
481 // SHELL MASS
482 snprintf(buff, buffsize,
"Shell Mass %s",
483 (imp_bool
== true ?
"(lb):" : "(kg):") );
484
485 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
409,
71, ALLEGRO_ALIGN_LEFT, buff
);
486
487 snprintf(buff, buffsize,
"%0.1f",
488 (imp_bool
== true ?
(gun_phys.shell_mass
* 2.
2046) : gun_phys.shell_mass
) );
489
490 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
685,
71, ALLEGRO_ALIGN_LEFT, buff
);
491
492 //-------------------------------
493 // GUN BORE
494 snprintf(buff, buffsize,
"Gun Bore %s",
495 (imp_bool
== true ?
"(in):" : "(cm):") );
496
497 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
409,
89, ALLEGRO_ALIGN_LEFT, buff
);
498
499 snprintf(buff, buffsize,
"%0.1f",
500 (imp_bool
== true ?
(gun_phys.shell_diameter
* 0.
3937) : gun_phys.shell_diameter
) );
501
502 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
685,
89, ALLEGRO_ALIGN_LEFT, buff
);
503
504 //-------------------------------
505 // GUN BORE
506 snprintf(buff, buffsize,
"Turret Height %s",
507 (imp_bool
== true ?
"(ft):" : "(m):") );
508
509 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
409,
107, ALLEGRO_ALIGN_LEFT, buff
);
510
511 snprintf(buff, buffsize,
"%0.1f",
512 (imp_bool
== true ?
(gun_phys.gun_deck_altitude
* 3.
281) : gun_phys.gun_deck_altitude
) );
513
514 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
685,
107, ALLEGRO_ALIGN_LEFT, buff
);
515
516 //-------------------------------
517 snprintf(buff, buffsize,
"ATMOSPHERIC PARAMETERS" );
518 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
409,
143, ALLEGRO_ALIGN_LEFT, buff
);
519 snprintf(buff, buffsize,
"currently not editable" );
520 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
409,
161, ALLEGRO_ALIGN_LEFT, buff
);
521
522 snprintf(buff, buffsize,
"S/L Temperature (C):" );
523 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
409,
186, ALLEGRO_ALIGN_LEFT, buff
);
524
525 snprintf(buff, buffsize,
"%0.1f", gun_phys.temp_at_SL
);
526 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
685,
186, ALLEGRO_ALIGN_LEFT, buff
);
527
528 snprintf(buff, buffsize,
"S/L Air Density (kg/m3):" );
529 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
409,
204, ALLEGRO_ALIGN_LEFT, buff
);
530
531 snprintf(buff, buffsize,
"%0.3f", gun_phys.rho_at_SL
);
532 al_draw_text(F_font,
al_map_rgb(0,
255,
150),
685,
204, ALLEGRO_ALIGN_LEFT, buff
);
533
534 //Draw the turret
535 float barrel_tip_x
= cos(gun_phys.shell_FP_angle
) * 80.
0;
536 float barrel_tip_y
= sin(gun_phys.shell_FP_angle
) * 80.
0;
537 float x_offset
= 210.
0;
538 float y_offset
= 255.
0;
539
540 al_draw_line(x_offset,
541 y_offset
- (gun_phys.gun_deck_altitude
* 5),
542 (x_offset
+ barrel_tip_x
),
543 (y_offset
- barrel_tip_y
) - (gun_phys.gun_deck_altitude
* 5),
544 al_map_rgb(0,
255,
150),
2);
545
546 al_draw_filled_rectangle(145,
547 235 - (gun_phys.gun_deck_altitude
* 5),
548 230,
549 270 - (gun_phys.gun_deck_altitude
* 5),
550 al_map_rgb(0,
0,
0));
551
552 al_draw_rectangle(145,
553 235 - (gun_phys.gun_deck_altitude
* 5),
554 230,
555 270 - (gun_phys.gun_deck_altitude
* 5),
556 al_map_rgb(0,
255,
150),
0);
557
558 al_draw_line(5,
270,
398,
270,
al_map_rgb(0,
255,
150),
0);
559
560 al_draw_rectangle(155,
561 270 - (gun_phys.gun_deck_altitude
* 5),
562 220,
563 270,
564 al_map_rgb(0,
255,
150),
0);
565
566
567}
568//****************************************************
569
570void draw_phase_1_screen
(char *buff,
int buffsize,
ALLEGRO_FONT *F_font, vector
<record_position>
*posit,
size_t v_sz,
ALLEGRO_BITMAP *bmp,
bool imp_bool,
double zm_f,
int &zf_i,
bool trace
)
571{
572 al_draw_bitmap(bmp,
0,
460,
0);
573 //TITLE
574 snprintf(buff, buffsize,
"SHELL PROGRESS (Recording at 1 second interval)" );
575
576 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
400,
12, ALLEGRO_ALIGN_CENTRE, buff
);
577
578 // DISTANCE
579 snprintf(buff, buffsize,
"Distance %s",
580 (imp_bool
== true ?
"(yd):" : "(m):") );
581
582 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
30,
35, ALLEGRO_ALIGN_LEFT, buff
);
583
584 snprintf(buff, buffsize,
"%0.0f",
585 (imp_bool
== true ?
(gun_phys.shell_x_pos
* 1.
093) : gun_phys.shell_x_pos
) );
586
587 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
275,
35, ALLEGRO_ALIGN_LEFT, buff
);
588
589 // ALTITUDE
590 snprintf(buff, buffsize,
"Altitude %s",
591 (imp_bool
== true ?
"(yd):" : "(m):") );
592
593 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
30,
53, ALLEGRO_ALIGN_LEFT, buff
);
594
595 snprintf(buff, buffsize,
"%0.0f",
596 (imp_bool
== true ?
(gun_phys.shell_y_pos
* 1.
093) : gun_phys.shell_y_pos
) );
597
598 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
275,
53, ALLEGRO_ALIGN_LEFT, buff
);
599
600 // SHELL ANGLE
601 snprintf(buff, buffsize,
"Path Angle (deg):" );
602 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
30,
71, ALLEGRO_ALIGN_LEFT, buff
);
603
604 snprintf(buff, buffsize,
"%0.1f", gun_phys.shell_FP_degrees
);
605 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
275,
71, ALLEGRO_ALIGN_LEFT, buff
);
606
607 // TIME
608 snprintf(buff, buffsize,
"Flight Time (sec):" );
609 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
30,
89, ALLEGRO_ALIGN_LEFT, buff
);
610
611 snprintf(buff, buffsize,
"%0.1f",
((double)gun_phys.flight_time_100_s
/ 100.
0) );
612 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
275,
89, ALLEGRO_ALIGN_LEFT, buff
);
613
614 // VELOCITY
615 snprintf(buff, buffsize,
"Velocity %s",
616 (imp_bool
== true ?
"(ft/s):" : "(m/s):") );
617 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
430,
35, ALLEGRO_ALIGN_LEFT, buff
);
618
619 snprintf(buff, buffsize,
"%0.0f",
620 imp_bool
== true ?
(gun_phys.shell_velocity
* 3.
281) : gun_phys.shell_velocity
);
621 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
685,
35, ALLEGRO_ALIGN_LEFT, buff
);
622
623 // MACH
624 snprintf(buff, buffsize,
"Mach:" );
625 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
430,
53, ALLEGRO_ALIGN_LEFT, buff
);
626
627 snprintf(buff, buffsize,
"%0.2f", gun_phys.shell_Mach
);
628 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
685,
53, ALLEGRO_ALIGN_LEFT, buff
);
629
630 // Rho
631 snprintf(buff, buffsize,
"Air Density (kg/m3):" );
632 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
430,
71, ALLEGRO_ALIGN_LEFT, buff
);
633
634 snprintf(buff, buffsize,
"%0.3f", gun_phys.rho_at_alt
);
635 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
685,
71, ALLEGRO_ALIGN_LEFT, buff
);
636
637 // temp_at_SL - (shell_y_pos / temp_lapse)
638
639 // TEMP
640 snprintf(buff, buffsize,
"Air Temp (C):" );
641 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
430,
89, ALLEGRO_ALIGN_LEFT, buff
);
642
643 //temporary measure;
644 double air_temp
= gun_phys.temp_at_SL
- (gun_phys.shell_y_pos
/ gun_phys.temp_lapse
);
645 if(air_temp
< -56.
5)
646 air_temp
= -56.
5;
647
648 snprintf(buff, buffsize,
"%0.1f", air_temp
);
649 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
685,
89, ALLEGRO_ALIGN_LEFT, buff
);
650
651 // DRAW THE SHELL
652 float screen_X_pos
= 0.
0;
653 float screen_Y_pos
= 0.
0;
654 screen_X_pos
= float(2 + (gun_phys.shell_x_pos
/ zm_f
));
655 screen_Y_pos
= float(SCREEN_1_Y_LOWER_LIMIT
- (gun_phys.shell_y_pos
/ zm_f
));
656
657 if(screen_X_pos
> 0 && screen_X_pos
< 800 && screen_Y_pos
< (SCREEN_1_Y_LOWER_LIMIT
+ 1) && screen_Y_pos
> SCREEN_1_Y_UPPER_LIMIT
)
658 al_draw_circle(screen_X_pos, screen_Y_pos,
2,
al_map_rgb(0,
250,
0),
0);
659
660
661 al_draw_line(0.
0,
(SCREEN_1_Y_UPPER_LIMIT
- 2.
0),
800.
0,
(SCREEN_1_Y_UPPER_LIMIT
- 2.
0),
al_map_rgb(200,
200,
200),
0);
662 al_draw_line(0.
0, SCREEN_1_Y_LOWER_LIMIT,
800.
0, SCREEN_1_Y_LOWER_LIMIT,
al_map_rgb(0,
100,
200),
0);
663 al_draw_line(0.
0,
(SCREEN_1_Y_LOWER_LIMIT
+ 30),
800.
0,
(SCREEN_1_Y_LOWER_LIMIT
+ 30),
al_map_rgb(200,
200,
200),
0);
664
665 snprintf(buff, buffsize,
"Display Width Scale: %0.1f %s",
666 (imp_bool
== true ?
((zm_f
* 800.
0) / 1000.
0) * 1.
093 : (zm_f
* 800.
0) / 1000.
0),
667 (imp_bool
== true ?
"kyd" : "km"));
668 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
400,
(SCREEN_1_Y_LOWER_LIMIT
+ 5.
0), ALLEGRO_ALIGN_CENTRE, buff
);
669
670 // DRAW THE TRACING OF SHELL PATH, IF ENABLED
671
672
673 if(trace
== true && v_sz
> 1)
674 {
675 size_t s
;
676 float screen_X_pos_0
= 0.
0;
677 float screen_Y_pos_0
= 0.
0;
678 float screen_X_pos_1
= 0.
0;
679 float screen_Y_pos_1
= 0.
0;
680
681 for(s
= 0; s
< v_sz
; s
++)
682 {
683 if(s
> 0)
684 {
685 screen_X_pos_0
= float(2 + (posit->at
(s-1
).x_pos
/ zm_f
));
686 screen_Y_pos_0
= float(SCREEN_1_Y_LOWER_LIMIT
- (posit->at
(s-1
).y_pos
/ zm_f
));
687 screen_X_pos_1
= float(2 + (posit->at
(s
).x_pos
/ zm_f
));
688 screen_Y_pos_1
= float(SCREEN_1_Y_LOWER_LIMIT
- (posit->at
(s
).y_pos
/ zm_f
));
689 // Thanks to Salem on cboard forums.
690
691 if(screen_X_pos_1
> 0 && screen_X_pos_1
< 800 && screen_Y_pos_1
< (SCREEN_1_Y_LOWER_LIMIT
+ 1) && screen_Y_pos_1
> SCREEN_1_Y_UPPER_LIMIT
)
692 al_draw_line(screen_X_pos_0, screen_Y_pos_0, screen_X_pos_1, screen_Y_pos_1,
al_map_rgb(80,
120,
120),
0);
693 }
694 }
695 }
696
697 // RESET the Zoom_Factor if the shell is going off the screen
698 if(screen_X_pos
> 800 || screen_Y_pos
< SCREEN_1_Y_UPPER_LIMIT
)
699 if(zf_i
< (ZF_SIZE
- 1))
700 zf_i
++;
701}
702//****************************************************
703
704void draw_phase_2_screen
(char *buff,
int buffsize,
ALLEGRO_FONT *F_font, vector
<record_position>
*posit,
size_t v_sz,
ALLEGRO_BITMAP *bmp, button_position
*buts_p2,
bool imp_bool,
double zm_f,
size_t sel_seg
)
705{
706 al_draw_bitmap(bmp,
0,
460,
0);
707 int i
;
708 for(i
= 0; i
< 3; i
++)
709 {
710 al_draw_rectangle(buts_p2
[i
].x1, buts_p2
[i
].y1, buts_p2
[i
].x2, buts_p2
[i
].y2,
711 al_map_rgb(buts_p2
[i
].rgb
[0],buts_p2
[i
].rgb
[1],buts_p2
[i
].rgb
[2]),
2);
712 al_draw_text(F_font,
al_map_rgb(0,
255,
100), buts_p2
[i
].x2
+ 5, buts_p2
[i
].y1
+ 5, ALLEGRO_ALIGN_LEFT, buts_p2
[i
].label.c_str
());
713 }
714
715 al_draw_rectangle(5.
0,
5.
0,
795.
0,
120.
0,
al_map_rgb(0,
220,
175),
0);
716 al_draw_line(0.
0,
(SCREEN_1_Y_UPPER_LIMIT
- 2.
0),
800.
0,
(SCREEN_1_Y_UPPER_LIMIT
- 2.
0),
al_map_rgb(200,
200,
200),
0);
717 al_draw_line(0.
0, SCREEN_1_Y_LOWER_LIMIT,
800.
0, SCREEN_1_Y_LOWER_LIMIT,
al_map_rgb(0,
100,
200),
0);
718 al_draw_line(0.
0,
(SCREEN_1_Y_LOWER_LIMIT
+ 30),
800.
0,
(SCREEN_1_Y_LOWER_LIMIT
+ 30),
al_map_rgb(200,
200,
200),
0);
719
720 snprintf(buff, buffsize,
"Analysing Segment:" );
721 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
15,
10, ALLEGRO_ALIGN_LEFT, buff
);
722
723 snprintf(buff, buffsize,
"%i",
(int)sel_seg
);
724 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
350,
10, ALLEGRO_ALIGN_LEFT, buff
);
725
726 snprintf(buff, buffsize,
"Distance horiz to point %s",
727 (imp_bool
== true ?
"(yd):" : "(m):") );
728 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
15,
28, ALLEGRO_ALIGN_LEFT, buff
);
729
730 snprintf(buff, buffsize,
"%0.0f",
731 (imp_bool
== true ?
(posit->at
(sel_seg
).x_pos
* 1.
093) : posit->at
(sel_seg
).x_pos
) );
732 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
350,
28, ALLEGRO_ALIGN_LEFT, buff
);
733
734 snprintf(buff, buffsize,
"Segment horiz distance %s",
735 (imp_bool
== true ?
"(yd):" : "(m):") );;
736 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
15,
46, ALLEGRO_ALIGN_LEFT, buff
);
737
738 snprintf(buff, buffsize,
"%0.0f",
739 (imp_bool
== true ?
(posit->at
(sel_seg
).x_pos
- posit->at
(sel_seg
- 1).x_pos
) * 1.
093 : (posit->at
(sel_seg
).x_pos
- posit->at
(sel_seg
- 1).x_pos
)) );
740 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
350,
46, ALLEGRO_ALIGN_LEFT, buff
);
741
742 snprintf(buff, buffsize,
"Altitude at point %s",
743 (imp_bool
== true ?
"(yd):" : "(m):") );
744 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
15,
64, ALLEGRO_ALIGN_LEFT, buff
);
745
746 snprintf(buff, buffsize,
"%0.0f",
747 (imp_bool
== true ?
(posit->at
(sel_seg
).y_pos
* 1.
093) : posit->at
(sel_seg
).y_pos
) );
748 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
350,
64, ALLEGRO_ALIGN_LEFT, buff
);
749
750 snprintf(buff, buffsize,
"Avg Shell Velocity %s",
751 (imp_bool
== true ?
"(ft/s):" : "(m/s):") );
752 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
15,
82, ALLEGRO_ALIGN_LEFT, buff
);
753
754 snprintf(buff, buffsize,
"%0.0f",
755 (imp_bool
== true ?
((posit->at
(sel_seg
).velocity
+ posit->at
(sel_seg
- 1).velocity
) / 2.
0) * 3.
281 :
756 (posit->at
(sel_seg
).velocity
+ posit->at
(sel_seg
- 1).velocity
) / 2.
0) );
757 al_draw_text(F_font,
al_map_rgb(0,
255,
200),
350,
82, ALLEGRO_ALIGN_LEFT, buff
);
758
759 //************************************************
760 snprintf(buff, buffsize,
"Display Width Scale: %0.1f %s",
761 (imp_bool
== true ?
((zm_f
* 800.
0) / 1000.
0) * 1.
093 : (zm_f
* 800.
0) / 1000.
0),
762 (imp_bool
== true ?
"kyd" : "km") );
763 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
400,
(SCREEN_1_Y_LOWER_LIMIT
+ 5.
0), ALLEGRO_ALIGN_CENTRE, buff
);
764
765 snprintf(buff, buffsize,
"ANANLYSE SEGMENTS (1 second intervals)" );
766 al_draw_text(F_font,
al_map_rgb(220,
240,
0),
400,
(SCREEN_1_Y_LOWER_LIMIT
+ 37.
0), ALLEGRO_ALIGN_CENTRE, buff
);
767
768 /*
769 struct record_position
770{
771 double x_pos;
772 double y_pos;
773 double velocity;
774 double angle;
775 double flight_time;
776 double mach_no;
777 double rho;
778 double Cd;
779};
780*/
781 size_t s
;
782 float screen_X_pos_0
= 0.
0;
783 float screen_Y_pos_0
= 0.
0;
784 float screen_X_pos_1
= 0.
0;
785 float screen_Y_pos_1
= 0.
0;
786
787 for(s
= 0; s
< v_sz
; s
++)
788 {
789 if(s
> 0)
790 {
791 screen_X_pos_0
= float(2 + (posit->at
(s-1
).x_pos
/ zm_f
));
792 screen_Y_pos_0
= float(SCREEN_1_Y_LOWER_LIMIT
- (posit->at
(s-1
).y_pos
/ zm_f
));
793 screen_X_pos_1
= float(2 + (posit->at
(s
).x_pos
/ zm_f
));
794 screen_Y_pos_1
= float(SCREEN_1_Y_LOWER_LIMIT
- (posit->at
(s
).y_pos
/ zm_f
));
795 // Thanks to Salem on cboard forums.
796
797 if(screen_X_pos_1
> 0 && screen_X_pos_1
< 800 && screen_Y_pos_1
< (SCREEN_1_Y_LOWER_LIMIT
+ 1) && screen_Y_pos_1
> SCREEN_1_Y_UPPER_LIMIT
)
798 {
799 if(s
== sel_seg
)
800 {
801 al_draw_line(screen_X_pos_0, screen_Y_pos_0, screen_X_pos_1, screen_Y_pos_1,
al_map_rgb(255,
0,
0),
0);
802 }
803 else
804 {
805 al_draw_line(screen_X_pos_0, screen_Y_pos_0, screen_X_pos_1, screen_Y_pos_1,
al_map_rgb(80,
120,
120),
0);
806 }
807 }
808 }
809 }
810
811
812}
813
814
815//****************************************************
816int main
()
817{
818 ALLEGRO_FONT *font = NULL
;
819 ALLEGRO_EVENT_QUEUE *event_queue
= NULL
;
820 ALLEGRO_TIMER *FPS_timer
= NULL
;
821 ALLEGRO_TIMER *BPS_timer
= NULL
;
822 ALLEGRO_DISPLAY *display
= NULL
;
823
824 ALLEGRO_BITMAP *bmp_1
;
825 ALLEGRO_BITMAP *bmp_2
;
826
827
828 bool mouse_down
= false;
829 int mx
= 0;
830 int my
= 0;
831 size_t selected_segment
= 1;
832
833 const float BPS
= 100;
834 const float FPS
= 60;
835 bool geow
= false; // Special variable to feed the timer to mouse press repeat functions
836
837 bool imperial
= true;
838 //double gun_angle;
839 //double muzzle_vel;
840 //double muzzle_alt;
841
842 double zoom_factor
[ZF_SIZE
] = {6.
25,
12.
5,
25.
0,
37.
5,
50.
0,
62.
5,
75.
0,
88.
125};
843 // BE CAREFUL HERE...
844 // The elements MUST always be the same number of as the ZF_SIZE global.
845 int zf_index
= 0;
846 // double zoom_factor = 25.0; // vestigial
847 double trace_on
= true;
848
849 char buffer
[100];
850 bool loop
= true;
851 int phase
= 0;
852 int button_id
= -1; // No button pressed...
853 // The phase variable is used this way;
854 // phase = 0 is the gun configuration screen
855 // phase = 1 is the gun fired and shell in the air screen
856 // phase = 2 will be the after shot screen to analyze the trajectory (TO DO)
857 // phase = 3 will be a shell drag coefficient editing screen (TO DO)
858 // phase = 4 will be the atmospheric parameter editing screen (TO DO)
859 // Exiting phase 2 or aborting phase 1 will return to phase 0.
860 // The gun parameters will be maintained, but the recorded
861 // trajectory of phase 1 will be dumped and the record
862 // vector cleared and resized back to 0
863
864 vector
<record_position> positions
;
865 //record_position temp_position = {0}; // vestigial
866 button_position phase_0_buttons
[12]; // Phase 0 button array
867 init_phase_0_buttons
(phase_0_buttons
); // Phase 0 button SET ARRAY function
868 button_position phase_2_buttons
[3];
869 init_phase_2_buttons
(phase_2_buttons
);
870
871 al5_setup
();
872 al5_initialize
(&font,
&display,
&event_queue,
&FPS_timer,
&BPS_timer, FPS, BPS
);
873 // Thanks to Matthew Leverton at allegro.cc forums.
874
875 if(!(bmp_1
= al_load_bitmap("PE.jpg"))) // Just for a laugh!
876 {
877 bmp_1
= al_create_bitmap(800,
300);
878 al_set_target_bitmap(bmp_1
);
879 al_clear_to_color(al_map_rgb(35,
35,
35));
880 }
881 bmp_2
= al_create_bitmap(800,
140);
882 al_set_target_bitmap(bmp_2
);
883 al_clear_to_color(al_map_rgb(35,
35,
35));
884
885 // Make sure the correct backbuffer is selected for all future drawing operations.
886 al_set_target_bitmap(al_get_backbuffer(display
));
887
888
889 //Set some gun parameters...
890 gun_phys.shell_FP_angle
= (5.
0 / 180.
0) * M_PI
;
891 gun_phys.gun_angle
= gun_phys.shell_FP_angle
;
892 //gun_angle = gun_phys.shell_FP_angle;
893 gun_phys.shell_FP_degrees
= (gun_phys.shell_FP_angle
/ M_PI
) * 180.
0;
894 gun_phys.gun_deck_altitude
= 9.
8;
895 gun_phys.length_of_barrel
= 12.
15;
896 gun_phys.shell_diameter
= 35.
6;
897 gun_phys.shell_frontal_area
= pow((gun_phys.shell_diameter
/ 2 / 100),
2) * M_PI
;
898 gun_phys.shell_mass
= 720.
0;
899 gun_phys.shell_velocity
= 757.
0;
900 gun_phys.muzzle_velocity
= gun_phys.shell_velocity
;
901 //muzzle_vel = gun_phys.shell_velocity;
902 //gun_phys.shell_y_pos = gun_phys.init_muzzle_position();
903 //muzzle_alt = gun_phys.shell_y_pos;
904 gun_phys.shell_y_pos
= gun_phys.gun_deck_altitude
;
905 gun_phys.shell_x_pos
= 0;
906 gun_phys.flight_time_100_s
= 0;
907
908 gun_phys.init_muzzle_velocity_components
();
909
910 gun_phys.elevation_limits
[0] = -0.
174533;
911 gun_phys.elevation_limits
[1] = 0.
907571;
912 gun_phys.bore_limits
[0] = 7.
5;
913 gun_phys.bore_limits
[1] = 61.
0;
914 gun_phys.velocity_limits
[0] = 400.
0;
915 gun_phys.velocity_limits
[1] = 1500.
0;
916 gun_phys.mass_limits
[0] = 5.
0;
917 gun_phys.mass_limits
[1] = 1550.
0;
918 gun_phys.deck_limits
[0] = 3.
0;
919 gun_phys.deck_limits
[1] = 30.
5; // A shore battery, perhaps...
920 // Eventually, these parameters could be set from selection of a specific gun type at the beginning
921 // of the program, the data being read from a file containing the specifics for that particular gun.
922 // At the moment the data corresponds to the Hipper Class German heavy cruiser. (except for the limits)
923 //
924
925 // Load txt tables...
926 if(false == set_rho_values
())
927 return -1;
928 if(false == set_Mach_Cd_values
())
929 return -1;
930
931 al5_register
(&event_queue,
&display,
&FPS_timer,
&BPS_timer
); // Get Allegro up and running.
932
933 //shell_position_recording(&positions, (double) BPS); // put the first position in the alalysis vector
934
935 while (loop
) // while MAIN GAME LOOP *** STARTS HERE
936 {
937 ALLEGRO_EVENT ev
;
938 al_wait_for_event(event_queue,
&ev
);
939
940 switch(ev.type
) // switch EV.TYPE *** STARTS HERE
941 {
942 case ALLEGRO_EVENT_TIMER:
// Catch a Timer event
943 if(ev.timer.source
== BPS_timer
) // If it is the logic timer...
944 {
945 switch(phase
) // switch PHASE for ALLEGRO_EVENT_TIMER BPS *** STARTS HERE
946 {
947 case 0:
948 break;
949 // case 0 *** ENDS:
950 // Unlikely there will ever be anything here, no calculations on this screen
951
952 case 1:
953 if(gun_phys.shell_x_pos
== 0)
954 {
955 shell_position_recording
(&positions,
(double)BPS
);
956 }
957
958 if(gun_phys.shell_y_pos
> 0)
959 {
960 update_shell_trajectory
((double)BPS
);
961 if(gun_phys.flight_time_100_s %
100 == 0) // every second do a record action
962 {
963 shell_position_recording
(&positions,
(double)BPS
);
964 }
965 }
966 else if(gun_phys.shell_y_pos
< 0)
967 {
968 gun_phys.end_clip
((double)BPS
);
969 shell_position_recording
(&positions,
(double)BPS
);
970 phase
= 2;
971 }
972
973
974 break;
975 // case 1 *** ENDS
976
977 default:
978 break;
979 // case 1 *** ENDS:
980 } // switch PHASE for ALLEGRO_EVENT_TIMER BPS *** ENDS
981
982 }
983 else if(ev.timer.source
== FPS_timer
) // For screen updates
984 {
985 geow
= true; // Feed out the 1/60 Timer.
986 switch(phase
) // switch PHASE for ALLEGRO_EVENT_TIMER FPS *** STARTS HERE
987 {
988 case 0:
989 al_clear_to_color(al_map_rgb(0,
0,
0));
990 draw_phase_0_screen
(buffer,
100,
font, phase_0_buttons, bmp_1, imperial
);
991 al_flip_display();
992
993 break;
994 // case 0 *** ENDS
995
996 case 1:
997 al_clear_to_color(al_map_rgb(0,
0,
0));
998
999 draw_phase_1_screen
(buffer,
100,
font,
&positions, positions.size
(), bmp_2, imperial, zoom_factor
[zf_index
], zf_index, trace_on
);
1000
1001 /*al5_shell_progress_text_output(buffer,
1002 gun_phys.shell_x_pos,
1003 gun_phys.shell_y_pos,
1004 gun_phys.shell_FP_degrees,
1005 gun_phys.flight_time_100_s,
1006 &font);
1007 // vestigial
1008 */
1009 al_flip_display();
1010
1011 break;
1012 // case 1 *** ENDS
1013
1014 case 2: // PHASE 2 Shell Flight Analysis
1015 al_clear_to_color(al_map_rgb(0,
0,
0));
1016 draw_phase_2_screen
(buffer,
100,
font,
&positions, positions.size
(), bmp_2, phase_2_buttons, imperial, zoom_factor
[zf_index
], selected_segment
);
1017 al_flip_display();
1018 break;
1019
1020 default:
1021 break;
1022 } // switch PHASE for ALLEGRO_EVENT_TIMER FPS *** ENDS
1023 }
1024 break;
1025 // case ALLEGRO_EVENT_TIMER *** ENDS
1026
1027 case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN:
1028 switch(phase
)
1029 {
1030 case 0:
1031 mouse_down
= true;
1032 mx
= int(ev.mouse.x
);
1033 my
= int(ev.mouse.y
);
1034 break;
1035 // case PHASE 0 for MB_DOWN *** ENDS
1036 case 2:
1037 mouse_down
= true;
1038 mx
= int(ev.mouse.x
);
1039 my
= int(ev.mouse.y
);
1040 break;
1041 }
1042 break;
1043 // case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN *** ENDS
1044
1045 case ALLEGRO_EVENT_MOUSE_BUTTON_UP:
1046 mouse_down
= false;
1047 break;
1048 // case ALLEGRO_EVENT_MOUSE_BUTTON_UP *** ENDS
1049
1050 //case ALLEGRO_EVENT_MOUSE_AXES:
1051
1052 // break;
1053
1054 case ALLEGRO_EVENT_DISPLAY_CLOSE:
1055 if(al_is_event_queue_empty(event_queue
))
1056 loop
= false;
1057 break;
1058 // case ALLEGRO_EVENT_DISPLAY_CLOSE *** ENDS
1059
1060 default:
1061 break;
1062 } // switch EV.TYPE *** ENDS
1063
1064 //------------------------------
1065 // Other activites after EVENTS *** STARTS HERE
1066 if(mouse_down
== true)
1067 {
1068 switch(phase
)
1069 {
1070 case 0:
1071 button_id
= mouse_handler
(mx, my, phase_0_buttons,
12); // 12 Buttons, BE CAREFUL!
1072 phase_0_action_handler
(button_id, geow, phase, mouse_down, imperial
/*, gun_angle*//*, muzzle_alt*/);
1073 break;
1074 case 1:
1075 break;
1076
1077 case 2:
1078 button_id
= mouse_handler
(mx, my, phase_2_buttons,
3); // 3 buttons phase 2 screen
1079 phase_2_action_handler
(button_id, geow, phase, mouse_down, positions, positions.size
(), selected_segment
/*, gun_angle, muzzle_vel*//*, muzzle_alt*/, zf_index
);
1080
1081 break;
1082
1083 default:
1084 break;
1085 }
1086 }
1087 if(geow
== true)
1088 geow
= false;
1089 } // while MAIN GAME LOOP *** ENDS
1090
1091
1092 al_destroy_bitmap(bmp_1
);
1093 al_destroy_bitmap(bmp_2
);
1094 //al5_terminate(&display, &BPS_timer, &FPS_timer, &event_queue);
1095
1096 al_destroy_display(display
);
1097 al_destroy_timer(BPS_timer
);
1098 al_destroy_timer(FPS_timer
);
1099 al_destroy_event_queue(event_queue
);
1100
1101
1102 /* al_shutdown_image_addon();
1103 al_shutdown_primitives_addon();
1104 al_shutdown_ttf_addon();
1105 al_shutdown_font_addon();
1106 al_uninstall_mouse();
1107 al_uninstall_system();*/
1108
1109 /*
1110 ALLEGRO_FONT *font = NULL;
1111 ALLEGRO_EVENT_QUEUE *event_queue = NULL;
1112 ALLEGRO_TIMER *FPS_timer = NULL;
1113 ALLEGRO_TIMER *BPS_timer = NULL;
1114 ALLEGRO_DISPLAY *display = NULL;
1115
1116 ALLEGRO_BITMAP *bmp_1;
1117 ALLEGRO_BITMAP *bmp_2;
1118 */
1119
1120 return 0;
1121}
1122
1123// The Console Prototype Pre-Alpha V-1.0
1124/*int main()
1125{
1126 double BPS = 100;
1127 int BPS_seconds = 0;
1128 int seconds = 0;
1129 cout << "Set elevation angle: ";
1130 cin >> gun_phys.shell_FP_degrees;
1131 gun_phys.shell_FP_angle = (gun_phys.shell_FP_degrees / 180) * M_PI;
1132 cout << "In radians that is: " << gun_phys.shell_FP_angle << endl;
1133 cout << "Suggested data is for Prinz Eugen's 8 inch main guns." << endl;
1134 cout << "Input muzzle velocity in m/s (eg: 925): ";
1135 cin >> gun_phys.shell_velocity;
1136 cout << "Input shell mass in kg (eg: 122): ";
1137 cin >> gun_phys.shell_mass;
1138 cout << "Input shell diameter in cm (eg: 20.3): ";
1139 cin >> gun_phys.shell_diameter;
1140 gun_phys.shell_frontal_area = pow((gun_phys.shell_diameter / 2 / 100), 2) * M_PI;
1141 cout << "Input height of gun turret in meters (eg: 9.75): ";
1142 cin >> gun_phys.gun_deck_altitude;
1143 cout << endl;
1144
1145
1146 if(false == set_rho_values())
1147 return -1;
1148
1149 if(false == set_Mach_Cd_values())
1150 return -1;
1151
1152 gun_phys.shell_y_pos = gun_phys.init_muzzle_position();
1153 gun_phys.shell_x_pos = 0;
1154
1155 while(gun_phys.shell_y_pos > 0)
1156 {
1157 gun_phys.rho_at_alt = gun_phys.Rho_Calculator();
1158 //cout << "Rho interpolation okay..." << gun_phys.rho_at_alt << endl;
1159 gun_phys.shell_Mach = gun_phys.Mach_Calculator();
1160 //cout << "Mach calc okay... " << gun_phys.shell_Mach << endl;
1161 gun_phys.Cd = gun_phys.Cd_Calculator();
1162 //cout << "Cd interpolation okay..." << endl;
1163 gun_phys.shell_velocity = gun_phys.New_Velocity_Calculator(BPS);
1164 //cout << "Velocity okay..." << endl;
1165 gun_phys.update_shell_position(BPS);
1166 //cout << "Shell position okay (X, Y)... " << gun_phys.shell_x_pos << ", " << gun_phys.shell_y_pos << endl;
1167 gun_phys.shell_FP_degrees = (gun_phys.shell_FP_angle / M_PI) * 180;
1168
1169
1170 BPS_seconds++;
1171 if(BPS_seconds >= BPS)
1172 {
1173 seconds++;
1174 BPS_seconds = 0;
1175 }
1176
1177
1178 cout << "Seconds of flight: " << seconds << "." << BPS_seconds << endl;
1179 cout << "Shell altitude: " << gun_phys.shell_y_pos << " m" << endl;
1180 cout << "Shell range: " << gun_phys.shell_x_pos << " m" << endl;
1181 cout << "Shell Mach: " << gun_phys.shell_Mach << endl;
1182 cout << "Shell true Velocity (m/s): " << gun_phys.shell_velocity << endl;
1183 cout << "Shell flight path angle: " << gun_phys.shell_FP_degrees << endl;
1184 cout << "Shell Cd: " << gun_phys.Cd << endl << endl;
1185
1186 if(gun_phys.shell_y_pos < 0)
1187 {
1188 gun_phys.end_clip();
1189 cout << "Corrected X position: " << gun_phys.shell_x_pos << endl << endl;
1190 }
1191
1192 usleep(useconds_t(1000000 / BPS));
1193 }
1194
1195 return 0;
1196}
1197
1198// Ah! Things were so easy then!
1199*/