using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using AngryDuck.Patches;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("angryduck")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("angryduck")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("177ce422-ce2b-4a69-838c-55bec10d7e7f")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
[BepInPlugin("atomiclabs.ANGRYDUCK", "Angry Duck", "1.0.0")]
public class AngryDuckMod : BaseUnityPlugin
{
public const string modGUID = "atomiclabs.ANGRYDUCK";
public const string modName = "Angry Duck";
public const string modVersion = "1.0.0";
public static AngryDuckMod instance;
public static List<AudioClip> quackSounds;
public static readonly Random random = new Random();
private Harmony harmony;
private AssetBundle bundle;
internal ManualLogSource logger;
public AudioClip attackLoopClip;
public AudioClip stunClip;
public AudioClip stunStopClip;
public AudioClip transformClip;
public AudioClip deathClip;
public AudioClip noticeClip;
private void Awake()
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Expected O, but got Unknown
logger = ((BaseUnityPlugin)this).Logger;
logger.LogInfo((object)"Loading Angry Duck mod...");
if ((Object)(object)instance == (Object)null)
{
instance = this;
harmony = new Harmony("atomiclabs.ANGRYDUCK");
harmony.PatchAll(typeof(EnemyDuckAnimPatch));
quackSounds = new List<AudioClip>();
string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
bundle = AssetBundle.LoadFromFile(Path.Combine(directoryName, "angryducksounds"));
if ((Object)(object)bundle == (Object)null)
{
logger.LogError((object)"Failed to load asset bundle!");
return;
}
quackSounds = (from clip in bundle.LoadAllAssets<AudioClip>()
where ((Object)clip).name.StartsWith("quack") && int.TryParse(((Object)clip).name.Substring(5), out var result) && result >= 1 && result <= 6
select clip).ToList();
if (quackSounds.Count == 0)
{
logger.LogError((object)"No valid quack sounds found in the asset bundle!");
return;
}
logger.LogInfo((object)$"Loaded {quackSounds.Count} quack sounds from asset bundle!");
attackLoopClip = bundle.LoadAsset<AudioClip>("attackloopsound");
stunClip = bundle.LoadAsset<AudioClip>("stunsound");
stunStopClip = bundle.LoadAsset<AudioClip>("stunstopsound");
transformClip = bundle.LoadAsset<AudioClip>("transformsound");
deathClip = bundle.LoadAsset<AudioClip>("deathsound");
noticeClip = bundle.LoadAsset<AudioClip>("noticesound");
if ((Object)(object)attackLoopClip == (Object)null || (Object)(object)stunClip == (Object)null || (Object)(object)stunStopClip == (Object)null || (Object)(object)transformClip == (Object)null || (Object)(object)deathClip == (Object)null || (Object)(object)noticeClip == (Object)null)
{
logger.LogError((object)"Failed to load one or more sounds from asset bundle!");
}
}
else
{
Object.Destroy((Object)(object)this);
}
}
public AudioClip GetRandomQuackSound()
{
if (quackSounds == null || quackSounds.Count == 0)
{
logger.LogError((object)"Quack sounds list is empty or null.");
return null;
}
return quackSounds[random.Next(quackSounds.Count)];
}
}
namespace AngryDuck.Patches;
[HarmonyPatch(typeof(EnemyDuckAnim))]
internal class EnemyDuckAnimPatch
{
[HarmonyPatch("Awake")]
[HarmonyPostfix]
private static void ReplaceAudio(EnemyDuckAnim __instance)
{
if (AngryDuckMod.quackSounds != null && AngryDuckMod.quackSounds.Count > 0)
{
AudioClip val = AngryDuckMod.quackSounds[AngryDuckMod.random.Next(AngryDuckMod.quackSounds.Count)];
__instance.quackSound.Sounds = (AudioClip[])(object)new AudioClip[1] { val };
AngryDuckMod.instance.logger.LogInfo((object)$"[AUDIO] Duck {((Object)__instance).GetInstanceID()} selected quack sound -> {((Object)val).name}");
}
else
{
AngryDuckMod.instance.logger.LogError((object)"[AUDIO] Failed to assign quack sound - no valid sounds available.");
}
if ((Object)(object)AngryDuckMod.instance.attackLoopClip != (Object)null)
{
__instance.attackLoopSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.attackLoopClip };
AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Attack loop sound replaced -> " + ((Object)AngryDuckMod.instance.attackLoopClip).name));
}
if ((Object)(object)AngryDuckMod.instance.stunClip != (Object)null)
{
__instance.stunSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.stunClip };
AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Stun sound replaced -> " + ((Object)AngryDuckMod.instance.stunClip).name));
}
if ((Object)(object)AngryDuckMod.instance.stunStopClip != (Object)null)
{
__instance.stunStopSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.stunStopClip };
AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Stun stop sound replaced -> " + ((Object)AngryDuckMod.instance.stunStopClip).name));
}
if ((Object)(object)AngryDuckMod.instance.transformClip != (Object)null)
{
__instance.transformSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.transformClip };
AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Transform sound replaced -> " + ((Object)AngryDuckMod.instance.transformClip).name));
}
if ((Object)(object)AngryDuckMod.instance.deathClip != (Object)null)
{
__instance.deathSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.deathClip };
AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Death sound replaced -> " + ((Object)AngryDuckMod.instance.deathClip).name));
}
if ((Object)(object)AngryDuckMod.instance.noticeClip != (Object)null)
{
__instance.noticeSound.Sounds = (AudioClip[])(object)new AudioClip[1] { AngryDuckMod.instance.noticeClip };
AngryDuckMod.instance.logger.LogInfo((object)("[AUDIO] Notice sound replaced -> " + ((Object)AngryDuckMod.instance.noticeClip).name));
}
}
}