diff --git a/core/src/main/assets/music/caves_boss_finale.ogg b/core/src/main/assets/music/caves_boss_finale.ogg new file mode 100644 index 000000000..3c9fd5637 Binary files /dev/null and b/core/src/main/assets/music/caves_boss_finale.ogg differ diff --git a/core/src/main/assets/music/city_boss_finale.ogg b/core/src/main/assets/music/city_boss_finale.ogg new file mode 100644 index 000000000..c5826bf0b Binary files /dev/null and b/core/src/main/assets/music/city_boss_finale.ogg differ diff --git a/core/src/main/assets/music/halls_boss_finale.ogg b/core/src/main/assets/music/halls_boss_finale.ogg new file mode 100644 index 000000000..2bf8a3a52 Binary files /dev/null and b/core/src/main/assets/music/halls_boss_finale.ogg differ diff --git a/core/src/main/assets/music/theme_finale.ogg b/core/src/main/assets/music/theme_finale.ogg new file mode 100644 index 000000000..4fd967ab8 Binary files /dev/null and b/core/src/main/assets/music/theme_finale.ogg differ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java index 480900aa6..6dca8f351 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -113,33 +113,37 @@ public class Assets { } public static class Music { - public static final String THEME_1 = "music/theme_1.ogg"; - public static final String THEME_2 = "music/theme_2.ogg"; + public static final String THEME_1 = "music/theme_1.ogg"; + public static final String THEME_2 = "music/theme_2.ogg"; + public static final String THEME_FINALE = "music/theme_finale.ogg"; - public static final String SEWERS_1 = "music/sewers_1.ogg"; - public static final String SEWERS_2 = "music/sewers_2.ogg"; - public static final String SEWERS_TENSE = "music/sewers_tense.ogg"; - public static final String SEWERS_BOSS = "music/sewers_boss.ogg"; + public static final String SEWERS_1 = "music/sewers_1.ogg"; + public static final String SEWERS_2 = "music/sewers_2.ogg"; + public static final String SEWERS_TENSE = "music/sewers_tense.ogg"; + public static final String SEWERS_BOSS = "music/sewers_boss.ogg"; - public static final String PRISON_1 = "music/prison_1.ogg"; - public static final String PRISON_2 = "music/prison_2.ogg"; - public static final String PRISON_TENSE = "music/prison_tense.ogg"; - public static final String PRISON_BOSS = "music/prison_boss.ogg"; + public static final String PRISON_1 = "music/prison_1.ogg"; + public static final String PRISON_2 = "music/prison_2.ogg"; + public static final String PRISON_TENSE = "music/prison_tense.ogg"; + public static final String PRISON_BOSS = "music/prison_boss.ogg"; - public static final String CAVES_1 = "music/caves_1.ogg"; - public static final String CAVES_2 = "music/caves_2.ogg"; - public static final String CAVES_TENSE = "music/caves_tense.ogg"; - public static final String CAVES_BOSS = "music/caves_boss.ogg"; + public static final String CAVES_1 = "music/caves_1.ogg"; + public static final String CAVES_2 = "music/caves_2.ogg"; + public static final String CAVES_TENSE = "music/caves_tense.ogg"; + public static final String CAVES_BOSS = "music/caves_boss.ogg"; + public static final String CAVES_BOSS_FINALE = "music/caves_boss_finale.ogg"; - public static final String CITY_1 = "music/city_1.ogg"; - public static final String CITY_2 = "music/city_2.ogg"; - public static final String CITY_TENSE = "music/city_tense.ogg"; - public static final String CITY_BOSS = "music/city_boss.ogg"; + public static final String CITY_1 = "music/city_1.ogg"; + public static final String CITY_2 = "music/city_2.ogg"; + public static final String CITY_TENSE = "music/city_tense.ogg"; + public static final String CITY_BOSS = "music/city_boss.ogg"; + public static final String CITY_BOSS_FINALE = "music/city_boss_finale.ogg"; - public static final String HALLS_1 = "music/halls_1.ogg"; - public static final String HALLS_2 = "music/halls_2.ogg"; - public static final String HALLS_TENSE = "music/halls_tense.ogg"; - public static final String HALLS_BOSS = "music/halls_boss.ogg"; + public static final String HALLS_1 = "music/halls_1.ogg"; + public static final String HALLS_2 = "music/halls_2.ogg"; + public static final String HALLS_TENSE = "music/halls_tense.ogg"; + public static final String HALLS_BOSS = "music/halls_boss.ogg"; + public static final String HALLS_BOSS_FINALE = "music/halls_boss_finale.ogg"; } public static class Sounds { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java index bf734aaef..8d0707a63 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java @@ -65,9 +65,12 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300Sprite; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; import com.watabou.utils.GameMath; import com.watabou.utils.PathFinder; import com.watabou.utils.Point; @@ -538,6 +541,17 @@ public class DM300 extends Mob { } else { yell(Messages.get(this, "pylons_destroyed")); BossHealthBar.bleed(true); + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + Music.INSTANCE.fadeOut(0.5f, new Callback() { + @Override + public void call() { + Music.INSTANCE.play(Assets.Music.CAVES_BOSS_FINALE, true); + } + }); + } + }); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java index 66c2ef254..f0715b494 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java @@ -60,9 +60,12 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.KingSprite; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; import com.watabou.utils.Reflection; @@ -506,6 +509,18 @@ public class DwarfKing extends Mob { sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 ); Sample.INSTANCE.play( Assets.Sounds.CHALLENGE ); yell( Messages.get(this, "enraged", Dungeon.hero.name()) ); + BossHealthBar.bleed(true); + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + Music.INSTANCE.fadeOut(0.5f, new Callback() { + @Override + public void call() { + Music.INSTANCE.play(Assets.Music.CITY_BOSS_FINALE, true); + } + }); + } + }); } else if (phase == 3 && preHP > 20 && HP < 20){ yell( Messages.get(this, "losing") ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java index 86109d33d..7cfdb3ffa 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java @@ -195,6 +195,17 @@ public class YogDzewa extends Mob { summonCooldown = -15; //summon a burst of minions! phase = 5; BossHealthBar.bleed(true); + Game.runOnRenderThread(new Callback() { + @Override + public void call() { + Music.INSTANCE.fadeOut(0.5f, new Callback() { + @Override + public void call() { + Music.INSTANCE.play(Assets.Music.HALLS_BOSS_FINALE, true); + } + }); + } + }); } if (phase == 0){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CavesBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CavesBossLevel.java index 27540e5bd..ee3e5d0a9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CavesBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CavesBossLevel.java @@ -50,6 +50,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.PylonSprite; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; +import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.Game; import com.watabou.noosa.Group; @@ -77,7 +78,11 @@ public class CavesBossLevel extends Level { @Override public void playLevelMusic() { if (locked){ - Music.INSTANCE.play(Assets.Music.CAVES_BOSS, true); + if (BossHealthBar.isBleeding()){ + Music.INSTANCE.play(Assets.Music.CAVES_BOSS_FINALE, true); + } else { + Music.INSTANCE.play(Assets.Music.CAVES_BOSS, true); + } //if wall isn't broken } else if (map[14 + 13*width()] == Terrain.CUSTOM_DECO){ Music.INSTANCE.end(); @@ -347,7 +352,12 @@ public class CavesBossLevel extends Level { Game.runOnRenderThread(new Callback() { @Override public void call() { - Music.INSTANCE.end(); + Music.INSTANCE.fadeOut(3f, new Callback() { + @Override + public void call() { + Music.INSTANCE.end(); + } + }); } }); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CityBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CityBossLevel.java index 3f83fc747..badde4d35 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CityBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CityBossLevel.java @@ -39,6 +39,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.ImpShopRoo import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap; +import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.watabou.noosa.Game; import com.watabou.noosa.Group; import com.watabou.noosa.Tilemap; @@ -88,7 +89,11 @@ public class CityBossLevel extends Level { @Override public void playLevelMusic() { if (locked){ - Music.INSTANCE.play(Assets.Music.CITY_BOSS, true); + if (BossHealthBar.isBleeding()){ + Music.INSTANCE.play(Assets.Music.CITY_BOSS_FINALE, true); + } else { + Music.INSTANCE.play(Assets.Music.CITY_BOSS, true); + } //if top door isn't unlocked } else if (map[topDoor] == Terrain.LOCKED_DOOR){ Music.INSTANCE.end(); @@ -354,7 +359,12 @@ public class CityBossLevel extends Level { Game.runOnRenderThread(new Callback() { @Override public void call() { - Music.INSTANCE.end(); + Music.INSTANCE.fadeOut(3f, new Callback() { + @Override + public void call() { + Music.INSTANCE.end(); + } + }); } }); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/HallsBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/HallsBossLevel.java index 1dcb21d79..d2fcbacec 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/HallsBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/HallsBossLevel.java @@ -47,6 +47,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap; +import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; import com.watabou.noosa.Game; import com.watabou.noosa.Group; @@ -79,9 +80,13 @@ public class HallsBossLevel extends Level { @Override public void playLevelMusic() { if (locked){ - Music.INSTANCE.play(Assets.Music.HALLS_BOSS, true); + if (BossHealthBar.isBleeding()){ + Music.INSTANCE.play(Assets.Music.HALLS_BOSS_FINALE, true); + } else { + Music.INSTANCE.play(Assets.Music.HALLS_BOSS, true); + } //if exit isn't unlocked - } else if (map[exit()] != Terrain.EXIT){ + } else if (map[exit()] != Terrain.EXIT || Statistics.amuletObtained){ Music.INSTANCE.end(); } else { Music.INSTANCE.playTracks( @@ -298,7 +303,12 @@ public class HallsBossLevel extends Level { Game.runOnRenderThread(new Callback() { @Override public void call() { - Music.INSTANCE.end(); + Music.INSTANCE.fadeOut(3f, new Callback() { + @Override + public void call() { + Music.INSTANCE.play(Assets.Music.THEME_FINALE, true); + } + }); } }); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LastLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LastLevel.java index beacb716c..af266924e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LastLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LastLevel.java @@ -54,7 +54,11 @@ public class LastLevel extends Level { @Override public void playLevelMusic() { - Music.INSTANCE.end(); + if (Statistics.amuletObtained) { + Music.INSTANCE.end(); + } else { + Music.INSTANCE.play(Assets.Music.THEME_FINALE, true); + } } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java index 46e885ce9..fa507b66a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/PrisonBossLevel.java @@ -536,7 +536,12 @@ public class PrisonBossLevel extends Level { Game.runOnRenderThread(new Callback() { @Override public void call() { - Music.INSTANCE.end(); + Music.INSTANCE.fadeOut(3f, new Callback() { + @Override + public void call() { + Music.INSTANCE.end(); + } + }); } }); break; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java index 2c9a94861..9b2b22a73 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java @@ -204,7 +204,12 @@ public class SewerBossLevel extends SewerLevel { Game.runOnRenderThread(new Callback() { @Override public void call() { - Music.INSTANCE.end(); + Music.INSTANCE.fadeOut(3f, new Callback() { + @Override + public void call() { + Music.INSTANCE.end(); + } + }); } }); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerLevel.java index 63ef02fa1..de8cda0e3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerLevel.java @@ -68,7 +68,11 @@ public class SewerLevel extends RegularLevel { public void playLevelMusic(){ if (Ghost.Quest.active() || Statistics.amuletObtained){ - Music.INSTANCE.play(Assets.Music.SEWERS_TENSE, true); + if (Statistics.amuletObtained && Dungeon.depth == 1){ + Music.INSTANCE.play(Assets.Music.THEME_FINALE, true); + } else { + Music.INSTANCE.play(Assets.Music.SEWERS_TENSE, true); + } } else { Music.INSTANCE.playTracks( new String[]{Assets.Music.SEWERS_1, Assets.Music.SEWERS_2, Assets.Music.SEWERS_2}, diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AmuletScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AmuletScene.java index 91d6fdaa1..db4e1a15e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AmuletScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AmuletScene.java @@ -38,6 +38,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; import com.watabou.noosa.Camera; import com.watabou.noosa.Game; import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Music; import com.watabou.noosa.tweeners.Delayer; import com.watabou.utils.Random; @@ -95,6 +96,10 @@ public class AmuletScene extends PixelScene { } } }); + Music.INSTANCE.playTracks( + new String[]{Assets.Music.THEME_2, Assets.Music.THEME_1}, + new float[]{1, 1}, + false); } }; btnExit.icon(new ItemSprite(ItemSpriteSheet.AMULET)); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java index 5cefbe41d..8f489dbe8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java @@ -21,7 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; -import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Rankings; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; @@ -42,7 +41,6 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndRanking; import com.watabou.noosa.BitmapText; import com.watabou.noosa.Camera; import com.watabou.noosa.Image; -import com.watabou.noosa.audio.Music; import com.watabou.utils.GameMath; public class RankingsScene extends PixelScene { @@ -61,11 +59,6 @@ public class RankingsScene extends PixelScene { super.create(); - Music.INSTANCE.playTracks( - new String[]{Assets.Music.THEME_1, Assets.Music.THEME_2}, - new float[]{1, 1}, - false); - uiCamera.visible = false; int w = Camera.main.width; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java index 2afb1615c..5a614df86 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java @@ -220,4 +220,8 @@ public class BossHealthBar extends Component { bleeding = value; } + public static boolean isBleeding(){ + return bleeding; + } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java index 527b88c7a..188c6a356 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGame.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; @@ -35,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Music; import java.io.IOException; @@ -91,6 +93,10 @@ public class WndGame extends Window { @Override protected void onClick() { InterlevelScene.mode = InterlevelScene.Mode.DESCEND; + Music.INSTANCE.playTracks( + new String[]{Assets.Music.THEME_1, Assets.Music.THEME_2}, + new float[]{1, 1}, + false); Game.switchScene( RankingsScene.class ); } } ); diff --git a/ios/assets/music/caves_boss_finale.mp3 b/ios/assets/music/caves_boss_finale.mp3 new file mode 100644 index 000000000..ca23d692a Binary files /dev/null and b/ios/assets/music/caves_boss_finale.mp3 differ diff --git a/ios/assets/music/city_boss_finale.mp3 b/ios/assets/music/city_boss_finale.mp3 new file mode 100644 index 000000000..8f743c300 Binary files /dev/null and b/ios/assets/music/city_boss_finale.mp3 differ diff --git a/ios/assets/music/halls_boss_finale.mp3 b/ios/assets/music/halls_boss_finale.mp3 new file mode 100644 index 000000000..00a2a5052 Binary files /dev/null and b/ios/assets/music/halls_boss_finale.mp3 differ diff --git a/ios/assets/music/theme_finale.mp3 b/ios/assets/music/theme_finale.mp3 new file mode 100644 index 000000000..fd7bb8277 Binary files /dev/null and b/ios/assets/music/theme_finale.mp3 differ