From 3629aebb96959afc56cf04d1f2fc4a9f03e94183 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Sat, 25 Feb 2012 21:18:46 +0100 Subject: Merged the example client and server data It's easier to just talk about world data and to modify it as a whole. If there is really a need to separate it, a project can still choose to do that (and in whatever suitable way). There is no need to enforce this separation or to do it in our example. Reviewed-by: Erik Schilling --- example/scripts/crafting.lua | 99 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 example/scripts/crafting.lua (limited to 'example/scripts/crafting.lua') diff --git a/example/scripts/crafting.lua b/example/scripts/crafting.lua new file mode 100644 index 0000000..eae26a4 --- /dev/null +++ b/example/scripts/crafting.lua @@ -0,0 +1,99 @@ +------------------------------------------------------------- +-- 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 \ No newline at end of file -- cgit