Skip to content

Commit 65bccf1

Browse files
authored
Merge pull request #185 from EverestAPI/speed_music_param_trigger
Speed-Based Music Param Trigger
2 parents 57b3aec + 514906a commit 65bccf1

File tree

5 files changed

+93
-0
lines changed

5 files changed

+93
-0
lines changed

Ahorn/lang/en_gb.lang

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,3 +283,9 @@ placements.triggers.SpringCollab2020/CameraCatchupSpeedTrigger.tooltips.catchupS
283283
placements.triggers.SpringCollab2020/ColorGradeFadeTrigger.tooltips.colorGradeA=The color grade to fade from.
284284
placements.triggers.SpringCollab2020/ColorGradeFadeTrigger.tooltips.colorGradeB=The color grade to fade to.
285285
placements.triggers.SpringCollab2020/ColorGradeFadeTrigger.tooltips.direction=The direction of the fade. For example, if set to LeftToRight, the color grade will fade from color grade A to color grade B when the player crosses the trigger from left to right.
286+
287+
# Speed-Based Music Param Trigger
288+
placements.triggers.SpringCollab2020/SpeedBasedMusicParamTrigger.tooltips.paramName=The name of the music parameter to change.
289+
placements.triggers.SpringCollab2020/SpeedBasedMusicParamTrigger.tooltips.minSpeed=The minimum value the music parameter can take.
290+
placements.triggers.SpringCollab2020/SpeedBasedMusicParamTrigger.tooltips.maxSpeed=The maximum value the music parameter can take.
291+
placements.triggers.SpringCollab2020/SpeedBasedMusicParamTrigger.tooltips.activate=If ticked, the trigger will start adjusting the music parameter to match the player's speed.\nIf unticked, the trigger will stop adjusting that music parameter, and set it to minSpeed.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module SpringCollab2020SpeedBasedMusicParamTrigger
2+
3+
using ..Ahorn, Maple
4+
5+
@mapdef Trigger "SpringCollab2020/SpeedBasedMusicParamTrigger" SpeedBasedMusicParamTrigger(x::Integer, y::Integer, width::Integer=Maple.defaultTriggerWidth, height::Integer=Maple.defaultTriggerHeight,
6+
paramName::String="fade", minSpeed::Number=0.0, maxSpeed::Number=1.0, activate::Bool=true)
7+
8+
const placements = Ahorn.PlacementDict(
9+
"Speed-Based Music Param (Spring Collab 2020)" => Ahorn.EntityPlacement(
10+
SpeedBasedMusicParamTrigger,
11+
"rectangle"
12+
)
13+
)
14+
15+
end

SpringCollab2020Module.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public override void Load() {
3636
SeekerCustomColors.Load();
3737
CameraCatchupSpeedTrigger.Load();
3838
ColorGradeFadeTrigger.Load();
39+
SpeedBasedMusicParamTrigger.Load();
3940
Everest.Events.Level.OnLoadBackdrop += onLoadBackdrop;
4041

4142
DecalRegistry.AddPropertyHandler("scale", (decal, attrs) => {
@@ -77,6 +78,7 @@ public override void Unload() {
7778
SeekerCustomColors.Unload();
7879
CameraCatchupSpeedTrigger.Unload();
7980
ColorGradeFadeTrigger.Unload();
81+
SpeedBasedMusicParamTrigger.Unload();
8082
Everest.Events.Level.OnLoadBackdrop -= onLoadBackdrop;
8183
}
8284

SpringCollab2020Session.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,12 @@ public class MultiRoomStrawberrySeedInfo {
1717
public bool MadelineIsSilhouette { get; set; } = false;
1818

1919
public bool LightSourcesDisabled { get; set; } = false;
20+
21+
public class SpeedBasedMusicParamInfo {
22+
public float MinimumSpeed { get; set; }
23+
public float MaximumSpeed { get; set; }
24+
}
25+
26+
public Dictionary<string, SpeedBasedMusicParamInfo> ActiveSpeedBasedMusicParams = new Dictionary<string, SpeedBasedMusicParamInfo>();
2027
}
2128
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using Celeste.Mod.Entities;
2+
using Microsoft.Xna.Framework;
3+
using System.Collections.Generic;
4+
5+
namespace Celeste.Mod.SpringCollab2020.Triggers {
6+
[CustomEntity("SpringCollab2020/SpeedBasedMusicParamTrigger")]
7+
class SpeedBasedMusicParamTrigger : Trigger {
8+
public static void Load() {
9+
On.Celeste.Player.Update += onPlayerUpdate;
10+
}
11+
12+
public static void Unload() {
13+
On.Celeste.Player.Update -= onPlayerUpdate;
14+
}
15+
16+
private static void onPlayerUpdate(On.Celeste.Player.orig_Update orig, Player self) {
17+
orig(self);
18+
19+
AudioState audio = self.SceneAs<Level>().Session.Audio;
20+
float playerSpeed = self.Speed.Length();
21+
22+
// set all the speed-based music params to their corresponding values.
23+
foreach (KeyValuePair<string, SpringCollab2020Session.SpeedBasedMusicParamInfo> musicParam
24+
in SpringCollab2020Module.Instance.Session.ActiveSpeedBasedMusicParams) {
25+
26+
audio.Music.Param(musicParam.Key, MathHelper.Clamp(playerSpeed, musicParam.Value.MinimumSpeed, musicParam.Value.MaximumSpeed));
27+
}
28+
29+
audio.Apply();
30+
}
31+
32+
private string paramName;
33+
private float minSpeed;
34+
private float maxSpeed;
35+
private bool activate;
36+
37+
public SpeedBasedMusicParamTrigger(EntityData data, Vector2 offset) : base(data, offset) {
38+
paramName = data.Attr("paramName");
39+
minSpeed = data.Float("minSpeed");
40+
maxSpeed = data.Float("maxSpeed");
41+
activate = data.Bool("activate");
42+
}
43+
44+
public override void OnEnter(Player player) {
45+
base.OnEnter(player);
46+
47+
if (activate) {
48+
// register the speed-based music param as active to keep it updated.
49+
SpringCollab2020Module.Instance.Session.ActiveSpeedBasedMusicParams[paramName] = new SpringCollab2020Session.SpeedBasedMusicParamInfo() {
50+
MinimumSpeed = minSpeed,
51+
MaximumSpeed = maxSpeed
52+
};
53+
} else {
54+
// unregister the param, and set the music param to the minimum value.
55+
SpringCollab2020Module.Instance.Session.ActiveSpeedBasedMusicParams.Remove(paramName);
56+
57+
AudioState audio = SceneAs<Level>().Session.Audio;
58+
audio.Music.Param(paramName, minSpeed);
59+
audio.Apply();
60+
}
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)