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
|
// This file is part of the Tutorial
// Author: Jenalya
042-2.gat,21,26,0|script|TutDebug|154,
{
mes "[TutDebug]";
mes "Reset?";
menu
"Yes.",L_Reset,
"No.",L_End;
L_Reset:
set TUT_var, 0;
set @tutorial_tmp, 0;
set TUTORIAL, (TUTORIAL & ~(NIBBLE_0_MASK) | (@tutorial_tmp << NIBBLE_0_SHIFT));
set TUTORIAL, TUTORIAL &~ $@SorfinaHasanBit;
set TUTORIAL, TUTORIAL &~ $@TanishaHasanBit;
set TUTORIAL, TUTORIAL &~ $@HasanCompleteBit;
set FLAGS, FLAGS &~ FLAG_TUTORIAL_DONE;
mes "Reset!";
goto L_End;
L_End:
end;
OnInit:
if(!debug)
disablenpc "TutDebug";
end;
}
042-2.gat,28,26,0|script|Sorfina|154,1,4
{
callfunc "TutorialState";
if ((Hp != MaxHp) && (@tutorial >= 4))
goto L_Heal;
goto L_Main;
L_Heal:
mes "[Sorfina]";
mes "\"Hello Dear! You look tired, you should rest a moment.\"";
mes "You take a short nap and feel refreshed.";
heal MaxHp, 0;
goto L_Main;
L_Main:
if ((@tutorial == 11) && !(@sorfina_hasan)) goto L_Hasan;
if (FLAGS & FLAG_TUTORIAL_DONE) goto L_Again;
if (@tutorial >= 4) goto L_Again;
if (@tutorial == 3) goto L_Clothes;
if (@tutorial == 2) goto L_Chest;
if (@tutorial == 1) goto L_Carpet;
callfunc "GameRules";
goto L_Start;
L_Start:
mes "You open your eyes.";
mes "";
mes "[Old Woman]";
mes "\"Ah, you woke up. It seems you collapsed after you left the boat that brought you to Tulimshar.";
mes "A group of ragtags immediately took advantage of that and stole all your stuff!\"";
next;
mes "\"My little granddaughter Tanisha saw that, but couldn't do anything to stop them.";
mes "She hurried to get someone to help. It was too late to catch the thieves, but at least the helpers brought you here to recover.\"";
next;
mes "\"We're in the suburbs of Tulimshar here and this area of the town is full of shady people, so I don't think there's a chance to get your stuff back.\"";
mes "She has a sad look on her face, but then she shakes her head and smiles.";
next;
mes "[Old Woman]";
mes "\"Did you come here to look for a job? Many young people come to Tulimshar for this reason.\"";
next;
mes "\"I can tell you some useful things, if you want to hear.";
mes "Oh, and by the way my name is Sorfina.\"";
next;
mes "[Server]";
mes "The explanations in this tutorial are based on the official client, Manaplus.";
mes "If you're using another client, settings and controls may be different.";
menu
"That would be great!",L_Tut,
"No, thanks. I already know how things are going.",L_SkipTut;
L_Tut:
mes "She smiles at you.";
mes "[Sorfina]";
mes "\"A wise decision.\"";
next;
mes "\"You still look rather shaky.";
mes "You're not used to the hot weather, right?\"";
next;
goto L_Carpet;
L_Carpet:
mes "[Sorfina]";
mes "\"Try to take a few steps and walk to that carpet over there.";
mes "Just use the ###keyMoveUp; to move up, ###keyMoveDown; to move down, ";
mes " ###keyMoveLeft; to move left, ###keyMoveRight; to move right ";
mes " or click on the place you want to go to.\"";
set @tutorial_tmp, 1;
callfunc "SetTutorialMask";
goto L_Close;
L_Chest:
mes "[Sorfina]";
mes "\"In that chest there are some clothes you can take.\"";
next;
mes "\"To interact with things in your environment or talk to NPCs you can either click on it or press ###keyTargetNPC; to focus and ###keyTalk; to talk/activate.\"";
next;
mes "\"Now get the clothes out of the chest.\"";
goto L_Close;
L_Naked:
mes "[Sorfina]";
mes "\"Press ###keyWindowInventory; or click on the Inventory button in the bar at the upper right corner to open your bag.\"";
next;
mes "\"Once we stop talking, double-click on the clothes to equip.\"";
next;
mes "\"Talk to me again after you get dressed. You can either click on me, or press ###keyTargetNPC; to focus on me and ###keyTalk; to talk.\"";
goto L_Close;
L_Clothes:
if (getequipid(equip_torso) < 0)
goto L_Naked;
mes "[Sorfina]";
mes "\"That's much better, don't you think?\"";
next;
mes "\"Here take this.\"";
getitem "HitchhikersTowel", 1;
mes "\"Your HitchHikers Towel will return you to your last set soul menhir or here if not set.\"";
mes "\"It can't be used constantly as the magic needs time to power the jump.\"";
next;
mes "\"I think this will help you a bit. To get more information, press the button Setup and look at the controls on the Keyboard tab. You can also change them as you like.";
mes "Talk to me again if you want me to explain more things.\"";
next;
mes "\"Now you should go to see my granddaughter, she is very worried. She's downstairs.\"";
next;
mes "\"Oh, and if you're looking for work, you should talk to Aidan when you go to Tulimshar. They're giving rewards for monster hunting.";
mes "You can find him near the south gate.\"";
next;
mes "She hesitates a moment.";
mes "\"[Sorfina]\"";
mes "\"And here is some money for you. At least you can buy yourself something to eat.";
mes "Good luck!\"";
set Zeny, Zeny + 30;
set @tutorial_tmp, 4;
callfunc "SetTutorialMask";
goto L_Close;
L_Again:
mes "[Sorfina]";
mes "\"Make yourself at home! Do you have any questions?\"";
menu
"Yes, could you explain about...",L_Explain,
"No, thanks.",L_Close;
L_Explain:
menu
"... walking?",L_Walk,
"... talking?",L_Talk,
"... the inventory and items?",L_Items,
"... shortcuts?",L_Shortcut,
"... what to do in Tulimshar?",L_Aidan,
"... nevermind.",L_Close;
L_Walk:
mes "[Sorfina]";
mes "\"You can use the arrow keys to walk around.";
mes "Just use the ###keyMoveUp; to move up, ###keyMoveDown; to move down, ";
mes " ###keyMoveLeft; to move left, ###keyMoveRight; to move right ";
mes " or click on the place you want to go to.\"";
mes "This only works if that place is reachable and walkable.\"";
goto L_Close;
L_Talk:
mes "[Sorfina]";
mes "\"If you want to talk to a normal person, you can click at him or her.";
mes "Or you can press ###keyTargetNPC; to focus on the nearest person and then press ###keyTalk; to talk.\"";
next;
mes "\"If you want to talk to other adventurers, press ###keyChat; to open your chat window.";
mes "Then type your message and press Enter to send.\"";
next;
mes "\"You may want to talk privately to another adventurer sometimes. In that case you can whisper.";
mes "After pressing ###keyChat; type '/whisper [name] [message]'.";
mes "Or you can right click on someone and choose the whisper option.\"";
next;
mes "\"Press ###keyWindowChat; to show and hide your chat window.\"";
goto L_Close;
L_Items:
mes "[Sorfina]";
mes "\"There are three types of items.";
mes "They can be Consumables, Equipment or Miscellaneous.\"";
next;
mes "\"Consumable items such as Potions, can be used only once.";
mes "After use, they will disappear from your inventory.";
mes "There are some rare items that can be used but don't get consumed.";
next;
mes "\"Equipment items like Armors, Weapons, Accessories can be equipped for fashionable purposes or to raise your status.\"";
next;
mes "\"Miscellaneous items such as maggot slime, can be used in creating other items, or just to trade and sell.\"";
next;
mes "\"Your HitchHikers Towel will return you to your last set soul menhir or here if not set.\"";
mes "\"It can't be used constantly as the magic needs time to power the jump.\"";
next;
mes "\"Press ###keyWindowInventory; to open your inventory.";
mes "When placing your cursor over an item there, you can see a box with some information about that item.\"";
next;
mes "\"To use or equip an item, select it by double-clicking on it.";
mes "Selecting the item then pressing Use or Equip also works.\"";
goto L_Close;
L_Shortcut:
mes "[Sorfina]";
mes "\"Press ###keyOutfitShortcut1; or click the Shortcut button in the bar at the upper right to open your shortcut window.\"";
next;
mes "\"You can select the item you want to put on a shortcut with your mouse and then click on the position in the shortcut window you want to place it.\"";
next;
mes "\"Now you can use or equip/unequip it by pressing the number of the shortcut.\"";
goto L_Close;
L_Aidan:
mes "[Sorfina]";
mes "\"I suggest to go to the bazaar near the south gate.";
mes "We're in the north of Tulimshar here, so you have to walk across the town.\"";
next;
mes "\"When you leave this area to the Southeast, you'll come to the docks.";
mes "Follow the street to the south to pass the old town gates.\"";
next;
mes "\"Turn west at the next intersection. You'll pass by the gates of Tulimshar's famous magic school there.";
mes "Just follow the street to the south and you'll reach the bazaar.\"";
next;
mes "\"I heard Aidan is looking for brave adventurers, you might want to talk to him.";
mes "Usually the bazaar is bustling with activity, there are many people who can help.";
mes "Talk to everybody. You can never tell when they might know something useful.\"";
goto L_Close;
L_Hasan:
mes "[Sorfina]";
mes "\"Make yourself at home! Do you have any questions?\"";
menu
"A guy named Hasan is bullying people.",L_Next,
"Yes, could you explain again about...",L_Explain,
"No, thanks.",L_Close;
L_Next:
mes "\"Ah, Hasan. He's causing trouble again?\"";
mes "She shakes her head.";
next;
mes "[Sorfina]";
mes "\This guy has been a plague ever since he could walk. He's always causing trouble.\"";
next;
mes "\"And his father... Well, one day his father thought he should teach Hasan a lesson.\"";
next;
mes "\"He took him into the desert and then left him there!";
mes "Hasan was only seven years old!\"";
next;
mes "\"I never understood how someone could do something like that to a child, even if it's a rascal like Hasan.\"";
next;
mes "\"Anyway, Hasan tried to find his way back home, but stumbled into a nest of scorpions!\"";
mes "She shakes her head.";
next;
mes "\"If Valon hadn't have come along that moment, Hasan would have died that day.\"";
next;
mes "\"However, the scorpions poison caused a bad fever and once Hasan had recovered from that, he was even more malicious than before.\"";
mes "She sighs.";
set TUTORIAL, TUTORIAL | $@SorfinaHasanBit;
goto L_Close;
L_SkipTut:
mes "[Sorfina]";
mes "\"Really? You seem quite unexperienced. Listening to some advice won't hurt.\"";
menu
"Thinking about it twice... please tell me.",L_Tut,
"Yeah, but thanks for the offer. Bye.",L_Bye;
L_Bye:
mes "[Sorfina]";
mes "\"Alright, if you say so. But take at least this.";
callfunc "TutorialCompleted";
getitem "Knife", 1;
getitem "SlingShot", 1;
getitem "SlingBullet", 100;
getitem "HitchhikersTowel", 1;
getitem "CottonShirt", 1;
getitem "RaggedShorts", 1;
set Zeny, Zeny + 50;
mes "Good luck.\"";
goto L_Close;
L_Close:
close;
OnTouch:
if (TUT_var != 0)
end;
callfunc "GameRules";
goto L_Start;
}
042-2.gat,33,27,0|script|#Carpet|32767,1,1
{
end;
OnTouch:
callfunc "TutorialState";
if (@tutorial != 1)
end;
mes "[Sorfina]";
mes "\"Very good! I'm glad you're recovering.";
mes "Now you should get dressed again.\"";
next;
mes "Sorfina unlocks the chest behind her.";
next;
mes "[Sorfina]";
mes "\"In that chest there are some clothes you can take.\"";
next;
mes "\"To interact with things in your environment or talk to NPCs you can either click on it or press N to focus and T to talk/activate.\"";
next;
mes "\"Now get the clothes out of the chest.\"";
set @tutorial_tmp, 2;
callfunc "SetTutorialMask";
close;
}
042-2.gat,29,23,0|script|Chest#tutorial|111,
{
callfunc "TutorialState";
if (@tutorial > 2) goto L_Empty;
if (@tutorial == 2) goto L_Shirt;
mes "The chest is locked.";
close;
L_Shirt:
mes "You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the chest.";
getitem "CottonShirt", 1;
getitem "RaggedShorts", 1;
next;
mes "[Sorfina]";
mes "\"Great! Now you can equip it.\"";
next;
mes "\"You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.\"";
next;
mes "\"After we finish talking, click on the clothes and press the equip button.\"";
set @tutorial_tmp, 3;
callfunc "SetTutorialMask";
close;
L_Empty:
mes "The chest is empty.";
close;
}
042-2.gat,44,31,0|script|#DoorOutTut1|45,0,0
{
end;
OnTouch:
callfunc "TutorialState";
if ((@tutorial < 4) && !(FLAGS & FLAG_TUTORIAL_DONE))
goto L_Block;
warp "042-1.gat", 51, 44;
end;
L_Block:
message strcharinfo(0), "Sorfina: Wait a moment! You're not ready to leave.";
end;
}
|