1-- Set the namespace
2local ns = {};
3setmetatable(ns, {__index = _G});
4fenrir_death = ns;
5setfenv(1, ns);
6
7-- local references
8local enemy = nil
9local enemy_pos_x = 0.0;
10local enemy_pos_y = 0.0;
11local enemy_origin_x = 0.0;
12local enemy_origin_y = 0.0;
13
14local elapsed_time = 0;
15
16local Battle = nil
17local Script = nil
18local Effects = nil
19
20local light1_image = 0;
21local light2_image = 0;
22local light3_image = 0;
23
24local lightning_1_triggered = false;
25local lightning_1_stopped = false;
26local lightning_2_triggered = false;
27local lightning_2_stopped = false;
28local lightning_3_triggered = false;
29local lightning_3_stopped = false;
30
31local death_particles_triggered = false;
32local rumble_triggered = false;
33
34-- battle, the Game mode
35-- _enemy, the BattleEnemy dying
36function Initialize(battle, _enemy)
37    -- Keep the reference in memory
38    Battle = battle;
39    enemy = _enemy;
40    Script = Battle:GetScriptSupervisor();
41    Effects = Battle:GetEffectSupervisor();
42
43    enemy_pos_x = 0.0;
44    enemy_pos_y = 0.0;
45    enemy_origin_x = enemy:GetXLocation();
46    enemy_origin_y = enemy:GetYLocation();
47
48    elapsed_time = 0;
49
50    lightning_1_triggered = false;
51    lightning_2_triggered = false;
52    lightning_3_triggered = false;
53    lightning_1_stopped = false;
54    lightning_2_stopped = false;
55    lightning_3_stopped = false;
56
57    death_particles_triggered = false;
58    rumble_triggered = false;
59
60    light1_image = Script:CreateImage("data/battles/enemies_animations/fenrir/death_light_1.png");
61    light2_image = Script:CreateImage("data/battles/enemies_animations/fenrir/death_light_2.png");
62    light3_image = Script:CreateImage("data/battles/enemies_animations/fenrir/death_light_3.png");
63
64    -- Fade out the battle music to make the event more dramatic
65    AudioManager:FadeOutActiveMusic(2000);
66end
67
68local white_color = vt_video.Color(1.0, 1.0, 1.0, 1.0);
69local overlay_color = vt_video.Color(1.0, 1.0, 1.0, 1.0);
70
71function Update()
72
73    enemy_pos_x = enemy_origin_x;
74    enemy_pos_y = enemy_origin_y;
75
76    -- Make the enemy shake while dying
77    if (rumble_triggered == true) then
78        enemy:SetXLocation(enemy_pos_x + (math.random() * 6.0) - 3.0);
79    end
80
81    elapsed_time = elapsed_time + SystemManager:GetUpdateTime();
82
83    if (lightning_1_triggered == false and elapsed_time > 800) then
84        Effects:EnableLightingOverlay(white_color);
85        AudioManager:PlaySound("data/sounds/magic_blast.ogg");
86        lightning_1_triggered = true;
87    elseif (lightning_1_stopped == false and elapsed_time > 1000 ) then
88        Effects:DisableLightingOverlay();
89        lightning_1_stopped = true;
90    end
91
92    if (lightning_2_triggered == false and elapsed_time > 1700) then
93        Effects:EnableLightingOverlay(white_color);
94        AudioManager:PlaySound("data/sounds/magic_blast.ogg");
95        lightning_2_triggered = true;
96    elseif (lightning_2_stopped == false and elapsed_time > 1900 ) then
97        Effects:DisableLightingOverlay();
98        lightning_2_stopped = true;
99    end
100
101    if (lightning_3_triggered == false and elapsed_time > 3000) then
102        Effects:EnableLightingOverlay(white_color);
103        AudioManager:PlaySound("data/sounds/magic_blast.ogg");
104        lightning_3_triggered = true;
105    elseif (lightning_3_stopped == false and elapsed_time > 3400) then
106        Effects:DisableLightingOverlay();
107        lightning_3_stopped = true;
108    end
109
110    if (elapsed_time >= 4000 and elapsed_time < 8000) then
111        overlay_color:SetAlpha(0.7 * (elapsed_time - 4000.0) / (8000.0 - 4000.0));
112        Effects:EnableLightingOverlay(overlay_color);
113
114        -- Trigger the rumble and sprite shaking
115        if (rumble_triggered == false) then
116            AudioManager:PlaySound("data/sounds/rumble.wav");
117            rumble_triggered = true;
118        end
119    elseif (elapsed_time >= 8000 and elapsed_time < 10000) then
120        overlay_color:SetAlpha(1.0 - (elapsed_time - 8000.0) / (10000.0 - 8000.0));
121        Effects:EnableLightingOverlay(overlay_color);
122    end
123
124    -- Triggers snow representing the boss body ashes...
125    if (death_particles_triggered == false and elapsed_time > 8000) then
126        -- Make the wolf howls at the end
127        AudioManager:PlaySound("data/sounds/wolf_howl.ogg");
128
129        Battle:TriggerBattleParticleEffect("data/visuals/particle_effects/boss_death_particle.lua",
130                                           enemy_pos_x + 200, enemy_pos_y - 255);
131        Battle:TriggerBattleParticleEffect("data/visuals/particle_effects/boss_death_particle.lua",
132                                           enemy_pos_x - 185, enemy_pos_y - 321);
133        Battle:TriggerBattleParticleEffect("data/visuals/particle_effects/boss_death_particle.lua",
134                                           enemy_pos_x - 146, enemy_pos_y - 149);
135        Battle:TriggerBattleParticleEffect("data/visuals/particle_effects/boss_death_particle.lua",
136                                           enemy_pos_x + 55, enemy_pos_y - 140);
137        death_particles_triggered = true;
138    end
139
140    if (elapsed_time >= 7000 and elapsed_time <= 9000.0) then
141        -- Also fade out the enemy
142        enemy:SetSpriteAlpha(1.0 - ((elapsed_time - 7000.0) / (9000.0 - 7000.0)));
143    end
144
145    -- end the boss death sequence
146    if (elapsed_time > 13000) then
147        return true;
148    end
149
150    return false;
151end
152
153local light1_color = vt_video.Color(1.0, 1.0, 1.0, 1.0);
154local light2_color = vt_video.Color(1.0, 1.0, 1.0, 1.0);
155local light3_color = vt_video.Color(1.0, 1.0, 1.0, 1.0);
156
157function DrawOnSprite()
158    if (elapsed_time < 7800) then
159        light1_color:SetAlpha(0.5 * elapsed_time / 4000.0);
160        VideoManager:Move(enemy_pos_x, enemy_pos_y + 30);
161        light2_image:Draw(light1_color);
162    end
163    if (elapsed_time >= 3000 and elapsed_time < 7800) then
164        light2_color:SetAlpha(0.5 * (elapsed_time - 3000.0) / (7800.0 - 3000.0));
165        VideoManager:Move(enemy_pos_x, enemy_pos_y + 30);
166        light1_image:Draw(light2_color);
167    end
168    if (elapsed_time >= 7800 and elapsed_time < 10000) then
169        light3_color:SetAlpha(0.5 - 0.5 * ((elapsed_time - 8000.0) / (9000.0 - 8000.0)));
170        VideoManager:Move(enemy_pos_x, enemy_pos_y + 30);
171        light3_image:Draw(light3_color);
172    end
173end
174