summaryrefslogblamecommitdiff
path: root/npc/024-9/sake.txt
blob: 61e1aabf62b47ecd9f55c5fea6977a1f2f7aac6e (plain) (tree)














































































































































































                                                                                                                                      
// TMW2 Scripts
// Author:
//    Jesusalva
// Description:
//    Dwarven Sake, the most powerful beverage which is not a rare
// Variables:
//    DWARVEN_DATE = When the Sake started being done
//    DWARVEN_DONE = When the Sake will be ready
//    DWARVEN_AMMO = How much Sake you're trying to make
//  Success Rate is based on how much you're trying to do and how long ago that was

024-9,43,30,0	script	Sake Barrel	NPC_NO_SPRITE,{
    goto L_Main;
    // dwarvensake_chance()
    // Returns chance (0~10,000) to successfully obtain sake
    // DWARVEN_DONE/DWARVEN_DATE is taken in account
    function dwarvensake_chance {
        .@max=10000;
        .@base=DWARVEN_DATE;//-(DWARVEN_DONE-DWARVEN_DATE);
        // .@c = how much time is left until completion
        // .@d = original amount of time required
        // .@e = Current time
        .@c=DWARVEN_DONE-.@base; //-gettimetick(2);
        .@d=DWARVEN_DATE-.@base; //-DWARVEN_DONE;
        .@e=gettimetick(2)-.@base;

        // We must divide everything by 10 to cause imprecision
        // aka. don't cause overflow bug
        .@c=.@c/10;
        .@d=.@d/10;
        .@e=.@e/10;

        //debugmes "%d - %d - %d", .@d, .@e, .@c;
        //debugmes "Start - Now - Finish";
        if (.@c == 0)
            return .@max;
        if ($@GM_OVERRIDE) debugmes "Ratio: %d/%d = %d", .@e, .@c, (.@e*.@max)/.@c;
        return min(10000, (.@e*.@max)/.@c);
    }

L_Main:
    if (!DWARVEN_DATE) {
        mesn;
        mesc l("Do you want to make sake?");
        mesc l("This barrel is a courtesy from Dimond Cove Inn.");
        next;
        select
            l("Information"),
            l("Yes"),
            l("No");
        mes "";

        switch (@menu) {
            case 1:
                mesc l("Produced item:");
                mesc l("@@", getitemlink(DwarvenSake));
                mes "";
                mesc l("Cost per two glass:");
                mesc l("* @@/@@ @@", countitem(ArtichokeHerb), 25, getitemlink(ArtichokeHerb));
                mesc l("* @@/@@ @@", countitem(MauveHerb), 25, getitemlink(MauveHerb));
                mesc l("* @@/@@ @@", countitem(CobaltHerb), 25, getitemlink(CobaltHerb));
                mesc l("* @@/@@ @@", countitem(GambogeHerb), 25, getitemlink(GambogeHerb));
                mesc l("* @@/@@ @@", countitem(AlizarinHerb), 25, getitemlink(AlizarinHerb));
                mesc l("* @@/@@ @@", countitem(ShadowHerb), 20, getitemlink(ShadowHerb));
                mesc l("* @@ Water Bottle", 1);
                next;
            break;
            case 2:
                mesc l("How many batches do you want to produce? (max. 5)");
                input .@glass_count;
                if (.@glass_count < 1 ||
                    .@glass_count > 5 ||
                    countitem(ArtichokeHerb) < 25*.@glass_count ||
                    countitem(MauveHerb) < 25*.@glass_count ||
                    countitem(CobaltHerb) < 25*.@glass_count ||
                    countitem(GambogeHerb) < 25*.@glass_count ||
                    countitem(AlizarinHerb) < 25*.@glass_count ||
                    countitem(ShadowHerb) < .@glass_count*20
                    ) {
                    mesc l("Not enough ingredients or invalid amount."), 1;
                    break;
                }
                mesc l("Which water will you use?");
                mesc l("The bottom-most the water, the better the bonus.");
                menuint
                    l("Cancel"), -1,
                    rif(countitem(BottleOfSewerWater) >= .@glass_count, l("Sewer Water")), 0,
                    rif(countitem(BottleOfSeaWater) >= .@glass_count, l("Sea Water")), 3600,
                    rif(countitem(BottleOfTonoriWater) >= .@glass_count, l("Tonori Water")), 11760,
                    rif(countitem(BottleOfWoodlandWater) >= .@glass_count, l("Woodland Water")), 12000,
                    rif(countitem(BottleOfDivineWater) >= .@glass_count, l("Divine Water")), 21600;
                mes "";
                if (@menuret < 0)
                    break;
                switch (@menuret) {
                    case 0:
                        .@bonus=@menuret;
                        .@water=BottleOfSewerWater;
                    break;
                    case 3600:
                        .@bonus=@menuret;
                        .@water=BottleOfSeaWater;
                    break;
                    case 11760:
                        .@bonus=@menuret;
                        .@water=BottleOfTonoriWater;
                    break;
                    case 12000:
                        .@bonus=@menuret;
                        .@water=BottleOfWoodlandWater;
                    break;
                    case 21600:
                        .@bonus=@menuret;
                        .@water=BottleOfDivineWater;
                    break;
                    default:
                        mesc l("Error, invalid return code, blame Saulc"), 1;
                        mes "==== SCRIPT ABORTED";
                        close;
                }

                // Save data
                delitem ArtichokeHerb, .@glass_count*25;
                delitem MauveHerb, .@glass_count*25;
                delitem CobaltHerb, .@glass_count*25;
                delitem GambogeHerb, .@glass_count*25;
                delitem AlizarinHerb, .@glass_count*25;
                delitem ShadowHerb, .@glass_count*20;
                delitem .@water, .@glass_count;
                DWARVEN_AMMO=.@glass_count;
                DWARVEN_DATE=gettimetick(2);
                DWARVEN_DONE=gettimetick(2)-.@bonus+.mintime;
                DWARVEN_DONE+=.cuptime*DWARVEN_AMMO;
            break;
            case 3:
                close;
            break;
        }
        goto L_Main;
    } else {
        mesn;
        mesc l("Your request for @@ @@ are being fermented for @@.", DWARVEN_AMMO, getitemlink(DwarvenSake), FuzzyTime(DWARVEN_DATE));
        next;
        inventoryplace DwarvenSake, DWARVEN_AMMO;
        mesn;
        mes l("Trying to retrieve it now will have @@ % chance to be successful.", dwarvensake_chance()/100);
        mes l("Attempt to retrieve it now?");
        next;
        if (askyesno() == ASK_YES) {
            if (rand(1000,10000) < dwarvensake_chance()) {
                mesc l("Success!"), 3;
                getitem DwarvenSake, DWARVEN_AMMO*2;
            } else {
                mesc l("The sake wasn't ready yet and you lost it..."), 1;
            }
            DWARVEN_DATE=0;
            DWARVEN_AMMO=0;
        }
    }
    close;

OnInit:
    .sex = G_OTHER;
    .distance = 4;

    // Time to make each batch (12 hours)
    .cuptime=(60*60*12);
    // Base time to make any amount of cups (72 hours)
    .mintime=(60*60*72);
    end;

}