static void AIM_AircraftEquipMenuUpdate (void) { static char smallbuffer1[256]; static char smallbuffer2[128]; const char *typeName; aircraft_t *aircraft; aircraftSlot_t *slot; base_t *base = B_GetCurrentSelectedBase(); if (!base) return; /* don't let old links appear on this menu */ cgi->UI_ResetData(TEXT_AIREQUIP_1); cgi->UI_ResetData(TEXT_AIREQUIP_2); cgi->UI_ResetData(TEXT_ITEMDESCRIPTION); cgi->UI_ResetData(TEXT_LIST); aircraft = base->aircraftCurrent; assert(aircraft); /* Check that airequipSelectedSlot corresponds to an existing slot for this aircraft */ AIM_CheckAirequipSelectedSlot(aircraft); /* Select slot */ slot = AII_SelectAircraftSlot(aircraft, airequipID); /* Check that the selected zone is OK */ AIM_CheckAirequipSelectedZone(slot); /* Fill the list of item you can equip your aircraft with */ AIM_UpdateAircraftItemList(slot); Cvar_Set("mn_equip_itemtype_name", AIM_AircraftItemtypeName(airequipID)); switch (airequipID) { case AC_ITEM_ELECTRONICS: typeName = "item"; break; case AC_ITEM_SHIELD: typeName = "armour"; break; case AC_ITEM_AMMO: typeName = "ammo"; break; case AC_ITEM_WEAPON: typeName = "weapon"; break; default: typeName = "unknown"; break; } Cvar_Set("mn_equip_itemtype", typeName); /* First slot: item currently assigned */ if (!slot->item) { Com_sprintf(smallbuffer1, sizeof(smallbuffer1), "%s", _("No item assigned.\n")); Q_strcat(smallbuffer1, va(_("This slot is for %s or smaller items."), AII_WeightToName(slot->size)), sizeof(smallbuffer1)); } else { technology_t *itemTech = RS_GetTechForItem(slot->item); technology_t *nextItemTech = slot->nextItem ? RS_GetTechForItem(slot->nextItem) : NULL; /* Print next item if we are removing item currently installed and a new item has been added. */ Com_sprintf(smallbuffer1, sizeof(smallbuffer1), "%s\n", slot->nextItem ? _(nextItemTech->name) : _(itemTech->name)); if (!slot->installationTime) { Q_strcat(smallbuffer1, _("This item is functional.\n"), sizeof(smallbuffer1)); } else if (slot->installationTime > 0) { Q_strcat(smallbuffer1, va(_("This item will be installed in %i hours.\n"), slot->installationTime), sizeof(smallbuffer1)); } else if (slot->nextItem) { Q_strcat(smallbuffer1, va(_("%s will be removed in %i hours.\n"), _(itemTech->name), - slot->installationTime), sizeof(smallbuffer1)); Q_strcat(smallbuffer1, va(_("%s will be installed in %i hours.\n"), _(nextItemTech->name), slot->nextItem->craftitem.installationTime - slot->installationTime), sizeof(smallbuffer1)); } else { Q_strcat(smallbuffer1, va(_("This item will be removed in %i hours.\n"), -slot->installationTime), sizeof(smallbuffer1)); } } cgi->UI_RegisterText(TEXT_AIREQUIP_1, smallbuffer1); /* Second slot: ammo slot (only used for weapons) */ if ((airequipID == AC_ITEM_WEAPON || airequipID == AC_ITEM_AMMO) && slot->item) { if (!slot->ammo) { AIM_EmphazeAmmoSlotText(); Com_sprintf(smallbuffer2, sizeof(smallbuffer2), "%s", _("No ammo assigned to this weapon.")); } else { const objDef_t *ammo = slot->nextAmmo ? slot->nextAmmo : slot->ammo; const technology_t *tech = RS_GetTechForItem(ammo); AIM_NoEmphazeAmmoSlotText(); if (!ammo->isVirtual) Q_strncpyz(smallbuffer2, _(tech->name), sizeof(smallbuffer2)); else Q_strncpyz(smallbuffer2, _("No ammo needed"), sizeof(smallbuffer2)); } } else *smallbuffer2 = '\0'; cgi->UI_RegisterText(TEXT_AIREQUIP_2, smallbuffer2); /* Draw existing slots for this aircraft */ AIM_DrawAircraftSlots(aircraft); }
/** * @brief Prints the (UFOpaedia and other) description for aircraft items * @param item The object definition of the item * @sa UP_Article * Not only called from UFOpaedia but also from other places to display * @todo Don't display things like speed for base defence items - a missile * facility isn't getting slower or faster due a special weapon or ammunition */ void UP_AircraftItemDescription (const objDef_t* item) { static char itemText[1024]; const technology_t* tech; /* Set menu text node content to null. */ cgi->INV_ItemDescription(nullptr); *itemText = '\0'; /* no valid item id given */ if (!item) { cgi->Cvar_Set("mn_item", ""); cgi->Cvar_Set("mn_itemname", ""); cgi->Cvar_Set("mn_upmodel_top", ""); cgi->UI_ResetData(TEXT_ITEMDESCRIPTION); return; } tech = RS_GetTechForItem(item); /* select item */ cgi->Cvar_Set("mn_item", "%s", item->id); cgi->Cvar_Set("mn_itemname", "%s", _(item->name)); if (tech->mdl) cgi->Cvar_Set("mn_upmodel_top", "%s", tech->mdl); else cgi->Cvar_Set("mn_upmodel_top", ""); /* set description text */ if (RS_IsResearched_ptr(tech)) { const objDef_t* ammo = nullptr; switch (item->craftitem.type) { case AC_ITEM_WEAPON: Q_strcat(itemText, sizeof(itemText), _("Weight:\t%s\n"), AII_WeightToName(AII_GetItemWeightBySize(item))); break; case AC_ITEM_BASE_MISSILE: case AC_ITEM_BASE_LASER: Q_strcat(itemText, sizeof(itemText), _("Weapon for base defence system\n")); break; case AC_ITEM_AMMO: ammo = item; break; default: break; } /* check ammo of weapons */ if (item->craftitem.type <= AC_ITEM_WEAPON) { for(int i = 0; i < item->numAmmos; i++) if (item->ammos[i]->isVirtual) { ammo = item->ammos[i]; break; } } if (ammo) { /* We display the characteristics of this ammo */ Q_strcat(itemText, sizeof(itemText), _("Ammo:\t%i\n"), ammo->ammo); if (!EQUAL(ammo->craftitem.weaponDamage, 0)) Q_strcat(itemText, sizeof(itemText), _("Damage:\t%i\n"), (int) ammo->craftitem.weaponDamage); Q_strcat(itemText, sizeof(itemText), _("Reloading time:\t%i\n"), (int) ammo->craftitem.weaponDelay); } /* We write the range of the weapon */ if (!EQUAL(item->craftitem.stats[AIR_STATS_WRANGE], 0)) Q_strcat(itemText, sizeof(itemText), "%s:\t%i\n", UP_AircraftStatToName(AIR_STATS_WRANGE), AIR_AircraftMenuStatsValues(item->craftitem.stats[AIR_STATS_WRANGE], AIR_STATS_WRANGE)); /* we scan all stats except weapon range */ for (int i = 0; i < AIR_STATS_MAX; i++) { const char* statsName = UP_AircraftStatToName(i); if (i == AIR_STATS_WRANGE) continue; if (item->craftitem.stats[i] > 2.0f) Q_strcat(itemText, sizeof(itemText), "%s:\t+%i\n", statsName, AIR_AircraftMenuStatsValues(item->craftitem.stats[i], i)); else if (item->craftitem.stats[i] < -2.0f) Q_strcat(itemText, sizeof(itemText), "%s:\t%i\n", statsName, AIR_AircraftMenuStatsValues(item->craftitem.stats[i], i)); else if (item->craftitem.stats[i] > 1.0f) Q_strcat(itemText, sizeof(itemText), _("%s:\t+%i %%\n"), statsName, (int)(item->craftitem.stats[i] * 100) - 100); else if (!EQUAL(item->craftitem.stats[i], 0)) Q_strcat(itemText, sizeof(itemText), _("%s:\t%i %%\n"), statsName, (int)(item->craftitem.stats[i] * 100) - 100); } } else { Q_strcat(itemText, sizeof(itemText), _("Unknown - need to research this")); } cgi->Cvar_Set("mn_upmetadata", "1"); cgi->UI_RegisterText(TEXT_ITEMDESCRIPTION, itemText); }