/** * @brief Opens the local market window. */ static void commodity_exchange_open( unsigned int wid ) { int i, ngoods; char **goods; int w, h; /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* buttons */ window_addButtonKey( wid, -20, 20, LAND_BUTTON_WIDTH, LAND_BUTTON_HEIGHT, "btnCommodityClose", "Take Off", land_buttonTakeoff, SDLK_t ); window_addButtonKey( wid, -40-((LAND_BUTTON_WIDTH-20)/2), 20*2 + LAND_BUTTON_HEIGHT, (LAND_BUTTON_WIDTH-20)/2, LAND_BUTTON_HEIGHT, "btnCommodityBuy", "Buy", commodity_buy, SDLK_b ); window_addButtonKey( wid, -20, 20*2 + LAND_BUTTON_HEIGHT, (LAND_BUTTON_WIDTH-20)/2, LAND_BUTTON_HEIGHT, "btnCommoditySell", "Sell", commodity_sell, SDLK_s ); /* cust draws the modifier */ window_addCust( wid, -40-((LAND_BUTTON_WIDTH-20)/2), 60+ 2*LAND_BUTTON_HEIGHT, (LAND_BUTTON_WIDTH-20)/2, LAND_BUTTON_HEIGHT, "cstMod", 0, commodity_renderMod, NULL, NULL ); /* text */ window_addText( wid, -20, -40, LAND_BUTTON_WIDTH, 60, 0, "txtSInfo", &gl_smallFont, &cDConsole, "You have:\n" "Market Price:\n" "\n" "Free Space:\n" ); window_addText( wid, -20, -40, LAND_BUTTON_WIDTH/2, 60, 0, "txtDInfo", &gl_smallFont, &cBlack, NULL ); window_addText( wid, -40, -120, LAND_BUTTON_WIDTH-20, h-140-LAND_BUTTON_HEIGHT, 0, "txtDesc", &gl_smallFont, &cBlack, NULL ); /* goods list */ if (land_planet->ncommodities > 0) { goods = malloc(sizeof(char*) * land_planet->ncommodities); for (i=0; i<land_planet->ncommodities; i++) goods[i] = strdup(land_planet->commodities[i]->name); ngoods = land_planet->ncommodities; } else { goods = malloc( sizeof(char*) ); goods[0] = strdup("None"); ngoods = 1; } window_addList( wid, 20, -40, w-LAND_BUTTON_WIDTH-60, h-80-LAND_BUTTON_HEIGHT, "lstGoods", goods, ngoods, 0, commodity_update ); /* Set default keyboard focuse to the list */ window_setFocus( wid , "lstGoods" ); }
/** * @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 Opens the mission computer window. */ static void misn_open( unsigned int wid ) { int w, h; int y; /* Mark as generated. */ land_tabGenerate(LAND_WINDOW_MISSION); /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* Set window functions. */ window_onClose( wid, misn_close ); /* buttons */ window_addButtonKey( wid, -20, 20, LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnCloseMission", "Take Off", land_buttonTakeoff, SDLK_t ); window_addButtonKey( wid, -20, 40+LAND_BUTTON_HEIGHT, LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnAcceptMission", "Accept Mission", misn_accept, SDLK_a ); /* text */ y = -60; window_addText( wid, w/2 + 10, y, w/2 - 30, 40, 0, "txtSDate", NULL, &cDConsole, "Date:\n" "Free Space:"); window_addText( wid, w/2 + 110, y, w/2 - 90, 40, 0, "txtDate", NULL, &cBlack, NULL ); y -= 2 * gl_defFont.h + 50; window_addText( wid, w/2 + 10, y, w/2 - 30, 20, 0, "txtSReward", &gl_smallFont, &cDConsole, "Reward:" ); window_addText( wid, w/2 + 70, y, w/2 - 90, 20, 0, "txtReward", &gl_smallFont, &cBlack, NULL ); y -= 20; window_addText( wid, w/2 + 10, y, w/2 - 30, h/2-90, 0, "txtDesc", &gl_smallFont, &cBlack, NULL ); /* map */ map_show( wid, 20, 20, w/2 - 30, h/2 - 35, 0.75 ); misn_genList(wid, 1); /* Set default keyboard focuse to the list */ window_setFocus( wid , "lstMission" ); }
/** * @brief Opens the spaceport bar window. */ static void bar_open( unsigned int wid ) { int w, h, iw, ih, bw, bh, dh, th; /* Mark as generated. */ land_tabGenerate(LAND_WINDOW_BAR); /* Set window functions. */ window_onClose( wid, bar_close ); /* Get dimensions. */ bar_getDim( wid, &w, &h, &iw, &ih, &bw, &bh ); dh = gl_printHeightRaw( &gl_smallFont, w - iw - 60, land_planet->bar_description ); /* Approach when pressing enter */ window_setAccept( wid, bar_approach ); /* Buttons */ window_addButtonKey( wid, -20, 20, bw, bh, "btnCloseBar", "Take Off", land_buttonTakeoff, SDLK_t ); window_addButtonKey( wid, -20 - bw - 20, 20, bw, bh, "btnApproach", "Approach", bar_approach, SDLK_a ); /* Bar description. */ window_addText( wid, iw + 40, -40, w - iw - 60, dh, 0, "txtDescription", &gl_smallFont, &cBlack, land_planet->bar_description ); /* Add portrait text. */ th = -40 - dh - 40; window_addText( wid, iw + 40, th, w - iw - 60, gl_defFont.h, 1, "txtPortrait", &gl_defFont, &cDConsole, NULL ); /* Add mission description text. */ th -= 20 + PORTRAIT_HEIGHT + 20 + 20; window_addText( wid, iw + 60, th, w - iw - 100, h + th - (2*bh+60), 0, "txtMission", &gl_smallFont, &cBlack, NULL ); /* Generate the mission list. */ bar_genList( wid ); /* Set default keyboard focuse to the list */ window_setFocus( wid , "iarMissions" ); }
/** * @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 Opens the shipyard window. */ void shipyard_open( unsigned int wid ) { int i; Ship **ships; char **sships; glTexture **tships; int nships; int w, h; int iw, ih; int bw, bh, padding, off; int th; int y; const char *buf; /* Mark as generated. */ land_tabGenerate(LAND_WINDOW_SHIPYARD); /* Init vars. */ shipyard_selected = NULL; /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* Calculate image array dimensions. */ iw = 310 + (w-800); ih = h - 60; /* Left padding + per-button padding * nbuttons */ padding = 40 + 20 * 4; /* Calculate button dimensions. */ bw = (w - iw - padding) / 4; bh = LAND_BUTTON_HEIGHT; /* buttons */ window_addButtonKey( wid, off = -20, 20, bw, bh, "btnCloseShipyard", "Take Off", land_buttonTakeoff, SDLK_t ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnTradeShip", "Trade-In", shipyard_trade, SDLK_r ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnBuyShip", "Buy", shipyard_buy, SDLK_b ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnFindShips", "Find Ships", shipyard_find, SDLK_f ); /* target gfx */ window_addRect( wid, -41, -50, SHIP_TARGET_W, SHIP_TARGET_H, "rctTarget", &cBlack, 0 ); window_addImage( wid, -40, -50, SHIP_TARGET_W, SHIP_TARGET_H, "imgTarget", NULL, 1 ); /* slot types */ window_addCust( wid, -20, -160, 148, 70, "cstSlots", 0., shipyard_renderSlots, NULL, NULL ); /* stat text */ window_addText( wid, -40, -240, 128, 200, 0, "txtStats", &gl_smallFont, &cBlack, NULL ); /* text */ buf = "Model:\n" "Class:\n" "Fabricator:\n" "Crew:\n" "\n" "CPU:\n" "Mass:\n" "Thrust:\n" "Speed:\n" "Turn:\n" "\n" "Absorption:\n" "Shield:\n" "Armour:\n" "Energy:\n" "Cargo Space:\n" "Fuel:\n" "Fuel Use:\n" "Price:\n" "Money:\n" "License:\n"; th = gl_printHeightRaw( &gl_smallFont, 100, buf ); y = -55; window_addText( wid, 40+iw+20, y, 100, th, 0, "txtSDesc", &gl_smallFont, &cDConsole, buf ); window_addText( wid, 40+iw+20+100, y, w-(40+iw+20+100)-20, th, 0, "txtDDesc", &gl_smallFont, &cBlack, NULL ); y -= th; window_addText( wid, 20+iw+40, y, w-(20+iw+40) - 180, 185, 0, "txtDescription", &gl_smallFont, NULL, NULL ); /* set up the ships to buy/sell */ ships = tech_getShip( land_planet->tech, &nships ); if (nships <= 0) { sships = malloc(sizeof(char*)); sships[0] = strdup("None"); tships = malloc(sizeof(glTexture*)); tships[0] = NULL; nships = 1; } else { sships = malloc(sizeof(char*)*nships); tships = malloc(sizeof(glTexture*)*nships); for (i=0; i<nships; i++) { sships[i] = strdup(ships[i]->name); tships[i] = ships[i]->gfx_store; } free(ships); } window_addImageArray( wid, 20, 20, iw, ih, "iarShipyard", 64./96.*128., 64., tships, sships, nships, shipyard_update, shipyard_rmouse ); /* write the shipyard stuff */ shipyard_update(wid, NULL); /* Set default keyboard focuse to the list */ window_setFocus( wid , "iarShipyard" ); }
/** * @brief Opens the outfit exchange center window. */ void outfits_open( unsigned int wid ) { int i; Outfit **outfits; char **soutfits; glTexture **toutfits; int noutfits; int w, h; int iw, ih; int bw, bh, off; glColour *bg, blend; const glColour *c; char **slottype; const char *slotname; /* Get dimensions. */ outfits_getSize( wid, &w, &h, &iw, &ih, &bw, &bh ); /* will allow buying from keyboard */ window_setAccept( wid, outfits_buy ); /* buttons */ window_addButtonKey( wid, off = -20, 20, bw, bh, "btnCloseOutfits", "Take Off", land_buttonTakeoff, SDLK_t ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnSellOutfit", "Sell", outfits_sell, SDLK_s ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnBuyOutfit", "Buy", outfits_buy, SDLK_b ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnFindOutfits", "Find Outfits", outfits_find, SDLK_f ); /* fancy 128x128 image */ window_addRect( wid, 19 + iw + 20, -50, 128, 129, "rctImage", &cBlack, 0 ); window_addImage( wid, 20 + iw + 20, -50-128, 0, 0, "imgOutfit", NULL, 1 ); /* cust draws the modifier */ window_addCust( wid, -40-bw, 60+2*bh, bw, bh, "cstMod", 0, outfits_renderMod, NULL, NULL ); /* the descriptive text */ window_addText( wid, 20 + iw + 20 + 128 + 20, -60, 280, 160, 0, "txtOutfitName", &gl_defFont, &cBlack, NULL ); window_addText( wid, 20 + iw + 20 + 128 + 20, -60 - gl_defFont.h - 20, 280, 160, 0, "txtDescShort", &gl_smallFont, &cBlack, NULL ); window_addText( wid, 20 + iw + 20, -60-128-10, 60, 160, 0, "txtSDesc", &gl_smallFont, &cDConsole, "Owned:\n" "\n" "Slot:\n" "Size:\n" "Mass:\n" "\n" "Price:\n" "Money:\n" "License:\n" ); window_addText( wid, 20 + iw + 20 + 60, -60-128-10, 250, 160, 0, "txtDDesc", &gl_smallFont, &cBlack, NULL ); window_addText( wid, 20 + iw + 20, -60-128-10-160, w-(iw+80), 180, 0, "txtDescription", &gl_smallFont, NULL, NULL ); /* set up the outfits to buy/sell */ outfits = tech_getOutfit( land_planet->tech, &noutfits ); if (noutfits <= 0) { /* No outfits */ soutfits = malloc(sizeof(char*)); soutfits[0] = strdup("None"); toutfits = malloc(sizeof(glTexture*)); toutfits[0] = NULL; noutfits = 1; bg = NULL; slottype = NULL; } else { /* Create the outfit arrays. */ soutfits = malloc(sizeof(char*)*noutfits); toutfits = malloc(sizeof(glTexture*)*noutfits); bg = malloc(sizeof(glColour)*noutfits); slottype = malloc(sizeof(char*)*noutfits ); for (i=0; i<noutfits; i++) { soutfits[i] = strdup(outfits[i]->name); toutfits[i] = outfits[i]->gfx_store; /* Background colour. */ c = outfit_slotSizeColour( &outfits[i]->slot ); if (c == NULL) c = &cBlack; col_blend( &blend, c, &cGrey70, 0.4 ); memcpy( &bg[i], &blend, sizeof(glColour) ); /* Get slot name. */ slotname = outfit_slotName(outfits[i]); if ((strcmp(slotname,"NA") != 0) && (strcmp(slotname,"NULL") != 0)) { slottype[i] = malloc( 2 ); slottype[i][0] = outfit_slotName(outfits[i])[0]; slottype[i][1] = '\0'; } else slottype[i] = NULL; } free(outfits); } window_addImageArray( wid, 20, 20, iw, ih, "iarOutfits", 64, 64, toutfits, soutfits, noutfits, outfits_update, outfits_rmouse ); /* write the outfits stuff */ outfits_update( wid, NULL ); outfits_updateQuantities( wid ); toolkit_setImageArraySlotType( wid, "iarOutfits", slottype ); toolkit_setImageArrayBackground( wid, "iarOutfits", bg ); /* Set default keyboard focuse to the list */ window_setFocus( wid , "iarOutfits" ); }