예제 #1
0
/**
 * @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);
	}
}
예제 #2
0
/**
 * @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;
}