/* items: actually *items[9] return value: allocates a new item, or returns NULL. */ InventoryItem *craft_get_result(InventoryItem **items) { // Wood { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_TREE); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_WOOD, 4); } } // Stick { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); if(checkItemCombination(items, specs)) { return new CraftItem("Stick", 4); } } // Fence { ItemSpec specs[9]; specs[3] = ItemSpec(ITEM_CRAFT, "Stick"); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[5] = ItemSpec(ITEM_CRAFT, "Stick"); specs[6] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); specs[8] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_FENCE, 2); } } // Sign { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[2] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[3] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[4] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[5] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { //return new MapBlockObjectItem("Sign"); return new MaterialItem(CONTENT_SIGN_WALL, 1); } } // Torch { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_CRAFT, "lump_of_coal"); specs[3] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_TORCH, 4); } } // Wooden pick { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[2] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("WPick", 0); } } // Stone pick { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[2] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("STPick", 0); } } // Steel pick { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[1] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[2] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("SteelPick", 0); } } // Mese pick { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_MESE); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_MESE); specs[2] = ItemSpec(ITEM_MATERIAL, CONTENT_MESE); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("MesePick", 0); } } // Wooden shovel { ItemSpec specs[9]; specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("WShovel", 0); } } // Stone shovel { ItemSpec specs[9]; specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("STShovel", 0); } } // Steel shovel { ItemSpec specs[9]; specs[1] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("SteelShovel", 0); } } // Wooden axe { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[3] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("WAxe", 0); } } // Stone axe { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[3] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("STAxe", 0); } } // Steel axe { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[1] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[3] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("SteelAxe", 0); } } // Wooden sword { ItemSpec specs[9]; specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[4] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("WSword", 0); } } // Stone sword { ItemSpec specs[9]; specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[4] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("STSword", 0); } } // Steel sword { ItemSpec specs[9]; specs[1] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[4] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new ToolItem("SteelSword", 0); } } // Rail { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[1] = ItemSpec(ITEM_CRAFT, "Stick"); specs[2] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[3] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[5] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[6] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[7] = ItemSpec(ITEM_CRAFT, "Stick"); specs[8] = ItemSpec(ITEM_CRAFT, "steel_ingot"); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_RAIL, 15); } } // Chest { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[2] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[3] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[5] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[6] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[7] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[8] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_CHEST, 1); } } // Furnace { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[2] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[3] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[5] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[6] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[7] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); specs[8] = ItemSpec(ITEM_MATERIAL, CONTENT_COBBLE); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_FURNACE, 1); } } // Steel block { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[1] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[2] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[3] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[4] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[5] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[6] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[7] = ItemSpec(ITEM_CRAFT, "steel_ingot"); specs[8] = ItemSpec(ITEM_CRAFT, "steel_ingot"); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_STEEL, 1); } } // Sandstone { ItemSpec specs[9]; specs[3] = ItemSpec(ITEM_MATERIAL, CONTENT_SAND); specs[4] = ItemSpec(ITEM_MATERIAL, CONTENT_SAND); specs[6] = ItemSpec(ITEM_MATERIAL, CONTENT_SAND); specs[7] = ItemSpec(ITEM_MATERIAL, CONTENT_SAND); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_SANDSTONE, 1); } } // Clay { ItemSpec specs[9]; specs[3] = ItemSpec(ITEM_CRAFT, "lump_of_clay"); specs[4] = ItemSpec(ITEM_CRAFT, "lump_of_clay"); specs[6] = ItemSpec(ITEM_CRAFT, "lump_of_clay"); specs[7] = ItemSpec(ITEM_CRAFT, "lump_of_clay"); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_CLAY, 1); } } // Brick { ItemSpec specs[9]; specs[3] = ItemSpec(ITEM_CRAFT, "clay_brick"); specs[4] = ItemSpec(ITEM_CRAFT, "clay_brick"); specs[6] = ItemSpec(ITEM_CRAFT, "clay_brick"); specs[7] = ItemSpec(ITEM_CRAFT, "clay_brick"); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_BRICK, 1); } } // Paper { ItemSpec specs[9]; specs[3] = ItemSpec(ITEM_MATERIAL, CONTENT_PAPYRUS); specs[4] = ItemSpec(ITEM_MATERIAL, CONTENT_PAPYRUS); specs[5] = ItemSpec(ITEM_MATERIAL, CONTENT_PAPYRUS); if(checkItemCombination(items, specs)) { return new CraftItem("paper", 1); } } // Book { ItemSpec specs[9]; specs[1] = ItemSpec(ITEM_CRAFT, "paper"); specs[4] = ItemSpec(ITEM_CRAFT, "paper"); specs[7] = ItemSpec(ITEM_CRAFT, "paper"); if(checkItemCombination(items, specs)) { return new CraftItem("book", 1); } } // Book shelf { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[2] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[3] = ItemSpec(ITEM_CRAFT, "book"); specs[4] = ItemSpec(ITEM_CRAFT, "book"); specs[5] = ItemSpec(ITEM_CRAFT, "book"); specs[6] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[7] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); specs[8] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_BOOKSHELF, 1); } } // Ladder { ItemSpec specs[9]; specs[0] = ItemSpec(ITEM_CRAFT, "Stick"); specs[2] = ItemSpec(ITEM_CRAFT, "Stick"); specs[3] = ItemSpec(ITEM_CRAFT, "Stick"); specs[4] = ItemSpec(ITEM_CRAFT, "Stick"); specs[5] = ItemSpec(ITEM_CRAFT, "Stick"); specs[6] = ItemSpec(ITEM_CRAFT, "Stick"); specs[8] = ItemSpec(ITEM_CRAFT, "Stick"); if(checkItemCombination(items, specs)) { return new MaterialItem(CONTENT_LADDER, 1); } } return NULL; }
virtual InventoryItem* getCraftResult(const CraftPointerInput &input_cpi, IGameDef *gamedef) const { if(input_cpi.width > 3){ errorstream<<"getCraftResult(): ERROR: " <<"input_cpi.width > 3; Failing to craft."<<std::endl; return NULL; } InventoryItem *input_items[9]; for(u32 y=0; y<3; y++) for(u32 x=0; x<3; x++) { u32 i=y*3+x; if(x >= input_cpi.width || y >= input_cpi.height()) input_items[i] = NULL; else input_items[i] = input_cpi.items[y*input_cpi.width+x]; } for(core::list<CraftDefinition*>::ConstIterator i = m_craft_definitions.begin(); i != m_craft_definitions.end(); i++) { CraftDefinition *def = *i; /*infostream<<"Checking "<<createInput(input_cpi).dump()<<std::endl <<" against "<<def->input.dump() <<" (output=\""<<def->output<<"\")"<<std::endl;*/ try { CraftPointerInput spec_cpi = createPointerInput(def->input, gamedef); if(spec_cpi.width > 3){ errorstream<<"getCraftResult: ERROR: " <<"spec_cpi.width > 3 in recipe " <<def->dump()<<std::endl; continue; } InventoryItem *spec_items[9]; for(u32 y=0; y<3; y++) for(u32 x=0; x<3; x++) { u32 i=y*3+x; if(x >= spec_cpi.width || y >= spec_cpi.height()) spec_items[i] = NULL; else spec_items[i] = spec_cpi.items[y*spec_cpi.width+x]; } bool match = checkItemCombination(input_items, spec_items); if(match){ std::istringstream iss(def->output, std::ios::binary); return InventoryItem::deSerialize(iss, gamedef); } } catch(SerializationError &e) { errorstream<<"getCraftResult: ERROR: " <<"Serialization error in recipe " <<def->dump()<<std::endl; // then go on with the next craft definition } } return NULL; }