#include "Crafting.h" void cloneRecipeManager(RecipeManager *from, RecipeManager *to) { //free old manager recipes free(to->recipes); //copy over recipes to->size = from->size; to->recipes = (Recipe*)malloc(sizeof(Recipe) * to->size); memcpy(to->recipes, from->recipes, sizeof(Recipe) * to->size); } void checkCanCraftRecipes(RecipeManager * rm, Inventory * inv){ int i, j; for(i = 0; i < rm->size; i++){ rm->recipes[i].canCraft = true; for(j = 0; j < rm->recipes[i].numOfCosts; j++){ if(countItemInv(rm->recipes[i].costs[j].costItem,0,inv) < rm->recipes[i].costs[j].costAmount){ rm->recipes[i].canCraft = false; } } } } int compareCanCraft(const void * ra, const void * rb) { Recipe* r1 = (Recipe*)ra; Recipe* r2 = (Recipe*)rb; if (r1->canCraft && !r2->canCraft) return -1; if (!r1->canCraft && r2->canCraft) return 1; return r1->order - r2->order; // Needed for stable sorting. } void sortRecipes(RecipeManager * rm){ qsort(rm->recipes,rm->size,sizeof(Recipe),compareCanCraft); } void deductCost(Cost c, Inventory * inv){ Item* item = getItemFromInventory(c.costItem, inv); if(!item->onlyOne){ item->countLevel -= c.costAmount; if(item->countLevel < 1) removeItemFromInventory(item->slotNum, inv); } else { removeItemFromInventory(item->slotNum, inv); } } bool craftItem(RecipeManager * rm, Recipe* r, Inventory* inv){ if(r->canCraft){ int i; for(i=0;inumOfCosts;++i) deductCost(r->costs[i], inv); Item item = newItem(r->itemResult,r->itemAmountLevel); if(!item.onlyOne && countItemInv(item.id,item.countLevel,inv) > 0){ getItemFromInventory(item.id, inv)->countLevel += r->itemAmountLevel; } else{ pushItemToInventoryFront(item, inv); } checkCanCraftRecipes(rm, inv); sortRecipes(rm); return true; } return false; } Cost newCost(int i, int c){ Cost nc; nc.costItem = i; nc.costAmount = c; return nc; } u8 curPlace = 0; Recipe defineRecipe(int item, int amountOrLevel, int numArgs, ...){ Recipe r; r.itemResult = item; r.itemAmountLevel = amountOrLevel; r.numOfCosts = numArgs; int i; va_list al; numArgs <<= 1; // Did this to get rid of a warning. va_start(al,numArgs); for(i=0;i