/** * @brief add item to a base defence slot (installation too) */ static void BDEF_AddItem_f (void) { aircraftSlot_t* slot; installation_t* installation = INS_GetCurrentSelectedInstallation(); base_t* base = B_GetCurrentSelectedBase(); technology_t** list; technology_t* itemTech = nullptr; aircraftItemType_t bdefType; int slotIDX; if ((!base && !installation) || (base && installation)) { Com_Printf("Exiting early base and installation both true or both false\n"); return; } if (cgi->Cmd_Argc() < 3) { Com_Printf("Usage: %s <type> <slotIDX>\n", cgi->Cmd_Argv(0)); return; } bdefType = BDEF_GetItemTypeFromID(cgi->Cmd_Argv(1)); slotIDX = atoi(cgi->Cmd_Argv(2)); if (bdefType == MAX_ACITEMS) { Com_Printf("BDEF_AddItem_f: Invalid defence type.\n"); return; } if (slotIDX < 0) { return; } else { int maxWeapon; if (base) maxWeapon = (bdefType == AC_ITEM_BASE_MISSILE) ? base->numActiveBatteries : base->numActiveLasers; else maxWeapon = installation->numBatteries; if (slotIDX >= maxWeapon) return; } slot = (installation) ? BDEF_GetInstallationSlotByIDX(installation, bdefType, slotIDX) : BDEF_GetBaseSlotByIDX(base, bdefType, slotIDX); if (!slot) { Com_Printf("BDEF_AddItem_f: Invalid slot.\n"); return; } list = AII_GetCraftitemTechsByType(bdefType); while (*list) { if (AIM_SelectableCraftItem(slot, *list)) { itemTech = *list; break; } list++; } if (!itemTech) return; if (!slot->nextItem) { /* we add the weapon, shield, item, or base defence if slot is free or the installation of * current item just began */ if (!slot->item || (slot->item && slot->installationTime == slot->item->craftitem.installationTime)) { AII_RemoveItemFromSlot(base, slot, false); AII_AddItemToSlot(base, itemTech, slot, false); /* Aircraft stats are updated below */ AII_AutoAddAmmo(slot); } else if (slot->item == INVSH_GetItemByID(itemTech->provides)) { /* the added item is the same than the one in current slot */ if (slot->installationTime == -slot->item->craftitem.installationTime) { /* player changed his mind: he just want to re-add the item he just removed */ slot->installationTime = 0; } else if (!slot->installationTime) { /* player try to add a weapon he already have: just skip */ } } else { /* We start removing current item in slot, and the selected item will be installed afterwards */ slot->installationTime = -slot->item->craftitem.installationTime; AII_AddItemToSlot(base, itemTech, slot, true); AII_AutoAddAmmo(slot); } } else { /* remove weapon and ammo of next item */ AII_RemoveItemFromSlot(base, slot, false); AII_AddItemToSlot(base, itemTech, slot, true); AII_AutoAddAmmo(slot); } /* Reinit menu */ cgi->Cmd_ExecuteString("basedef_updatemenu %s", BDEF_GetIDFromItemType(slot->type)); }
/** * @brief Add selected item to current zone. * @note Called from airequip menu * @sa aircraftItemType_t */ static void AIM_AircraftEquipAddItem_f (void) { int zone; aircraftSlot_t *slot; aircraft_t *aircraft = NULL; base_t *base = B_GetCurrentSelectedBase(); zone = (airequipID == AC_ITEM_AMMO) ? 2 : 1; /* proceed only if an item has been selected */ if (!aimSelectedTechnology) return; assert(base); aircraft = base->aircraftCurrent; assert(aircraft); base = aircraft->homebase; /* we need to know where items will be removed */ slot = AII_SelectAircraftSlot(aircraft, airequipID); /* the clicked button doesn't correspond to the selected zone */ if (zone != airequipSelectedZone) return; /* check if the zone exists */ if (zone >= ZONE_MAX) return; /* update the new item to slot */ switch (zone) { case ZONE_MAIN: if (!slot->nextItem) { /* we add the weapon, shield, item if slot is free or the installation of current item just began */ if (!slot->item || (slot->item && slot->installationTime == slot->item->craftitem.installationTime)) { AII_RemoveItemFromSlot(base, slot, false); AII_AddItemToSlot(base, aimSelectedTechnology, slot, false); /* Aircraft stats are updated below */ AII_AutoAddAmmo(slot); break; } else if (slot->item == INVSH_GetItemByID(aimSelectedTechnology->provides)) { /* the added item is the same than the one in current slot */ if (slot->installationTime == -slot->item->craftitem.installationTime) { /* player changed his mind: he just want to re-add the item he just removed */ slot->installationTime = 0; break; } else if (!slot->installationTime) { /* player try to add a weapon he already have: just skip */ return; } } else { /* We start removing current item in slot, and the selected item will be installed afterwards */ slot->installationTime = -slot->item->craftitem.installationTime; /* more below */ } } else { /* remove weapon and ammo of next item */ AII_RemoveNextItemFromSlot(base, slot, false); /* more below */ } /* we change the weapon, shield, item, or base defence that will be installed AFTER the removal * of the one in the slot atm */ AII_AddItemToSlot(base, aimSelectedTechnology, slot, true); AII_AutoAddAmmo(slot); break; case ZONE_AMMO: /* we can change ammo only if the selected item is an ammo (for weapon or base defence system) */ if (airequipID >= AC_ITEM_AMMO) { AII_AddAmmoToSlot(base, aimSelectedTechnology, slot); } break; default: /* Zone higher than ZONE_AMMO shouldn't exist */ return; } /* Update the values of aircraft stats (just in case an item has an installationTime of 0) */ AII_UpdateAircraftStats(aircraft); AIM_AircraftEquipMenuUpdate(); }