Decompiled source of RedRisingCards v1.14.0
RedRisingCards.dll
Decompiled a day ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using MapsExt; using MapsExt.MapObjects; using MapsExt.Properties; using Photon.Pun; using RedRisingCards.Cards; using RedRisingCards.Effects; using RedRisingCards.Maps; using RedRisingCards.Patches; using RedRisingCards.Terrain; using RedRisingCards.Util; using Sirenix.Serialization; using TMPro; using UnboundLib; using UnboundLib.Cards; using UnboundLib.GameModes; using UnboundLib.Networking; using UnboundLib.Utils; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyVersion("0.0.0.0")] namespace RedRisingCards { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.lel.rounds.redrisingcards", "Red Rising Cards", "1.14.0")] [BepInProcess("Rounds.exe")] public class Plugin : BaseUnityPlugin { public const string ModId = "com.lel.rounds.redrisingcards"; public const string ModName = "Red Rising Cards"; public const string Version = "1.14.0"; public const string ModInitials = "RR"; public const string MapsExtendedId = "io.olavim.rounds.mapsextended"; private const int ConfigVersion = 11; private const int LastFullResetVersion = 10; public const bool AllCommon = true; internal static Plugin Instance; internal static ManualLogSource Log; internal static ConfigEntry<float> BootsDuration; internal static ConfigEntry<float> BootsHorizontalThrust; internal static ConfigEntry<float> BootsUpThrust; internal static ConfigEntry<float> BootsDownThrust; internal static ConfigEntry<float> BootsBlockCooldownAdd; internal static ConfigEntry<float> FistChargeTime; internal static ConfigEntry<float> FistMinDamage; internal static ConfigEntry<float> FistMaxDamage; internal static ConfigEntry<float> FistKnockback; internal static ConfigEntry<float> FistFlatSize; internal static ConfigEntry<float> FistChargedSize; internal static ConfigEntry<float> FistChargedKnockback; internal static ConfigEntry<float> RazorDamage; internal static ConfigEntry<float> RazorReach; internal static ConfigEntry<float> RazorArc; internal static ConfigEntry<float> RazorCooldown; internal static ConfigEntry<float> ScytheDamage; internal static ConfigEntry<float> ScytheReach; internal static ConfigEntry<float> ScytheArc; internal static ConfigEntry<float> ScytheCooldown; internal static ConfigEntry<float> ScythePull; internal static ConfigEntry<float> TwinDamage; internal static ConfigEntry<float> TwinReach; internal static ConfigEntry<float> TwinArc; internal static ConfigEntry<float> TwinCooldown; internal static ConfigEntry<float> RazorKnockback; internal static ConfigEntry<float> RazorChargeTime; internal static ConfigEntry<float> RazorThrowRecover; internal static ConfigEntry<float> RazorJavelinDamage; internal static ConfigEntry<float> RazorJavelinSpeed; internal static ConfigEntry<float> RazorJavelinGravity; internal static ConfigEntry<float> RazorDeflectCooldown; internal static ConfigEntry<float> RazorDeflectDamage; internal static ConfigEntry<bool> RazorBladeGuard; internal static ConfigEntry<bool> TwinDeflects; internal static ConfigEntry<float> RazorGuardTime; internal static ConfigEntry<float> RazorGuardCone; internal static ConfigEntry<float> RazorGuardCooldown; internal static ConfigEntry<bool> RazorCutPlatforms; internal static ConfigEntry<float> RazorLungeSpeed; internal static ConfigEntry<float> RazorLungeDistance; internal static ConfigEntry<float> RazorLungeDamage; internal static ConfigEntry<int> RazorAirUpLunges; internal static ConfigEntry<float> CloakDuration; internal static ConfigEntry<float> CloakExtraDurationPerCopy; internal static ConfigEntry<float> CloakMaxDuration; internal static ConfigEntry<float> CloakBlockCooldownAdd; internal static ConfigEntry<float> CloakMoveSpeed; internal static ConfigEntry<float> DiveDistance; internal static ConfigEntry<float> DiveSpeed; internal static ConfigEntry<float> DiveKnockback; internal static ConfigEntry<float> DiveSilence; internal static ConfigEntry<float> DiveBlockCooldownAdd; internal static ConfigEntry<bool> DiveCarveTunnels; internal static ConfigEntry<float> DiveTunnelPadding; internal static ConfigEntry<float> SoundVolume; internal static ConfigEntry<float> ParasiteLineLength; internal static ConfigEntry<float> ParasiteTurnRate; internal static ConfigEntry<float> ParasiteCone; internal static ConfigEntry<float> ParasiteRange; internal static ConfigEntry<float> ParasiteDamage; internal static ConfigEntry<string> ParasiteAimLineMode; internal static ConfigEntry<float> StormBoltDamage; internal static ConfigEntry<float> StormArcDamage; internal static ConfigEntry<int> StormArcTargets; internal static ConfigEntry<float> StormArcRange; internal static ConfigEntry<float> StormDelay; internal static ConfigEntry<float> StormTargetCooldown; internal static ConfigEntry<float> StormExtraCopyBonus; internal static ConfigEntry<float> RageMaxBonus; internal static ConfigEntry<float> RageFullAtHealth; internal static ConfigEntry<float> RageMoveSpeed; internal static ConfigEntry<float> RageExtraCopyBonus; internal static ConfigEntry<float> CarvedHealth; internal static ConfigEntry<float> CarvedDamage; internal static ConfigEntry<float> CarvedSize; internal static ConfigEntry<float> CarvedMoveSpeed; internal static ConfigEntry<float> PeerlessMultiplier; internal static ConfigEntry<float> PeerlessRecharge; internal static ConfigEntry<float> PeerlessExtraCopyMultiplier; internal static ConfigEntry<float> PeerlessExtraCopyRechargeCut; internal static ConfigEntry<float> IronRainSlamSpeed; internal static ConfigEntry<float> IronRainSteer; internal static ConfigEntry<float> IronRainRadius; internal static ConfigEntry<float> IronRainDamage; internal static ConfigEntry<float> IronRainLaunch; internal static ConfigEntry<float> IronRainCrater; internal static ConfigEntry<float> IronRainMaxTime; internal static ConfigEntry<float> OverchargeRadius; internal static ConfigEntry<float> OverchargeDamage; internal static ConfigEntry<float> OverchargeLaunch; internal static ConfigEntry<float> OverchargeChargeFaster; internal static ConfigEntry<float> AmbushDamage; internal static ConfigEntry<float> AmbushSilence; internal static ConfigEntry<float> AmbushExtraCloak; internal static ConfigEntry<float> ClawdrillRamDamage; internal static ConfigEntry<float> ClawdrillDistanceBonus; internal static ConfigEntry<float> ClawdrillBlockCooldown; internal static ConfigEntry<float> BroodDrainPerSecond; internal static ConfigEntry<float> BroodDuration; internal static ConfigEntry<float> BroodHealFraction; internal static ConfigEntry<float> ArmorHealth; internal static ConfigEntry<float> ArmorInvulnerableTime; internal static ConfigEntry<float> ArmorHealFraction; internal static ConfigEntry<float> ObsidianHealth; internal static ConfigEntry<float> ObsidianRegen; internal static ConfigEntry<float> ObsidianDamage; internal static ConfigEntry<float> WillowDamage; internal static ConfigEntry<float> WillowReach; internal static ConfigEntry<float> WillowGuardTime; internal static ConfigEntry<float> TempestDamage; internal static ConfigEntry<float> TempestRange; internal static ConfigEntry<int> TempestTargets; internal static ConfigEntry<float> FuryDuration; internal static ConfigEntry<float> FuryCooldown; internal static ConfigEntry<float> FuryMoveSpeed; internal static ConfigEntry<float> IronRainExtraDamage; internal static ConfigEntry<float> IronRainExtraRadius; internal static ConfigEntry<float> OverchargeExtraDamage; internal static ConfigEntry<float> AmbushExtraMultiplier; internal static ConfigEntry<float> AmbushExtraSilence; internal static ConfigEntry<float> ClawdrillExtraRamDamage; internal static ConfigEntry<float> BroodExtraDrain; internal static ConfigEntry<float> TempestExtraDamage; internal static ConfigEntry<float> FuryExtraDuration; internal static ConfigEntry<float> FuryExtraCooldownCut; internal static ConfigEntry<float> BootsBulletGravity; internal static ConfigEntry<float> DiveDrillRoundWindow; internal static ConfigEntry<float> TempestBulletSpeed; internal static ConfigEntry<float> FuryFireRate; internal static ConfigEntry<bool> IronRainReloads; internal static ConfigEntry<float> PlanetfallSpeed; internal static ConfigEntry<float> PlanetfallRadius; internal static ConfigEntry<float> PlanetfallDamage; internal static ConfigEntry<float> PlanetfallPoolRadius; internal static ConfigEntry<float> PlanetfallPoolSeconds; internal static ConfigEntry<float> PlanetfallPoolDps; internal static ConfigEntry<float> ThunderheadDamage; internal static ConfigEntry<float> ThunderheadInterval; internal static ConfigEntry<float> ThunderheadRange; internal static ConfigEntry<float> ThunderheadExtraIntervalCut; internal static ConfigEntry<float> ReapThreshold; internal static ConfigEntry<float> ReapDamage; internal static ConfigEntry<float> ReapBlockRefund; internal static ConfigEntry<float> PlateHealth; internal static ConfigEntry<float> PlateRecharge; internal static ConfigEntry<float> PlateNovaDamage; internal static ConfigEntry<float> PlateNovaRadius; internal static ConfigEntry<float> PlateNovaLaunch; internal static ConfigEntry<float> RipwingSpeed; internal static ConfigEntry<float> RipwingExtraFlight; internal static ConfigEntry<float> RipwingRamDamage; internal static ConfigEntry<float> RipwingRamLaunch; internal static ConfigEntry<float> RipwingMinSpeed; internal static ConfigEntry<float> RipwingRamCooldown; internal static ConfigEntry<float> WrathRageScale; internal static ConfigEntry<float> WrathStrikeDelay; internal static ConfigEntry<float> WrathTargetCooldown; internal static ConfigEntry<float> WrathLifesteal; internal static ConfigEntry<float> PhantomExtraCloak; internal static ConfigEntry<float> PhantomDashBonus; internal static ConfigEntry<float> PhantomRamDamage; internal static ConfigEntry<float> PhantomRamSilence; internal static ConfigEntry<float> SeekerTurnRate; internal static ConfigEntry<float> SeekerCone; internal static ConfigEntry<float> SeekerRange; internal static ConfigEntry<float> SeekerSteerTime; internal static ConfigEntry<float> SeekerRechargeCut; internal static ConfigEntry<float> SeekerSilence; internal static ConfigEntry<float> CometDistance; internal static ConfigEntry<float> CometSpeed; internal static ConfigEntry<float> CometDamage; internal static ConfigEntry<float> CometLaunch; internal static ConfigEntry<float> CometChargeCut; internal static Rarity Rarity(Rarity normal) { return (Rarity)0; } private void Awake() { //IL_0913: Unknown result type (might be due to invalid IL or missing references) //IL_091d: Expected O, but got Unknown //IL_0c1e: Unknown result type (might be due to invalid IL or missing references) //IL_0c24: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; BootsDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Gravity Boots", "Duration", 3f, "Seconds of flight after each block. (Gravity Boots is a FLIGHT slot card: one copy only.)"); BootsHorizontalThrust = ((BaseUnityPlugin)this).Config.Bind<float>("Gravity Boots", "HorizontalThrust", 2.18f, "Extra sideways push per physics tick. Vanilla air movement is ~2.72, so 2.18 = +80% air speed; top speed is roughly (2.72 + this) / 0.16."); BootsUpThrust = ((BaseUnityPlugin)this).Config.Bind<float>("Gravity Boots", "UpThrust", 3.2f, "Upward push per physics tick. Top climb speed is roughly this / 0.16."); BootsDownThrust = ((BaseUnityPlugin)this).Config.Bind<float>("Gravity Boots", "DownThrust", 0f, "Extra downward push per tick (vanilla fast-fall already applies)."); BootsBlockCooldownAdd = ((BaseUnityPlugin)this).Config.Bind<float>("Gravity Boots", "BlockCooldownAdd", 0.25f, "Seconds added to block cooldown by the card (its drawback)."); BootsBulletGravity = ((BaseUnityPlugin)this).Config.Bind<float>("Gravity Boots", "BulletGravityMultiplier", 0.4f, "Gun effect: your bullets' gravity x this (0.4 = 60% less bullet drop, flatter and longer shots; 1 = off)."); FistChargeTime = ((BaseUnityPlugin)this).Config.Bind<float>("Pulse Fist", "ChargeTime", 1f, "Seconds to reach full charge (faster with attack speed)."); FistMinDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Pulse Fist", "TapDamageMultiplier", 0.5f, "Damage multiplier for an uncharged tap shot."); FistMaxDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Pulse Fist", "FullChargeDamageMultiplier", 2.75f, "Damage multiplier at full charge."); FistKnockback = ((BaseUnityPlugin)this).Config.Bind<float>("Pulse Fist", "KnockbackMultiplier", 1.25f, "Flat knockback multiplier from the card."); FistChargedKnockback = ((BaseUnityPlugin)this).Config.Bind<float>("Pulse Fist", "FullChargeKnockbackMultiplier", 1.75f, "Per-shot knockback multiplier at full charge (tap shots get 0.75x)."); FistFlatSize = ((BaseUnityPlugin)this).Config.Bind<float>("Pulse Fist", "FlatBulletSize", 0.15f, "Bullet radius added at any charge (Big Bullet is ~0.25)."); FistChargedSize = ((BaseUnityPlugin)this).Config.Bind<float>("Pulse Fist", "ChargedBulletSize", 0.45f, "Extra bullet radius added at full charge."); RazorDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "CutDamage", 60f, "Damage per straight razor cut (vanilla bullet = 55). Reaper Scythe and Twin Razors multiply it. Scales with your damage cards."); RazorReach = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "Reach", 3.4f, "Straight razor reach in world units from your centre (player is ~1.3 wide). Grows with your body size."); RazorArc = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "Arc", 140f, "Straight razor sweep: degrees of arc in front of you that each cut hits."); RazorCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "Cooldown", 0.2f, "Seconds between straight razor cuts at base attack speed (attack speed cards make it faster)."); ScytheDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "ScytheDamageMultiplier", 1.8f, "Reaper Scythe: damage per sweep, x CutDamage."); ScytheReach = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "ScytheReach", 4.8f, "Reaper Scythe: reach in world units."); ScytheArc = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "ScytheArc", 190f, "Reaper Scythe: degrees of arc each sweep hits."); ScytheCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "ScytheCooldown", 0.42f, "Reaper Scythe: seconds between sweeps at base attack speed."); ScythePull = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "ScythePull", 1500f, "Reaper Scythe: impulse dragging each enemy hit toward you (and a little up)."); TwinDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "TwinDamageMultiplier", 0.85f, "Twin Razors: damage per cut, x CutDamage."); TwinReach = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "TwinReach", 3.4f, "Twin Razors: reach in world units."); TwinArc = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "TwinArc", 120f, "Twin Razors: degrees of arc each cut hits."); TwinCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "TwinCooldown", 0.14f, "Twin Razors: seconds between cuts at base attack speed (the blades alternate)."); RazorKnockback = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "Knockback", 1500f, "Push on each cut (the scythe pulls instead)."); RazorChargeTime = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "JavelinChargeTime", 0.4f, "Seconds to hold fire before releasing throws the blade."); RazorThrowRecover = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "ThrowRecoverTime", 0.7f, "Seconds without a blade after a throw."); RazorJavelinDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "JavelinDamageMultiplier", 3.5f, "Thrown blade damage, x your normal bullet damage."); RazorJavelinSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "JavelinSpeedMultiplier", 2.3f, "Thrown blade speed, x a normal bullet."); RazorJavelinGravity = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "JavelinGravityMultiplier", 0.05f, "Thrown blade gravity and lift, x a normal bullet (0 = dead straight)."); RazorDeflectCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "DeflectCooldown", 0.75f, "Minimum seconds between parry shots fired back while blocking."); RazorDeflectDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "DeflectDamage", 0.6f, "Damage multiplier of the parry shot fired back when you block a bullet (1 = a normal shot)."); RazorBladeGuard = ((BaseUnityPlugin)this).Config.Bind<bool>("Razor", "BladeGuard", true, "A swing guards for BladeGuardTime, at most once per BladeGuardCooldown: enemy bullets that reach the blade (inside its reach) or your body from inside BladeGuardCone of the swing are stopped. Razor and Reaper Scythe cut them out of the air; Twin Razors deflect them. Decided on the shooter's client, like a vanilla block, so it works online."); RazorGuardTime = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "BladeGuardTime", 0.15f, "Seconds each swing's blade guard lasts."); RazorGuardCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "BladeGuardCooldown", 0.6f, "Minimum seconds between blade guards: swings inside this window cut enemies but don't guard, so parrying is timed instead of always on."); RazorGuardCone = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "BladeGuardCone", 50f, "Degrees either side of the swing direction the blade guard covers."); TwinDeflects = ((BaseUnityPlugin)this).Config.Bind<bool>("Razor", "TwinRazorsDeflect", true, "Twin Razors send guarded bullets back along your aim at full speed (they become yours and can hit their shooter) instead of just cutting them."); RazorLungeDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "LungeDistance", 3f, "Twin Razors: every cut dashes you this far toward your aim, on the ground or in the air (world units; the player is ~1.3 wide)."); RazorLungeSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "LungeSpeed", 45f, "Twin Razors: dash speed in units/second."); RazorLungeDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Razor", "LungeContactDamage", 0.5f, "Twin Razors: the dash itself cuts each enemy it passes through once, for this x CutDamage (0 = off)."); RazorAirUpLunges = ((BaseUnityPlugin)this).Config.Bind<int>("Razor", "MaxAirUpwardLunges", 5, "Twin Razors: how many cuts per airtime may dash you upward (then they dash sideways only until you land or grab a wall), so a flurry can't fly forever."); RazorCutPlatforms = ((BaseUnityPlugin)this).Config.Bind<bool>("Razor", "CutThinPlatforms", true, "Javelin throws (any form) slice a gap through thin platforms (up to 1.3 units thick) and keep flying; thick walls still stop them. Reaper Scythe sweeps cut thin platforms their arc overlaps (at most 2 cuts per swing). The thrower's setting decides."); CloakDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Ghost Cloak", "Duration", 2.2f, "Seconds invisible after blocking. Firing reveals you early."); CloakExtraDurationPerCopy = ((BaseUnityPlugin)this).Config.Bind<float>("Ghost Cloak", "ExtraDurationPerCopy", 0.5f, "Extra seconds per additional copy."); CloakMaxDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Ghost Cloak", "MaxDuration", 4f, "Cap on the cloak length from copies, Howler Ambush and Phantom Drill together (points last 5-15s)."); CloakBlockCooldownAdd = ((BaseUnityPlugin)this).Config.Bind<float>("Ghost Cloak", "BlockCooldownAdd", 0.5f, "Seconds added to block cooldown (drawback)."); CloakMoveSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Ghost Cloak", "MoveSpeedWhileCloaked", 1.2f, "Movement speed multiplier while the cloak lasts (1.2 = +20%)."); DiveDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Helldiver", "DashDistance", 8.5f, "Dash length in world units (player is ~1.3 wide). Extra copies add 25% each (counted up to 4 copies)."); DiveSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Helldiver", "DashSpeed", 60f, "Dash speed in units/second."); DiveKnockback = ((BaseUnityPlugin)this).Config.Bind<float>("Helldiver", "RamKnockback", 3500f, "Impulse on enemies you drill into (no damage)."); DiveSilence = ((BaseUnityPlugin)this).Config.Bind<float>("Helldiver", "RamSilence", 0.6f, "Seconds an enemy you drill into can't shoot or block."); DiveBlockCooldownAdd = ((BaseUnityPlugin)this).Config.Bind<float>("Helldiver", "BlockCooldownAdd", 0.75f, "Seconds added to block cooldown (drawback; every copy adds it)."); DiveCarveTunnels = ((BaseUnityPlugin)this).Config.Bind<bool>("Helldiver", "CarveTunnels", true, "The dash drills a real tunnel through the walls and platforms it passes (carved the same way on every client; the dasher's setting decides)."); DiveTunnelPadding = ((BaseUnityPlugin)this).Config.Bind<float>("Helldiver", "TunnelRadiusPadding", 0.35f, "Tunnel radius = your body radius + this (world units)."); DiveDrillRoundWindow = ((BaseUnityPlugin)this).Config.Bind<float>("Helldiver", "DrillRoundWindow", 2.5f, "Gun effect: after a drill dash ends, your next shot (the whole volley) within this many seconds is a drill round that flies through walls and platforms. 0 = off."); SoundVolume = ((BaseUnityPlugin)this).Config.Bind<float>("Sound", "Volume", 1f, "Volume of this mod's own sounds (Razor parry, Storm Knight thunder), on top of the game's SFX slider."); ParasiteLineLength = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite", "AimLineLength", 28f, "Length of the aim line in world units (player is ~1.3 wide). Extra copies add 25%."); ParasiteTurnRate = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite", "HomingTurnRate", 125f, "Degrees per second a bullet can turn toward an enemy. Extra copies add 60% (capped at 200)."); ParasiteCone = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite", "HomingCone", 30f, "Only visible enemies within this many degrees either side of a bullet's path pull it. Extra copies add 10 (capped at 36). Homing stops 1.5s after the shot."); ParasiteRange = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite", "HomingRange", 24f, "Only enemies this close to a bullet pull it."); ParasiteDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite", "DamageMultiplier", 0.95f, "Bullet damage multiplier (the drawback)."); ParasiteAimLineMode = ((BaseUnityPlugin)this).Config.Bind<string>("Parasite", "AimLineMode", "WhileShooting", new ConfigDescription("When your aim line shows. WhileShooting: while you hold fire and for 0.6s after each of your shots. Always: all the time. (With Razor it only shows while lining up a throw.)", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[2] { "WhileShooting", "Always" }), Array.Empty<object>())); StormBoltDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Storm Knight", "BoltDamage", 35f, "Damage of the lightning bolt that strikes an enemy your bullet hit."); StormArcDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Storm Knight", "ArcDamage", 18f, "Damage of each arc that jumps from the struck enemy to a nearby other enemy."); StormArcTargets = ((BaseUnityPlugin)this).Config.Bind<int>("Storm Knight", "ArcTargets", 2, "How many other enemies (nearest first, within ArcRange) the bolt arcs to."); StormArcRange = ((BaseUnityPlugin)this).Config.Bind<float>("Storm Knight", "ArcRange", 6f, "How far (world units) the arc can jump. The player is ~1.3 units wide."); StormDelay = ((BaseUnityPlugin)this).Config.Bind<float>("Storm Knight", "StrikeDelay", 0.35f, "Seconds between your bullet hitting and the bolt landing."); StormTargetCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Storm Knight", "TargetCooldown", 0.8f, "Minimum seconds between bolts on the same enemy."); StormExtraCopyBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Storm Knight", "ExtraCopyDamageBonus", 0.4f, "Each extra copy multiplies bolt and arc damage by this much more (0.4 = +40%; counted up to 3 copies)."); RageMaxBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Rage Knight", "MaxDamageBonus", 1f, "Extra bullet damage at (or below) FullRageHealth. 1 = +100%. It rises linearly from +0% at full health."); RageFullAtHealth = ((BaseUnityPlugin)this).Config.Bind<float>("Rage Knight", "FullRageHealth", 0.1f, "Health fraction at which the bonus is maxed out (0.1 = 10% health)."); RageMoveSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Rage Knight", "MoveSpeedMultiplier", 1.1f, "Movement speed multiplier from the card (every copy applies it)."); RageExtraCopyBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Rage Knight", "ExtraCopyMaxBonus", 0.5f, "Each extra copy raises MaxDamageBonus by this much (0.5 = +50%; counted up to 3 copies)."); CarvedHealth = ((BaseUnityPlugin)this).Config.Bind<float>("Carved", "HealthMultiplier", 1.7f, "Max health multiplier."); CarvedDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Carved", "DamageMultiplier", 1.35f, "Bullet damage multiplier."); CarvedSize = ((BaseUnityPlugin)this).Config.Bind<float>("Carved", "SizeMultiplier", 1.1f, "Body size multiplier (extra health already grows you a little)."); CarvedMoveSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Carved", "MoveSpeedMultiplier", 0.9f, "Movement speed multiplier."); PeerlessMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Peerless Scarred", "FirstHitDamageMultiplier", 2.5f, "Damage multiplier for the empowered hit: your next hit while the gold star shows (it recharges RechargeSeconds after landing)."); PeerlessRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("Peerless Scarred", "RechargeSeconds", 3f, "Seconds after the empowered hit lands before it is ready again (0 = once per point)."); PeerlessExtraCopyMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Peerless Scarred", "ExtraCopyMultiplier", 0.5f, "Each extra copy adds this to the empowered hit multiplier (counted up to 4 copies)."); PeerlessExtraCopyRechargeCut = ((BaseUnityPlugin)this).Config.Bind<float>("Peerless Scarred", "ExtraCopyRechargeCut", 0.5f, "Each extra copy takes this many seconds off the recharge (never below 1.5s; counted up to 4 copies)."); BindUnlockConfig(); BindSecondWaveConfig(); BindComboConfig(); BooksConfig.Bind(((BaseUnityPlugin)this).Config); ResetConfigIfOutdated(); RazorEffect.ApplyConfig(); ((BaseUnityPlugin)this).Logger.LogWarning((object)"TEST BUILD: every Red Rising card is Common."); MapKit.Init((BaseUnityPlugin)(object)this, ((BaseUnityPlugin)this).Config, ((BaseUnityPlugin)this).Logger, "RedRisingCards"); Harmony val = new Harmony("com.lel.rounds.redrisingcards"); val.PatchAll(); LogPatchStatus(val); if (MapKit.MapsEnabled.Value && Chainloader.PluginInfos.ContainsKey("io.olavim.rounds.mapsextended")) { WriteMaps(); } } private void BindUnlockConfig() { IronRainSlamSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "SlamSpeed", 60f, "Block in midair while holding down: you dive straight down at this speed (units/second) until you land."); IronRainSteer = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "SteerSpeed", 8f, "Sideways speed you can steer with during the dive."); IronRainRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "ShockwaveRadius", 5.5f, "Landing shockwave radius in world units (the player is ~1.3 wide)."); IronRainDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "ShockwaveDamage", 50f, "Damage the landing shockwave deals to each enemy in range (a blocking enemy takes none)."); IronRainLaunch = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "LaunchSpeed", 38f, "Speed the shockwave throws enemies up and away at (less at the edge of the radius)."); IronRainCrater = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "CraterRadius", 1.4f, "Radius of the crater the landing punches into the ground (0 = no crater). Carved the same way on every client; the slammer's setting decides."); IronRainMaxTime = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "MaxDiveTime", 2f, "Seconds a dive may last before it gives up without a shockwave (falling off the map)."); IronRainExtraDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "ExtraCopyDamageBonus", 0.25f, "Each extra copy: shockwave damage +this fraction (counted up to 3 copies)."); IronRainExtraRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Iron Rain", "ExtraCopyRadiusBonus", 0.1f, "Each extra copy: shockwave radius +this fraction (counted up to 3 copies)."); IronRainReloads = ((BaseUnityPlugin)this).Config.Bind<bool>("Iron Rain", "LandingReloads", true, "Gun effect: the landing shockwave instantly refills your ammo."); OverchargeRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Overcharge", "BlastRadius", 4f, "Full-charge Pulse Fist punches detonate on impact: blast radius in world units."); OverchargeDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Overcharge", "BlastDamage", 45f, "Blast damage to every enemy in range, on top of the punch itself."); OverchargeLaunch = ((BaseUnityPlugin)this).Config.Bind<float>("Overcharge", "BlastLaunchSpeed", 30f, "Speed the blast throws enemies away at (less at the edge)."); OverchargeChargeFaster = ((BaseUnityPlugin)this).Config.Bind<float>("Overcharge", "ChargeTimeReduction", 0.3f, "Pulse Fist charges this much faster (0.3 = 30% less charge time)."); OverchargeExtraDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Overcharge", "ExtraCopyBlastDamage", 15f, "Each extra copy adds this much blast damage (counted up to 3 copies)."); AmbushDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Howler Ambush", "AmbushDamageMultiplier", 2.2f, "Damage multiplier for shots fired (or Razor cuts made) out of the Ghost Cloak."); AmbushSilence = ((BaseUnityPlugin)this).Config.Bind<float>("Howler Ambush", "AmbushSilence", 1f, "Seconds an enemy hit by an ambush can't shoot or block."); AmbushExtraCloak = ((BaseUnityPlugin)this).Config.Bind<float>("Howler Ambush", "ExtraCloakTime", 0.6f, "Extra seconds of Ghost Cloak invisibility (once, not per copy)."); AmbushExtraMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Howler Ambush", "ExtraCopyMultiplier", 0.4f, "Each extra copy adds this to the ambush damage multiplier (counted up to 3 copies)."); AmbushExtraSilence = ((BaseUnityPlugin)this).Config.Bind<float>("Howler Ambush", "ExtraCopySilence", 0.25f, "Each extra copy adds this many seconds of ambush silence (counted up to 3 copies)."); ClawdrillRamDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Clawdrill", "RamDamage", 55f, "Damage your Helldiver drill now deals to each enemy it rams (the knockback and silence stay)."); ClawdrillDistanceBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Clawdrill", "DashLengthBonus", 0.35f, "Helldiver dash length bonus (0.35 = +35%)."); ClawdrillBlockCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Clawdrill", "BlockCooldownReduction", 0.5f, "Seconds taken off your block cooldown (offsets Helldiver's penalty; every copy applies it)."); ClawdrillExtraRamDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Clawdrill", "ExtraCopyRamDamage", 25f, "Each extra copy adds this much ram damage (counted up to 3 copies)."); BroodDrainPerSecond = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite Brood", "DrainPerSecond", 12f, "Bullet hits infest the enemy: they lose this much health per second (dealt in half-second ticks, none while they block)."); BroodDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite Brood", "InfestSeconds", 3f, "How long an infestation lasts; another hit refreshes it."); BroodHealFraction = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite Brood", "HealFraction", 1f, "You heal this fraction of the drained health (1 = all of it)."); BroodExtraDrain = ((BaseUnityPlugin)this).Config.Bind<float>("Parasite Brood", "ExtraCopyDrain", 6f, "Each extra copy adds this much drain per second (counted up to 3 copies)."); ArmorHealth = ((BaseUnityPlugin)this).Config.Bind<float>("Aureate Armor", "HealthMultiplier", 1.3f, "Max health multiplier."); ArmorInvulnerableTime = ((BaseUnityPlugin)this).Config.Bind<float>("Aureate Armor", "InvulnerableSeconds", 1.5f, "Once per point, a killing blow leaves you at 1 health and you take no damage for this long."); ArmorHealFraction = ((BaseUnityPlugin)this).Config.Bind<float>("Aureate Armor", "HealFraction", 0.4f, "Fraction of your max health restored when the armor saves you."); ObsidianHealth = ((BaseUnityPlugin)this).Config.Bind<float>("Obsidian Frame", "HealthMultiplier", 1.6f, "Max health multiplier."); ObsidianRegen = ((BaseUnityPlugin)this).Config.Bind<float>("Obsidian Frame", "Regeneration", 10f, "Health regenerated per second, per copy (counted up to 3 copies; health and damage stack like any stat card)."); ObsidianDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Obsidian Frame", "DamageMultiplier", 1.2f, "Bullet damage multiplier."); WillowDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Willow Way", "SpinDamageMultiplier", 1.25f, "Block: a spinning cut all around you. Damage x your current Razor form's cut damage."); WillowReach = ((BaseUnityPlugin)this).Config.Bind<float>("Willow Way", "SpinReachMultiplier", 1.15f, "Spin reach x your current Razor form's reach."); WillowGuardTime = ((BaseUnityPlugin)this).Config.Bind<float>("Willow Way", "BulletGuardSeconds", 0.4f, "The spin cuts enemy bullets from every side for this long (needs Razor BladeGuard on)."); TempestDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Tempest", "BoltDamage", 55f, "Block: lightning strikes the nearest enemies for this much (Storm Knight arcs still jump from them)."); TempestTargets = ((BaseUnityPlugin)this).Config.Bind<int>("Tempest", "Targets", 2, "How many enemies (nearest first) each block strikes."); TempestRange = ((BaseUnityPlugin)this).Config.Bind<float>("Tempest", "Range", 18f, "Only enemies this close (world units) can be struck. Invisible enemies can't be targeted."); TempestExtraDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Tempest", "ExtraCopyDamage", 20f, "Each extra copy adds this much bolt damage (counted up to 3 copies)."); TempestBulletSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Tempest", "BulletSpeedMultiplier", 1.2f, "Gun effect: bullet speed x this per copy (a normal stat: 1.2 = +20%, every copy applies it again)."); FuryDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Blood Fury", "Duration", 3f, "Block: seconds of blood fury (your Rage Knight bonus counts as maxed out)."); FuryCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Blood Fury", "Cooldown", 5f, "Seconds from one fury starting until a block can start the next."); FuryMoveSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Blood Fury", "MoveSpeedMultiplier", 1.3f, "Movement speed multiplier while the fury lasts."); FuryExtraDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Blood Fury", "ExtraCopyDuration", 0.5f, "Each extra copy adds this many seconds of fury (counted up to 3 copies)."); FuryExtraCooldownCut = ((BaseUnityPlugin)this).Config.Bind<float>("Blood Fury", "ExtraCopyCooldownCut", 0.5f, "Each extra copy takes this many seconds off the cooldown (counted up to 3 copies)."); FuryFireRate = ((BaseUnityPlugin)this).Config.Bind<float>("Blood Fury", "FireRateMultiplier", 1.4f, "Gun effect: you fire this much faster while the fury lasts (1.4 = +40% fire rate; Razor cuts speed up too). 1 = off."); } private void BindSecondWaveConfig() { PlanetfallSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Planetfall", "DiveSpeedMultiplier", 1.35f, "Iron Rain dive speed multiplier (the meteor falls faster)."); PlanetfallRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Planetfall", "ImpactRadiusMultiplier", 1.4f, "Iron Rain shockwave radius multiplier (the crater grows the same; launch grows with its square root)."); PlanetfallDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Planetfall", "ImpactDamageMultiplier", 1.6f, "Iron Rain shockwave damage multiplier."); PlanetfallPoolRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Planetfall", "MoltenRadius", 3.5f, "Half-width of the molten pool the impact leaves (world units; the player is ~1.3 wide). 0 = no pool."); PlanetfallPoolSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Planetfall", "MoltenSeconds", 3f, "How long the molten pool burns."); PlanetfallPoolDps = ((BaseUnityPlugin)this).Config.Bind<float>("Planetfall", "MoltenDamagePerSecond", 30f, "Damage per second to enemies standing in the pool (dealt in quarter-second ticks; blocking skips a tick)."); ThunderheadDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Thunderhead", "BoltDamage", 35f, "Damage of each bolt the storm cloud over your head strikes."); ThunderheadInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Thunderhead", "Interval", 1.4f, "Seconds for the cloud to charge a bolt. With nobody in range it holds the charge and strikes the next enemy who comes close."); ThunderheadRange = ((BaseUnityPlugin)this).Config.Bind<float>("Thunderhead", "Range", 10f, "Only enemies this close (world units) are struck. Invisible enemies can't be targeted."); ThunderheadExtraIntervalCut = ((BaseUnityPlugin)this).Config.Bind<float>("Thunderhead", "ExtraCopyIntervalCut", 0.3f, "Each extra copy takes this many seconds off the interval (counted up to 3 copies; never below 0.5s)."); ReapThreshold = ((BaseUnityPlugin)this).Config.Bind<float>("Reaping Stroke", "HealthThreshold", 0.4f, "Razor cuts (and Willow Way spins) on an enemy at or below this fraction of their max health are reaping strokes."); ReapDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Reaping Stroke", "DamageMultiplier", 2f, "Damage multiplier of a reaping stroke (on top of every other Razor multiplier)."); ReapBlockRefund = ((BaseUnityPlugin)this).Config.Bind<float>("Reaping Stroke", "BlockCooldownRefund", 1.5f, "Seconds taken off your block cooldown by each reaping stroke."); PlateHealth = ((BaseUnityPlugin)this).Config.Bind<float>("Imperator Plate", "HealthMultiplier", 1.2f, "Max health multiplier."); PlateRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("Imperator Plate", "RechargeSeconds", 6f, "Seconds after an Aureate Armor save until the save is ready again (without this card it is once per point)."); PlateNovaDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Imperator Plate", "NovaDamage", 50f, "Damage of the golden nova every save releases (less toward the edge)."); PlateNovaRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Imperator Plate", "NovaRadius", 6f, "Radius of the nova (world units)."); PlateNovaLaunch = ((BaseUnityPlugin)this).Config.Bind<float>("Imperator Plate", "NovaLaunchSpeed", 34f, "Speed the nova throws enemies away at (less toward the edge)."); RipwingSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Ripwing", "FlightThrustMultiplier", 1.4f, "Gravity Boots flight thrust multiplier."); RipwingExtraFlight = ((BaseUnityPlugin)this).Config.Bind<float>("Ripwing", "ExtraFlightSeconds", 1f, "Extra seconds of Gravity Boots flight."); RipwingRamDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Ripwing", "RamDamage", 40f, "Damage to each enemy you fly into (a blocking enemy takes none)."); RipwingRamLaunch = ((BaseUnityPlugin)this).Config.Bind<float>("Ripwing", "RamLaunchSpeed", 30f, "Speed a ram throws the enemy at, along your flight."); RipwingMinSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Ripwing", "MinRamSpeed", 5f, "You only ram while flying at least this fast (units/second)."); RipwingRamCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Ripwing", "RamCooldown", 0.7f, "Seconds before the same enemy can be rammed again."); } private void BindComboConfig() { WrathRageScale = ((BaseUnityPlugin)this).Config.Bind<float>("Wrathbolt", "RageScale", 1.25f, "Storm Knight (and Tempest) bolts and arcs deal x(1 + this x your current Rage Knight bonus). At full rage (+100%) and 1.25 that is x2.25."); WrathStrikeDelay = ((BaseUnityPlugin)this).Config.Bind<float>("Wrathbolt", "StrikeDelay", 0.12f, "Seconds between your bullet hitting and the bolt landing (Storm Knight alone: StrikeDelay)."); WrathTargetCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Wrathbolt", "TargetCooldown", 0.5f, "Minimum seconds between bolts on the same enemy (Storm Knight alone: TargetCooldown)."); WrathLifesteal = ((BaseUnityPlugin)this).Config.Bind<float>("Wrathbolt", "Lifesteal", 0.25f, "You heal this fraction of the bolt and arc damage you deal (a blocking enemy gives nothing)."); PhantomExtraCloak = ((BaseUnityPlugin)this).Config.Bind<float>("Phantom Drill", "ExtraCloakSeconds", 1f, "Block: one merged action, cloak then an unseen drill dash. The cloak lasts this much longer (still capped by Ghost Cloak MaxDuration)."); PhantomDashBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Phantom Drill", "DashLengthBonus", 0.3f, "Helldiver dash length bonus for the phantom dash (0.3 = +30%)."); PhantomRamDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Phantom Drill", "RamDamage", 45f, "Damage of a ram made while still cloaked (added to Clawdrill's)."); PhantomRamSilence = ((BaseUnityPlugin)this).Config.Bind<float>("Phantom Drill", "RamSilence", 1.2f, "Seconds a ram made while cloaked silences (instead of Helldiver RamSilence)."); SeekerTurnRate = ((BaseUnityPlugin)this).Config.Bind<float>("Gilded Seeker", "SeekerTurnRate", 420f, "While your Peerless star is ready, your shots hunt: homing degrees per second (Parasite alone caps at 200)."); SeekerCone = ((BaseUnityPlugin)this).Config.Bind<float>("Gilded Seeker", "SeekerCone", 70f, "Seeker shots lock on to visible enemies within this many degrees either side of their path."); SeekerRange = ((BaseUnityPlugin)this).Config.Bind<float>("Gilded Seeker", "SeekerRange", 32f, "Seeker shots only steer toward enemies this close."); SeekerSteerTime = ((BaseUnityPlugin)this).Config.Bind<float>("Gilded Seeker", "SeekerSteerTime", 2.5f, "Seconds after the shot a seeker keeps steering (Parasite alone: 1.5)."); SeekerRechargeCut = ((BaseUnityPlugin)this).Config.Bind<float>("Gilded Seeker", "RechargeReduction", 0.4f, "Peerless Scarred recharges this much faster (0.4 = 40% less time)."); SeekerSilence = ((BaseUnityPlugin)this).Config.Bind<float>("Gilded Seeker", "EmpoweredSilence", 0.5f, "Seconds the empowered (Peerless) hit silences the enemy."); CometDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Comet Gauntlet", "DashDistance", 7f, "While flying with Gravity Boots, a full-charge Pulse Fist punch hurls you this far after it (world units)."); CometSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Comet Gauntlet", "DashSpeed", 55f, "Comet dash speed (units/second)."); CometDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Comet Gauntlet", "CometDamage", 40f, "Damage to every enemy the comet passes through (once each per dash; a blocking enemy takes none)."); CometLaunch = ((BaseUnityPlugin)this).Config.Bind<float>("Comet Gauntlet", "CometLaunchSpeed", 32f, "Speed the comet throws the enemies it hits at, along the dash."); CometChargeCut = ((BaseUnityPlugin)this).Config.Bind<float>("Comet Gauntlet", "FlyingChargeReduction", 0.4f, "Pulse Fist charges this much faster while you fly (0.4 = 40% less charge time)."); } private void LogPatchStatus(Harmony harmony) { try { string[] array = new string[3] { "PlayerVelocity.FixedUpdate (Twin Razors lunge)", "ProjectileHit.Hit (blade guard on hits)", "RayCastTrail.Update (blade guard in reach, javelin cuts)" }; MethodInfo[] array2 = new MethodInfo[3] { AccessTools.Method(typeof(PlayerVelocity), "FixedUpdate", (Type[])null, (Type[])null), AccessTools.Method(typeof(ProjectileHit), "Hit", new Type[2] { typeof(HitInfo), typeof(bool) }, (Type[])null), AccessTools.Method(typeof(RayCastTrail), "Update", (Type[])null, (Type[])null) }; List<string> list = new List<string>(); for (int i = 0; i < array.Length; i++) { string text = array[i]; MethodInfo methodInfo = array2[i]; bool flag = false; if (methodInfo != null) { Patches patchInfo = Harmony.GetPatchInfo((MethodBase)methodInfo); if (patchInfo != null) { foreach (Patch prefix in patchInfo.Prefixes) { if (prefix.owner == harmony.Id) { flag = true; } } } } list.Add(text + (flag ? " OK" : " MISSING")); } ((BaseUnityPlugin)this).Logger.LogInfo((object)("Razor patches: " + string.Join(", ", list))); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Couldn't check Razor patches: " + ex.Message)); } } private void ResetConfigIfOutdated() { ConfigEntry<int> val = ((BaseUnityPlugin)this).Config.Bind<int>("Meta", "ConfigVersion", 0, "Internal. Lets updates reset tuned defaults."); if (val.Value >= 11) { return; } if (val.Value < 10) { foreach (ConfigDefinition item in new List<ConfigDefinition>(((BaseUnityPlugin)this).Config.Keys)) { if (item.Section != "Meta") { ((BaseUnityPlugin)this).Config[item].BoxedValue = ((BaseUnityPlugin)this).Config[item].DefaultValue; } } ((BaseUnityPlugin)this).Logger.LogInfo((object)string.Format("Config reset to the {0} defaults (config version {1}).", "1.14.0", 11)); } else { if (val.Value < 11 && Mathf.Approximately(BooksConfig.BerserkHealth.Value, 0.5f)) { BooksConfig.BerserkHealth.Value = 1f; } ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Config moved to version {11} (only changed defaults still at their old value)."); } val.Value = 11; ((BaseUnityPlugin)this).Config.Save(); } [MethodImpl(MethodImplOptions.NoInlining)] private void WriteMaps() { try { string text = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location) ?? Paths.PluginPath; if (!Path.GetFileName(text).Contains("-")) { text = Path.Combine(Paths.PluginPath, "lel-RedRisingCards"); } SkyCitadelMap.Write(text); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Couldn't write the Sky Citadel map: " + ex)); } } private void Start() { CustomCard.BuildCard<GravityBootsCard>((Action<CardInfo>)delegate(CardInfo card) { GravityBootsCard.Card = card; }); CustomCard.BuildCard<PulseFistCard>((Action<CardInfo>)delegate(CardInfo card) { PulseFistCard.Card = card; }); CustomCard.BuildCard<RazorCard>(); CustomCard.BuildCard<ReaperScytheCard>(); CustomCard.BuildCard<TwinRazorsCard>(); CustomCard.BuildCard<GhostCloakCard>(); CustomCard.BuildCard<HelldiverCard>(); CustomCard.BuildCard<ParasiteCard>(); CustomCard.BuildCard<CarvedCard>(); CustomCard.BuildCard<PeerlessScarredCard>(); CustomCard.BuildCard<StormKnightCard>(); CustomCard.BuildCard<RageKnightCard>(); CustomCard.BuildCard<IronRainCard>(); CustomCard.BuildCard<OverchargeCard>(); CustomCard.BuildCard<HowlerAmbushCard>(); CustomCard.BuildCard<ClawdrillCard>(); CustomCard.BuildCard<ParasiteBroodCard>(); CustomCard.BuildCard<AureateArmorCard>(); CustomCard.BuildCard<ObsidianFrameCard>(); CustomCard.BuildCard<WillowWayCard>(); CustomCard.BuildCard<TempestCard>(); CustomCard.BuildCard<BloodFuryCard>(); CustomCard.BuildCard<PlanetfallCard>(); CustomCard.BuildCard<ThunderheadCard>(); CustomCard.BuildCard<ReapingStrokeCard>(); CustomCard.BuildCard<ImperatorPlateCard>(); CustomCard.BuildCard<RipwingCard>(); CustomCard.BuildCard<WrathboltCard>(); CustomCard.BuildCard<PhantomDrillCard>(); CustomCard.BuildCard<GildedSeekerCard>(); CustomCard.BuildCard<CometGauntletCard>(); BooksCards.Register(); GameModeManager.AddHook("BattleStart", (Func<IGameModeHandler, IEnumerator>)OnBattleStart); MapKit.Start(); } private static IEnumerator OnBattleStart(IGameModeHandler gm) { PeerlessScarredEffect.RearmAll(); AureateArmorEffect.RearmAll(); BloodFuryEffect.ResetAll(); MoltenPool.ClearAll(); ThunderheadEffect.ResetAll(); CometGauntletEffect.ResetAll(); DrillRound.ClearAll(); yield break; } } } namespace RedRisingCards.Util { internal static class ArtSpec { internal enum MotionType { Bob, Sway, Pulse, Flicker, Fade, Loopmove, Expand, Spin, Shake, Strike, Burst, Blink, Jab, Hit, Swing } internal struct Motion { public MotionType Type; public float P; public float A; public float B; public float Ph; public float X0; public float Y0; public float X1; public float Y1; } internal struct Layer { public string Name; public float X; public float Y; public float W; public float H; public float Px; public float Py; public Motion[] Motions; } internal static readonly Dictionary<string, Layer[]> Cards = new Dictionary<string, Layer[]> { ["gravity_boots"] = new Layer[6] { new Layer { Name = "speed", X = 251.67f, Y = 196.67f, W = 156.67f, H = 206.67f, Px = 330f, Py = 300f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 0.9f, A = 0f, B = 0f, Ph = 0f, X0 = 40f, Y0 = 0f, X1 = -60f, Y1 = 0f } } }, new Layer { Name = "chevron_a", X = 801.67f, Y = 140f, W = 136.67f, H = 108.33f, Px = 870f, Py = 194.1667f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 1.2f, A = 0f, B = 0f, Ph = 0f, X0 = 0f, Y0 = -30f, X1 = 0f, Y1 = 50f } } }, new Layer { Name = "chevron_b", X = 805f, Y = 193.33f, W = 130f, H = 101.67f, Px = 870f, Py = 244.1667f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 1.2f, A = 0f, B = 0f, Ph = 0.5f, X0 = 0f, Y0 = -30f, X1 = 0f, Y1 = 50f } } }, new Layer { Name = "flame_l", X = 461.67f, Y = 540f, W = 136.67f, H = 265f, Px = 530f, Py = 575f, Motions = new Motion[2] { new Motion { Type = MotionType.Bob, P = 1.6f, A = 10f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Flicker, P = 0.35f, A = 0.18f, B = 0.25f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "flame_r", X = 651.67f, Y = 540f, W = 136.67f, H = 235f, Px = 720f, Py = 575f, Motions = new Motion[2] { new Motion { Type = MotionType.Bob, P = 1.6f, A = 10f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Flicker, P = 0.3f, A = 0.2f, B = 0.25f, Ph = 0.4f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "boot", X = 401.67f, Y = 95f, W = 446.67f, H = 513.33f, Px = 625f, Py = 520f, Motions = new Motion[1] { new Motion { Type = MotionType.Bob, P = 1.6f, A = 10f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["pulse_fist"] = new Layer[6] { new Layer { Name = "ring_a", X = 763.33f, Y = 285f, W = 118.33f, H = 230f, Px = 745f, Py = 400f, Motions = new Motion[1] { new Motion { Type = MotionType.Expand, P = 1.8f, A = 0f, B = 0f, Ph = 0.05f, X0 = 0.7f, Y0 = 0f, X1 = 2.5f, Y1 = 0f } } }, new Layer { Name = "ring_b", X = 763.33f, Y = 285f, W = 118.33f, H = 230f, Px = 745f, Py = 400f, Motions = new Motion[1] { new Motion { Type = MotionType.Expand, P = 1.8f, A = 0f, B = 0f, Ph = 0.38f, X0 = 0.7f, Y0 = 0f, X1 = 2.5f, Y1 = 0f } } }, new Layer { Name = "ring_c", X = 763.33f, Y = 285f, W = 118.33f, H = 230f, Px = 745f, Py = 400f, Motions = new Motion[1] { new Motion { Type = MotionType.Expand, P = 1.8f, A = 0f, B = 0f, Ph = 0.71f, X0 = 0.7f, Y0 = 0f, X1 = 2.5f, Y1 = 0f } } }, new Layer { Name = "fist", X = 215f, Y = 246.67f, W = 555f, H = 300f, Px = 492.5f, Py = 396.6667f, Motions = new Motion[1] { new Motion { Type = MotionType.Jab, P = 1.8f, A = 22f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "core", X = 678.33f, Y = 326.67f, W = 148.33f, H = 146.67f, Px = 752f, Py = 400f, Motions = new Motion[2] { new Motion { Type = MotionType.Jab, P = 1.8f, A = 22f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Pulse, P = 0.6f, A = 0.18f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "sparks", X = 763.33f, Y = 295f, W = 153.33f, H = 206.67f, Px = 840f, Py = 398.3333f, Motions = new Motion[1] { new Motion { Type = MotionType.Fade, P = 0.45f, A = 0.8f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["razor"] = new Layer[4] { new Layer { Name = "arc_a", X = 200f, Y = 181.67f, W = 793.33f, H = 461.67f, Px = 380f, Py = 614f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 2f, A = 0f, B = 0f, Ph = 0f, X0 = 0.92f, Y0 = 0f, X1 = 1.06f, Y1 = 0f } } }, new Layer { Name = "arc_b", X = 273.33f, Y = 223.33f, W = 631.67f, H = 371.67f, Px = 380f, Py = 614f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 2f, A = 0f, B = 0f, Ph = -0.03f, X0 = 0.9f, Y0 = 0f, X1 = 1.04f, Y1 = 0f } } }, new Layer { Name = "blade", X = 261.67f, Y = 131.67f, W = 736.67f, H = 631.67f, Px = 380f, Py = 614f, Motions = new Motion[2] { new Motion { Type = MotionType.Swing, P = 2f, A = -20f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Bob, P = 3f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "glint", X = 908.33f, Y = 258.33f, W = 120f, H = 120f, Px = 380f, Py = 614f, Motions = new Motion[3] { new Motion { Type = MotionType.Swing, P = 2f, A = -20f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Bob, P = 3f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 0.7f, A = 0.8f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["ghost_cloak"] = new Layer[3] { new Layer { Name = "dust", X = 250f, Y = 183.33f, W = 258.33f, H = 510f, Px = 379.1667f, Py = 438.3333f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 3f, A = 0f, B = 0f, Ph = 0f, X0 = 30f, Y0 = -10f, X1 = -50f, Y1 = 30f } } }, new Layer { Name = "cloak", X = 308.33f, Y = 86.67f, W = 500f, H = 603.33f, Px = 558.3333f, Py = 388.3333f, Motions = new Motion[2] { new Motion { Type = MotionType.Bob, P = 3f, A = 14f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 4f, A = 0.55f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "eyes", X = 470f, Y = 265f, W = 160f, H = 90f, Px = 550f, Py = 310f, Motions = new Motion[3] { new Motion { Type = MotionType.Bob, P = 3f, A = 14f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Blink, P = 3.3f, A = 0f, B = 0f, Ph = 0.2f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 4f, A = 0.3f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["helldiver"] = new Layer[8] { new Layer { Name = "speed", X = 121.67f, Y = 306.67f, W = 176.67f, H = 186.67f, Px = 210f, Py = 400f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 0.6f, A = 0f, B = 0f, Ph = 0f, X0 = 40f, Y0 = 0f, X1 = -70f, Y1 = 0f } } }, new Layer { Name = "rocks", X = 611.67f, Y = 93.33f, W = 188.33f, H = 633.33f, Px = 705.8333f, Py = 410f, Motions = new Motion[1] { new Motion { Type = MotionType.Shake, P = 1f, A = 1.5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "debris_a", X = 778.33f, Y = 256.67f, W = 118.33f, H = 255f, Px = 837.5f, Py = 384.1667f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 0.9f, A = 0f, B = 0f, Ph = 0f, X0 = -40f, Y0 = 0f, X1 = 60f, Y1 = 0f } } }, new Layer { Name = "debris_b", X = 756.67f, Y = 205f, W = 183.33f, H = 276.67f, Px = 848.3333f, Py = 343.3333f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 0.9f, A = 0f, B = 0f, Ph = 0.5f, X0 = -40f, Y0 = 0f, X1 = 60f, Y1 = 0f } } }, new Layer { Name = "drill", X = 265f, Y = 281.67f, W = 540f, H = 236.67f, Px = 535f, Py = 400f, Motions = new Motion[1] { new Motion { Type = MotionType.Shake, P = 1f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "grooves_a", X = 521.67f, Y = 315f, W = 195f, H = 170f, Px = 619.1667f, Py = 400f, Motions = new Motion[2] { new Motion { Type = MotionType.Shake, P = 1f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 0.16f, A = 1f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "grooves_b", X = 581.67f, Y = 333.33f, W = 175f, H = 136.67f, Px = 669.1667f, Py = 401.6667f, Motions = new Motion[2] { new Motion { Type = MotionType.Shake, P = 1f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 0.16f, A = 1f, B = 0f, Ph = 0.5f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "sparks", X = 775f, Y = 273.33f, W = 155f, H = 270f, Px = 790f, Py = 400f, Motions = new Motion[2] { new Motion { Type = MotionType.Flicker, P = 0.2f, A = 0.15f, B = 0.5f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Pulse, P = 0.33f, A = 0.12f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["parasite"] = new Layer[8] { new Layer { Name = "arc_a", X = 298.33f, Y = 230f, W = 525f, H = 376.67f, Px = 560.8333f, Py = 418.3333f, Motions = new Motion[1] { new Motion { Type = MotionType.Fade, P = 0.7f, A = 1f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "arc_b", X = 306.67f, Y = 230f, W = 536.67f, H = 356.67f, Px = 575f, Py = 408.3333f, Motions = new Motion[1] { new Motion { Type = MotionType.Fade, P = 0.7f, A = 1f, B = 0f, Ph = 0.5f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "bounce", X = 795f, Y = 286.67f, W = 101.67f, H = 145f, Px = 845.8333f, Py = 359.1667f, Motions = new Motion[1] { new Motion { Type = MotionType.Fade, P = 1.4f, A = 0.6f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "reticle", X = 688.33f, Y = 178.33f, W = 253.33f, H = 253.33f, Px = 815f, Py = 305f, Motions = new Motion[2] { new Motion { Type = MotionType.Spin, P = 1f, A = -35f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Pulse, P = 1.3f, A = 0.06f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "core", X = 768.33f, Y = 258.33f, W = 93.33f, H = 93.33f, Px = 815f, Py = 305f, Motions = new Motion[1] { new Motion { Type = MotionType.Pulse, P = 0.45f, A = 0.3f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "legs", X = 120f, Y = 568.33f, W = 255f, H = 161.67f, Px = 250f, Py = 640f, Motions = new Motion[2] { new Motion { Type = MotionType.Bob, P = 1.5f, A = 7f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Sway, P = 0.35f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "parasite", X = 93.33f, Y = 515f, W = 301.67f, H = 285f, Px = 250f, Py = 640f, Motions = new Motion[1] { new Motion { Type = MotionType.Bob, P = 1.5f, A = 7f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "nerves", X = 291.67f, Y = 496.67f, W = 125f, H = 128.33f, Px = 330f, Py = 580f, Motions = new Motion[2] { new Motion { Type = MotionType.Bob, P = 1.5f, A = 7f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Flicker, P = 0.4f, A = 0.05f, B = 0.6f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["carved"] = new Layer[3] { new Layer { Name = "torso", X = 276.67f, Y = 116.67f, W = 548.33f, H = 555f, Px = 550f, Py = 640f, Motions = new Motion[2] { new Motion { Type = MotionType.Pulse, P = 3f, A = 0.015f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Hit, P = 1.6f, A = 0.02f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "chisel", X = 738.33f, Y = 46.67f, W = 190f, H = 216.67f, Px = 888f, Py = 83f, Motions = new Motion[1] { new Motion { Type = MotionType.Strike, P = 1.6f, A = 34f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = -0.615f, Y1 = -0.788f } } }, new Layer { Name = "sparks", X = 673.33f, Y = 161.67f, W = 158.33f, H = 113.33f, Px = 770f, Py = 245f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 1.6f, A = 0f, B = 0f, Ph = 0f, X0 = 0.5f, Y0 = 0f, X1 = 1.35f, Y1 = 0f } } } }, ["peerless_scarred"] = new Layer[4] { new Layer { Name = "eye", X = 258.33f, Y = 238.33f, W = 583.33f, H = 323.33f, Px = 550f, Py = 400f, Motions = new Motion[1] { new Motion { Type = MotionType.Blink, P = 4f, A = 0f, B = 0f, Ph = 0.6f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "scar_shadow", X = 348.33f, Y = 118.33f, W = 398.33f, H = 563.33f, Px = 547.5f, Py = 400f, Motions = new Motion[0] }, new Layer { Name = "scar", X = 355f, Y = 126.67f, W = 385f, H = 546.67f, Px = 547.5f, Py = 400f, Motions = new Motion[1] { new Motion { Type = MotionType.Fade, P = 1.4f, A = 0.35f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "glint", X = 723.33f, Y = 153.33f, W = 153.33f, H = 153.33f, Px = 800f, Py = 230f, Motions = new Motion[2] { new Motion { Type = MotionType.Spin, P = 1f, A = 45f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Pulse, P = 1.1f, A = 0.22f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["reaper_scythe"] = new Layer[4] { new Layer { Name = "frost", X = 221.67f, Y = 116.67f, W = 636.67f, H = 693.33f, Px = 540f, Py = 463.3333f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 3.2f, A = 0f, B = 0f, Ph = 0f, X0 = 30f, Y0 = -10f, X1 = -40f, Y1 = 40f } } }, new Layer { Name = "whoosh", X = 210f, Y = 48.33f, W = 560f, H = 311.67f, Px = 470f, Py = 770f, Motions = new Motion[3] { new Motion { Type = MotionType.Swing, P = 2.2f, A = 16f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Bob, P = 3.3f, A = 5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Burst, P = 2.2f, A = 0f, B = 0f, Ph = 0f, X0 = 0.97f, Y0 = 0f, X1 = 1.04f, Y1 = 0f } } }, new Layer { Name = "scythe", X = 213.33f, Y = 126.67f, W = 610f, H = 690f, Px = 470f, Py = 770f, Motions = new Motion[2] { new Motion { Type = MotionType.Swing, P = 2.2f, A = 16f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Bob, P = 3.3f, A = 5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "glint", X = 178.33f, Y = 325f, W = 120f, H = 121.67f, Px = 470f, Py = 770f, Motions = new Motion[3] { new Motion { Type = MotionType.Swing, P = 2.2f, A = 16f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Bob, P = 3.3f, A = 5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 0.8f, A = 0.85f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["twin_razors"] = new Layer[5] { new Layer { Name = "blade_b", X = 283.33f, Y = 208.33f, W = 565f, H = 515f, Px = 795.2378f, Py = 670.8131f, Motions = new Motion[1] { new Motion { Type = MotionType.Swing, P = 1.6f, A = -9f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "blade_a", X = 251.67f, Y = 208.33f, W = 565f, H = 515f, Px = 304.7622f, Py = 670.8131f, Motions = new Motion[1] { new Motion { Type = MotionType.Swing, P = 1.6f, A = 9f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "clash", X = 238.33f, Y = 141.67f, W = 623.33f, H = 401.67f, Px = 550f, Py = 450f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 1.6f, A = 0f, B = 0f, Ph = 0f, X0 = 0.85f, Y0 = 0f, X1 = 1.15f, Y1 = 0f } } }, new Layer { Name = "glint_a", X = 746.67f, Y = 180f, W = 98.33f, H = 98.33f, Px = 304.7622f, Py = 670.8131f, Motions = new Motion[2] { new Motion { Type = MotionType.Swing, P = 1.6f, A = 9f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 0.9f, A = 0.9f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "glint_b", X = 255f, Y = 180f, W = 98.33f, H = 98.33f, Px = 795.2378f, Py = 670.8131f, Motions = new Motion[2] { new Motion { Type = MotionType.Swing, P = 1.6f, A = -9f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 0.9f, A = 0.9f, B = 0f, Ph = 0.5f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["storm_knight"] = new Layer[5] { new Layer { Name = "bolt_b", X = 548.33f, Y = 178.33f, W = 265f, H = 443.33f, Px = 639.7941f, Py = 530.8562f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 1.3f, A = 0f, B = 0f, Ph = 0f, X0 = 1f, Y0 = 0f, X1 = 1.08f, Y1 = 0f } } }, new Layer { Name = "bolt_a", X = 808.33f, Y = 175f, W = 175f, H = 338.33f, Px = 891.8241f, Py = 448.9667f, Motions = new Motion[1] { new Motion { Type = MotionType.Flicker, P = 0.16f, A = 0.02f, B = 0.45f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "cloud", X = 561.67f, Y = 23.33f, W = 443.33f, H = 236.67f, Px = 783.3333f, Py = 141.6667f, Motions = new Motion[1] { new Motion { Type = MotionType.Bob, P = 4f, A = 5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "lance", X = 96.67f, Y = 416.67f, W = 820f, H = 326.67f, Px = 150f, Py = 690f, Motions = new Motion[1] { new Motion { Type = MotionType.Bob, P = 2.2f, A = 6f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "arcs", X = 718.33f, Y = 430f, W = 195f, H = 118.33f, Px = 815.8333f, Py = 489.1667f, Motions = new Motion[2] { new Motion { Type = MotionType.Bob, P = 2.2f, A = 6f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Flicker, P = 0.2f, A = 0.1f, B = 0.9f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["rage_knight"] = new Layer[5] { new Layer { Name = "aura", X = 186.67f, Y = 41.67f, W = 705f, H = 716.67f, Px = 550f, Py = 400f, Motions = new Motion[2] { new Motion { Type = MotionType.Pulse, P = 0.9f, A = 0.06f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Spin, P = 1f, A = -10f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "flames", X = 208.33f, Y = 55f, W = 676.67f, H = 620f, Px = 550f, Py = 620f, Motions = new Motion[1] { new Motion { Type = MotionType.Flicker, P = 0.38f, A = 0.15f, B = 0.2f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "helm", X = 378.33f, Y = 131.67f, W = 343.33f, H = 526.67f, Px = 550f, Py = 400f, Motions = new Motion[1] { new Motion { Type = MotionType.Shake, P = 1f, A = 2.5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "glow", X = 418.33f, Y = 160f, W = 263.33f, H = 466.67f, Px = 550f, Py = 400f, Motions = new Motion[2] { new Motion { Type = MotionType.Shake, P = 1f, A = 2.5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Flicker, P = 0.5f, A = 0.02f, B = 0.55f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "embers", X = 240f, Y = 121.67f, W = 575f, H = 276.67f, Px = 527.5f, Py = 260f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 1.4f, A = 0f, B = 0f, Ph = 0f, X0 = 0f, Y0 = -20f, X1 = 0f, Y1 = 90f } } } }, ["iron_rain"] = new Layer[7] { new Layer { Name = "streaks", X = 345f, Y = 58.33f, W = 410f, H = 223.33f, Px = 550f, Py = 170f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 0.45f, A = 0f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 40f, X1 = 0f, Y1 = -70f } } }, new Layer { Name = "ground", X = 148.33f, Y = 600f, W = 823.33f, H = 163.33f, Px = 560f, Py = 730f, Motions = new Motion[1] { new Motion { Type = MotionType.Hit, P = 1.8f, A = 0.035f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "shock_a", X = 353.33f, Y = 563.33f, W = 413.33f, H = 153.33f, Px = 560f, Py = 640f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 1.8f, A = 0f, B = 0f, Ph = 0f, X0 = 0.45f, Y0 = 0f, X1 = 2.1f, Y1 = 0f } } }, new Layer { Name = "shock_b", X = 378.33f, Y = 573.33f, W = 363.33f, H = 133.33f, Px = 560f, Py = 640f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 1.8f, A = 0f, B = 0f, Ph = -0.035f, X0 = 0.4f, Y0 = 0f, X1 = 1.6f, Y1 = 0f } } }, new Layer { Name = "jets", X = 438.33f, Y = 75f, W = 215f, H = 181.67f, Px = 546f, Py = 220f, Motions = new Motion[2] { new Motion { Type = MotionType.Strike, P = 1.8f, A = 70f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = -1f }, new Motion { Type = MotionType.Flicker, P = 0.22f, A = 0.2f, B = 0.3f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "boot", X = 413.33f, Y = 183.33f, W = 390f, H = 460f, Px = 608f, Py = 560f, Motions = new Motion[1] { new Motion { Type = MotionType.Strike, P = 1.8f, A = 70f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = -1f } } }, new Layer { Name = "debris", X = 338.33f, Y = 348.33f, W = 465f, H = 290f, Px = 560f, Py = 640f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 1.8f, A = 0f, B = 0f, Ph = 0f, X0 = 0.5f, Y0 = 0f, X1 = 1.35f, Y1 = 0f } } } }, ["overcharge"] = new Layer[6] { new Layer { Name = "rays", X = 481.67f, Y = 178.33f, W = 501.67f, H = 493.33f, Px = 730f, Py = 420f, Motions = new Motion[2] { new Motion { Type = MotionType.Spin, P = 1f, A = 14f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Pulse, P = 0.5f, A = 0.05f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "ring_a", X = 568.33f, Y = 258.33f, W = 323.33f, H = 323.33f, Px = 730f, Py = 420f, Motions = new Motion[1] { new Motion { Type = MotionType.Expand, P = 1.4f, A = 0f, B = 0f, Ph = 0f, X0 = 0.6f, Y0 = 0f, X1 = 2.1f, Y1 = 0f } } }, new Layer { Name = "ring_b", X = 570f, Y = 260f, W = 320f, H = 320f, Px = 730f, Py = 420f, Motions = new Motion[1] { new Motion { Type = MotionType.Expand, P = 1.4f, A = 0f, B = 0f, Ph = 0.5f, X0 = 0.6f, Y0 = 0f, X1 = 2.1f, Y1 = 0f } } }, new Layer { Name = "fist", X = 153.33f, Y = 263.33f, W = 545f, H = 313.33f, Px = 425.8333f, Py = 420f, Motions = new Motion[1] { new Motion { Type = MotionType.Jab, P = 1.4f, A = 24f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "orb", X = 590f, Y = 280f, W = 280f, H = 280f, Px = 730f, Py = 420f, Motions = new Motion[1] { new Motion { Type = MotionType.Pulse, P = 0.35f, A = 0.12f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "arcs", X = 638.33f, Y = 226.67f, W = 293.33f, H = 426.67f, Px = 730f, Py = 420f, Motions = new Motion[2] { new Motion { Type = MotionType.Flicker, P = 0.18f, A = 0.05f, B = 0.85f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Spin, P = 1f, A = -30f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["howler_ambush"] = new Layer[5] { new Layer { Name = "smoke", X = 176.67f, Y = 170f, W = 390f, H = 538.33f, Px = 371.6667f, Py = 439.1667f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 3.2f, A = 0f, B = 0f, Ph = 0f, X0 = 30f, Y0 = -10f, X1 = -40f, Y1 = 30f } } }, new Layer { Name = "hood", X = 346.67f, Y = 105f, W = 420f, H = 593.33f, Px = 556.6667f, Py = 401.6667f, Motions = new Motion[2] { new Motion { Type = MotionType.Bob, P = 3f, A = 10f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 4f, A = 0.45f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "claws", X = 721.67f, Y = 111.67f, W = 253.33f, H = 358.33f, Px = 830f, Py = 300f, Motions = new Motion[1] { new Motion { Type = MotionType.Fade, P = 1.6f, A = 0.85f, B = 0f, Ph = 0.35f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "blade", X = 608.33f, Y = 326.67f, W = 390f, H = 268.33f, Px = 640f, Py = 560f, Motions = new Motion[1] { new Motion { Type = MotionType.Strike, P = 1.6f, A = 48f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0.848f, Y1 = 0.5299f } } }, new Layer { Name = "crit", X = 878.33f, Y = 263.33f, W = 208.33f, H = 218.33f, Px = 979.2192f, Py = 348.0323f, Motions = new Motion[2] { new Motion { Type = MotionType.Strike, P = 1.6f, A = 48f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0.848f, Y1 = 0.5299f }, new Motion { Type = MotionType.Burst, P = 1.6f, A = 0f, B = 0f, Ph = 0f, X0 = 0.7f, Y0 = 0f, X1 = 1.3f, Y1 = 0f } } } }, ["clawdrill"] = new Layer[8] { new Layer { Name = "rock", X = 613.33f, Y = 423.33f, W = 373.33f, H = 335f, Px = 800f, Py = 590.8333f, Motions = new Motion[1] { new Motion { Type = MotionType.Shake, P = 1f, A = 1.5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "debris_a", X = 663.33f, Y = 403.33f, W = 115f, H = 131.67f, Px = 720.8333f, Py = 469.1667f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 0.8f, A = 0f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 90f, Y1 = 40f } } }, new Layer { Name = "debris_b", X = 581.67f, Y = 476.67f, W = 133.33f, H = 111.67f, Px = 648.3333f, Py = 532.5f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 0.8f, A = 0f, B = 0f, Ph = 0.5f, X0 = 0f, Y0 = 0f, X1 = -30f, Y1 = -90f } } }, new Layer { Name = "claws", X = 240f, Y = 143.33f, W = 420f, H = 410f, Px = 377.2072f, Py = 309.4879f, Motions = new Motion[2] { new Motion { Type = MotionType.Shake, P = 1f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Sway, P = 0.3f, A = 2f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "drill", X = 185f, Y = 140f, W = 495f, H = 373.33f, Px = 432.5f, Py = 326.6667f, Motions = new Motion[1] { new Motion { Type = MotionType.Shake, P = 1f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "grooves_a", X = 443.33f, Y = 285f, W = 151.67f, H = 201.67f, Px = 519.1667f, Py = 385.8333f, Motions = new Motion[2] { new Motion { Type = MotionType.Shake, P = 1f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 0.16f, A = 1f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "grooves_b", X = 490f, Y = 321.67f, W = 141.67f, H = 170f, Px = 560.8333f, Py = 406.6667f, Motions = new Motion[2] { new Motion { Type = MotionType.Shake, P = 1f, A = 4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 0.16f, A = 1f, B = 0f, Ph = 0.5f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "sparks", X = 595f, Y = 363.33f, W = 201.67f, H = 298.33f, Px = 657.0631f, Py = 484.3612f, Motions = new Motion[2] { new Motion { Type = MotionType.Flicker, P = 0.2f, A = 0.15f, B = 0.5f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Pulse, P = 0.33f, A = 0.12f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["parasite_brood"] = new Layer[7] { new Layer { Name = "reticle", X = 676.67f, Y = 150f, W = 266.67f, H = 270f, Px = 810f, Py = 285f, Motions = new Motion[2] { new Motion { Type = MotionType.Spin, P = 1f, A = -35f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Pulse, P = 1.3f, A = 0.06f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "core", X = 760f, Y = 235f, W = 100f, H = 100f, Px = 810f, Py = 285f, Motions = new Motion[1] { new Motion { Type = MotionType.Pulse, P = 0.45f, A = 0.3f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "drops", X = 681.67f, Y = 290f, W = 146.67f, H = 110f, Px = 755f, Py = 345f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 1.6f, A = 0f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = -380f, Y1 = -250f } } }, new Layer { Name = "larva_a", X = 195f, Y = 496.67f, W = 231.67f, H = 178.33f, Px = 310.8333f, Py = 585.8333f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 1.8f, A = 0f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 340f, Y1 = 205f } } }, new Layer { Name = "larva_b", X = 208.33f, Y = 521.67f, W = 201.67f, H = 160f, Px = 309.1667f, Py = 601.6667f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 1.8f, A = 0f, B = 0f, Ph = 0.33f, X0 = 0f, Y0 = 0f, X1 = 340f, Y1 = 205f } } }, new Layer { Name = "larva_c", X = 238.33f, Y = 488.33f, W = 185f, H = 145f, Px = 330.8333f, Py = 560.8333f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 1.8f, A = 0f, B = 0f, Ph = 0.66f, X0 = 0f, Y0 = 0f, X1 = 340f, Y1 = 205f } } }, new Layer { Name = "eggs", X = 108.33f, Y = 468.33f, W = 330f, H = 303.33f, Px = 280f, Py = 640f, Motions = new Motion[1] { new Motion { Type = MotionType.Pulse, P = 1.2f, A = 0.03f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["aureate_armor"] = new Layer[6] { new Layer { Name = "halo", X = 228.33f, Y = 50f, W = 643.33f, H = 280f, Px = 550f, Py = 440f, Motions = new Motion[2] { new Motion { Type = MotionType.Pulse, P = 2f, A = 0.03f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 2f, A = 0.4f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "ring", X = 370f, Y = 260f, W = 360f, H = 360f, Px = 550f, Py = 440f, Motions = new Motion[1] { new Motion { Type = MotionType.Expand, P = 1.8f, A = 0f, B = 0f, Ph = 0f, X0 = 0.8f, Y0 = 0f, X1 = 2.4f, Y1 = 0f } } }, new Layer { Name = "plate", X = 126.67f, Y = 151.67f, W = 846.67f, H = 563.33f, Px = 550f, Py = 440f, Motions = new Motion[1] { new Motion { Type = MotionType.Bob, P = 3f, A = 5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "crack", X = 436.67f, Y = 220f, W = 125f, H = 190f, Px = 499.1667f, Py = 315f, Motions = new Motion[2] { new Motion { Type = MotionType.Bob, P = 3f, A = 5f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Flicker, P = 0.5f, A = 0.02f, B = 0.6f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "sparks", X = 325f, Y = 85f, W = 235f, H = 185f, Px = 470f, Py = 250f, Motions = new Motion[1] { new Motion { Type = MotionType.Burst, P = 1.8f, A = 0f, B = 0f, Ph = 0f, X0 = 0.6f, Y0 = 0f, X1 = 1.3f, Y1 = 0f } } }, new Layer { Name = "glint", X = 701.67f, Y = 191.67f, W = 116.67f, H = 116.67f, Px = 760f, Py = 250f, Motions = new Motion[2] { new Motion { Type = MotionType.Spin, P = 1f, A = 40f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Pulse, P = 1.1f, A = 0.22f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["obsidian_frame"] = new Layer[6] { new Layer { Name = "aura", X = 238.33f, Y = 128.33f, W = 623.33f, H = 623.33f, Px = 550f, Py = 440f, Motions = new Motion[1] { new Motion { Type = MotionType.Pulse, P = 1.6f, A = 0.05f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "pluses_a", X = 245f, Y = 511.67f, W = 623.33f, H = 145f, Px = 556.6667f, Py = 584.1667f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 2.2f, A = 0f, B = 0f, Ph = 0f, X0 = 0f, Y0 = -10f, X1 = 0f, Y1 = 260f } } }, new Layer { Name = "pluses_b", X = 215f, Y = 341.67f, W = 693.33f, H = 123.33f, Px = 561.6667f, Py = 403.3333f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 2.2f, A = 0f, B = 0f, Ph = 0.5f, X0 = 0f, Y0 = -10f, X1 = 0f, Y1 = 260f } } }, new Layer { Name = "crystals", X = 323.33f, Y = 111.67f, W = 453.33f, H = 635f, Px = 550f, Py = 716f, Motions = new Motion[1] { new Motion { Type = MotionType.Hit, P = 2f, A = 0.02f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "veins", X = 383.33f, Y = 205f, W = 335f, H = 440f, Px = 550f, Py = 716f, Motions = new Motion[2] { new Motion { Type = MotionType.Hit, P = 2f, A = 0.02f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Flicker, P = 0.7f, A = 0.01f, B = 0.55f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "glint", X = 546.67f, Y = 196.67f, W = 106.67f, H = 106.67f, Px = 600f, Py = 250f, Motions = new Motion[2] { new Motion { Type = MotionType.Pulse, P = 0.9f, A = 0.25f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f }, new Motion { Type = MotionType.Fade, P = 1.8f, A = 0.7f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } } }, ["willow_way"] = new Layer[6] { new Layer { Name = "leaves_a", X = 321.67f, Y = 385f, W = 471.67f, H = 343.33f, Px = 557.5f, Py = 556.6667f, Motions = new Motion[1] { new Motion { Type = MotionType.Loopmove, P = 3f, A = 0f, B = 0f, Ph = 0f, X0 = 40f, Y0 = 20f, X1 = -60f, Y1 = -40f } } }, new Layer { Name = "trail_outer", X = 200f, Y = 66.67f, W = 698.33f, H = 721.67f, Px = 550f, Py = 430f, Motions = new Motion[1] { new Motion { Type = MotionType.Spin, P = 1f, A = -260f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "trail_inner", X = 391.67f, Y = 158.33f, W = 411.67f, H = 233.33f, Px = 550f, Py = 430f, Motions = new Motion[1] { new Motion { Type = MotionType.Spin, P = 1f, A = -330f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "blade", X = 493.33f, Y = 345f, W = 418.33f, H = 170f, Px = 550f, Py = 430f, Motions = new Motion[1] { new Motion { Type = MotionType.Spin, P = 1f, A = -260f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f } } }, new Layer { Name = "hub", X = 476.67f, Y = 355f, W = 146.67f, H = 150f, Px = 550f, Py = 430f, Motions = new Motion[1] { new Motion { Type = MotionType.Pulse, P = 0.4f, A = 0.15f, B = 0f, Ph = 0f, X0 = 0f, Y0 = 0f, X1 = 0f, Y1 = 0f