summaryrefslogtreecommitdiff
path: root/npc/024-9/sake.txt
blob: c55de3f2b2c01d267a72f511aeb4cc90367dda48 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// 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-(.@bonus/3))*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, EmptyBottle, DWARVEN_AMMO;
        mesn;
        mes l("Trying to retrieve it now will have @@ % chance to be successful.", dwarvensake_chance()/100);
        if (dwarvensake_chance()/100 < 1) close;
        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;
            }
            getitem EmptyBottle, DWARVEN_AMMO;
            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;

}