DiomedesLC-Diomedes icon

Diomedes

(Open Beta) Go head-to-head against your opponents in Knockout, Race and Bingo!

Last updated 13 hours ago
Total downloads 13
Total rating 0 
Categories BepInEx Client-side Server-side
Dependency string DiomedesLC-Diomedes-0.9.0
Dependants 0 other packages depend on this package

This mod requires the following mods to function

TeamXiaolan-DawnLib-0.9.21 icon
TeamXiaolan-DawnLib

A modern API for Lethal Company content and all sizes of mods [V81]

Preferred version: 0.9.21
Sigurd-Serilog_Pack-0.5.2 icon
Sigurd-Serilog_Pack

Everything you need to log seriously from the BepInEx framework!

Preferred version: 0.5.2
mattymatty-LobbyControl-2.5.12 icon
mattymatty-LobbyControl

A collection of Patches for Lethal Company with Quality of life changes for the Host. ( LateJoin Included )

Preferred version: 2.5.12
dotnet_lethal_company-Serilog_Exceptions-8.4.0 icon
dotnet_lethal_company-Serilog_Exceptions

NuGet Serilog.Exceptions package re-bundled for convenient consumption and dependency management.

Preferred version: 8.4.0
dotnet_lethal_company-Serilog_Sinks_Map-2.0.0 icon
dotnet_lethal_company-Serilog_Sinks_Map

NuGet Serilog.Sinks.Map package re-bundled for convenient consumption and dependency management.

Preferred version: 2.0.0
dotnet_lethal_company-Serilog_Sinks_File-7.0.0 icon
dotnet_lethal_company-Serilog_Sinks_File

NuGet Serilog.Sinks.File package re-bundled for convenient consumption and dependency management.

Preferred version: 7.0.0

README

Diomedes (Open Beta)

Go head-to-head against your opponents in Knockout, Race and Bingo!

Diomedes requries connection to our external server in order to function and your access can be restricted (read our guidelines above!). When you first use the mod you'll be prompted in your browser to authenticate with Discord, which is how we identify your account; You don't have to join our discord (but you should).

Diomedes is also in Open Beta, so expect things to break a lot! Specifically while in a match try not to close the game, it is possible to rejoin if you aren't the "Captain" but this comes with caveats.
❤️ Thanks for trying out the mod and have fun!

Knockout

Be the last crew standing!

Random moons are generated for the quota and everyone plays the day at the same time!

After the 3 days of the quota are up, sell all your scrap at the company (most scrap is deleted if you don't sell it!) and everyone is ranked depending on how much they sold. The crews who sold the least that quota (default 50%) will lose a life (default 3 lives) and a new quota starts until 1 crew is left!

Race

Be the first crew to complete the target quota!

By default crews will race to complete the 3rd quota. Each quota has it's moons, weathers and seeds already picked out. Quota scaling is simplified by default starting at 400 and increasing by 100.

Sell everything as quickly as possible! You can route to the company anytime and you don't get any more money or keep unsold scrap after the quota (e.g selling $500 when the quota is only $400 means you lose $100). If you don't meet the quota, or think you could've done better on previous days you can restart the current quota from the beginning and try it again, the seeds don't change!

Daily Race

Daily race resets at UTC midnight everyday and instead of playing against opponents live, your times are put on the daily race leaderboard. You can play the daily race with up to 4 players (quota scaling is higher with more players).

Custom Moons in Race and Knockout

Custom moons are supported for race and knockout but they need to be manually enabled. In a lobby under Settings enable Generate Locally.

By default this uses DawnLib tags to inform the generator, so you'll need to use LunarConfig to apply the following tags (moon creators using dawnlib can also manually apply these if they like):
diomedes:earlygame, diomedes:midgame, diomedes:lategame, diomedes:moon_gen_exclude
(custom weathers aren't currently supported by the default generator)

Or if you know how to code the methods DiomedesClientAPI.RegisterKnockoutGenerator and DiomedesClientAPI.RegisterRaceGenerator are avaliable when you reference me.loaforc.diomedes.dll and Diomedes.API.dll (API will be unstable due to being in open beta)

Bingo

Be the first to complete 13 squares, locking out your opponent.

Bingo is still a heavy work-in-progress and right now only supports 2 teams.

A 5x5 grid of challenges is randomly generated at the beginning of the match, you can view them by looking in the pause menu.

Bingo follows lockout rules, so once a challenge is completed by one team, it can't be completed by the other. Other than being a competition to complete the challenges, no other gameplay rules are changed.

Custom Bingo Challenges

Unlike Race/Knockout bingo challenges are always defined by the client. The method DiomedesClientAPI.DefineBingoChallenge is the main method to call when defining bingo challenges and follows the standard format of DawnLib definition methods. The factory parameter should always return a new instance of a class that derives BingoChallenge

A BingoChallengeGroup helps inform the board generator of better rules to make sure the board is filled with a variety of challenges and difficulties (but right now it goes unused lol)

Diomedes.ExtraChallenges is a project that is open to community contributions with the goal of providing bingo challenges for other popular mods (e.g CodeRebirth)

Example (Implementation of "Inverse teleport into a paid moon and reach a exit" challenge)

Please note that BingoPatches is marked internal, you should never publicize any Diomedes assembly. This implementation should be treated like pseudocode for you to understand how the API works.

While Diomedes implementations of BingoChallenge are public (e.g BC_LandOnMoon, BC_EnemyDeath) you should not use them as:

  1. The API is unstable and will likely recieve breaking changes
  2. They are very basic and don't provide a lot of behaviour to override

IMPORTANT: The method Complete() handles sending the event and marking the square as complete, however this method is currently only valid for the Captain (the host of an indivual game lobby, not necessarily the host of the diomedes lobby). Your call to it should be properly networked.

BingoProgressChallenge also exists which has .SetProgress() and automatically calls Complete(). It will in the future also provide better UI feedback. The value of the current progress is also not synced in a game lobby or diomedes lobby.

ChallengeGroup group = DiomedesClientAPI.DefineBingoChallengeGroup(DiomedesKeys.ShipTeleporterGroup, builder => builder
	.WithMaxAmount(1)
);

DiomedesClientAPI.DefineBingoChallenge(
	NamespacedKey<ChallengeInfo>.From("diomedes", "inverse_paid_escape"),
	() => new BC_InversePaid(),
	builder => builder
		.AddToGroup(group)
);

public class BC_InversePaid : BingoChallenge {
	List<PlayerControllerB> _validPlayersForChallenge = [];

	public BC_InversePaid() {
		BingoPatches.OnPlayerShipTeleport += OnPlayerShipTeleport;
		BingoPatches.OnEndOfDay += OnEndOfDay;
		BingoPatches.OnPlayerEntranceTeleport += OnPlayerEntranceTeleport;
	}

	void OnEndOfDay(int obj) {
		_validPlayersForChallenge.Clear();
	}

	void OnPlayerEntranceTeleport(PlayerControllerB player, EntranceTeleport teleport) {
		if(_validPlayersForChallenge.Contains(player) && !teleport.isEntranceToBuilding) {
			Complete();
		}
	}

	void OnPlayerShipTeleport(PlayerControllerB player, ShipTeleporter teleporter) {
		if(teleporter.isInverseTeleporter && StartOfRound.Instance.currentLevel.GetDawnInfo().HasTag(Tags.Paid)) {
			_validPlayersForChallenge.Add(player);
		}
		if(!teleporter.isInverseTeleporter && _validPlayersForChallenge.Contains(player)) { // using the regular teleporter out does not count
			_validPlayersForChallenge.Remove(player);
		}
	}

	protected internal override void Cleanup() {
		base.Cleanup();
		BingoPatches.OnPlayerShipTeleport -= OnPlayerShipTeleport;
		BingoPatches.OnEndOfDay -= OnEndOfDay;
		BingoPatches.OnPlayerEntranceTeleport -= OnPlayerEntranceTeleport;
	}

	public override BingoUIState CreateUI() {
		return new BingoUIState {
			Name = "Inverse teleport into a paid moon and reach a exit"
		};
	}
}