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
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
|
// TMW2 Scripts
// Author:
// Jesusalva
// Description:
// Candor - Maggot Extermination Quest
// Added for GonzoDark
005-1-1,30,20,0 script Nylo#Marggo NPC_PLAYER,{
// Returns the crop ID to disable
// getcropid(x,y)
function getcropid {
.@x=getarg(0);
.@y=getarg(1);
.@w=12; // Width of a row
.@offx=23; // First X
.@offy=22; // First Y
.@i=0;
// 0 is: 23,22
// width: 35-23=12
// height is not relevant
// .@x / .@y
// .@w = 12
// .@i → Real value
// For each Y beyond .@offy we add .@w to i
.@i+=(.@y-.@offy)*.@w;
// Now we add any X beyond .@offx
.@i+=(.@x-.@offx);
return(sprintf("%03d", .@i))
}
npctalk l("Go kill the maggots!");
end;
OnStart:
initnpctimer;
addtimer(60000, "Nylo#Marggo::OnBegin");
mesn;
mesq l("The maggots will spawn in @@ at random.", b(l("60 seconds")));
mes l("Read the instructions carefully.");
next;
mesn l("Time Limit");
mes l("Campaign starts after 60 seconds. Eight maggots will spawn on the next 100 seconds.");
mes l("Four minutes after the warp, or when the last maggot die, it'll be over.");
next;
mesn l("Victory Conditions");
mes l("If you save 80% from the crops or more, you'll get a @@.", getitemlink(RoundLeatherShield));
mes l("If you save 60% from the crops or more, you'll get @@ GP.", 300);
mes l("== If you decide to complete the quest you cannot repeat it.");
next;
mes l("Good luck!");
close;
OnTimer10000:
npctalk "50 seconds!";
end;
OnTimer20000:
npctalk "40 seconds!";
end;
OnTimer30000:
npctalk "30 seconds!";
end;
OnTimer40000:
npctalk "20 seconds!";
end;
OnTimer50000:
npctalk "10 seconds!";
end;
OnTimer55000:
npctalk "5 seconds!";
end;
OnTimer60000:
npctalk "Start!";
stopnpctimer;
end;
OnBegin:
// @MARGGO → (MaggotID, IsAlive)
// IsAlive: 1 → yes
@MARGGO=htnew;
@TOTAL_MRG=0;
//@DESTROY=0; // Array of all lost crops
// 8 maggots
// Minimum 80 sec
// Maximum 100 sec
addtimer(10, "Nylo#Marggo::OnSpawn");
addtimer(850, "Nylo#Marggo::OnInteract");
addtimer(180000, "Nylo#Marggo::OnFinish");
end;
// Spawn a new maggot until eight maggots were spawn
OnSpawn:
.@ID=getcharid(0);
.@MAP$="MRGO@"+str(.@ID);
@TOTAL_MRG+=1;
if (@TOTAL_MRG < 8)
addtimer(rand(10000, 12500), "Nylo#Marggo::OnSpawn");
.@mobID=areamonster(.@MAP$, 23, 22, 35, 34, l("Maggot"), Maggot, 1, "Nylo#Marggo::OnMurder");
htput @MARGGO, .@mobID, 1;
end;
// Move all maggots
OnInteract:
.@hti = htiterator(@MARGGO);
for(.@key$ = htinextkey(.@hti); hticheck(.@hti); .@key$ = htinextkey(.@hti)) {
.@alive=htget(@MARGGO, .@key$);
/*
if (.@alive == 2)
continue;
*/
.@mobId=atoi(.@key$);
getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, .@mobId);
// Destroy the crop if needed
.@cropId$=getcropid(.@x, .@y);
if (array_find(@DESTROYED, .@cropId$) == -1) {
array_push(@DESTROYED, .@cropId$);
disablenpc instance_npcname("#Marggo"+.@cropId$);
}
// Tell the Maggot to walk to a random coordinate
// (it may walk backwards due not preserving old data)
// This will cause maggot to abort a counter attack and to never stop
// If it hits an edge, it'll start moving to the center, may cause odd behavior
unitstop(.@mobId);
if (.@x == 22 || .@y == 22 || .@x == 36 || .@y == 34)
unitwalk(.@mobId, 30, 30);
else
unitwalk(.@mobId, .@x+any(1, -1), .@y+any(1, -1));
}
htidelete(.@hti);
// Continue the cycle
if (getmap() ~= "MRGO*" || getmap() ~= "005-1-1")
addtimer(850, "Nylo#Marggo::OnInteract");
end;
// A maggot was killed
OnMurder:
// I don't know which one was killed, so I cycle every one until I find the dead one
.@hti = htiterator(@MARGGO);
for(.@key$ = htinextkey(.@hti); hticheck(.@hti); .@key$ = htinextkey(.@hti)) {
.@alive=htget(@MARGGO, .@key$);
/*
if (.@alive == 2)
continue;
*/
.@mobId=atoi(.@key$);
if (getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, .@mobId) >= 0)
continue;
// We found the dead monster, mark it as dead and stop this meaningless loop
htput .@key$, 0;
break;
}
htidelete(.@hti);
if (@TOTAL_MRG >= 8) {
if (htsize(@MARGGO) == 0)
doevent("Nylo#Marggo::OnFinish");
}
end;
// You killed all maggots or ran out of time
OnFinish:
htdelete @MARGGO;
deltimer("Nylo#Marggo::OnInteract");
deltimer("Nylo#Marggo::OnSpawn");
deltimer("Nylo#Marggo::OnFinish");
.@trueratio=100*getarraysize(@DESTROYED)/169;
.@ratio=100-.@trueratio;
debugmes l("Player lost @@ crops", getarraysize(@DESTROYED));
mesn l("Nylo");
mes l("You managed to save @@ % of my crops!", .@ratio);
next;
if (.@ratio >= 60) {
inventoryplace RoundLeatherShield, 1;
mesc l("Complete Quest?");
mesc l("You won't be able to aim for a better record!");
if (askyesno() == ASK_YES) {
setq CandorQuest_Marggo, 1;
Zeny=Zeny+300;
getexp .@ratio*8/10, (.@ratio/3);
if (.@ratio >= 80)
getitem RoundLeatherShield, 1;
}
mes "";
}
mesn l("Nylo");
mes l("Thanks for the help!");
warp "Save", 0, 0;
close;
// Cosmetic
OnInit:
.@npcId = getnpcid(.name$);
setunitdata(.@npcId, UDT_HEADTOP, CreasedShirt);
setunitdata(.@npcId, UDT_HEADMIDDLE, CreasedShorts);
setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes);
setunitdata(.@npcId, UDT_WEAPON, CandorBoots);
setunitdata(.@npcId, UDT_HAIRSTYLE, 26);
setunitdata(.@npcId, UDT_HAIRCOLOR, 0);
.sex = G_MALE;
.distance = 4;
end;
OnInstanceInit:
.@npcId = getnpcid(instance_npcname(.name$));
setunitdata(.@npcId, UDT_HEADTOP, CreasedShirt);
setunitdata(.@npcId, UDT_HEADMIDDLE, CreasedShorts);
setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes);
setunitdata(.@npcId, UDT_WEAPON, CandorBoots);
setunitdata(.@npcId, UDT_HAIRSTYLE, 26);
setunitdata(.@npcId, UDT_HAIRCOLOR, 0);
end;
}
/* python
i=0
x=23
y=22
x2=35
y2=34
while y <= y2:
print("005-1-1,%d,%d,0 script #Marggo%03d NPC_CROPS,{ end; }"% (x, y, i))
x+=1
if (x > x2):
x=23
y+=1
i+=1
*/
005-1-1,23,22,0 script #Marggo000 NPC_CROPS,{ end; }
005-1-1,24,22,0 script #Marggo001 NPC_CROPS,{ end; }
005-1-1,25,22,0 script #Marggo002 NPC_CROPS,{ end; }
005-1-1,26,22,0 script #Marggo003 NPC_CROPS,{ end; }
005-1-1,27,22,0 script #Marggo004 NPC_CROPS,{ end; }
005-1-1,28,22,0 script #Marggo005 NPC_CROPS,{ end; }
005-1-1,29,22,0 script #Marggo006 NPC_CROPS,{ end; }
005-1-1,30,22,0 script #Marggo007 NPC_CROPS,{ end; }
005-1-1,31,22,0 script #Marggo008 NPC_CROPS,{ end; }
005-1-1,32,22,0 script #Marggo009 NPC_CROPS,{ end; }
005-1-1,33,22,0 script #Marggo010 NPC_CROPS,{ end; }
005-1-1,34,22,0 script #Marggo011 NPC_CROPS,{ end; }
005-1-1,35,22,0 script #Marggo012 NPC_CROPS,{ end; }
005-1-1,23,23,0 script #Marggo013 NPC_CROPS,{ end; }
005-1-1,24,23,0 script #Marggo014 NPC_CROPS,{ end; }
005-1-1,25,23,0 script #Marggo015 NPC_CROPS,{ end; }
005-1-1,26,23,0 script #Marggo016 NPC_CROPS,{ end; }
005-1-1,27,23,0 script #Marggo017 NPC_CROPS,{ end; }
005-1-1,28,23,0 script #Marggo018 NPC_CROPS,{ end; }
005-1-1,29,23,0 script #Marggo019 NPC_CROPS,{ end; }
005-1-1,30,23,0 script #Marggo020 NPC_CROPS,{ end; }
005-1-1,31,23,0 script #Marggo021 NPC_CROPS,{ end; }
005-1-1,32,23,0 script #Marggo022 NPC_CROPS,{ end; }
005-1-1,33,23,0 script #Marggo023 NPC_CROPS,{ end; }
005-1-1,34,23,0 script #Marggo024 NPC_CROPS,{ end; }
005-1-1,35,23,0 script #Marggo025 NPC_CROPS,{ end; }
005-1-1,23,24,0 script #Marggo026 NPC_CROPS,{ end; }
005-1-1,24,24,0 script #Marggo027 NPC_CROPS,{ end; }
005-1-1,25,24,0 script #Marggo028 NPC_CROPS,{ end; }
005-1-1,26,24,0 script #Marggo029 NPC_CROPS,{ end; }
005-1-1,27,24,0 script #Marggo030 NPC_CROPS,{ end; }
005-1-1,28,24,0 script #Marggo031 NPC_CROPS,{ end; }
005-1-1,29,24,0 script #Marggo032 NPC_CROPS,{ end; }
005-1-1,30,24,0 script #Marggo033 NPC_CROPS,{ end; }
005-1-1,31,24,0 script #Marggo034 NPC_CROPS,{ end; }
005-1-1,32,24,0 script #Marggo035 NPC_CROPS,{ end; }
005-1-1,33,24,0 script #Marggo036 NPC_CROPS,{ end; }
005-1-1,34,24,0 script #Marggo037 NPC_CROPS,{ end; }
005-1-1,35,24,0 script #Marggo038 NPC_CROPS,{ end; }
005-1-1,23,25,0 script #Marggo039 NPC_CROPS,{ end; }
005-1-1,24,25,0 script #Marggo040 NPC_CROPS,{ end; }
005-1-1,25,25,0 script #Marggo041 NPC_CROPS,{ end; }
005-1-1,26,25,0 script #Marggo042 NPC_CROPS,{ end; }
005-1-1,27,25,0 script #Marggo043 NPC_CROPS,{ end; }
005-1-1,28,25,0 script #Marggo044 NPC_CROPS,{ end; }
005-1-1,29,25,0 script #Marggo045 NPC_CROPS,{ end; }
005-1-1,30,25,0 script #Marggo046 NPC_CROPS,{ end; }
005-1-1,31,25,0 script #Marggo047 NPC_CROPS,{ end; }
005-1-1,32,25,0 script #Marggo048 NPC_CROPS,{ end; }
005-1-1,33,25,0 script #Marggo049 NPC_CROPS,{ end; }
005-1-1,34,25,0 script #Marggo050 NPC_CROPS,{ end; }
005-1-1,35,25,0 script #Marggo051 NPC_CROPS,{ end; }
005-1-1,23,26,0 script #Marggo052 NPC_CROPS,{ end; }
005-1-1,24,26,0 script #Marggo053 NPC_CROPS,{ end; }
005-1-1,25,26,0 script #Marggo054 NPC_CROPS,{ end; }
005-1-1,26,26,0 script #Marggo055 NPC_CROPS,{ end; }
005-1-1,27,26,0 script #Marggo056 NPC_CROPS,{ end; }
005-1-1,28,26,0 script #Marggo057 NPC_CROPS,{ end; }
005-1-1,29,26,0 script #Marggo058 NPC_CROPS,{ end; }
005-1-1,30,26,0 script #Marggo059 NPC_CROPS,{ end; }
005-1-1,31,26,0 script #Marggo060 NPC_CROPS,{ end; }
005-1-1,32,26,0 script #Marggo061 NPC_CROPS,{ end; }
005-1-1,33,26,0 script #Marggo062 NPC_CROPS,{ end; }
005-1-1,34,26,0 script #Marggo063 NPC_CROPS,{ end; }
005-1-1,35,26,0 script #Marggo064 NPC_CROPS,{ end; }
005-1-1,23,27,0 script #Marggo065 NPC_CROPS,{ end; }
005-1-1,24,27,0 script #Marggo066 NPC_CROPS,{ end; }
005-1-1,25,27,0 script #Marggo067 NPC_CROPS,{ end; }
005-1-1,26,27,0 script #Marggo068 NPC_CROPS,{ end; }
005-1-1,27,27,0 script #Marggo069 NPC_CROPS,{ end; }
005-1-1,28,27,0 script #Marggo070 NPC_CROPS,{ end; }
005-1-1,29,27,0 script #Marggo071 NPC_CROPS,{ end; }
005-1-1,30,27,0 script #Marggo072 NPC_CROPS,{ end; }
005-1-1,31,27,0 script #Marggo073 NPC_CROPS,{ end; }
005-1-1,32,27,0 script #Marggo074 NPC_CROPS,{ end; }
005-1-1,33,27,0 script #Marggo075 NPC_CROPS,{ end; }
005-1-1,34,27,0 script #Marggo076 NPC_CROPS,{ end; }
005-1-1,35,27,0 script #Marggo077 NPC_CROPS,{ end; }
005-1-1,23,28,0 script #Marggo078 NPC_CROPS,{ end; }
005-1-1,24,28,0 script #Marggo079 NPC_CROPS,{ end; }
005-1-1,25,28,0 script #Marggo080 NPC_CROPS,{ end; }
005-1-1,26,28,0 script #Marggo081 NPC_CROPS,{ end; }
005-1-1,27,28,0 script #Marggo082 NPC_CROPS,{ end; }
005-1-1,28,28,0 script #Marggo083 NPC_CROPS,{ end; }
005-1-1,29,28,0 script #Marggo084 NPC_CROPS,{ end; }
005-1-1,30,28,0 script #Marggo085 NPC_CROPS,{ end; }
005-1-1,31,28,0 script #Marggo086 NPC_CROPS,{ end; }
005-1-1,32,28,0 script #Marggo087 NPC_CROPS,{ end; }
005-1-1,33,28,0 script #Marggo088 NPC_CROPS,{ end; }
005-1-1,34,28,0 script #Marggo089 NPC_CROPS,{ end; }
005-1-1,35,28,0 script #Marggo090 NPC_CROPS,{ end; }
005-1-1,23,29,0 script #Marggo091 NPC_CROPS,{ end; }
005-1-1,24,29,0 script #Marggo092 NPC_CROPS,{ end; }
005-1-1,25,29,0 script #Marggo093 NPC_CROPS,{ end; }
005-1-1,26,29,0 script #Marggo094 NPC_CROPS,{ end; }
005-1-1,27,29,0 script #Marggo095 NPC_CROPS,{ end; }
005-1-1,28,29,0 script #Marggo096 NPC_CROPS,{ end; }
005-1-1,29,29,0 script #Marggo097 NPC_CROPS,{ end; }
005-1-1,30,29,0 script #Marggo098 NPC_CROPS,{ end; }
005-1-1,31,29,0 script #Marggo099 NPC_CROPS,{ end; }
005-1-1,32,29,0 script #Marggo100 NPC_CROPS,{ end; }
005-1-1,33,29,0 script #Marggo101 NPC_CROPS,{ end; }
005-1-1,34,29,0 script #Marggo102 NPC_CROPS,{ end; }
005-1-1,35,29,0 script #Marggo103 NPC_CROPS,{ end; }
005-1-1,23,30,0 script #Marggo104 NPC_CROPS,{ end; }
005-1-1,24,30,0 script #Marggo105 NPC_CROPS,{ end; }
005-1-1,25,30,0 script #Marggo106 NPC_CROPS,{ end; }
005-1-1,26,30,0 script #Marggo107 NPC_CROPS,{ end; }
005-1-1,27,30,0 script #Marggo108 NPC_CROPS,{ end; }
005-1-1,28,30,0 script #Marggo109 NPC_CROPS,{ end; }
005-1-1,29,30,0 script #Marggo110 NPC_CROPS,{ end; }
005-1-1,30,30,0 script #Marggo111 NPC_CROPS,{ end; }
005-1-1,31,30,0 script #Marggo112 NPC_CROPS,{ end; }
005-1-1,32,30,0 script #Marggo113 NPC_CROPS,{ end; }
005-1-1,33,30,0 script #Marggo114 NPC_CROPS,{ end; }
005-1-1,34,30,0 script #Marggo115 NPC_CROPS,{ end; }
005-1-1,35,30,0 script #Marggo116 NPC_CROPS,{ end; }
005-1-1,23,31,0 script #Marggo117 NPC_CROPS,{ end; }
005-1-1,24,31,0 script #Marggo118 NPC_CROPS,{ end; }
005-1-1,25,31,0 script #Marggo119 NPC_CROPS,{ end; }
005-1-1,26,31,0 script #Marggo120 NPC_CROPS,{ end; }
005-1-1,27,31,0 script #Marggo121 NPC_CROPS,{ end; }
005-1-1,28,31,0 script #Marggo122 NPC_CROPS,{ end; }
005-1-1,29,31,0 script #Marggo123 NPC_CROPS,{ end; }
005-1-1,30,31,0 script #Marggo124 NPC_CROPS,{ end; }
005-1-1,31,31,0 script #Marggo125 NPC_CROPS,{ end; }
005-1-1,32,31,0 script #Marggo126 NPC_CROPS,{ end; }
005-1-1,33,31,0 script #Marggo127 NPC_CROPS,{ end; }
005-1-1,34,31,0 script #Marggo128 NPC_CROPS,{ end; }
005-1-1,35,31,0 script #Marggo129 NPC_CROPS,{ end; }
005-1-1,23,32,0 script #Marggo130 NPC_CROPS,{ end; }
005-1-1,24,32,0 script #Marggo131 NPC_CROPS,{ end; }
005-1-1,25,32,0 script #Marggo132 NPC_CROPS,{ end; }
005-1-1,26,32,0 script #Marggo133 NPC_CROPS,{ end; }
005-1-1,27,32,0 script #Marggo134 NPC_CROPS,{ end; }
005-1-1,28,32,0 script #Marggo135 NPC_CROPS,{ end; }
005-1-1,29,32,0 script #Marggo136 NPC_CROPS,{ end; }
005-1-1,30,32,0 script #Marggo137 NPC_CROPS,{ end; }
005-1-1,31,32,0 script #Marggo138 NPC_CROPS,{ end; }
005-1-1,32,32,0 script #Marggo139 NPC_CROPS,{ end; }
005-1-1,33,32,0 script #Marggo140 NPC_CROPS,{ end; }
005-1-1,34,32,0 script #Marggo141 NPC_CROPS,{ end; }
005-1-1,35,32,0 script #Marggo142 NPC_CROPS,{ end; }
005-1-1,23,33,0 script #Marggo143 NPC_CROPS,{ end; }
005-1-1,24,33,0 script #Marggo144 NPC_CROPS,{ end; }
005-1-1,25,33,0 script #Marggo145 NPC_CROPS,{ end; }
005-1-1,26,33,0 script #Marggo146 NPC_CROPS,{ end; }
005-1-1,27,33,0 script #Marggo147 NPC_CROPS,{ end; }
005-1-1,28,33,0 script #Marggo148 NPC_CROPS,{ end; }
005-1-1,29,33,0 script #Marggo149 NPC_CROPS,{ end; }
005-1-1,30,33,0 script #Marggo150 NPC_CROPS,{ end; }
005-1-1,31,33,0 script #Marggo151 NPC_CROPS,{ end; }
005-1-1,32,33,0 script #Marggo152 NPC_CROPS,{ end; }
005-1-1,33,33,0 script #Marggo153 NPC_CROPS,{ end; }
005-1-1,34,33,0 script #Marggo154 NPC_CROPS,{ end; }
005-1-1,35,33,0 script #Marggo155 NPC_CROPS,{ end; }
005-1-1,23,34,0 script #Marggo156 NPC_CROPS,{ end; }
005-1-1,24,34,0 script #Marggo157 NPC_CROPS,{ end; }
005-1-1,25,34,0 script #Marggo158 NPC_CROPS,{ end; }
005-1-1,26,34,0 script #Marggo159 NPC_CROPS,{ end; }
005-1-1,27,34,0 script #Marggo160 NPC_CROPS,{ end; }
005-1-1,28,34,0 script #Marggo161 NPC_CROPS,{ end; }
005-1-1,29,34,0 script #Marggo162 NPC_CROPS,{ end; }
005-1-1,30,34,0 script #Marggo163 NPC_CROPS,{ end; }
005-1-1,31,34,0 script #Marggo164 NPC_CROPS,{ end; }
005-1-1,32,34,0 script #Marggo165 NPC_CROPS,{ end; }
005-1-1,33,34,0 script #Marggo166 NPC_CROPS,{ end; }
005-1-1,34,34,0 script #Marggo167 NPC_CROPS,{ end; }
005-1-1,35,34,0 script #Marggo168 NPC_CROPS,{ end; }
|