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
|
// Evol scripts.
// Author:
// gumi, Micksha
// Quest states:
// [1] 0 - cannot do the quest
// [1] 1 - can do the quest
// [1] 2 - hinnak asked for help
// [1] 3 - helped hinnak
// [2] kill counter
// Description:
// Hinnak needs help to get rid of the same stuff than ever.
008-1,270,74,0 script Hinnak#008-1 NPC_HINNAK,{
if (BaseLevel < .min_level)
{
npctalk3 generic(1 | 16 | 64);
end;
}
function hinn_new_player
{
if(getequipid(EQI_HEAD_TOP) == .bad_hat)
{
narrator 4,
l("The farmer lunges at you with a farming implement.");
heal -50, 0;
selectd
l("I'm out of here."),
l("Whoa, what are you doing?");
if (@menu == 1)
{
return;
}
speech 4 | 1,
l("Sorry, you look like a pinkie."),
l("They've been destroying my fields, and I guess I got a bit worked up.");
}
else
{
speech 4,
l("Argh!"),
l("I hate them!"),
l("I @#$% hate them!"),
l("I @#$% hate these @#$% pinkies!");
selectd
l("You need some anger control therapy."),
l("Why do you hate them?");
if (@menu == 1)
{
return;
}
speech 4 | 1,
l("These @#$% beasts are jumping around in my fields destroying all my harvest."),
l("But they are too fast."),
l("I can't catch them.");
}
selectd
l("Want me to help you?");
speech 4 | 1,
l("Yes, you look quite fast."),
l("Maybe you can catch some of them."),
l("That will pay them a lesson."),
l("Slay some of them and bring me %d of their antennae.", .drop_count);
setq .quest, 2, 0;
selectd
l("How much is this worth to you?");
speech 1,
l("Well, I can't offer you much."),
l("But I got an old scythe laying around."),
l("Maybe you can use it as a weapon.");
close;
}
function hinn_help
{
if (getequipid(EQI_HEAD_TOP) == .bad_hat)
{
narrator 4,
l("The farmer glares at your hat.");
}
speech 4,
l("Have you got the %d antennae?", .drop_count);
selectd
l("Not yet, but I am working on it."),
rif(countitem(.monster_drop) >= .drop_count, l("Sure, here they are!"));
if (@menu == 1)
{
return;
}
if (getq2(.quest) < .kill_count)
{
speech 1,
l("Don't try to fool me!"),
l("I know you didn't kill them yourself!"),
l("Kill at least %d pinkies and come back.", .kill_count);
close;
}
speech 1,
l("Thank you very much"),
l("As promised, here's my old scythe."),
l("Maybe you can use it as a weapon."),
l("It is a bit cumbersome but its strikes are deadly.");
if (countitem(.monster_drop) >= .drop_count)
{
delitem .monster_drop, .drop_count;
getitem .reward_item, 1;
quest_gp(.maxLevel, .reward_money);
//getexp .reward_exp, 0;
setq .quest, 3;
}
close;
}
function hinn_thanks
{
if (getequipid(EQI_HEAD_TOP) == .bad_hat)
{
speech 4,
l("That better be a trophy on your head.");
selectd
l("It is.");
speech 4 | 1,
l("Good then."),
l("Thanks for your help with the pinkies.");
}
else
{
speech 4,
l("Good to see you again."),
l("Thanks again for helping me with the pinkies!");
}
selectd
l("Sure, any time!"),
l("Anything else you want me to do?"),
l("You're welcome. Bye!");
if (@menu == 3)
{
return;
}
speech 4 | 1,
l("Actually, it's been a long day."),
l("If it's no trouble, could you get me a %s?",
getitemlink(.drink_item));
selectd
rif(countitem(.drink_item) >= 1, l("Here you are.")),
l("Sure, I'll go get one. Bye!"),
l("You shouldn't drink while working!");
do
{
switch (@menu)
{
case 2: return;
case 3:
speech 1,
l("Well, I'm done for the day, and I'm quite old enough to decide when I can have a %s, thank you!",
getitemname(.drink_item));
selectd
rif(countitem(.drink_item) >= 1, l("Sorry... here you are.")),
l("I don't have any.");
break;
default:
if (countitem(.drink_item) < 1)
{
return;
}
delitem .drink_item, 1;
narrator 4 | 8 | 2 | 1,
l("%s takes a sip.", .name$);
speech 4,
l("Aaah!"),
l("Nothing like a well-deserved %s after a long day of tending the crops!",
getitemname(.drink_item)),
l("Thanks, that was very kind of you!");
narrator 4 | 8 | 1 | 2,
l("He takes another sip.");
speech 4,
l("Thanks!"),
l("You know, I had the strangest thing happen to me."),
l("I had this patch of ground that was really clumpy; lots of clay, you see."),
l("Right over there."),
// TODO: move cam to the spot
l("Looks much better now, doesn't it?"),
// TODO: restore cam
l("But how I got there is kind of scary..."),
l("I'd been trying to break it up for a while, but that kind of work is a pain."),
l("So my wife said that I should go and see the witch, just in case she knows something."),
l("And sure enough I ask the witch, and she has a look at it."),
l("“Nothing I can do”, she says, “but I can ask a friend”."),
l("So the next day another witch shows up."),
l("Gorgeous woman, but when she looked at me, the scares went scuttling down my spine..."),
l("First thing she asked was if I'm a farmer."),
l("Said her friend had told her that I needed help."),
l("I show her what the problem is, and she tells me to go inside and wait.");
narrator 4 | 8 | 1 | 2,
l("%s drains his mug in one long sip, then hesitates.", .name$);
speech 4,
l("So I go inside."),
l("I'm barely in when it starts raining outside, pouring cats and mouboos!"),
l("Not so weird, perhaps, except that it was been bright and sunny just a second before!"),
l("So I rush out, my wife telling me to leave the witch alone, and I see her standing there in the middle of the rain..."),
l("None of the raindrops touched her, as if they were afraid!"),
l("Then she yells out some gobbledygook word, and out of the ground there comes a swarm of maggots, crawling and digging and climbing over each other's backs..."),
// XXX: maybe here insert a reference to SUSAN?
l("And then she turns to me!"),
l("Seeing her gaze, for a moment there I thought she would turn me into a pinkie, for sure..."),
l("But all she says is, “had you stayed inside, you wouldn't be wet now”.");
selectd
l("Hahaha!"),
l("Whoah, scary..."),
l("What was that gobbledygook word?"),
l("I better go now. Bye.");
switch (@menu)
{
case 1:
speech 1,
l("Yeah, funny now..."),
l("But you should've seen that gaze!"),
l("Ah, well, never mind.");
close;
case 2:
speech 1,
l("Yeah, you could say that...");
close;
case 3:
speech 1,
l("Oh, I can't be sure..."),
l("But something like “Nanaj princino”, I think."); // this is "Dwarven Princess" translated to Esperanto
close;
}
return;
}
} while(true);
}
// OnTalk:
if (getq(.quest_inspector) == 11)
{
selectd
l("Did you see anyone in a mask come by here at night?"),
l("Did you see anyone with a large satchel come by here at night?"),
l("Hello.");
switch (@menu)
{
case 1:
speech
l("No."),
l("It tends to be too dark to see a mask.");
close;
case 2:
speech
l("Yes, I saw someone with a large sack on their back go to the mining camp.");
close;
}
}
switch (getq(.quest))
{
case 0:
case 1: hinn_new_player; break;
case 2: hinn_help; break;
default: hinn_thanks;
}
closeclientdialog();
close;
OnNPCKillEvent:
// XXX: maybe have a OnTakeScript on the pinky antena item so we count pickups instead of kills
if (killedrid == .monster_id && getq(.quest) == 2 &&
getq2(.quest) < .kill_count && strcharinfo(PC_MAP) == .map$)
{
setq .quest, 2, getq2(.quest) + 1;
}
end;
OnPCLoginEvent:
OnPCBaseLvUpEvent:
if (BaseLevel >= .min_level && getq(.quest) < 1)
{
setq .quest, 1; // allow the player to do the quest
dispbottom l("New quest available: %s (level %d+)",
getquestlink(.quest), .min_level); // XXX: requires new manaplus versions, maybe show a different message for old versions?
}
end;
OnInit:
.min_level = 15; // min level to do the quest
.maxLevel = getiteminfo(Scythe, ITEMINFO_ELV) + 20;
.monster_id = Pinkie; // monster to kill
.monster_drop = PinkAntennae; // monster drop to collect
.drop_count = 10; // amount of that drop needed
.kill_count = 10; // min number of kills
.reward_item = Scythe; // reward item
.reward_money = 0; // reward money
.reward_exp = 0; // reward exp
.bad_hat = PinkieHat; // hinnak attacks you when you wear this hat
.drink_item = Beer; // the item hinnak asks to drink
.quest = HurnscaldQuests_Hinnak;
.quest_inspector = HurnscaldQuests_Inspector;
.quest_debug = .quest;
.distance = 3;
////////// UNFINISHED //////////
////////////////////////////////
// REMOVE THIS CODE WHEN THIS //
// NPC IS NO LONGER A WIP //////
////////////////////////////////
//if (!debug) disablenpc(.name$);
///////// UNFINISHED ///////////
end;
}
|