summaryrefslogblamecommitdiff
path: root/example/serverdata/scripts/crafting.lua
blob: eae26a41d22d8cc59111123f88fc592273048854 (plain) (tree)




























                                                                                      
                                                                      













                                                                                     
                                                        
               
        
                                                                  













                                                                                 
                                                        
               
        
                                                                  
































                                                                                  
-------------------------------------------------------------
-- Example crafting script file                            --
--                                                         --
-- This file allows you to implement your own crafting     --
-- system.                                                 --
----------------------------------------------------------------------------------
--  Copyright 2011 Manasource Development Team                                  --
--                                                                              --
--  This file is part of Manasource.                                            --
--                                                                              --
--  Manasource is free software; you can redistribute  it and/or modify it      --
--  under the terms of the GNU General  Public License as published by the Free --
--  Software Foundation; either version 2 of the License, or any later version. --
----------------------------------------------------------------------------------

-- This function is called by the game engine when a character tries to craft
-- something from items in its inventory
function on_craft(ch, recipe)
    -- ch is the crafting character
    --
    -- recipe is a table with the ingredients.
    -- it is a common 1-based array. each element of this array is a table with the 
    -- two keys "id" and "amount".
    -- The engine has already checked that the character owns enough of those things,
    -- so you needn't do this again.
      
    -- uncomment one (but not both!) of the following three lines to enable the
    -- example crafting systems
    
    mana.chat_message(ch, "There is no crafting in this game world.")
    --craft_strict(ch, recipe)
    --craft_lax(ch, recipe)
end


-- a primitive example crafting system which cares about item order and exact amount
function craft_strict(ch, recipe)
    if (recipe[1].id == 8 and recipe[1].amount == 2 and -- has two iron
        recipe[2].id == 9 and recipe[2].amount == 1)    -- and one wood
        then
        mana.chr_inv_change(ch, 
            8, -2, --take away the iron
            9, -1, --take away the wood
            5, 1 ) -- give a sword
        mana.chat_message(ch, "You've crafted a sword")
        return
    end
    mana.chat_message(ch, "This wouldn't create anything useful")
end

-- a primitive example crafting system which doesn't care about item order
-- and amount. It even allows to mention the same item multiple times.
function craft_lax(ch, recipe)
    recipe = make_condensed_and_sorted_item_list(recipe)

    if (recipe[1].id == 8 and recipe[1].amount >= 2 and -- has at least two iron
        recipe[2].id == 9 and recipe[2].amount >= 1)    -- and at least one wood
        then
        mana.chr_inv_change(ch, 
            8, -2, --take away the iron
            9, -1, --take away the wood
            5, 1 ) -- give a sword
        mana.chat_message(ch, "You've crafted a sword")
        return
    end
    mana.chat_message(ch, "This wouldn't create anything useful")
end

-- this turns multiple occurences of the same item into one by adding up
-- their amounts and sorts the recipe by item ID.
-- This makes stuff a lot easier when your crafting system isn't supposed to care
-- about the order items are in.
function make_condensed_and_sorted_item_list(recipe)
    
    local condensed = {}
    for index, item in pairs(recipe) do 
        if condensed[item.id] == nil then
            condensed[item.id] = item.amount
        else
            condensed[item.id] = condensed[item.id] + item.amount
        end
    end
    
    local sorted = {}
    for id, amount in pairs(condensed) do
        local item = {}
        item.id = id
        item.amount = amount
        table.insert(sorted, item)
    end
    
    table.sort(sorted, function(item1, item2)
            return (item1.id < item2.id)
        end    
    )
    
    return sorted
    
end