Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions TrollMod17/Buttons/BardTuneButton.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using MiraAPI.Hud;
using MiraAPI.Utilities.Assets;
using UnityEngine;
using TrollMod17.Networking;
using MiraAPI.GameOptions;
using TrollMod17.Options;

namespace TrollMod17.Buttons;

public class BardTuneButton : CustomActionButton
{
public override string Name => "Tune";
public override float Cooldown => 25f;
public override float EffectDuration => 6f;
public override LoadableAsset<Sprite> Sprite => MiraAssets.RoundedBox;
public override int MaxUses
{
get
{
var inst = OptionGroupSingleton<BardOptions>.Instance;
var value = inst != null ? inst.BardMaxUses : global::TrollMod17.Options.MaxUses.One;
return (int)value;
}
}
public override float InitialCooldown => 10f;
public override ButtonLocation Location => ButtonLocation.BottomLeft;
private const float Radius = 3.5f;

public override bool Enabled(RoleBehaviour? role)
{
return role is TrollMod17.Roles.BardRole;
}

protected override void OnClick()
{
var center = PlayerControl.LocalPlayer.GetTruePosition();
AbilityRpcs.BardStartTune(PlayerControl.LocalPlayer, center, Radius, EffectDuration);
}

public override void OnEffectEnd()
{
AbilityRpcs.BardEndTune(PlayerControl.LocalPlayer);
}
}
14 changes: 11 additions & 3 deletions TrollMod17/Buttons/GuardianShieldButton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
using TrollMod17.Networking;
using Il2CppSystem;
using TrollMod17.Settings;
using MiraAPI.GameOptions;
using TrollMod17.Options;

namespace TrollMod17.Buttons;

Expand All @@ -13,7 +15,15 @@ public class GuardianShieldButton : CustomActionButton<PlayerControl>
public override float Cooldown => 25f;
public override float EffectDuration => 6f;
public override LoadableAsset<Sprite> Sprite => MiraAssets.RefreshIcon;
public override int MaxUses => 1;
public override int MaxUses
{
get
{
var inst = OptionGroupSingleton<GuardianOptions>.Instance;
var value = inst != null ? inst.GuardianMaxUses : global::TrollMod17.Options.MaxUses.One;
return (int)value; // Infinite maps to 0
}
}

public override float Distance => 2.5f;
public override ButtonLocation Location => TMLocalSettings.ButtonsPosition == ButtonPos.Left ? ButtonLocation.BottomLeft : ButtonLocation.BottomRight;
Expand Down Expand Up @@ -58,14 +68,12 @@ public override void SetOutline(bool active)
protected override void OnClick()
{
if (Target == null) return;
if (!AmongUsClient.Instance.AmHost) return;
_lastShieldedId = Target.PlayerId;
AbilityRpcs.GuardianStartShield(PlayerControl.LocalPlayer, Target.PlayerId, EffectDuration);
}

public override void OnEffectEnd()
{
if (!AmongUsClient.Instance.AmHost) { ResetTarget(); return; }
if (_lastShieldedId != 0)
{
AbilityRpcs.GuardianEndShield(PlayerControl.LocalPlayer, _lastShieldedId);
Expand Down
44 changes: 44 additions & 0 deletions TrollMod17/Buttons/IllusionistGlimmerButton.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using MiraAPI.Hud;
using MiraAPI.Utilities.Assets;
using UnityEngine;
using TrollMod17.Networking;
using MiraAPI.GameOptions;
using TrollMod17.Options;

namespace TrollMod17.Buttons;

public class IllusionistGlimmerButton : CustomActionButton
{
public override string Name => "Glimmer";
public override float Cooldown => 25f;
public override float EffectDuration => 6f;
public override LoadableAsset<Sprite> Sprite => MiraAssets.RoundedBox;
public override int MaxUses
{
get
{
var inst = OptionGroupSingleton<IllusionistOptions>.Instance;
var value = inst != null ? inst.IllusionistMaxUses : global::TrollMod17.Options.MaxUses.One;
return (int)value;
}
}
public override float InitialCooldown => 10f;
public override ButtonLocation Location => ButtonLocation.BottomRight;
private const float Radius = 3.5f;

public override bool Enabled(RoleBehaviour? role)
{
return role is TrollMod17.Roles.IllusionistRole;
}

protected override void OnClick()
{
var center = PlayerControl.LocalPlayer.GetTruePosition();
AbilityRpcs.IllusionistStartGlimmer(PlayerControl.LocalPlayer, center, Radius, EffectDuration);
}

public override void OnEffectEnd()
{
AbilityRpcs.IllusionistEndGlimmer(PlayerControl.LocalPlayer);
}
}
14 changes: 11 additions & 3 deletions TrollMod17/Buttons/ShadowCloakButton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
using TrollMod17.Networking;
using Il2CppSystem;
using TrollMod17.Settings;
using MiraAPI.GameOptions;
using TrollMod17.Options;

namespace TrollMod17.Buttons;

Expand All @@ -13,7 +15,15 @@ public class ShadowCloakButton : CustomActionButton<PlayerControl>
public override float Cooldown => 25f;
public override float EffectDuration => 6f;
public override LoadableAsset<Sprite> Sprite => MiraAssets.RefreshIcon;
public override int MaxUses => 1;
public override int MaxUses
{
get
{
var inst = OptionGroupSingleton<ShadowOptions>.Instance;
var value = inst != null ? inst.ShadowMaxUses : global::TrollMod17.Options.MaxUses.One;
return (int)value; // Infinite maps to 0
}
}
public override float Distance => 2.6f;
public override ButtonLocation Location => TMLocalSettings.ButtonsPosition == ButtonPos.Left ? ButtonLocation.BottomLeft : ButtonLocation.BottomRight;

Expand Down Expand Up @@ -54,7 +64,6 @@ public override void SetOutline(bool active)

protected override void OnClick()
{
if (!AmongUsClient.Instance.AmHost) return;
var me = PlayerControl.LocalPlayer;
if (Target)
{
Expand All @@ -65,7 +74,6 @@ protected override void OnClick()

public override void OnEffectEnd()
{
if (!AmongUsClient.Instance.AmHost) return;
var me = PlayerControl.LocalPlayer;
AbilityRpcs.ShadowEndCloak(me, me.PlayerId);
}
Expand Down
14 changes: 11 additions & 3 deletions TrollMod17/Buttons/TricksterSmokeButton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using UnityEngine;
using TrollMod17.Networking;
using TrollMod17.Settings;
using MiraAPI.GameOptions;
using TrollMod17.Options;

namespace TrollMod17.Buttons;

Expand All @@ -12,7 +14,15 @@ public class TricksterSmokeButton : CustomActionButton
public override float Cooldown => 25f;
public override float EffectDuration => 6f;
public override LoadableAsset<Sprite> Sprite => MiraAssets.RefreshIcon;
public override int MaxUses => 1;
public override int MaxUses
{
get
{
var inst = OptionGroupSingleton<TricksterOptions>.Instance;
var value = inst != null ? inst.TricksterMaxUses : global::TrollMod17.Options.MaxUses.One;
return (int)value; // Infinite maps to 0
}
}

public override float InitialCooldown => 10f;
public override ButtonLocation Location => TMLocalSettings.ButtonsPosition == ButtonPos.Left ? ButtonLocation.BottomLeft : ButtonLocation.BottomRight;
Expand All @@ -25,14 +35,12 @@ public override bool Enabled(RoleBehaviour? role)

protected override void OnClick()
{
if (!AmongUsClient.Instance.AmHost) return;
var center = PlayerControl.LocalPlayer.GetTruePosition();
AbilityRpcs.TricksterStartSmoke(PlayerControl.LocalPlayer, center, SmokeRadius, EffectDuration);
}

public override void OnEffectEnd()
{
if (!AmongUsClient.Instance.AmHost) return;
AbilityRpcs.TricksterEndSmoke(PlayerControl.LocalPlayer);
}
}
96 changes: 87 additions & 9 deletions TrollMod17/Cosmetics/AbilityCosmetics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,23 @@ namespace TrollMod17.Cosmetics;

public static class AbilityCosmetics
{
// Among Us native cosmetics-backed state
private static readonly Dictionary<PlayerControl, float> _savedPhantomAlpha = new();
private static readonly HashSet<PlayerControl> _shielded = new();
private static readonly HashSet<PlayerControl> _smoked = new();
private static readonly Dictionary<PlayerControl, Color> _originalColors = new();
private static readonly HashSet<PlayerControl> _tuned = new();
private static readonly HashSet<PlayerControl> _glimmered = new();
private static readonly Dictionary<PlayerControl, float> _glimmerAlpha = new();

public static void ApplyShadowCloak(PlayerControl p, float alphaFactor)
{
if (!p || p.cosmetics == null) return;
// Save current phantom alpha, then set reduced alpha
try
{
var current = p.cosmetics.GetPhantomRoleAlpha();
_savedPhantomAlpha[p] = current;
}
catch { /* ignore */ }
catch { }
p.cosmetics.SetPhantomRoleAlpha(Mathf.Clamp01(alphaFactor));
}

Expand All @@ -36,7 +38,6 @@ public static void RemoveShadowCloak(PlayerControl p)
}
else
{
// fallback reset
p.cosmetics.SetPhantomRoleAlpha(1f);
}
}
Expand All @@ -60,24 +61,43 @@ public static void RemoveShieldTint(PlayerControl p)

public static void ApplySmokeDarkenInRadius(Vector2 center, float radius)
{
ClearSmokeDarken();

foreach (var pc in PlayerControl.AllPlayerControls)
{
if (!pc || pc.cosmetics == null) continue;
var d = Vector2.Distance(center, pc.GetTruePosition());
if (d > radius) continue;
pc.cosmetics.FadeBlackCosmetics(0.6f);
_smoked.Add(pc);

if (pc.cosmetics.currentBodySprite != null && pc.cosmetics.currentBodySprite.BodySprite != null)
{
var sprite = pc.cosmetics.currentBodySprite.BodySprite;
_originalColors[pc] = sprite.color;

var darkenedColor = new Color(0.1f, 0.1f, 0.1f, sprite.color.a);
sprite.color = darkenedColor;

_smoked.Add(pc);
}
}
}

public static void ClearSmokeDarken()
{
foreach (var p in _smoked)
foreach (var pc in _smoked)
{
if (!p || p.cosmetics == null) continue;
p.cosmetics.FadeBlackCosmetics(0f);
if (!pc || pc.cosmetics == null) continue;

if (_originalColors.TryGetValue(pc, out var originalColor) &&
pc.cosmetics.currentBodySprite != null &&
pc.cosmetics.currentBodySprite.BodySprite != null)
{
pc.cosmetics.currentBodySprite.BodySprite.color = originalColor;
}
}

_smoked.Clear();
_originalColors.Clear();
}

public static void SpawnPulseRing(Vector2 center, Color color, float duration)
Expand Down Expand Up @@ -109,4 +129,62 @@ private static IEnumerator SpawnPulseRingCo(Vector2 center, Color color, float d

if (go) UnityEngine.Object.Destroy(go);
}

public static void ApplyTuneGlow(Vector2 center, float radius)
{
foreach (var pc in PlayerControl.AllPlayerControls)
{
if (!pc || pc.cosmetics == null) continue;
var d = Vector2.Distance(center, pc.GetTruePosition());
if (d > radius) continue;
pc.cosmetics.SetOutline(true, new Nullable<Color>(new Color(1f, 0.9f, 0.2f, 1f)));
_tuned.Add(pc);
}
}

public static void ClearTuneGlow()
{
foreach (var pc in _tuned)
{
if (!pc || pc.cosmetics == null) continue;
pc.cosmetics.SetOutline(false, new Nullable<Color>());
}
_tuned.Clear();
}

public static void ApplyGlimmerInRadius(Vector2 center, float radius)
{
foreach (var pc in PlayerControl.AllPlayerControls)
{
if (!pc || pc.cosmetics == null) continue;
var d = Vector2.Distance(center, pc.GetTruePosition());
if (d > radius) continue;
if (!_glimmerAlpha.ContainsKey(pc))
{
float a = 1f;
try { a = pc.cosmetics.GetPhantomRoleAlpha(); } catch { }
_glimmerAlpha[pc] = a;
}
pc.cosmetics.SetPhantomRoleAlpha(0.5f);
_glimmered.Add(pc);
}
}

public static void ClearGlimmer()
{
foreach (var pc in _glimmered)
{
if (!pc || pc.cosmetics == null) continue;
if (_glimmerAlpha.TryGetValue(pc, out var a))
{
pc.cosmetics.SetPhantomRoleAlpha(a);
}
else
{
pc.cosmetics.SetPhantomRoleAlpha(1f);
}
}
_glimmered.Clear();
_glimmerAlpha.Clear();
}
}
Loading
Loading