1
0
Fork 0

Compare commits

...

14 Commits

Author SHA1 Message Date
ivan tkachenko 3607ccc92f Release v1337.9001.0 2025-10-15 19:10:29 +03:00
ivan tkachenko 8570505758 Rewrite README, add self-hosted videos 2025-10-15 19:10:06 +03:00
ivan tkachenko 049a14e440 Use requiresRestart: false directly, remove Default() options factory
Now, without an additional CanModifyCallback setup, Default is just a
pointless overhead.
2025-10-15 15:55:29 +03:00
ivan tkachenko 1ec8275831 Drop restrictions on when/whether host/clients can modify config
Lethal Config does not refresh that state reliably, it has only caused
bugs and annoyances so far. If someone wants to change the track mid-day,
there is a small chance to desync though.
2025-10-15 15:49:53 +03:00
ivan tkachenko 9efe6adaf3 Add a new track ReelGoon 2025-10-14 19:00:11 +03:00
ivan tkachenko a5b117e26d Add a new track Whistle 2025-10-14 17:48:37 +03:00
ivan tkachenko 01332ab77f Add a new track BbIXODaHET 2025-10-14 17:48:37 +03:00
ivan tkachenko 7aa3570b33 Fix internal representation of track AttentionPls
Members of track group were never intended to be Selectable.
2025-10-14 17:48:36 +03:00
ivan tkachenko e7866fda55 Fix division erroneously rounding to integers
This fixes LoopOffset which is a non-integer factor or Beats.
2025-10-14 17:48:36 +03:00
ivan tkachenko cd9e0a7a10 Compensate for loudness level -14 LUFS of audio files 2025-10-14 17:48:36 +03:00
ivan tkachenko 8223425b19 Remaster all tracks to target consistent loudness level of -14 LUFS
Add multiple intros for BeefLiver.
2025-10-14 16:53:11 +03:00
ivan tkachenko 9bf3a80341 Bump netcode-patch to support v73 2025-10-11 21:59:48 +03:00
ivan tkachenko 72a8016ab5 Clean up whitespace 2025-10-08 02:30:46 +03:00
ivan tkachenko 9619a75427 Bump version 2025-10-08 02:30:32 +03:00
57 changed files with 379 additions and 194 deletions

BIN
Assets/AttentionPls1Intro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/AttentionPls2Intro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/AttentionPlsLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/BbIXODaHETIntro.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/BbIXODaHETLoop.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/BeefLiver1Intro.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/BeefLiver3Intro.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/BeefLiver4Intro.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/BeefLiver4Loop.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/BeefLiverIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/BeefLiverLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/Beha1Intro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/Beha2Intro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/Beha3Intro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/BehaLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/ChereshnyaIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/ChereshnyaLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/DurochkaIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/DurochkaLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/GodModeIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/GodModeLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/GorgorodIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/GorgorodLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/KachIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/KachLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/MoyaZhittyaIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/MoyaZhittyaLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/MuzikaGromcheIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/MuzikaGromcheLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/OnePartiyaUdarIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/OnePartiyaUdarLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/PWNEDIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/PWNEDLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/PeretasovkaIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/PeretasovkaLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/ReelGoonIntro.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/ReelGoonLoop.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/RiseAndShineIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/RiseAndShineLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/Song2Intro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/Song2Loop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/VseVZaleIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/VseVZaleLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/WhistleIntro.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/WhistleLoop.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Assets/YalgaarIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/YalgaarLoop.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/ZmeiGorynichIntro.ogg (Stored with Git LFS)

Binary file not shown.

BIN
Assets/ZmeiGorynichLoop.ogg (Stored with Git LFS)

Binary file not shown.

View File

@ -1,5 +1,16 @@
# Changelog
## MuzikaGromche 1337.9001.0 - v73 Music quieter Edition
- Updated netcode-patch to support Lethal Company v73.
- Remastered all the audio tracks to target a consistent loudness level which allows you hear your teammates.
- Remastered track Song2 to fix cut points.
- Shortened intro of track Peretasovka to match vanilla timings.
- Added multiple intro variants for BeefLiver.
- Added a new track BbIXODaHET.
- Added a new track Whistle. Now it can fully replace WhistleJester!
- Added a new track ReelGoon.
## MuzikaGromche 1337.420.9004 - Life Support Edition
- Override Death Screen / Game Over text in certain cases.

View File

@ -1,5 +1,5 @@
<Project>
<Target Name="NetcodePatch" AfterTargets="PostBuildEvent">
<Exec Command="dotnet netcode-patch -nv 1.5.2 &quot;$(TargetPath)&quot; @(ReferencePathWithRefAssemblies->'&quot;%(Identity)&quot;', ' ')"/>
<Exec Command="dotnet netcode-patch -uv 2022.3.62 -nv 1.12.0 &quot;$(TargetPath)&quot; @(ReferencePathWithRefAssemblies->'&quot;%(Identity)&quot;', ' ')"/>
</Target>
</Project>

View File

@ -26,3 +26,9 @@ bump version_number:
jq --indent 4 --arg v "{{ version_number }}" '.version_number = $v' < manifest.json > manifest.json.copy
mv manifest.json.copy manifest.json
sed -i 's/<Version>.*<\/Version>/<Version>{{ version_number }}<\/Version>/' MuzikaGromche/MuzikaGromche.csproj
ogg track_name:
dotnet msbuild /t:wav2ogg /p:TrackName="{{ track_name }}"
ogg1 track_name:
dotnet msbuild /t:wav2ogg1 /p:TrackName="{{ track_name }}"

View File

@ -8,7 +8,7 @@
<AssemblyName>Ratijas.MuzikaGromche</AssemblyName>
<Product>Muzika Gromche</Product>
<Description>Add some content to your inverse teleporter experience on Titan!</Description>
<Version>1337.420.9004</Version>
<Version>1337.9001.0</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
@ -53,13 +53,13 @@
<HintPath>$(LethalCompanyDir)Lethal Company_Data\Managed\Unity.Netcode.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.TextMeshPro" Publicize="true" Private="False">
<HintPath>$(LethalCompanyDir)Lethal Company_Data\Managed\Unity.TextMeshPro.dll</HintPath>
<HintPath>$(LethalCompanyDir)Lethal Company_Data\Managed\Unity.TextMeshPro.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UI" Publicize="true" Private="False">
<HintPath>$(LethalCompanyDir)Lethal Company_Data\Managed\UnityEngine.UI.dll</HintPath>
<HintPath>$(LethalCompanyDir)Lethal Company_Data\Managed\UnityEngine.UI.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Core.Runtime" Publicize="true" Private="False">
<HintPath>$(LethalCompanyDir)Lethal Company_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll</HintPath>
<HintPath>$(LethalCompanyDir)Lethal Company_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll</HintPath>
</Reference>
</ItemGroup>
@ -118,4 +118,11 @@
</ItemGroup>
<Exec Command="ffmpeg -bitexact -y -i $(WavExportDir)%(TrackNames.Identity).wav $(SolutionDir)Assets\%(TrackNames.Identity).ogg" />
</Target>
<Target Name="wav2ogg1">
<ItemGroup>
<TrackNames Include="$(TrackName)" />
</ItemGroup>
<Exec Command="ffmpeg -bitexact -y -i $(WavExportDir)%(TrackNames.Identity).wav $(SolutionDir)Assets\%(TrackNames.Identity).ogg" />
</Target>
</Project>

View File

@ -330,7 +330,7 @@ namespace MuzikaGromche
Name = "Peretasovka",
AudioType = AudioType.OGGVORBIS,
Language = Language.ENGLISH,
WindUpTimer = 59.07f,
WindUpTimer = 39.68f,
Bars = 8,
BeatsOffset = 0.3f,
ColorTransitionIn = 0.4f,
@ -366,7 +366,7 @@ namespace MuzikaGromche
Name = "Chereshnya",
AudioType = AudioType.OGGVORBIS,
Language = Language.RUSSIAN,
WindUpTimer = 45.58f,
WindUpTimer = 45.48f,
Bars = 16,
BeatsOffset = 0.0f,
ColorTransitionIn = 0.3f,
@ -460,7 +460,7 @@ namespace MuzikaGromche
Name = "Kach",
AudioType = AudioType.OGGVORBIS,
Language = Language.ENGLISH,
WindUpTimer = 48.30f,
WindUpTimer = 47.30f,
Bars = 12,
// let them overlap, such that there is an actual hard cut to the next color
BeatsOffset = 0.4f,
@ -480,26 +480,75 @@ namespace MuzikaGromche
Lyrics = [],
GameOverText = "[DIDN'T PUMP IT: LOUDER]",
},
new SelectableAudioTrack
new SelectableTracksGroup
{
Name = "BeefLiver",
AudioType = AudioType.OGGVORBIS,
Language = Language.ENGLISH,
WindUpTimer = 39.35f,
Bars = 12,
BeatsOffset = 0.2f,
ColorTransitionIn = 0.4f,
ColorTransitionOut = 0.4f,
ColorTransitionEasing = Easing.OutExpo,
Palette = Palette.Parse([
"#FFEBEB", "#FFEBEB", "#445782", "#EBA602",
"#5EEBB9", "#8EE3DC", "#A23045", "#262222",
]),
LoopOffset = 0,
FadeOutBeat = -3,
FadeOutDuration = 3,
FlickerLightsTimeSeries = [-48, -40, -4.5f, 44],
Lyrics = [],
Tracks =
[
new CoreAudioTrack
{
Name = "BeefLiver1",
FileNameLoop = "BeefLiverLoop.ogg",
AudioType = AudioType.OGGVORBIS,
WindUpTimer = 39.35f,
Bars = 12,
BeatsOffset = 0.2f,
ColorTransitionIn = 0.4f,
ColorTransitionOut = 0.4f,
ColorTransitionEasing = Easing.OutExpo,
Palette = Palette.Parse([
"#FFEBEB", "#FFEBEB", "#445782", "#EBA602",
"#5EEBB9", "#8EE3DC", "#A23045", "#262222",
]),
LoopOffset = 0,
FadeOutBeat = -3,
FadeOutDuration = 3,
FlickerLightsTimeSeries = [-48, -40, -4.5f, 44],
Lyrics = [],
},
new CoreAudioTrack
{
Name = "BeefLiver3",
FileNameLoop = "BeefLiverLoop.ogg",
AudioType = AudioType.OGGVORBIS,
WindUpTimer = 39.35f,
Bars = 12,
BeatsOffset = 0.2f,
ColorTransitionIn = 0.4f,
ColorTransitionOut = 0.4f,
ColorTransitionEasing = Easing.OutExpo,
Palette = Palette.Parse([
"#FFEBEB", "#FFEBEB", "#445782", "#EBA602",
"#5EEBB9", "#8EE3DC", "#A23045", "#262222",
]),
LoopOffset = 0,
FadeOutBeat = -3,
FadeOutDuration = 3,
FlickerLightsTimeSeries = [-48, -40, -4.5f, 44],
Lyrics = [],
},
new CoreAudioTrack
{
Name = "BeefLiver4",
AudioType = AudioType.OGGVORBIS,
WindUpTimer = 31.68f,
Bars = 12,
BeatsOffset = 0.2f,
ColorTransitionIn = 0.4f,
ColorTransitionOut = 0.4f,
ColorTransitionEasing = Easing.OutExpo,
Palette = Palette.Parse([
"#FFEBEB", "#FFEBEB", "#445782", "#EBA602",
"#5EEBB9", "#8EE3DC", "#A23045", "#262222",
]),
LoopOffset = 0,
FadeOutBeat = -3,
FadeOutDuration = 3,
FlickerLightsTimeSeries = [-32, -24, -4.5f, 44],
Lyrics = [],
},
],
},
new SelectableTracksGroup
{
@ -597,12 +646,11 @@ namespace MuzikaGromche
IsExplicit = true,
Tracks =
[
new SelectableAudioTrack
new CoreAudioTrack
{
Name = "AttentionPls1",
FileNameLoop = "AttentionPlsLoop.ogg",
AudioType = AudioType.OGGVORBIS,
Language = Language.RUSSIAN,
WindUpTimer = 39.19f,
Bars = 8,
BeatsOffset = 0.3f,
@ -618,12 +666,11 @@ namespace MuzikaGromche
DrunknessLoopOffsetTimeSeries = new([7f, 12f, 15f], [0f, 0.90f, 0f]),
CondensationLoopOffsetTimeSeries = new([23f, 28f, 31f], [0f, 0.4f, 0f]),
},
new SelectableAudioTrack
new CoreAudioTrack
{
Name = "AttentionPls2",
FileNameLoop = "AttentionPlsLoop.ogg",
AudioType = AudioType.OGGVORBIS,
Language = Language.RUSSIAN,
WindUpTimer = 39.19f,
Bars = 8,
BeatsOffset = 0.3f,
@ -641,6 +688,101 @@ namespace MuzikaGromche
},
],
},
new SelectableAudioTrack
{
Name = "BbIXODaHET",
AudioType = AudioType.OGGVORBIS,
Language = Language.RUSSIAN,
WindUpTimer = 40.85f,
Bars = 8,
BeatsOffset = 0.3f,
ColorTransitionIn = 0.7f,
ColorTransitionOut = 0.3f,
ColorTransitionEasing = Easing.InOutCubic,
Palette = Palette.Parse([
"#E6D58F", "#612F7E", "#D9783F", "#C3411C", "#D3B742", "#549BDE",
]),
LoopOffset = 0,
FadeOutBeat = -6,
FadeOutDuration = 6,
FlickerLightsTimeSeries = [-32.5f, -16.5f, 30.5f],
Lyrics = [],
DrunknessLoopOffsetTimeSeries = new(
[-1, 2, 7, 31],
[0, 0.4f, 0, 0]),
},
new SelectableAudioTrack
{
Name = "Whistle",
AudioType = AudioType.OGGVORBIS,
Language = Language.ENGLISH,
WindUpTimer = 41.27f,
Bars = 12,
BeatsOffset = 0.0f,
ColorTransitionIn = 0.5f,
ColorTransitionOut = 0.2f,
ColorTransitionEasing = Easing.OutExpo,
Palette = Palette.Parse([
"#8DDEDD", "#98DE28", "#E8DB4B", "#F060A8", "#EEC263", "#725DEB",
]),
LoopOffset = 16,
FadeOutBeat = -22,
FadeOutDuration = 6,
FlickerLightsTimeSeries = [-20, 12],
Lyrics = [
(-40, "Can you blow my whistle, baby, whistle, baby?"),
(-36, "Can you blow my whistle, baby, whistle, baby? Let me know"),
(-33.5f, "Girl, I'm gonna show you how to\ndo it"),
(-30.5f, "Girl, I'm gonna show you how to\ndo it and we start real slow"),
(-27, "You just put your lips together"),
(-24, "You just put your lips together and you come real close"),
(-21, "Can you blow my whistle, baby, whistle, baby?"),
(-17, "HERE WE GO"),
(10, "Yeah, baby, make that whistle"),
(12, "Yeah, baby, make that whistle\nblow oh oh oh"),
(15, "Can you blow my whistle, baby, whistle, baby?"),
(20, "Can you blow my whistle, baby, whistle, baby? Let me know"),
(23, "Girl, I'm gonna show you how to\ndo it"),
(28, "Girl, I'm gonna show you how to\ndo it and we start real slow"),
(32, "You just put your lips together"),
(36, "You just put your lips together and you come real close"),
(39, "Can you blow my whistle, baby, whistle, baby?"),
(46, "HERE"),
(47, "Here WE"),
(48, "Here we GO"),
],
DrunknessLoopOffsetTimeSeries = new(
[-16f, -15.25f, -12f, 9f, 15f, 16f, 18f, 21f],
[0f, 0.7f, 0f, 0f, 0.4f, 0.7f, 0.4f, 0f]),
},
new SelectableAudioTrack
{
Name = "ReelGoon",
AudioType = AudioType.OGGVORBIS,
Language = Language.ENGLISH,
WindUpTimer = 45.15f,
Bars = 16,
BeatsOffset = -0.35f,
ColorTransitionIn = 0.1f,
ColorTransitionOut = 0.35f,
ColorTransitionEasing = Easing.OutExpo,
Palette = Palette.Parse([
"#DE1C31", "#F7E26B", "#3D3D3D", "#FBB040",
"#ED4E4A", "#F0BD37", "#E41E2E", "#2E2D2B",
]),
LoopOffset = 0,
FadeOutBeat = -2,
FadeOutDuration = 2,
FlickerLightsTimeSeries = [-41, 61],
Lyrics = [],
DrunknessLoopOffsetTimeSeries = new(
[-0.5f, -0.05f, 6f, 60f, 61f],
[0f, 0.5f, 0f, 0f, 0.5f]),
},
];
public static ISelectableTrack ChooseTrack()
@ -929,7 +1071,7 @@ namespace MuzikaGromche
// Number of beats between WindUpTimer and where looped segment starts (not the loop audio).
public int LoopOffset { get; }
public float LoopOffsetInSeconds => LoopOffset / Beats * LoadedLoop.length;
public float LoopOffsetInSeconds => (float)LoopOffset / (float)Beats * LoadedLoop.length;
// MPEG is basically mp3, and it can produce gaps at the start.
// WAV is OK, but takes a lot of space. Try OGGVORBIS instead.
@ -2035,7 +2177,10 @@ namespace MuzikaGromche
public static bool ExtrapolateTime { get; private set; } = true;
public static bool ShouldSkipWindingPhase { get; private set; } = false;
// Audio files are normalized to target -14 LUFS, which is too loud to communicate. Reduce by another -12 dB down to about -26 LUFS.
public static float DefaultVolume = 0.25f;
#if DEBUG
public static ConfigEntry<float> Volume { get; private set; } = null!;
// Latest set track, used for loading palette and timings.
private static IAudioTrack? CurrentTrack = null;
// All per-track values that can be overridden
@ -2093,17 +2238,18 @@ namespace MuzikaGromche
SkipExplicitTracks = configFile.Bind("General", "Skip Explicit Tracks", false,
new ConfigDescription("When choosing tracks at random, skip the ones with Explicit Content/Lyrics."));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(SkipExplicitTracks, Default(new BoolCheckBoxOptions())));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(SkipExplicitTracks, requiresRestart: false));
OverrideSpawnRates = configFile.Bind("General", "Override Spawn Rates", true,
new ConfigDescription("Deviate from vanilla spawn rates to experience content of this mod more often."));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(OverrideSpawnRates, Default(new BoolCheckBoxOptions())));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(OverrideSpawnRates, requiresRestart: false));
#if DEBUG
SetupEntriesForGameOverText(configFile);
SetupEntriesForScreenFilters(configFile);
SetupEntriesForExtrapolation(configFile);
SetupEntriesToSkipWinding(configFile);
SetupEntriesForVolume(configFile);
SetupEntriesForPaletteOverride(configFile);
SetupEntriesForTimingsOverride(configFile);
#endif
@ -2125,18 +2271,14 @@ namespace MuzikaGromche
string buttonText = "Toggle";
var button = new GenericButtonConfigItem(section, buttonOptionName, buttonDescription, buttonText, () =>
{
if (CanModifyWeightsNow())
var tracks = Plugin.Tracks.Where(t => t.Language.Equals(language)).ToList();
var isOff = tracks.All(t => t.Weight.Value == 0);
var newWeight = isOff ? 50 : 0;
foreach (var t in tracks)
{
var tracks = Plugin.Tracks.Where(t => t.Language.Equals(language)).ToList();
var isOff = tracks.All(t => t.Weight.Value == 0);
var newWeight = isOff ? 50 : 0;
foreach (var t in tracks)
{
t.Weight.Value = newWeight;
}
t.Weight.Value = newWeight;
}
});
button.ButtonOptions.CanModifyCallback = CanModifyWeightsNow;
LethalConfigManager.AddConfigItem(button);
}
@ -2148,7 +2290,7 @@ namespace MuzikaGromche
50,
new ConfigDescription(description, chanceRange, track));
LethalConfigManager.AddConfigItem(new IntSliderConfigItem(track.Weight, Default(new IntSliderOptions())));
LethalConfigManager.AddConfigItem(new IntSliderConfigItem(track.Weight, requiresRestart: false));
}
}
@ -2162,46 +2304,12 @@ namespace MuzikaGromche
#endif
}
public static CanModifyResult CanModifyIfHost()
{
var startOfRound = StartOfRound.Instance;
if (!startOfRound)
{
return CanModifyResult.True(); // Main menu
}
if (!startOfRound.IsHost)
{
return CanModifyResult.False("Only for host");
}
return CanModifyResult.True();
}
public static CanModifyResult CanModifyWeightsNow()
{
var startOfRound = StartOfRound.Instance;
if (!startOfRound)
{
return CanModifyResult.True(); // Main menu
}
if (!startOfRound.IsHost)
{
return CanModifyResult.False("Only for host");
}
#if !DEBUG // Changing tracks on the fly might lead to a desync. But it may speed up development process
if (!startOfRound.inShipPhase)
{
return CanModifyResult.False("Only while orbiting");
}
#endif
return CanModifyResult.True();
}
#if DEBUG
private void SetupEntriesForExtrapolation(ConfigFile configFile)
{
var entry = configFile.Bind("General", "Extrapolate Audio Playback Time", true,
new ConfigDescription("AudioSource only updates its playback position about 20 times per second.\n\nUse extrapolation technique to predict playback time between updates for smoother color animations."));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(entry, Default(new BoolCheckBoxOptions())));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(entry, requiresRestart: false));
entry.SettingChanged += (sender, args) => apply();
apply();
@ -2215,7 +2323,7 @@ namespace MuzikaGromche
{
var entry = configFile.Bind("General", "Skip Winding Phase", false,
new ConfigDescription("Skip most of the wind-up/intro music.\n\nUse this option to test your Loop audio segment."));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(entry, Default(new BoolCheckBoxOptions())));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(entry, requiresRestart: false));
entry.SettingChanged += (sender, args) => apply();
apply();
@ -2225,6 +2333,13 @@ namespace MuzikaGromche
}
}
private void SetupEntriesForVolume(ConfigFile configFile)
{
Volume = configFile.Bind("General", "Volume", DefaultVolume,
new ConfigDescription("Volume of the music played by this mod.", new AcceptableValueRange<float>(0f, 1f)));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(Volume, requiresRestart: false));
}
private void SetupEntriesForPaletteOverride(ConfigFile configFile)
{
const string section = "Palette";
@ -2235,13 +2350,12 @@ namespace MuzikaGromche
var loadButton = new GenericButtonConfigItem(section, "Load Palette from the Current Track",
"Override custom palette with the built-in palette of the current track.", "Load", load);
loadButton.ButtonOptions.CanModifyCallback = CanModifyIfHost;
LethalConfigManager.AddConfigItem(loadButton);
customPaletteSizeEntry = configFile.Bind(section, "Palette Size", 0, new ConfigDescription(
"Number of colors in the custom palette.\n\nIf set to non-zero, custom palette overrides track's own built-in palette.",
new AcceptableValueRange<int>(0, maxCustomPaletteSize)));
LethalConfigManager.AddConfigItem(new IntSliderConfigItem(customPaletteSizeEntry, Default(new IntSliderOptions())));
LethalConfigManager.AddConfigItem(new IntSliderConfigItem(customPaletteSizeEntry, requiresRestart: false));
customPaletteSizeEntry.SettingChanged += (sender, args) => apply();
for (int i = 0; i < maxCustomPaletteSize; i++)
@ -2249,7 +2363,7 @@ namespace MuzikaGromche
string entryName = $"Custom Color {i + 1}";
var customColorEntry = configFile.Bind(section, entryName, "#FFFFFF", "Choose color for the custom palette");
customPaletteEntries[i] = customColorEntry;
LethalConfigManager.AddConfigItem(new HexColorInputFieldConfigItem(customColorEntry, Default(new HexColorInputFieldOptions())));
LethalConfigManager.AddConfigItem(new HexColorInputFieldConfigItem(customColorEntry, requiresRestart: false));
customColorEntry.SettingChanged += (sender, args) => apply();
}
@ -2305,12 +2419,11 @@ namespace MuzikaGromche
var loadButton = new GenericButtonConfigItem(section, "Load Timings from the Current Track",
"Override custom timings with the built-in timings of the current track.", "Load", load);
loadButton.ButtonOptions.CanModifyCallback = CanModifyIfHost;
LethalConfigManager.AddConfigItem(loadButton);
overrideTimingsEntry = configFile.Bind(section, "Override Timings", false,
new ConfigDescription("If checked, custom timings override track's own built-in timings."));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(overrideTimingsEntry, Default(new BoolCheckBoxOptions())));
LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(overrideTimingsEntry, requiresRestart: false));
overrideTimingsEntry.SettingChanged += (sender, args) => apply();
fadeOutBeatEntry = configFile.Bind(section, "Fade Out Beat", 0f,
@ -2334,17 +2447,16 @@ namespace MuzikaGromche
colorTransitionEasingEntry = configFile.Bind(section, "Color Transition Easing", Easing.Linear.Name,
new ConfigDescription("Interpolation/easing method to use for color transitions", new AcceptableValueList<string>(Easing.AllNames)));
var floatSliderOptions = Default(new FloatSliderOptions());
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(fadeOutBeatEntry, floatSliderOptions));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(fadeOutDurationEntry, floatSliderOptions));
LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(flickerLightsTimeSeriesEntry, Default(new TextInputFieldOptions())));
LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(lyricsTimeSeriesEntry, Default(new TextInputFieldOptions())));
LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(drunknessTimeSeriesEntry, Default(new TextInputFieldOptions())));
LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(condensationTimeSeriesEntry, Default(new TextInputFieldOptions())));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(beatsOffsetEntry, floatSliderOptions));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(colorTransitionInEntry, floatSliderOptions));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(colorTransitionOutEntry, floatSliderOptions));
LethalConfigManager.AddConfigItem(new TextDropDownConfigItem(colorTransitionEasingEntry, Default(new TextDropDownOptions())));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(fadeOutBeatEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(fadeOutDurationEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(flickerLightsTimeSeriesEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(lyricsTimeSeriesEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(drunknessTimeSeriesEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(condensationTimeSeriesEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(beatsOffsetEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(colorTransitionInEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(colorTransitionOutEntry, requiresRestart: false));
LethalConfigManager.AddConfigItem(new TextDropDownConfigItem(colorTransitionEasingEntry, requiresRestart: false));
registerStruct(fadeOutBeatEntry, t => t.FadeOutBeat, x => FadeOutBeatOverride = x);
registerStruct(fadeOutDurationEntry, t => t.FadeOutDuration, x => FadeOutDurationOverride = x);
@ -2540,13 +2652,6 @@ namespace MuzikaGromche
};
}
#endif
private T Default<T>(T options) where T : BaseOptions
{
options.RequiresRestart = false;
options.CanModifyCallback = CanModifyIfHost;
return options;
}
}
[HarmonyPatch(typeof(GameNetworkManager))]
@ -2609,16 +2714,26 @@ namespace MuzikaGromche
IntroAudioSource.maxDistance = Plugin.AudioMaxDistance;
IntroAudioSource.dopplerLevel = 0;
IntroAudioSource.loop = false;
IntroAudioSource.volume = Config.DefaultVolume;
LoopAudioSource = loopAudioGameObject.GetComponent<AudioSource>();
LoopAudioSource.maxDistance = Plugin.AudioMaxDistance;
LoopAudioSource.dopplerLevel = 0;
LoopAudioSource.loop = true;
LoopAudioSource.volume = Config.DefaultVolume;
Debug.Log($"{nameof(MuzikaGromche)} {nameof(MuzikaGromcheJesterNetworkBehaviour)} Patched JesterEnemy");
}
}
#if DEBUG
void Update()
{
IntroAudioSource.volume = Config.Volume.Value;
LoopAudioSource.volume = Config.Volume.Value;
}
#endif
public override void OnNetworkSpawn()
{
ChooseTrackDeferred();

View File

@ -1,34 +1,53 @@
# Muzika Gromche!
# Muzika Gromche — The ultimate Jester party music mod
_Add some content to your Inverse teleporter experience on Titan!<sup>1</sup>_
This mod's name literally means "cranck music louder".
To keep it a surprise, it is adviced that you do not read the detailed description below.
Muzika Gromche literally means "crank music louder".
This mod replaces Jester's winding up and chasing sounds with a whole library of timed to the beat and seamlessly looped popular energetic songs, combined with various visual effects.
If a picture is worth a thousand words, a demo video is priceless. Check out what Muzika Gromche does:
[![Thumbnail for MuzikaGromche demo](https://ratijas.me/share/public/LC/MuzikaGromche/video/demo/thumb-360.jpg)](https://ratijas.me/share/public/LC/MuzikaGromche/video/demo/MuzikaGromche-demo.mp4)
An example of trapping One Punch Man themed Jester at mineshaft:
[![Thumbnail for MuzikaGromche - How not to trap Jester at mineshaft](https://ratijas.me/share/public/LC/MuzikaGromche/video/mineshaft-trap/thumb-360.jpg)](https://ratijas.me/share/public/LC/MuzikaGromche/video/mineshaft-trap/How%20not%20to%20trap%20Jester%20at%20Mineshaft.mp4)
## Compatibility
Muzika Gromche is compatible with *Almost Vanilla™* gameplay and [*High Quota Mindset*](https://youtu.be/18RUCgQldGg?t=2553). It slightly changes certain timers, so won't be compatible with leaderboards. If you are a streamer™, be aware that it does play *copyrighted content.*
Muzika Gromche is compatible with *Almost Vanilla™* gameplay and [*High Quota Mindset*](https://youtu.be/18RUCgQldGg?t=2553). It slightly changes Jester's wind-up timers to pop up on the drop, so won't be compatible with leaderboards. If you are a streamer™, be aware that it does play *copyrighted content.*
Muzika Gromche works with all Lethal Company versions from v72 all the way back to v40, and is likely to work on all future versions as long as dependencies are working. [`LobbyCompatibility`] is recommended but optional.
Muzika Gromche v1337.9001.0 has been updated to work with Lethal Company v73. Previous versions of Muzika Gromche work with all Lethal Company versions from all the way back to v40 and up to v72.
Speaking of dependencies, [`V70PoweredLights_Fix`] is not strictly required, but it doesn't hurt to have it installed on any version, and it makes this mod more enjoyable on new Mansion tiles.
- [`LobbyCompatibility`] is recommended but optional.
- [`V70PoweredLights_Fix`] is not strictly required, but it doesn't hurt to have it installed on any version, and it makes this mod more enjoyable on the new Mansion tiles introduced in v70.
## Playlist
Music track names are codenamed, and by default have equal chance of being selected. In the Lethal Config menu tracks are grouped by language, where the whole group can be quickly toggled ON or OFF at once. For example, you might want to toggle Russian or Hindi tracks OFF if you don't speak those languages.
English playlist features artists such as Imagine Dragons, Fall Out Boy, Bon Jovi, Black Eyed Peas, LMFAO (Party Rock Anthem / Every day I'm shufflin'), CYBEЯIA / "Cyberia" (Russian Hackers), and of course Whistle by Joel Merry / Flo Rida.
Russian playlist includes Би-2, Витас, ГлюкoZa (Глюкоза) & Ленинград, Дискотека Авария, Noize MC, Oxxxymiron, Сплин, Пошлая Молли.
There are also a K-pop track by aespa, an anime opening from One Punch Man, and an Indian banger by CarryMinati & Wily Frenzy.
## Configuration
Configuration integrates with [`LethalConfig`] mod.
If you are just trying out this mod for the first time, or want to experience it more often, consider toggling ON the "Override Spawn Rates" config entry. Otherwise it might take a frustratingly long time to find out what you need to find out.
If you are just trying out this mod for the first time, or want to experience it more often, consider leaving the "Override Spawn Rates" config entry ON. Otherwise it might take a frustratingly long time to find out what you need to find out.
Track selection options are only configurable by host player and only while orbiting.
Track selection options are only configurable by the host player.
Any player can change their personal preferences locally.
- If you are playing with a Bluetooth headset, adjust Audio Offset to -0.2 seconds.
- Display Lyrics toggle: show lyrics in a popup whenever player hears music.
- Audio Offset: If you are playing with a Bluetooth headset, adjust Audio Offset to -0.2 seconds.
- Display Lyrics toggle: Shows lyrics in a popup whenever player hears music.
## Authors & Special Thanks
- Oflor: Original author, wrote the code and sliced the first tracks.
- [Ratijas](https://t.me/ratijas): Rewrote the code to sync the lights to the beat, added configuration options and many features, fixed gaps in existing tracks and sliced many new ones.
- Oflor: Original author; wrote the code and sliced the first tracks.
- [Ratijas](https://t.me/ratijas): Rewrote the code to sync the lights to the beat, added configuration options and many features, fixed gaps in existing tracks, and sliced many new ones.
- [Just Nothing](https://t.me/REALJUSTNOTHING): Visual artist; contributed palettes, timings and animation curves.
- [WaterGun](https://www.youtube.com/channel/UCCxCFfmrnqkFZ8i9FsXBJVA): Created [`V70PoweredLights_Fix`] mod, patched certain tiles with amazing lightshow.

View File

@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"evaisa.netcodepatcher.cli": {
"version": "4.3.0",
"version": "4.4.2",
"commands": [
"netcode-patch"
]

View File

@ -1,6 +1,6 @@
{
"name": "MuzikaGromche",
"version_number": "1337.420.9004",
"version_number": "1337.9001.0",
"author": "Ratijas",
"description": "Add some content to your inverse teleporter experience on Titan!",
"website_url": "https://git.vilunov.me/ratijas/muzika-gromche",