/*! Mode initialization function \author jfpatry \date Created: 2000-09-24 \date Modified: 2000-09-24 */ static void race_select_init(void) { listbox_list_elem_to_string_fptr_t conv_func = NULL; point2d_t dummy_pos = {0, 0}; int i; winsys_set_display_func( main_loop ); winsys_set_idle_func( main_loop ); winsys_set_reshape_func( reshape ); winsys_set_mouse_func( ui_event_mouse_func ); winsys_set_motion_func( ui_event_motion_func ); winsys_set_passive_motion_func( ui_event_motion_func ); plyr = get_player_data( local_player() ); g_game.rankings_loaded=false; /* Setup the race list */ if ( g_game.practicing ) { g_game.current_event = "__Practice_Event__"; g_game.current_cup = "__Practice_Cup__"; if(g_game.is_speed_only_mode) race_list = get_speed_courses_list(); else race_list = get_score_courses_list(); conv_func = get_name_from_open_course_data; cup_data = NULL; last_completed_race = NULL; event_data = NULL; } else { event_data = (event_data_t*) get_list_elem_data( get_event_by_name( g_game.current_event ) ); check_assertion( event_data != NULL, "Couldn't find current event." ); cup_data = (cup_data_t*) get_list_elem_data( get_event_cup_by_name( event_data, g_game.current_cup ) ); check_assertion( cup_data != NULL, "Couldn't find current cup." ); race_list = get_cup_race_list( cup_data ); conv_func = get_name_from_race_data; } /* Unless we're coming back from a race, initialize the race data to defaults. */ if ( g_game.prev_mode != GAME_OVER ) { /* Make sure we don't play previously loaded course */ cup_complete = False; /* Initialize the race data */ cur_elem = get_list_head( race_list ); if ( g_game.practicing ) { g_game.race.course = NULL; g_game.race.name = NULL; g_game.race.description = NULL; for (i=0; i<DIFFICULTY_NUM_LEVELS; i++) { g_game.race.herring_req[i] = 0; g_game.race.time_req[i] = 0; g_game.race.score_req[i] = 0; } g_game.race.mirrored = False; g_game.race.conditions = RACE_CONDITIONS_SUNNY; g_game.race.windy = False; g_game.race.snowing = False; } else { /* Not practicing */ race_data_t *data; data = (race_data_t*) get_list_elem_data( cur_elem ); g_game.race = *data; if ( is_cup_complete( event_data, get_event_cup_by_name( event_data, g_game.current_cup ) ) ) { cup_complete = True; last_completed_race = get_list_tail( race_list ); } else { cup_complete = False; last_completed_race = NULL; } } } else { /* Back from a race */ if ( !g_game.race_aborted ) { update_race_results(); } } /* Create buttons */ back_btn = button_create( dummy_pos, 150, 40, "button_label", Localize("Back","") ); button_set_hilit_font_binding( back_btn, "button_label_hilit" ); button_set_visible( back_btn, True ); button_set_click_event_cb( back_btn, back_click_cb, NULL ); start_btn = button_create( dummy_pos, 150, 40, "button_label", Localize("Race!","") ); button_set_hilit_font_binding( start_btn, "button_label_hilit" ); button_set_disabled_font_binding( start_btn, "button_label_disabled" ); button_set_visible( start_btn, True ); button_set_click_event_cb( start_btn, start_click_cb, NULL ); fb_btn = button_create( dummy_pos, 134, 31, NULL, ""); button_set_image(fb_btn, "postFB", make_point2d(0,0), make_point2d(134.0/256.0, 1 ), white); button_set_clicked_image(fb_btn, "postFB_down", make_point2d(0, 0 ), make_point2d(134.0/256.0, 1), white); button_set_click_event_cb( fb_btn, fb_click_cb, NULL ); if (g_game.practicing) button_set_visible( fb_btn, True ); else button_set_visible( fb_btn, False ); race_listbox = listbox_create( dummy_pos, 300, 44, "course_name_label", race_list, conv_func ); listbox_set_current_item( race_listbox, cur_elem ); listbox_set_item_change_event_cb( race_listbox, race_listbox_item_change_cb, NULL ); listbox_set_visible( race_listbox, True ); /* * Create text area */ desc_ta = textarea_create( dummy_pos, 170, 147, "race_description", "" ); if ( g_game.practicing ) { open_course_data_t *data; data = (open_course_data_t*) get_list_elem_data( cur_elem ); textarea_set_text( desc_ta, data->description ); } else { race_data_t *data; data = (race_data_t*) get_list_elem_data( cur_elem ); textarea_set_text( desc_ta, data->description ); } textarea_set_visible( desc_ta, True ); /* * Create state buttons - only if practicing or if cup_complete */ if ( g_game.practicing || cup_complete ) { /* mirror */ mirror_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( mirror_ssbtn, 0, "mirror_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( mirror_ssbtn, 1, "mirror_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( mirror_ssbtn, (int)g_game.race.mirrored ); #ifdef __APPLE__ ssbutton_set_visible( mirror_ssbtn, False ); #else ssbutton_set_visible( mirror_ssbtn, True ); #endif /* conditions */ conditions_ssbtn = ssbutton_create( dummy_pos, 32, 32, 4 ); float border = 2.0; ssbutton_set_state_image( conditions_ssbtn, 0, "conditions_button", make_point2d( (0.0 + border)/64.0, (32.0 + border)/64.0 ), make_point2d( (32.0 - border)/64.0, (64.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 1, "conditions_button", make_point2d( (32.0 + border)/64.0, (0.0 + border)/64.0 ), make_point2d( (64.0 - border)/64.0, (32.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 2, "conditions_button", make_point2d( (32.0 + border)/64.0, (32.0 + border)/64.0 ), make_point2d( (64.0 - border)/64.0, (64.0 - border)/64.0 ), white ); ssbutton_set_state_image( conditions_ssbtn, 3, "conditions_button", make_point2d( (0.0 + border)/64.0, (0.0 + border)/64.0 ), make_point2d( (32.0 - border)/64.0, (32.0 - border)/64.0 ), white ); ssbutton_set_state( conditions_ssbtn, (int)g_game.race.conditions ); ssbutton_set_visible( conditions_ssbtn, True ); #ifdef __APPLE__ ssbutton_set_visible( conditions_ssbtn, False ); #else ssbutton_set_visible( conditions_ssbtn, True ); #endif /* wind */ wind_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( wind_ssbtn, 0, "wind_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( wind_ssbtn, 1, "wind_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( wind_ssbtn, (int)g_game.race.windy ); #ifdef __APPLE__ ssbutton_set_visible( wind_ssbtn, False ); #else ssbutton_set_visible( wind_ssbtn, True ); #endif /* snow */ snow_ssbtn = ssbutton_create( dummy_pos, 32, 32, 2 ); ssbutton_set_state_image( snow_ssbtn, 0, "snow_button", make_point2d( 0.0/64.0, 32.0/64.0 ), make_point2d( 32.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state_image( snow_ssbtn, 1, "snow_button", make_point2d( 32.0/64.0, 32.0/64.0 ), make_point2d( 64.0/64.0, 64.0/64.0 ), white ); ssbutton_set_state( snow_ssbtn, (int)g_game.race.snowing ); #ifdef __APPLE__ ssbutton_set_visible( snow_ssbtn, False ); #else ssbutton_set_visible( snow_ssbtn, True ); #endif /* XXX snow button doesn't do anything, so disable for now */ ssbutton_set_enabled( snow_ssbtn, False ); /* Can't change conditions if in cup mode */ if ( !g_game.practicing ) { ssbutton_set_enabled( conditions_ssbtn, False ); ssbutton_set_enabled( wind_ssbtn, False ); ssbutton_set_enabled( snow_ssbtn, False ); ssbutton_set_enabled( mirror_ssbtn, False ); } } else { conditions_ssbtn = NULL; wind_ssbtn = NULL; snow_ssbtn = NULL; mirror_ssbtn = NULL; } update_race_data(); update_button_enabled_states(); play_music( "start_screen" ); }
/*! Creates a new listbox \return The new listbox object \author jfpatry \date Created: 2000-09-17 \date Modified: 2000-09-17 */ listbox_t* listbox_create( point2d_t pos, scalar_t w, scalar_t h, char *font_binding, list_t item_list, listbox_list_elem_to_string_fptr_t func ) { listbox_t *listbox; char *binding; point2d_t ll; point2d_t ur; listbox = (listbox_t*)malloc( sizeof(listbox_t) ); check_assertion( listbox != NULL, "out of memory" ); listbox->pos = pos; listbox->w = w; listbox->h = h; listbox->arrow_width = DEFAULT_ARROW_REGION_WIDTH; listbox->border_width = DEFAULT_BORDER_WIDTH; listbox->text_pad = DEFAULT_TEXT_PAD; listbox->arrow_vert_separation = DEFAULT_ARROW_VERT_SEPARATION; listbox->font_binding = font_binding; listbox->border_colour = ui_foreground_colour; listbox->background_colour = ui_background_colour; /* Create up arrow button */ listbox->up_button = button_create( make_point2d( 0, 0 ), /* position will be set later */ DEFAULT_ARROW_BUTTON_WIDTH, (mWidth>320)?DEFAULT_ARROW_BUTTON_HEIGHT:DEFAULT_ARROW_BUTTON_HEIGHT/2, NULL, NULL ); binding = "listbox_arrows"; ll = make_point2d( 0.0/64.0, 16.0/64.0 ); ur = make_point2d( 32.0/64.0, 32.0/64.0 ); button_set_image( listbox->up_button, binding, ll, ur, white ); ll = make_point2d( 32.0/64.0, 16.0/64.0 ); ur = make_point2d( 64.0/64.0, 32.0/64.0 ); button_set_disabled_image( listbox->up_button, binding, ll, ur, white ); ll = make_point2d( 32.0/64.0, 48.0/64.0 ); ur = make_point2d( 64.0/64.0, 64.0/64.0 ); button_set_hilit_image( listbox->up_button, binding, ll, ur, white ); ll = make_point2d( 0.0/64.0, 48.0/64.0 ); ur = make_point2d( 32.0/64.0, 64.0/64.0 ); button_set_clicked_image( listbox->up_button, binding, ll, ur, white ); button_set_click_event_cb( listbox->up_button, listbox_arrow_click_cb, listbox ); /* Create down arrow button */ listbox->down_button = button_create( make_point2d( 0, 0 ), /* position will be set later */ DEFAULT_ARROW_BUTTON_WIDTH, (mWidth>320)?DEFAULT_ARROW_BUTTON_HEIGHT:DEFAULT_ARROW_BUTTON_HEIGHT/2, NULL, NULL ); binding = "listbox_arrows"; ll = make_point2d( 0.0/64.0, 0.0/64.0 ); ur = make_point2d( 32.0/64.0, 16.0/64.0 ); button_set_image( listbox->down_button, binding, ll, ur, white ); ll = make_point2d( 32.0/64.0, 0.0/64.0 ); ur = make_point2d( 64.0/64.0, 16.0/64.0 ); button_set_disabled_image( listbox->down_button, binding, ll, ur, white ); ll = make_point2d( 32.0/64.0, 32.0/64.0 ); ur = make_point2d( 64.0/64.0, 48.0/64.0 ); button_set_hilit_image( listbox->down_button, binding, ll, ur, white ); ll = make_point2d( 0.0/64.0, 32.0/64.0 ); ur = make_point2d( 32.0/64.0, 48.0/64.0 ); button_set_clicked_image( listbox->down_button, binding, ll, ur, white ); button_set_click_event_cb( listbox->down_button, listbox_arrow_click_cb, listbox ); button_set_click_event_cb( listbox->down_button, listbox_arrow_click_cb, listbox ); listbox->item_change_cb = NULL; listbox->item_change_cb_userdata = NULL; listbox->item_list = item_list; listbox->cur_item = get_list_head( listbox->item_list ); listbox->label_gen_func = func; listbox->visible = False; listbox->active = False; update_button_enabled_states( listbox ); update_button_positions( listbox ); return listbox; }