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
|
// TMW2/LoF scripts.
// Authors:
// TMW-LoF Team
// Jesusalva
// Description:
// Take care of hardcore players
018-2-1,22,29,0 script Colonel DUSTMAN NPC_CRUSADER,{
.@cod=getq(LoFQuest_COD);
.@hh=getq(LoFQuest_HH);
mesn;
mesq l("Hello adventurer. Are you interested in the Heroes Hold, or in the Call Of Dusty?");
next;
select
l("Heroes Hold"),
l("Call Of Dusty"),
l("Neither, sorry");
if (@menu == 3)
close;
else if (@menu == 2)
goto L_COD;
mes "";
if (BaseLevel < 40) {
mesn;
mesq l("Well, my men went down and still haven't returned.");
next;
mesn;
mesq l("I'm worried with them. Anyway, I think only heroes are allowed inside, and you are a few levels short of being a Hero...");
next;
mesn;
mesq l("Take care, adventurer!");
close;
}
mesn;
mesq l("This whole region is called the Heroes Hold. It's designed for hard core, bragging-rights-hunters, high level, supreme players.");
next;
mesn;
mesq l("This is the main hall. Below this stairs, you'll find the Heroes Hold Main Dungeon. It's a cave in a... uhm. Water.");
mesq l("I thought it was meant to be lava, this being in the Land Of Fire and all, but seems like someone must bug Saulc to fix it.");
if (.@hh > 1) {
next;
mesn;
mesq l("Where could my man have went?!");
next;
mesn;
mesq l("Perhaps this has something to do with the factions.");
next;
mesn;
mesq l("I wonder what secrets the Heroes Hold could be hiding...");
} else if (.@hh == 1) {
next;
mesn;
mesq l("Hm, good luck out there.");
if ((getq2(LoFQuest_HH) & HH_MASTER)) {
mes "";
mesn;
mesq l("I see you finished the Master Dungeon and didn't found my men. I'll think on something.");
next;
mesn;
mesq l("Thanks for your help, anyway.");
inventoryplace CrusadeHelmet, 1, MercBoxA, 5, AncientBlueprint, 2, HeroCoin, 60;
next;
mes "";
mesn;
mesc l("You can have my team's helmet, you're now officially a crusader!");
setq1 LoFQuest_HH, 2;
CsysNpcCraft(CrusadeHelmet, CLASS_DAMAGE_BOSS_TARGET, 10);
getitem MercBoxA, 5;
getitem AncientBlueprint, 2;
getitem HeroCoin, 60;
getexp 100000, 1000;
}
} else if (.@hh == 0) {
next;
mesn;
mesq l("So, let's return to the business at hand. My men went down and haven't returned. That was long ago, by the way.");
mesq l("I can send you to at least five from the seven cave levels this dungeon have.");
next;
mesn;
mesq l("Do you want to try to find them? Just search the first five floors: Novice, Intermediary, Advanced, Expert and Master.");
mesq l("The Supreme and Ultimate floors are just a WIP bonus. So if you don't find them on the five and report back, that'll do.");
next;
mesc l("Accept quest?");
if (askyesno() == ASK_YES) {
mes "";
mesn;
mesq l("Wonderful! You must finish Novice, Intermediary, Advanced and Expert levels before I unlock Master level for you.");
mesq l("I don't really understand how the dungeon works. I promise you a reward when you finish the task.");
next;
mesc l("You need to choose a Heroes Hold Group. This currently makes absolutely no difference whatsoever."), 1;
mesc l("However, each group may be expanded later. You can reset group by clearing the Master Floor.", 1);
mesc l("PS. The group names still aren't set. You're free to pinch in suggestions at LoF Discord (Legacy #discussion) :>");
next;
select
l("The Loyalists"),
l("The Wildlife");
setq LoFQuest_HH, 1, 0, (@menu-1);
}
}
close;
L_COD:
mes "";
// First time you're hearing about?
if (BaseLevel >= 50 && .@cod < 1) {
mesn;
mesq l("Hey, do you know the ##BCall Of Dusty##b event?");
next;
setq1 LoFQuest_COD, 1;
goto L_InformationCOD;
}
// Begin here
mesn;
mesq l("Just @@ ago, thieves stole Pihro & Pyndragon weapons.", FuzzyTime(1542570030));
next;
// Handle initial message
if (BaseLevel >= 50) {
mesn;
mesq l("Pyndragon said he'll craft a @@ to whoever reduces them to dust. Interested?", getitemlink(Dustynator)); // BottledDust, Dustynator
mesc l("Note: Dustynator is a high level weapon. You might not have enough level to use it yet.");
next;
} else if (BaseLevel < 50) {
mesn;
mesq l("It was a real problem, threatening them to go out of business. I think they are trying to recover the lost weapons.");
mesc l("Attain level 50 to try this quest.");
close;
}
L_SkipIntro:
mes "";
// Is the event currently active? Or is it exchange time?
if (.state == 0) {
mesn;
mesq l("The event starts hourly, when the minute clock hits zero. I'll tell everyone on this room when it starts and ends.");
next;
mesn;
mesc l("Do you want to exchange some of your @@ @@ for items?", countitem(BottledDust), getitemlink(BottledDust));
mes "";
if (askyesno() == ASK_YES) {
openshop;
closedialog;
}
close;
}
mesc l("Do you want to participate on Call Of Dusty?");
// Do you want to participate?
if (askyesno() == ASK_YES) {
mes "";
mesn;
mesq l("Do you need a refresher of the rules?");
if (askyesno() == ASK_YES) {
goto L_InformationCOD;
}
closeclientdialog;
@COD_CHECKPOINT=0;
warp "001-10", rand(163,171), rand(119,124);
addtimer(120000,"#COD_BossRoomCheck::OnTimeDefeat");
dispbottom l("Good luck!");
close;
}
close;
// Information about COD
L_InformationCOD:
mes "";
mesn;
mesc l("Call Of Dusty is a timed event quest. It begins hourly, when the minute clock marks zero.");
mesc l("When the boss is defeated, or the minute clock marks fifteen, event ends.");
next;
mesn;
mesc l("This is a @@, meaning only the victor party will receive the great prize.", b(l("Party Quest")));
mesc l("You will get @@ which can then be exchanged for items once CoD event quest ends.", countitem(BottledDust));
next;
mesn;
mesc l("You need be at minimum level 50 to participate. It is PVP, so watch out!");
mesc l("The first stage is on the desert canyons. You must give a full circle on the canyon in 90 seconds.");
mesc l("The second stage is in the first cave to northwest you can find.");
// The full circle have about 268 tiles in distance. You have the needed time to do 2.2 circles in the most efficient fashion.
// This means you have a time worth of 590 tiles, at 150ms, granting you 90 seconds to do this quest. (everything rounded up)
// But due a small thing called LAG and MANAPLUS DESYNC I'm now granting a whole two minutes for this stage.
next;
mesn;
mesc l("Once inside the BOSS Cave, you get a five minutes time limit to slay the boss with your party.");
mesc l("@@. PK, however, is allowed!", b(l("Only the party from the MVP will get the reward.")));
next;
mesc l("The MVP is the player who did more damage to the boss.");
mesc l("The title is transferred when the MVP is killed (either in PVP or by the boss), or when time runs out.");
next;
mesn;
mesc l("The boss can blind players. Blind will reduce hit rate and evasion in 25%.");
mesc l("Form the strongest party and win! Remember that if you don't kill the boss, you'll never win!");
next;
goto L_SkipIntro;
OnInit:
.sex=G_MALE;
.distance=5;
.state=0; // 0- Closed, 1- Open TODO begin at right state
tradertype(NST_CUSTOM);
// CoD Exchange Booth Selection
sellitem Dustynator,3000;
sellitem MercBoxD,1500;
sellitem MercBoxC,750;
sellitem ArcmageBoxset,500;
sellitem MercBoxB,350;
sellitem BronzeGift,200;
sellitem MercBoxA,100;
sellitem HeroCoin,1;
end;
OnMinute00:
.state=1;
donpcevent("#COD_BossManager::OnEventStart");
npctalk("Call Of Dusty: Event Start!");
end;
OnCoDEnd:
OnMinute15:
.state=0;
npctalk("Call Of Dusty: Event End!");
end;
OnMinute30:
.state=0; // fail-safe
donpcevent("#COD_BossManager::OnCleanUp");
end;
// CoD Exchange Booth Prices
OnCountFunds:
setcurrency(countitem(BottledDust));
end;
OnPayFunds:
if( countitem(BottledDust) < @price )
end;
delitem BottledDust,@price;
purchaseok();
end;
}
|