@ -693,6 +693,9 @@ void render_orbital_preview(SimulationState* sim, UIState* ui_state, Rectangle b
void render_maneuver_hohmann_tab ( SimulationState * sim , UIState * ui_state , int x , int y , int width , int height ) {
int current_y = y ;
ui_state - > maneuver_dialog . show_error = false ;
ui_state - > maneuver_dialog . error_message [ 0 ] = ' \0 ' ;
if ( ui_state - > maneuver_dialog . craft_index > = 0 & &
ui_state - > maneuver_dialog . craft_index < sim - > craft_count ) {
Spacecraft * craft = & sim - > spacecraft [ ui_state - > maneuver_dialog . craft_index ] ;
@ -802,6 +805,12 @@ void render_maneuver_hohmann_tab(SimulationState* sim, UIState* ui_state, int x,
}
current_y + = 40 ;
if ( ui_state - > maneuver_dialog . show_error ) {
Rectangle error_bounds = { ( float ) x + 8 , ( float ) current_y , ( float ) width - 16 , 25 } ;
GuiLabel ( error_bounds , TextFormat ( " Error: %s " , ui_state - > maneuver_dialog . error_message ) ) ;
current_y + = 30 ;
}
if ( ui_state - > maneuver_dialog . show_hohmann_preview ) {
HohmannTransfer * ht = & ui_state - > maneuver_dialog . last_calc ;
@ -865,30 +874,85 @@ void render_maneuver_hohmann_tab(SimulationState* sim, UIState* ui_state, int x,
void calculate_hohmann_for_dialog ( SimulationState * sim , UIState * ui_state ) {
ui_state - > maneuver_dialog . show_hohmann_preview = false ;
ui_state - > maneuver_dialog . show_error = false ;
ui_state - > maneuver_dialog . error_message [ 0 ] = ' \0 ' ;
if ( ui_state - > maneuver_dialog . craft_index < 0 | |
ui_state - > maneuver_dialog . craft_index > = sim - > craft_count ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" No spacecraft selected " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
if ( ui_state - > maneuver_dialog . transfer_body_index < 0 | |
ui_state - > maneuver_dialog . transfer_body_index > = sim - > body_count | |
ui_state - > maneuver_dialog . target_body_index < 0 | |
ui_state - > maneuver_dialog . transfer_body_index > = sim - > body_count ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" Invalid transfer parent body selected " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
if ( ui_state - > maneuver_dialog . current_body_index < 0 | |
ui_state - > maneuver_dialog . current_body_index > = sim - > body_count ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" Invalid current body selected " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
if ( ui_state - > maneuver_dialog . target_body_index < 0 | |
ui_state - > maneuver_dialog . target_body_index > = sim - > body_count ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" Invalid target body selected " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
if ( ui_state - > maneuver_dialog . transfer_body_index = = ui_state - > maneuver_dialog . target_body_index ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" Current and target bodies must be different " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
Spacecraft * craft = & sim - > spacecraft [ ui_state - > maneuver_dialog . craft_index ] ;
if ( craft - > parent_index ! = ui_state - > maneuver_dialog . current_body_index ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" Spacecraft is not orbiting the selected current body " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
CelestialBody * central_body = & sim - > bodies [ ui_state - > maneuver_dialog . transfer_body_index ] ;
CelestialBody * transfer _body = & sim - > bodies [ ui_state - > maneuver_dialog . transfer_body_index ] ;
CelestialBody * current_body = & sim - > bodies [ ui_state - > maneuver_dialog . current_body_index ] ;
CelestialBody * target_body = & sim - > bodies [ ui_state - > maneuver_dialog . target_body_index ] ;
double r1 = current_body - > orbit . semi_major_axis ;
double r2 = target_body - > orbit . semi_major_axis ;
if ( r1 < = 0 | | r2 < = 0 ) {
if ( r1 < = 0 ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" Current body has invalid orbit (semi-major axis <= 0) " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
if ( r2 < = 0 ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" Target body has invalid orbit (semi-major axis <= 0) " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
if ( transfer_body - > mass < = 0 ) {
snprintf ( ui_state - > maneuver_dialog . error_message , sizeof ( ui_state - > maneuver_dialog . error_message ) ,
" Transfer parent has invalid mass " ) ;
ui_state - > maneuver_dialog . show_error = true ;
return ;
}
ui_state - > maneuver_dialog . last_calc = calculate_hohmann_transfer ( r1 , r2 , central_body - > mass ) ;
ui_state - > maneuver_dialog . last_calc = calculate_hohmann_transfer ( r1 , r2 , transfer _body- > mass ) ;
ui_state - > maneuver_dialog . show_hohmann_preview = true ;
}