Reimplemented switching to repair & monster music types (now handled by SoundPlayer)

This commit is contained in:
Joonas Rikkonen
2017-08-23 14:42:24 +03:00
parent f9504d0d76
commit 2d1c00546f
3 changed files with 111 additions and 41 deletions
@@ -349,7 +349,7 @@ namespace Barotrauma
} }
else if (hasLoaded) else if (hasLoaded)
{ {
SoundPlayer.Update(); SoundPlayer.Update((float)Timing.Step);
if (PlayerInput.KeyHit(Keys.Escape)) GUI.TogglePauseMenu(); if (PlayerInput.KeyHit(Keys.Escape)) GUI.TogglePauseMenu();
@@ -1,4 +1,5 @@
using Barotrauma.Sounds; using Barotrauma.Items.Components;
using Barotrauma.Sounds;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -59,13 +60,16 @@ namespace Barotrauma
//music //music
public static float MusicVolume = 1.0f; public static float MusicVolume = 1.0f;
private const float MusicLerpSpeed = 0.1f; private const float MusicLerpSpeed = 1.0f;
private const float UpdateMusicInterval = 5.0f;
private static BackgroundMusic currentMusic; private static BackgroundMusic currentMusic;
private static BackgroundMusic targetMusic; private static BackgroundMusic targetMusic;
private static BackgroundMusic[] musicClips; private static BackgroundMusic[] musicClips;
private static float currMusicVolume; private static float currMusicVolume;
private static float updateMusicTimer;
//ambience //ambience
private static Sound[] waterAmbiences = new Sound[2]; private static Sound[] waterAmbiences = new Sound[2];
private static int[] waterAmbienceIndexes = new int[2]; private static int[] waterAmbienceIndexes = new int[2];
@@ -187,9 +191,9 @@ namespace Barotrauma
} }
public static void Update() public static void Update(float deltaTime)
{ {
UpdateMusic(); UpdateMusic(deltaTime);
if (startDrone != null && !startDrone.IsPlaying) if (startDrone != null && !startDrone.IsPlaying)
{ {
@@ -284,29 +288,34 @@ namespace Barotrauma
if (sound != null) sound.Play(volume, range, position); if (sound != null) sound.Play(volume, range, position);
} }
private static void UpdateMusic() private static void UpdateMusic(float deltaTime)
{ {
if (musicClips == null) return; if (musicClips == null) return;
List<BackgroundMusic> suitableMusic = GetSuitableMusicClips(); updateMusicTimer -= deltaTime;
if (updateMusicTimer <= 0.0f)
if (suitableMusic.Count == 0)
{ {
targetMusic = null; List<BackgroundMusic> suitableMusic = GetSuitableMusicClips();
}
else if (!suitableMusic.Contains(currentMusic))
{
int index = Rand.Int(suitableMusic.Count);
if (currentMusic == null || suitableMusic[index].file != currentMusic.file) if (suitableMusic.Count == 0)
{ {
targetMusic = suitableMusic[index]; targetMusic = null;
} }
else if (!suitableMusic.Contains(currentMusic))
{
int index = Rand.Int(suitableMusic.Count);
if (currentMusic == null || suitableMusic[index].file != currentMusic.file)
{
targetMusic = suitableMusic[index];
}
}
updateMusicTimer = UpdateMusicInterval;
} }
if (targetMusic == null || currentMusic == null || targetMusic.file != currentMusic.file) if (targetMusic == null || currentMusic == null || targetMusic.file != currentMusic.file)
{ {
currMusicVolume = MathHelper.Lerp(currMusicVolume, 0.0f, MusicLerpSpeed); currMusicVolume = MathHelper.Lerp(currMusicVolume, 0.0f, MusicLerpSpeed * deltaTime);
if (currentMusic != null) Sound.StreamVolume(currMusicVolume); if (currentMusic != null) Sound.StreamVolume(currMusicVolume);
if (currMusicVolume < 0.01f) if (currMusicVolume < 0.01f)
@@ -327,7 +336,7 @@ namespace Barotrauma
} }
else else
{ {
currMusicVolume = MathHelper.Lerp(currMusicVolume, MusicVolume, MusicLerpSpeed); currMusicVolume = MathHelper.Lerp(currMusicVolume, MusicVolume, MusicLerpSpeed * deltaTime);
Sound.StreamVolume(currMusicVolume); Sound.StreamVolume(currMusicVolume);
} }
} }
@@ -344,35 +353,86 @@ namespace Barotrauma
private static List<BackgroundMusic> GetSuitableMusicClips() private static List<BackgroundMusic> GetSuitableMusicClips()
{ {
string musicType = GetCurrentMusicType();
return musicClips.Where(music => music != null && music.type == musicType).ToList();
}
Submarine targetSubmarine = null; private static string GetCurrentMusicType()
if (Character.Controlled != null) {
{ if (OverrideMusicType != null) return OverrideMusicType;
targetSubmarine = Character.Controlled.Submarine;
}
string musicType = "default"; if (Character.Controlled != null &&
if (OverrideMusicType != null)
{
musicType = OverrideMusicType;
}
else if (Character.Controlled != null &&
Level.Loaded != null && Level.Loaded.Ruins != null && Level.Loaded != null && Level.Loaded.Ruins != null &&
Level.Loaded.Ruins.Any(r => r.Area.Contains(Character.Controlled.WorldPosition))) Level.Loaded.Ruins.Any(r => r.Area.Contains(Character.Controlled.WorldPosition)))
{ {
musicType = "ruins"; return "ruins";
}
else if ((targetSubmarine != null && targetSubmarine.AtDamageDepth) ||
(Screen.Selected == GameMain.GameScreen && GameMain.GameScreen.Cam.Position.Y < SubmarineBody.DamageDepth))
{
musicType = "deep";
}
else if (targetSubmarine != null)
{
//TODO: determine whether to switch to monster or repair musictype
} }
return musicClips.Where(music => music != null && music.type == musicType).ToList(); Submarine targetSubmarine = Character.Controlled?.Submarine;
if ((targetSubmarine != null && targetSubmarine.AtDamageDepth) ||
(Screen.Selected == GameMain.GameScreen && GameMain.GameScreen.Cam.Position.Y < SubmarineBody.DamageDepth))
{
return "deep";
}
if (targetSubmarine != null)
{
List<Reactor> reactors = new List<Reactor>();
foreach (Item item in Item.ItemList)
{
if (item.Submarine != targetSubmarine) continue;
var reactor = item.GetComponent<Reactor>();
if (reactor != null)
{
reactors.Add(reactor);
}
}
if (reactors.All(r => r.Temperature < 1.0f)) return "repair";
float floodedArea = 0.0f;
float totalArea = 0.0f;
foreach (Hull hull in Hull.hullList)
{
if (hull.Submarine != targetSubmarine) continue;
floodedArea += hull.Volume;
totalArea += hull.FullVolume;
}
if (totalArea > 0.0f && floodedArea / totalArea > 0.25f) return "repair";
}
float enemyDistThreshold = 5000.0f;
if (targetSubmarine != null)
{
enemyDistThreshold = Math.Max(enemyDistThreshold, Math.Max(targetSubmarine.Borders.Width, targetSubmarine.Borders.Height) * 2.0f);
}
foreach (Character character in Character.CharacterList)
{
EnemyAIController enemyAI = character.AIController as EnemyAIController;
if (enemyAI == null || (enemyAI.AttackHumans < 0.0f && enemyAI.AttackRooms < 0.0f)) continue;
if (targetSubmarine != null)
{
if (Vector2.DistanceSquared(character.WorldPosition, targetSubmarine.WorldPosition) < enemyDistThreshold * enemyDistThreshold)
{
return "monster";
}
}
else if (Character.Controlled != null)
{
if (Vector2.DistanceSquared(character.WorldPosition, Character.Controlled.WorldPosition) < enemyDistThreshold * enemyDistThreshold)
{
return "monster";
}
}
}
return "default";
} }
public static void PlaySplashSound(Vector2 worldPosition, float strength) public static void PlaySplashSound(Vector2 worldPosition, float strength)
@@ -65,6 +65,16 @@ namespace Barotrauma
get { return selectedAiTarget; } get { return selectedAiTarget; }
} }
public float AttackHumans
{
get { return attackHumans; }
}
public float AttackRooms
{
get { return attackRooms; }
}
public EnemyAIController(Character c, string file) : base(c) public EnemyAIController(Character c, string file) : base(c)
{ {
targetMemories = new Dictionary<AITarget, AITargetMemory>(); targetMemories = new Dictionary<AITarget, AITargetMemory>();