Compare commits

...

49 Commits

Author SHA1 Message Date
ivan tkachenko 1cdbdf2f09 Release v13.37.911 2025-07-21 19:16:25 +03:00
ivan tkachenko 45a73793fb Add support for pre-v70 Mansion Main tile. 2025-07-21 19:07:36 +03:00
ivan tkachenko 581d9701bd Remove redundant call to private method FlickerPoweredLights
FlickerPoweredLights is a private coroutine.

FlickerLights is the public method that internally starts and stores the
FlickerPoweredLights coroutine.
2025-07-21 19:07:36 +03:00
ivan tkachenko 49ac86e6f9 Add compatibility section to the README
readme
2025-07-21 19:07:35 +03:00
ivan tkachenko 0f8ab1a75b Add Changelog 2025-07-21 19:07:35 +03:00
ivan tkachenko dda00ce228 Bump version 2025-07-21 19:07:35 +03:00
ivan tkachenko 39a8255532 Fix LethalConfig dependency string
Apparently, this is different from BepInEx plugin GUID.
2025-07-21 02:06:14 +03:00
ivan tkachenko b7eb4ce60b Update README 2025-07-21 01:56:49 +03:00
ivan tkachenko d6a2bf21b1 Bump version 2025-07-21 01:13:40 +03:00
ivan tkachenko 730f125d62 Patch Jester destructor to reset the light show
It is needed to despawn Jester via Imperium's Object Explorer.
2025-07-21 01:06:45 +03:00
ivan tkachenko 8e065d3e51 Add config option to skip tracks marked as Explicit Content/Lyrics
Unfortunately it is configurable by host only, and there is no sane way
to make work from clients.
2025-07-21 00:55:40 +03:00
ivan tkachenko 2a33457661 Harmony: Use nameof() instead of hardcoded strings 2025-07-21 00:32:43 +03:00
ivan tkachenko 0fbf0b04f4 Add V70PoweredLights_Fix to the package dependencies
Not strictly required, but makes this mod shine brighter.
2025-07-21 00:32:43 +03:00
ivan tkachenko 0c5d4f7158 Add DiscoBall to Main on all interiors, BirthdayRoom and factory (belt room) 2025-07-21 00:32:43 +03:00
ivan tkachenko 9e066372c5 Add support for lyrics randomization 2025-07-21 00:32:42 +03:00
ivan tkachenko ca977625db Sort imports the way VisualStudio likes it
Apparently, Sublime Text's Sort Lines command ordered them in a weird
way, inconsistent with VS, VS Code and human logic.
2025-07-20 23:04:41 +03:00
ivan tkachenko 7d1cac6e2e Add lyrics, flickering and fade out transitions to many tracks 2025-07-20 23:04:40 +03:00
ivan tkachenko 2229fa3545 Add debug-only config for lyrics time series 2025-07-20 23:04:40 +03:00
ivan tkachenko 118eecbb59 Add support for fading out, and debug-only config for flickering lights 2025-07-20 23:04:40 +03:00
ivan tkachenko b8824dbbfb Config: Most synced options have something in common 2025-07-20 23:04:40 +03:00
ivan tkachenko 3e751c0d8d Config: reduce repetition
It may look complicated, but it reduced references to each individual
entry from almost ten to just 4.
2025-07-20 23:04:39 +03:00
ivan tkachenko 601ecf8887 Reworked state management system, automatic wrapping of timestamps and spans
Add lyrics for MoyaZhittya
2025-07-20 23:04:39 +03:00
ivan tkachenko d13c617895 Apply audio offsets early to simplify math 2025-07-18 02:40:55 +03:00
ivan tkachenko e1f19b3919 Add track Kach with custom palette and timings 2025-07-18 02:40:55 +03:00
ivan tkachenko ba0162b3e1 Add track PWNED with custom palette and timings 2025-07-18 02:40:54 +03:00
ivan tkachenko ed8804b7a7 Add track Chereshnya with custom palette and timings 2025-07-18 02:40:53 +03:00
ivan tkachenko 9be9eaaf80 Extend loop of the track VseVZale
Now includes second phase OOOoooo OOooo
2025-07-18 02:40:53 +03:00
ivan tkachenko 0683a18491 Port track VseVZale to OGG format
No gap now.
2025-07-18 02:40:52 +03:00
ivan tkachenko 6204888453 Port track DeployDestroy to OGG format
No gap now.
2025-07-18 02:40:52 +03:00
ivan tkachenko c15637b347 Port track Durochka to OGG format, add custom transitions
No gap now.
2025-07-18 02:40:51 +03:00
ivan tkachenko 42c1f29a16 Port track Gorgorod to OGG format
No gap now.
2025-07-18 02:40:50 +03:00
ivan tkachenko 8a193fa408 Port track MoyaZhittya to OGG format
No gap now.
2025-07-18 02:40:50 +03:00
ivan tkachenko 4ee20adea7 Port track MuzikaGromche to OGG format
Twice as longer, loops better, no gap.
2025-07-18 02:40:49 +03:00
ivan tkachenko 2df7d28d43 New operators for Palette
With these it would be easier to create more complicated timelines
without repeating yourself over and over again.
2025-07-18 02:40:49 +03:00
ivan tkachenko 43d1565dbe MSBuild: Add platform-agnostic task to convert WAV to OGG 2025-07-18 02:40:48 +03:00
ivan tkachenko f5dab20d67 Add track Yalgaar with custom palette and timings 2025-07-18 02:40:48 +03:00
ivan tkachenko 38cfb5f5e7 Add track Peretasovka with custom palette and timings 2025-07-18 02:40:47 +03:00
ivan tkachenko b86c50a848 Add track Song2 with custom palette and timings 2025-07-18 02:40:47 +03:00
ivan tkachenko 694bc61dae Add tracks GodMode and RiseAndShine with custom palette and timings 2025-07-18 02:40:46 +03:00
ivan tkachenko 909efa720f Add track ZmeiGorynich with custom palette and timings 2025-07-18 02:36:43 +03:00
ivan tkachenko a8761bf679 Add support for interpolated color transitions for lights, with debug-only synced overrides 2025-07-17 22:36:52 +03:00
ivan tkachenko ad77530b6d Add support for per-track palettes, and debug-only synced palette override
Palettes are contributed by @REALJUSTNOTHING
2025-07-17 22:35:19 +03:00
ivan tkachenko 34d8da1562 Add configurable global audio offset, useful for Bluetooth headsets 2025-07-17 22:35:19 +03:00
ivan tkachenko b73c7ee3cb Sync playback to the actual beat count rather than relying on BPM 2025-07-17 22:34:38 +03:00
ivan tkachenko 0d4f180a37 Add debug-only ability to change weights of tracks while on a moon
And drop obsoleted debug code. With the new on-the-fly track weights
configuration, hardcoding one in build is not necessary anymore.
2025-07-16 03:06:43 +03:00
ivan tkachenko 829c44e347 Add debug-only synced config option to skip wind-up phase 2025-07-16 03:06:42 +03:00
ivan tkachenko b15e93ac34 Factor out CSync hack into a separate method
We gonna register more synced entries in debug-only builds, but marking
nullable fields with the [SyncedEntryField] attribute is not an option.
2025-07-15 22:47:02 +03:00
ivan tkachenko f158e7728c Fix language section toggle for non-host
There is no point in checking for synchronized value before flipping
local value.
2025-07-15 21:51:38 +03:00
ivan tkachenko 2b42899779 Reorder some statements to make them visually more grouped together
Postfix patch went from 5 if-blocks down to only 3 \o/

There is no need to stop the creatureVoice and start it delayed in two
separate condition blocks. Also, the code should only rely on state
transitions, and not on AudioSource.isPlaying property.
2025-07-14 14:44:17 +03:00
50 changed files with 1804 additions and 151 deletions

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

Binary file not shown.

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

Binary file not shown.

BIN
Assets/DeployDestroyLoop.mp3 (Stored with Git LFS)

Binary file not shown.

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

Binary file not shown.

BIN
Assets/DeployDestroyStart.mp3 (Stored with Git LFS)

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

BIN
Assets/DurochkaStart.mp3 (Stored with Git LFS)

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

BIN
Assets/GorgorodStart.mp3 (Stored with Git LFS)

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

BIN
Assets/MoyaZhittyaStart.mp3 (Stored with Git LFS)

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

BIN
Assets/MuzikaGromcheStart.mp3 (Stored with Git LFS)

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

BIN
Assets/VseVZaleStart.mp3 (Stored with Git LFS)

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

23
CHANGELOG.md Normal file
View File

@ -0,0 +1,23 @@
# Changelog
## MuzikaGromche 13.37.911 - Sri Lanka Bus hotfix
- Fixed certain event sometimes not working due to wrong method call.
- Added support for pre-v70 Mansion Main tile.
## MuzikaGromche 13.37.420 - Sri Lanka Bus Edition
Completely rewritten by Ratijas, with tons of new content.
- Added lots of new tracks.
- Fixed gaps in old tracks.
- New code synchronizes light show to the beat.
- Timings, animation curves, color palettes and events fine-tuned for each track by visual artist [Just Nothing](https://t.me/REALJUSTNOTHING).
- Configurable Audio Delay for those with Bluetooth headset.
- Configurable chance of randomly choosing each tracks.
- Added lyrics to *some* of the tracks, and a configuration toggle.
- Certain tiles are patched by [WaterGun](https://www.youtube.com/channel/UCCxCFfmrnqkFZ8i9FsXBJVA) to add some visual flare.
## MuzikaGromche 13.37.6 - Christmas Special
Last known version released by Oflor. Added special timed content for New Year and Christmas.

View File

@ -2,9 +2,13 @@
<Project>
<PropertyGroup>
<!-- Copy this file to MuzikaGromche.props.user and uncomment one of two paths below: -->
<!-- On Linux: -->
<!-- <LethalCompanyDir>$(HOME)/.local/share/Steam/steamapps/common/Lethal Company/</LethalCompanyDir> -->
<!-- <WavExportDir>\home\ratijas\Music\SFX\Export</WavExportDir> -->
<!-- On Windows: -->
<!-- <LethalCompanyDir>C:/Program Files (x86)/Steam/steamapps/common/Lethal Company/</LethalCompanyDir> -->
<!-- <WavExportDir>D:\Code\MuzikaGromcheAudio\Export</WavExportDir> -->
</PropertyGroup>
</Project>

View File

@ -0,0 +1,91 @@
using DunGen;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using UnityEngine;
namespace MuzikaGromche
{
public class DiscoBallManager : MonoBehaviour
{
// A struct holding a disco ball container object and the name of a tile for which it was designed.
public readonly record struct Data(string TileName, GameObject DiscoBallContainer)
{
// We are specifically looking for cloned tiles, not the original prototypes.
public readonly string TileCloneName = $"{TileName}(Clone)";
}
public static readonly List<Data> Containers = [];
private static readonly List<GameObject> InstantiatedContainers = [];
public static void Initialize()
{
string assetdir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "muzikagromche");
var bundle = AssetBundle.LoadFromFile(assetdir);
foreach ((string prefabPath, string tileName) in new[] {
("Assets/LethalCompany/Mods/MuzikaGromche/DiscoBallContainerManor.prefab", "ManorStartRoomSmall"),
("Assets/LethalCompany/Mods/MuzikaGromche/DiscoBallContainerManorOLD.prefab", "ManorStartRoom"),
("Assets/LethalCompany/Mods/MuzikaGromche/DiscoBallContainerFactory.prefab", "StartRoom"),
("Assets/LethalCompany/Mods/MuzikaGromche/DiscoBallContainerMineShaft.prefab", "MineshaftStartTile"),
("Assets/LethalCompany/Mods/MuzikaGromche/DiscoBallContainerLargeForkTileB.prefab", "LargeForkTileB"),
("Assets/LethalCompany/Mods/MuzikaGromche/DiscoBallContainerBirthdayRoomTile.prefab", "BirthdayRoomTile"),
})
{
var container = bundle.LoadAsset<GameObject>(prefabPath);
Containers.Add(new(tileName, container));
}
}
public static void Enable()
{
// Just in case
Disable();
var query = from tile in Resources.FindObjectsOfTypeAll<Tile>()
join container in Containers
on tile.gameObject.name equals container.TileCloneName
select (tile, container);
foreach (var (tile, container) in query)
{
Enable(tile, container);
}
}
private static readonly string[] animatorNames = [
"DiscoBallProp/AnimContainer",
"DiscoBallProp1/AnimContainer",
"DiscoBallProp2/AnimContainer",
"DiscoBallProp3/AnimContainer",
"DiscoBallProp4/AnimContainer",
"DiscoBallProp5/AnimContainer",
];
private static void Enable(Tile tile, Data container)
{
Debug.Log($"{nameof(MuzikaGromche)} {nameof(DiscoBallManager)} Enabling at '{tile.gameObject.name}'");
var discoBall = Instantiate(container.DiscoBallContainer, tile.transform);
InstantiatedContainers.Add(discoBall);
foreach (var animatorName in animatorNames)
{
if (discoBall.transform.Find(animatorName)?.gameObject is GameObject animator)
{
animator.GetComponent<Animator>().SetBool("on", true);
}
}
}
public static void Disable()
{
foreach (var discoBall in InstantiatedContainers)
{
Debug.Log($"{nameof(MuzikaGromche)} {nameof(DiscoBallManager)}: Disabling {discoBall.name}");
Destroy(discoBall);
}
InstantiatedContainers.Clear();
}
}
}

View File

@ -4,7 +4,7 @@
<TargetFramework>netstandard2.1</TargetFramework>
<AssemblyName>MuzikaGromche</AssemblyName>
<Description>Opa che tut u nas</Description>
<Version>13.37.6</Version>
<Version>13.37.911</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
</PropertyGroup>
@ -49,6 +49,7 @@
<PackagedResources Include="$(SolutionDir)README.md" />
<PackagedResources Include="$(SolutionDir)icon.png" />
<PackagedResources Include="$(SolutionDir)manifest.json" />
<PackagedResources Include="$(ProjectDir)UnityAssets\muzikagromche" />
<PackagedResources Include="$(TargetDir)MuzikaGromche.dll" />
</ItemGroup>
@ -73,4 +74,18 @@
DestinationFolder="$(SolutionDir)dist\"
/>
</Target>
<!--
Usage:
Set WavExportDir in props.user file.
Run
> dotnet msbuild /t:wav2ogg /p:TrackName=GodMode
-->
<Target Name="wav2ogg">
<ItemGroup>
<TrackNames Include="$(TrackName)Start" />
<TrackNames Include="$(TrackName)Loop" />
</ItemGroup>
<Exec Command="ffmpeg -bitexact -y -i $(WavExportDir)%(TrackNames.Identity).wav $(SolutionDir)Assets\%(TrackNames.Identity).ogg"/>
</Target>
</Project>

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1 +1,36 @@
Adds some content to your reverse teleports on Titan
# Muzika Gromche!
Add some content to your reverse teleport experience on Titan!
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.
## 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 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 ([`CSync`] and [`LethalConfig`]) are working.
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.
## Configuration
Configuration integrates with [`LethalConfig`] mod.
Track selection options are only configurable by host player and only while orbiting.
Any player can change their personal preferences locally.
- If you experience severe lags, try disabling color animations in config.
- 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.
## 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.
- [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.
[`CSync`]: https://thunderstore.io/c/lethal-company/p/Sigurd/CSync/
[`LethalConfig`]: https://thunderstore.io/c/lethal-company/p/AinaVT/LethalConfig/
[`V70PoweredLights_Fix`]: https://thunderstore.io/c/lethal-company/p/WaterGun/V70PoweredLights_Fix/

View File

@ -1,12 +1,13 @@
{
"name": "MuzikaGromche",
"version_number": "13.37.6",
"version_number": "13.37.911",
"author": "Oflor",
"description": "Glaza zakryvaj",
"website_url": "https://git.vilunov.me/nikita/muzika-gromche",
"dependencies": [
"BepInEx-BepInExPack-5.4.2100",
"Sigurd-CSync-5.0.1",
"ainavt.lc.lethalconfig-1.4.6"
"AinaVT-LethalConfig-1.4.6",
"WaterGun-V70PoweredLights_Fix-1.0.0"
]
}