private void TakeItem(PlayerController player)
        {
            if (PickupObjectDatabase.GetById(ItemID) && (PickupObjectDatabase.GetById(ItemID).sprite as tk2dSprite) != null && player.HasPassiveItem(ItemID))
            {
                m_Interacted = true;
            }
            else
            {
                return;
            }

            GameObject m_SubSpriteObject = new GameObject("Item Display Object", new Type[] { typeof(tk2dSprite) })
            {
                layer = 0
            };

            m_SubSpriteObject.transform.position = (transform.position + new Vector3(0.35f, 1.3f));
            ExpandUtility.DuplicateSprite(m_SubSpriteObject.GetComponent <tk2dSprite>(), (PickupObjectDatabase.GetById(ItemID).sprite as tk2dSprite));
            if (m_ParentRoom != null)
            {
                m_SubSpriteObject.transform.parent = m_ParentRoom.hierarchyParent;
            }
            m_SubSpriteObject.GetComponent <tk2dSprite>().HeightOffGround = 3f;
            m_SubSpriteObject.GetComponent <tk2dSprite>().UpdateZDepth();
            player.RemovePassiveItem(ItemID);

            if (m_TargetDoor && m_TargetDoor.GetComponent <tk2dSpriteAnimator>() && m_TargetDoor.GetComponent <SpeculativeRigidbody>())
            {
                AkSoundEngine.PostEvent("Play_OBJ_plate_press_01", gameObject);
                StartCoroutine(DelayedDoorOpen(m_TargetDoor));
            }

            SpriteOutlineManager.RemoveOutlineFromSprite(sprite, false);
        }
Exemplo n.º 2
0
        public static void Init(AssetBundle expandSharedAssets1)
        {
            m_BlinkPassive = PickupObjectDatabase.GetById(436).GetComponent <BlinkPassiveItem>();

            if (!m_BlinkPassive)
            {
                return;
            }

            EXRedScarfObject = expandSharedAssets1.LoadAsset <GameObject>("Bloodied Scarf");
            EXRedScarfObject.AddComponent <ExpandRedScarf>();
            EXRedScarfObject.AddComponent <tk2dSprite>();
            ExpandUtility.DuplicateSprite(EXRedScarfObject.GetComponent <tk2dSprite>(), m_BlinkPassive.GetComponent <tk2dSprite>());

            ExpandRedScarf redScarf = EXRedScarfObject.GetComponent <ExpandRedScarf>();

            ItemBuilder.SetupItem(redScarf, "Blink Away", "Dodge roll is augmented with a blink\n\nThis simple scarf was once worn by a skilled assassin. Betrayed by his brothers and assumed dead...", "ex");
            ItemBuilder.AddPassiveStatModifier(redScarf, PlayerStats.StatType.ReloadSpeed, 1.3f, StatModifier.ModifyMethod.MULTIPLICATIVE);
            // redScarf.PickupObjectId = m_BlinkPassive.PickupObjectId;
            redScarf.itemName       = "Red Bandana";
            redScarf.PickupObjectId = 436;
            redScarf.quality        = m_BlinkPassive.quality;
            if (!ExpandSettings.EnableEXItems)
            {
                redScarf.quality = ItemQuality.EXCLUDED;
            }
            redScarf.additionalMagnificenceModifier = m_BlinkPassive.additionalMagnificenceModifier;
            redScarf.ItemSpansBaseQualityTiers      = m_BlinkPassive.ItemSpansBaseQualityTiers;
            redScarf.ItemRespectsHeartMagnificence  = m_BlinkPassive.ItemRespectsHeartMagnificence;
            redScarf.associatedItemChanceMods       = m_BlinkPassive.associatedItemChanceMods;
            redScarf.contentSource             = m_BlinkPassive.contentSource;
            redScarf.ShouldBeExcludedFromShops = m_BlinkPassive.ShouldBeExcludedFromShops;
            redScarf.CanBeDropped = m_BlinkPassive.CanBeDropped;
            redScarf.PreventStartingOwnerFromDropping = m_BlinkPassive.PreventStartingOwnerFromDropping;
            redScarf.PersistsOnDeath   = m_BlinkPassive.PersistsOnDeath;
            redScarf.RespawnsIfPitfall = m_BlinkPassive.RespawnsIfPitfall;
            redScarf.PreventStartingOwnerFromDropping = m_BlinkPassive.PreventStartingOwnerFromDropping;
            redScarf.IgnoredByRat = m_BlinkPassive.IgnoredByRat;
            redScarf.SaveFlagToSetOnAcquisition  = m_BlinkPassive.SaveFlagToSetOnAcquisition;
            redScarf.ForcedPositionInAmmonomicon = m_BlinkPassive.ForcedPositionInAmmonomicon;
            redScarf.UsesCustomCost                  = m_BlinkPassive.UsesCustomCost;
            redScarf.CustomCost                      = m_BlinkPassive.CustomCost;
            redScarf.PersistsOnPurchase              = m_BlinkPassive.PersistsOnPurchase;
            redScarf.CanBeSold                       = m_BlinkPassive.CanBeSold;
            redScarf.passiveStatModifiers            = m_BlinkPassive.passiveStatModifiers;
            redScarf.ArmorToGainOnInitialPickup      = m_BlinkPassive.ArmorToGainOnInitialPickup;
            redScarf.minimapIcon                     = m_BlinkPassive.minimapIcon;
            redScarf.DodgeRollTimeMultiplier         = m_BlinkPassive.DodgeRollTimeMultiplier;
            redScarf.DodgeRollDistanceMultiplier     = m_BlinkPassive.DodgeRollDistanceMultiplier;
            redScarf.AdditionalInvulnerabilityFrames = m_BlinkPassive.AdditionalInvulnerabilityFrames;
            redScarf.ScarfPrefab                     = m_BlinkPassive.ScarfPrefab;
            redScarf.BlinkpoofVfx                    = m_BlinkPassive.BlinkpoofVfx;

            // Try to prevent original item from showing up. (can still be accessed via MTG console's give command however)
            if (ExpandSettings.EnableEXItems)
            {
                m_BlinkPassive.quality = ItemQuality.EXCLUDED;
            }
        }
        private void OnFireStarted()
        {
            IntVector2 baseCellPosition = (transform.position.IntXY(VectorConversions.Floor) + new IntVector2(4, 2));

            for (int X = -1; X < 2; X++)
            {
                for (int Y = -1; Y < 2; Y++)
                {
                    IntVector2 PositionOffset = baseCellPosition + new IntVector2(X, Y);
                    CellData   cellData       = GameManager.Instance.Dungeon.data[PositionOffset];
                    if (cellData != null)
                    {
                        cellData.OnCellGooped = (Action <CellData>)Delegate.Remove(cellData.OnCellGooped, new Action <CellData>(HandleGooped));
                    }
                }
            }

            specRigidbody.OnRigidbodyCollision = (SpeculativeRigidbody.OnRigidbodyCollisionDelegate)Delegate.Remove(specRigidbody.OnRigidbodyCollision, new SpeculativeRigidbody.OnRigidbodyCollisionDelegate(HandleCollision));
            // specRigidbody.OnHitByBeam = (Action<BasicBeamController>)Delegate.Remove(specRigidbody.OnHitByBeam, new Action<BasicBeamController>(HandleBeamCollision));

            GameObject PitManager = new GameObject("Jungle Pit Manager")
            {
                layer = 0
            };

            PitManager.transform.position = (transform.position + new Vector3(5, 2));
            tk2dSprite PitDummySprite = PitManager.AddComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(PitDummySprite, ExpandSecretDoorPrefabs.EXSecretDoorMinimapIcon.GetComponent <tk2dSprite>());
            tk2dSprite pitSprite = PitManager.GetComponent <tk2dSprite>();

            pitSprite.renderer.enabled = false;

            ExpandUtility.GenerateOrAddToRigidBody(PitManager, CollisionLayer.Trap, PixelCollider.PixelColliderGeneration.Manual, IsTrigger: true, dimensions: new IntVector2(2, 2));

            JungleTreePitController junglePitManager = PitManager.AddComponent <JungleTreePitController>();

            junglePitManager.targetLevelName = targetLevelName;

            StartCoroutine(HandleDelayedFireDamage());
        }
        public void ConfigureOnPlacement(RoomHandler room)
        {
            m_ParentRoom = room;

            if (PickupObjectDatabase.GetById(ItemID) && (PickupObjectDatabase.GetById(ItemID).sprite as tk2dSprite) != null)
            {
                m_SubSpriteObject = new GameObject("Item Display Object", new Type[] { typeof(tk2dSprite) })
                {
                    layer = 0
                };
                m_SubSpriteObject.transform.position = (transform.position + new Vector3(0.95f, 1));
                m_ItemSprite = m_SubSpriteObject.GetComponent <tk2dSprite>();
                ExpandUtility.DuplicateSprite(m_ItemSprite, (PickupObjectDatabase.GetById(ItemID).sprite as tk2dSprite));
                if (m_ParentRoom != null)
                {
                    m_SubSpriteObject.transform.parent = m_ParentRoom.hierarchyParent;
                }
                if (AddOutline)
                {
                    SpriteOutlineManager.AddOutlineToSprite(m_ItemSprite, BaseOutlineColor, 0.1f, 0f, SpriteOutlineManager.OutlineType.NORMAL);
                }
            }

            sprite.HeightOffGround = -2;

            if (m_ItemSprite)
            {
                sprite.AttachRenderer(m_ItemSprite);
                if (AddOutline)
                {
                    SpriteOutlineManager.AddOutlineToSprite(m_ItemSprite, BaseOutlineColor, 0.1f, 0f, SpriteOutlineManager.OutlineType.NORMAL);
                }
                m_ItemSprite.HeightOffGround        = 0.5f;
                m_ItemSprite.depthUsesTrimmedBounds = true;
                m_ItemSprite.UpdateZDepth();
            }

            sprite.UpdateZDepth();
        }
        public static void InitPrefabs(AssetBundle expandSharedAssets1)
        {
            EXSecretDoorAnimation = expandSharedAssets1.LoadAsset <GameObject>("EX_SecretDoor_Animation");

            tk2dSpriteAnimation DoorSpriteAnimations = EXSecretDoorAnimation.AddComponent <tk2dSpriteAnimation>();

            ExpandUtility.AddAnimation(DoorSpriteAnimations, ExpandPrefabs.EXSecretDoorCollection.GetComponent <tk2dSpriteCollectionData>(), m_DoorOpenSprites, "door_open", frameRate: 10);
            ExpandUtility.AddAnimation(DoorSpriteAnimations, ExpandPrefabs.EXSecretDoorCollection.GetComponent <tk2dSpriteCollectionData>(), m_DoorCloseSprites, "door_close", frameRate: 10);

            EXSecretDoorMinimapIcon = expandSharedAssets1.LoadAsset <GameObject>("EXSecretDoor_MinimapIcon");
            SpriteSerializer.AddSpriteToObject(EXSecretDoorMinimapIcon, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_MinimapIcon");

            EXSecretDoor_Hollow = expandSharedAssets1.LoadAsset <GameObject>("EX_Secret_Door_Hollow");
            GameObject EXSecretDoorHollow_Frame_Top    = EXSecretDoor_Hollow.transform.Find("FrameTop").gameObject;
            GameObject EXSecretDoorHollow_Frame_Bottom = EXSecretDoor_Hollow.transform.Find("FrameBottom").gameObject;
            GameObject EXSecretDoorHollow_Background   = EXSecretDoor_Hollow.transform.Find("Background").gameObject;
            GameObject EXSecretDoorHollow_Light        = EXSecretDoor_Hollow.transform.Find("Light").gameObject;
            GameObject EXSecretDoorHollow_Lock         = EXSecretDoor_Hollow.transform.Find("Lock").gameObject;


            tk2dSprite m_DoorHollowSprite             = SpriteSerializer.AddSpriteToObject(EXSecretDoor_Hollow, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Open_00");
            tk2dSprite m_DoorHollowBorderTopSprite    = SpriteSerializer.AddSpriteToObject(EXSecretDoorHollow_Frame_Top, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Frame_Top");
            tk2dSprite m_DoorHollowBorderBottomSprite = SpriteSerializer.AddSpriteToObject(EXSecretDoorHollow_Frame_Bottom, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Frame_Bottom");
            tk2dSprite m_DoorHollowBackgroundSprite   = SpriteSerializer.AddSpriteToObject(EXSecretDoorHollow_Background, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Background");
            tk2dSprite m_DoorHollowLightSprite        = SpriteSerializer.AddSpriteToObject(EXSecretDoorHollow_Light, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Light_Red");

            m_DoorHollowBorderTopSprite.HeightOffGround    = 3;
            m_DoorHollowBorderBottomSprite.HeightOffGround = -0.5f;
            m_DoorHollowSprite.HeightOffGround             = -1.5f;
            m_DoorHollowBackgroundSprite.HeightOffGround   = -2f;
            m_DoorHollowLightSprite.HeightOffGround        = 3.5f;

            ExpandUtility.GenerateSpriteAnimator(EXSecretDoor_Hollow, DoorSpriteAnimations, ClipFps: 10);

            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Hollow, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 64), offset: new IntVector2(16, 0));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Hollow, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 14));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Hollow, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, IsTrigger: true, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 12));

            ExpandSecretDoorPlacable m_SecretDoorHollowComponent = EXSecretDoor_Hollow.AddComponent <ExpandSecretDoorPlacable>();

            m_SecretDoorHollowComponent.DoorTopBorderObject    = EXSecretDoorHollow_Frame_Top;
            m_SecretDoorHollowComponent.DoorBottomBorderObject = EXSecretDoorHollow_Frame_Bottom;
            m_SecretDoorHollowComponent.DoorBackgroundObject   = EXSecretDoorHollow_Background;
            m_SecretDoorHollowComponent.DoorLightObject        = EXSecretDoorHollow_Light;

            GameObject m_RatLock = ExpandPrefabs.RatJailDoor.GetComponent <InteractableDoorController>().WorldLocks[0].gameObject;

            tk2dSprite EXLockSprite = EXSecretDoorHollow_Lock.AddComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(EXLockSprite, m_RatLock.GetComponent <tk2dSprite>());
            ExpandUtility.DuplicateSpriteAnimator(EXSecretDoorHollow_Lock, m_RatLock.GetComponent <tk2dSpriteAnimator>());
            EXLockSprite.HeightOffGround = -0.3f;


            InteractableLock m_EXLockHollow = EXSecretDoorHollow_Lock.AddComponent <InteractableLock>();

            m_EXLockHollow.Suppress          = m_RatLock.GetComponent <InteractableLock>().Suppress;
            m_EXLockHollow.lockMode          = InteractableLock.InteractableLockMode.RESOURCEFUL_RAT;
            m_EXLockHollow.JailCellKeyId     = m_RatLock.GetComponent <InteractableLock>().JailCellKeyId;
            m_EXLockHollow.IdleAnimName      = m_RatLock.GetComponent <InteractableLock>().IdleAnimName;
            m_EXLockHollow.UnlockAnimName    = m_RatLock.GetComponent <InteractableLock>().UnlockAnimName;
            m_EXLockHollow.NoKeyAnimName     = m_RatLock.GetComponent <InteractableLock>().NoKeyAnimName;
            m_EXLockHollow.SpitAnimName      = m_RatLock.GetComponent <InteractableLock>().SpitAnimName;
            m_EXLockHollow.BustedAnimName    = m_RatLock.GetComponent <InteractableLock>().BustedAnimName;
            m_SecretDoorHollowComponent.Lock = m_EXLockHollow;
            EXSecretDoor_Hollow.SetLayerRecursively(LayerMask.NameToLayer("FG_Critical"));

            EXSecretDoor_Hollow_Unlocked = expandSharedAssets1.LoadAsset <GameObject>("EX_Secret_Door_Hollow_Unlocked");
            GameObject EXSecretDoorHollowUnlocked_Frame_Top    = EXSecretDoor_Hollow_Unlocked.transform.Find("FrameTop").gameObject;
            GameObject EXSecretDoorHollowUnlocked_Frame_Bottom = EXSecretDoor_Hollow_Unlocked.transform.Find("FrameBottom").gameObject;
            GameObject EXSecretDoorHollowUnlocked_Background   = EXSecretDoor_Hollow_Unlocked.transform.Find("Background").gameObject;
            GameObject EXSecretDoorHollowUnlocked_Light        = EXSecretDoor_Hollow_Unlocked.transform.Find("Light").gameObject;

            tk2dSprite m_DoorHollow_UnlockedSprite             = SpriteSerializer.AddSpriteToObject(EXSecretDoor_Hollow_Unlocked, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Open_00");
            tk2dSprite m_DoorHollow_UnlockedBorderTopSprite    = SpriteSerializer.AddSpriteToObject(EXSecretDoorHollowUnlocked_Frame_Top, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Frame_Top");
            tk2dSprite m_DoorHollow_UnlockedBorderBottomSprite = SpriteSerializer.AddSpriteToObject(EXSecretDoorHollowUnlocked_Frame_Bottom, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Frame_Bottom");
            tk2dSprite m_DoorHollow_UnlockedBackgroundSprite   = SpriteSerializer.AddSpriteToObject(EXSecretDoorHollowUnlocked_Background, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Background");
            tk2dSprite m_DoorHollow_UnlockedLightSprite        = SpriteSerializer.AddSpriteToObject(EXSecretDoorHollowUnlocked_Light, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Light_Red");

            m_DoorHollow_UnlockedBorderTopSprite.HeightOffGround    = 3;
            m_DoorHollow_UnlockedBorderBottomSprite.HeightOffGround = -0.5f;
            m_DoorHollow_UnlockedSprite.HeightOffGround             = -1.5f;
            m_DoorHollow_UnlockedBackgroundSprite.HeightOffGround   = -2f;
            m_DoorHollow_UnlockedLightSprite.HeightOffGround        = 3.5f;

            ExpandUtility.GenerateSpriteAnimator(EXSecretDoor_Hollow_Unlocked, DoorSpriteAnimations, ClipFps: 10);

            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Hollow_Unlocked, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 64), offset: new IntVector2(16, 0));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Hollow_Unlocked, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 14));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Hollow_Unlocked, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, IsTrigger: true, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 12));

            ExpandSecretDoorPlacable m_SecretDoorHollow_UnlockedComponent = EXSecretDoor_Hollow_Unlocked.AddComponent <ExpandSecretDoorPlacable>();

            m_SecretDoorHollow_UnlockedComponent.DoorTopBorderObject    = EXSecretDoorHollowUnlocked_Frame_Top;
            m_SecretDoorHollow_UnlockedComponent.DoorBottomBorderObject = EXSecretDoorHollowUnlocked_Frame_Bottom;
            m_SecretDoorHollow_UnlockedComponent.DoorBackgroundObject   = EXSecretDoorHollowUnlocked_Background;
            m_SecretDoorHollow_UnlockedComponent.DoorLightObject        = EXSecretDoorHollowUnlocked_Light;
            EXSecretDoor_Hollow_Unlocked.SetLayerRecursively(LayerMask.NameToLayer("FG_Critical"));



            EXSecretDoor = expandSharedAssets1.LoadAsset <GameObject>("EX_Secret_Door");
            GameObject EXSecretDoor_Frame_Top    = EXSecretDoor.transform.Find("FrameTop").gameObject;
            GameObject EXSecretDoor_Frame_Bottom = EXSecretDoor.transform.Find("FrameBottom").gameObject;
            GameObject EXSecretDoor_Background   = EXSecretDoor.transform.Find("Background").gameObject;
            GameObject EXSecretDoor_Light        = EXSecretDoor.transform.Find("Light").gameObject;
            GameObject EXSecretDoor_Lock         = EXSecretDoor.transform.Find("Lock").gameObject;


            tk2dSprite m_DoorSprite             = SpriteSerializer.AddSpriteToObject(EXSecretDoor, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Open_00");
            tk2dSprite m_DoorBorderTopSprite    = SpriteSerializer.AddSpriteToObject(EXSecretDoor_Frame_Top, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Frame_NoDecal_Top");
            tk2dSprite m_DoorBorderBottomSprite = SpriteSerializer.AddSpriteToObject(EXSecretDoor_Frame_Bottom, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Frame_Bottom");
            tk2dSprite m_DoorBackgroundSprite   = SpriteSerializer.AddSpriteToObject(EXSecretDoor_Background, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Background");
            tk2dSprite m_DoorLightSprite        = SpriteSerializer.AddSpriteToObject(EXSecretDoor_Light, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Light_Red");

            m_DoorBorderTopSprite.HeightOffGround    = 3;
            m_DoorBorderBottomSprite.HeightOffGround = -0.5f;
            m_DoorSprite.HeightOffGround             = -1.5f;
            m_DoorBackgroundSprite.HeightOffGround   = -2f;
            m_DoorLightSprite.HeightOffGround        = 3.5f;


            ExpandUtility.GenerateSpriteAnimator(EXSecretDoor, DoorSpriteAnimations, ClipFps: 10);

            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 64), offset: new IntVector2(16, 0));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 14));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, IsTrigger: true, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 12));

            ExpandSecretDoorPlacable m_SecretDoorComponent = EXSecretDoor.AddComponent <ExpandSecretDoorPlacable>();

            m_SecretDoorComponent.DoorTopBorderObject    = EXSecretDoor_Frame_Top;
            m_SecretDoorComponent.DoorBottomBorderObject = EXSecretDoor_Frame_Bottom;
            m_SecretDoorComponent.DoorBackgroundObject   = EXSecretDoor_Background;
            m_SecretDoorComponent.DoorLightObject        = EXSecretDoor_Light;

            Dungeon    Base_Castle  = DungeonDatabase.GetOrLoadByName("Base_Castle");
            GameObject m_NormalLock = (Base_Castle.PatternSettings.flows[0].sharedInjectionData[1].InjectionData[0].exactRoom.placedObjects[0].nonenemyBehaviour as SecretFloorInteractableController).WorldLocks[0].gameObject;

            tk2dSprite EXLockNormalSprite = EXSecretDoor_Lock.AddComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(EXLockNormalSprite, m_NormalLock.GetComponent <tk2dSprite>());
            ExpandUtility.DuplicateSpriteAnimator(EXSecretDoor_Lock, m_NormalLock.GetComponent <tk2dSpriteAnimator>());
            EXLockNormalSprite.HeightOffGround = 1.7f;

            InteractableLock m_EXLockNormal = EXSecretDoor_Lock.AddComponent <InteractableLock>();

            m_EXLockNormal.Suppress       = m_NormalLock.GetComponent <InteractableLock>().Suppress;
            m_EXLockNormal.lockMode       = m_NormalLock.GetComponent <InteractableLock>().lockMode;
            m_EXLockNormal.JailCellKeyId  = m_NormalLock.GetComponent <InteractableLock>().JailCellKeyId;
            m_EXLockNormal.IdleAnimName   = m_NormalLock.GetComponent <InteractableLock>().IdleAnimName;
            m_EXLockNormal.UnlockAnimName = m_NormalLock.GetComponent <InteractableLock>().UnlockAnimName;
            m_EXLockNormal.NoKeyAnimName  = m_NormalLock.GetComponent <InteractableLock>().NoKeyAnimName;
            m_EXLockNormal.SpitAnimName   = m_NormalLock.GetComponent <InteractableLock>().SpitAnimName;
            m_EXLockNormal.BustedAnimName = m_NormalLock.GetComponent <InteractableLock>().BustedAnimName;

            m_SecretDoorComponent.Lock = m_EXLockNormal;
            EXSecretDoor.SetLayerRecursively(LayerMask.NameToLayer("FG_Critical"));

            Base_Castle  = null;
            m_NormalLock = null;

            EXSecretDoor_Unlocked = expandSharedAssets1.LoadAsset <GameObject>("EX_Secret_Door_Unlocked");
            GameObject EXSecretDoorUnlocked_Frame_Top    = EXSecretDoor_Unlocked.transform.Find("FrameTop").gameObject;
            GameObject EXSecretDoorUnlocked_Frame_Bottom = EXSecretDoor_Unlocked.transform.Find("FrameBottom").gameObject;
            GameObject EXSecretDoorUnlocked_Background   = EXSecretDoor_Unlocked.transform.Find("Background").gameObject;
            GameObject EXSecretDoorUnlocked_Light        = EXSecretDoor_Unlocked.transform.Find("Light").gameObject;

            tk2dSprite m_Door_UnlockedSprite             = SpriteSerializer.AddSpriteToObject(EXSecretDoor_Unlocked, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Open_00");
            tk2dSprite m_Door_UnlockedBorderTopSprite    = SpriteSerializer.AddSpriteToObject(EXSecretDoorUnlocked_Frame_Top, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Frame_Top");
            tk2dSprite m_Door_UnlockedBorderBottomSprite = SpriteSerializer.AddSpriteToObject(EXSecretDoorUnlocked_Frame_Bottom, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Frame_Bottom");
            tk2dSprite m_Door_UnlockedBackgroundSprite   = SpriteSerializer.AddSpriteToObject(EXSecretDoorUnlocked_Background, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Background");
            tk2dSprite m_Door_UnlockedLightSprite        = SpriteSerializer.AddSpriteToObject(EXSecretDoorUnlocked_Light, ExpandPrefabs.EXSecretDoorCollection, "EXSecretDoor_Light_Red");

            m_Door_UnlockedBorderTopSprite.HeightOffGround    = 3;
            m_Door_UnlockedBorderBottomSprite.HeightOffGround = -0.5f;
            m_Door_UnlockedSprite.HeightOffGround             = -1.5f;
            m_Door_UnlockedBackgroundSprite.HeightOffGround   = -2f;
            m_Door_UnlockedLightSprite.HeightOffGround        = 3.5f;

            ExpandUtility.GenerateSpriteAnimator(EXSecretDoor_Unlocked, DoorSpriteAnimations, ClipFps: 10);

            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Unlocked, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 64), offset: new IntVector2(16, 0));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Unlocked, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 14));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor_Unlocked, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, IsTrigger: true, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 12));

            ExpandSecretDoorPlacable m_SecretDoor_UnlockedComponent = EXSecretDoor_Unlocked.AddComponent <ExpandSecretDoorPlacable>();

            m_SecretDoor_UnlockedComponent.DoorTopBorderObject    = EXSecretDoorUnlocked_Frame_Top;
            m_SecretDoor_UnlockedComponent.DoorBottomBorderObject = EXSecretDoorUnlocked_Frame_Bottom;
            m_SecretDoor_UnlockedComponent.DoorBackgroundObject   = EXSecretDoorUnlocked_Background;
            m_SecretDoor_UnlockedComponent.DoorLightObject        = EXSecretDoorUnlocked_Light;
            EXSecretDoor_Unlocked.SetLayerRecursively(LayerMask.NameToLayer("FG_Critical"));
        }
        public static void InitPrefabs(AssetBundle expandSharedAssets1)
        {
            List <string> m_DoorOpenSprites = new List <string>()
            {
                "EXSecretDoor_Open_00",
                "EXSecretDoor_Open_01",
                "EXSecretDoor_Open_02",
                "EXSecretDoor_Open_03",
                "EXSecretDoor_Open_04",
                "EXSecretDoor_Open_05",
                "EXSecretDoor_Open_06",
                "EXSecretDoor_Open_07"
            };

            List <string> m_DoorCloseSprites = new List <string>()
            {
                "EXSecretDoor_Close_00",
                "EXSecretDoor_Close_01",
                "EXSecretDoor_Close_02",
                "EXSecretDoor_Close_03",
                "EXSecretDoor_Close_04",
                "EXSecretDoor_Close_05",
                "EXSecretDoor_Close_06",
                "EXSecretDoor_Close_07",
            };

            EXSecretDoorMinimapIcon = expandSharedAssets1.LoadAsset <GameObject>("EXSecretDoor_MinimapIcon");
            ItemBuilder.AddSpriteToObject(EXSecretDoorMinimapIcon, expandSharedAssets1.LoadAsset <Texture2D>("EXSecretDoor_MinimapIcon"), false, false);

            EXSecretDoor                               = expandSharedAssets1.LoadAsset <GameObject>("EX Secret Door Entrance");
            EXSecretDoor_Frame_Top                     = EXSecretDoor.transform.Find("EX Secret Door Top").gameObject;
            EXSecretDoor_Frame_Bottom                  = EXSecretDoor.transform.Find("EX Secret Door Bottom").gameObject;
            EXSecretDoor_Background                    = EXSecretDoor.transform.Find("EX Secret Door Background").gameObject;
            EXSecretDoor_Light                         = EXSecretDoor.transform.Find("EX Secret Door Light").gameObject;
            EXSecretDoor_Frame_Top.layer               = LayerMask.NameToLayer("FG_Critical");
            EXSecretDoor_Frame_Bottom.layer            = LayerMask.NameToLayer("FG_Critical");
            EXSecretDoor_Background.layer              = LayerMask.NameToLayer("FG_Critical");
            EXSecretDoor_Light.layer                   = LayerMask.NameToLayer("FG_Critical");
            EXSecretDoor_Frame_Top.transform.parent    = EXSecretDoor.transform;
            EXSecretDoor_Frame_Bottom.transform.parent = EXSecretDoor.transform;
            EXSecretDoor_Background.transform.parent   = EXSecretDoor.transform;
            EXSecretDoor_Light.transform.parent        = EXSecretDoor.transform;

            ItemBuilder.AddSpriteToObject(EXSecretDoor, expandSharedAssets1.LoadAsset <Texture2D>("EXSecretDoor_Open_00"), false, false);
            ItemBuilder.AddSpriteToObject(EXSecretDoor_Frame_Top, expandSharedAssets1.LoadAsset <Texture2D>("EXSecretDoor_Frame_Top"), false, false);
            ItemBuilder.AddSpriteToObject(EXSecretDoor_Frame_Bottom, expandSharedAssets1.LoadAsset <Texture2D>("EXSecretDoor_Frame_Bottom"), false, false);
            ItemBuilder.AddSpriteToObject(EXSecretDoor_Background, expandSharedAssets1.LoadAsset <Texture2D>("EXSecretDoor_Background"), false, false);
            ItemBuilder.AddSpriteToObject(EXSecretDoor_Light, expandSharedAssets1.LoadAsset <Texture2D>("EXSecretDoor_Light_Red"), false, false);


            tk2dSprite m_DoorBorderTopSprite = EXSecretDoor_Frame_Top.GetComponent <tk2dSprite>();

            m_DoorBorderTopSprite.HeightOffGround = 3;
            SpriteBuilder.AddSpriteToCollection(expandSharedAssets1.LoadAsset <Texture2D>("EXSecretDoor_Frame_NoDecal_Top"), m_DoorBorderTopSprite.Collection);

            tk2dSprite m_DoorBorderBottomSprite = EXSecretDoor_Frame_Bottom.GetComponent <tk2dSprite>();

            m_DoorBorderBottomSprite.HeightOffGround = -0.5f;

            tk2dSprite m_DoorSprite = EXSecretDoor.GetComponent <tk2dSprite>();

            m_DoorSprite.HeightOffGround = -1.5f;

            tk2dSprite m_DoorBackgroundSprite = EXSecretDoor_Background.GetComponent <tk2dSprite>();

            m_DoorBackgroundSprite.HeightOffGround = -2f;

            tk2dSprite m_DoorLightSprite = EXSecretDoor_Light.GetComponent <tk2dSprite>();

            m_DoorLightSprite.HeightOffGround = 3.5f;

            SpriteBuilder.AddSpriteToCollection(expandSharedAssets1.LoadAsset <Texture2D>("EXSecretDoor_Light_Green"), m_DoorLightSprite.Collection);

            foreach (string spriteName in m_DoorOpenSprites)
            {
                if (spriteName != "EXSecretDoor_Open_00")
                {
                    SpriteBuilder.AddSpriteToCollection(expandSharedAssets1.LoadAsset <Texture2D>(spriteName), m_DoorSprite.Collection);
                }
            }
            foreach (string spriteName in m_DoorCloseSprites)
            {
                SpriteBuilder.AddSpriteToCollection(expandSharedAssets1.LoadAsset <Texture2D>(spriteName), m_DoorSprite.Collection);
            }

            ExpandUtility.GenerateSpriteAnimator(EXSecretDoor, ClipFps: 10);

            tk2dSpriteAnimator m_DoorAnimator = EXSecretDoor.GetComponent <tk2dSpriteAnimator>();

            ExpandUtility.AddAnimation(m_DoorAnimator, m_DoorSprite.Collection, m_DoorOpenSprites, "door_open", frameRate: 10);
            ExpandUtility.AddAnimation(m_DoorAnimator, m_DoorSprite.Collection, m_DoorCloseSprites, "door_close", frameRate: 10);

            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 64), offset: new IntVector2(16, 0));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 14));
            ExpandUtility.GenerateOrAddToRigidBody(EXSecretDoor, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, CanBeCarried: false, IsTrigger: true, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(32, 32), offset: new IntVector2(16, 12));

            ExpandSecretDoorPlacable m_SecretDoorComponent = EXSecretDoor.AddComponent <ExpandSecretDoorPlacable>();

            m_SecretDoorComponent.DoorTopBorderObject    = EXSecretDoor_Frame_Top;
            m_SecretDoorComponent.DoorBottomBorderObject = EXSecretDoor_Frame_Bottom;
            m_SecretDoorComponent.DoorBackgroundObject   = EXSecretDoor_Background;
            m_SecretDoorComponent.DoorLightObject        = EXSecretDoor_Light;

            GameObject m_RatLock = ExpandPrefabs.RatJailDoorPlacable.gameObject.GetComponent <InteractableDoorController>().WorldLocks[0].gameObject;

            EXSecretDoor_Lock = EXSecretDoor.transform.Find("EX Secret Door Lock").gameObject;
            tk2dSprite EXLockSprite = EXSecretDoor_Lock.AddComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(EXLockSprite, m_RatLock.GetComponent <tk2dSprite>());
            EXLockSprite.HeightOffGround = -0.3f;

            tk2dSpriteAnimator m_EXLockAnimator = ExpandUtility.DuplicateSpriteAnimator(EXSecretDoor_Lock, m_RatLock.GetComponent <tk2dSpriteAnimator>(), true);

            InteractableLock m_EXLock = EXSecretDoor_Lock.AddComponent <InteractableLock>();

            m_EXLock.Suppress       = m_RatLock.GetComponent <InteractableLock>().Suppress;
            m_EXLock.lockMode       = InteractableLock.InteractableLockMode.RESOURCEFUL_RAT;
            m_EXLock.JailCellKeyId  = m_RatLock.GetComponent <InteractableLock>().JailCellKeyId;
            m_EXLock.IdleAnimName   = m_RatLock.GetComponent <InteractableLock>().IdleAnimName;
            m_EXLock.UnlockAnimName = m_RatLock.GetComponent <InteractableLock>().UnlockAnimName;
            m_EXLock.NoKeyAnimName  = m_RatLock.GetComponent <InteractableLock>().NoKeyAnimName;
            m_EXLock.SpitAnimName   = m_RatLock.GetComponent <InteractableLock>().SpitAnimName;
            m_EXLock.BustedAnimName = m_RatLock.GetComponent <InteractableLock>().BustedAnimName;

            m_SecretDoorComponent.Lock = m_EXLock;
            EXSecretDoor_Lock.SetLayerRecursively(LayerMask.NameToLayer("FG_Critical"));

            EXSecretDoorDestination      = UnityEngine.Object.Instantiate(EXSecretDoor);
            EXSecretDoorDestination.name = "EX Secret Door (Exit)";
            ExpandSecretDoorExitPlacable m_ExitDoorComponent = EXSecretDoorDestination.AddComponent <ExpandSecretDoorExitPlacable>();

            m_ExitDoorComponent.MinimapIcon = ExpandPrefabs.exit_room_basic.associatedMinimapIcon;

            m_ExitDoorComponent.DoorBackgroundObject   = EXSecretDoorDestination.GetComponent <ExpandSecretDoorPlacable>().DoorBackgroundObject;
            m_ExitDoorComponent.DoorBottomBorderObject = EXSecretDoorDestination.GetComponent <ExpandSecretDoorPlacable>().DoorBottomBorderObject;
            m_ExitDoorComponent.DoorLightObject        = EXSecretDoorDestination.GetComponent <ExpandSecretDoorPlacable>().DoorLightObject;
            m_ExitDoorComponent.DoorTopBorderObject    = EXSecretDoorDestination.GetComponent <ExpandSecretDoorPlacable>().DoorTopBorderObject;
            UnityEngine.Object.Destroy(EXSecretDoorDestination.GetComponent <ExpandSecretDoorPlacable>().Lock.gameObject);
            UnityEngine.Object.Destroy(EXSecretDoorDestination.GetComponent <ExpandSecretDoorPlacable>());


            Dungeon    Base_Castle  = DungeonDatabase.GetOrLoadByName("Base_Castle");
            GameObject m_NormalLock = (Base_Castle.PatternSettings.flows[0].sharedInjectionData[1].InjectionData[0].exactRoom.placedObjects[0].nonenemyBehaviour as SecretFloorInteractableController).WorldLocks[0].gameObject;

            // Setup copy with no rat decal and normal lock instead of rat lock. A general purpose version of the Mini-Elevator.
            EXSecretDoor_Normal      = UnityEngine.Object.Instantiate(EXSecretDoor);
            EXSecretDoor_Normal.name = "EX Secret Door 2 (Entrance)";

            Vector3 Lock2PositionOffset = (EXSecretDoor_Normal.transform.position + new Vector3(1.22f, 0.34f));

            ExpandSecretDoorPlacable m_SecretDoor2Component = EXSecretDoor_Normal.GetComponent <ExpandSecretDoorPlacable>();

            m_SecretDoor2Component.isHollowsElevator = false;
            UnityEngine.Object.Destroy(m_SecretDoor2Component.Lock.gameObject);
            m_SecretDoor2Component.DoorTopBorderObject.GetComponent <tk2dSprite>().SetSprite("EXSecretDoor_Frame_NoDecal_Top");
            GameObject m_LockObject2 = UnityEngine.Object.Instantiate(m_NormalLock, Lock2PositionOffset, Quaternion.identity);

            m_LockObject2.gameObject.SetLayerRecursively(LayerMask.NameToLayer("FG_Critical"));
            m_LockObject2.GetComponent <InteractableLock>().sprite.HeightOffGround = 1.7f;
            m_LockObject2.GetComponent <InteractableLock>().sprite.UpdateZDepth();
            // m_LockObject2.SetActive(false);
            m_LockObject2.transform.SetParent(EXSecretDoor_Normal.transform, true);
            m_SecretDoor2Component.Lock = m_LockObject2.GetComponent <InteractableLock>();


            /*m_ExitDoorComponent.DoorBackgroundObject.SetActive(false);
             * m_ExitDoorComponent.DoorBottomBorderObject.SetActive(false);
             * m_ExitDoorComponent.DoorLightObject.SetActive(false);
             * m_ExitDoorComponent.DoorTopBorderObject.SetActive(false);*/
            EXSecretDoor_Normal.SetActive(false);
            EXSecretDoorDestination.SetActive(false);
            FakePrefab.MarkAsFakePrefab(EXSecretDoor_Normal);
            FakePrefab.MarkAsFakePrefab(EXSecretDoorDestination);
            UnityEngine.Object.DontDestroyOnLoad(EXSecretDoor_Normal);
            UnityEngine.Object.DontDestroyOnLoad(EXSecretDoorDestination);

            Base_Castle  = null;
            m_NormalLock = null;
        }
        public static void BuildPrefab()
        {
            ExpandPrefabs.EXFriendlyForgeHammer = new GameObject("Friendly_Forge_Hammer")
            {
                layer = 22
            };

            GameObject m_HitEffectObject      = Instantiate(ExpandPrefabs.ForgeHammer.GetComponent <ForgeHammerController>().HitEffectAnimator.gameObject);
            GameObject m_TargetAnimatorObject = Instantiate(ExpandPrefabs.ForgeHammer.GetComponent <ForgeHammerController>().TargetAnimator.gameObject);
            GameObject m_ShadowObject         = Instantiate(ExpandPrefabs.ForgeHammer.GetComponent <ForgeHammerController>().ShadowAnimator.gameObject);
            GameObject m_ShootPointObject     = Instantiate(ExpandPrefabs.ForgeHammer.GetComponent <ForgeHammerController>().ShootPoint.gameObject);

            m_ShootPointObject.name = ExpandPrefabs.ForgeHammer.GetComponent <ForgeHammerController>().ShootPoint.gameObject.name;

            m_HitEffectObject.transform.parent      = ExpandPrefabs.EXFriendlyForgeHammer.transform;
            m_TargetAnimatorObject.transform.parent = ExpandPrefabs.EXFriendlyForgeHammer.transform;
            m_ShadowObject.transform.parent         = ExpandPrefabs.EXFriendlyForgeHammer.transform;
            m_ShootPointObject.transform.parent     = ExpandPrefabs.EXFriendlyForgeHammer.transform;

            ExpandPrefabs.EXFriendlyForgeHammer.SetActive(false);

            m_ShadowObject.GetComponent <tk2dSpriteAnimator>().playAutomatically = false;
            m_ShadowObject.GetComponent <tk2dSpriteAnimator>().DefaultClipId     = 28;

            tk2dSprite m_NewHammerSprite = ExpandPrefabs.EXFriendlyForgeHammer.AddComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(m_NewHammerSprite, ExpandPrefabs.ForgeHammer.GetComponent <tk2dSprite>());

            tk2dSpriteAnimation m_SourceHammerAnimationLibrary = ExpandPrefabs.ForgeHammer.GetComponent <tk2dSpriteAnimator>().Library;
            tk2dSpriteAnimation m_HammerAnimationLibrary       = ExpandPrefabs.EXFriendlyForgeHammer.AddComponent <tk2dSpriteAnimation>();

            List <tk2dSpriteAnimationClip> m_Clips = new List <tk2dSpriteAnimationClip>();

            foreach (tk2dSpriteAnimationClip clip in m_SourceHammerAnimationLibrary.clips)
            {
                if (!string.IsNullOrEmpty(clip.name))
                {
                    if (clip.name.ToLower().StartsWith("hammer_right_out"))
                    {
                        m_Clips.Add(ExpandUtility.DuplicateAnimationClip(clip));
                    }
                    else if (clip.name.ToLower().StartsWith("hammer_left_out"))
                    {
                        m_Clips.Add(ExpandUtility.DuplicateAnimationClip(clip));
                    }
                    else if (clip.name.ToLower().StartsWith("hammer_right_slam"))
                    {
                        m_Clips.Add(ExpandUtility.DuplicateAnimationClip(clip));
                    }
                    else if (clip.name.ToLower().StartsWith("hammer_left_slam"))
                    {
                        m_Clips.Add(ExpandUtility.DuplicateAnimationClip(clip));
                    }
                }
            }

            if (m_Clips.Count > 0)
            {
                m_HammerAnimationLibrary.clips = m_Clips.ToArray();
            }

            ExpandUtility.GenerateSpriteAnimator(ExpandPrefabs.EXFriendlyForgeHammer, m_HammerAnimationLibrary, 0, 0, false, false, false, false, false, false, 0, 0, false, false, false);

            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXFriendlyForgeHammer, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, true, true, false, false, false, false, false, true, new IntVector2(30, 24), new IntVector2(16, 24));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXFriendlyForgeHammer, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, true, true, false, false, false, false, false, true, new IntVector2(30, 8), new IntVector2(16, 16));

            AIBulletBank m_HammerBulletBank = ExpandPrefabs.EXFriendlyForgeHammer.AddComponent <AIBulletBank>();

            m_HammerBulletBank.useDefaultBulletIfMissing = true;
            m_HammerBulletBank.transforms = new List <Transform>(0);
            m_HammerBulletBank.Bullets    = new List <AIBulletBank.Entry>()
            {
                new AIBulletBank.Entry()
                {
                    Name                             = "default",
                    BulletObject                     = ExpandPrefabs.EXFriendlyForgeHammerBullet,
                    OverrideProjectile               = false,
                    PlayAudio                        = false,
                    AudioSwitch                      = string.Empty,
                    AudioEvent                       = string.Empty,
                    AudioLimitOncePerFrame           = false,
                    AudioLimitOncePerAttack          = false,
                    MuzzleLimitOncePerFrame          = false,
                    MuzzleInheritsTransformDirection = false,
                    SpawnShells                      = false,
                    ShellForce                       = 1.75f,
                    ShellForceVariance               = 0.75f,
                    DontRotateShell                  = false,
                    ShellGroundOffset                = 0,
                    ShellsLimitOncePerFrame          = false,
                    rampBullets                      = false,
                    rampStartHeight                  = 0,
                    rampTime                         = 0,
                    conditionalMinDegFromNorth       = 0,
                    forceCanHitEnemies               = true,
                    suppressHitEffectsIfOffscreen    = false,
                    preloadCount                     = 0,
                    ProjectileData                   = new ProjectileData()
                    {
                        damage  = 0,
                        speed   = 0,
                        range   = 0,
                        damping = 0,
                        UsesCustomAccelerationCurve     = false,
                        AccelerationCurve               = new AnimationCurve(),
                        CustomAccelerationCurveDuration = 0,
                        onDestroyBulletScript           = new BulletScriptSelector()
                        {
                            scriptTypeName = string.Empty
                        }
                    },
                    MuzzleFlashEffects = new VFXPool()
                    {
                        type = VFXPoolType.None, effects = new VFXComplex[0]
                    }
                }
            };

            GoopDefinition m_HammerGoopDefinition = Instantiate(ExpandPrefabs.ForgeHammer.GetComponent <ForgeHammerController>().GoopToDo);

            ExpandForgeHammerComponent EXFriendlyHammerController = ExpandPrefabs.EXFriendlyForgeHammer.AddComponent <ExpandForgeHammerComponent>();

            EXFriendlyHammerController.HitEffectAnimator = m_HitEffectObject.GetComponent <tk2dSpriteAnimator>();
            EXFriendlyHammerController.TargetAnimator    = m_TargetAnimatorObject.GetComponent <tk2dSpriteAnimator>();
            EXFriendlyHammerController.ShadowAnimator    = m_ShadowObject.GetComponent <tk2dSpriteAnimator>();
            EXFriendlyHammerController.ShootPoint        = m_ShootPointObject.transform;
            EXFriendlyHammerController.GoopToDo          = m_HammerGoopDefinition;

            FakePrefab.MarkAsFakePrefab(ExpandPrefabs.EXFriendlyForgeHammer);
            DontDestroyOnLoad(ExpandPrefabs.EXFriendlyForgeHammer);
        }
        public static void GenerateGungeoneerMimicBoss(AssetBundle expandSharedAssets1, GameObject aiActorObject, PlayerController sourcePlayer = null)
        {
            if (sourcePlayer == null)
            {
                sourcePlayer = GameManager.Instance.PrimaryPlayer;
            }
            if (sourcePlayer == null)
            {
                return;
            }

            tk2dSprite playerSprite = aiActorObject.AddComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(playerSprite, (sourcePlayer.sprite as tk2dSprite));

            // If Player sprite was flipped (aka, player aiming/facing towards the left), then this could cause sprite being shifted left on AIActor.
            // Always set false to ensure this doesn't happen.
            playerSprite.FlipX = false;

            ExpandUtility.GenerateAIActorTemplate(aiActorObject, out m_CorpseObject, aiActorObject.name, System.Guid.NewGuid().ToString(), GunAttachOffset: new Vector3(0.3f, 0.25f, 0), StartingGunID: 472);

            AIActor CachedEnemyActor = aiActorObject.GetComponent <AIActor>();

            if (!aiActorObject | !CachedEnemyActor)
            {
                return;
            }

            if (ExpandStats.debugMode)
            {
                ETGModConsole.Log("Spawning '" + CachedEnemyActor.ActorName + "' with GUID: " + CachedEnemyActor.EnemyGuid + " .", false);
            }

            GameObject m_NewHandObject = new GameObject("PlayerMimicHand");
            tk2dSprite m_HandSprite    = m_NewHandObject.AddComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(m_HandSprite, sourcePlayer.primaryHand.gameObject.GetComponent <tk2dSprite>());
            PlayerHandController m_HandController = m_NewHandObject.AddComponent <PlayerHandController>();

            m_HandController.ForceRenderersOff = false;
            m_HandController.handHeightFromGun = 0.05f;

            CachedEnemyActor.aiShooter.handObject = m_HandController;

            // Generate BossCard based on current Player.
            Texture2D BossCardForeground = ExpandUtility.FlipTexture(Instantiate(sourcePlayer.BosscardSprites[0]));
            // Mirror thing will be used as static background. (will be the same for all possible boss cards)
            Texture2D BossCardBackground = expandSharedAssets1.LoadAsset <Texture2D>("MimicInMirror_BossCardBackground");
            // Combine foreground boss card generated from PlayerController onto the static background image loased in earlier. Resolutions must match!
            Texture2D BossCardTexture = ExpandUtility.CombineTextures(BossCardBackground, BossCardForeground);



            GenericIntroDoer miniBossIntroDoer = aiActorObject.AddComponent <GenericIntroDoer>();

            aiActorObject.AddComponent <ExpandGungeoneerMimicIntroDoer>();
            miniBossIntroDoer.triggerType              = GenericIntroDoer.TriggerType.PlayerEnteredRoom;
            miniBossIntroDoer.initialDelay             = 0.15f;
            miniBossIntroDoer.cameraMoveSpeed          = 14;
            miniBossIntroDoer.specifyIntroAiAnimator   = null;
            miniBossIntroDoer.BossMusicEvent           = "Play_MUS_Boss_Theme_Beholster";
            miniBossIntroDoer.PreventBossMusic         = false;
            miniBossIntroDoer.InvisibleBeforeIntroAnim = false;
            miniBossIntroDoer.preIntroAnim             = string.Empty;
            miniBossIntroDoer.preIntroDirectionalAnim  = string.Empty;
            miniBossIntroDoer.introAnim                  = "idle";
            miniBossIntroDoer.introDirectionalAnim       = string.Empty;
            miniBossIntroDoer.continueAnimDuringOutro    = false;
            miniBossIntroDoer.cameraFocus                = null;
            miniBossIntroDoer.roomPositionCameraFocus    = Vector2.zero;
            miniBossIntroDoer.restrictPlayerMotionToRoom = false;
            miniBossIntroDoer.fusebombLock               = false;
            miniBossIntroDoer.AdditionalHeightOffset     = 0;
            miniBossIntroDoer.portraitSlideSettings      = new PortraitSlideSettings()
            {
                bossNameString          = "Dopplegunner",
                bossSubtitleString      = "Imposter!",
                bossQuoteString         = "Clone gone rogue...",
                bossSpritePxOffset      = IntVector2.Zero,
                topLeftTextPxOffset     = IntVector2.Zero,
                bottomRightTextPxOffset = IntVector2.Zero,
                bgColor = new Color(0, 0, 1, 1)
            };
            if (BossCardTexture)
            {
                miniBossIntroDoer.portraitSlideSettings.bossArtSprite = BossCardTexture;
                miniBossIntroDoer.SkipBossCard             = false;
                CachedEnemyActor.healthHaver.bossHealthBar = HealthHaver.BossBarType.MainBar;
            }
            else
            {
                miniBossIntroDoer.SkipBossCard             = true;
                CachedEnemyActor.healthHaver.bossHealthBar = HealthHaver.BossBarType.SubbossBar;
            }
            miniBossIntroDoer.HideGunAndHand        = true;
            miniBossIntroDoer.SkipFinalizeAnimation = true;
            miniBossIntroDoer.RegenerateCache();


            CachedEnemyActor.BaseMovementSpeed = 8f;
            CachedEnemyActor.MovementSpeed     = 8f;

            CachedEnemyActor.healthHaver.SetHealthMaximum(1000);
            CachedEnemyActor.healthHaver.ForceSetCurrentHealth(1000);
            CachedEnemyActor.healthHaver.overrideBossName = "Dopplegunner";
            CachedEnemyActor.healthHaver.RegenerateCache();

            CachedEnemyActor.EnemyId             = Random.Range(2000, 9999);
            CachedEnemyActor.EnemyGuid           = System.Guid.NewGuid().ToString();
            CachedEnemyActor.OverrideDisplayName = ("Dopplegunner");
            CachedEnemyActor.ActorName           = ("Dopplegunner");
            CachedEnemyActor.name = ("Dopplegunner");

            CachedEnemyActor.CanTargetEnemies = false;
            CachedEnemyActor.CanTargetPlayers = true;

            if (sourcePlayer.characterIdentity == PlayableCharacters.Bullet)
            {
                CachedEnemyActor.EnemySwitchState = "Metal_Bullet_Man";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Convict)
            {
                CachedEnemyActor.EnemySwitchState = "Convict";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.CoopCultist)
            {
                CachedEnemyActor.EnemySwitchState = "Cultist";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Cosmonaut)
            {
                CachedEnemyActor.EnemySwitchState = "Cosmonaut";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Guide)
            {
                CachedEnemyActor.EnemySwitchState = "Guide";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Gunslinger)
            {
                CachedEnemyActor.EnemySwitchState = "Gunslinger";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Ninja)
            {
                CachedEnemyActor.EnemySwitchState = "Ninja";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Pilot)
            {
                CachedEnemyActor.EnemySwitchState = "Rogue";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Robot)
            {
                CachedEnemyActor.EnemySwitchState = "Robot";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Soldier)
            {
                CachedEnemyActor.EnemySwitchState = "Marine";
            }
            else if (sourcePlayer.characterIdentity == PlayableCharacters.Eevee)
            {
                CachedEnemyActor.EnemySwitchState = "Convict";
                ExpandShaders.ApplyParadoxPlayerShader(CachedEnemyActor.sprite);
            }
            else
            {
                CachedEnemyActor.EnemySwitchState = "Gun Cultist";
            }


            ExpandGungeoneerMimicBossController playerMimicController = aiActorObject.AddComponent <ExpandGungeoneerMimicBossController>();

            playerMimicController.m_Player = sourcePlayer;

            aiActorObject.AddComponent <ExpandGungeoneerMimicDeathController>();

            if (CachedEnemyActor.GetComponent <ExpandGungeoneerMimicIntroDoer>())
            {
                GenericIntroDoer genericIntroDoer = CachedEnemyActor.gameObject.GetComponent <GenericIntroDoer>();
                FieldInfo        field            = typeof(GenericIntroDoer).GetField("m_specificIntroDoer", BindingFlags.Instance | BindingFlags.NonPublic);
                field.SetValue(genericIntroDoer, CachedEnemyActor.GetComponent <ExpandGungeoneerMimicIntroDoer>());
            }

            CachedEnemyActor.aiAnimator.enabled = false;
            CachedEnemyActor.spriteAnimator.Stop();
            CachedEnemyActor.spriteAnimator.DefaultClipId     = 0;
            CachedEnemyActor.spriteAnimator.playAutomatically = false;

            List <tk2dSpriteAnimationClip> m_AnimationClips = new List <tk2dSpriteAnimationClip>();

            foreach (tk2dSpriteAnimationClip clip in sourcePlayer.spriteAnimator.Library.clips)
            {
                if (!string.IsNullOrEmpty(clip.name))
                {
                    if (clip.name.ToLower() == "dodge")
                    {
                        m_AnimationClips.Add(clip);
                        if (clip.frames != null && clip.frames.Length > 0)
                        {
                            if (!sourcePlayer.UseArmorlessAnim)
                            {
                                CachedEnemyActor.sprite.SetSprite(clip.frames[0].spriteId);
                            }
                        }
                    }
                    else if (clip.name.ToLower() == "dodge_armorless")
                    {
                        m_AnimationClips.Add(clip);
                        if (clip.frames != null && clip.frames.Length > 0)
                        {
                            if (sourcePlayer.UseArmorlessAnim)
                            {
                                CachedEnemyActor.sprite.SetSprite(clip.frames[0].spriteId);
                            }
                        }
                    }
                    else if (clip.name.ToLower() == "run_down")
                    {
                        m_AnimationClips.Add(clip);
                    }
                    else if (clip.name.ToLower() == "run_down_armorless")
                    {
                        m_AnimationClips.Add(clip);
                    }
                    else if (clip.name.ToLower() == "death_shot")
                    {
                        m_AnimationClips.Add(clip);
                    }
                    else if (clip.name.ToLower() == "death_shot_armorless")
                    {
                        m_AnimationClips.Add(clip);
                    }
                }
            }

            if (m_AnimationClips.Count > 0)
            {
                if (!CachedEnemyActor.spriteAnimator.Library)
                {
                    CachedEnemyActor.spriteAnimator.Library = aiActorObject.AddComponent <tk2dSpriteAnimation>();
                }
                CachedEnemyActor.spriteAnimator.Library.clips = m_AnimationClips.ToArray();
            }

            CachedEnemyActor.healthHaver.RegenerateCache();

            BehaviorSpeculator customBehaviorSpeculator = aiActorObject.AddComponent <BehaviorSpeculator>();

            customBehaviorSpeculator.OverrideBehaviors               = new List <OverrideBehaviorBase>(0);
            customBehaviorSpeculator.TargetBehaviors                 = new List <TargetBehaviorBase>(0);
            customBehaviorSpeculator.MovementBehaviors               = new List <MovementBehaviorBase>(0);
            customBehaviorSpeculator.AttackBehaviors                 = new List <AttackBehaviorBase>(0);
            customBehaviorSpeculator.OtherBehaviors                  = new List <BehaviorBase>(0);
            customBehaviorSpeculator.InstantFirstTick                = false;
            customBehaviorSpeculator.TickInterval                    = 0.1f;
            customBehaviorSpeculator.PostAwakenDelay                 = 0.5f;
            customBehaviorSpeculator.RemoveDelayOnReinforce          = false;
            customBehaviorSpeculator.OverrideStartingFacingDirection = false;
            customBehaviorSpeculator.StartingFacingDirection         = -90f;
            customBehaviorSpeculator.SkipTimingDifferentiator        = false;
            customBehaviorSpeculator.RegenerateCache();

            // BehaviorSpeculator is a serialized object. You must build these lists (or create new empty lists) and save them before the game can instantiate it correctly!
            ISerializedObject m_TargetBehaviorSpeculatorSeralized = customBehaviorSpeculator;

            m_TargetBehaviorSpeculatorSeralized.SerializedObjectReferences = new List <Object>(0);
            m_TargetBehaviorSpeculatorSeralized.SerializedStateKeys        = new List <string>()
            {
                "OverrideBehaviors", "TargetBehaviors", "MovementBehaviors", "AttackBehaviors", "OtherBehaviors"
            };
            m_TargetBehaviorSpeculatorSeralized.SerializedStateValues = new List <string>()
            {
                "[]", "[]", "[]", "[]", "[]"
            };

            CachedEnemyActor.RegenerateCache();
            return;
        }
        private IEnumerator HandleTransitionToBellyFloor(PlayerController player)
        {
            player.ToggleRenderer(false, "got eaten");
            player.ToggleGunRenderers(false, "got eaten");
            player.ToggleHandRenderers(false, "got eaten");
            yield return(null);

            float      elapsed           = 0f;
            float      duration          = 0.5f;
            Vector3    startPos          = player.specRigidbody.GetUnitCenter(ColliderType.Ground);
            Vector3    finalOffset       = (transform.position + new Vector3(4, 6));
            GameObject dummySpriteObject = new GameObject("PlayerSpriteDupe", new Type[] { typeof(tk2dSprite) })
            {
                layer = 22
            };

            dummySpriteObject.transform.position = startPos;
            tk2dSprite targetSprite = dummySpriteObject.GetComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(targetSprite, (player.sprite as tk2dSprite));
            targetSprite.SetSprite(player.sprite.spriteId);
            yield return(null);

            AkSoundEngine.PostEvent("Stop_MUS_All", gameObject);
            while (elapsed < duration)
            {
                elapsed += BraveTime.DeltaTime;
                if (!targetSprite || !targetSprite.transform)
                {
                    break;
                }
                targetSprite.transform.localScale = Vector3.Lerp(Vector3.one, new Vector3(0.01f, 0.01f, 1f), elapsed / duration);
                targetSprite.transform.position   = Vector3.Lerp(startPos, finalOffset, elapsed / duration);
                yield return(null);
            }
            // AkSoundEngine.PostEvent("Play_CHR_muncher_eat_01", gameObject);
            // yield return new WaitForSeconds(0.15f);
            AkSoundEngine.PostEvent("Play_VO_lichA_cackle_01", gameObject);
            Vector2 BottomOffset = dummySpriteObject.transform.position;
            Vector2 TopOffset    = dummySpriteObject.transform.position + new Vector3(1, 1);
            Color   TargetColor  = new Color(0.5f, 0.1f, 0.1f);

            GlobalSparksDoer.DoRandomParticleBurst(25, BottomOffset, TopOffset, new Vector3(-1, 1), 70f, 0.5f, null, new float?(0.75f), new Color?(TargetColor), GlobalSparksDoer.SparksType.BLOODY_BLOOD);
            GlobalSparksDoer.DoRandomParticleBurst(25, BottomOffset, TopOffset, Vector3.left, 70f, 0.5f, null, new float?(1.5f), new Color?(TargetColor), GlobalSparksDoer.SparksType.BLOODY_BLOOD);
            GlobalSparksDoer.DoRandomParticleBurst(25, BottomOffset, TopOffset, Vector3.left, 70f, 0.5f, null, new float?(2.25f), new Color?(TargetColor), GlobalSparksDoer.SparksType.BLOODY_BLOOD);
            GlobalSparksDoer.DoRandomParticleBurst(25, BottomOffset, TopOffset, new Vector3(-1, -1), 70f, 0.5f, null, new float?(3), new Color?(TargetColor), GlobalSparksDoer.SparksType.BLOODY_BLOOD);
            yield return(new WaitForSeconds(1));

            Pixelator.Instance.FadeToBlack(0.15f, false, 0f);
            yield return(new WaitForSeconds(0.3f));

            AkSoundEngine.PostEvent("Play_CHR_muncher_chew_01", gameObject);
            yield return(new WaitForSeconds(4));;
            Destroy(dummySpriteObject);
            player.ToggleRenderer(true, "got eaten");
            player.ToggleGunRenderers(true, "got eaten");
            player.ToggleHandRenderers(true, "got eaten");
            player.ClearAllInputOverrides();
            GameManager.Instance.LoadCustomLevel("tt_belly");
            yield break;
        }
        private void DoInitialConfiguration(PlayerController player)
        {
            m_AIActor.sprite.SetSprite(player.sprite.Collection, player.sprite.GetCurrentSpriteDef().name);

            tk2dSprite m_HandSprite = m_AIActor.aiShooter.handObject.gameObject.AddComponent <tk2dSprite>();

            ExpandUtility.DuplicateSprite(m_HandSprite, player.primaryHand.gameObject.GetComponent <tk2dSprite>());
            m_AIActor.aiShooter.handObject.sprite.SetSprite(player.primaryHand.sprite.Collection, player.primaryHand.sprite.GetCurrentSpriteDef().name);

            // Generate BossCard based on current Player.
            Texture2D BossCardForeground = ExpandUtility.FlipTexture(Instantiate(player.BosscardSprites[0]));
            // Mirror thing will be used as static background. (will be the same for all possible boss cards)
            Texture2D BossCardBackground = ExpandAssets.LoadAsset <Texture2D>("MimicInMirror_BossCardBackground");
            // Combine foreground boss card generated from PlayerController onto the static background image loased in earlier. Resolutions must match!
            Texture2D BossCardTexture = ExpandUtility.CombineTextures(BossCardBackground, BossCardForeground);

            GenericIntroDoer miniBossIntroDoer = gameObject.GetComponent <GenericIntroDoer>();

            if (BossCardTexture)
            {
                miniBossIntroDoer.portraitSlideSettings.bossArtSprite = BossCardTexture;
            }

            if (player.characterIdentity == PlayableCharacters.Bullet)
            {
                m_AIActor.EnemySwitchState = "Metal_Bullet_Man";
            }
            else if (player.characterIdentity == PlayableCharacters.Convict)
            {
                m_AIActor.EnemySwitchState = "Convict";
            }
            else if (player.characterIdentity == PlayableCharacters.CoopCultist)
            {
                m_AIActor.EnemySwitchState = "Cultist";
            }
            else if (player.characterIdentity == PlayableCharacters.Cosmonaut)
            {
                m_AIActor.EnemySwitchState = "Cosmonaut";
            }
            else if (player.characterIdentity == PlayableCharacters.Guide)
            {
                m_AIActor.EnemySwitchState = "Guide";
            }
            else if (player.characterIdentity == PlayableCharacters.Gunslinger)
            {
                m_AIActor.EnemySwitchState = "Gunslinger";
            }
            else if (player.characterIdentity == PlayableCharacters.Ninja)
            {
                m_AIActor.EnemySwitchState = "Ninja";
            }
            else if (player.characterIdentity == PlayableCharacters.Pilot)
            {
                m_AIActor.EnemySwitchState = "Rogue";
            }
            else if (player.characterIdentity == PlayableCharacters.Robot)
            {
                m_AIActor.EnemySwitchState = "Robot";
            }
            else if (player.characterIdentity == PlayableCharacters.Soldier)
            {
                m_AIActor.EnemySwitchState = "Marine";
            }
            else if (player.characterIdentity == PlayableCharacters.Eevee)
            {
                m_AIActor.EnemySwitchState = "Convict";
                ExpandShaders.ApplyParadoxPlayerShader(m_AIActor.sprite);
            }
            else
            {
                m_AIActor.EnemySwitchState = "Gun Cultist";
            }
            List <tk2dSpriteAnimationClip> m_AnimationClips = new List <tk2dSpriteAnimationClip>();

            foreach (tk2dSpriteAnimationClip clip in player.spriteAnimator.Library.clips)
            {
                if (!string.IsNullOrEmpty(clip.name))
                {
                    if (clip.name.ToLower() == "dodge")
                    {
                        m_AnimationClips.Add(clip);
                        if (clip.frames != null && clip.frames.Length > 0)
                        {
                            if (!player.UseArmorlessAnim)
                            {
                                m_AIActor.sprite.SetSprite(clip.frames[0].spriteId);
                            }
                        }
                    }
                    else if (clip.name.ToLower() == "dodge_armorless")
                    {
                        m_AnimationClips.Add(clip);
                        if (clip.frames != null && clip.frames.Length > 0)
                        {
                            if (player.UseArmorlessAnim)
                            {
                                m_AIActor.sprite.SetSprite(clip.frames[0].spriteId);
                            }
                        }
                    }
                    else if (clip.name.ToLower() == "run_down")
                    {
                        m_AnimationClips.Add(clip);
                    }
                    else if (clip.name.ToLower() == "run_down_armorless")
                    {
                        m_AnimationClips.Add(clip);
                    }
                    else if (clip.name.ToLower() == "death_shot")
                    {
                        m_AnimationClips.Add(clip);
                    }
                    else if (clip.name.ToLower() == "death_shot_armorless")
                    {
                        m_AnimationClips.Add(clip);
                    }
                }
            }

            if (m_AnimationClips.Count > 0)
            {
                if (!m_AIActor.spriteAnimator.Library)
                {
                    m_AIActor.spriteAnimator.Library = m_AIActor.gameObject.AddComponent <tk2dSpriteAnimation>();
                }
                m_AIActor.spriteAnimator.Library.clips = m_AnimationClips.ToArray();
            }

            MirrorController mirror = ExpandPrefabs.CurrsedMirror.GetComponent <MirrorController>();

            MirrorBase    = Instantiate(ExpandPrefabs.DoppelgunnerMirror, gameObject.transform.position - new Vector3(0.25f, 1), Quaternion.identity);
            ShatterSystem = Instantiate(mirror.ShatterSystem, MirrorBase.transform.position, Quaternion.identity);
            ShatterSystem.SetActive(false);
            ShatterSystem.transform.parent = MirrorBase.transform;

            MirrorShatterFX = Instantiate(ExpandPrefabs.DoppelgunnerMirrorFX, (MirrorBase.transform.position - Vector3.one), Quaternion.identity);
            MirrorShatterFX.SetActive(false);
        }