summaryrefslogblamecommitdiff
path: root/world/map/npc/029-2/alchemy.txt
blob: 537d269c6b21058e3ad47ea5b34b6c0508e2c829 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
                         
 



                            





                                                                                      
                                                                                                           












                                                                                                                

                                           














                                                                                                                                
                                         
                      

                                                                                                                                  

                            
                                                                                                                                 







                                                              
                                                                        












                                                                                                          





































                                                                                                                                            

                               


                                         
                                                                                    












                               
 

                             

                                                                                    


                                                                   


                                        
-|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;
}