public void OnEnteredRange(PlayerController interactor)
 {
     if (!this | m_InUse | m_IsRecievingPlayer | m_WaitingForPlayer | m_IsLocked | m_Disabled)
     {
         return;
     }
     SpriteOutlineManager.RemoveOutlineFromSprite(m_doorLightSprite, false);
     SpriteOutlineManager.AddOutlineToSprite(m_doorLightSprite, Color.white, 0.1f, 0f, SpriteOutlineManager.OutlineType.NORMAL);
     m_doorLightSprite.UpdateZDepth();
 }
        private void GiveItem(PlayerController player)
        {
            m_Interacted = true;
            PickupObject itemToGive = PickupObjectDatabase.GetById(ItemID);

            if (itemToGive)
            {
                LootEngine.GivePrefabToPlayer(PickupObjectDatabase.GetById(ItemID).gameObject, player);
                if (itemToGive is Gun)
                {
                    AkSoundEngine.PostEvent("Play_OBJ_weapon_pickup_01", gameObject);
                }
                else
                {
                    AkSoundEngine.PostEvent("Play_OBJ_item_pickup_01", gameObject);
                }
                GameObject VFXObject = Instantiate((GameObject)ResourceCache.Acquire("Global VFX/VFX_Item_Pickup"));
                if (VFXObject)
                {
                    tk2dSprite component = VFXObject.GetComponent <tk2dSprite>();
                    if (component)
                    {
                        component.PlaceAtPositionByAnchor(m_ItemSprite.WorldCenter, tk2dBaseSprite.Anchor.MiddleCenter);
                        component.HeightOffGround = 6f;
                        component.UpdateZDepth();
                    }
                }
                if (m_ParentRoom != null)
                {
                    m_ParentRoom.DeregisterInteractable(this);
                }
                Destroy(m_SubSpriteObject);
                Destroy(this);
            }
        }
Exemple #3
0
        public void createManualCrosshairForController(PlayerController playerOwner)
        {
            if (BraveInput.GetInstanceForPlayer(playerOwner.PlayerIDX).IsKeyboardAndMouse(false))
            {
                Debug.LogError("Clicker: Attempted to create a crosshair for a user playing on keyboard and mouse.");
                return;
            }
            GameObject newSprite = new GameObject("Controller_Crosshair", new Type[] { typeof(tk2dSprite) })
            {
                layer = 0
            };

            newSprite.transform.position = (playerOwner.transform.position + new Vector3(0.5f, 2));
            tk2dSprite m_ItemSprite = newSprite.AddComponent <tk2dSprite>();

            m_ItemSprite.SetSprite(clickerCollection, crosshairSpriteID);
            m_ItemSprite.PlaceAtPositionByAnchor(newSprite.transform.position, tk2dBaseSprite.Anchor.MiddleCenter);
            m_ItemSprite.transform.localPosition = m_ItemSprite.transform.localPosition.Quantize(0.0625f);

            if (m_ItemSprite)
            {
                playerOwner.sprite.AttachRenderer(m_ItemSprite);
                m_ItemSprite.depthUsesTrimmedBounds = true;
                m_ItemSprite.UpdateZDepth();
            }
            m_extantReticleQuad = m_ItemSprite;
        }
        protected override void OnTrigger(Vector2 damageDirection)
        {
            if (m_hasTriggered)
            {
                return;
            }
            m_hasTriggered = true;

            if (!gameObject.GetComponent <tk2dSprite>())
            {
                return;
            }

            GameObject TossedSpriteVFX = new GameObject(gameObject.name + "Sprite Toss VFX")
            {
                layer = LayerMask.NameToLayer("FG_Critical")
            };
            tk2dSprite newSprite = TossedSpriteVFX.AddComponent <tk2dSprite>();

            newSprite.Collection = sprite.Collection;
            newSprite.SetSprite(gameObject.GetComponent <tk2dSprite>().spriteId);
            newSprite.HeightOffGround = 4;

            TossedSpriteVFX.transform.position = transform.position;
            TossedSpriteVFX.transform.rotation = transform.rotation;
            newSprite.UpdateZDepth();
            TossedSpriteVFX.AddComponent <ExpandTossVFX>().Init();
            AkSoundEngine.PostEvent("Play_EX_PowBlock_EnemyDeath", TossedSpriteVFX);
            aiActor.procedurallyOutlined = false;
            sprite.renderer.enabled      = false;
            // Destroy(gameObject);
        }
Exemple #5
0
        private void AddHat()
        {
            if (extantSprites.Count > 0)
            {
                for (int i = extantSprites.Count - 1; i >= 0; i--)
                {
                    UnityEngine.Object.Destroy(extantSprites[i].gameObject);
                }
                extantSprites.Clear();
            }
            GameObject newSprite = new GameObject("Hat", new Type[] { typeof(tk2dSprite) })
            {
                layer = Owner.gameObject.layer + 1
            };

            newSprite.transform.position  = (Owner.sprite.WorldCenter + new Vector2(0, .1f));
            newSprite.transform.position += new Vector3(0, 0, 10f);
            tk2dSprite m_ItemSprite = newSprite.AddComponent <tk2dSprite>();

            extantSprites.Add(newSprite);

            m_ItemSprite.SetSprite(HatVFXCollection, Hat1ID);
            m_ItemSprite.PlaceAtPositionByAnchor(newSprite.transform.position, tk2dBaseSprite.Anchor.LowerCenter);
            m_ItemSprite.transform.localPosition = m_ItemSprite.transform.localPosition.Quantize(0.0625f);
            newSprite.transform.parent           = Owner.transform;
            if (m_ItemSprite)
            {
                Owner.sprite.AttachRenderer(m_ItemSprite);
                m_ItemSprite.depthUsesTrimmedBounds = true;
                m_ItemSprite.IsPerpendicular        = true;
                m_ItemSprite.UpdateZDepth();
                m_ItemSprite.HeightOffGround = 0.1f;
            }
            Owner.sprite.UpdateZDepth();
        }
Exemple #6
0
        private void CreateOrbital(PlayerController player)
        {
            psiGun = SpriteBuilder.SpriteFromResource("Items/Resources/psi_gun_idle_001.png");
            ItemAPI.FakePrefab.MarkAsFakePrefab(psiGun);
            DontDestroyOnLoad(psiGun);
            tk2dSprite sprite = psiGun.GetComponent <tk2dSprite>();

            sprite.HeightOffGround = .1f;
            sprite.UpdateZDepth();
            sprite.PlaceAtPositionByAnchor(player.CenterPosition, tk2dBaseSprite.Anchor.MiddleCenter);
            SpecialOrbital specialOrbital = psiGun.AddComponent <SpecialOrbital>();

            specialOrbital.owner                         = player;
            specialOrbital.shouldRotate                  = true;
            specialOrbital.orbitingMode                  = cachedOrbitingMode;
            specialOrbital.perfectOrbitFactor            = 10;
            specialOrbital.canShoot                      = true;
            specialOrbital.doesBurstshot                 = false;
            specialOrbital.burstAmount                   = 3;
            specialOrbital.timeBetweenBurstShots         = .08f;
            specialOrbital.canShootEnemyOrbiter          = true;
            specialOrbital.doesReload                    = false;
            specialOrbital.reloadTime                    = 1.2f;
            specialOrbital.doesPostProcess               = true;
            specialOrbital.fireCooldown                  = .6f;
            specialOrbital.damageAffectedByPlayerStats   = true;
            specialOrbital.cooldownAffectedByPlayerStats = true;
            Projectile proj = Instantiate <Projectile>(psiGunProj);

            specialOrbital.projectile = proj;
            //Fix orbital shooting
        }
        protected override void OnTrigger(Vector2 damageDirection)
        {
            if (m_hasTriggered)
            {
                return;
            }
            m_hasTriggered = true;

            if (!gameObject.GetComponent <tk2dSprite>())
            {
                return;
            }
            if (aiActor)
            {
                aiActor.SetOutlines(false);
            }
            GameObject TossedSpriteVFX = new GameObject(gameObject.name + "Sprite Toss VFX")
            {
                layer = LayerMask.NameToLayer("Unoccluded")
            };
            tk2dSprite newSprite = TossedSpriteVFX.AddComponent <tk2dSprite>();

            if (!string.IsNullOrEmpty(specificSpriteName))
            {
                newSprite.SetSprite(sprite.Collection, specificSpriteName);
            }
            else
            {
                newSprite.SetSprite(sprite.Collection, gameObject.GetComponent <tk2dSprite>().spriteId);
            }
            newSprite.HeightOffGround = 4;
            TossedSpriteVFX.SetLayerRecursively(LayerMask.NameToLayer("Unoccluded"));
            TossedSpriteVFX.transform.position   = transform.position;
            TossedSpriteVFX.transform.localScale = transform.localScale;

            if (applyRotation)
            {
                TossedSpriteVFX.transform.rotation = transform.rotation;
            }
            newSprite.UpdateZDepth();

            ExpandTossVFX tossVFX = TossedSpriteVFX.AddComponent <ExpandTossVFX>();

            tossVFX.DoRotation     = applyRotation;
            tossVFX.MovementSpeed1 = PopupSpeed;
            tossVFX.MovementSpeed2 = DropSpeed;
            tossVFX.Init();

            if (isPowBlockDeath)
            {
                AkSoundEngine.PostEvent("Play_EX_PowBlock_EnemyDeath", TossedSpriteVFX);
            }
            sprite.renderer.enabled = false;
        }
Exemple #8
0
        private IEnumerator DepthLerp(DungeonDoorController self, tk2dSprite targetSprite, float targetDepth, float duration, DungeonDoorController.DoorModule m = null, bool isSpecialHorizontalTopCase = false)
        {
            bool m_open = ReflectionHelpers.ReflectGetField <bool>(typeof(DungeonDoorController), "m_open", self);

            if (m != null)
            {
                if (!m_open)
                {
                    targetSprite.IsPerpendicular = true;
                }
                m.isLerping = true;
            }
            float elapsed       = 0f;
            float startingDepth = targetSprite.HeightOffGround;

            while (elapsed < duration)
            {
                elapsed += BraveTime.DeltaTime;
                float t = elapsed / duration;
                targetSprite.HeightOffGround = Mathf.Lerp(startingDepth, targetDepth, t);
                if (ReflectionHelpers.ReflectGetField <bool>(typeof(DungeonDoorController), "m_open", self) && isSpecialHorizontalTopCase)
                {
                    targetSprite.depthUsesTrimmedBounds = false;
                    targetSprite.HeightOffGround        = -5.25f;
                }
                targetSprite.UpdateZDepth();
                yield return(null);
            }
            targetSprite.HeightOffGround = (targetSprite.depthUsesTrimmedBounds ? targetDepth : -5.25f);
            targetSprite.UpdateZDepth();
            if (m != null)
            {
                if (ReflectionHelpers.ReflectGetField <bool>(typeof(DungeonDoorController), "m_open", self))
                {
                    targetSprite.IsPerpendicular = m.openPerpendicular;
                }
                m.isLerping = false;
            }
            yield break;
        }
Exemple #9
0
        private void SpawnNewShadow()
        {
            if (this.m_inactiveShadows.Count == 0)
            {
                this.CreateInactiveShadow();
            }
            LinkedListNode <ImprovedAfterImage.Shadow> first = this.m_inactiveShadows.First;
            tk2dSprite sprite = first.Value.sprite;

            this.m_inactiveShadows.RemoveFirst();
            if (!sprite || !sprite.renderer)
            {
                return;
            }
            first.Value.timer = this.shadowLifetime;
            sprite.SetSprite(base.sprite.Collection, base.sprite.spriteId);
            sprite.transform.position = base.sprite.transform.position;
            sprite.transform.rotation = base.sprite.transform.rotation;
            sprite.scale = base.sprite.scale;
            sprite.usesOverrideMaterial = true;
            sprite.IsPerpendicular      = true;
            if (sprite.renderer && IsRandomShader)
            {
                sprite.renderer.enabled         = true;
                sprite.renderer.material.shader = shaders[(int)UnityEngine.Random.Range(0, shaders.Count)];

                if (sprite.renderer.material.shader == shaders[3])
                {
                    sprite.renderer.sharedMaterial.SetFloat("_EmissivePower", this.minEmission);
                    sprite.renderer.sharedMaterial.SetFloat("_Opacity", 1f);
                    sprite.renderer.sharedMaterial.SetColor("_DashColor", Color.HSVToRGB(UnityEngine.Random.value, 1.0f, 1.0f));
                }
                if (sprite.renderer.material.shader == shaders[0])
                {
                    sprite.renderer.sharedMaterial.SetFloat("_AllColorsToggle", 1f);
                }
            }

            else if (sprite.renderer)
            {
                sprite.renderer.enabled         = true;
                sprite.renderer.material.shader = (this.OverrideImageShader ?? ShaderCache.Acquire("Brave/Internal/HighPriestAfterImage"));
                sprite.renderer.sharedMaterial.SetFloat("_EmissivePower", this.minEmission);
                sprite.renderer.sharedMaterial.SetFloat("_Opacity", 1f);
                sprite.renderer.sharedMaterial.SetColor("_DashColor", this.dashColor);
                sprite.renderer.sharedMaterial.SetFloat("_AllColorsToggle", 1f);
            }

            sprite.HeightOffGround = this.targetHeight;
            sprite.UpdateZDepth();
            this.m_activeShadows.AddLast(first);
        }
        private void TestOrbital(PlayerController player)
        {
            GameObject newOBJ = SpriteBuilder.SpriteFromResource("Items/Resources/hat_i_stole.png");

            ItemAPI.FakePrefab.MarkAsFakePrefab(newOBJ);
            tk2dSprite sprite = newOBJ.GetComponent <tk2dSprite>();

            sprite.HeightOffGround = .1f;
            sprite.UpdateZDepth();
            sprite.PlaceAtPositionByAnchor(player.CenterPosition, tk2dBaseSprite.Anchor.MiddleCenter);
            SpecialOrbital specialOrbital = newOBJ.AddComponent <SpecialOrbital>();

            specialOrbital.owner        = player;
            specialOrbital.orbitingMode = SpecialOrbital.OrbitingMode.ENEMY;
        }
        private PickupObject OpenS(PlayerController user)
        {
            PickupObject.ItemQuality itemQuality          = PickupObject.ItemQuality.S;
            PickupObject             itemOfTypeAndQuality = (UnityEngine.Random.value >= 0.5f) ? LootEngine.GetItemOfTypeAndQuality <PickupObject>(itemQuality, GameManager.Instance.RewardManager.GunsLootTable, false) : LootEngine.GetItemOfTypeAndQuality <PickupObject>(itemQuality, GameManager.Instance.RewardManager.ItemsLootTable, false);
            DebrisObject             debrisObject         = LootEngine.SpawnItem(itemOfTypeAndQuality.gameObject, user.CenterPosition, Vector2.up, 1f, true, true, false);

            if (debrisObject)
            {
                Vector2    v          = (!debrisObject.sprite) ? (debrisObject.transform.position.XY() + new Vector2(0.5f, 0.5f)) : debrisObject.sprite.WorldCenter;
                GameObject gameObject = SpawnManager.SpawnVFX((GameObject)BraveResources.Load("Global VFX/VFX_BlackPhantomDeath", ".prefab"), v, Quaternion.identity, false);
                if (gameObject && gameObject.GetComponent <tk2dSprite>())
                {
                    tk2dSprite component = gameObject.GetComponent <tk2dSprite>();
                    component.HeightOffGround = 5f;
                    component.UpdateZDepth();
                }
                return(debrisObject.GetComponentInChildren <PickupObject>());
            }
            return(null);
        }
        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();
        }
Exemple #13
0
 private void GiveItem(PlayerController player)
 {
     m_Interacted = true;
     if (minimapIconInstance != null)
     {
         Minimap.Instance.DeregisterRoomIcon(m_ParentRoom, minimapIconInstance);
     }
     if (contents)
     {
         LootEngine.GivePrefabToPlayer(contents.gameObject, player);
         if (contents is Gun)
         {
             AkSoundEngine.PostEvent("Play_OBJ_weapon_pickup_01", gameObject);
         }
         else
         {
             AkSoundEngine.PostEvent("Play_OBJ_item_pickup_01", gameObject);
         }
         GameObject VFXObject = Instantiate((GameObject)ResourceCache.Acquire("Global VFX/VFX_Item_Pickup"));
         if (VFXObject)
         {
             tk2dSprite component = VFXObject.GetComponent <tk2dSprite>();
             if (component)
             {
                 component.PlaceAtPositionByAnchor(m_itemDisplaySprite.WorldCenter, tk2dBaseSprite.Anchor.MiddleCenter);
                 component.HeightOffGround = 6f;
                 component.UpdateZDepth();
             }
         }
     }
     if (m_ParentRoom != null)
     {
         m_ParentRoom.DeregisterInteractable(this);
     }
     Destroy(m_itemDisplaySprite);
     Destroy(spawnTransform.gameObject);
     Destroy(this);
 }
Exemple #14
0
        public void ShowSprite(tk2dSpriteCollectionData encounterIconCollection, int spriteID)
        {
            if (!encounterIconCollection)
            {
                return;
            }
            if (base.gameActor)
            {
                if (extantSprite)
                {
                    Destroy(extantSprite);
                }
                extantSprite = new GameObject("Item Hologram", new Type[] { typeof(tk2dSprite) })
                {
                    layer = 0
                };
                extantSprite.transform.position = (transform.position + new Vector3(0.5f, 2));
                m_ItemSprite = extantSprite.AddComponent <tk2dSprite>();
                // CloningAndDuplication.DuplicateSprite(m_ItemSprite, sprite as tk2dSprite);
                m_ItemSprite.SetSprite(encounterIconCollection, spriteID);
                m_ItemSprite.PlaceAtPositionByAnchor(extantSprite.transform.position, tk2dBaseSprite.Anchor.LowerCenter);
                m_ItemSprite.transform.localPosition = m_ItemSprite.transform.localPosition.Quantize(0.0625f);
                if (base.gameActor != null)
                {
                    extantSprite.transform.parent = base.gameActor.transform;
                }

                if (m_ItemSprite)
                {
                    sprite.AttachRenderer(m_ItemSprite);
                    m_ItemSprite.depthUsesTrimmedBounds = true;
                    m_ItemSprite.UpdateZDepth();
                }
                sprite.UpdateZDepth();

                ApplyHologramShader(m_ItemSprite, hologramIsGreen);
            }
        }
        public static void BuildPrefab(AssetBundle expandSharedAssets1)
        {
            ExpandPrefabs.EXBootlegRoomObject       = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomPrefab");
            ExpandPrefabs.EXBootlegRoomDoorTriggers = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomDoorTriggers");
            GameObject m_BorderObject_West     = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomBorder_West");
            GameObject m_BorderObject_East     = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomBorder_East");
            GameObject m_BorderObject_North    = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomBorder_North");
            GameObject m_BorderObject_South    = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomBorder_South");
            GameObject m_DoorFrameObject       = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomDoorFramesTop");
            GameObject m_DoorObject            = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomDoorFrames");
            GameObject m_DoorBlockObject_West  = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomDoorBlocker_West");
            GameObject m_DoorBlockObject_East  = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomDoorBlocker_East");
            GameObject m_DoorBlockObject_South = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomDoorBlocker_South");
            GameObject m_DoorBlockObject_North = expandSharedAssets1.LoadAsset <GameObject>("BootlegRoomDoorBlocker_North");

            m_BorderObject_West.transform.SetParent(ExpandPrefabs.EXBootlegRoomObject.transform);
            m_BorderObject_East.transform.SetParent(ExpandPrefabs.EXBootlegRoomObject.transform);
            m_BorderObject_North.transform.SetParent(ExpandPrefabs.EXBootlegRoomObject.transform);
            m_BorderObject_South.transform.SetParent(ExpandPrefabs.EXBootlegRoomObject.transform);
            m_DoorFrameObject.transform.SetParent(ExpandPrefabs.EXBootlegRoomObject.transform);
            m_BorderObject_West.transform.localPosition  -= new Vector3(3, 3);
            m_BorderObject_East.transform.localPosition  -= new Vector3(3, 3);
            m_BorderObject_North.transform.localPosition -= new Vector3(3, 3);
            m_BorderObject_South.transform.localPosition -= new Vector3(3, 3);

            m_DoorObject.transform.SetParent(ExpandPrefabs.EXBootlegRoomDoorTriggers.transform);
            m_DoorBlockObject_West.transform.SetParent(ExpandPrefabs.EXBootlegRoomDoorTriggers.transform);
            m_DoorBlockObject_East.transform.SetParent(ExpandPrefabs.EXBootlegRoomDoorTriggers.transform);
            m_DoorBlockObject_South.transform.SetParent(ExpandPrefabs.EXBootlegRoomDoorTriggers.transform);
            m_DoorBlockObject_North.transform.SetParent(ExpandPrefabs.EXBootlegRoomDoorTriggers.transform);

            // ExpandPrefabs.EXBootlegRoomObject.SetActive(false);
            // ExpandPrefabs.EXBootlegRoomDoorTriggers.SetActive(false);

            ItemBuilder.AddSpriteToObject(ExpandPrefabs.EXBootlegRoomObject, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_BottomLayer"), false, false);
            ItemBuilder.AddSpriteToObject(m_BorderObject_West, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_ExitTiles_West.png"), false, false);
            ItemBuilder.AddSpriteToObject(m_BorderObject_East, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_ExitTiles_East.png"), false, false);
            ItemBuilder.AddSpriteToObject(m_BorderObject_North, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_ExitTiles_North.png"), false, false);
            ItemBuilder.AddSpriteToObject(m_BorderObject_South, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_ExitTiles_South.png"), false, false);
            ItemBuilder.AddSpriteToObject(m_DoorFrameObject, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_TopLayer"), false, false);
            ItemBuilder.AddSpriteToObject(m_DoorObject, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_Doors"), false, false);
            ItemBuilder.AddSpriteToObject(m_DoorBlockObject_West, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_DoorBlock_West"), false, false);
            ItemBuilder.AddSpriteToObject(m_DoorBlockObject_East, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_DoorBlock_East"), false, false);
            ItemBuilder.AddSpriteToObject(m_DoorBlockObject_South, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_DoorBlock_South"), false, false);
            ItemBuilder.AddSpriteToObject(m_DoorBlockObject_North, expandSharedAssets1.LoadAsset <Texture2D>("BootlegRoom_DoorBlock_North"), false, false);



            tk2dSprite m_BootlegRoomSprite = ExpandPrefabs.EXBootlegRoomObject.GetComponent <tk2dSprite>();

            m_BootlegRoomSprite.HeightOffGround = -3f;
            m_BootlegRoomSprite.UpdateZDepth();

            tk2dSprite m_BorderSprite_West = m_BorderObject_West.GetComponent <tk2dSprite>();

            m_BorderSprite_West.HeightOffGround = -3f;
            m_BorderSprite_West.UpdateZDepth();

            tk2dSprite m_BorderSprite_East = m_BorderObject_East.GetComponent <tk2dSprite>();

            m_BorderSprite_East.HeightOffGround = -3f;
            m_BorderSprite_East.UpdateZDepth();

            tk2dSprite m_BorderSprite_North = m_BorderObject_North.GetComponent <tk2dSprite>();

            m_BorderSprite_North.HeightOffGround = -3f;
            m_BorderSprite_North.UpdateZDepth();

            tk2dSprite m_BorderSprite_South = m_BorderObject_South.GetComponent <tk2dSprite>();

            m_BorderSprite_South.HeightOffGround = -3f;
            m_BorderSprite_South.UpdateZDepth();

            tk2dSprite m_DoorSprites = m_DoorObject.GetComponent <tk2dSprite>();

            m_DoorSprites.HeightOffGround = -2.5f;
            m_DoorSprites.UpdateZDepth();

            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, dimensions: new IntVector2(1, 6));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, dimensions: new IntVector2(1, 6), offset: new IntVector2(0, 8));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, dimensions: new IntVector2(1, 6), offset: new IntVector2(19, 0));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, dimensions: new IntVector2(1, 6), offset: new IntVector2(19, 8));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, dimensions: new IntVector2(8, 1), offset: new IntVector2(1, 0));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, dimensions: new IntVector2(8, 1), offset: new IntVector2(11, 0));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, dimensions: new IntVector2(8, 1), offset: new IntVector2(1, 13));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.HighObstacle, PixelCollider.PixelColliderGeneration.Manual, dimensions: new IntVector2(8, 1), offset: new IntVector2(11, 13));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(8, 80), offset: new IntVector2(16, 16));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(8, 80), offset: new IntVector2(16, 128));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(8, 80), offset: new IntVector2(296, 16));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(8, 80), offset: new IntVector2(296, 128));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(120, 8), offset: new IntVector2(24, 16));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(120, 8), offset: new IntVector2(176, 16));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(120, 8), offset: new IntVector2(24, 200));
            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.LowObstacle, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(120, 8), offset: new IntVector2(176, 200));

            /*ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.EnemyBlocker, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(8, 80), offset: new IntVector2(16, 16));
             * ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.EnemyBlocker, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(8, 80), offset: new IntVector2(16, 128));
             * ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.EnemyBlocker, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(8, 80), offset: new IntVector2(296, 16));
             * ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.EnemyBlocker, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(8, 80), offset: new IntVector2(296, 128));
             * ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.EnemyBlocker, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(120, 8), offset: new IntVector2(24, 16));
             * ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.EnemyBlocker, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(120, 8), offset: new IntVector2(176, 16));
             * ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.EnemyBlocker, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(120, 8), offset: new IntVector2(24, 200));
             * ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomObject, CollisionLayer.EnemyBlocker, PixelCollider.PixelColliderGeneration.Manual, UsesPixelsAsUnitSize: true, dimensions: new IntVector2(120, 8), offset: new IntVector2(176, 200));*/

            ExpandUtility.GenerateOrAddToRigidBody(ExpandPrefabs.EXBootlegRoomDoorTriggers, CollisionLayer.Trap, PixelCollider.PixelColliderGeneration.Manual, IsTrigger: true, dimensions: new IntVector2(16, 10), offset: new IntVector2(2, 2));

            ExpandBootlegRoomPlaceable m_BootlegRoomPlacable = ExpandPrefabs.EXBootlegRoomObject.AddComponent <ExpandBootlegRoomPlaceable>();

            m_BootlegRoomPlacable.ExitTiles_West  = m_BorderObject_West;
            m_BootlegRoomPlacable.ExitTiles_East  = m_BorderObject_East;
            m_BootlegRoomPlacable.ExitTiles_North = m_BorderObject_North;
            m_BootlegRoomPlacable.ExitTiles_South = m_BorderObject_South;
            m_BootlegRoomPlacable.DoorFrames      = m_DoorFrameObject;

            ExpandBootlegRoomDoorsPlacables m_BootlegDoorBlockersPlacable = ExpandPrefabs.EXBootlegRoomDoorTriggers.AddComponent <ExpandBootlegRoomDoorsPlacables>();

            m_BootlegDoorBlockersPlacable.Doors             = m_DoorObject;
            m_BootlegDoorBlockersPlacable.DoorBlocker_West  = m_DoorBlockObject_West;
            m_BootlegDoorBlockersPlacable.DoorBlocker_East  = m_DoorBlockObject_East;
            m_BootlegDoorBlockersPlacable.DoorBlocker_South = m_DoorBlockObject_South;
            m_BootlegDoorBlockersPlacable.DoorBlocker_North = m_DoorBlockObject_North;



            /*FakePrefab.MarkAsFakePrefab(ExpandPrefabs.EXBootlegRoomObject);
             * FakePrefab.MarkAsFakePrefab(ExpandPrefabs.EXBootlegRoomDoorTriggers);
             * DontDestroyOnLoad(ExpandPrefabs.EXBootlegRoomObject);
             * DontDestroyOnLoad(ExpandPrefabs.EXBootlegRoomDoorTriggers);*/
        }
        private IEnumerator ShowChargeLevel(GameActor gunOwner, int chargeLevel)
        {
            if (extantSprites.Count > 0)
            {
                for (int i = extantSprites.Count - 1; i >= 0; i--)
                {
                    UnityEngine.Object.Destroy(extantSprites[i].gameObject);
                }
                extantSprites.Clear();
            }
            GameObject newSprite = new GameObject("Level Popup", new Type[] { typeof(tk2dSprite) })
            {
                layer = 0
            };

            newSprite.transform.position = (gunOwner.transform.position + new Vector3(0.5f, 2));
            tk2dSprite m_ItemSprite = newSprite.AddComponent <tk2dSprite>();

            extantSprites.Add(newSprite);
            int spriteID = -1;

            switch (chargeLevel)
            {
            case 1:
                spriteID = Meter1ID;
                break;

            case 2:
                spriteID = Meter2ID;
                break;

            case 3:
                spriteID = Meter3ID;
                break;

            case 4:
                spriteID = Meter4ID;
                break;

            case 5:
                spriteID = Meter5ID;
                break;
            }
            m_ItemSprite.SetSprite(PumpChargeShotgun.GunVFXCollection, spriteID);
            m_ItemSprite.PlaceAtPositionByAnchor(newSprite.transform.position, tk2dBaseSprite.Anchor.LowerCenter);
            m_ItemSprite.transform.localPosition = m_ItemSprite.transform.localPosition.Quantize(0.0625f);
            newSprite.transform.parent           = gunOwner.transform;
            if (m_ItemSprite)
            {
                sprite.AttachRenderer(m_ItemSprite);
                m_ItemSprite.depthUsesTrimmedBounds = true;
                m_ItemSprite.UpdateZDepth();
            }
            sprite.UpdateZDepth();
            yield return(new WaitForSeconds(2));

            if (newSprite)
            {
                extantSprites.Remove(newSprite);
                Destroy(newSprite.gameObject);
            }
            yield break;
        }
        public void PlaceCorruptTiles(Dungeon dungeon, RoomHandler roomHandler = null, GameObject parentObject = null, bool corruptWallsOnly = false, bool isLeadKeyRoom = false)
        {
            bool m_CorruptedSecretRoomsPresent = false;

            if (roomHandler == null)
            {
                foreach (RoomHandler room in dungeon.data.rooms)
                {
                    if (room.GetRoomName() != null)
                    {
                        if (room.GetRoomName().ToLower().StartsWith("expand apache corrupted secret"))
                        {
                            m_CorruptedSecretRoomsPresent = true;
                            break;
                        }
                    }
                }
            }

            if (roomHandler == null && dungeon.IsGlitchDungeon)
            {
                if (StaticReferenceManager.AllNpcs != null && StaticReferenceManager.AllNpcs.Count > 0)
                {
                    foreach (TalkDoerLite npc in StaticReferenceManager.AllNpcs)
                    {
                        npc.SpeaksGleepGlorpenese = true;
                    }
                }
            }
            else if (roomHandler != null && StaticReferenceManager.AllNpcs != null && StaticReferenceManager.AllNpcs.Count > 0)
            {
                foreach (TalkDoerLite npc in StaticReferenceManager.AllNpcs)
                {
                    if (npc.GetAbsoluteParentRoom() == roomHandler)
                    {
                        npc.SpeaksGleepGlorpenese = true;
                        if (npc.GetAbsoluteParentRoom() != null && !string.IsNullOrEmpty(npc.GetAbsoluteParentRoom().GetRoomName()))
                        {
                            if (npc.GetAbsoluteParentRoom().GetRoomName().ToLower().StartsWith("expand apache corrupted secret"))
                            {
                                ExpandShaders.Instance.ApplyGlitchShader(npc.GetComponent <tk2dBaseSprite>());
                            }
                        }
                    }
                }
            }

            if (!dungeon.IsGlitchDungeon && roomHandler == null && !m_CorruptedSecretRoomsPresent)
            {
                return;
            }

            if (dungeon.IsGlitchDungeon | roomHandler != null)
            {
                m_CorruptedSecretRoomsPresent = false;
            }

            tk2dSpriteCollectionData dungeonCollection = dungeon.tileIndices.dungeonCollection;

            // Used for debug read out information
            int CorruptWallTilesPlaced     = 0;
            int CorruptOpenAreaTilesPlaced = 0;
            int iterations = 0;

            GameObject GlitchedTileObject = new GameObject("GlitchTile_" + UnityEngine.Random.Range(1000000, 9999999))
            {
                layer = 22
            };

            if (parentObject != null)
            {
                GlitchedTileObject.transform.parent = parentObject.transform;
            }
            GlitchedTileObject.AddComponent <tk2dSprite>();
            tk2dSprite glitchSprite = GlitchedTileObject.GetComponent <tk2dSprite>();

            glitchSprite.Collection = dungeonCollection;
            glitchSprite.SetSprite(glitchSprite.Collection, 22);
            glitchSprite.ignoresTiltworldDepth      = false;
            glitchSprite.depthUsesTrimmedBounds     = false;
            glitchSprite.allowDefaultLayer          = false;
            glitchSprite.OverrideMaterialMode       = tk2dBaseSprite.SpriteMaterialOverrideMode.NONE;
            glitchSprite.independentOrientation     = false;
            glitchSprite.hasOffScreenCachedUpdate   = false;
            glitchSprite.CachedPerpState            = tk2dBaseSprite.PerpendicularState.PERPENDICULAR;
            glitchSprite.SortingOrder               = 2;
            glitchSprite.IsBraveOutlineSprite       = false;
            glitchSprite.IsZDepthDirty              = false;
            glitchSprite.ApplyEmissivePropertyBlock = false;
            glitchSprite.GenerateUV2       = false;
            glitchSprite.LockUV2OnFrameOne = false;
            glitchSprite.StaticPositions   = false;

            List <int> CurrentFloorWallIDs  = new List <int>();
            List <int> CurrentFloorFloorIDs = new List <int>();
            List <int> CurrentFloorMiscIDs  = new List <int>();

            // Select Sprite ID lists based on tileset. (IDs corrispond to different sprites depending on tileset dungeonCollection)
            if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.CASTLEGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.CastleWallIDs;
                CurrentFloorFloorIDs = ExpandLists.CastleFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.CastleMiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.GUNGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.GungeonWallIDs;
                CurrentFloorFloorIDs = ExpandLists.GungeonFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.GungeonMiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.MINEGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.MinesWallIDs;
                CurrentFloorFloorIDs = ExpandLists.MinesFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.MinesMiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.CATACOMBGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.HollowsWallIDs;
                CurrentFloorFloorIDs = ExpandLists.HollowsFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.HollowsMiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.FORGEGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.ForgeWallIDs;
                CurrentFloorFloorIDs = ExpandLists.ForgeFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.ForgeMiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.HELLGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.BulletHell_WallIDs;
                CurrentFloorFloorIDs = ExpandLists.BulletHell_FloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.BulletHell_MiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.SEWERGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.SewerWallIDs;
                CurrentFloorFloorIDs = ExpandLists.SewerFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.SewerMiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.CATHEDRALGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.AbbeyWallIDs;
                CurrentFloorFloorIDs = ExpandLists.AbbeyFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.AbbeyMiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.RATGEON | dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.JUNGLEGEON)
            {
                CurrentFloorWallIDs  = ExpandLists.RatDenWallIDs;
                CurrentFloorFloorIDs = ExpandLists.RatDenFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.RatDenMiscIDs;
            }
            else if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.OFFICEGEON)
            {
                foreach (int id in ExpandLists.Nakatomi_OfficeWallIDs)
                {
                    CurrentFloorWallIDs.Add(id);
                }
                foreach (int id in ExpandLists.Nakatomi_OfficeFloorIDs)
                {
                    CurrentFloorFloorIDs.Add(id);
                }
                foreach (int id in ExpandLists.Nakatomi_OfficeMiscIDs)
                {
                    CurrentFloorMiscIDs.Add(id);
                }
                // This floor stores both Office and Future tilesets it uses into the same sprite collection atlas.
                // Each section has a specific size and and the ID of the last tileset will be subtracted from entries from the next.
                // Office tileset IDs end at id 703
                // Future tileset IDs start at id 704
                // Future tileset IDs have 704 added to them to get the correct ID in the main sprite collection.
                foreach (int id in ExpandLists.Nakatomi_FutureWallIDs)
                {
                    CurrentFloorWallIDs.Add(id + 704);
                }
                foreach (int id in ExpandLists.Nakatomi_FutureFloorIDs)
                {
                    CurrentFloorFloorIDs.Add(id + 704);
                }
                foreach (int id in ExpandLists.Nakatomi_FutureMiscIDs)
                {
                    CurrentFloorMiscIDs.Add(id + 704);
                }
            }
            else
            {
                // Unkown Tilesets will use Gungeon as placeholder
                Dungeon tempDungeonPrefab = DungeonDatabase.GetOrLoadByName("Base_Gungeon");
                dungeonCollection    = tempDungeonPrefab.tileIndices.dungeonCollection;
                CurrentFloorWallIDs  = ExpandLists.GungeonWallIDs;
                CurrentFloorFloorIDs = ExpandLists.GungeonFloorIDs;
                CurrentFloorMiscIDs  = ExpandLists.GungeonMiscIDs;
                tempDungeonPrefab    = null;
            }

            List <int> roomList = Enumerable.Range(0, dungeon.data.rooms.Count).ToList();

            roomList = roomList.Shuffle();

            if (roomHandler != null)
            {
                roomList = new List <int>()
                {
                    0
                };
            }

            List <IntVector2> cachedWallTiles = new List <IntVector2>();
            List <IntVector2> validWalls      = new List <IntVector2>();
            List <IntVector2> validOpenAreas  = new List <IntVector2>();

            RoomHandler RoomBeingWorkedOn = null;

            while (iterations < roomList.Count)
            {
                try {
                    RoomHandler currentRoom = null;

                    if (roomHandler == null)
                    {
                        currentRoom = dungeon.data.rooms[roomList[iterations]];
                    }
                    else
                    {
                        currentRoom = roomHandler;
                    }

                    if (currentRoom == null)
                    {
                        break;
                    }

                    RoomBeingWorkedOn = currentRoom;

                    if (string.IsNullOrEmpty(currentRoom.GetRoomName()))
                    {
                        currentRoom.area.PrototypeRoomName = ("ProceduralRoom_" + UnityEngine.Random.Range(100000, 999999));
                    }

                    if (!m_CorruptedSecretRoomsPresent || (currentRoom.GetRoomName().ToLower().StartsWith("expand apache corrupted secret") | dungeon.IsGlitchDungeon | roomHandler != null))
                    {
                        bool isCorruptedSecretRoom = false;

                        if (currentRoom.GetRoomName().ToLower().StartsWith("expand apache corrupted secret") && !isLeadKeyRoom)
                        {
                            GameObject m_CorruptionMarkerObject = new GameObject("CorruptionAmbienceMarkerObject")
                            {
                                layer = 0
                            };
                            m_CorruptionMarkerObject.transform.position = currentRoom.area.Center;
                            m_CorruptionMarkerObject.transform.parent   = currentRoom.hierarchyParent;
                            ExpandStaticReferenceManager.AllCorruptionSoundObjects.Add(m_CorruptionMarkerObject);
                            isCorruptedSecretRoom = true;
                        }

                        if (m_CorruptedSecretRoomsPresent | isLeadKeyRoom)
                        {
                            foreach (TalkDoerLite npc in StaticReferenceManager.AllNpcs)
                            {
                                if (npc.GetAbsoluteParentRoom() != null && npc.GetAbsoluteParentRoom() == currentRoom)
                                {
                                    npc.SpeaksGleepGlorpenese = true;
                                    ExpandShaders.Instance.ApplyGlitchShader(npc.GetComponent <tk2dBaseSprite>());
                                }
                            }
                        }

                        validWalls.Clear();
                        validOpenAreas.Clear();

                        for (int Width = -1; Width <= currentRoom.area.dimensions.x + 3; Width++)
                        {
                            for (int Height = -1; Height <= currentRoom.area.dimensions.y + 3; Height++)
                            {
                                int X = currentRoom.area.basePosition.x + Width;
                                int Y = currentRoom.area.basePosition.y + Height;
                                if (!cachedWallTiles.Contains(new IntVector2(X, Y)) && (
                                        dungeon.data.isWall(X, Y) | dungeon.data.isAnyFaceWall(X, Y) | dungeon.data.isWall(X, Y - 1))
                                    )
                                {
                                    validWalls.Add(new IntVector2(X, Y));
                                }
                            }
                        }

                        int WallCorruptionIntensity = (validWalls.Count / UnityEngine.Random.Range(2, 4));
                        if (roomHandler == null && !isCorruptedSecretRoom && UnityEngine.Random.value <= 0.1f)
                        {
                            WallCorruptionIntensity = 0;
                        }

                        if (WallCorruptionIntensity > 0)
                        {
                            for (int C = 0; C < WallCorruptionIntensity; C++)
                            {
                                if (validWalls.Count > 0)
                                {
                                    IntVector2 WallPosition = BraveUtility.RandomElement(validWalls);
                                    cachedWallTiles.Add(WallPosition);

                                    float RandomIntervalFloat       = UnityEngine.Random.Range(0.02f, 0.06f);
                                    float RandomDispFloat           = UnityEngine.Random.Range(0.07f, 0.09f);
                                    float RandomDispIntensityFloat  = UnityEngine.Random.Range(0.085f, 0.2f);
                                    float RandomColorProbFloat      = UnityEngine.Random.Range(0.04f, 0.15f);
                                    float RandomColorIntensityFloat = UnityEngine.Random.Range(0.08f, 0.14f);

                                    GameObject m_GlitchTile = Instantiate(GlitchedTileObject, (WallPosition.ToVector2()), Quaternion.identity);
                                    m_GlitchTile.name += ("_" + UnityEngine.Random.Range(100000, 999999).ToString());
                                    m_GlitchTile.layer = 22;
                                    if (parentObject != null)
                                    {
                                        m_GlitchTile.transform.parent = parentObject.transform;
                                    }
                                    else
                                    {
                                        m_GlitchTile.transform.parent = currentRoom.hierarchyParent;
                                    }

                                    tk2dSprite m_GlitchSprite = m_GlitchTile.GetComponent <tk2dSprite>();

                                    int        TileType  = UnityEngine.Random.Range(1, 3);
                                    List <int> spriteIDs = new List <int>();
                                    if (TileType == 1)
                                    {
                                        spriteIDs = CurrentFloorWallIDs;
                                    }
                                    if (TileType == 2)
                                    {
                                        spriteIDs = CurrentFloorFloorIDs;
                                    }
                                    if (TileType == 3)
                                    {
                                        spriteIDs = CurrentFloorMiscIDs;
                                    }

                                    m_GlitchSprite.SetSprite(BraveUtility.RandomElement(spriteIDs));

                                    if (dungeon.data.isFaceWallLower(WallPosition.x, WallPosition.y) && !dungeon.data.isWall(WallPosition.x, WallPosition.y - 1))
                                    {
                                        DepthLookupManager.ProcessRenderer(m_GlitchSprite.renderer, DepthLookupManager.GungeonSortingLayer.BACKGROUND);
                                        m_GlitchSprite.IsPerpendicular = false;
                                        m_GlitchSprite.HeightOffGround = 0;
                                        m_GlitchSprite.UpdateZDepth();
                                    }
                                    else
                                    {
                                        m_GlitchSprite.HeightOffGround = 3;
                                        m_GlitchSprite.UpdateZDepth();
                                        m_GlitchTile.SetLayerRecursively(LayerMask.NameToLayer("FG_Critical"));
                                    }

                                    if (roomHandler != null && !isCorruptedSecretRoom && !isLeadKeyRoom)
                                    {
                                        m_GlitchTile.AddComponent <DebrisObject>();
                                        DebrisObject m_GlitchDebris = m_GlitchTile.GetComponent <DebrisObject>();
                                        m_GlitchDebris.angularVelocity         = 0;
                                        m_GlitchDebris.angularVelocityVariance = 0;
                                        m_GlitchDebris.animatePitFall          = false;
                                        m_GlitchDebris.bounceCount             = 0;
                                        m_GlitchDebris.breakOnFallChance       = 0;
                                        m_GlitchDebris.breaksOnFall            = false;
                                        m_GlitchDebris.canRotate             = false;
                                        m_GlitchDebris.changesCollisionLayer = false;
                                        m_GlitchDebris.collisionStopsBullets = false;
                                        m_GlitchDebris.followupBehavior      = DebrisObject.DebrisFollowupAction.None;
                                        m_GlitchDebris.IsAccurateDebris      = true;
                                        m_GlitchDebris.IsCorpse                      = false;
                                        m_GlitchDebris.motionMultiplier              = 0;
                                        m_GlitchDebris.pitFallSplash                 = false;
                                        m_GlitchDebris.playAnimationOnTrigger        = false;
                                        m_GlitchDebris.PreventAbsorption             = true;
                                        m_GlitchDebris.PreventFallingInPits          = true;
                                        m_GlitchDebris.Priority                      = EphemeralObject.EphemeralPriority.Ephemeral;
                                        m_GlitchDebris.shouldUseSRBMotion            = false;
                                        m_GlitchDebris.usesDirectionalFallAnimations = false;
                                        m_GlitchDebris.lifespanMax                   = 600;
                                        m_GlitchDebris.lifespanMin                   = 500;
                                        m_GlitchDebris.usesLifespan                  = true;
                                    }
                                    else
                                    {
                                        m_GlitchTile.AddComponent <ExpandCorruptedObjectDummyComponent>();
                                        ExpandCorruptedObjectDummyComponent dummyComponent = m_GlitchTile.GetComponent <ExpandCorruptedObjectDummyComponent>();
                                        dummyComponent.Init();
                                    }

                                    if (UnityEngine.Random.value <= 0.5f)
                                    {
                                        ExpandShaders.Instance.ApplyGlitchShader(m_GlitchSprite, true, RandomIntervalFloat, RandomDispFloat, RandomDispIntensityFloat, RandomColorProbFloat, RandomColorIntensityFloat);
                                    }
                                    CorruptWallTilesPlaced++;
                                    validWalls.Remove(WallPosition);
                                }
                            }
                        }

                        for (int Width = -1; Width <= currentRoom.area.dimensions.x; Width++)
                        {
                            for (int Height = -1; Height <= currentRoom.area.dimensions.y; Height++)
                            {
                                int X = currentRoom.area.basePosition.x + Width;
                                int Y = currentRoom.area.basePosition.y + Height;
                                if (!dungeon.data.isWall(X, Y) && !dungeon.data.isAnyFaceWall(X, Y))
                                {
                                    validOpenAreas.Add(new IntVector2(X, Y));
                                }
                            }
                        }

                        int OpenAreaCorruptionIntensity = (validOpenAreas.Count / UnityEngine.Random.Range(5, 10));

                        if (UnityEngine.Random.value <= 0.2f | isCorruptedSecretRoom)
                        {
                            if (isCorruptedSecretRoom)
                            {
                                OpenAreaCorruptionIntensity = (validOpenAreas.Count / UnityEngine.Random.Range(2, 5));
                            }
                            else
                            {
                                OpenAreaCorruptionIntensity = (validOpenAreas.Count / UnityEngine.Random.Range(3, 6));
                            }
                        }

                        if ((roomHandler == null && !isCorruptedSecretRoom && UnityEngine.Random.value <= 0.15f) | corruptWallsOnly)
                        {
                            OpenAreaCorruptionIntensity = 0;
                        }

                        if (OpenAreaCorruptionIntensity > 0 && !currentRoom.IsShop && currentRoom.area.PrototypeRoomCategory != PrototypeDungeonRoom.RoomCategory.BOSS)
                        {
                            for (int S = 0; S <= OpenAreaCorruptionIntensity; S++)
                            {
                                IntVector2 OpenAreaPosition = BraveUtility.RandomElement(validOpenAreas);

                                float RandomIntervalFloat       = UnityEngine.Random.Range(0.02f, 0.06f);
                                float RandomDispFloat           = UnityEngine.Random.Range(0.07f, 0.09f);
                                float RandomDispIntensityFloat  = UnityEngine.Random.Range(0.085f, 0.2f);
                                float RandomColorProbFloat      = UnityEngine.Random.Range(0.04f, 0.15f);
                                float RandomColorIntensityFloat = UnityEngine.Random.Range(0.08f, 0.14f);

                                GameObject m_GlitchTile = Instantiate(GlitchedTileObject, (OpenAreaPosition.ToVector2()), Quaternion.identity);
                                m_GlitchTile.name += ("_" + UnityEngine.Random.Range(100000, 999999).ToString());

                                if (parentObject != null)
                                {
                                    m_GlitchTile.transform.parent = parentObject.transform;
                                }
                                else
                                {
                                    m_GlitchTile.transform.parent = currentRoom.hierarchyParent;
                                }

                                tk2dSprite m_GlitchSprite = m_GlitchTile.GetComponent <tk2dSprite>();
                                int        TileType       = UnityEngine.Random.Range(1, 3);
                                List <int> spriteIDs      = new List <int>();
                                if (TileType == 1)
                                {
                                    spriteIDs = CurrentFloorWallIDs;
                                }
                                if (TileType == 2)
                                {
                                    spriteIDs = CurrentFloorFloorIDs;
                                }
                                if (TileType == 3)
                                {
                                    spriteIDs = CurrentFloorMiscIDs;
                                }

                                m_GlitchSprite.SetSprite(BraveUtility.RandomElement(spriteIDs));

                                if (UnityEngine.Random.value <= 0.3f)
                                {
                                    ExpandShaders.Instance.ApplyGlitchShader(m_GlitchSprite, true, RandomIntervalFloat, RandomDispFloat, RandomDispIntensityFloat, RandomColorProbFloat, RandomColorIntensityFloat);
                                }
                                DepthLookupManager.ProcessRenderer(m_GlitchSprite.renderer, DepthLookupManager.GungeonSortingLayer.BACKGROUND);
                                m_GlitchSprite.IsPerpendicular = false;
                                m_GlitchSprite.HeightOffGround = -4f;
                                m_GlitchSprite.SortingOrder    = 2;
                                m_GlitchSprite.UpdateZDepth();

                                if (roomHandler != null && !isCorruptedSecretRoom)
                                {
                                    m_GlitchTile.AddComponent <DebrisObject>();
                                    DebrisObject m_GlitchDebris = m_GlitchTile.GetComponent <DebrisObject>();
                                    m_GlitchDebris.angularVelocity         = 0;
                                    m_GlitchDebris.angularVelocityVariance = 0;
                                    m_GlitchDebris.animatePitFall          = false;
                                    m_GlitchDebris.bounceCount             = 0;
                                    m_GlitchDebris.breakOnFallChance       = 0;
                                    m_GlitchDebris.breaksOnFall            = false;
                                    m_GlitchDebris.canRotate             = false;
                                    m_GlitchDebris.changesCollisionLayer = false;
                                    m_GlitchDebris.collisionStopsBullets = false;
                                    m_GlitchDebris.followupBehavior      = DebrisObject.DebrisFollowupAction.None;
                                    m_GlitchDebris.IsAccurateDebris      = true;
                                    m_GlitchDebris.IsCorpse                      = false;
                                    m_GlitchDebris.motionMultiplier              = 0;
                                    m_GlitchDebris.pitFallSplash                 = false;
                                    m_GlitchDebris.playAnimationOnTrigger        = false;
                                    m_GlitchDebris.PreventAbsorption             = true;
                                    m_GlitchDebris.PreventFallingInPits          = true;
                                    m_GlitchDebris.Priority                      = EphemeralObject.EphemeralPriority.Ephemeral;
                                    m_GlitchDebris.shouldUseSRBMotion            = false;
                                    m_GlitchDebris.usesDirectionalFallAnimations = false;
                                    if (!isCorruptedSecretRoom && roomHandler != null)
                                    {
                                        m_GlitchDebris.lifespanMax  = 600;
                                        m_GlitchDebris.lifespanMin  = 500;
                                        m_GlitchDebris.usesLifespan = true;
                                    }
                                    else
                                    {
                                        m_GlitchDebris.usesLifespan = false;
                                    }
                                }
                                else
                                {
                                    m_GlitchTile.AddComponent <ExpandCorruptedObjectDummyComponent>();
                                    ExpandCorruptedObjectDummyComponent dummyComponent = m_GlitchTile.GetComponent <ExpandCorruptedObjectDummyComponent>();
                                    dummyComponent.Init();
                                }
                                CorruptOpenAreaTilesPlaced++;
                                validOpenAreas.Remove(OpenAreaPosition);
                            }
                        }
                    }
                    iterations++;
                } catch (Exception ex) {
                    if (ExpandStats.debugMode)
                    {
                        if (RoomBeingWorkedOn != null && !string.IsNullOrEmpty(RoomBeingWorkedOn.GetRoomName()))
                        {
                            ETGModConsole.Log("[DEBUG] Exception occured in Dungeon.PlaceWallMimics with room: " + RoomBeingWorkedOn.GetRoomName());
                            Debug.Log("Exception caught in Dungeon.PlaceWallMimics with room: " + RoomBeingWorkedOn.GetRoomName());
                        }
                        else
                        {
                            ETGModConsole.Log("[DEBUG] Exception occured in Dungeon.PlaceWallMimics!");
                            Debug.Log("Exception caught in Dungeon.PlaceWallMimics!");
                        }
                        Debug.LogException(ex);
                    }
                    if (CorruptWallTilesPlaced > 0)
                    {
                        if (ExpandStats.debugMode)
                        {
                            ETGModConsole.Log("[DEBUG] Number of corrupted wall tiles succesfully placed: " + CorruptWallTilesPlaced, false);
                            ETGModConsole.Log("[DEBUG] Number of corrupted ppen area tiles succesfully placed: " + CorruptOpenAreaTilesPlaced, false);
                        }
                    }
                    if (RoomBeingWorkedOn != null)
                    {
                        RoomBeingWorkedOn = null;
                    }
                    iterations++;
                }
            }
            if (CorruptWallTilesPlaced > 0)
            {
                if (ExpandStats.debugMode)
                {
                    ETGModConsole.Log("[DEBUG] Number of Valid Corrupted Wall Tile locations: " + CorruptWallTilesPlaced, false);
                    ETGModConsole.Log("[DEBUG] Number of Valid Corrupted locations: " + CorruptOpenAreaTilesPlaced, false);
                }
            }
            Destroy(GlitchedTileObject);
            return;
        }
Exemple #18
0
        // Token: 0x06004CAC RID: 19628 RVA: 0x001999F8 File Offset: 0x00197BF8
        private void DestroyCrystals(RuntimeGameActorEffectData effectData, bool playVfxExplosion = true)
        {
            if (effectData.vfxObjects == null || effectData.vfxObjects.Count == 0)
            {
                return;
            }
            Vector2   vector = Vector2.zero;
            GameActor actor  = effectData.actor;

            if (actor)
            {
                vector = ((!actor.specRigidbody) ? actor.sprite.WorldCenter : actor.specRigidbody.HitboxPixelCollider.UnitCenter);
            }
            else
            {
                int num = 0;
                for (int i = 0; i < effectData.vfxObjects.Count; i++)
                {
                    if (effectData.vfxObjects[i].First)
                    {
                        vector += effectData.vfxObjects[i].First.transform.position.XY();
                        num++;
                    }
                }
                if (num == 0)
                {
                    return;
                }
                vector /= (float)num;
            }
            if (playVfxExplosion && this.vfxExplosion)
            {
                GameObject gameObject = SpawnManager.SpawnVFX(this.vfxExplosion, vector, Quaternion.identity);
                tk2dSprite component  = gameObject.GetComponent <tk2dSprite>();
                if (actor && component)
                {
                    actor.sprite.AttachRenderer(component);
                    component.HeightOffGround = 0.1f;
                    component.UpdateZDepth();
                }
            }
            for (int j = 0; j < effectData.vfxObjects.Count; j++)
            {
                GameObject first = effectData.vfxObjects[j].First;
                if (first)
                {
                    first.transform.parent = SpawnManager.Instance.VFX;
                    DebrisObject orAddComponent = first.GetOrAddComponent <DebrisObject>();
                    if (actor)
                    {
                        actor.sprite.AttachRenderer(orAddComponent.sprite);
                    }
                    orAddComponent.sprite.IsPerpendicular = true;
                    orAddComponent.DontSetLayer           = true;
                    orAddComponent.gameObject.SetLayerRecursively(LayerMask.NameToLayer("FG_Critical"));
                    orAddComponent.angularVelocity         = Mathf.Sign(UnityEngine.Random.value - 0.5f) * 125f;
                    orAddComponent.angularVelocityVariance = 60f;
                    orAddComponent.decayOnBounce           = 0.5f;
                    orAddComponent.bounceCount             = 1;
                    orAddComponent.canRotate = true;
                    float num2 = effectData.vfxObjects[j].Second + UnityEngine.Random.Range(-this.debrisAngleVariance, this.debrisAngleVariance);
                    if (orAddComponent.name.Contains("tilt", true))
                    {
                        num2 += 45f;
                    }
                    Vector2 vector2        = BraveMathCollege.DegreesToVector(num2, 1f) * (float)UnityEngine.Random.Range(this.debrisMinForce, this.debrisMaxForce);
                    Vector3 startingForce  = new Vector3(vector2.x, (vector2.y >= 0f) ? 0f : vector2.y, (vector2.y <= 0f) ? 0f : vector2.y);
                    float   startingHeight = (!actor) ? 0.75f : (first.transform.position.y - actor.specRigidbody.HitboxPixelCollider.UnitBottom);
                    if (orAddComponent.minorBreakable)
                    {
                        orAddComponent.minorBreakable.enabled = true;
                    }
                    orAddComponent.Trigger(startingForce, startingHeight, 1f);
                }
            }
            effectData.vfxObjects.Clear();
        }
Exemple #19
0
        private void Start()
        {
            // Delay initial configuration for ItemCrate version to avoid possible misalignment since GameObjects get instantiated initially from zero position.
            // Item crate object comes with this controller pre-attached. So position may not be correct frame 1. ;)
            if (!Configured && IsItemCrate)
            {
                StartCoroutine(DelayedAutoConfiguration());
                return;
            }
            m_ParentEnemy        = aiActor;
            m_CachedRotation     = transform.rotation;
            m_cachedPosition     = transform.position;
            m_CachedLayer        = gameObject.layer;
            m_CachedSpriteZDepth = sprite.HeightOffGround;
            m_maxSway            = MaxSwayAngle;

            if (knockbackDoer)
            {
                knockbackDoer.SetImmobile(true, "Paradrop Protection");
            }

            if (m_ParentEnemy)
            {
                m_cachedScale = m_ParentEnemy.EnemyScale;
            }
            else
            {
                m_cachedScale = Vector2.one;
            }

            if (m_ParentEnemy && m_ParentEnemy.HasShadow && m_ParentEnemy.ShadowObject)
            {
                m_ParentEnemy.ShadowObject.GetComponent <tk2dSprite>().renderer.enabled = false;
            }

            if (m_ParentEnemy)
            {
                m_ParentEnemy.behaviorSpeculator.enabled = false;
                if (m_ParentEnemy.aiAnimator)
                {
                    m_ParentEnemy.aiAnimator.FacingDirection = -90;
                }
                if (m_ParentEnemy.aiShooter)
                {
                    m_ParentEnemy.aiShooter.AimAtPoint(m_ParentEnemy.CenterPosition - new Vector2(0, 2));
                    m_ParentEnemy.aiShooter.ToggleGunAndHandRenderers(false, "ParaDrop");
                }
            }

            if (specRigidbody && !IsItemCrate)
            {
                specRigidbody.CollideWithOthers = false;
            }
            if (healthHaver)
            {
                healthHaver.PreventAllDamage = true;
                healthHaver.IsVulnerable     = false;
            }

            if (ParentObjectExplodyBarrel && !IsItemCrate)
            {
                m_CachedExplosionData = ExpandUtility.GenerateExplosionData();
            }

            // MeshRenderer pre-disabled via added components in Unity Editor for The Item Drop host object.
            if (!IsItemCrate)
            {
                sprite.renderer.enabled = false;
            }

            m_Parachute = Instantiate(ExpandPrefabs.EX_Parachute, Vector3.zero, Quaternion.identity);
            m_ParachuteSpriteAnimator          = m_Parachute.GetComponent <tk2dSpriteAnimator>();
            m_ParachuteSprite                  = m_Parachute.GetComponent <tk2dSprite>();
            m_ParachuteSprite.renderer.enabled = false;
            if (IsItemCrate)
            {
                m_ParachuteSprite.HeightOffGround += 3f;
                m_ParachuteSprite.UpdateZDepth();
            }


            // Despite my absolute shit math skills I somehow got this right. :P
            // (this correctly sets the parachute above the host object's sprite)
            float ParachuteXSize    = (m_ParachuteSprite.GetBounds().size.x / 2);
            float ObjectUnitCenterX = m_cachedPosition.x;
            float ObjectUnitCenterY = m_cachedPosition.y;

            if (UseObjectSizeOverride)
            {
                ObjectUnitCenterX += OverrideObjectSize.x;
                ObjectUnitCenterY += OverrideObjectSize.y;
            }
            else if (specRigidbody)
            {
                specRigidbody.Reinitialize(); // Make sure rigidbody colliders are at current object's position
                ObjectUnitCenterX = specRigidbody.GetPixelCollider(ColliderType.HitBox).UnitCenter.x;
                ObjectUnitCenterY = specRigidbody.GetPixelCollider(ColliderType.HitBox).UnitTopCenter.y;
            }

            m_Parachute.transform.position = new Vector2((ObjectUnitCenterX - ParachuteXSize), ObjectUnitCenterY);

            m_Parachute.layer = gameObject.layer;

            if (IsItemCrate)
            {
                GameObject EXItemBoxAnchor = new GameObject("EX ItemBox Anchor")
                {
                    layer = gameObject.layer
                };
                EXItemBoxAnchor.transform.position = m_ParachuteSprite.WorldBottomCenter;
                m_ItemBoxAnchor = EXItemBoxAnchor;
                EXItemBoxAnchor.transform.SetParent(m_Parachute.transform);
                gameObject.transform.SetParent(EXItemBoxAnchor.transform);
            }
            else
            {
                gameObject.transform.SetParent(m_Parachute.transform);
            }

            // m_Anchor = Instantiate(ExpandPrefabs.EX_ParadropAnchor, m_ParachuteSprite.WorldBottomCenter, Quaternion.identity).transform;
            m_Anchor = new GameObject("EXParaDropAnchor")
            {
                layer = gameObject.layer
            }.transform;
            m_Anchor.transform.position = m_ParachuteSprite.WorldBottomCenter;
            m_Parachute.transform.SetParent(m_Anchor);

            m_CachedPositionOffset = (m_Anchor.position - m_cachedPosition.ToVector3ZUp());

            switchState   = State.PopIntoAir;
            m_Initialized = true;
        }
        public static void SetupHatSprites(List <string> spritePaths, GameObject hatObj, int fps, Vector2 hatSize)
        {
            Hat hatness = hatObj.GetComponent <Hat>();

            if (hatness)
            {
                string collectionName = hatness.hatName;
                collectionName = collectionName.Replace(" ", "_");
                tk2dSpriteCollectionData HatSpriteCollection = SpriteBuilder.ConstructCollection(hatObj, (collectionName + "_Collection"));

                int        spriteID      = SpriteBuilder.AddSpriteToCollection(spritePaths[0], HatSpriteCollection);
                tk2dSprite hatBaseSprite = hatObj.GetOrAddComponent <tk2dSprite>();
                hatBaseSprite.SetSprite(HatSpriteCollection, spriteID);
                tk2dSpriteDefinition def = hatBaseSprite.GetCurrentSpriteDef();
                def.colliderVertices = new Vector3[] {
                    new Vector3(0f, 0f, 0f),
                    new Vector3((hatSize.x / 16), (hatSize.y / 16), 0f)
                };
                hatBaseSprite.PlaceAtPositionByAnchor(hatObj.transform.position, tk2dBaseSprite.Anchor.LowerCenter);
                hatBaseSprite.depthUsesTrimmedBounds = true;
                hatBaseSprite.IsPerpendicular        = true;
                hatBaseSprite.UpdateZDepth();
                hatBaseSprite.HeightOffGround = 0.2f;

                List <string> SouthAnimation     = new List <string>();
                List <string> NorthAnimation     = new List <string>();
                List <string> EastAnimation      = new List <string>();
                List <string> WestAnimation      = new List <string>();
                List <string> NorthWestAnimation = new List <string>();
                List <string> NorthEastAnimation = new List <string>();
                List <string> SouthEastAnimation = new List <string>();
                List <string> SouthWestAnimation = new List <string>();

                switch (hatness.hatDirectionality)
                {
                case Hat.HatDirectionality.EIGHTWAY:
                    foreach (string path in spritePaths)
                    {
                        if (path.ToLower().Contains("_north_"))
                        {
                            NorthAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_south_"))
                        {
                            SouthAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_west_"))
                        {
                            WestAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_east_"))
                        {
                            EastAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_northwest_"))
                        {
                            NorthWestAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_northeast_"))
                        {
                            NorthEastAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_southwest_"))
                        {
                            SouthWestAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_southeast_"))
                        {
                            SouthEastAnimation.Add(path);
                        }
                    }
                    break;

                case Hat.HatDirectionality.SIXWAY:
                    foreach (string path in spritePaths)
                    {
                        if (path.ToLower().Contains("_north_"))
                        {
                            NorthAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_south_"))
                        {
                            SouthAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_west_"))
                        {
                            WestAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_east_"))
                        {
                            EastAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_northwest_"))
                        {
                            NorthWestAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_northeast_"))
                        {
                            NorthEastAnimation.Add(path);
                        }
                    }
                    break;

                case Hat.HatDirectionality.FOURWAY:
                    foreach (string path in spritePaths)
                    {
                        if (path.ToLower().Contains("_west_"))
                        {
                            WestAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_east_"))
                        {
                            EastAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_north_"))
                        {
                            NorthAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_south_"))
                        {
                            SouthAnimation.Add(path);
                        }
                    }
                    break;

                case Hat.HatDirectionality.TWOWAYHORIZONTAL:
                    foreach (string path in spritePaths)
                    {
                        if (path.ToLower().Contains("_west_"))
                        {
                            WestAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_east_"))
                        {
                            EastAnimation.Add(path);
                        }
                    }
                    break;

                case Hat.HatDirectionality.TWOWAYVERTICAL:
                    foreach (string path in spritePaths)
                    {
                        if (path.ToLower().Contains("_north_"))
                        {
                            NorthAnimation.Add(path);
                        }
                        if (path.ToLower().Contains("_south_"))
                        {
                            SouthAnimation.Add(path);
                        }
                    }
                    break;

                case Hat.HatDirectionality.NONE:
                    foreach (string path in spritePaths)
                    {
                        if (path.ToLower().Contains("_south_"))
                        {
                            SouthAnimation.Add(path);
                        }
                    }
                    break;
                }

                //SET UP THE ANIMATOR AND THE ANIMATION
                tk2dSpriteAnimator  animator  = hatObj.GetOrAddComponent <tk2dSpriteAnimator>();
                tk2dSpriteAnimation animation = hatObj.GetOrAddComponent <tk2dSpriteAnimation>();
                animation.clips  = new tk2dSpriteAnimationClip[0];
                animator.Library = animation;

                //SOUTH ANIMATION
                if (SouthAnimation != null)
                {
                    tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip()
                    {
                        name = "hat_south", frames = new tk2dSpriteAnimationFrame[0], fps = fps
                    };

                    List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>();
                    foreach (string path in SouthAnimation)
                    {
                        tk2dSpriteCollectionData collection = HatSpriteCollection;
                        int frameSpriteId             = SpriteBuilder.AddSpriteToCollection(path, collection);
                        tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId];
                        frameDef.colliderVertices = def.colliderVertices;
                        frameDef.ConstructOffsetsFromAnchor(tk2dBaseSprite.Anchor.LowerCenter);
                        frames.Add(new tk2dSpriteAnimationFrame {
                            spriteId = frameSpriteId, spriteCollection = collection
                        });
                    }
                    clip.frames     = frames.ToArray();
                    animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray();
                }
                //NORTH ANIMATIONS
                if (NorthAnimation != null)
                {
                    tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip()
                    {
                        name = "hat_north", frames = new tk2dSpriteAnimationFrame[0], fps = fps
                    };

                    List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>();
                    foreach (string path in NorthAnimation)
                    {
                        tk2dSpriteCollectionData collection = HatSpriteCollection;
                        int frameSpriteId             = SpriteBuilder.AddSpriteToCollection(path, collection);
                        tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId];
                        frameDef.colliderVertices = def.colliderVertices;
                        frameDef.ConstructOffsetsFromAnchor(tk2dBaseSprite.Anchor.LowerCenter);
                        frames.Add(new tk2dSpriteAnimationFrame {
                            spriteId = frameSpriteId, spriteCollection = collection
                        });
                    }
                    clip.frames     = frames.ToArray();
                    animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray();
                }
                //WEST ANIMATIONS
                if (WestAnimation != null)
                {
                    tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip()
                    {
                        name = "hat_west", frames = new tk2dSpriteAnimationFrame[0], fps = fps
                    };

                    List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>();
                    foreach (string path in WestAnimation)
                    {
                        tk2dSpriteCollectionData collection = HatSpriteCollection;
                        int frameSpriteId             = SpriteBuilder.AddSpriteToCollection(path, collection);
                        tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId];
                        frameDef.colliderVertices = def.colliderVertices;
                        frameDef.ConstructOffsetsFromAnchor(tk2dBaseSprite.Anchor.LowerCenter);
                        frames.Add(new tk2dSpriteAnimationFrame {
                            spriteId = frameSpriteId, spriteCollection = collection
                        });
                    }
                    clip.frames     = frames.ToArray();
                    animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray();
                }
                //EAST ANIMATIONS
                if (EastAnimation != null)
                {
                    tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip()
                    {
                        name = "hat_east", frames = new tk2dSpriteAnimationFrame[0], fps = fps
                    };

                    List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>();
                    foreach (string path in EastAnimation)
                    {
                        tk2dSpriteCollectionData collection = HatSpriteCollection;
                        int frameSpriteId             = SpriteBuilder.AddSpriteToCollection(path, collection);
                        tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId];
                        frameDef.colliderVertices = def.colliderVertices;
                        frameDef.ConstructOffsetsFromAnchor(tk2dBaseSprite.Anchor.LowerCenter);
                        frames.Add(new tk2dSpriteAnimationFrame {
                            spriteId = frameSpriteId, spriteCollection = collection
                        });
                    }
                    clip.frames     = frames.ToArray();
                    animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray();
                }
                //NORTHEAST
                if (NorthEastAnimation != null)
                {
                    tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip()
                    {
                        name = "hat_northeast", frames = new tk2dSpriteAnimationFrame[0], fps = fps
                    };

                    List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>();
                    foreach (string path in NorthEastAnimation)
                    {
                        tk2dSpriteCollectionData collection = HatSpriteCollection;
                        int frameSpriteId             = SpriteBuilder.AddSpriteToCollection(path, collection);
                        tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId];
                        frameDef.colliderVertices = def.colliderVertices;
                        frameDef.ConstructOffsetsFromAnchor(tk2dBaseSprite.Anchor.LowerCenter);
                        frames.Add(new tk2dSpriteAnimationFrame {
                            spriteId = frameSpriteId, spriteCollection = collection
                        });
                    }
                    clip.frames     = frames.ToArray();
                    animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray();
                }
                //NORTHWEST ANIMATION
                if (NorthWestAnimation != null)
                {
                    tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip()
                    {
                        name = "hat_northwest", frames = new tk2dSpriteAnimationFrame[0], fps = fps
                    };

                    List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>();
                    foreach (string path in NorthWestAnimation)
                    {
                        tk2dSpriteCollectionData collection = HatSpriteCollection;
                        int frameSpriteId             = SpriteBuilder.AddSpriteToCollection(path, collection);
                        tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId];
                        frameDef.colliderVertices = def.colliderVertices;
                        frameDef.ConstructOffsetsFromAnchor(tk2dBaseSprite.Anchor.LowerCenter);
                        frames.Add(new tk2dSpriteAnimationFrame {
                            spriteId = frameSpriteId, spriteCollection = collection
                        });
                    }
                    clip.frames     = frames.ToArray();
                    animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray();
                }
                //SOUTHWEST ANIMATION
                if (SouthWestAnimation != null)
                {
                    tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip()
                    {
                        name = "hat_southwest", frames = new tk2dSpriteAnimationFrame[0], fps = fps
                    };

                    List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>();
                    foreach (string path in SouthWestAnimation)
                    {
                        tk2dSpriteCollectionData collection = HatSpriteCollection;
                        int frameSpriteId             = SpriteBuilder.AddSpriteToCollection(path, collection);
                        tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId];
                        frameDef.colliderVertices = def.colliderVertices;
                        frameDef.ConstructOffsetsFromAnchor(tk2dBaseSprite.Anchor.LowerCenter);
                        frames.Add(new tk2dSpriteAnimationFrame {
                            spriteId = frameSpriteId, spriteCollection = collection
                        });
                    }
                    clip.frames     = frames.ToArray();
                    animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray();
                }
                //SOUTHEAST ANIMATION
                if (SouthEastAnimation != null)
                {
                    tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip()
                    {
                        name = "hat_southeast", frames = new tk2dSpriteAnimationFrame[0], fps = fps
                    };

                    List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>();
                    foreach (string path in SouthEastAnimation)
                    {
                        tk2dSpriteCollectionData collection = HatSpriteCollection;
                        int frameSpriteId             = SpriteBuilder.AddSpriteToCollection(path, collection);
                        tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId];
                        frameDef.colliderVertices = def.colliderVertices;
                        frameDef.ConstructOffsetsFromAnchor(tk2dBaseSprite.Anchor.LowerCenter);
                        frames.Add(new tk2dSpriteAnimationFrame {
                            spriteId = frameSpriteId, spriteCollection = collection
                        });
                    }
                    clip.frames     = frames.ToArray();
                    animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray();
                }
            }
        }