/** * @brief Delete the selected entry from the queue. * @param[in] base Pointer to base, where the queue is. * @param[in] queue Pointer to the queue. * @param[in] index Selected index in queue. */ void PR_QueueDelete (base_t* base, production_queue_t* queue, int index) { production_t* prod = &queue->items[index]; const technology_t* tech = PR_GetTech(&prod->data); if (tech == nullptr) cgi->Com_Error(ERR_DROP, "No tech pointer for production"); PR_ResetUFODisassembly(prod); assert(base); PR_UpdateRequiredItemsInBasestorage(base, prod->amount, &tech->requireForProduction); REMOVE_ELEM_ADJUST_IDX(queue->items, index, queue->numItems); /* Adjust ufos' disassembly pointer */ for (int i = index; i < queue->numItems; i++) { production_t* disassembly = &queue->items[i]; PR_SetUFODisassembly(disassembly); } }
/** * @brief Add a new item to the bottom of the production queue. * @param[in] base Pointer to base, where the queue is. * @param[in] data The production data * @param[in] amount Desired amount to produce. * @return @c NULL in case the production wasn't enqueued, otherwise the production pointer */ production_t* PR_QueueNew (base_t* base, const productionData_t* data, signed int amount) { production_queue_t* queue = PR_GetProductionForBase(base); if (queue->numItems >= MAX_PRODUCTIONS) return nullptr; /* Initialize */ production_t* prod = &queue->items[queue->numItems]; OBJZERO(*prod); /* self-reference. */ prod->idx = queue->numItems; prod->data = *data; prod->amount = amount; const technology_t* tech = PR_GetTech(&prod->data); if (tech == nullptr) return nullptr; /* only one item for disassemblies */ if (PR_IsDisassemblyData(data)) amount = 1; else if (tech->produceTime < 0) /* Don't try to add an item to the queue which is not producible. */ return nullptr; amount = PR_RequirementsMet(amount, &tech->requireForProduction, base); if (amount == 0) return nullptr; prod->totalFrames = PR_CalculateTotalFrames(base, data); PR_UpdateRequiredItemsInBasestorage(base, -amount, &tech->requireForProduction); PR_SetUFODisassembly(prod); queue->numItems++; return prod; }