summaryrefslogtreecommitdiff
path: root/npc/021-4/main.txt
blob: 862636260cc1ef96cc16b96b415e19f9a0be52f6 (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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
// TMW2 scripts.
// Authors:
//    The Mana World Team
//    Jesusalva
// Description:
//    Cindy Cave core logic. You must flip 5 switches to free Cindy, and kill every
//    Yeti to leave the Yeti's King Throne Room. Each passing minute, a new Yeti will
//    spawn. Amount relies on how long this has been dragging on.
//    Flipping switches creates yetis on the other switches.
//    You must try flip all 5 switches at once. Once all switches are flipped, there'll
//    be various waves of Yetis. More time passing = more penalty Yetis, with a safety
//    check to abort script after a hour. If this happen, everyone inside the cave
//    will be banned for cheating. This should not be possible without @monsterignore anyway :<

// Switches
function	script	CindySwitch_Check_214	{
    .@st1=getvariableofnpc(.lifetime, "#CindySwitch_06")-gettimetick(2);
    .@st2=getvariableofnpc(.lifetime, "#CindySwitch_07")-gettimetick(2);
    .@st3=getvariableofnpc(.lifetime, "#CindySwitch_08")-gettimetick(2);
    .@st4=getvariableofnpc(.lifetime, "#CindySwitch_09")-gettimetick(2);
    .@st5=getvariableofnpc(.lifetime, "#CindySwitch_10")-gettimetick(2);
    .@i=0;
    if (.@st1 > 0) .@i++;
    if (.@st2 > 0) .@i++;
    if (.@st3 > 0) .@i++;
    if (.@st4 > 0) .@i++;
    if (.@st5 > 0) .@i++;
    return .@i;
}

// Switches
021-4,101,33,0	script	#CindySwitch_06	NPC_SWITCH_OFFLINE,{
    .@q=getq(NivalisQuest_Cindy);
    if (.@q < 3) {
        mesn strcharinfo(0);
        mesq l("This is a strange switch...");
        close;
    }
    if (.lifetime-gettimetick(2) <= 0) {
        mesc l("Pull the switch?");
        select
            l("Pull it"),
            l("Leave it");
        if (@menu == 1) {
            getexp rand(55, 110), rand(5, 11);
            .lifetime=gettimetick(2)+rand(110, 150)+60; // Something between 1m50s and 2m30s + 1 minute
            specialeffect(FX_SUCCESS);
            setnpcdisplay .name$, NPC_SWITCH_ONLINE;
            initnpctimer;
            .@r=rand(0,100);
            getmapxy(.@m$, .@x, .@y,0);
            if (.@r < 90)
                monster .@m$, .@x, .@y, "Yeti", Yeti, rand2(4,6);
            else
                monster .@m$, .@x, .@y, "Yeti", Yeti, 2;
            npctalk l("Automatic disarm in: @@", FuzzyTime(.lifetime));
            closedialog;
        }
        close;
    }
    npctalk l("Automatic disarm in: @@", FuzzyTime(.lifetime));
    end;

OnTimer1000:
    if (.lifetime-gettimetick(2) <= 0) {
        setnpcdisplay .name$, NPC_SWITCH_OFFLINE;
        stopnpctimer;
    } else {
        initnpctimer;
    }
    end;

OnInit:
    .sex = G_OTHER;
    .distance = 3;
    .lifetime=0;  // When will this switch turn off automatically
    end;

}

021-4,90,79,0	duplicate(#CindySwitch_06)	#CindySwitch_07	NPC_SWITCH_OFFLINE
021-4,49,65,0	duplicate(#CindySwitch_06)	#CindySwitch_08	NPC_SWITCH_OFFLINE
021-4,47,21,0	duplicate(#CindySwitch_06)	#CindySwitch_09	NPC_SWITCH_OFFLINE
021-4,80,49,0	duplicate(#CindySwitch_06)	#CindySwitch_10	NPC_SWITCH_OFFLINE

// Cindy
//    Global Variable: $@CINDY_STATE

021-4,66,49,0	script	Cindy#Outside	NPC_CINDY_CAGE,{
    if (getq(NivalisQuest_Cindy) < 4)
        goto L_Cheat;
    if ($@CINDY_STATE > 150000) goto L_Reset;
    if ($@CINDY_STATE % 2 == 0) goto L_Start;
    if (CindySwitch_Check_214() == 5 && !.canfinish) {
        // Gate is open, advance to stage 2
        .canfinish=1;
        .lifetime+=3;
        .wtime=0;
        mapannounce "021-4", "*roaaaaar*",0;
        npctalk "Take care! More Yetis! And they have friends!!";
        setnpcdisplay .name$, NPC_CINDY_UNCAGE;
        .@pl = getmapusers("021-4");
        if (.@pl == 1)
            .@pl+=1;
        .@pl+=3;
        areamonster "021-4", 20, 20, 100, 80, "Yeti", Yeti, .@pl, "Cindy#Outside::OnPetDeath";
        areamonster "021-4", 20, 20, 100, 80, "Moggun", Moggun, .@pl, "Cindy#Outside::OnPetDeath";
        areamonster "021-4", 20, 20, 100, 80, "Slime Blast", SlimeBlast, $@CINDY_STATE+1;
    }

    // If a major bug happened, do it now
    // This finishes the quest
    .@y=mobcount("021-4", "Cindy#Outside::OnPetDeath");
    if (.@y == 0 && .canfinish) {
        $@CINDY_STATE=gettimetick(2)+60*rand2(55,65)*rand2(4,36); // It is way too random to I say how long it takes (220min ~ 39 hours)
        mapannounce "021-4", "Nivalis: Cindy is now safe!",bc_all|bc_npc;
        areatimer "021-4", 20, 20, 100, 80, 10, "Cindy#Outside::OnReward";
        setnpcdisplay .name$, NPC_CINDY;
        stopnpctimer;
        end;
    }

    if (.canfinish)
        npctalk l("*scream*");
    else
        npctalk3 l("Please get me out of here!");
    end;

// Start
L_Start:
    mesn;
    mesq l("Have you came here to rescue me?");
    mes ""; mes "";
    mesc l(".:: WARNING ::."), 1;
    mesc l("Once you decide to rescue Cindy, nobody else will be able to enter or leave this room."), 1;
    mesc l("The blame of failure will be over you, but so will be the glory of success. There's no death penalty for others."), 1;
    mes "";
    select
        l("Not yet, I'm waiting for friends"),
        l("Yes. Let me try to open this."),
        l("No, I'll let you there to the Yeti's mercy.");

    if (@menu == 2 && $@CINDY_STATE % 2 == 0) {
        $@CINDY_STATE+=1;
        $@CINDY_HERO$=strcharinfo(0);
        goto L_Begin;
    }
    close;

// Begin
L_Begin:
    initnpctimer;
    enablenpc "#CindySwitch_06";
    enablenpc "#CindySwitch_07";
    enablenpc "#CindySwitch_08";
    enablenpc "#CindySwitch_09";
    enablenpc "#CindySwitch_10";
    changemusic "021-4", "misuse.ogg";

    .@pl = getmapusers("021-4");
    areamonster "021-4", 20, 20, 100, 80, "Yeti", Yeti, .@pl, "Cindy#Outside::OnPetDeath";
    monster "021-4", 66, 49, "Yeti", Yeti, 1, "Cindy#Outside::OnPetDeath";
    close;

// Special use-case
L_Reset:
    if ($@CINDY_HERO$ == strcharinfo(0)) {
        goto L_Winner;
    } else if (is_gm() && $@GM_OVERRIDE) {
        $@CINDY_STATE=0;
        npctalk l("*beeep*");
    }
    end;

// For all players finishing the quest
OnReward:
    if (ispcdead()) {
        recovery(getcharid(3));
        warp "Save", 0, 0;
        end;
    }
    if ($@CINDY_HERO$ == strcharinfo(0))
        dispbottom l("Congratulations on rescuing Cindy. You should now talk to her before leaving.");
    else
        dispbottom l("Congratulations on rescuing Cindy.");
    setq2 NivalisQuest_Cindy, getq2(NivalisQuest_Cindy)+1;
    getexp 10000, JobLevel;
    end;

// Winner Reward
L_Winner:
    mesn;
    mesq l("Thanks for saving me. I'll return home on my own, if you don't mind.");
    mesq l("Here, take this reward. Good luck. %%1");

    if ($CINDY_WINNER$ == "") {
        $CINDY_WINNER$=strcharinfo(0);
        channelmes("#world", $CINDY_WINNER$+" is the first player to finish Cindy Quest!! GG, dude! %%N");
        announce "All hail ##B"+$CINDY_WINNER$+"##b, first to complete the ##3Cindy Quest!", bc_all|bc_npc;
        getexp 0, 2000;
        getitem PrismGift, 1;
        mesc l("CONGRATULATIONS! You are the first player to finish Cindy Quest!!"), 2;
        mesc l("You just gained a Prism Gift, and 2000 Job Exp for your bravery!"), 2;
    } else {
        if (getcharid(1) > 0)
            .@v$=getpartyname(getcharid(1));
        else
            .@v$=strcharinfo(0);
        kamibroadcast("Cindy was rescued by \""+.@v$+"\".");
    }

    // Better proccess this before everything else...
    $@CINDY_HERO$="";
    setnpcdisplay .name$, NPC_ICE_CAGE;

    .@q=getq(NivalisQuest_Cindy);
    // First time
    if (.@q == 4) {
        getitem Earmuffs, 1;
    } else {
        Zeny=Zeny+rand(5000,15000);
        getitem TreasureMap, 1;
        getitem TreasureKey, 1;
    }
    setq1 NivalisQuest_Cindy, 5;
    next;
    npctalk l("Cindy is gone...");
    closedialog;
    close;

// Events
OnPetDeath:
    end;

// Cast against all players on defeat
OnFail:
    percentheal -100, -100;
    heal -1, -1;
    end;

// Edge Cases
L_Cheat:
    warp "Save", 0, 0; atcommand "@jail "+strcharinfo(0); dispbottom l("Cheater detected.");
    end;

// Timeout
OnReckless:
L_Reckless:
    kamibroadcast("People failed to rescue Cindy!");
    areatimer "021-4", 20, 20, 100, 80, 10, "Cindy#Outside::OnFail";
    goto L_CleanUp;

// Event is over, clean up the mess the players left
OnCleanUp:
L_CleanUp:
    .lifetime=0;
    .wtime=0;
    .canfinish=0;
    $@CINDY_STATE+=1;
    killmonsterall("021-4");
    disablenpc "#CindySwitch_06";
    disablenpc "#CindySwitch_07";
    disablenpc "#CindySwitch_08";
    disablenpc "#CindySwitch_09";
    disablenpc "#CindySwitch_10";
    setnpcdisplay .name$, NPC_CINDY_CAGE; // We need NPC_CINDY for complete
    changemusic "021-4", "water_prelude.ogg";
    stopnpctimer;
    end;

// Main loop
OnTimer2000:
    .@y=mobcount("021-4", "Cindy#Outside::OnPetDeath");

    // Quest is complete... We might need to clean the mess.
    if ($@CINDY_STATE > gettimetick(2)) {
        .@pl = getmapusers("021-4");
        if (!.@pl)
            goto L_CleanUp;
        end;
    }

    // This finishes the quest
    if (.@y == 0 && .canfinish) {
        $@CINDY_STATE=gettimetick(2)+60*rand2(55,65)*rand2(4,36); // It is way too random to I say how long it takes (220min ~ 39 hours)
        mapannounce "021-4", "Nivalis: Cindy is now safe!",bc_all|bc_npc;
        areatimer "021-4", 20, 20, 100, 80, 10, "Cindy#Outside::OnReward";
        setnpcdisplay .name$, NPC_CINDY;
        stopnpctimer;
        end;
    }
    .wtime+=2;

    // Before 10 minutes, spawn every ~ 2 minutes
    .@bonus=rand2(110,130);
    // After 10 waves, spawn each ~ 10 minutes
    if (.lifetime >= 10)
        .@bonus+=500;

    // After 15 waves, we'll go a bit slower, but not much.
    // You are a noob and should fail the quest.
    if (.lifetime >= 15)
        .@bonus+=.lifetime*2;

    if (.wtime >= .@bonus) {
        // A new wave have passed
        .wtime=0;
        .lifetime+=1;
        .@pl = getmapusers("021-4");

        // Once the gate is open, more Yetis spawn, but not much
        if (.canfinish)
            .@pl+=1;

        // Value is given as: 1 Yeti per player
        .@value=.@pl;
        // + 1 Yeti per difficulty setting
        .@value+=($@CINDY_STATE/2);
        // +1 Yetis if you are alone because this is not a solo quest at heart
        if (.@pl == 1)
            .@value+=1;

        // To make easier, we spawn some Mogguns, too.
        // The ratio is Yeti 2:1 Moggun. (Third Yeti is replaced)
        .@mogg=.@value/3;
        .@yeti=.@value-.@mogg;
        areamonster "021-4", 20, 20, 100, 80, "Yeti", Yeti, .@yeti, "Cindy#Outside::OnPetDeath";
        areamonster "021-4", 20, 20, 100, 80, "Moggun", Moggun, .@mogg, "Cindy#Outside::OnPetDeath";
        npctalk any("Yetis!",
                    "Watch out!",
                    "More of them are coming!",
                    "Be careful! There's more!",
                    "More Yetis! Will this never end?",
                    "AAAAH! YETIS!",
                    "*shierks*",
                    "There are coming more and more!",
                    "More Yetis! We are hopeless!",
                    "Keep your guard up!",
                    "Hit and run, hit and run! More of them!");
    }

    // Regardless of Wave, Blue Slimes and Slime Blast will show up.
    // This is based difficulty setting (previous fails)
    if (.wtime % 10 == 2) {
        .@mid=any(SlimeBlast, SlimeBlast, SlimeBlast, BlueSlime, BlueSlime, AzulSlime);
        areamonster "021-4", 20, 20, 100, 80, strmobinfo(1, .@mid), .@mid, $@CINDY_STATE;
    }

    // You're taking too much time, clear the spot after the 30th wave
    if (.lifetime >= 30)
        goto L_Reckless;
    initnpctimer;
    end;

OnInit:
    .distance=5;
    .lifetime=0; // Controls Yeti Wave
    .wtime=0;    // Timer runs sort of often. WTime controls automatic Yeti advance
    .canfinish=0;// Can finish or must talk to cage first?
    $@CINDY_HERO$="";
    disablenpc "#CindySwitch_06";
    disablenpc "#CindySwitch_07";
    disablenpc "#CindySwitch_08";
    disablenpc "#CindySwitch_09";
    disablenpc "#CindySwitch_10";
    end;
}