1-- Set the namespace according to the map name.
2local ns = {};
3setmetatable(ns, {__index = _G});
4mt_elbrus_shrine_stairs_script = ns;
5setfenv(1, ns);
6
7-- The map name, subname and location image
8map_name = "Mt. Elbrus Shrine"
9map_image_filename = "data/story/common/locations/mountain_shrine.png"
10map_subname = ""
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/icy_wind.ogg"
15
16-- c++ objects instances
17local Map = nil
18local EventManager = nil
19
20-- the main character handler
21local hero = nil
22
23-- Forest dialogue secondary hero
24local kalya = nil
25local orlinn = nil
26local bronann = nil
27
28-- the main map loading code
29function Load(m)
30
31    Map = m;
32    EventManager = Map:GetEventSupervisor();
33    Map:SetUnlimitedStamina(true);
34
35    _CreateCharacters();
36    _CreateObjects();
37
38    -- Set the camera focus on hero
39    Map:SetCamera(hero);
40    -- This is a dungeon map, we'll use the front battle member sprite as default sprite.
41    Map:SetPartyMemberVisibleSprite(hero);
42
43    -- If the event in progress involves being Orlinn, then let's incarnate him.
44    if (GlobalManager:GetGameEvents():GetEventValue("story", "elbrus_shrine_laughing_event_done") == 1
45            and GlobalManager:GetGameEvents():GetEventValue("story", "mt elbrus shrine heroes saved") == 0) then
46        orlinn:SetPosition(hero:GetXPosition(), hero:GetYPosition());
47        orlinn:SetVisible(true);
48        orlinn:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
49        orlinn:SetDirection(hero:GetDirection());
50        Map:SetCamera(orlinn)
51        -- hide the hero sprite
52        hero:SetVisible(false)
53        hero:SetPosition(0, 0);
54
55        -- The menu and status effects are then disabled.
56        Map:SetMenuEnabled(false);
57        Map:SetStatusEffectsEnabled(false);
58
59        -- Place kalya and bronann laughing
60        bronann:SetPosition(37, 11);
61        bronann:SetVisible(true);
62        bronann:SetDirection(vt_map.MapMode.SOUTH);
63        bronann:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
64
65        kalya:SetPosition(35, 11);
66        kalya:SetVisible(true);
67        kalya:SetDirection(vt_map.MapMode.SOUTH);
68        kalya:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
69
70        -- If Orlinn hasn't triggered the button, yet, the other heroes are laughing.
71        if (GlobalManager:GetGameEvents():GetEventValue("triggers", "mt elbrus waterfall trigger") == 0) then
72            bronann:SetCustomAnimation("laughing", 0); -- 0 means forever
73            kalya:SetCustomAnimation("laughing", 0); -- 0 means forever
74        end
75
76        _UpdateKalyaBronannDialogue();
77
78        -- Loads the funny music if needed.
79        if (GlobalManager:GetGameEvents():GetEventValue("triggers", "mt elbrus waterfall trigger") == 1) then
80            AudioManager:LoadMusic("data/music/Zander Noriega - School of Quirks.ogg", Map);
81        end
82    end
83
84    _CreateEvents();
85    _CreateZones();
86
87    -- Add a mediumly dark overlay when necessary
88    Map:GetEffectSupervisor():EnableAmbientOverlay("data/visuals/ambient/dark.png", 0.0, 0.0, false);
89end
90
91-- set up/updates sophia's events
92function _UpdateKalyaBronannDialogue()
93    local text = nil
94    local dialogue = nil
95
96    kalya:ClearDialogueReferences();
97    bronann:ClearDialogueReferences();
98
99    -- If Orlinn has triggered the waterfall button, the heroes are stainding not laughing
100    if (GlobalManager:GetGameEvents():GetEventValue("triggers", "mt elbrus waterfall trigger") == 1) then
101        kalya:LookAt(bronann);
102        bronann:LookAt(kalya);
103        return;
104    end
105
106    if (GlobalManager:GetGameEvents():GetEventValue("story", "elbrus_shrine_laughing_event_done") == 0) then
107        return
108    end
109
110    -- Short version of the dialogue for later
111    dialogue = vt_map.SpriteDialogue.Create();
112    text = vt_system.Translate("We can't move, Orlinn.");
113    dialogue:AddLine(text, kalya);
114    text = vt_system.Translate("We're gonna...suffocate.");
115    dialogue:AddLine(text, bronann);
116    text = vt_system.Translate("Orlinn, help us... Please, oh oh oh...");
117    dialogue:AddLine(text, kalya);
118    bronann:AddDialogueReference(dialogue);
119    kalya:AddDialogueReference(dialogue);
120end
121
122-- the map update function handles checks done on each game tick.
123function Update()
124    -- Check whether the character is in one of the zones
125    _CheckZones();
126end
127
128-- Character creation
129function _CreateCharacters()
130    -- Default hero and position (from_shrine_first_floor)
131    hero = CreateSprite(Map, "Bronann", 13.5, 38.0, vt_map.MapMode.GROUND_OBJECT);
132    hero:SetDirection(vt_map.MapMode.EAST);
133    hero:SetMovementSpeed(vt_map.MapMode.NORMAL_SPEED);
134
135    -- Load previous save point data
136    local x_position = GlobalManager:GetMapData():GetSaveLocationX();
137    local y_position = GlobalManager:GetMapData():GetSaveLocationY();
138    if (x_position ~= 0 and y_position ~= 0) then
139        -- Make the character look at us in that case
140        hero:SetDirection(vt_map.MapMode.SOUTH);
141        hero:SetPosition(x_position, y_position);
142    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_shrine_2nd_floor") then
143        hero:SetDirection(vt_map.MapMode.WEST);
144        hero:SetPosition(57.0, 38.0);
145    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_shrine_2nd_floor_grotto") then
146        hero:SetDirection(vt_map.MapMode.EAST);
147        hero:SetPosition(13.5, 16.0);
148    elseif (GlobalManager:GetMapData():GetPreviousLocation() == "from_shrine_third_floor") then
149        hero:SetDirection(vt_map.MapMode.SOUTH);
150        hero:SetPosition(37, 8.5);
151    end
152
153    -- Create secondary characters
154    kalya = CreateSprite(Map, "Kalya",
155                         hero:GetXPosition(), hero:GetYPosition(), vt_map.MapMode.GROUND_OBJECT);
156    kalya:SetDirection(vt_map.MapMode.EAST);
157    kalya:SetMovementSpeed(vt_map.MapMode.NORMAL_SPEED);
158    kalya:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
159    kalya:SetVisible(false);
160
161    orlinn = CreateSprite(Map, "Orlinn",
162                          hero:GetXPosition(), hero:GetYPosition(), vt_map.MapMode.GROUND_OBJECT);
163    orlinn:SetDirection(vt_map.MapMode.EAST);
164    orlinn:SetMovementSpeed(vt_map.MapMode.FAST_SPEED);
165    orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
166    orlinn:SetVisible(false);
167
168    bronann = CreateSprite(Map, "Bronann",
169                           hero:GetXPosition(), hero:GetYPosition(), vt_map.MapMode.GROUND_OBJECT);
170    bronann:SetDirection(vt_map.MapMode.EAST);
171    bronann:SetMovementSpeed(vt_map.MapMode.NORMAL_SPEED);
172    bronann:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
173    bronann:SetVisible(false);
174end
175
176-- The heal particle effect map object
177local heal_effect = nil
178local layna_statue = nil;
179
180function _CreateObjects()
181    local object = nil
182    local npc = nil
183    local dialogue = nil
184    local text = nil
185
186    vt_map.SavePoint.Create(51, 22)
187    if (GlobalManager:GetGameEvents():GetEventValue("story", "elbrus_shrine_laughing_event_done") == 1
188            and GlobalManager:GetGameEvents():GetEventValue("story", "mt elbrus shrine heroes saved") == 0) then
189        -- Disable the save point
190        Map:SetMapPointsEnabled(false);
191    end
192
193    -- We can hear waterfalls in that case
194    if (GlobalManager:GetGameEvents():GetEventValue("triggers", "mt elbrus waterfall trigger") == 1) then
195        vt_map.SoundObject.Create("data/sounds/fountain_large.ogg", 0, 0, 50.0);
196    end
197
198    -- Load the spring heal effect.
199    heal_effect = vt_map.ParticleObject.Create("data/visuals/particle_effects/heal_particle.lua", 0, 0, vt_map.MapMode.GROUND_OBJECT);
200    heal_effect:Stop(); -- Don't run it until the character heals itself
201
202    layna_statue = CreateObject(Map, "Layna Statue", 57, 22, vt_map.MapMode.GROUND_OBJECT);
203    if (GlobalManager:GetGameEvents():GetEventValue("story", "elbrus_shrine_laughing_event_done") == 0
204            or GlobalManager:GetGameEvents():GetEventValue("story", "mt elbrus shrine heroes saved") == 1) then
205        layna_statue:SetEventWhenTalking("Heal dialogue");
206        layna_statue:SetInteractionIcon("data/gui/map/heal_anim.lua")
207    end
208
209    object = CreateObject(Map, "Layna Statue", 37, 30, vt_map.MapMode.GROUND_OBJECT);
210    object:SetEventWhenTalking("Heal dialogue");
211    object:SetInteractionIcon("data/gui/map/heal_anim.lua")
212
213    dialogue = vt_map.SpriteDialogue.Create();
214    text = vt_system.Translate("Your party feels better.");
215    dialogue:AddLineEvent(text, nil, "Heal event", ""); -- 'nil' means no portrait and no name
216    vt_map.DialogueEvent.Create("Heal dialogue", dialogue);
217
218    vt_map.SavePoint.Create(37, 38.5)
219
220    -- Snow effect
221    vt_map.ParticleObject.Create("data/story/mt_elbrus/particles_snow_south_entrance.lua", 29, 48, vt_map.MapMode.GROUND_OBJECT);
222
223    vt_map.Halo.Create("data/visuals/lights/torch_light_mask.lua", 29, 55,
224        vt_video.Color(1.0, 1.0, 1.0, 0.8));
225
226    -- Adds a hidden sign, show just before the opening of the door
227    CreateObject(Map, "Ancient_Sign1", 37, 36, vt_map.MapMode.FLATGROUND_OBJECT);
228
229    _add_flame(29.5, 31);
230    _add_flame(45.5, 31);
231    _add_flame(21.5, 11);
232    _add_flame(53.5, 11);
233
234    -- Waterfall
235    if (GlobalManager:GetGameEvents():GetEventValue("triggers", "mt elbrus waterfall trigger") == 1) then
236        _add_small_waterfall(18, 30);
237        _add_waterlight(13, 31)
238        _add_waterlight(23, 31)
239    else
240        _add_bubble(23, 30);
241        _add_bubble(19, 29);
242        _add_bubble(6, 29.5);
243        _add_bubble(4, 39);
244
245        -- The poisonous scent
246        Map:GetScriptSupervisor():AddScript("data/story/mt_elbrus/mt_elbrus_scent_anim.lua");
247    end
248end
249
250function _add_small_waterfall(x, y)
251    local object = CreateObject(Map, "Waterfall2", x - 0.1, y - 0.2, vt_map.MapMode.GROUND_OBJECT);
252    object:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
253    object:RandomizeCurrentAnimationFrame();
254
255    -- Ambient sound
256    object = vt_map.SoundObject.Create("data/sounds/fountain_large.ogg", x, y - 5, 50.0);
257    object:SetMaxVolume(0.6);
258
259    -- Particle effects
260    object = vt_map.ParticleObject.Create("data/visuals/particle_effects/waterfall_steam.lua", x, y - 8.0, vt_map.MapMode.GROUND_OBJECT);
261    object:SetDrawOnSecondPass(true);
262
263    object = vt_map.ParticleObject.Create("data/visuals/particle_effects/waterfall_steam_big.lua", x, y + 1.0, vt_map.MapMode.GROUND_OBJECT);
264    object:SetDrawOnSecondPass(true);
265end
266
267function _add_waterlight(x, y)
268    local object = CreateObject(Map, "Water Light1", x, y, vt_map.MapMode.GROUND_OBJECT);
269    object:RandomizeCurrentAnimationFrame();
270    object:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
271end
272
273function _add_flame(x, y)
274    vt_map.SoundObject.Create("data/sounds/campfire.ogg", x, y, 10.0);
275
276    local object = CreateObject(Map, "Flame1", x, y, vt_map.MapMode.GROUND_OBJECT);
277    object:RandomizeCurrentAnimationFrame();
278
279    vt_map.Halo.Create("data/visuals/lights/torch_light_mask2.lua", x, y + 3.0,
280        vt_video.Color(0.85, 0.32, 0.0, 0.6));
281    vt_map.Halo.Create("data/visuals/lights/sun_flare_light_main.lua", x, y + 2.0,
282        vt_video.Color(0.99, 1.0, 0.27, 0.1));
283end
284
285function _add_bubble(x, y)
286    local object = CreateObject(Map, "Bubble", x, y, vt_map.MapMode.GROUND_OBJECT);
287    object:RandomizeCurrentAnimationFrame();
288
289    vt_map.ParticleObject.Create("data/visuals/particle_effects/bubble_steam.lua", x, y, vt_map.MapMode.GROUND_OBJECT);
290end
291
292-- Special event references which destinations must be updated just before being called.
293-- shrine entrance event
294local kalya_move_next_to_bronann_event1 = nil
295local kalya_move_back_to_bronann_event1 = nil
296local orlinn_move_next_to_bronann_event1 = nil
297local orlinn_move_back_to_bronann_event1 = nil
298
299-- Creates all events and sets up the entire event sequence chain
300function _CreateEvents()
301    local event = nil
302    local dialogue = nil
303    local text = nil
304
305    vt_map.MapTransitionEvent.Create("to mountain shrine 1st floor", "data/story/mt_elbrus/mt_elbrus_shrine5_map.lua",
306                                     "data/story/mt_elbrus/mt_elbrus_shrine5_script.lua", "from_shrine_2nd_floor");
307
308    vt_map.MapTransitionEvent.Create("to mountain shrine 2nd floor", "data/story/mt_elbrus/mt_elbrus_shrine_2nd_ne_map.lua",
309                                     "data/story/mt_elbrus/mt_elbrus_shrine_2nd_ne_script.lua", "from_shrine_1st_floor");
310
311    vt_map.MapTransitionEvent.Create("to mountain shrine 2nd floor grotto", "data/story/mt_elbrus/mt_elbrus_shrine_2nd_s2_map.lua",
312                                     "data/story/mt_elbrus/mt_elbrus_shrine_2nd_s2_script.lua", "from_shrine_stairs");
313
314    vt_map.MapTransitionEvent.Create("to mountain shrine 3rd floor", "data/story/mt_elbrus/mt_elbrus_shrine_3rd_map.lua",
315                                     "data/story/mt_elbrus/mt_elbrus_shrine_3rd_script.lua", "from_shrine_stairs");
316
317    -- Heal point
318    vt_map.ScriptedEvent.Create("Heal event", "heal_party", "heal_done");
319
320    -- Generic events
321    vt_map.ChangeDirectionSpriteEvent.Create("Orlinn looks north", orlinn, vt_map.MapMode.NORTH);
322    vt_map.ChangeDirectionSpriteEvent.Create("Orlinn looks west", orlinn, vt_map.MapMode.WEST);
323    vt_map.ChangeDirectionSpriteEvent.Create("Orlinn looks south", orlinn, vt_map.MapMode.SOUTH);
324    vt_map.ChangeDirectionSpriteEvent.Create("Bronann looks north", bronann, vt_map.MapMode.NORTH);
325    vt_map.ChangeDirectionSpriteEvent.Create("Bronann looks south", bronann, vt_map.MapMode.SOUTH);
326    vt_map.ChangeDirectionSpriteEvent.Create("Kalya looks north", kalya, vt_map.MapMode.NORTH);
327    vt_map.ChangeDirectionSpriteEvent.Create("Kalya looks west", kalya, vt_map.MapMode.WEST);
328    vt_map.ChangeDirectionSpriteEvent.Create("Kalya looks south", kalya, vt_map.MapMode.SOUTH);
329    vt_map.LookAtSpriteEvent.Create("Kalya looks at Bronann", kalya, bronann);
330    vt_map.LookAtSpriteEvent.Create("Kalya looks at Orlinn", kalya, orlinn);
331    vt_map.LookAtSpriteEvent.Create("Bronann looks at Kalya", bronann, kalya);
332    vt_map.LookAtSpriteEvent.Create("Bronann looks at Orlinn", bronann, orlinn);
333    vt_map.LookAtSpriteEvent.Create("Orlinn looks at Kalya", orlinn, kalya);
334    vt_map.LookAtSpriteEvent.Create("Orlinn looks at Bronann", orlinn, bronann);
335
336    -- Kalya and Bronann are falling because of the smoke event
337    event = vt_map.PathMoveSpriteEvent.Create("The hero goes in front of the door", hero, 37, 11, false);
338    event:AddEventLinkAtEnd("Kalya and Bronann laughs event start");
339
340    event = vt_map.ScriptedEvent.Create("Kalya and Bronann laughs event start", "laughing_event_start", "");
341    event:AddEventLinkAtEnd("Kalya moves next to Bronann");
342    event:AddEventLinkAtEnd("Orlinn moves next to Bronann");
343
344    -- NOTE: The actual destination is set just before the actual start call
345    kalya_move_next_to_bronann_event1 = vt_map.PathMoveSpriteEvent.Create("Kalya moves next to Bronann", kalya, 0, 0, false);
346    kalya_move_next_to_bronann_event1:AddEventLinkAtEnd("Kalya looks north");
347
348    orlinn_move_next_to_bronann_event1 = vt_map.PathMoveSpriteEvent.Create("Orlinn moves next to Bronann", orlinn, 0, 0, false);
349    orlinn_move_next_to_bronann_event1:AddEventLinkAtEnd("Orlinn looks north");
350    orlinn_move_next_to_bronann_event1:AddEventLinkAtEnd("Choice to enter the big door", 500);
351
352    -- choice to enter
353    dialogue = vt_map.SpriteDialogue.Create();
354    text = vt_system.Translate("What a large gate. What is behind it must be fearsome.");
355    dialogue:AddLineEmote(text, bronann, "sweat drop");
356    text = vt_system.Translate("Shall we go in?");
357    dialogue:AddLine(text, kalya);
358    text = vt_system.Translate("Yes, let's end this.");
359    dialogue:AddOptionEvent(text, 2, "The heroes decide to go event");
360    text = vt_system.Translate("No, let's prepare first.");
361    dialogue:AddOptionEvent(text, "Kalya goes back to party2");
362    vt_map.DialogueEvent.Create("Choice to enter the big door", dialogue);
363
364    -- Chose not to enter event
365    event = vt_map.PathMoveSpriteEvent.Create("Kalya goes back to party2", kalya, bronann, false);
366    event:AddEventLinkAtStart("Orlinn goes back to party2");
367    event:AddEventLinkAtEnd("Hide Kalya and Orlinn");
368    event:AddEventLinkAtEnd("Bronann goes away from the door");
369
370    vt_map.PathMoveSpriteEvent.Create("Orlinn goes back to party2", orlinn, bronann, false);
371
372    vt_map.ScriptedEvent.Create("Hide Kalya and Orlinn", "hide_kalya_and_orlinn", "");
373
374    event = vt_map.PathMoveSpriteEvent.Create("Bronann goes away from the door", bronann, 37, 14, false);
375    event:AddEventLinkAtEnd("The heroes won't enter event");
376
377    vt_map.ScriptedEvent.Create("The heroes won't enter event", "heroes_wont_enter", "");
378
379    -- Chose to enter
380    vt_map.ScriptedEvent.Create("Kalya laughs", "kalya_laughs", "");
381
382    vt_map.ScriptedEvent.Create("Bronann laughs", "bronann_laughs", "");
383
384    -- A link event use to reset the dialogue state properly
385    event = vt_map.ScriptedEvent.Create("The heroes decide to go event", "empty_event", "");
386    event:AddEventLinkAtEnd("The heroes discuss about the big door");
387
388    dialogue = vt_map.SpriteDialogue.Create();
389    text = vt_system.Translate("Don't worry, we've managed to come this far. There is nothing that could...");
390    dialogue:AddLineEvent(text, kalya, "Kalya looks at Bronann", "Orlinn looks at Kalya");
391    text = vt_system.Translate("What is it, Kalya?");
392    dialogue:AddLineEventEmote(text, bronann, "", "Bronann looks at Kalya", "interrogation");
393    text = vt_system.Translate("...Kalya?!");
394    dialogue:AddLineEmote(text, bronann, "exclamation");
395    text = vt_system.Translate("Sis'!");
396    dialogue:AddLineEmote(text, orlinn, "exclamation");
397    text = vt_system.Translate("I feel... I...");
398    dialogue:AddLineEvent(text, kalya, "", "Kalya laughs");
399    text = vt_system.Translate("Hi hi... Hi hi hi... I can't stop!!");
400    dialogue:AddLineEvent(text, kalya, "Kalya laughs", "");
401    text = vt_system.Translate("What's so funny, Kalya? Hi hi.");
402    dialogue:AddLineEmote(text, bronann, "interrogation");
403    text = vt_system.Translate("I don't know... Ah, I can barely breathe!");
404    dialogue:AddLine(text, kalya);
405    text = vt_system.Translate("Hi hi hi... What's happening to me...");
406    dialogue:AddLineEvent(text, bronann, "", "Bronann laughs");
407    text = vt_system.Translate("It's the scent, ah ah ah.");
408    dialogue:AddLine(text, kalya);
409    text = vt_system.Translate("Erm, are you crazy or what? I usually am the one with bad jokes you know.");
410    dialogue:AddLineEmote(text, orlinn, "exclamation");
411    text = vt_system.Translate("We can't move Orlinn.");
412    dialogue:AddLine(text, kalya);
413    text = vt_system.Translate("We're gonna...suffocate.");
414    dialogue:AddLine(text, bronann);
415    text = vt_system.Translate("Orlinn, help us... Please, oh oh oh...");
416    dialogue:AddLine(text, kalya);
417    event = vt_map.DialogueEvent.Create("The heroes discuss about the big door", dialogue);
418    event:AddEventLinkAtEnd("Set camera on Orlinn");
419
420    event = vt_map.ScriptedEvent.Create("Set camera on Orlinn", "camera_on_orlinn_start", "camera_update");
421    event:AddEventLinkAtEnd("Laughing event end");
422
423    vt_map.ScriptedEvent.Create("Laughing event end", "laughing_event_end", "");
424
425    -- Orlinn can't go away
426    dialogue = vt_map.SpriteDialogue.Create();
427    text = vt_system.Translate("I can't let them die. I have to find out something.");
428    dialogue:AddLineEmote(text, orlinn, "thinking dots");
429    vt_map.DialogueEvent.Create("Orlinn can't go away dialogue", dialogue);
430
431    -- Heroes can't go to the boss throne
432    event = vt_map.ScriptedEvent.Create("Heroes can't go there...", "cant_go_in_start", "cant_go_in_update");
433    event:AddEventLinkAtEnd("The heroes can't go in dialogue");
434
435    dialogue = vt_map.SpriteDialogue.Create();
436    text = vt_system.Translate("Something is preventing me from entering.");
437    dialogue:AddLineEmote(text, bronann, "thinking dots");
438    event = vt_map.DialogueEvent.Create("The heroes can't go in dialogue", dialogue);
439    event:AddEventLinkAtEnd("Heroes can't go there - end");
440
441    vt_map.ScriptedEvent.Create("Heroes can't go there - end", "cant_go_in_end", "");
442
443    -- Heroes are saved event
444    vt_map.ScriptedEvent.Create("Orlinn laughs", "orlinn_laughs", "");
445
446    vt_map.ScriptedEvent.Create("Orlinn stops laughing", "orlinn_stops_laughing", "");
447
448    dialogue = vt_map.SpriteDialogue.Create();
449    text = vt_system.Translate("I feel much better now.");
450    dialogue:AddLineEmote(text, bronann, "thinking dots");
451    text = vt_system.Translate("Indeed. It seems the scent has no effect on us anymore.");
452    dialogue:AddLineEmote(text, kalya, "thinking dots");
453    text = vt_system.Translate("Orlinn, did you do something?");
454    dialogue:AddLineEventEmote(text, kalya, "Kalya looks at Orlinn", "Bronann looks at Orlinn", "exclamation");
455    text = vt_system.Translate("Me? You know, a bit of this, a bit of that.");
456    dialogue:AddLineEvent(text, orlinn, "Orlinn laughs", "");
457    text = vt_system.Translate("I didn't think I would say this, but thank you Orlinn.");
458    dialogue:AddLineEmote(text, kalya, "sweat drop");
459    text = vt_system.Translate("Thank you, indeed.");
460    dialogue:AddLine(text, bronann);
461    text = vt_system.Translate("You're welcome!");
462    dialogue:AddLine(text, orlinn);
463    text = vt_system.Translate("Well, please stop laughing now. I'm not at ease with what just happened.");
464    dialogue:AddLineEventEmote(text, kalya, "Kalya looks at Orlinn", "", "sweat drop");
465    text = vt_system.Translate("...");
466    dialogue:AddLineEmote(text, kalya, "sweat drop");
467    text = vt_system.Translate("Stop laughing now or I'll smash your little head against that wall!");
468    dialogue:AddLineEmote(text, kalya, "popping veins");
469    text = vt_system.Translate("Aww, ok.");
470    dialogue:AddLineEventEmote(text, orlinn, "Orlinn stops laughing", "", "sweat drop");
471    event = vt_map.DialogueEvent.Create("Orlinn saved the heroes", dialogue);
472    event:AddEventLinkAtEnd("Kalya goes back to party");
473    event:AddEventLinkAtEnd("Orlinn goes back to party");
474
475    vt_map.PathMoveSpriteEvent.Create("Kalya goes back to party", kalya, bronann, false);
476
477    event = vt_map.PathMoveSpriteEvent.Create("Orlinn goes back to party", orlinn, bronann, false);
478    event:AddEventLinkAtEnd("Orlinn saved the heroes event end");
479
480    vt_map.ScriptedEvent.Create("Orlinn saved the heroes event end", "saved_the_heroes_end", "");
481end
482
483-- zones
484local to_shrine_1st_floor_zone = nil
485local to_shrine_2nd_floor_zone = nil
486local to_shrine_2nd_floor_grotto_zone = nil
487local to_shrine_3rd_floor_zone = nil
488local before_3rd_floor_zone = nil
489
490-- Create the different map zones triggering events
491function _CreateZones()
492    -- N.B.: left, right, top, bottom
493    to_shrine_1st_floor_zone = vt_map.CameraZone.Create(9, 12, 36, 39);
494    to_shrine_2nd_floor_zone = vt_map.CameraZone.Create(59, 61, 36, 39);
495    to_shrine_2nd_floor_grotto_zone = vt_map.CameraZone.Create(9, 12, 14, 17);
496    to_shrine_3rd_floor_zone = vt_map.CameraZone.Create(34, 40, 5, 7);
497    before_3rd_floor_zone = vt_map.CameraZone.Create(28, 46, 7, 10);
498end
499
500-- Check whether the active camera has entered a zone. To be called within Update()
501function _CheckZones()
502    if (to_shrine_1st_floor_zone:IsCameraEntering() == true) then
503        hero:SetDirection(vt_map.MapMode.WEST);
504        EventManager:StartEvent("to mountain shrine 1st floor");
505    elseif (to_shrine_2nd_floor_zone:IsCameraEntering() == true) then
506        hero:SetDirection(vt_map.MapMode.NE_EAST);
507        EventManager:StartEvent("to mountain shrine 2nd floor");
508    elseif (to_shrine_2nd_floor_grotto_zone:IsCameraEntering() == true) then
509        if (GlobalManager:GetGameEvents():GetEventValue("story", "elbrus_shrine_laughing_event_done") == 0
510                or GlobalManager:GetGameEvents():GetEventValue("story", "mt elbrus shrine heroes saved") == 1) then
511            hero:SetDirection(vt_map.MapMode.WEST);
512            EventManager:StartEvent("to mountain shrine 2nd floor grotto");
513        else
514            -- Orlinn can't go away...
515            orlinn:SetMoving(false);
516            EventManager:StartEvent("Orlinn can't go away dialogue");
517        end
518    elseif (to_shrine_3rd_floor_zone:IsCameraEntering() == true) then
519        if (GlobalManager:GetGameEvents():GetEventValue("story", "mt elbrus shrine heroes saved") == 0) then
520            hero:SetDirection(vt_map.MapMode.NORTH);
521            EventManager:StartEvent("to mountain shrine 3rd floor");
522        else
523            EventManager:StartEvent("Heroes can't go there...");
524        end
525    elseif (before_3rd_floor_zone:IsCameraEntering() == true and Map:CurrentState() == vt_map.MapMode.STATE_EXPLORE) then
526        if (GlobalManager:GetGameEvents():GetEventValue("story", "mt elbrus shrine heroes saved") == 1) then
527            -- Do nothing in that case
528
529        elseif (GlobalManager:GetGameEvents():GetEventValue("triggers", "mt elbrus waterfall trigger") == 1) then
530            -- Start the scene where orlinn has just saved our heroes
531            Map:PushState(vt_map.MapMode.STATE_SCENE);
532            orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
533            bronann:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
534            kalya:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
535            EventManager:StartEvent("Orlinn saved the heroes");
536
537        elseif (GlobalManager:GetGameEvents():GetEventValue("story", "elbrus_shrine_laughing_event_done") == 0) then
538            -- Start the laughing scene
539            Map:PushState(vt_map.MapMode.STATE_SCENE);
540            EventManager:StartEvent("The hero goes in front of the door");
541        end
542    end
543end
544
545-- Effect time used when applying the heal light effect
546local heal_effect_time = 0;
547local heal_color = vt_video.Color(0.0, 0.0, 1.0, 1.0);
548
549local field_effect_time = 0;
550local field_color = vt_video.Color(0.0, 0.0, 0.0, 1.0);
551
552-- Map Custom functions
553-- Used through scripted events
554map_functions = {
555    heal_party = function()
556        hero:SetMoving(false);
557        -- Should be sufficient to heal anybody
558        local character_handler = GlobalManager:GetCharacterHandler()
559        character_handler:GetActiveParty():AddHitPoints(10000)
560        character_handler:GetActiveParty():AddSkillPoints(10000)
561        Map:SetStamina(10000)
562        Map:RemoveNegativeActiveStatusEffects()
563        AudioManager:PlaySound("data/sounds/heal_spell.wav");
564        heal_effect:SetPosition(hero:GetXPosition(), hero:GetYPosition());
565        heal_effect:Start();
566        heal_effect_time = 0;
567    end,
568
569    heal_done = function()
570        heal_effect_time = heal_effect_time + SystemManager:GetUpdateTime();
571
572        if (heal_effect_time < 300.0) then
573            heal_color:SetAlpha(heal_effect_time / 300.0 / 3.0);
574            Map:GetEffectSupervisor():EnableLightingOverlay(heal_color);
575            return false;
576        end
577
578        if (heal_effect_time < 1000.0) then
579            heal_color:SetAlpha(((1000.0 - heal_effect_time) / 700.0) / 3.0);
580            Map:GetEffectSupervisor():EnableLightingOverlay(heal_color);
581            return false;
582        end
583        return true;
584    end,
585
586    hide_kalya_and_orlinn = function()
587        kalya:SetPosition(0, 0);
588        kalya:SetVisible(false);
589        kalya:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
590        orlinn:SetPosition(0, 0);
591        orlinn:SetVisible(false);
592        orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
593    end,
594
595    heroes_wont_enter = function()
596        Map:PopState();
597
598        -- Make the player incarnate the default hero again
599        hero:SetPosition(bronann:GetXPosition(), bronann:GetYPosition())
600        hero:SetDirection(bronann:GetDirection())
601        Map:SetCamera(hero);
602
603        -- Reload the hero back to default
604        hero:SetVisible(true);
605        bronann:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
606        bronann:SetPosition(0, 0)
607        bronann:SetVisible(false)
608    end,
609
610    laughing_event_start = function()
611        hero:SetMoving(false);
612
613        kalya:SetPosition(hero:GetXPosition(), hero:GetYPosition());
614        kalya:SetVisible(true);
615        orlinn:SetPosition(hero:GetXPosition(), hero:GetYPosition());
616        orlinn:SetVisible(true);
617        kalya:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
618        orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
619        bronann:SetPosition(hero:GetXPosition(), hero:GetYPosition());
620        bronann:SetDirection(vt_map.MapMode.NORTH);
621        bronann:SetVisible(true);
622        hero:SetVisible(false);
623        Map:SetCamera(bronann);
624        hero:SetPosition(0, 0);
625
626        kalya_move_next_to_bronann_event1:SetDestination(bronann:GetXPosition() - 2.0, bronann:GetYPosition(), false);
627        orlinn_move_next_to_bronann_event1:SetDestination(bronann:GetXPosition() + 2.0, bronann:GetYPosition(), false);
628    end,
629
630    kalya_laughs = function()
631        kalya:SetCustomAnimation("laughing", 0); -- 0 means forever
632        AudioManager:FadeOutActiveMusic(1000); -- Remove the music
633    end,
634
635    bronann_laughs = function()
636        bronann:SetCustomAnimation("laughing", 0); -- 0 means forever
637    end,
638
639    orlinn_laughs = function()
640        orlinn:SetCustomAnimation("laughing", 0); -- 0 means forever
641        -- Adds funny music
642        AudioManager:PlayMusic("data/music/Zander Noriega - School of Quirks.ogg");
643    end,
644
645    orlinn_stops_laughing = function()
646        orlinn:DisableCustomAnimation();
647    end,
648
649    camera_on_orlinn_start = function()
650        Map:SetCamera(orlinn, 500);
651    end,
652
653    camera_update = function()
654        if (Map:IsCameraMoving() == true) then
655            return false;
656        end
657        return true;
658    end,
659
660    laughing_event_end = function()
661        -- Set the event as done
662        GlobalManager:GetGameEvents():SetEventValue("story", "elbrus_shrine_laughing_event_done", 1);
663        orlinn:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
664        bronann:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
665        kalya:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
666        Map:PopState();
667        -- Prevent from healing the team when being Orlinn
668        layna_statue:ClearEventWhenTalking();
669        -- Disable save point
670        Map:SetMapPointsEnabled(false);
671        -- Make Bronann and Kalya repeat on need
672        _UpdateKalyaBronannDialogue();
673
674        -- The menu and status effects are then disabled.
675        Map:SetMenuEnabled(false);
676        Map:SetStatusEffectsEnabled(false);
677    end,
678
679    cant_go_in_start = function()
680        Map:PushState(vt_map.MapMode.STATE_SCENE);
681        hero:SetMoving(false);
682        field_effect_time = 0;
683    end,
684
685    cant_go_in_update = function()
686        field_effect_time = field_effect_time + SystemManager:GetUpdateTime();
687
688        if (field_effect_time < 300.0) then
689            field_color:SetAlpha(field_effect_time / 300.0 / 2.0);
690            Map:GetEffectSupervisor():EnableLightingOverlay(field_color);
691            return false;
692        end
693
694        if (field_effect_time < 1000.0) then
695            field_color:SetAlpha(((1000.0 - field_effect_time) / 700.0) / 2.0);
696            Map:GetEffectSupervisor():EnableLightingOverlay(field_color);
697            return false;
698        end
699        return true;
700    end,
701
702    cant_go_in_end = function()
703        Map:PopState();
704    end,
705
706    saved_the_heroes_end = function()
707        Map:PopState();
708
709        -- Make the player incarnate the default hero again
710        hero:SetPosition(bronann:GetXPosition(), bronann:GetYPosition())
711        Map:SetCamera(hero, 500);
712
713        -- Reload the hero back to default
714        hero:SetVisible(true);
715        bronann:SetCollisionMask(vt_map.MapMode.ALL_COLLISION);
716
717        bronann:SetPosition(0, 0);
718        bronann:SetVisible(false);
719        bronann:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
720        kalya:SetPosition(0, 0);
721        kalya:SetVisible(false);
722        kalya:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
723        orlinn:SetPosition(0, 0);
724        orlinn:SetVisible(false);
725        orlinn:SetCollisionMask(vt_map.MapMode.NO_COLLISION);
726
727        -- Re-enable save point
728        Map:SetMapPointsEnabled(true);
729        layna_statue:SetEventWhenTalking("Heal dialogue");
730
731        -- The menu and status effects are enabled.
732        Map:SetMenuEnabled(true);
733        Map:SetStatusEffectsEnabled(true);
734
735        -- Set event as done
736        GlobalManager:GetGameEvents():SetEventValue("story", "mt elbrus shrine heroes saved", 1)
737
738        -- Fade in the default music
739        AudioManager:PlayMusic("data/music/icy_wind.ogg");
740    end,
741
742    empty_event = function()
743    end,
744}
745