1-- Set the namespace according to the map name.
2local ns = {};
3setmetatable(ns, {__index = _G});
4layna_village_riverbank_script = ns;
5setfenv(1, ns);
6
7-- The map name, subname and location image
8map_name = "Mountain Village of Layna"
9map_image_filename = "data/story/common/locations/mountain_village.png"
10map_subname = "Riverbank"
11
12-- The music file used as default background music on this map.
13-- Other musics will have to handled through scripting.
14music_filename = "data/music/Caketown_1-OGA-mat-pablo.ogg"
15
16-- c++ objects instances
17local Map = nil
18local EventManager = nil
19
20local bronann = nil
21local kalya = nil
22local orlinn = nil
23local orlinn_dialogue_npc = nil
24local lilly = nil
25
26-- the main map loading code
27function Load(m)
28
29    Map = m;
30    EventManager = Map:GetEventSupervisor();
31
32    Map:SetUnlimitedStamina(true);
33
34    _CreateCharacters();
35    -- Set the camera focus on Bronann
36    Map:SetCamera(bronann);
37
38    _CreateNPCs();
39    _CreateObjects();
40
41    _CreateEvents();
42    _CreateZones();
43
44    -- Add clouds overlay
45    Map:GetEffectSupervisor():EnableAmbientOverlay("data/visuals/ambient/clouds.png", 5.0, -5.0, true);
46
47    _HandleCredits();
48
49    -- Once everything is created, we set up Orlinn and Lilly behaviour
50    _SetOrlinnState();
51    _SetLillyState();
52end
53
54-- Handle the display of the new game credits
55function _HandleCredits()
56    -- Handle small credits triggering
57    if (GlobalManager:GetGameEvents():DoesEventExist("game", "Start_Credits") == false) then
58        -- Triggers the small credits display
59        GlobalManager:GetGameEvents():SetEventValue("game", "Start_Credits", 1);
60    end
61    if (GlobalManager:GetGameEvents():DoesEventExist("game", "Credits_shown") == false) then
62        Map:GetScriptSupervisor():AddScript("data/credits/episode1_credits.lua");
63    end
64end
65
66function Update()
67    -- Check whether the character is in one of the zones
68    _CheckZones();
69end
70
71-- Character creation
72function _CreateCharacters()
73    bronann = CreateSprite(Map, "Bronann", 97, 4, vt_map.MapMode.GROUND_OBJECT);
74    bronann:SetDirection(vt_map.MapMode.SOUTH);
75    bronann:SetMovementSpeed(vt_map.MapMode.NORMAL_SPEED);
76
77    -- set up the position according to the previous map and location
78    if (GlobalManager:GetMapData():GetPreviousLocation() == "from_village_south") then
79        bronann:SetPosition(117, 18);
80        bronann:SetDirection(vt_map.MapMode.WEST);
81    end
82
83    if (GlobalManager:GetMapData():GetPreviousLocation() == "from_secret_path") then
84        bronann:SetPosition(65, 4);
85        bronann:SetDirection(vt_map.MapMode.SOUTH);
86    end
87
88    if (GlobalManager:GetMapData():GetPreviousLocation() == "from_riverbank_house") then
89        bronann:SetPosition(98, 48);
90        bronann:SetDirection(vt_map.MapMode.SOUTH);
91        AudioManager:PlaySound("data/sounds/door_close.wav");
92    end
93end
94
95function _CreateNPCs()
96    local text = nil
97    local dialogue = nil
98    local event = nil
99
100    lilly = CreateNPCSprite(Map, "Woman3", vt_system.Translate("Lilly"), 67, 40, vt_map.MapMode.GROUND_OBJECT);
101
102    local object = CreateObject(Map, "Dog1", 66, 42, vt_map.MapMode.GROUND_OBJECT);
103    event = vt_map.SoundEvent.Create("Lilly's dog barks", "data/sounds/dog_barking.wav");
104
105    object:SetEventWhenTalking("Lilly's dog barks");
106
107    kalya = CreateSprite(Map, "Kalya", 2, 2, vt_map.MapMode.GROUND_OBJECT);
108    kalya:SetDirection(vt_map.MapMode.SOUTH);
109    kalya:SetMovementSpeed(vt_map.MapMode.NORMAL_SPEED);
110    kalya:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
111    kalya:SetVisible(false);
112
113    orlinn = CreateSprite(Map, "Orlinn", 82, 5, vt_map.MapMode.GROUND_OBJECT);
114    orlinn:SetDirection(vt_map.MapMode.SOUTH);
115    orlinn:SetMovementSpeed(vt_map.MapMode.VERY_FAST_SPEED);
116
117    -- Create an invisible doppelganger to permit triggering dialogues when the kid is on the cliff.
118    orlinn_dialogue_npc = CreateSprite(Map, "Orlinn", 82, 8, vt_map.MapMode.GROUND_OBJECT);
119    orlinn_dialogue_npc:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
120    orlinn_dialogue_npc:SetVisible(false);
121end
122
123function _CreateObjects()
124    local object = nil
125
126    CreateObject(Map, "Tree Big2", 70, 6, vt_map.MapMode.GROUND_OBJECT);
127
128    -- Add hill treasure chest
129    local hill_chest = CreateTreasure(Map, "riverbank_secret_hill_chest", "Wood_Chest1", 72, 5, vt_map.MapMode.GROUND_OBJECT);
130    hill_chest:AddItem(1, 3); -- 3 small potions
131
132    -- trees around the house
133    CreateObject(Map, "Tree Big2", 92, 10, vt_map.MapMode.GROUND_OBJECT);
134    CreateObject(Map, "Tree Small1", 82, 17, vt_map.MapMode.GROUND_OBJECT);
135    CreateObject(Map, "Tree Big1", 75, 20, vt_map.MapMode.GROUND_OBJECT);
136    CreateObject(Map, "Tree Big2", 72, 35, vt_map.MapMode.GROUND_OBJECT);
137    CreateObject(Map, "Tree Big1", 74, 48, vt_map.MapMode.GROUND_OBJECT);
138    CreateObject(Map, "Tree Big2", 76, 50, vt_map.MapMode.GROUND_OBJECT);
139    CreateObject(Map, "Barrel1", 56.3, 56.5, vt_map.MapMode.GROUND_OBJECT);
140
141    -- grass array, used to hide defects
142    local map_grass = {
143    { "Grass Clump1", 111, 7 },
144    { "Grass Clump1", 108, 6 },
145    { "Grass Clump1", 64, 15 },
146    { "Grass Clump1", 62, 13 },
147    { "Grass Clump1", 61, 6.2 },
148    { "Grass Clump1", 65, 7 },
149    { "Grass Clump1", 68, 10 },
150    { "Grass Clump1", 72, 8.2 },
151    { "Grass Clump1", 76, 8 },
152    }
153
154    -- Loads the trees according to the array
155    for my_index, my_array in pairs(map_grass) do
156        --print(my_array[1], my_array[2], my_array[3]);
157        object = CreateObject(Map, my_array[1], my_array[2], my_array[3], vt_map.MapMode.GROUND_OBJECT);
158        object:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
159    end
160
161    -- Lights
162    -- big round windows light flares
163    vt_map.Light.Create("data/visuals/lights/sun_flare_light_main.lua",
164                        "data/visuals/lights/sun_flare_light_secondary.lua",
165                        94.0, 40.0,
166                        vt_video.Color(1.0, 1.0, 1.0, 0.6),
167                        vt_video.Color(1.0, 1.0, 0.85, 0.3));
168    vt_map.Light.Create("data/visuals/lights/sun_flare_light_main.lua",
169                        "data/visuals/lights/sun_flare_light_secondary.lua",
170                        102.0, 40.0,
171                        vt_video.Color(1.0, 1.0, 1.0, 0.6),
172                        vt_video.Color(1.0, 1.0, 0.85, 0.3));
173    -- Small door lights
174    vt_map.Light.Create("data/visuals/lights/sun_flare_light_small_main.lua",
175                        "data/visuals/lights/sun_flare_light_small_secondary.lua",
176                        98.0, 43.5,
177                        vt_video.Color(1.0, 1.0, 1.0, 0.6),
178                        vt_video.Color(1.0, 1.0, 0.85, 0.3));
179
180    vt_map.SoundObject.Create("data/sounds/gentle_stream.ogg", 61.0, 27.0, 20.0);
181    vt_map.SoundObject.Create("data/sounds/gentle_stream.ogg", 61.0, 47.0, 20.0);
182    vt_map.SoundObject.Create("data/sounds/gentle_stream.ogg", 61.0, 67.0, 20.0);
183    vt_map.SoundObject.Create("data/sounds/gentle_stream.ogg", 81.0, 67.0, 20.0);
184    vt_map.SoundObject.Create("data/sounds/gentle_stream.ogg", 101.0, 67.0, 20.0);
185end
186
187-- Creates all events and sets up the entire event sequence chain
188function _CreateEvents()
189    local event = nil
190    local dialogue = nil
191    local text = nil
192
193    -- Map change Events
194    vt_map.MapTransitionEvent.Create("to Village center", "data/story/layna_village/layna_village_center_map.lua",
195                                     "data/story/layna_village/layna_village_center_script.lua", "from_riverbank");
196
197    vt_map.MapTransitionEvent.Create("to Village south entrance", "data/story/layna_village/layna_village_south_entrance_map.lua",
198                                     "data/story/layna_village/layna_village_south_entrance_script.lua", "from_riverbank");
199
200    vt_map.MapTransitionEvent.Create("to Riverbank house", "data/story/layna_village/layna_village_riverbank_house_map.lua",
201                                     "data/story/layna_village/layna_village_riverbank_house_script.lua", "from_riverbank");
202
203    vt_map.MapTransitionEvent.Create("to secret path entrance", "data/story/layna_village/layna_village_center_map.lua",
204                                     "data/story/layna_village/layna_village_center_script.lua", "from_secret_path");
205
206    vt_map.ScriptedEvent.Create("Orlinn laughs", "orlinn_laughs", "");
207
208    -- Quest events - Hide and seek 2
209    dialogue = vt_map.SpriteDialogue.Create();
210    text = vt_system.Translate("Wow! You found me!");
211    dialogue:AddLineEmote(text, orlinn, "exclamation");
212    text = vt_system.Translate("But I'm not done yet!");
213    dialogue:AddLine(text, orlinn);
214    text = vt_system.Translate("You'll never find me hiding behind the...");
215    dialogue:AddLine(text, orlinn);
216    text = vt_system.Translate("Hey, why would I tell you my hiding spots?!");
217    dialogue:AddLineEmote(text, orlinn, "exclamation");
218
219    event = vt_map.DialogueEvent.Create("Quest1: Orlinn starts hide and seek3 speech", dialogue);
220    event:SetStopCameraMovement(true);
221    event:AddEventLinkAtEnd("Quest1: Hide and seek2: Make Orlinn run");
222
223    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and seek2: Make Orlinn run", orlinn, 72, 2, true);
224    event:AddEventLinkAtEnd("Quest1: Hide and seek2: Make Orlinn disappear");
225
226    event = vt_map.ScriptedSpriteEvent.Create("Quest1: Hide and seek2: Make Orlinn disappear", orlinn, "MakeInvisible", "");
227    event:AddEventLinkAtEnd("Quest1: Hide and seek2: Bronann end speech");
228
229    dialogue = vt_map.SpriteDialogue.Create();
230    text = vt_system.Translate("That kid is pretty quick. This is going to take all day.");
231    dialogue:AddLineEmote(text, bronann, "sweat drop");
232
233    event = vt_map.DialogueEvent.Create("Quest1: Hide and seek2: Bronann end speech", dialogue);
234    event:SetStopCameraMovement(true);
235    event:AddEventLinkAtEnd("Map:PopState()");
236
237    vt_map.ScriptedEvent.Create("Map:PopState()", "Map_PopState", "");
238
239    -- Final hide and seek (3)
240    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and Seek3: Orlinn goes top-right", orlinn, 70, 42, false);
241    event:AddEventLinkAtEnd("Hide n Seek3: Orlinn looks south");
242
243    event = vt_map.ChangeDirectionSpriteEvent.Create("Hide n Seek3: Orlinn looks south", orlinn, vt_map.MapMode.SOUTH);
244    event:AddEventLinkAtEnd("Hide n Seek3: Orlinn looks north", 800);
245
246    event = vt_map.ChangeDirectionSpriteEvent.Create("Hide n Seek3: Orlinn looks north", orlinn, vt_map.MapMode.NORTH);
247    event:AddEventLinkAtEnd("Hide n Seek3: Orlinn goes bottom-left", 800);
248
249    event = vt_map.PathMoveSpriteEvent.Create("Hide n Seek3: Orlinn goes bottom-left", orlinn, 74, 43.8, false);
250    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn goes top-right", 8000); -- finish the event loop.
251
252    -- Before Kalya's arrival
253    event = vt_map.ScriptedEvent.Create("Quest1: Hide and Seek3: Orlinn starts to go away", "Prepare_orlinn_kalya_scene", "");
254    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn tries go to away");
255
256    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and Seek3: Orlinn tries go to away", orlinn, 76, 38, false);
257    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Bronann follows him");
258
259    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and Seek3: Bronann follows him", bronann, 76, 40, true);
260    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Bronann turns to Orlinn");
261    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn turns to him");
262
263    vt_map.ChangeDirectionSpriteEvent.Create("Quest1: Hide and Seek3: Bronann turns to Orlinn", bronann, vt_map.MapMode.NORTH);
264
265    event = vt_map.ChangeDirectionSpriteEvent.Create("Quest1: Hide and Seek3: Orlinn turns to him", orlinn, vt_map.MapMode.SOUTH);
266    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Bronann and kalya first speech");
267    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Lilly turns to them");
268
269    vt_map.ChangeDirectionSpriteEvent.Create("Quest1: Hide and Seek3: Lilly turns to them", lilly, vt_map.MapMode.EAST);
270
271    dialogue = vt_map.SpriteDialogue.Create();
272    text = vt_system.Translate("Please no! Wait!");
273    dialogue:AddLine(text, bronann);
274    text = vt_system.Translate("Orlinn! Stop this!");
275    dialogue:AddLineEvent(text, kalya, "", "Quest1: Hide and Seek3: Kalya comes to Orlinn");
276
277    event = vt_map.DialogueEvent.Create("Quest1: Hide and Seek3: Bronann and kalya first speech", dialogue);
278    event:SetStopCameraMovement(true);
279
280    -- Kalya's arrival
281    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and Seek3: Kalya comes to Orlinn", kalya, 76, 36, false);
282    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Kalya's speech");
283    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn turns to Kalya");
284
285    vt_map.ChangeDirectionSpriteEvent.Create("Quest1: Hide and Seek3: Orlinn turns to Kalya", orlinn, vt_map.MapMode.NORTH);
286
287    dialogue = vt_map.SpriteDialogue.Create();
288    text = vt_system.Translate("Orlinn! How many times have I told you not to bother other people?");
289    dialogue:AddLine(text, kalya);
290    text = vt_system.Translate("But sis! I...");
291    dialogue:AddLineEmote(text, orlinn, "sweat drop");
292    text = vt_system.Translate("I don't want to hear it! Now, come!");
293    dialogue:AddLine(text, kalya);
294    text = vt_system.Translate("Don't blame him, Kalya. Actually, it was...");
295    dialogue:AddLineEmote(text, bronann, "sweat drop");
296    text = vt_system.Translate("I don't think I was talking to you, now was I?");
297    dialogue:AddLine(text, kalya);
298    text = vt_system.Translate("Come Orlinn!");
299    dialogue:AddLine(text, kalya);
300
301    event = vt_map.DialogueEvent.Create("Quest1: Hide and Seek3: Kalya's speech", dialogue);
302    event:SetStopCameraMovement(true);
303    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Kalya is going away.");
304    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn is going away.", 2000);
305
306    -- Kalya and Orlinn going away
307    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and Seek3: Kalya is going away.", kalya, 95, 2, false);
308    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Kalya disappears.");
309
310    vt_map.ScriptedSpriteEvent.Create("Quest1: Hide and Seek3: Kalya disappears.", kalya, "MakeInvisible", "");
311
312    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and Seek3: Orlinn is going away.", orlinn, 76, 32, false);
313    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn comes back to Bronann", 1000);
314
315    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and Seek3: Orlinn comes back to Bronann", orlinn, 76, 38, false);
316    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn tells Bronann where the pen was");
317
318    dialogue = vt_map.SpriteDialogue.Create();
319    text = vt_system.Translate("I found that pen near the tree behind you. I just wanted to play.");
320    dialogue:AddLineEmote(text, orlinn, "sweat drop");
321    text = vt_system.Translate("Don't worry about it.");
322    dialogue:AddLine(text, bronann);
323    text = vt_system.Translate("Take it. Thanks.");
324    dialogue:AddLine(text, orlinn);
325
326    event = vt_map.DialogueEvent.Create("Quest1: Hide and Seek3: Orlinn tells Bronann where the pen was", dialogue);
327    event:SetStopCameraMovement(true);
328    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn gives the pen to Bronann");
329
330    event = vt_map.TreasureEvent.Create("Quest1: Hide and Seek3: Orlinn gives the pen to Bronann");
331    event:AddItem(70001, 1); -- The ink key item
332    event:SetDrunes(20); -- The reward for running after Orlinn for so long.
333    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn is going away for real");
334    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Lilly tells Bronann a bit about Kalya", 2000);
335
336    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Hide and Seek3: Orlinn is going away for real", orlinn, 95, 2, false);
337    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: Orlinn disappears.");
338
339    vt_map.ScriptedSpriteEvent.Create("Quest1: Hide and Seek3: Orlinn disappears.", orlinn, "MakeInvisible", "");
340
341    vt_map.AnimateSpriteEvent.Create("Quest1: Bronann is sad", bronann, "hero_stance", 2000);
342
343    -- Lilly tells Bronann about Kalya
344    dialogue = vt_map.SpriteDialogue.Create();
345    text = vt_system.Translate("Bronann?");
346    dialogue:AddLineEvent(text, lilly, "", "Quest1: Hide and Seek3: Bronann turns to Lilly");
347    text = vt_system.Translate("Er, yes?");
348    dialogue:AddLine(text, bronann);
349    text = vt_system.Translate("Don't blame Kalya. She was having a hard time along with her brother before living here, you know?");
350    dialogue:AddLineEvent(text, lilly, "", "Quest1: Bronann is sad");
351    text = vt_system.Translate("Well anyway, she's been ignoring me since the first day I saw her.");
352    dialogue:AddLine(text, bronann);
353    text = vt_system.Translate("Eh? You really know nothing about women, do you?");
354    dialogue:AddLine(text, lilly);
355    text = vt_system.Translate("Huh?");
356    dialogue:AddLineEmote(text, bronann, "interrogation");
357    text = vt_system.Translate("Heh heh, don't worry about it. It will come in time.");
358    dialogue:AddLine(text, lilly);
359
360    event = vt_map.DialogueEvent.Create("Quest1: Hide and Seek3: Lilly tells Bronann a bit about Kalya", dialogue);
361    event:SetStopCameraMovement(true);
362    event:AddEventLinkAtEnd("Map:PopState()");
363    event:AddEventLinkAtEnd("Quest1: Hide and Seek3: done");
364
365    vt_map.ChangeDirectionSpriteEvent.Create("Quest1: Hide and Seek3: Bronann turns to Lilly", bronann, vt_map.MapMode.WEST);
366
367    vt_map.ScriptedEvent.Create("Quest1: Hide and Seek3: done", "Set_Hide_And_Seek3_Done", "");
368
369    -- Lilly goes and bring back barley meal
370    event = vt_map.ScriptedEvent.Create("Quest1: Prepare Lilly for a walk", "Prepare_lilly_walk", "");
371    event:AddEventLinkAtEnd("Quest1: Lilly goes in her house");
372    event:AddEventLinkAtEnd("Quest1: Bronann moves to his wait place");
373
374    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Bronann moves to his wait place", bronann, 70, 40, false);
375    event:AddEventLinkAtEnd("Quest1: Barley Meal: Bronann stares at Lilly");
376
377    vt_map.ChangeDirectionSpriteEvent.Create("Quest1: Barley Meal: Bronann stares at Lilly", bronann, vt_map.MapMode.SOUTH);
378
379    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Lilly goes in her house", lilly, 90, 60, false);
380    event:AddEventLinkAtEnd("Quest1: Lilly comes back");
381
382    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Lilly comes back", lilly, 67, 40, false);
383    event:AddEventLinkAtEnd("Quest1: Barley Meal: Lilly turns to Bronann");
384    event:AddEventLinkAtEnd("Quest1: Barley Meal: Bronann turns to Lilly");
385    event:AddEventLinkAtEnd("Quest1: Barley Meal: Lilly tells Bronann about the barley meal");
386
387    vt_map.LookAtSpriteEvent.Create("Quest1: Barley Meal: Lilly turns to Bronann", lilly, bronann);
388
389    vt_map.ChangeDirectionSpriteEvent.Create("Quest1: Barley Meal: Bronann turns to Lilly", bronann, vt_map.MapMode.WEST);
390
391    dialogue = vt_map.SpriteDialogue.Create();
392    text = vt_system.Translate("Here it is, Bronann.");
393    dialogue:AddLine(text, lilly);
394
395    event = vt_map.DialogueEvent.Create("Quest1: Barley Meal: Lilly tells Bronann about the barley meal", dialogue);
396    event:SetStopCameraMovement(true);
397    event:AddEventLinkAtEnd("Quest1: Barley Meal: Lilly give the barley meal to bronann");
398
399    event = vt_map.TreasureEvent.Create("Quest1: Barley Meal: Lilly give the barley meal to bronann");
400    event:AddEventLinkAtEnd("Quest1: Barley meal is given.");
401    event:AddItem(70002, 1); -- The barley meal key item
402
403    event = vt_map.ScriptedEvent.Create("Quest1: Barley meal is given.", "GiveBarleyMeal", "");
404    event:AddEventLinkAtEnd("Quest1: Barley Meal: Lilly tells Bronann about the restrictions");
405
406    dialogue = vt_map.SpriteDialogue.Create();
407    text = vt_system.Translate("Thanks, Lilly.");
408    dialogue:AddLine(text, bronann);
409    text = vt_system.Translate("We've been having a shortage of food lately. I've been taking... special measures to ensure that everyone has enough food.");
410    dialogue:AddLine(text, lilly);
411    text = vt_system.Translate("Try to enjoy this day, Bronann.");
412    dialogue:AddLine(text, lilly);
413
414    event = vt_map.DialogueEvent.Create("Quest1: Barley Meal: Lilly tells Bronann about the restrictions", dialogue);
415    event:SetStopCameraMovement(true);
416    event:AddEventLinkAtEnd("Quest1: Reset Lilly dialogue");
417
418    event = vt_map.ScriptedEvent.Create("Quest1: Reset Lilly dialogue", "Reset_lilly_dialogue", "");
419    event:AddEventLinkAtEnd("Map:PopState()");
420end
421
422-- zones
423local village_center_zone = nil
424local to_village_entrance_zone = nil
425local to_riverbank_house_entrance_zone = nil
426local to_secret_path_entrance_zone = nil
427local orlinn_hide_n_seek2_zone = nil
428
429function _CreateZones()
430    -- N.B.: left, right, top, bottom
431    village_center_zone = vt_map.CameraZone.Create(89, 105, 0, 2);
432    to_village_entrance_zone = vt_map.CameraZone.Create(118, 119, 10, 27);
433    to_riverbank_house_entrance_zone = vt_map.CameraZone.Create(96, 100, 46, 47);
434    to_secret_path_entrance_zone = vt_map.CameraZone.Create(60, 72, 0, 2);
435    orlinn_hide_n_seek2_zone = vt_map.CameraZone.Create(75, 80, 0, 7);
436end
437
438function _CheckZones()
439    if (village_center_zone:IsCameraEntering() == true) then
440        bronann:SetMoving(false);
441        EventManager:StartEvent("to Village center");
442    end
443
444    if (to_village_entrance_zone:IsCameraEntering() == true) then
445        bronann:SetMoving(false);
446        EventManager:StartEvent("to Village south entrance");
447    end
448
449    if (to_riverbank_house_entrance_zone:IsCameraEntering() == true) then
450        bronann:SetMoving(false);
451        AudioManager:PlaySound("data/sounds/door_open2.wav");
452        EventManager:StartEvent("to Riverbank house");
453    end
454
455    if (to_secret_path_entrance_zone:IsCameraEntering() == true) then
456        bronann:SetMoving(false);
457        EventManager:StartEvent("to secret path entrance");
458    end
459
460    -- zone based story events
461    if (GlobalManager:GetGameEvents():DoesEventExist("layna_south_entrance", "quest1_orlinn_hide_n_seek1_done") == true
462        and GlobalManager:GetGameEvents():DoesEventExist("layna_riverbank", "quest1_orlinn_hide_n_seek3_done") == false) then
463        if (orlinn_hide_n_seek2_zone:IsCameraEntering() == true) then
464            -- Updates the story state
465            if (GlobalManager:GetGameEvents():DoesEventExist("layna_riverbank", "quest1_orlinn_hide_n_seek2_done") == false) then
466                GlobalManager:GetGameEvents():SetEventValue("layna_riverbank", "quest1_orlinn_hide_n_seek2_done", 1);
467
468                -- Orlinn speaks and flee
469                Map:PushState(vt_map.MapMode.STATE_SCENE);
470                orlinn:SetDirection(vt_map.MapMode.WEST);
471                EventManager:StartEvent("Quest1: Orlinn starts hide and seek3 speech");
472            end
473        end
474    end
475end
476
477-- Custom inner map functions
478function _SetLillyState()
479    local text = nil
480    local dialogue = nil
481
482    lilly:SetDirection(vt_map.MapMode.WEST);
483    lilly:ClearDialogueReferences();
484    if (GlobalManager:GetGameEvents():DoesEventExist("story", "kalya_has_joined") == true) then
485        -- Once they can go into the forest
486        dialogue = vt_map.SpriteDialogue.Create();
487        text = vt_system.Translate("We're counting on you.");
488        dialogue:AddLine(text, lilly);
489        lilly :AddDialogueReference(dialogue);
490    elseif (GlobalManager:GetGameEvents():DoesEventExist("story", "quest1_barley_meal_done") == true) then
491        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_lilly_go_home");
492        text = vt_system.Translate("You should go back home. Your mom must be waiting for you.");
493        dialogue:AddLine(text, lilly);
494        lilly :AddDialogueReference(dialogue);
495    elseif (GlobalManager:GetGameEvents():DoesEventExist("layna_center_shop", "quest1_flora_dialogue_done") == true) then
496        dialogue = vt_map.SpriteDialogue.Create();
497        text = vt_system.Translate("What a nice day, isn't it?");
498        dialogue:AddLine(text, lilly);
499        text = vt_system.Translate("Yes, Lilly. But I have something I have to ask you.");
500        dialogue:AddLine(text, bronann);
501        text = vt_system.Translate("Sure, just ask.");
502        dialogue:AddLine(text, lilly);
503        text = vt_system.Translate("Have you still got any barley meal left for my parents and I? My mother asked me to get some and I...");
504        dialogue:AddLine(text, bronann);
505        text = vt_system.Translate("Unfortunately, I gave it all to Kalya.");
506        dialogue:AddLine(text, lilly);
507        text = vt_system.Translate("What?!");
508        dialogue:AddLineEmote(text, bronann, "sweat drop");
509        text = vt_system.Translate("Ah hah! I just wanted to see your reaction. I still have some. Let me go grab it and bring it back to you.");
510        dialogue:AddLine(text, lilly);
511        dialogue:SetEventAtDialogueEnd("Quest1: Prepare Lilly for a walk")
512        lilly :AddDialogueReference(dialogue);
513    else
514        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_lilly_default");
515        text = vt_system.Translate("What a nice day, isn't it?");
516        dialogue:AddLine(text, lilly);
517        lilly :AddDialogueReference(dialogue);
518    end
519end
520
521function _SetOrlinnState()
522    local text = nil
523    local dialogue = nil
524
525    orlinn_dialogue_npc:ClearDialogueReferences();
526    orlinn:ClearDialogueReferences();
527
528    if (GlobalManager:GetGameEvents():DoesEventExist("layna_riverbank", "quest1_orlinn_hide_n_seek3_done") == true) then
529        orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
530        orlinn:SetVisible(false);
531        return;
532    elseif (GlobalManager:GetGameEvents():DoesEventExist("layna_riverbank", "quest1_orlinn_hide_n_seek2_done") == true) then
533        orlinn:SetPosition(74, 44);
534        orlinn:SetDirection(vt_map.MapMode.WEST);
535
536        -- Final hide and seek dialogue
537        dialogue = vt_map.SpriteDialogue.Create();
538        text = vt_system.Translate("You'll never get me!");
539        dialogue:AddLineEvent(text, orlinn, "", "Quest1: Hide and Seek3: Orlinn starts to go away");
540        orlinn:AddDialogueReference(dialogue);
541
542        EventManager:StartEvent("Quest1: Hide and Seek3: Orlinn goes top-right", 8000);
543        return;
544    elseif (GlobalManager:GetGameEvents():DoesEventExist("layna_south_entrance", "quest1_orlinn_hide_n_seek1_done") == true) then
545        -- Orlinn is on the cliff and is mocking Bronann.
546        dialogue = vt_map.SpriteDialogue.Create();
547        text = vt_system.Translate("Hee hee hee!");
548        dialogue:AddLineEvent(text, orlinn_dialogue_npc, "Orlinn laughs", "");
549        text = vt_system.Translate("Orlinn, how did you get there?");
550        dialogue:AddLine(text, bronann);
551        text = vt_system.Translate("(giggle) I won't tell you!");
552        dialogue:AddLineEvent(text, orlinn_dialogue_npc, "Orlinn laughs", "");
553        orlinn_dialogue_npc:AddDialogueReference(dialogue);
554        return;
555    end
556
557    -- Orlinn default behaviour
558    orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
559    orlinn:SetVisible(false);
560end
561
562-- Map Custom functions
563map_functions = {
564    Map_PopState = function()
565        Map:PopState();
566    end,
567
568    MakeInvisible = function(sprite)
569        if (sprite ~= nil) then
570            sprite:SetVisible(false);
571            sprite:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
572        end
573    end,
574
575    orlinn_laughs = function()
576        orlinn:SetCustomAnimation("laughing", 1000);
577    end,
578
579    Prepare_orlinn_kalya_scene = function()
580        Map:PushState(vt_map.MapMode.STATE_SCENE);
581        -- Prepare Kalya
582        kalya:SetPosition(78, 25);
583        kalya:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
584        kalya:SetVisible(true);
585
586        -- Stop Orlinn event loop and prepare him for the next events
587        orlinn:SetMoving(false); -- in case he's moving
588        orlinn:SetDirection(vt_map.MapMode.NORTH);
589        orlinn:SetMovementSpeed(vt_map.MapMode.NORMAL_SPEED);
590        orlinn:ClearDialogueReferences();
591        EventManager:EndAllEvents(orlinn);
592    end,
593
594    Set_Hide_And_Seek3_Done = function()
595        GlobalManager:GetGameEvents():SetEventValue("layna_riverbank", "quest1_orlinn_hide_n_seek3_done", 1);
596
597        -- Also reset Lilly direction
598        lilly:SetDirection(vt_map.MapMode.WEST);
599    end,
600
601    Prepare_lilly_walk = function()
602        Map:PushState(vt_map.MapMode.STATE_SCENE);
603        -- Stop Lilly dialogue and prepare her for the next events
604        lilly:SetMoving(false); -- in case he's moving
605        lilly:ClearDialogueReferences();
606        EventManager:EndAllEvents(lilly);
607    end,
608
609    GiveBarleyMeal = function()
610        GlobalManager:GetGameEvents():SetEventValue("story", "quest1_barley_meal_done", 1);
611    end,
612
613    Reset_lilly_dialogue = function()
614        _SetLillyState();
615    end
616}
617