/** * @brief Updates the missions in the spaceport bar. * @param wid Window to update the outfits in. * @param str Unused. */ static void bar_update( unsigned int wid, char* str ) { (void) str; int pos; int w, h, iw, ih, bw, bh, dh; /* Get dimensions. */ bar_getDim( wid, &w, &h, &iw, &ih, &bw, &bh ); dh = gl_printHeightRaw( &gl_smallFont, w - iw - 60, land_planet->bar_description ); /* Get array. */ pos = toolkit_getImageArrayPos( wid, "iarMissions" ); /* See if is news. */ if (pos==0) { /* News selected. */ if (!widget_exists(wid, "cstNews")) { /* Destroy portrait. */ if (widget_exists(wid, "imgPortrait")) { window_destroyWidget(wid, "imgPortrait"); } /* Disable button. */ window_disableButton( wid, "btnApproach" ); /* Clear text. */ window_modifyText( wid, "txtPortrait", NULL ); window_modifyText( wid, "txtMission", NULL ); /* Create news. */ news_widget( wid, iw + 60, -40 - (40 + dh), w - iw - 100, h - 40 - (dh+20) - 40 - bh - 20 ); } return; } /* Shift to ignore news now. */ pos--; /* Destroy news widget if needed. */ if (widget_exists(wid, "cstNews")) { window_destroyWidget( wid, "cstNews" ); } /* Create widgets if needed. */ if (!widget_exists(wid, "imgPortrait")) { window_addImage( wid, iw + 40 + (w-iw-60-PORTRAIT_WIDTH)/2, -(40 + dh + 40 + gl_defFont.h + 20 + PORTRAIT_HEIGHT), 0, 0, "imgPortrait", NULL, 1 ); } /* Enable button. */ window_enableButton( wid, "btnApproach" ); /* Set portrait. */ window_modifyText( wid, "txtPortrait", npc_getName( pos ) ); window_modifyImage( wid, "imgPortrait", npc_getTexture( pos ), 0, 0 ); /* Set mission description. */ window_modifyText( wid, "txtMission", npc_getDesc( pos )); }
/** * @brief Checks if should add the refuel button and does if needed. */ void land_checkAddRefuel (void) { char buf[ECON_CRED_STRLEN], cred[ECON_CRED_STRLEN]; unsigned int w; /* Check to see if fuel conditions are met. */ if (!planet_hasService(land_planet, PLANET_SERVICE_REFUEL)) { if (!widget_exists( land_windows[0], "txtRefuel" )) window_addText( land_windows[0], -20, 20 + (LAND_BUTTON_HEIGHT + 20) + 20, 200, gl_defFont.h, 1, "txtRefuel", &gl_defFont, &cBlack, "No refueling services." ); return; } /* Full fuel. */ if (player.p->fuel >= player.p->fuel_max) { if (widget_exists( land_windows[0], "btnRefuel" )) window_destroyWidget( land_windows[0], "btnRefuel" ); if (widget_exists( land_windows[0], "txtRefuel" )) window_destroyWidget( land_windows[0], "txtRefuel" ); return; } /* Autorefuel. */ if (conf.autorefuel) { spaceport_refuel( land_windows[0], "btnRefuel" ); w = land_getWid( LAND_WINDOW_EQUIPMENT ); if (w > 0) equipment_updateShips( w, NULL ); /* Must update counter. */ if (player.p->fuel >= player.p->fuel_max) return; } /* Just enable button if it exists. */ if (widget_exists( land_windows[0], "btnRefuel" )) { window_enableButton( land_windows[0], "btnRefuel"); credits2str( cred, player.p->credits, 2 ); snprintf( buf, sizeof(buf), "Credits: %s", cred ); window_modifyText( land_windows[0], "txtRefuel", buf ); } /* Else create it. */ else { /* Refuel button. */ credits2str( cred, refuel_price(), 2 ); snprintf( buf, sizeof(buf), "Refuel %s", cred ); window_addButton( land_windows[0], -20, 20 + (LAND_BUTTON_HEIGHT + 20), LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnRefuel", buf, spaceport_refuel ); /* Player credits. */ credits2str( cred, player.p->credits, 2 ); snprintf( buf, sizeof(buf), "Credits: %s", cred ); window_addText( land_windows[0], -20, 20 + 2*(LAND_BUTTON_HEIGHT + 20), LAND_BUTTON_WIDTH, gl_smallFont.h, 1, "txtRefuel", &gl_smallFont, &cBlack, buf ); } /* Make sure player can click it. */ if (!player_hasCredits( refuel_price() )) window_disableButton( land_windows[0], "btnRefuel" ); }
/** * @brief Creates the current mission list for the mission menu. * @param first 1 if it's the first time run. */ static void mission_menu_genList( unsigned int wid, int first ) { int i,j; char** misn_names; int w, h; if (!first) window_destroyWidget( wid, "lstMission" ); /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* list */ misn_names = malloc(sizeof(char*) * MISSION_MAX); j = 0; for (i=0; i<MISSION_MAX; i++) if (player_missions[i].id != 0) misn_names[j++] = (player_missions[i].title!=NULL) ? strdup(player_missions[i].title) : NULL; if (j==0) { /* no missions */ misn_names[0] = strdup("No Missions"); j = 1; } window_addList( wid, 20, -40, 300, h-340, "lstMission", misn_names, j, 0, mission_menu_update ); }
/** * @brief Creates the current mission list for the mission menu. * @param first 1 if it's the first time run. */ static void mission_menu_genList( unsigned int wid, int first ) { int i,j; char** misn_names; if (!first) window_destroyWidget( wid, "lstMission" ); /* list */ misn_names = malloc(sizeof(char*) * MISSION_MAX); j = 0; for (i=0; i<MISSION_MAX; i++) if (player_missions[i].id != 0) misn_names[j++] = strdup(player_missions[i].title); if (j==0) { /* no missions */ free(misn_names); misn_names = malloc(sizeof(char*)); misn_names[0] = strdup("No Missions"); j = 1; } window_addList( wid, 20, -40, 300, MISSIONS_HEIGHT-340, "lstMission", misn_names, j, 0, mission_menu_update ); mission_menu_update(wid ,NULL); }
/** * @brief Generates the weapons list. */ static void weapons_genList( unsigned int wid ) { const char *str; char **buf; int i; int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Destroy widget if needed. */ if (widget_exists( wid, "lstWeapSets" )) window_destroyWidget( wid, "lstWeapSets" ); /* List */ buf = malloc( sizeof(char*) * PILOT_WEAPON_SETS ); for (i=0; i<PILOT_WEAPON_SETS; i++) { str = pilot_weapSetName( info_eq_weaps.selected, i ); if (str == NULL) { buf[i] = malloc( sizeof(char) * PATH_MAX ); snprintf( buf[i], PATH_MAX, "Weapon Set %d", (i+1)%10 ); } else { buf[i] = strdup( str ); } } window_addList( wid, 20+180+20, -40, w - (20+180+20+20), 160, "lstWeapSets", buf, PILOT_WEAPON_SETS, 0, weapons_update ); /* Update. */ weapons_update( wid, NULL ); }
/** * @brief Refuels the player. * @param wid Land window. * @param str Unused. */ static void spaceport_refuel( unsigned int wid, char *str ) { (void)str; credits_t price; price = refuel_price(); if (!player_hasCredits( price )) { /* player is out of money after landing */ dialogue_alert("You seem to not have enough credits to refuel your ship." ); return; } player_modCredits( -price ); player.p->fuel = player.p->fuel_max; if (widget_exists( land_windows[0], "btnRefuel" )) { window_destroyWidget( wid, "btnRefuel" ); window_destroyWidget( wid, "txtRefuel" ); } }
/** * @brief Generates the mission list for the bar. * * @param wid Window to create mission list for. */ static int bar_genList( unsigned int wid ) { glTexture **portraits; char **names, *focused; int w, h, iw, ih, bw, bh; int n; /* Get dimensions. */ bar_getDim( wid, &w, &h, &iw, &ih, &bw, &bh ); /* Save focus. */ focused = strdup(window_getFocus(wid)); /* Destroy widget if already exists. */ if (widget_exists( wid, "iarMissions" )) window_destroyWidget( wid, "iarMissions" ); /* We sort just in case. */ npc_sort(); /* Set up missions. */ if (mission_portrait == NULL) mission_portrait = gl_newImage( PORTRAIT_GFX_PATH"news.png", 0 ); n = npc_getArraySize(); if (n <= 0) { n = 1; portraits = malloc(sizeof(glTexture*)); portraits[0] = mission_portrait; names = malloc(sizeof(char*)); names[0] = strdup("News"); } else { n = n+1; portraits = malloc( sizeof(glTexture*) * n ); portraits[0] = mission_portrait; npc_getTextureArray( &portraits[1], n-1 ); names = malloc( sizeof(char*) * n ); names[0] = strdup("News"); npc_getNameArray( &names[1], n-1 ); } window_addImageArray( wid, 20, -40, iw, ih, "iarMissions", 100, 75, portraits, names, n, bar_update, NULL ); /* write the outfits stuff */ bar_update( wid, NULL ); /* Restore focus. */ window_setFocus( wid, focused ); free(focused); return 0; }
/** * @brief Unsets the key. */ static void opt_unsetKey( unsigned int wid, char *str ) { (void) str; unsigned int parent; /* Unsets the keybind. */ input_setKeybind( opt_selectedKeybind, KEYBIND_NULL, 0, 0 ); /* Close window. */ window_close( wid, NULL ); /* Update parent window. */ parent = window_getParent( wid ); window_destroyWidget( parent, "lstKeybinds" ); menuKeybinds_genList( parent ); }
/** * @brief Restores the key defaults. */ static void opt_keyDefaults( unsigned int wid, char *str ) { (void) str; /* Ask user if he wants to. */ if (!dialogue_YesNoRaw( "Restore Defaults", "Are you sure you want to restore default keybindings?" )) return; /* Restore defaults. */ input_setDefault(); /* Regenerate list widget. */ window_destroyWidget( wid, "lstKeybinds" ); menuKeybinds_genList( wid ); /* Alert user it worked. */ dialogue_msgRaw( "Defaults Restored", "Keybindings restored to defaults."); }
/** * @brief Generates the mission list. * @param wid Window to generate the mission list for. * @param first Is it the first time generated? */ static void misn_genList( unsigned int wid, int first ) { int i,j; char** misn_names, *focused; int w,h; /* Save focus. */ focused = strdup(window_getFocus(wid)); if (!first) window_destroyWidget( wid, "lstMission" ); /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* list */ j = 1; /* make sure we don't accidentally free the memory twice. */ misn_names = NULL; if (mission_ncomputer > 0) { /* there are missions */ misn_names = malloc(sizeof(char*) * mission_ncomputer); j = 0; for (i=0; i<mission_ncomputer; i++) if (mission_computer[i].title != NULL) misn_names[j++] = strdup(mission_computer[i].title); } if ((misn_names==NULL) || (mission_ncomputer==0) || (j==0)) { /* no missions. */ if (j==0) free(misn_names); misn_names = malloc(sizeof(char*)); misn_names[0] = strdup("No Missions"); j = 1; } window_addList( wid, 20, -40, w/2 - 30, h/2 - 35, "lstMission", misn_names, j, 0, misn_update ); /* Restore focus. */ window_setFocus( wid, focused ); free(focused); /* duplicateed the save focus functionaility from the bar */ }
/** * @brief Generates the cargo list. */ static void cargo_genList( unsigned int wid ) { char **buf; int nbuf; int i; int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Destroy widget if needed. */ if (widget_exists( wid, "lstCargo" )) window_destroyWidget( wid, "lstCargo" ); /* List */ if (player.p->ncommodities==0) { /* No cargo */ buf = malloc(sizeof(char*)); buf[0] = strdup("None"); nbuf = 1; } else { /* List the player's cargo */ buf = malloc(sizeof(char*)*player.p->ncommodities); for (i=0; i<player.p->ncommodities; i++) { buf[i] = malloc(sizeof(char)*128); snprintf(buf[i],128, "%s%s %d", player.p->commodities[i].commodity->name, (player.p->commodities[i].id != 0) ? "*" : "", player.p->commodities[i].quantity); } nbuf = player.p->ncommodities; } window_addList( wid, 20, -40, w - 40, h - BUTTON_HEIGHT - 80, "lstCargo", buf, nbuf, 0, cargo_update ); cargo_update(wid, NULL); }
/** * @brief Generates the weapons list. */ static void weapons_genList( unsigned int wid ) { const char *str; char **buf, tbuf[256]; int i, n; int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Destroy widget if needed. */ if (widget_exists( wid, "lstWeapSets" )) { window_destroyWidget( wid, "lstWeapSets" ); n = toolkit_getListPos( wid, "lstWeapSets" ); } else n = -1; /* List */ buf = malloc( sizeof(char*) * PILOT_WEAPON_SETS ); for (i=0; i<PILOT_WEAPON_SETS; i++) { str = pilot_weapSetName( info_eq_weaps.selected, i ); if (str == NULL) snprintf( tbuf, sizeof(tbuf), "%d - ??", (i+1)%10 ); else snprintf( tbuf, sizeof(tbuf), "%d - %s", (i+1)%10, str ); buf[i] = strdup( tbuf ); } window_addList( wid, 20+180+20, -40, w - (20+180+20+20), 160, "lstWeapSets", buf, PILOT_WEAPON_SETS, 0, weapons_update ); /* Restore position. */ if (n >= 0) toolkit_setListPos( wid, "lstWeapSets", n ); }
/** * @brief Generates the mission list. * @param wid Window to generate the mission list for. * @param first Is it the first time generated? */ static void misn_genList( unsigned int wid, int first ) { int i,j; char** misn_names; int w,h; if (!first) window_destroyWidget( wid, "lstMission" ); /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* list */ j = 1; /* make sure we don't accidentally free the memory twice. */ misn_names = NULL; if (mission_ncomputer > 0) { /* there are missions */ misn_names = malloc(sizeof(char*) * mission_ncomputer); j = 0; for (i=0; i<mission_ncomputer; i++) if (mission_computer[i].title != NULL) misn_names[j++] = strdup(mission_computer[i].title); } if ((misn_names==NULL) || (mission_ncomputer==0) || (j==0)) { /* no missions. */ if (j==0) free(misn_names); misn_names = malloc(sizeof(char*)); misn_names[0] = strdup("No Missions"); j = 1; } window_addList( wid, 20, -40, w/2 - 30, h/2 - 35, "lstMission", misn_names, j, 0, misn_update ); /* Update the list. */ misn_update( wid, NULL ); }
/** * @brief Tries to set the key from an event. */ static int opt_setKeyEvent( unsigned int wid, SDL_Event *event ) { unsigned int parent; KeybindType type; int key; SDLMod mod, ev_mod; const char *str; int pos, off; /* See how to handle it. */ switch (event->type) { case SDL_KEYDOWN: key = event->key.keysym.sym; /* If control key make player hit twice. */ if (((key == SDLK_NUMLOCK) || (key == SDLK_CAPSLOCK) || (key == SDLK_SCROLLOCK) || (key == SDLK_RSHIFT) || (key == SDLK_LSHIFT) || (key == SDLK_RCTRL) || (key == SDLK_LCTRL) || (key == SDLK_RALT) || (key == SDLK_LALT) || (key == SDLK_RMETA) || (key == SDLK_LMETA) || (key == SDLK_LSUPER) || (key == SDLK_RSUPER)) && (opt_lastKeyPress != key)) { opt_lastKeyPress = key; return 0; } type = KEYBIND_KEYBOARD; if (window_checkboxState( wid, "chkAny" )) mod = NMOD_ALL; else { ev_mod = event->key.keysym.mod; mod = 0; if (ev_mod & (KMOD_LSHIFT | KMOD_RSHIFT)) mod |= NMOD_SHIFT; if (ev_mod & (KMOD_LCTRL | KMOD_RCTRL)) mod |= NMOD_CTRL; if (ev_mod & (KMOD_LALT | KMOD_RALT)) mod |= NMOD_ALT; if (ev_mod & (KMOD_LMETA | KMOD_RMETA)) mod |= NMOD_META; } /* Set key. */ opt_lastKeyPress = key; break; case SDL_JOYAXISMOTION: if (event->jaxis.value > 0) type = KEYBIND_JAXISPOS; else if (event->jaxis.value < 0) type = KEYBIND_JAXISNEG; else return 0; /* Not handled. */ key = event->jaxis.axis; mod = NMOD_ALL; break; case SDL_JOYBUTTONDOWN: type = KEYBIND_JBUTTON; key = event->jbutton.button; mod = NMOD_ALL; break; /* Not handled. */ default: return 0; } /* Warn if already bound. */ str = input_keyAlreadyBound( type, key, mod ); if ((str != NULL) && strcmp(str, opt_selectedKeybind)) dialogue_alert( "Key '%s' overlaps with key '%s' that was just set. " "You may want to correct this.", str, opt_selectedKeybind ); /* Set keybinding. */ input_setKeybind( opt_selectedKeybind, type, key, mod ); /* Close window. */ window_close( wid, NULL ); /* Update parent window. */ parent = window_getParent( wid ); pos = toolkit_getListPos( parent, "lstKeybinds" ); off = toolkit_getListOffset( parent, "lstKeybinds" ); window_destroyWidget( parent, "lstKeybinds" ); menuKeybinds_genList( parent ); toolkit_setListPos( parent, "lstKeybinds", pos ); toolkit_setListOffset( parent, "lstKeybinds", off ); return 0; }