/* * Copyright (C) Volition, Inc. 1999. All rights reserved. * * All source code herein is the property of Volition, Inc. You may not sell * or otherwise commercially exploit the source or things you created based on the * source. * */ #include "cfile/cfile.h" #include "gamesequence/gamesequence.h" #include "gamesnd/gamesnd.h" #include "globalincs/alphacolors.h" #include "globalincs/pstypes.h" #include "hud/hudconfig.h" #include "hud/hudobserver.h" #include "iff_defs/iff_defs.h" #include "io/key.h" #include "parse/parselo.h" #include "playerman/player.h" #include "popup/popup.h" #include "ship/ship.h" #include "ui/ui.h" ////////////////////////////////////////////////////////////////////////////// // Game-wide Globals ////////////////////////////////////////////////////////////////////////////// #define MAX_HCF_FILES 30 int HC_num_files = -1; // num known hcf files int HC_current_file = -1; // current hcf file char *HC_filenames[MAX_HCF_FILES]; char HC_fname[MAX_FILENAME_LEN+1] = ""; UI_INPUTBOX HC_fname_input; int HC_fname_coords[GR_NUM_RESOLUTIONS][4] = { { // GR_640 44, 449, 218, 17 }, { // GR_1024 101, 730, 319, 27 } }; HUD_CONFIG_TYPE HUD_config; // Player HUD configuration char Hud_Gauge_Names[NUM_HUD_GAUGES][NAME_LENGTH] = { "lead indicator", "target orientation", "closest attacking hostile", "current target direction", "mission time", "reticle", "throttle", "radar", "target monitor", "center of reticle", "extra target info", "target shield", "player shield", "power management", "auto-target icon", "auto-speed-match icon", "weapons display", "monitoring view", "directives view", "threat gauge", "afterburner energy", "weapons energy", "weapon linking", "target hull/shield icon", "offscreen indicator", "comm video", "damage display", "message output", "locked missile direction", "countermeasures", "objective notify", "wingmen status", "offscreen range", "kills gauge", "attacking target count", "warning flash", "comm menu", "support gauge", "lag gauge" }; // specify the max distance that the radar should detect objects // See RR_ #defines in HUDconfig.h. float Radar_ranges[RR_MAX_RANGES] = { 2000.0f, // short 10000.0f, // med 10000000.0f, // infinity }; const char *Radar_range_text(int n) { #if RR_MAX_RANGES != 3 #error Number of ranges is wrong! #endif switch(n) { case 0: return XSTR( "2000 M", 246); case 1: return XSTR( "10,000 M", 247); case 2: return XSTR( "infinity", 248); } return NULL; } // default flags for observer HUD int HUD_observer_default_flags = { (1<= 0){ HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(HUD_config.clr[i].red) ); HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(HUD_config.clr[i].green) ); HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(HUD_config.clr[i].blue) ); HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(HUD_config.clr[i].alpha) ); } } // reset some ui components based on HUD config data void hud_config_synch_ui() { HUD_init_hud_color_array(); // HC_sliders[gr_screen.res][HC_BRIGHTNESS_SLIDER].slider.pos = HUD_color_alpha-3; // convert to value from 0-10 // sync sliders to currently selected gauge hud_config_synch_sliders(HC_gauge_selected); } // Init the UI components void hud_config_init_ui() { int i; struct HC_gauge_region *hg; struct ui_button_info *hb; hud_config_synch_ui(); HC_background_bitmap = bm_load(Hud_config_fname[gr_screen.res]); if (HC_background_bitmap < 0) { Warning(LOCATION, "Error loading HUD config menu background %s", Hud_config_fname[gr_screen.res]); } HC_ui_window.create( 0, 0, gr_screen.max_w_unscaled, gr_screen.max_h_unscaled, 0 ); HC_background_bitmap_mask = bm_load(Hud_config_mask_fname[gr_screen.res]); if (HC_background_bitmap_mask < 0) { Warning(LOCATION, "Error loading HUD config menu mask %s", Hud_config_mask_fname[gr_screen.res]); return; } else { HC_ui_window.set_mask_bmap(Hud_config_mask_fname[gr_screen.res]); } for (i=0; ifilename, NOX("none")) ) { continue; } hg->button.create(&HC_ui_window, "", hg->x, hg->y, 60, 30, 0, 1); // set up callback for when a mouse first goes over a button // hg->button.set_highlight_action(common_play_highlight_sound); hg->button.hide(); hg->button.link_hotspot(hg->hotspot); // if ( hg->use_iff ) { // hg->bitmap = bm_load_animation(hg->filename, &hg->nframes); // } else { hg->bitmap = bm_load(hg->filename); hg->nframes = 1; // } } // add text for(i=0; ibutton.create(&HC_ui_window, "", hb->x, hb->y, 60, 30, 0, 1); // set up callback for when a mouse first goes over a button hb->button.set_bmaps(hb->filename); hb->button.set_highlight_action(common_play_highlight_sound); hb->button.link_hotspot(hb->hotspot); } // config file input name HC_fname_input.create(&HC_ui_window, HC_fname_coords[gr_screen.res][0], HC_fname_coords[gr_screen.res][1], HC_fname_coords[gr_screen.res][2], MAX_FILENAME_LEN, "", UI_INPUTBOX_FLAG_INVIS | UI_INPUTBOX_FLAG_ESC_FOC); HC_fname_input.set_text(""); /* for (i=0; ired, use_color->green, use_color->blue, alpha); gr_set_color_fast(use_color); } else { // if its off, make it dark gray use_color = &HUD_config.clr[i]; gr_init_alphacolor(use_color, 127, 127, 127, 64); gr_set_color_fast(use_color); } // draw if ( HC_gauge_regions[gr_screen.res][i].bitmap >= 0 ) { gr_set_bitmap(HC_gauge_regions[gr_screen.res][i].bitmap); gr_aabitmap(HC_gauge_regions[gr_screen.res][i].x, HC_gauge_regions[gr_screen.res][i].y, GR_RESIZE_MENU); } /* else { int offset=0; // set correct frame if using iff if ( HC_gauge_regions[i].use_iff ) { if ( HC_gauge_selected == i ) { offset=2; } else if ( HC_gauge_hot == i ) { offset=1; } // If gauge is disabled, then draw disabled frame if ( !(hud_config_show_flag_is_set(i)) ) { offset=3; } } if ( HC_gauge_regions[i].bitmap >= 0 ) { Assert(offset < HC_gauge_regions[i].nframes); gr_set_bitmap(HC_gauge_regions[i].bitmap+offset); gr_bitmap(HC_gauge_regions[i].x, HC_gauge_regions[i].y, GR_RESIZE_MENU); } } */ } } // hud_config_init() is called when the game enters the state GS_STATE_HUD_CONFIG void hud_config_init() { hud_config_init_ui(); hud_config_backup(); // save the HUD configuration in case the player decides to cancel changes HUD_config_inited = 1; } // check for the mouse over gauge regions void hud_config_check_regions() { int i; UI_BUTTON *b; for ( i=0; ibutton_hilighted() ) { HC_gauge_hot = i; } if ( b->pressed() ) { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_gauge_selected = i; // turn off select all hud_config_select_all_toggle(0); // maybe setup rgb sliders if(HC_gauge_regions[gr_screen.res][i].use_iff){ HC_color_sliders[HCS_RED].hide(); HC_color_sliders[HCS_GREEN].hide(); HC_color_sliders[HCS_BLUE].hide(); HC_color_sliders[HCS_ALPHA].hide(); HC_color_sliders[HCS_RED].disable(); HC_color_sliders[HCS_GREEN].disable(); HC_color_sliders[HCS_BLUE].disable(); HC_color_sliders[HCS_ALPHA].disable(); } else { HC_color_sliders[HCS_RED].enable(); HC_color_sliders[HCS_GREEN].enable(); HC_color_sliders[HCS_BLUE].enable(); HC_color_sliders[HCS_ALPHA].enable(); HC_color_sliders[HCS_RED].unhide(); HC_color_sliders[HCS_GREEN].unhide(); HC_color_sliders[HCS_BLUE].unhide(); HC_color_sliders[HCS_ALPHA].unhide(); HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(HUD_config.clr[i].red) ); HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(HUD_config.clr[i].green) ); HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(HUD_config.clr[i].blue) ); HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(HUD_config.clr[i].alpha) ); } // recalc alpha slider hud_config_recalc_alpha_slider(); } } } // set the display flags for a HUD gauge void hud_config_set_gauge_flags(int gauge_index, int on_flag, int popup_flag) { if ( on_flag ) { hud_config_show_flag_set(gauge_index); } else { hud_config_show_flag_clear(gauge_index); } if ( popup_flag ) { hud_config_popup_flag_set(gauge_index); } else { hud_config_popup_flag_clear(gauge_index); } } void hud_config_record_color(int in_color) { HUD_config.main_color = in_color; HUD_color_red = HC_colors[in_color].r; HUD_color_green = HC_colors[in_color].g; HUD_color_blue = HC_colors[in_color].b; } // Set the HUD color void hud_config_set_color(int in_color) { int idx; hud_config_record_color(in_color); HUD_init_hud_color_array(); // apply the color to all gauges for(idx=0; idxoff->popup void hud_cycle_gauge_status() { if ( HC_gauge_selected < 0 ) { return; } // gauge is off, move to popup if ( !(hud_config_show_flag_is_set(HC_gauge_selected)) ) { if ( HC_gauge_regions[gr_screen.res][HC_gauge_selected].can_popup ) { hud_config_set_gauge_flags(HC_gauge_selected, 1, 1); } else { hud_config_set_gauge_flags(HC_gauge_selected, 1, 0); } return; } // if gauge is popup, move to on if ( hud_config_popup_flag_is_set(HC_gauge_selected) ) { hud_config_set_gauge_flags(HC_gauge_selected, 1, 0); return; } // gauge must be on, move to off hud_config_set_gauge_flags(HC_gauge_selected, 0, 0); } // handle keyboard input while in hud config void hud_config_handle_keypresses(int k) { switch(k) { case KEY_ESC: hud_config_cancel(); break; case KEY_CTRLED+KEY_ENTER: hud_config_commit(); break; case KEY_TAB: gamesnd_play_iface(InterfaceSounds::USER_SELECT); hud_cycle_gauge_status(); break; } } // Handlers for when buttons get pressed void hud_config_button_do(int n) { int idx; char name[256] = ""; switch (n) { case HCB_AMBER: hud_config_set_color(HUD_COLOR_AMBER); gamesnd_play_iface(InterfaceSounds::USER_SELECT); break; case HCB_BLUE: hud_config_set_color(HUD_COLOR_BLUE); gamesnd_play_iface(InterfaceSounds::USER_SELECT); break; case HCB_GREEN: hud_config_set_color(HUD_COLOR_GREEN); gamesnd_play_iface(InterfaceSounds::USER_SELECT); break; case HCB_ON: if ( HC_gauge_selected < 0 ) { break; } gamesnd_play_iface(InterfaceSounds::USER_SELECT); hud_config_set_gauge_flags(HC_gauge_selected,1,0); break; case HCB_OFF: if ( HC_gauge_selected < 0 ) { break; } gamesnd_play_iface(InterfaceSounds::USER_SELECT); hud_config_set_gauge_flags(HC_gauge_selected,0,0); break; case HCB_POPUP: if ( HC_gauge_selected < 0 ) { break; } gamesnd_play_iface(InterfaceSounds::USER_SELECT); hud_config_set_gauge_flags(HC_gauge_selected,1,1); break; case HCB_RESET: gamesnd_play_iface(InterfaceSounds::RESET_PRESSED); hud_config_select_all_toggle(0); hud_set_default_hud_config(Player); hud_config_synch_ui(); break; case HCB_ACCEPT: hud_config_commit(); break; // new stuff case HCB_RED_UP: if( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) >= 255){ gamesnd_play_iface(InterfaceSounds::GENERAL_FAIL); } else { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) + 1) ); hud_config_red_slider(); } break; case HCB_GREEN_UP: if( HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) >= 255){ gamesnd_play_iface(InterfaceSounds::GENERAL_FAIL); } else { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) + 1) ); hud_config_green_slider(); } break; case HCB_BLUE_UP: if( HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) >= 255){ gamesnd_play_iface(InterfaceSounds::GENERAL_FAIL); } else { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) + 1) ); hud_config_blue_slider(); } break; case HCB_I_UP: if( HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()) >= 255){ gamesnd_play_iface(InterfaceSounds::GENERAL_FAIL); } else { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()) + 1) ); hud_config_alpha_slider_up(); } break; case HCB_RED_DOWN: if( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) <= 0){ gamesnd_play_iface(InterfaceSounds::GENERAL_FAIL); } else { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) - 1) ); hud_config_red_slider(); } break; case HCB_GREEN_DOWN: if( HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) <= 0){ gamesnd_play_iface(InterfaceSounds::GENERAL_FAIL); } else { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) - 1) ); hud_config_green_slider(); } break; case HCB_BLUE_DOWN: if( HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) <= 0){ gamesnd_play_iface(InterfaceSounds::GENERAL_FAIL); } else { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) - 1) ); hud_config_blue_slider(); } break; case HCB_I_DOWN: if( HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()) <= 0){ gamesnd_play_iface(InterfaceSounds::GENERAL_FAIL); } else { gamesnd_play_iface(InterfaceSounds::USER_SELECT); HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()) - 1) ); hud_config_alpha_slider_down(); } break; case HCB_SAVE_HCF: int exists; char *out; // get the text in the input control exists = 0; HC_fname_input.get_text(name); if(name[0] != '\0'){ // if the filename in there already exists for(idx=0; idx= MAX_HCF_FILES){ popup(PF_USE_AFFIRMATIVE_ICON, 1, "OK", "Max number of hud config files reached!"); break; } // save the file, maybe generating a new filename if(strlen(name) <= 0){ sprintf(name, "hud_%d.hcf", HC_num_files + 1); out = name; } else { out = cf_add_ext(name, ".hcf"); } HC_filenames[HC_num_files++] = vm_strdup(out); hud_config_color_save(out); HC_fname_input.set_text(out); break; case HCB_PREV_HCF: if(HC_num_files <= 0){ break; } if(HC_current_file <= 0){ HC_current_file = HC_num_files - 1; } else { HC_current_file--; } // load em up hud_config_color_load(HC_filenames[HC_current_file]); hud_config_synch_ui(); HC_fname_input.set_text(HC_filenames[HC_current_file]); break; case HCB_NEXT_HCF: if(HC_num_files <= 0){ break; } if(HC_current_file >= HC_num_files - 1){ HC_current_file = 0; } else { HC_current_file++; } // load em up hud_config_color_load(HC_filenames[HC_current_file]); hud_config_synch_ui(); HC_fname_input.set_text(HC_filenames[HC_current_file]); break; case HCB_SELECT_ALL: hud_config_select_all_toggle(!HC_select_all); break; default: Int3(); break; } } // Check if any buttons have been pressed void hud_config_check_buttons() { int i; UI_BUTTON *b; for ( i=0; ipressed() ) { hud_config_button_do(i); } } } // set the hud color button void hud_config_draw_color_status() { if ( HC_buttons[gr_screen.res][HCB_AMBER].button.button_down() || HC_buttons[gr_screen.res][HCB_GREEN].button.button_down() || HC_buttons[gr_screen.res][HCB_BLUE].button.button_down() ) { return; } switch(HUD_config.main_color) { case HUD_COLOR_AMBER: HC_buttons[gr_screen.res][HCB_AMBER].button.draw_forced(2); break; case HUD_COLOR_GREEN: HC_buttons[gr_screen.res][HCB_GREEN].button.draw_forced(2); break; case HUD_COLOR_BLUE: HC_buttons[gr_screen.res][HCB_BLUE].button.draw_forced(2); break; } } // set the status (on/off/popup) for the selected gauge void hud_config_draw_gauge_status() { if ( HC_gauge_selected < 0 ) { return; } if ( HC_buttons[gr_screen.res][HCB_OFF].button.button_down() || HC_buttons[gr_screen.res][HCB_POPUP].button.button_down() || HC_buttons[gr_screen.res][HCB_ON].button.button_down() ) { return; } // check if off if ( !(hud_config_show_flag_is_set(HC_gauge_selected)) ) { HC_buttons[gr_screen.res][HCB_OFF].button.draw_forced(2); return; } // check if popup if ( hud_config_popup_flag_is_set(HC_gauge_selected) ) { HC_buttons[gr_screen.res][HCB_POPUP].button.draw_forced(2); return; } // check if on if ( hud_config_show_flag_is_set(HC_gauge_selected) ) { HC_buttons[gr_screen.res][HCB_ON].button.draw_forced(2); return; } Int3(); // should never get here } // disable a HUD config button void hud_config_button_disable(int index) { // HC_buttons[gr_screen.res][index].button.hide(); HC_buttons[gr_screen.res][index].button.disable(); } // enable a HUD config button void hud_config_button_enable(int index) { // HC_buttons[gr_screen.res][index].button.unhide(); HC_buttons[gr_screen.res][index].button.enable(); } // determine if on/off/popup buttons should be shown void hud_config_set_button_state() { if ( HC_gauge_selected < 0 ) { hud_config_button_disable(HCB_ON); hud_config_button_disable(HCB_OFF); hud_config_button_disable(HCB_POPUP); return; } // on/off are always on hud_config_button_enable(HCB_ON); hud_config_button_enable(HCB_OFF); // popup is maybe available if ( HC_gauge_regions[gr_screen.res][HC_gauge_selected].can_popup ) { hud_config_button_enable(HCB_POPUP); } else { hud_config_button_disable(HCB_POPUP); } } void hud_config_render_description() { int w,h,sx,sy; if ( HC_gauge_selected >= 0 ) { gr_set_color_fast(&Color_normal); gr_get_string_size(&w, &h, HC_gauge_descriptions(HC_gauge_selected)); sx = fl2i(HC_gauge_description_coords[gr_screen.res][0] + (HC_gauge_description_coords[gr_screen.res][2] - w)/2.0f); sy = HC_gauge_description_coords[gr_screen.res][1]; gr_string(sx, sy, HC_gauge_descriptions(HC_gauge_selected), GR_RESIZE_MENU); } } void hud_config_render_special_bitmaps() { /* int i; for (i=1; i= 0) { gr_set_bitmap(HC_special_bitmaps[i].bitmap); gr_bitmap(HC_special_bitmaps[i].x, HC_special_bitmaps[i].y, GR_RESIZE_MENU); } } */ } // update HUD_color_alpha based on brightness slider void hud_config_update_brightness() { // HUD_color_alpha = HC_sliders[gr_screen.res][HC_BRIGHTNESS_SLIDER].slider.pos+3; // Assert(HUD_color_alpha >= HUD_COLOR_ALPHA_USER_MIN); // Assert(HUD_color_alpha <= HUD_COLOR_ALPHA_USER_MAX); } // redraw any pressed buttons, needed since the glow on pressed buttons might get clipped off by // adjacent buttons otherwise void hud_config_redraw_pressed_buttons() { int i; UI_BUTTON *b; for ( i = 0; i < NUM_HUD_BUTTONS; i++ ) { b = &HC_buttons[gr_screen.res][i].button; if ( b->button_down() ) { b->draw_forced(2); } } } // hud_config_do_frame() is called from the main freespace loop while the game is in the state // GS_STATE_HUD_CONFIG. // void hud_config_do_frame(float /*frametime*/) { int k; if (!HUD_config_inited) { hud_config_init(); } // If we don't have a mask, we don't have enough data to do anything with this screen. if (HC_background_bitmap_mask == -1) { popup_game_feature_not_in_demo(); gameseq_post_event(GS_EVENT_PREVIOUS_STATE); return; } HC_gauge_hot = -1; hud_config_set_button_state(); k = HC_ui_window.process(); hud_config_handle_keypresses(k); hud_config_check_regions(); hud_config_check_buttons(); hud_config_update_brightness(); // set the background GR_MAYBE_CLEAR_RES(HC_background_bitmap); if ( HC_background_bitmap > 0 ) { gr_set_bitmap(HC_background_bitmap); gr_bitmap(0,0,GR_RESIZE_MENU); } // rgb slider/button stuff hud_config_process_colors(); HC_ui_window.draw(); hud_config_redraw_pressed_buttons(); hud_config_draw_gauge_status(); hud_config_draw_color_status(); /* if (HC_special_bitmaps[HC_SPECIAL_RETICLE].bitmap >= 0) { hud_set_default_color(); gr_set_bitmap(HC_special_bitmaps[HC_SPECIAL_RETICLE].bitmap); gr_aabitmap(HC_special_bitmaps[HC_SPECIAL_RETICLE].x, HC_special_bitmaps[HC_SPECIAL_RETICLE].y, GR_RESIZE_MENU); } */ // maybe force draw the select all button if(HC_select_all){ HC_buttons[gr_screen.res][HCB_SELECT_ALL].button.draw_forced(2); } hud_config_render_gauges(); hud_config_render_special_bitmaps(); hud_config_render_description(); gr_flip(); } void hud_config_unload_gauges() { int i; HC_gauge_region *hg; for (i=0; ibitmap >= 0 ) { bm_release(hg->bitmap); } hg->bitmap=-1; hg->nframes=0; } } // hud_config_close() is called when the player leaves the hud configuration screen // void hud_config_close() { // common_free_interface_palette(); // restore game palette hud_config_unload_gauges(); hud_config_color_close(); if (HC_background_bitmap != -1) { bm_release(HC_background_bitmap); } HC_ui_window.destroy(); if (HC_background_bitmap_mask != -1) { bm_release(HC_background_bitmap_mask); } } // hud_set_default_hud_config() will set the hud configuration to default values void hud_set_default_hud_config(player * /*p*/) { int idx; HUD_color_alpha = HUD_COLOR_ALPHA_DEFAULT; HUD_config.main_color = HUD_COLOR_GREEN; HUD_color_red = HC_colors[HUD_config.main_color].r; HUD_color_green = HC_colors[HUD_config.main_color].g; HUD_color_blue = HC_colors[HUD_config.main_color].b; for(idx=0; idx= 255){ HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(pos - 1) ); return; } // otherwise bump everybody up by one HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) + 1) ); HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) + 1) ); HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) + 1) ); // apply if(HC_select_all){ hud_config_stuff_colors( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) ); } else { gr_init_alphacolor(&HUD_config.clr[HC_gauge_selected], HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()), 255); } } void hud_config_alpha_slider_down() { int pos = HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()); int min = MIN(MIN( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) ), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) ); // if this would put the brightest element past its limit, skip if(min <= 0){ HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(pos + 1) ); return; } // otherwise bump everybody up by one HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) - 1) ); HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) - 1) ); HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) - 1) ); // apply if(HC_select_all){ hud_config_stuff_colors( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) ); } else { gr_init_alphacolor(&HUD_config.clr[HC_gauge_selected], HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()), 255); } } void hud_config_recalc_alpha_slider() { int avg =HC_color_sliders[HCS_RED].get_currentItem() + HC_color_sliders[HCS_GREEN].get_currentItem() + HC_color_sliders[HCS_BLUE].get_currentItem(); avg /= 3; HC_color_sliders[HCS_ALPHA].force_currentItem( avg ); } void hud_config_red_slider() { int idx; int pos = HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) ; // select all ? if(HC_select_all){ for(idx=0; idx