/** * @brief Hires the employee in a base. * @param[in] base Which base the employee should be hired in * @param[in] employee Which employee to hire * @sa E_HireEmployeeByType * @sa E_UnhireEmployee * @todo handle EMPL_ROBOT capacities here? */ qboolean E_HireEmployee (base_t* base, employee_t* employee) { if (base->capacities[CAP_EMPLOYEES].cur >= base->capacities[CAP_EMPLOYEES].max) { UI_Popup(_("Not enough quarters"), _("You don't have enough quarters for your employees.\nBuild more quarters.")); return qfalse; } if (employee) { /* Now uses quarter space. */ employee->baseHired = base; /* Update other capacities */ switch (employee->type) { case EMPL_WORKER: base->capacities[CAP_EMPLOYEES].cur++; PR_UpdateProductionCap(base); break; case EMPL_PILOT: AIR_AutoAddPilotToAircraft(base, employee); case EMPL_SCIENTIST: case EMPL_SOLDIER: base->capacities[CAP_EMPLOYEES].cur++; break; case EMPL_ROBOT: base->capacities[CAP_ITEMS].cur += UGV_SIZE; break; case MAX_EMPL: break; } return qtrue; } return qfalse; }
/** * @brief Unloads transfer cargo when finishing the transfer or destroys it when no buildings/base. * @param[in,out] destination The destination base - might be nullptr in case the base * is already destroyed * @param[in] transfer Pointer to transfer in ccs.transfers. * @param[in] success True if the transfer reaches dest base, false if the base got destroyed. * @sa TR_TransferEnd */ static void TR_EmptyTransferCargo (base_t* destination, transfer_t* transfer, bool success) { assert(transfer); /* antimatter */ if (transfer->antimatter > 0 && success) { if (B_GetBuildingStatus(destination, B_ANTIMATTER)) { B_AddAntimatter(destination, transfer->antimatter); } else { Com_sprintf(cp_messageBuffer, sizeof(cp_messageBuffer), _("%s does not have Antimatter Storage, antimatter are removed!"), destination->name); MSO_CheckAddNewMessage(NT_TRANSFER_LOST, _("Transport mission"), cp_messageBuffer, MSG_TRANSFERFINISHED); } } /* items */ if (transfer->itemCargo != nullptr) { if (success) { linkedList_t* cargo = transfer->itemCargo->list(); LIST_Foreach(cargo, itemCargo_t, item) { if (item->amount <= 0) continue; if (!B_ItemIsStoredInBaseStorage(item->objDef)) continue; B_AddToStorage(destination, item->objDef, item->amount); } cgi->LIST_Delete(&cargo); } delete transfer->alienCargo; transfer->alienCargo = nullptr; } /* Employee */ if (transfer->hasEmployees && transfer->srcBase) { /* Employees. (cannot come from a mission) */ for (int i = EMPL_SOLDIER; i < MAX_EMPL; i++) { const employeeType_t type = (employeeType_t)i; TR_ForeachEmployee(employee, transfer, type) { employee->transfer = false; if (!success) { E_DeleteEmployee(employee); continue; } switch (type) { case EMPL_WORKER: PR_UpdateProductionCap(destination, 0); break; case EMPL_PILOT: AIR_AutoAddPilotToAircraft(destination, employee); break; default: break; } } } }