1-- Set the namespace according to the map name.
2local ns = {};
3setmetatable(ns, {__index = _G});
4layna_village_center_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 = "Village center"
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
19local Effects = nil
20
21local bronann = nil
22local kalya = nil
23
24-- Main npcs
25local orlinn = nil
26local georges = nil
27local carson = nil
28local herth = nil
29local olivia = nil -- Olivia npc, guarding the forest entrance
30
31local well_entrance_rock = nil
32
33-- the main map loading code
34function Load(m)
35
36    Map = m;
37    Effects = Map:GetEffectSupervisor();
38    EventManager = Map:GetEventSupervisor();
39
40    Map:SetUnlimitedStamina(true);
41
42    _CreateCharacters();
43    -- Set the camera focus on Bronann
44    Map:SetCamera(bronann);
45
46    _CreateNPCs();
47    _CreateObjects();
48
49    _CreateEvents();
50    _CreateZones();
51
52    _TriggerPotentialDialogueAfterFadeIn();
53
54    -- Add clouds overlay
55    Effects:EnableAmbientOverlay("data/visuals/ambient/clouds.png", 5.0, -5.0, true);
56
57    -- Set the world map current position
58    GlobalManager:GetWorldMapData():SetCurrentLocationId("layna village")
59
60    _HandleCredits();
61end
62
63-- Handle the display of the new game credits
64function _HandleCredits()
65    -- Handle small credits triggering
66    if (GlobalManager:GetGameEvents():DoesEventExist("game", "Start_Credits") == false) then
67        -- Triggers the small credits display
68        GlobalManager:GetGameEvents():SetEventValue("game", "Start_Credits", 1);
69    end
70    if (GlobalManager:GetGameEvents():DoesEventExist("game", "Credits_shown") == false) then
71        Map:GetScriptSupervisor():AddScript("data/credits/episode1_credits.lua");
72    end
73end
74
75function Update()
76    -- Check whether the character is in one of the zones
77    _CheckZones();
78end
79
80-- Character creation
81function _CreateCharacters()
82    bronann = CreateSprite(Map, "Bronann", 12, 63, vt_map.MapMode.GROUND_OBJECT);
83    bronann:SetDirection(vt_map.MapMode.SOUTH);
84    bronann:SetMovementSpeed(vt_map.MapMode.NORMAL_SPEED);
85
86    -- set up the position according to the previous map
87    if (GlobalManager:GetMapData():GetPreviousLocation() == "from_riverbank") then
88        bronann:SetPosition(30, 77);
89        bronann:SetDirection(vt_map.MapMode.NORTH);
90    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_village_south") then
91        bronann:SetPosition(79, 77);
92        bronann:SetDirection(vt_map.MapMode.NORTH);
93    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_kalya_house_path") then
94        bronann:SetPosition(3, 11);
95        bronann:SetDirection(vt_map.MapMode.EAST);
96    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_shop") then
97        bronann:SetPosition(94, 72);
98        bronann:SetDirection(vt_map.MapMode.SOUTH);
99        AudioManager:PlaySound("data/sounds/door_close.wav");
100    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_secret_path") then
101        bronann:SetPosition(3, 60);
102        bronann:SetDirection(vt_map.MapMode.EAST);
103    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from sophia's house") then
104        AudioManager:PlaySound("data/sounds/door_close.wav");
105        bronann:SetPosition(22, 20);
106        bronann:SetDirection(vt_map.MapMode.NORTH);
107    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_layna_forest_entrance") then
108        bronann:SetPosition(115, 37);
109        bronann:SetDirection(vt_map.MapMode.WEST);
110    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_bronanns_home") then
111        AudioManager:PlaySound("data/sounds/door_close.wav");
112    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_well_undergrounds") then
113        bronann:SetPosition(63, 27.5);
114        bronann:SetDirection(vt_map.MapMode.NORTH);
115    end
116end
117
118function _CreateNPCs()
119    local npc = nil
120    local text = nil
121    local dialogue = nil
122    local event = nil
123
124    kalya = CreateSprite(Map, "Kalya", 42, 18, vt_map.MapMode.GROUND_OBJECT);
125
126    event = vt_map.RandomMoveSpriteEvent.Create("Kalya random move", kalya, 1000, 2000);
127    event:AddEventLinkAtEnd("Kalya random move", 2000); -- Loop on itself
128
129    EventManager:StartEvent("Kalya random move");
130    dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_kalya_wants_to_be_alone");
131    text = vt_system.Translate("Do you need something, Bronann?");
132    dialogue:AddLineEmote(text, kalya, "interrogation");
133    kalya:AddDialogueReference(dialogue);
134
135    orlinn = CreateSprite(Map, "Orlinn", 40, 18, vt_map.MapMode.GROUND_OBJECT);
136    orlinn:SetCollisionMask(vt_map.MapMode.WALL_COLLISION);
137
138    -- Setup Orlinn's state and dialogue depending on the story current context
139    _UpdateOrlinnAndKalyaState();
140
141    carson = CreateSprite(Map, "Carson", 0, 0, vt_map.MapMode.GROUND_OBJECT);
142    -- Default behaviour - not present on map.
143    carson:SetVisible(false);
144    carson:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
145
146    herth = CreateSprite(Map, "Herth", 0, 0, vt_map.MapMode.GROUND_OBJECT);
147    -- Default behaviour - not present on map.
148    herth:SetVisible(false);
149    herth:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
150
151    npc = CreateNPCSprite(Map, "Old Woman1", vt_system.Translate("Brymir"), 72, 64, vt_map.MapMode.GROUND_OBJECT);
152    npc:SetDirection(vt_map.MapMode.WEST);
153    dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_brymir_gossip");
154    text = vt_system.Translate("Ahh sure! (gossip, gossip)");
155    dialogue:AddLine(text, npc);
156    npc:AddDialogueReference(dialogue);
157
158    npc = CreateNPCSprite(Map, "Woman1", vt_system.Translate("Martha"), 70, 64, vt_map.MapMode.GROUND_OBJECT);
159    npc:SetDirection(vt_map.MapMode.EAST);
160    dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_martha_gossip");
161    text = vt_system.Translate("Did you hear that? (gossip, gossip)");
162    dialogue:AddLine(text, npc);
163    npc:AddDialogueReference(dialogue);
164
165    npc = CreateNPCSprite(Map, "Woman2", vt_system.Translate("Sophia"), 22, 38, vt_map.MapMode.GROUND_OBJECT);
166    npc:SetDirection(vt_map.MapMode.SOUTH);
167    if (GlobalManager:GetGameEvents():DoesEventExist("layna_south_entrance", "quest1_orlinn_hide_n_seek1_done") == true and
168            GlobalManager:GetGameEvents():DoesEventExist("layna_riverbank", "quest1_orlinn_hide_n_seek2_done") == false) then
169        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_sophia_hint_about_orlinn");
170        text = vt_system.Translate("If you're running after Orlinn, I just saw him near your house.")
171        dialogue:AddLine(text, npc)
172    else
173        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_sophia_no_trade");
174        text = vt_system.Translate("Do you want to trade with me?")
175        dialogue:AddLine(text, npc)
176        dialogue:SetEventAtDialogueEnd("layna: Sophia trades")
177
178        event = vt_map.ShopEvent.Create("layna: Sophia trades", "Layna Sophia Trades");
179        event:SetShopName(vt_system.UTranslate("Sophia"));
180
181        -- Items
182        event:AddItem(4001, 0);   -- (infinite) Escape Smoke
183        -- Trades
184        event:AddTrade(10002, 1); -- Improved Wooden Sword
185        event:AddTrade(11002, 1); -- Improved Arbalest
186        event:AddTrade(40001, 2); -- Prismatic Rings for both
187
188        event:SetPriceLevels(vt_shop.ShopMode.SHOP_PRICE_VERY_GOOD, -- Sophia is a good friend
189                             vt_shop.ShopMode.SHOP_PRICE_STANDARD);
190    end
191
192    npc:AddDialogueReference(dialogue);
193    -- Add her cat, Nekko
194    object = CreateObject(Map, "Cat1", 24, 37.6, vt_map.MapMode.GROUND_OBJECT);
195    vt_map.SoundEvent.Create("Nekko says Meoww!", "data/sounds/meow.wav");
196    object:SetEventWhenTalking("Nekko says Meoww!");
197
198    georges = CreateNPCSprite(Map, "Man1", vt_system.Translate("Georges"), 42.5, 65, vt_map.MapMode.GROUND_OBJECT);
199    georges:SetDirection(vt_map.MapMode.WEST);
200    _UpdateGeorgesDialogue(georges);
201
202    -- Olivia, guardian of the forest access
203    olivia = CreateNPCSprite(Map, "Girl1", vt_system.Translate("Olivia"), 115, 36, vt_map.MapMode.GROUND_OBJECT)
204    olivia:SetDirection(vt_map.MapMode.SOUTH)
205    olivia:SetMovementSpeed(vt_map.MapMode.NORMAL_SPEED)
206
207    -- Needed look at events
208    vt_map.LookAtSpriteEvent.Create("Bronann looks at Olivia", bronann, olivia);
209    vt_map.ChangeDirectionSpriteEvent.Create("Bronann looks south", bronann, vt_map.MapMode.SOUTH);
210
211end
212
213function _CreateObjects()
214    local object = nil
215
216    -- Info sign
217    object = CreateObject(Map, "Wood sign info", 29, 68, vt_map.MapMode.GROUND_OBJECT)
218    object:SetEventWhenTalking("Info about running")
219    dialogue = vt_map.SpriteDialogue.Create();
220    text = vt_system.VTranslate("Tired of walking?\nYou can run when holding the Cancel (%s) key", InputManager:GetCancelKeyName());
221    dialogue:AddLine(text, nil);
222    event = vt_map.DialogueEvent.Create("Info about running", dialogue)
223
224    CreateObject(Map, "Tree Big2", 22, 78, vt_map.MapMode.GROUND_OBJECT);
225    CreateObject(Map, "Tree Small1", 22, 16, vt_map.MapMode.GROUND_OBJECT);
226    CreateObject(Map, "Tree Big1", 9, 16, vt_map.MapMode.GROUND_OBJECT);
227    CreateObject(Map, "Tree Big1", 65, 18, vt_map.MapMode.GROUND_OBJECT);
228    CreateObject(Map, "Tree Big2", 74, 20, vt_map.MapMode.GROUND_OBJECT);
229    CreateObject(Map, "Tree Big1", 67, 32, vt_map.MapMode.GROUND_OBJECT);
230    CreateObject(Map, "Tree Big2", 80, 36, vt_map.MapMode.GROUND_OBJECT);
231    CreateObject(Map, "Tree Small1", 92, 22, vt_map.MapMode.GROUND_OBJECT);
232    CreateObject(Map, "Tree Big2", 98, 24, vt_map.MapMode.GROUND_OBJECT);
233    CreateObject(Map, "Tree Small2", 79, 16, vt_map.MapMode.GROUND_OBJECT);
234    CreateObject(Map, "Rock1", 3, 64, vt_map.MapMode.GROUND_OBJECT);
235    CreateObject(Map, "Rock2", 2, 62, vt_map.MapMode.GROUND_OBJECT);
236    CreateObject(Map, "Rock1", 33, 12, vt_map.MapMode.GROUND_OBJECT);
237    CreateObject(Map, "Rock2", 29, 16, vt_map.MapMode.GROUND_OBJECT);
238    CreateObject(Map, "Rock2", 109, 34, vt_map.MapMode.GROUND_OBJECT);
239    CreateObject(Map, "Rock2", 113, 34, vt_map.MapMode.GROUND_OBJECT);
240    CreateObject(Map, "Rock2", 117, 34, vt_map.MapMode.GROUND_OBJECT);
241    CreateObject(Map, "Rock2", 109, 42, vt_map.MapMode.GROUND_OBJECT);
242    CreateObject(Map, "Rock2", 117, 42, vt_map.MapMode.GROUND_OBJECT);
243    CreateObject(Map, "Rock2", 113, 42, vt_map.MapMode.GROUND_OBJECT);
244
245    -- A village with drinkable water
246    CreateObject(Map, "Well", 59.0, 32.0, vt_map.MapMode.GROUND_OBJECT);
247
248    -- collision bug hidders
249    CreateObject(Map, "Barrel1", 14, 38, vt_map.MapMode.GROUND_OBJECT);
250    CreateObject(Map, "Vase1", 15, 39, vt_map.MapMode.GROUND_OBJECT);
251    CreateObject(Map, "Barrel1", 30, 38, vt_map.MapMode.GROUND_OBJECT);
252
253    -- Lights
254    -- big round windows light flares
255    vt_map.Light.Create("data/visuals/lights/sun_flare_light_main.lua",
256                        "data/visuals/lights/sun_flare_light_secondary.lua",
257                        74.0, 55.0,
258                        vt_video.Color(1.0, 1.0, 1.0, 0.6),
259                        vt_video.Color(1.0, 1.0, 0.85, 0.3));
260
261    vt_map.Light.Create("data/visuals/lights/sun_flare_light_main.lua",
262                        "data/visuals/lights/sun_flare_light_secondary.lua",
263                        86.0, 67.0,
264                        vt_video.Color(1.0, 1.0, 1.0, 0.6),
265                        vt_video.Color(1.0, 1.0, 0.85, 0.3));
266    vt_map.Light.Create("data/visuals/lights/sun_flare_light_main.lua",
267                        "data/visuals/lights/sun_flare_light_secondary.lua",
268                        22.0, 32.0,
269                        vt_video.Color(1.0, 1.0, 1.0, 0.6),
270                        vt_video.Color(1.0, 1.0, 0.85, 0.3));
271
272    -- Small door lights
273    vt_map.Light.Create("data/visuals/lights/sun_flare_light_small_main.lua",
274                        "data/visuals/lights/sun_flare_light_small_secondary.lua",
275                        12.0, 57.5,
276                        vt_video.Color(1.0, 1.0, 1.0, 0.6),
277                        vt_video.Color(1.0, 1.0, 0.85, 0.3));
278    vt_map.Light.Create("data/visuals/lights/sun_flare_light_small_main.lua",
279                        "data/visuals/lights/sun_flare_light_small_secondary.lua",
280                        94.0, 67.5,
281                        vt_video.Color(1.0, 1.0, 1.0, 0.6),
282                        vt_video.Color(1.0, 1.0, 0.85, 0.3));
283
284    -- Treasure vase
285    local nekko_vase = CreateTreasure(Map, "layna_center_nekko_vase", "Vase1", 27, 37, vt_map.MapMode.GROUND_OBJECT);
286    nekko_vase:AddItem(11, 1);
287
288    -- Rock hiding the well underground entrance
289    well_entrance_rock = CreateObject(Map, "Rock1", 63, 32, vt_map.MapMode.GROUND_OBJECT)
290    if (GlobalManager:GetGameEvents():DoesEventExist("story", "well_rats_beaten") == true) then
291        -- The rock has moved
292        well_entrance_rock:SetPosition(63, 34)
293    end
294
295    -- Surrounding grass
296    local well_grass = {
297    { "Grass Clump1", 62, 32.5 },
298    { "Grass Clump1", 64, 33 },
299    { "Grass Clump1", 58, 33 },
300    { "Grass Clump1", 60, 33.4 },
301    { "Grass Clump1", 65, 32 },
302    { "Grass Clump1", 62, 30.3 },
303    }
304
305    -- Loads the grass according to the array
306    for my_index, my_array in pairs(well_grass) do
307        --print(my_array[1], my_array[2], my_array[3]);
308        object = CreateObject(Map, my_array[1], my_array[2], my_array[3], vt_map.MapMode.GROUND_OBJECT);
309        object:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
310    end
311end
312
313-- Creates all events and sets up the entire event sequence chain
314function _CreateEvents()
315    local event = nil
316    local text = nil
317    local dialogue = nil
318
319    -- Triggered Events
320    vt_map.MapTransitionEvent.Create("to Bronann's home", "data/story/layna_village/layna_village_bronanns_home_map.lua",
321                                     "data/story/layna_village/layna_village_bronanns_home_script.lua", "from_village_center");
322
323    vt_map.MapTransitionEvent.Create("to Riverbank", "data/story/layna_village/layna_village_riverbank_map.lua",
324                                     "data/story/layna_village/layna_village_riverbank_script.lua", "from_village_center");
325
326    vt_map.MapTransitionEvent.Create("to Village south entrance", "data/story/layna_village/layna_village_south_entrance_map.lua",
327                                     "data/story/layna_village/layna_village_south_entrance_script.lua", "from_village_center");
328
329    vt_map.MapTransitionEvent.Create("to Kalya house path", "data/story/layna_village/layna_village_kalya_house_path_map.lua",
330                                     "data/story/layna_village/layna_village_kalya_house_path_script.lua", "from_village_center");
331
332    vt_map.MapTransitionEvent.Create("to Flora's Shop", "data/story/layna_village/layna_village_center_shop_map.lua",
333                                     "data/story/layna_village/layna_village_center_shop_script.lua", "from_village_center");
334
335    vt_map.MapTransitionEvent.Create("to sophia house", "data/story/layna_village/layna_village_center_sophia_house_map.lua",
336                                     "data/story/layna_village/layna_village_center_sophia_house_script.lua", "from_village_center");
337
338    vt_map.MapTransitionEvent.Create("to secret cliff", "data/story/layna_village/layna_village_riverbank_map.lua",
339                                     "data/story/layna_village/layna_village_riverbank_script.lua", "from_secret_path");
340
341    vt_map.MapTransitionEvent.Create("to layna forest entrance", "data/story/layna_forest/layna_forest_entrance_map.lua",
342                                     "data/story/layna_forest/layna_forest_entrance_script.lua", "from_village_center")
343
344    event = vt_map.MapTransitionEvent.Create("To well underground", "data/story/layna_village/layna_village_well_underground_map.lua",
345        "data/story/layna_village/layna_village_well_underground_script.lua",
346        "from layna village")
347
348    -- Generic events
349    vt_map.ScriptedEvent.Create("Map:PushState(SCENE)", "Map_SceneState", "")
350    vt_map.ScriptedEvent.Create("Map:PopState()", "Map_PopState", "")
351
352    vt_map.ChangeDirectionSpriteEvent.Create("Kalya looks south", kalya, vt_map.MapMode.SOUTH)
353    vt_map.LookAtSpriteEvent.Create("Orlinn looks at Kalya", orlinn, kalya)
354    vt_map.LookAtSpriteEvent.Create("Orlinn looks at Bronann", orlinn, bronann)
355    vt_map.LookAtSpriteEvent.Create("Kalya looks at Orlinn", kalya, orlinn)
356    vt_map.AnimateSpriteEvent.Create("Bronann is sad", bronann, "hero_stance", 1000)
357    vt_map.AnimateSpriteEvent.Create("Bronann is frightened", bronann, "frightened", 600)
358
359    -- Init Olivia Dialogue
360    _UpdateOliviaDialogue();
361
362    -- Quest events
363    -- Bronann wonders where he can find barley meal
364    event = vt_map.ScriptedEvent.Create("Quest1: Bronann wonders where he can find some barley meal", "Map_SceneState", "");
365    event:AddEventLinkAtEnd("Quest1: Bronann wants to see Flora for the barley meal", 1000);
366
367    dialogue = vt_map.SpriteDialogue.Create();
368    text = vt_system.Translate("Hmm, I'll go to Flora's shop. I hope she'll help me.");
369    dialogue:AddLineEmote(text, bronann, "thinking dots");
370    event = vt_map.DialogueEvent.Create("Quest1: Bronann wants to see Flora for the barley meal", dialogue);
371    event:SetStopCameraMovement(true);
372    event:AddEventLinkAtEnd("Map:PopState()");
373
374    -- Georges
375    vt_map.ScriptedEvent.Create("Quest1: GeorgesDialogueDone", "Quest1GeorgesDialogueDone", "");
376
377    -- Orlinn
378    vt_map.ScriptedEvent.Create("Orlinn laughs", "orlinn_laughs", "");
379
380    event = vt_map.ScriptedEvent.Create("Quest1: Make Orlinn run and hide", "Quest1OrlinnRunAndHide", "");
381    event:AddEventLinkAtEnd("Quest1: Make Orlinn run");
382
383    event = vt_map.PathMoveSpriteEvent.Create("Quest1: Make Orlinn run", orlinn, 67, 79, true);
384    event:AddEventLinkAtEnd("Quest1: Make Orlinn disappear");
385
386    event = vt_map.ScriptedSpriteEvent.Create("Quest1: Make Orlinn disappear", orlinn, "MakeInvisible", "");
387    event:AddEventLinkAtEnd("Quest1: Make Orlinn run event end");
388
389    vt_map.ScriptedSpriteEvent.Create("Quest1: Make Orlinn run event end", orlinn, "orlinn_run_event_end", "");
390
391    -- Kalya calls for Orlinn
392    event = vt_map.ScriptedEvent.Create("Kalya brings back Orlinn event start", "kalya_brings_orlinn_back_start", "");
393    event:AddEventLinkAtEnd("Kalya tells Bronann to follow her");
394
395    dialogue = vt_map.SpriteDialogue.Create();
396    text = vt_system.Translate("As you wish. Follow me.");
397    dialogue:AddLine(text, kalya);
398    event = vt_map.DialogueEvent.Create("Kalya tells Bronann to follow her", dialogue);
399    event:AddEventLinkAtEnd("Kalya goes at the center of village");
400    event:AddEventLinkAtEnd("Bronann follows Kalya at the center of the village", 1000);
401
402    event = vt_map.PathMoveSpriteEvent.Create("Kalya goes at the center of village", kalya, 52, 47, true);
403    event:AddEventLinkAtEnd("Kalya looks south");
404    event:AddEventLinkAtEnd("Kalya tells Orlinn to come");
405
406    event = vt_map.PathMoveSpriteEvent.Create("Bronann follows Kalya at the center of the village", bronann, 48, 47, true);
407    event:AddEventLinkAtEnd("Bronann looks south");
408
409    dialogue = vt_map.SpriteDialogue.Create();
410    text = vt_system.Translate("ORLINN! Come here, NOW!");
411    dialogue:AddLine(text, kalya);
412    event = vt_map.DialogueEvent.Create("Kalya tells Orlinn to come", dialogue);
413    event:AddEventLinkAtEnd("Orlinn comes near Kalya");
414
415    event = vt_map.PathMoveSpriteEvent.Create("Orlinn comes near Kalya", orlinn, 52, 50, true);
416    event:AddEventLinkAtEnd("Orlinn looks at Kalya");
417    event:AddEventLinkAtEnd("Kalya tells Orlinn to give the pen");
418
419    dialogue = vt_map.SpriteDialogue.Create();
420    text = vt_system.Translate("Orlinn, give back the pen to Bronann or I shall sma...");
421    dialogue:AddLineEmote(text, kalya, "exclamation");
422    text = vt_system.Translate("Yea, yes, here it is.");
423    dialogue:AddLineEmote(text, orlinn, "exclamation");
424    event = vt_map.DialogueEvent.Create("Kalya tells Orlinn to give the pen", dialogue);
425    event:AddEventLinkAtEnd("Orlinn comes near Bronann");
426
427    event = vt_map.PathMoveSpriteEvent.Create("Orlinn comes near Bronann", orlinn, 48, 50, false);
428    event:AddEventLinkAtEnd("Orlinn looks at Bronann");
429    event:AddEventLinkAtEnd("Kalya looks at Orlinn");
430    event:AddEventLinkAtEnd("Orlinn gives the pen to Bronann");
431
432    event = vt_map.TreasureEvent.Create("Orlinn gives the pen to Bronann");
433    event:AddItem(70001, 1); -- The ink key item
434    event:AddEventLinkAtEnd("Orlinn apologizes");
435
436    dialogue = vt_map.SpriteDialogue.Create();
437    text = vt_system.Translate("I found that pen under a tree near the river. I just wanted to play.");
438    dialogue:AddLineEmote(text, orlinn, "sweat drop");
439    text = vt_system.Translate("Don't worry about it.");
440    dialogue:AddLine(text, bronann);
441    event = vt_map.DialogueEvent.Create("Orlinn apologizes", dialogue);
442    event:AddEventLinkAtEnd("Orlinn comes back event end");
443
444    vt_map.ScriptedEvent.Create("Orlinn comes back event end", "orlinn_comes_back_event_end", "");
445
446    -- Georges event
447    vt_map.ScriptedEvent.Create("Quest1: Georges thanks Bronann", "Quest1GeorgesTellsBronannAboutLilly", "");
448
449    -- Quest 2: The forest event
450    event = vt_map.ScriptedEvent.Create("Quest2: Forest event", "Prepare_forest_event", "");
451    event:AddEventLinkAtEnd("Quest2: Forest event - light", 1200);
452
453    event = vt_map.ScriptedEvent.Create("Quest2: Forest event - light", "BrightLightStart", "BrightLightUpdate");
454    event:AddEventLinkAtEnd("Bronann moves out of the door")
455
456    event = vt_map.PathMoveSpriteEvent.Create("Bronann moves out of the door", bronann, 12, 66, false)
457    event:AddEventLinkAtEnd("Bronann searches")
458
459    vt_map.AnimateSpriteEvent.Create("Bronann searches", bronann, "searching", 1000)
460    event:AddEventLinkAtEnd("Quest2: Bronann wonders what was that", 500)
461
462    dialogue = vt_map.SpriteDialogue.Create();
463    text = vt_system.Translate("What was this?");
464    dialogue:AddLineEmote(text, bronann, "interrogation");
465    text = vt_system.Translate("Bronann! Wait!");
466    dialogue:AddLine(text, carson);
467    event = vt_map.DialogueEvent.Create("Quest2: Bronann wonders what was that", dialogue);
468    event:SetStopCameraMovement(true);
469    event:AddEventLinkAtEnd("Make Carson Visible")
470    event:AddEventLinkAtEnd("Quest2: Carson moves to Bronann", 100)
471    event:AddEventLinkAtEnd("Quest2: Bronann looks at his father", 100)
472
473    vt_map.ScriptedEvent.Create("Make Carson Visible", "set_carson_visible", "")
474
475    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Carson moves to Bronann", carson, 12, 63, false);
476    event:AddEventLinkAtEnd("Quest2: Carson starts to talk to Bronann");
477
478    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Bronann looks at his father", bronann, vt_map.MapMode.NORTH)
479    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Bronann looks at Herth", bronann, vt_map.MapMode.EAST)
480    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Herth looks at Carson", herth, vt_map.MapMode.WEST)
481    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Herth looks at Kalya", herth, vt_map.MapMode.EAST)
482    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Carson looks at Herth", carson, vt_map.MapMode.SOUTH)
483    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Carson looks at Kalya", carson, vt_map.MapMode.SOUTH)
484    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Carson looks at Bronann", carson, vt_map.MapMode.SOUTH)
485    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Kalya looks at Carson", kalya, vt_map.MapMode.NORTH)
486    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Kalya looks at Bronann", kalya, vt_map.MapMode.WEST)
487
488    dialogue = vt_map.SpriteDialogue.Create();
489    text = vt_system.Translate("Bronann, there is something that I have to tell you. We've been fearing for this moment, your mother and I.");
490    dialogue:AddLine(text, carson);
491    text = vt_system.Translate("They're coming!");
492    dialogue:AddLineEvent(text, herth, "Quest2: Bronann looks at Herth", "Quest2: Carson looks at Herth")
493    event = vt_map.DialogueEvent.Create("Quest2: Carson starts to talk to Bronann", dialogue);
494    event:SetStopCameraMovement(true);
495    event:AddEventLinkAtEnd("Quest2: Herth moves to Carson");
496
497    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Herth moves to Carson", herth, 17, 71, false);
498    event:AddEventLinkAtEnd("Quest2: Herth looks at Carson");
499    event:AddEventLinkAtEnd("Quest2: Second part of talk");
500
501    dialogue = vt_map.SpriteDialogue.Create();
502    text = vt_system.Translate("Carson, they've crossed the river. They shall be here in no time.");
503    dialogue:AddLine(text, herth);
504    text = vt_system.Translate("...");
505    dialogue:AddLineEmote(text, carson, "sweat drop");
506    text = vt_system.Translate("Huh? Hey, what's happening here?!");
507    dialogue:AddLineEventEmote(text, bronann, "", "Quest2: Carson looks at Bronann", "exclamation");
508    text = vt_system.Translate("Bronann, I...");
509    dialogue:AddLine(text, carson);
510    text = vt_system.Translate("Herth!");
511    dialogue:AddLineEvent(text, kalya, "", "Quest2: Herth looks at Kalya");
512    event = vt_map.DialogueEvent.Create("Quest2: Second part of talk", dialogue);
513    event:SetStopCameraMovement(true);
514    event:AddEventLinkAtEnd("Quest2: Kalya runs to her father");
515
516    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Kalya runs to her father", kalya, 21, 71, true);
517    event:AddEventLinkAtEnd("Quest2: Third part of talk");
518
519    dialogue = vt_map.SpriteDialogue.Create();
520    text = vt_system.Translate("Herth! Orlinn has disappeared. I saw him taking the forest pathway!");
521    dialogue:AddLineEvent(text, kalya, "", "Quest2: Carson looks at Herth");
522    text = vt_system.Translate("Kalya, you were supposed to keep an eye on him!");
523    dialogue:AddLineEmote(text, herth, "exclamation");
524    text = vt_system.Translate("I did, but he just slipped through my fingers at the very second that strange light appeared.");
525    dialogue:AddLineEmote(text, kalya, "sweat drop");
526    text = vt_system.Translate("Kalya, the army is coming. I'll deal with them. You go and find Orlinn as fast as possible.");
527    dialogue:AddLineEmote(text, herth, "thinking dots");
528    text = vt_system.Translate("But you might get hurt!");
529    dialogue:AddLineEmote(text, kalya, "exclamation");
530    text = vt_system.Translate("Don't worry. We'll simply talk to them and they'll move on. You know what you have to do, right?");
531    dialogue:AddLine(text, herth);
532    text = vt_system.Translate("Herth, we both know it'll likely...");
533    dialogue:AddLine(text, kalya);
534    text = vt_system.Translate("Do as I say and it'll be alright.");
535    dialogue:AddLine(text, herth);
536    text = vt_system.Translate("But...");
537    dialogue:AddLineEvent(text, kalya, "", "Quest2: Carson looks at Bronann");
538    text = vt_system.Translate("Bronann, you should go with her.");
539    dialogue:AddLineEventEmote(text, carson, "Quest2: Bronann looks at his father", "Quest2: Kalya looks at Carson", "thinking dots");
540    text = vt_system.Translate("What?!");
541    dialogue:AddLineEmote(text, kalya, "exclamation");
542    text = vt_system.Translate("Huh?");
543    dialogue:AddLineEvent(text, bronann, "Bronann is frightened","");
544    text = vt_system.Translate("Carson is right, Kalya. Bronann shall go with you.");
545    dialogue:AddLineEvent(text, herth, "Quest2: Bronann looks at Herth", "Quest2: Kalya looks at Bronann");
546    text = vt_system.Translate("But he would just be a burden!");
547    dialogue:AddLineEvent(text, kalya, "", "Bronann is sad");
548    text = vt_system.Translate("Huh? Hey! But...");
549    dialogue:AddLineEmote(text, bronann, "exclamation");
550    text = vt_system.Translate("He won't slow you down, believe me. Right, Bronann?");
551    dialogue:AddLineEvent(text, carson, "", "Quest2: Carson looks at Bronann");
552    text = vt_system.Translate("But Herth!");
553    dialogue:AddLine(text, kalya);
554    text = vt_system.Translate("Carson is right, Kalya. Bronann shall go with you. It's an order.");
555    dialogue:AddLineEmote(text, herth, "thinking dots");
556    event = vt_map.DialogueEvent.Create("Quest2: Third part of talk", dialogue);
557    event:AddEventLinkAtEnd("Quest2: Kalya goes back and forth");
558
559    -- Small event chain making kalya go back and forth.
560    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Kalya goes back and forth", kalya, 19, 71, false);
561    event:AddEventLinkAtEnd("Quest2: Carson looks at Kalya");
562    event:AddEventLinkAtEnd("Quest2: Kalya goes back and forth 2");
563
564    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Kalya goes back and forth 2", kalya, 21, 71, false);
565    event:AddEventLinkAtEnd("Quest2: Kalya goes back and forth 3");
566
567    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Kalya goes back and forth 3", kalya, 19, 71, false);
568    event:AddEventLinkAtEnd("Quest2: Kalya goes back and forth 4");
569
570    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Kalya goes back and forth 4", kalya, 21, 71, false);
571    event:AddEventLinkAtEnd("Quest2: Fourth part of talk");
572
573    dialogue = vt_map.SpriteDialogue.Create();
574    text = vt_system.Translate("Gahh, ok.");
575    dialogue:AddLineEvent(text, kalya, "", "Quest2: Carson looks at Bronann");
576    text = vt_system.Translate("Now go, my son. I'll explain it to you once it is all finished. I trust you will succeed.");
577    dialogue:AddLineEvent(text, carson, "Quest2: Bronann looks at his father", "")
578    event = vt_map.DialogueEvent.Create("Quest2: Fourth part of talk", dialogue);
579    event:AddEventLinkAtEnd("Quest2: Fifth part of talk");
580
581    dialogue = vt_map.SpriteDialogue.Create();
582    text = vt_system.Translate("Thanks dad, we'll find him in no time.");
583    dialogue:AddLine(text, bronann);
584    text = vt_system.Translate("We shall go now. Good luck, both of you.");
585    dialogue:AddLineEvent(text, herth, "Quest2: Bronann looks at Herth", "Quest2: Herth looks at Kalya");
586    event = vt_map.DialogueEvent.Create("Quest2: Fifth part of talk", dialogue);
587    event:AddEventLinkAtEnd("Quest2: Herth leaves to south");
588    event:AddEventLinkAtEnd("Quest2: Carson starts to leave to south");
589
590    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Herth leaves to south", herth, 26, 78, false);
591    event:AddEventLinkAtEnd("Quest2: Herth disappears");
592
593    vt_map.ScriptedSpriteEvent.Create("Quest2: Herth disappears", herth, "MakeInvisible", "");
594
595    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Carson starts to leave to south", carson, 26, 74, false);
596    event:AddEventLinkAtEnd("Quest2: Carson talks to Bronann once last time");
597    event:AddEventLinkAtEnd("Quest2: Carson looks at Bronann from south");
598
599    vt_map.ChangeDirectionSpriteEvent.Create("Quest2: Carson looks at Bronann from south", carson, vt_map.MapMode.NORTH);
600
601    dialogue = vt_map.SpriteDialogue.Create();
602    text = vt_system.Translate("Good luck, son.");
603    dialogue:AddLine(text, carson);
604    event = vt_map.DialogueEvent.Create("Quest2: Carson talks to Bronann once last time", dialogue);
605    event:AddEventLinkAtEnd("Quest2: Carson leaves to south");
606
607    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Carson leaves to south", carson, 26, 78, false);
608    event:AddEventLinkAtEnd("Quest2: Carson disappears");
609
610    event = vt_map.ScriptedSpriteEvent.Create("Quest2: Carson disappears", carson, "MakeInvisible", "");
611    event:AddEventLinkAtEnd("Quest2: End part of talk", 1000);
612
613    dialogue = vt_map.SpriteDialogue.Create();
614    text = vt_system.Translate("Ok, we'll go together. But slow me down and I'll make you regret it.");
615    dialogue:AddLineEvent(text, kalya, "Quest2: Kalya looks at Bronann", "");
616    text = vt_system.Translate("Don't worry, we'll find him. Ok?");
617    dialogue:AddLine(text, bronann);
618    text = vt_system.Translate("Ok.");
619    dialogue:AddLine(text, kalya);
620    event = vt_map.DialogueEvent.Create("Quest2: End part of talk", dialogue);
621    event:AddEventLinkAtEnd("Quest2: Kalya joins Bronann's party");
622
623    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Kalya joins Bronann's party", kalya, 12, 66, false);
624    event:AddEventLinkAtEnd("Quest2: Kalya disappears");
625    event:AddEventLinkAtEnd("Quest2: Add Kalya to the party");
626
627    vt_map.ScriptedSpriteEvent.Create("Quest2: Kalya disappears", kalya, "MakeInvisible", "");
628
629    vt_map.ScriptedEvent.Create("Quest2: Add Kalya to the party", "Add_kalya_to_party", "");
630    event:AddEventLinkAtEnd("Quest2: Kalya joins speech");
631
632    dialogue = vt_map.SpriteDialogue.Create();
633    text = vt_system.Translate("Kalya joins your party!");
634    dialogue:AddLine(text, kalya); --used for now to show her portrait
635    event = vt_map.DialogueEvent.Create("Quest2: Kalya joins speech", dialogue);
636    event:AddEventLinkAtEnd("Map:PopState()");
637
638    -- Kalya explains Bronann about dungeons and equipment,
639    event = vt_map.ScriptedEvent.Create("Quest2: Kalya's equipment and dungeons speech start", "Quest2_equip_speech_start", "");
640    event:AddEventLinkAtEnd("Quest2: Kalya walks off from Bronann");
641    event:AddEventLinkAtEnd("Quest2: Bronann goes in front of Kalya");
642
643    vt_map.ChangeDirectionSpriteEvent.Create("Kalya looks east", kalya, vt_map.MapMode.EAST);
644    vt_map.ChangeDirectionSpriteEvent.Create("Bronann looks west", bronann, vt_map.MapMode.WEST);
645
646    vt_map.ScriptedSpriteEvent.Create("Turn Kalya's collisions on", kalya, "Sprite_Collision_on", "");
647
648    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Kalya walks off from Bronann", kalya, 114, 37, false);
649    event:AddEventLinkAtEnd("Kalya looks east");
650    event:AddEventLinkAtEnd("Turn Kalya's collisions on");
651    event:AddEventLinkAtEnd("Quest2: Kalya's speech about equipment and dungeons.");
652
653    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Bronann goes in front of Kalya", bronann, 116, 37, false);
654    event:AddEventLinkAtEnd("Bronann looks west");
655
656    dialogue = vt_map.SpriteDialogue.Create();
657    text = vt_system.Translate("By the way, have you ever prepared yourself for something like this before?");
658    dialogue:AddLine(text, kalya);
659    text = vt_system.Translate("Huh? Well, Orlinn doesn't disappear every day, you know?");
660    dialogue:AddLineEmote(text, bronann, "thinking dots");
661    text = vt_system.Translate("I see. Then there are two very important things that you need to know.");
662    dialogue:AddLine(text, kalya);
663    text = vt_system.Translate("First of all, before going there, you might need better equipment. You should visit Flora first, ok?");
664    dialogue:AddLine(text, kalya);
665    text = vt_system.VTranslate("And I hope that you have already equipped your sword. If you haven't, open your inventory by pressing the menu key (%s), and select 'Equip'. Then you'll be able to select your sword and add it as your main weapon.", InputManager:GetMenuKeyName());
666    dialogue:AddLine(text, kalya);
667    text = vt_system.Translate("You mean I need to push a key to open my bag?");
668    dialogue:AddLineEmote(text, bronann, "interrogation");
669    text = vt_system.Translate("Nevermind that, just do it.");
670    dialogue:AddLine(text, kalya);
671    text = vt_system.Translate("Also, the person in front of the battle line will lead the group in the forest. What I mean by that is the person on the top of the battle formation will actually appear while the others will stay hidden.");
672    dialogue:AddLine(text, kalya);
673    text = vt_system.Translate("Hmm, right. I'm not sure that I fully get what you mean, but...");
674    dialogue:AddLine(text, bronann);
675    text = vt_system.Translate("Rrrr, Bronann. Just listen.");
676    dialogue:AddLine(text, kalya);
677    text = vt_system.Translate("That will be the case only in certain areas. Here in the village, you'll be the one leading, or at least you may believe that.");
678    dialogue:AddLine(text, kalya);
679    event = vt_map.DialogueEvent.Create("Quest2: Kalya's speech about equipment and dungeons.", dialogue);
680    event:AddEventLinkAtEnd("Quest2: Kalya re-joins Bronann after speech");
681
682    event = vt_map.PathMoveSpriteEvent.Create("Quest2: Kalya re-joins Bronann after speech", kalya, 116, 37, false);
683    event:AddEventLinkAtEnd("Quest2: Kalya disappears after speech");
684
685    event = vt_map.ScriptedSpriteEvent.Create("Quest2: Kalya disappears after speech", kalya, "MakeInvisible", "");
686    event:AddEventLinkAtEnd("Map:PopState()");
687end
688
689-- zones
690local bronanns_home_entrance_zone = nil
691local to_riverbank_zone = nil
692local to_village_entrance_zone = nil
693local to_kalya_house_path_zone = nil
694local shop_entrance_zone = nil
695local secret_path_zone = nil
696local to_layna_forest_zone = nil
697local sophia_house_entrance_zone = nil
698local to_well_undergrounds_zone = nil
699
700function _CreateZones()
701    -- N.B.: left, right, top, bottom
702    bronanns_home_entrance_zone = vt_map.CameraZone.Create(10, 14, 60, 61);
703    to_riverbank_zone = vt_map.CameraZone.Create(19, 35, 78, 79);
704    to_village_entrance_zone = vt_map.CameraZone.Create(60, 113, 78, 79);
705    to_kalya_house_path_zone = vt_map.CameraZone.Create(0, 1, 8, 15);
706    shop_entrance_zone = vt_map.CameraZone.Create(92, 96, 70, 71);
707    secret_path_zone = vt_map.CameraZone.Create(0, 1, 55, 61);
708    to_layna_forest_zone = vt_map.CameraZone.Create(117, 119, 30, 43);
709    sophia_house_entrance_zone = vt_map.CameraZone.Create(21, 23, 21, 22);
710    to_well_undergrounds_zone = vt_map.CameraZone.Create(62, 64, 29, 30)
711end
712
713function _CheckZones()
714    if (bronanns_home_entrance_zone:IsCameraEntering() == true) then
715        bronann:SetMoving(false);
716        AudioManager:PlaySound("data/sounds/door_open2.wav");
717        EventManager:StartEvent("to Bronann's home");
718    elseif (to_riverbank_zone:IsCameraEntering() == true) then
719        bronann:SetMoving(false);
720        EventManager:StartEvent("to Riverbank");
721    elseif (to_village_entrance_zone:IsCameraEntering() == true) then
722        bronann:SetMoving(false);
723        EventManager:StartEvent("to Village south entrance");
724    elseif (to_kalya_house_path_zone:IsCameraEntering() == true) then
725        bronann:SetMoving(false);
726        EventManager:StartEvent("to Kalya house path");
727    elseif (secret_path_zone:IsCameraEntering() == true) then
728        bronann:SetMoving(false);
729        EventManager:StartEvent("to secret cliff");
730    elseif (to_layna_forest_zone:IsCameraEntering() == true) then
731        bronann:SetMoving(false);
732        if (GlobalManager:GetGameEvents():DoesEventExist("story", "Quest2_forest_event_done") == false) then
733            EventManager:StartEvent("Bronann can't enter the forest so easily");
734        elseif (GlobalManager:GetGameEvents():DoesEventExist("story", "Quest2_kalya_equip_n_dungeons_speech_done") == false) then
735            EventManager:StartEvent("Quest2: Kalya's equipment and dungeons speech start");
736        else
737            EventManager:StartEvent("to layna forest entrance");
738        end
739    elseif (shop_entrance_zone:IsCameraEntering() == true) then
740        bronann:SetMoving(false);
741        AudioManager:PlaySound("data/sounds/door_open2.wav");
742        EventManager:StartEvent("to Flora's Shop");
743    elseif (sophia_house_entrance_zone:IsCameraEntering() == true) then
744        bronann:SetMoving(false);
745        EventManager:StartEvent("to sophia house");
746        AudioManager:PlaySound("data/sounds/door_open2.wav");
747    elseif (to_well_undergrounds_zone:IsCameraEntering() == true
748            -- cannot enter until the well event is done.
749            and GlobalManager:GetGameEvents():DoesEventExist("story", "well_rats_beaten") == true) then
750        bronann:SetMoving(false)
751        EventManager:StartEvent("To well underground")
752    end
753end
754
755-- Inner custom functions
756function _TriggerPotentialDialogueAfterFadeIn()
757    -- Trigger the forest and Orlinn runaway event
758    if (GlobalManager:GetGameEvents():DoesEventExist("story", "meal_event_done") == true
759            and GlobalManager:GetGameEvents():DoesEventExist("story", "Quest2_forest_event_done") == false) then
760        EventManager:StartEvent("Quest2: Forest event");
761        GlobalManager:GetGameEvents():SetEventValue("story", "Quest2_forest_event_done", 1);
762        return;
763    end
764
765    if (GlobalManager:GetGameEvents():DoesEventExist("layna_center", "first_time_in_village_center") == false) then
766        EventManager:StartEvent("Quest1: Bronann wonders where he can find some barley meal");
767        GlobalManager:GetGameEvents():SetEventValue("layna_center", "first_time_in_village_center", 1);
768        return;
769    end
770end
771
772-- Updates Olivia dialogues according to the story events
773function _UpdateOliviaDialogue()
774    local dialogue = nil
775    local text = nil
776    local event = nil
777
778    olivia:ClearDialogueReferences();
779
780    local default_dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_olivia_no_access_to_forest1");
781    text = vt_system.Translate("Bronann! Sorry, you know that you can't access the forest without permission.");
782    default_dialogue:AddLineEmote(text, olivia, "exclamation");
783    text = vt_system.Translate("Aww...");
784    default_dialogue:AddLineEventEmote(text, bronann, "Bronann looks at Olivia", "", "sweat drop");
785
786    -- Don't grant access to the forest so easily
787    if (GlobalManager:GetGameEvents():DoesEventExist("story", "Quest2_forest_event_done") == false) then
788        if (GlobalManager:GetGameEvents():DoesEventExist("story", "Carson_wooden_sword_given") == true
789                and GlobalManager:GetGameEvents():DoesEventExist("story", "well_rats_beaten") == false) then
790            -- The well quest dialogue
791            dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_olivia_well_quest")
792            text = vt_system.Translate("Hey Bronann. I can see you have your father practice sword. Ready for your first real challenge?")
793            dialogue:AddLine(text, olivia)
794            text = vt_system.Translate("Hey Olivia. I guess so. What is it all about?")
795            dialogue:AddLineEmote(text, bronann, "interrogation")
796            text = vt_system.Translate("Follow me.")
797            dialogue:AddLine(text, olivia)
798            dialogue:SetEventAtDialogueEnd("Olivia goes to well with Bronann")
799            olivia:AddDialogueReference(dialogue)
800
801            -- Event to go to the well.
802            event = vt_map.ScriptedEvent.Create("Olivia goes to well with Bronann", "Well_event_scene_start", "")
803            event:AddEventLinkAtEnd("Olivia moves to the well")
804            event:AddEventLinkAtEnd("Bronann looks at Olivia for a few seconds")
805            event = vt_map.PathMoveSpriteEvent.Create("Olivia moves to the well", olivia, 57, 27, true)
806            event:AddEventLinkAtEnd("Olivia looks at Bronann 1")
807            event = vt_map.LookAtSpriteEvent.Create("Olivia looks at Bronann 1", olivia, bronann)
808
809            event = vt_map.ScriptedEvent.Create("Bronann looks at Olivia for a few seconds", "bronann_watch_olivia_start", "bronann_watch_olivia_update")
810            event:AddEventLinkAtEnd("Bronann moves to the well")
811
812            event = vt_map.PathMoveSpriteEvent.Create("Bronann moves to the well", bronann, 61, 27, true)
813            event:AddEventLinkAtEnd("Olivia looks at Bronann")
814            event = vt_map.LookAtSpriteEvent.Create("Olivia looks at Bronann", olivia, bronann)
815            event:AddEventLinkAtEnd("Olivia opens path to well underground")
816            dialogue = vt_map.SpriteDialogue.Create()
817            text = vt_system.Translate("Here we go!")
818            dialogue:AddLine(text, olivia)
819            event = vt_map.DialogueEvent.Create("Olivia opens path to well underground", dialogue)
820            event:AddEventLinkAtEnd("Olivia moves close to the well")
821
822            event = vt_map.PathMoveSpriteEvent.Create("Olivia moves close to the well", olivia, 59, 28.5, false)
823            event:AddEventLinkAtEnd("Olivia opens well path")
824            event = vt_map.ScriptedEvent.Create("Olivia opens well path", "well_open_trigger_start", "well_open_trigger_update")
825            event:AddEventLinkAtEnd("Olivia speech before entering well")
826
827            dialogue = vt_map.SpriteDialogue.Create()
828            text = vt_system.Translate("Time to dive in, Bronann.")
829            dialogue:AddLine(text, olivia)
830            text = vt_system.Translate("Follow me inside.")
831            dialogue:AddLine(text, olivia)
832            event = vt_map.DialogueEvent.Create("Olivia speech before entering well", dialogue)
833            event:AddEventLinkAtEnd("Olivia enters the well")
834            event = vt_map.PathMoveSpriteEvent.Create("Olivia enters the well", olivia, 63, 32, false)
835            event:AddEventLinkAtEnd("Set Olivia invisible")
836            event = vt_map.ScriptedEvent.Create("Set Olivia invisible", "set_olivia_invisible", "")
837            event:AddEventLinkAtEnd("Bronann enters the well")
838            event = vt_map.PathMoveSpriteEvent.Create("Bronann enters the well", bronann, 63, 32, false)
839            event:AddEventLinkAtEnd("To well underground") -- map transition
840        else
841            olivia:AddDialogueReference(default_dialogue)
842        end
843
844        -- Add the map even to prevent going to the forest
845        event = vt_map.DialogueEvent.Create("Bronann can't enter the forest so easily", default_dialogue)
846        event:SetStopCameraMovement(true)
847    else
848        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_olivia_access_to_forest")
849        text = vt_system.Translate("Good luck Bronann.")
850        dialogue:AddLine(text, olivia)
851        olivia:AddDialogueReference(dialogue)
852    end
853end
854
855-- Updates Georges dialogue depending on how far is the story going.
856function _UpdateGeorgesDialogue()
857    local text = nil
858    local dialogue = nil
859
860    georges:ClearDialogueReferences();
861
862    if (GlobalManager:GetGameEvents():DoesEventExist("layna_center", "quest1_pen_given_done") == true) then
863        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_georges_default");
864        text = vt_system.Translate("Ah, the river is so beautiful at this time of the year. I feel like writing some poetry...");
865        dialogue:AddLine(text, georges);
866        georges:AddDialogueReference(dialogue);
867    elseif (GlobalManager:GetGameEvents():DoesEventExist("layna_riverbank", "quest1_orlinn_hide_n_seek3_done") == true) then
868        -- Give the pen to Georges
869        dialogue = vt_map.SpriteDialogue.Create();
870        text = vt_system.Translate("Here it is, Georges.");
871        dialogue:AddLine(text, bronann);
872        text = vt_system.Translate("You're the nicest person I know, Bronann. I will tell everyone how brave you...");
873        dialogue:AddLine(text, georges);
874        text = vt_system.Translate("(sigh)... Georges!");
875        dialogue:AddLine(text, bronann);
876        text = vt_system.Translate("Ok ok. Just having a bit of spirit, young man.");
877        dialogue:AddLineEvent(text, georges, "", "Quest1: Georges thanks Bronann");
878        georges:AddDialogueReference(dialogue);
879        return;
880    elseif (GlobalManager:GetGameEvents():DoesEventExist("layna_center", "quest1_georges_dialogue_done") == true) then
881        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_georges_pen_lost_short");
882        text = vt_system.Translate("You see, I lost my beloved pen. Was it near a tree or next to the waving child of the mountain snow?");
883        dialogue:AddLine(text, georges);
884        text = vt_system.Translate("Shall you find it, I would be extremely obliged to you!");
885        dialogue:AddLine(text, georges);
886        text = vt_system.Translate("Inquire our comrades in the settlement, perhaps somebody has laid their eyes on it.");
887        dialogue:AddLine(text, georges);
888        text = vt_system.Translate("(sigh...) Hmm, fine. I'll have a look.");
889        dialogue:AddLine(text, bronann);
890        georges:AddDialogueReference(dialogue);
891    else
892        -- Once talked to him after the shop conversation, just put the end of the dialogue
893        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_georges_pen_lost");
894        text = vt_system.Translate("Oh Bronann, sad is the poet today.");
895        dialogue:AddLine(text, georges);
896        text = vt_system.Translate("Hi Georges, well, I was just passing by you know, and");
897        dialogue:AddLine(text, bronann);
898        text = vt_system.Translate("You see, I lost my beloved pen. Was it near a tree or next to the waving child of the mountain snow?");
899        dialogue:AddLine(text, georges);
900        text = vt_system.Translate("Shall you find it, I would be extremely obliged to you!");
901        dialogue:AddLine(text, georges);
902        text = vt_system.Translate("Inquire our comrades in the settlement, perhaps somebody has laid their eyes on it.");
903        dialogue:AddLine(text, georges);
904        text = vt_system.Translate("(sigh...) Hmm, fine. I'll have a look.");
905        dialogue:AddLineEvent(text, bronann, "", "Quest1: GeorgesDialogueDone");
906        georges:AddDialogueReference(dialogue);
907        return;
908    end
909end
910
911-- Updates Orlinn's dialogue and state depending on how far is the story going.
912function _UpdateOrlinnAndKalyaState()
913    local text = nil
914    local dialogue = nil
915    local event = nil
916
917    orlinn:ClearDialogueReferences();
918    if (GlobalManager:GetGameEvents():DoesEventExist("story", "Quest2_forest_event_done") == true) then
919        -- At that moment, Orlinn has disappeared and Kalya is now in Bronann's party.
920        orlinn:SetVisible(false);
921        orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
922        kalya:ClearDialogueReferences();
923        kalya:SetVisible(false);
924        kalya:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
925        EventManager:EndAllEvents(kalya);
926        kalya:SetMoving(false);
927        return;
928    end
929    if (GlobalManager:GetGameEvents():DoesEventExist("layna_riverbank", "quest1_orlinn_hide_n_seek3_done") == true) then
930        -- Bronann got Georges' pen, update orlinn dialogue
931        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_orlinn_wont_bother_again");
932        text = vt_system.Translate("I promise I won't bother you again.");
933        dialogue:AddLine(text, orlinn);
934        text = vt_system.Translate("Don't worry about that, Orlinn. Ok?");
935        dialogue:AddLine(text, bronann);
936        orlinn:AddDialogueReference(dialogue);
937
938        -- Update kalya's dialogue too
939        kalya:ClearDialogueReferences();
940        dialogue = vt_map.SpriteDialogue.Create();
941        text = vt_system.Translate("...");
942        dialogue:AddLine(text, kalya);
943        kalya:AddDialogueReference(dialogue);
944
945    elseif (GlobalManager:GetGameEvents():DoesEventExist("layna_center", "quest1_orlinn_dialogue1_done") == true) then
946        -- At that time, Orlinn isn't in the village center anymore.
947        orlinn:SetVisible(false);
948        orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
949
950        -- Kalya propose to seek him for you
951        kalya:ClearDialogueReferences();
952        dialogue = vt_map.SpriteDialogue.Create();
953        text = vt_system.Translate("Kalya, have you seen Orlinn?");
954        dialogue:AddLine(text, bronann);
955        text = vt_system.Translate("Why? Oh, don't tell me. He's hiding somewhere.");
956        dialogue:AddLineEmote(text, kalya, "thinking dots");
957        text = vt_system.Translate("Yes, he took Georges pen and I need to give it back to him...");
958        dialogue:AddLine(text, bronann);
959        text = vt_system.Translate("Hmpf, no surprise. Do you want me to bring him back?");
960        dialogue:AddLineEmote(text, kalya, "sweat drop");
961        text = vt_system.Translate("Yes, please.");
962        dialogue:AddOptionEvent(text, 15, "Kalya brings back Orlinn event start"); -- 15 is after the dialogue's end on purpose.
963        text = vt_system.Translate("No, it's not that bad.");
964        dialogue:AddOption(text, 4);
965        text = vt_system.Translate("As you wish.");
966        dialogue:AddLine(text, kalya);
967        kalya:AddDialogueReference(dialogue);
968
969        return;
970    elseif (GlobalManager:GetGameEvents():DoesEventExist("layna_center", "quest1_georges_dialogue_done") == true) then
971        dialogue = vt_map.SpriteDialogue.Create();
972        text = vt_system.Translate("Hee hee hee!");
973        dialogue:AddLineEvent(text, orlinn, "Orlinn laughs", "");
974        text = vt_system.Translate("What are you laughing about, Orlinn?");
975        dialogue:AddLineEmote(text, bronann, "interrogation");
976        text = vt_system.Translate("You'll never find it!");
977        dialogue:AddLine(text, orlinn);
978        text = vt_system.Translate("Huh? Wait! Are you talking about Georges's lost pen?");
979        dialogue:AddLineEmote(text, bronann, "exclamation");
980        text = vt_system.Translate("Hee hee hee! Yes!");
981        dialogue:AddLineEvent(text, orlinn, "Orlinn laughs", "");
982        text = vt_system.Translate("Please tell me! Have you found it?");
983        dialogue:AddLine(text, bronann);
984        text = vt_system.Translate("Maybe yes, maybe no!");
985        dialogue:AddLine(text, orlinn);
986        text = vt_system.Translate("Oh no, please Orlinn! I need it!");
987        dialogue:AddLineEmote(text, bronann, "sweat drop");
988        text = vt_system.Translate("Sure, I'll help you. But only if you can catch me!");
989        dialogue:AddLine(text, orlinn);
990        text = vt_system.Translate("Hee hee! (He'll never find me hiding behind the buildings!)");
991        dialogue:AddLineEvent(text, orlinn, "Orlinn laughs", "Quest1: Make Orlinn run and hide");
992
993        orlinn:AddDialogueReference(dialogue);
994    else
995        dialogue = vt_map.SpriteDialogue.Create("ep1_layna_village_orlinn_wanna_play");
996        text = vt_system.Translate("Heya bro! Wanna play with me?");
997        dialogue:AddLine(text, orlinn);
998        orlinn:AddDialogueReference(dialogue);
999    end
1000
1001    -- Default behaviour
1002    EventManager:EndAllEvents(orlinn);
1003    -- Add the default event if it doesn't exist
1004    if (EventManager:DoesEventExist("Orlinn random move") == false) then
1005        event = vt_map.RandomMoveSpriteEvent.Create("Orlinn random move", orlinn, 4000, 2000);
1006        event:AddEventLinkAtEnd("Orlinn random move", 3000); -- Loop on itself
1007
1008    end
1009    EventManager:StartEvent("Orlinn random move");
1010end
1011
1012-- Helps with the two step fade in the forest event
1013local bright_light_time = 0.0
1014local bright_light_color = vt_video.Color(1.0, 1.0, 1.0, 1.0);
1015
1016-- Bronann watch Olivia event
1017local bronann_watch_time = 0
1018
1019-- move well stone event
1020local well_rock_y_pos = 32
1021
1022-- Map Custom functions
1023map_functions = {
1024
1025    Quest1GeorgesDialogueDone = function()
1026        GlobalManager:GetGameEvents():SetEventValue("layna_center", "quest1_georges_dialogue_done", 1);
1027        -- Makes Orlinn aware that Bronann has talked to Georges.
1028        _UpdateOrlinnAndKalyaState();
1029        _UpdateGeorgesDialogue();
1030        GlobalManager:GetGameQuests():AddQuestLog("find_pen");
1031    end,
1032
1033    Quest1OrlinnRunAndHide = function()
1034        orlinn:SetMoving(false); -- in case he's moving
1035        orlinn:SetMovementSpeed(vt_map.MapMode.VERY_FAST_SPEED);
1036        orlinn:SetCollisionMask(vt_map.MapMode.WALL_COLLISION);
1037        orlinn:ClearDialogueReferences();
1038        EventManager:EndAllEvents(orlinn);
1039    end,
1040
1041    orlinn_run_event_end = function()
1042        -- Updates Orlinn's state
1043        GlobalManager:GetGameEvents():SetEventValue("layna_center", "quest1_orlinn_dialogue1_done", 1);
1044        GlobalManager:GetGameQuests():AddQuestLog("hide_n_seek_with_orlinn");
1045
1046        -- Updates Kalya dialogue
1047        _UpdateOrlinnAndKalyaState();
1048    end,
1049
1050    kalya_brings_orlinn_back_start = function()
1051        -- Use the scene state so that the character can't move by player's input
1052        Map:PushState(vt_map.MapMode.STATE_SCENE);
1053        -- Do it twice to ensure this state during the transition to the next dialogue
1054        Map:PushState(vt_map.MapMode.STATE_SCENE);
1055        -- Place Orlinn for the event
1056        orlinn:SetPosition(67, 78);
1057        orlinn:SetMovementSpeed(vt_map.MapMode.FAST_SPEED);
1058        orlinn:SetCollisionMask(vt_map.MapMode.WALL_COLLISION);
1059        orlinn:SetVisible(true);
1060        -- Makes her stop wandering
1061        EventManager:EndAllEvents(kalya);
1062    end,
1063
1064    orlinn_comes_back_event_end = function()
1065        GlobalManager:GetGameEvents():SetEventValue("layna_riverbank", "quest1_orlinn_hide_n_seek3_done", 1);
1066        Map:PopState();
1067        -- Remove it twice since we added it twice.
1068        Map:PopState();
1069
1070        -- Updates Kalya, Orlinn and Georges dialogues
1071        _UpdateOrlinnAndKalyaState();
1072        _UpdateGeorgesDialogue();
1073    end,
1074
1075    Quest1GeorgesTellsBronannAboutLilly = function()
1076        GlobalManager:GetGameEvents():SetEventValue("layna_center", "quest1_pen_given_done", 1);
1077
1078        -- Remove the pen key item from inventory
1079        local pen_item_id = 70001;
1080        local inventory_handler = GlobalManager:GetInventoryHandler()
1081        if (inventory_handler:IsItemInInventory(pen_item_id) == true) then
1082            inventory_handler:RemoveFromInventory(pen_item_id);
1083        end
1084
1085        -- Updates Georges dialogue
1086        _UpdateGeorgesDialogue();
1087    end,
1088
1089    orlinn_laughs = function()
1090        orlinn:SetCustomAnimation("laughing", 700);
1091    end,
1092
1093    Prepare_forest_event = function()
1094        -- Scene event
1095        Map:PushState(vt_map.MapMode.STATE_SCENE);
1096        carson:SetPosition(12, 62);
1097        carson:SetVisible(false);
1098        carson:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
1099
1100        herth:SetPosition(36, 71);
1101        herth:SetVisible(true);
1102        herth:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
1103
1104        EventManager:EndAllEvents(kalya);
1105        kalya:SetPosition(36, 66);
1106        kalya:SetMoving(false);
1107        kalya:ClearDialogueReferences();
1108
1109        -- hide Orlinn has he's into the forest
1110        EventManager:EndAllEvents(orlinn);
1111        orlinn:SetMoving(false);
1112        orlinn:SetVisible(false);
1113        orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
1114    end,
1115
1116    set_carson_visible = function()
1117        carson:SetVisible(true)
1118    end,
1119
1120    BrightLightStart = function()
1121        bright_light_time = 0.0;
1122        Effects:ShakeScreen(0.6, 6000, vt_mode_manager.EffectSupervisor.SHAKE_FALLOFF_GRADUAL);
1123        AudioManager:PlaySound("data/sounds/rumble.wav");
1124        AudioManager:FadeOutActiveMusic(2000);
1125    end,
1126
1127    BrightLightUpdate = function()
1128        bright_light_time = bright_light_time + 2.5 * SystemManager:GetUpdateTime();
1129
1130        if (bright_light_time < 5000.0) then
1131            bright_light_color:SetAlpha(bright_light_time / 5000.0);
1132            Map:GetEffectSupervisor():EnableLightingOverlay(bright_light_color);
1133            return false;
1134        end
1135
1136        if (bright_light_time < 10000) then
1137            bright_light_color:SetAlpha((10000.0 - bright_light_time) / 5000.0);
1138            Map:GetEffectSupervisor():EnableLightingOverlay(bright_light_color);
1139            return false;
1140        end
1141
1142        -- end of the two-step fade in and out
1143        return true;
1144    end,
1145
1146    Add_kalya_to_party = function()
1147        if (GlobalManager:GetGameEvents():DoesEventExist("story", "kalya_has_joined") == false) then
1148            GlobalManager:GetCharacterHandler():AddCharacter(KALYA);
1149            GlobalManager:GetGameEvents():SetEventValue("story", "kalya_has_joined", 1);
1150            GlobalManager:GetGameQuests():AddQuestLog("bring_orlinn_back");
1151        end
1152        AudioManager:FadeInActiveMusic(2000);
1153
1154        -- Now, the event is done, update Olivia's dialogue as access to the forest is granted
1155        _UpdateOliviaDialogue();
1156    end,
1157
1158    Quest2_equip_speech_start = function()
1159        Map:PushState(vt_map.MapMode.STATE_SCENE);
1160        bronann:SetMoving(false);
1161        bronann:SetDirection(vt_map.MapMode.WEST);
1162        kalya:SetPosition(bronann:GetXPosition(), bronann:GetYPosition());
1163        kalya:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
1164        kalya:SetDirection(vt_map.MapMode.WEST);
1165        kalya:SetVisible(true);
1166        kalya:ClearDialogueReferences();
1167
1168        -- Set the event as done to prevent it to trigger again
1169        GlobalManager:GetGameEvents():SetEventValue("story", "Quest2_kalya_equip_n_dungeons_speech_done", 1)
1170    end,
1171
1172    Sprite_Collision_on = function(sprite)
1173        if (sprite ~= nil) then
1174            sprite:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
1175        end
1176    end,
1177
1178    Map_SceneState = function()
1179        Map:PushState(vt_map.MapMode.STATE_SCENE);
1180    end,
1181
1182    Map_PopState = function()
1183        Map:PopState();
1184    end,
1185
1186    MakeInvisible = function(sprite)
1187        if (sprite ~= nil) then
1188            sprite:SetVisible(false);
1189            sprite:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
1190        end
1191    end,
1192
1193    Well_event_scene_start = function()
1194        Map:PushState(vt_map.MapMode.STATE_SCENE)
1195        EventManager:EndAllEvents(olivia)
1196        olivia:SetMoving(false)
1197        bronann:SetMoving(false)
1198        -- Olivia can get stuck because of Bronann start position*
1199        olivia:SetCollisionMask(vt_map.MapMode.WALL_COLLISION)
1200    end,
1201
1202    bronann_watch_olivia_start = function()
1203        bronann:LookAt(olivia)
1204        bronann_watch_time = 0.0
1205    end,
1206
1207    bronann_watch_olivia_update = function()
1208        bronann_watch_time = bronann_watch_time + SystemManager:GetUpdateTime()
1209        if (bronann_watch_time > 1000) then
1210            return true
1211        end
1212        bronann:LookAt(olivia)
1213        return false
1214    end,
1215
1216    well_open_trigger_start = function()
1217        Effects:ShakeScreen(0.6, 1000, vt_mode_manager.EffectSupervisor.SHAKE_FALLOFF_GRADUAL)
1218        AudioManager:PlaySound("data/sounds/cave-in.ogg")
1219        -- Place the stone
1220        well_rock_y_pos = 32
1221    end,
1222
1223    well_open_trigger_update = function()
1224        well_rock_y_pos = well_rock_y_pos + (SystemManager:GetUpdateTime() * 0.01)
1225        well_entrance_rock:SetYPosition(well_rock_y_pos)
1226        if (well_rock_y_pos < 34) then
1227            return false
1228        end
1229        return true
1230    end,
1231
1232    set_olivia_invisible = function()
1233        olivia:SetVisible(false)
1234    end
1235}
1236