-|script|_N-Alchemy|32767 { set @npc_distance, 1; callfunc "PCtoNPCRange"; if (@npc_check) end; title "Alchemy Lab"; mes "This is an alchemy lab."; mes "With it, you can combine reagents together to create powerful potions."; next; clear; mes "##BDrag & drop 2 items from your inventory. All items used will be lost.##b"; cleararray @alchlab_items$[0], "", 2; // since we're not using a scoped (.@) array, we need to clean it requestitem @alchlab_items$[0], 2; // TODO: add a craft builtin (npc action 12) clear; if (@alchlab_items$[0] == "" || @alchlab_items$[1] == "") goto L_NoItems; mes "You are about to combine the following:"; mes " ["+ getitemlink(@alchlab_items$[0]) +"]"; mes " ["+ getitemlink(@alchlab_items$[1]) +"]"; mes; mes "##BWarning! This will permanently destroy the selected items.##b"; // can not use a scope variable to store item names because menu is a script terminator (destroys the scope) menu "Abort Mission.", L_Abort, "Proceed.", L_Proceed, "I want to make several.", L_Multi; L_Proceed: // XXX: here we could make it wait a little, while the potion is boiling (and show an animation/particles/sound) if (countitem(@alchlab_items$[0]) < 1 || countitem(@alchlab_items$[1]) < 1) // this shouldn't happen, but just to be safe.. goto L_NoItems; delitem @alchlab_items$[0], 1; delitem @alchlab_items$[1], 1; if (@alchlab_items$[0] == "BottleOfWater" || @alchlab_items$[1] == "BottleOfWater") // give back used bottles getitem "EmptyBottle", if_then_else(@alchlab_items$[0] == "BottleOfWater" && @alchlab_items$[1] == "BottleOfWater",2,1); set .@n, -3; goto L_CheckRecipes; L_CheckRecipes: set .@n, .@n+3; if (.@n == get(.rsize, "_N-Alchemy")) goto L_Failed; if (!(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[0] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[1]) && !(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[1] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[0])) goto L_CheckRecipes; getitem get(.recipes$[.@n+2], "_N-Alchemy"), 1; // XXX: here we could also make it fail sometimes depending on your expertise // XXX: here we could make it give profession/crafting exp clear; mes "You combined the following:"; mes " ["+ getitemlink(@alchlab_items$[0]) +"]"; mes " ["+ getitemlink(@alchlab_items$[1]) +"]"; mes; mes "You obtained:"; mes " ["+ getitemlink(get(.recipes$[.@n+2], "_N-Alchemy")) +"]"; close; L_NoItems: mes "You must put exactly 2 items."; close; L_Failed: mes "The potion bubbles violently and evaporates."; // XXX: here we could have random failure messages close; L_Abort: close; // Bikeshedding starts here L_Multi: mes "How many?"; mes "##BWarning! This will permanently destroy the selected items.##b"; input @count; if (@count == 0) close; if (countitem(@alchlab_items$[0]) < @count || countitem(@alchlab_items$[1]) < @count) goto L_NoItems; delitem @alchlab_items$[0], @count; delitem @alchlab_items$[1], @count; if (@alchlab_items$[0] == "BottleOfWater" || @alchlab_items$[1] == "BottleOfWater") getitem "EmptyBottle", if_then_else(@alchlab_items$[0] == "BottleOfWater" && @alchlab_items$[1] == "BottleOfWater",2*@count,@count); set .@n, -3; goto L_CheckRecipesMulti; L_CheckRecipesMulti: set .@n, .@n+3; if (.@n == get(.rsize, "_N-Alchemy")) goto L_Failed; if (!(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[0] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[1]) && !(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[1] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[0])) goto L_CheckRecipesMulti; getitem get(.recipes$[.@n+2], "_N-Alchemy"), @count; clear; mes "You combined the following:"; mes " ["+ getitemlink(@alchlab_items$[0]) +"]"; mes " ["+ getitemlink(@alchlab_items$[1]) +"]"; mes; mes "You obtained:"; mes " ["+ getitemlink(get(.recipes$[.@n+2], "_N-Alchemy")) +"]"; close; // Bikeshedding ends here S_Spawn: set .@s, getarraysize(.x1); if (.spawned >= .@s) goto S_Return; set .@n$, "#_Al-lab"+chr(3)+.spawned; if (puppet(.m$[.spawned], .x1[.spawned], .y1[.spawned], .@n$, 399) < 1) mapexit; set .spawned, .spawned + 1; if (.spawned < .@s) goto S_Spawn; return; S_Return: return; OnMaybeStart: callsub S_Spawn; if (.started == 0) goto L_InitVars; end; L_InitVars: setarray .recipes$[0], 0, "DilutedConcentrationPot", "DarkConcentrationPotion", "ConcentrationPotion", "CactusDrink", "CactusDrink", "CactusPotion", "PinkPetal", "BottleOfWater", "ConcentrationPotion", "SmallMushroom", "BottleOfWater", "IronPotion", "MountainSnakeTongue", "BottleOfWater", "SlowPoisonPotion"; set .rsize, getarraysize(.recipes$); end; }