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