private IEnumerator Start()
        {
            while (!hasBeenSetup)
            {
                yield return(null);
            }

            if (!m_Destination.HasValue)
            {
                if (ExpandStats.debugMode)
                {
                    ETGModConsole.Log("[ExpandTheGungeon] [" + gameObject.name + "] ERROR: Destination Door was not found!");
                }
                m_Disabled = true;
            }

            if (!m_Disabled)
            {
                if (specRigidbody)
                {
                    specRigidbody.OnTriggerCollision = (SpeculativeRigidbody.OnTriggerDelegate)Delegate.Combine(specRigidbody.OnTriggerCollision, new SpeculativeRigidbody.OnTriggerDelegate(HandleTriggerCollision));
                }
            }

            m_parentRoom.RegisterInteractable(Lock);

            if (isHollowsElevator)
            {
                List <IntVector2>     CachedPositions            = new List <IntVector2>();
                IntVector2            RandomGlitchEnemyPosition1 = ExpandObjectDatabase.GetRandomAvailableCellForPlacable(GameManager.Instance.Dungeon, m_parentRoom, CachedPositions, false, true);
                IntVector2            RandomGlitchEnemyPosition2 = ExpandObjectDatabase.GetRandomAvailableCellForPlacable(GameManager.Instance.Dungeon, m_parentRoom, CachedPositions, false, true);
                IntVector2            RandomGlitchEnemyPosition3 = ExpandObjectDatabase.GetRandomAvailableCellForPlacable(GameManager.Instance.Dungeon, m_parentRoom, CachedPositions, false, true);
                ExpandGlitchedEnemies m_GlitchEnemyDatabase      = new ExpandGlitchedEnemies();
                m_GlitchEnemyDatabase.SpawnGlitchedRat(m_parentRoom, RandomGlitchEnemyPosition1);
                m_GlitchEnemyDatabase.SpawnGlitchedRat(m_parentRoom, RandomGlitchEnemyPosition2);
                m_GlitchEnemyDatabase.SpawnGlitchedRat(m_parentRoom, RandomGlitchEnemyPosition3);
                m_GlitchEnemyDatabase = null;
                CachedPositions.Clear();
            }

            if (MinimapIcon)
            {
                Minimap.Instance.RegisterRoomIcon(m_parentRoom, MinimapIcon, false);
            }

            yield break;
        }
Example #2
0
        private void EnemyModRandomizer(AIActor targetActor)
        {
            if (string.IsNullOrEmpty(targetActor.EnemyGuid))
            {
                return;
            }

            if (GameManager.Instance.Dungeon.IsGlitchDungeon && !targetActor.IsBlackPhantom && !string.IsNullOrEmpty(targetActor.EnemyGuid))
            {
                if (UnityEngine.Random.value <= 0.3 && targetActor.healthHaver != null && !ExpandLists.DontGlitchMeList.Contains(targetActor.EnemyGuid) && !ExpandLists.blobsAndCritters.Contains(targetActor.EnemyGuid) && targetActor.EnemyGuid != "5e0af7f7d9de4755a68d2fd3bbc15df4")
                {
                    if (!targetActor.healthHaver.IsBoss && !targetActor.sprite.usesOverrideMaterial && targetActor.optionalPalette == null)
                    {
                        float RandomIntervalFloat       = UnityEngine.Random.Range(0.02f, 0.06f);
                        float RandomDispFloat           = UnityEngine.Random.Range(0.1f, 0.16f);
                        float RandomDispIntensityFloat  = UnityEngine.Random.Range(0.1f, 0.4f);
                        float RandomColorProbFloat      = UnityEngine.Random.Range(0.05f, 0.2f);
                        float RnadomColorIntensityFloat = UnityEngine.Random.Range(0.1f, 0.25f);

                        ExpandShaders.Instance.BecomeGlitched(targetActor, RandomIntervalFloat, RandomDispFloat, RandomDispIntensityFloat, RandomColorProbFloat, RnadomColorIntensityFloat);
                        if (targetActor.GetComponent <ExpandSpawnGlitchObjectOnDeath>() == null)
                        {
                            if (UnityEngine.Random.value <= 0.25)
                            {
                                targetActor.gameObject.AddComponent <ExpandSpawnGlitchObjectOnDeath>();
                            }
                        }
                        ExpandGlitchedEnemies.GlitchExistingEnemy(targetActor);

                        if (UnityEngine.Random.value <= 0.1f && targetActor.EnemyGuid != "4d37ce3d666b4ddda8039929225b7ede" && targetActor.EnemyGuid != "19b420dec96d4e9ea4aebc3398c0ba7a" && targetActor.GetComponent <ExplodeOnDeath>() == null && targetActor.GetComponent <ExpandSpawnGlitchObjectOnDeath>() == null && targetActor.GetComponent <ExpandSpawnGlitchEnemyOnDeath>() == null)
                        {
                            try { targetActor.gameObject.AddComponent <ExpandExplodeOnDeath>(); } catch (Exception) { }
                        }
                    }
                }
                return;
            }
        }
Example #3
0
 public ExpandPlaceGlitchedEnemies()
 {
     m_GlitchEnemyDatabase = new ExpandGlitchedEnemies();
 }
Example #4
0
 public ExpandJunkEnemySpawneer()
 {
     m_GlitchEnemyDatabase = new ExpandGlitchedEnemies();
 }
        private void InitObjectMods(Dungeon dungeon)
        {
            if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.JUNGLEGEON)
            {
                GameObject JungleRainPlacable = new GameObject("ExpandJungleThunderStorm", new System.Type[] { typeof(ExpandThunderStormPlacable) })
                {
                    layer = 0
                };
                JungleRainPlacable.transform.parent = dungeon.gameObject.transform;
                ExpandThunderStormPlacable ThunderstormPlacable = JungleRainPlacable.GetComponent <ExpandThunderStormPlacable>();
                ThunderstormPlacable.useCustomIntensity = true;
                ThunderstormPlacable.RainIntensity      = 425f;
                ThunderstormPlacable.enableLightning    = true;
                ThunderstormPlacable.isSecretFloor      = false;
                ThunderstormPlacable.ConfigureOnPlacement(null);
            }


            if (GameManager.Instance.CurrentFloor == 1)
            {
                ExpandStats.HasSpawnedSecretBoss = false;
            }

            // Disable victory music for Ser Manuel if not on tutorial floor. (it can cause double music bug if you kill him on other floors)
            if (dungeon.LevelOverrideType != GameManager.LevelOverrideState.TUTORIAL)
            {
                ExpandPrefabs.SerManuel.GetComponent <HealthHaver>().forcePreventVictoryMusic = true;
            }
            else
            {
                ExpandPrefabs.SerManuel.GetComponent <HealthHaver>().forcePreventVictoryMusic = false;
            }

            // Assign pitfall destination to entrance on Floor 1 if in Bossrush mode and special entrance room to Miniboss room path is available.
            // Glitch Chest floors now added for this since they now have elevator entrance rooms.
            if (GameManager.Instance.CurrentGameMode == GameManager.GameMode.BOSSRUSH |
                GameManager.Instance.CurrentGameMode == GameManager.GameMode.SUPERBOSSRUSH |
                dungeon.IsGlitchDungeon)
            {
                foreach (RoomHandler specificRoom in dungeon.data.rooms)
                {
                    if (!string.IsNullOrEmpty(specificRoom.GetRoomName()))
                    {
                        if (specificRoom.GetRoomName().ToLower().StartsWith("elevatormaintenance") && (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.CASTLEGEON | dungeon.IsGlitchDungeon))
                        {
                            if (dungeon.data.Entrance != null && dungeon.data.Entrance.GetRoomName().ToLower().StartsWith("elevator entrance"))
                            {
                                dungeon.data.Entrance.TargetPitfallRoom     = specificRoom;
                                dungeon.data.Entrance.ForcePitfallForFliers = true;
                            }
                        }
                    }
                }
            }

            if (dungeon.IsGlitchDungeon | ExpandDungeonFlow.isGlitchFlow)
            {
                dungeon.BossMasteryTokenItemId = ItemAPI.CustomMasterRounds.CanyonMasterRoundID;

                foreach (AIActor enemy in FindObjectsOfType <AIActor>())
                {
                    if (!enemy.IsBlackPhantom && !enemy.healthHaver.IsBoss && !string.IsNullOrEmpty(enemy.EnemyGuid) && enemy.optionalPalette == null && (string.IsNullOrEmpty(enemy.OverrideDisplayName) | !enemy.OverrideDisplayName.StartsWith("Corrupted")))
                    {
                        if (!ExpandLists.DontGlitchMeList.Contains(enemy.EnemyGuid))
                        {
                            if (Random.value <= 0.6f)
                            {
                                ExpandShaders.Instance.BecomeGlitched(enemy, 0.04f, 0.07f, 0.05f, 0.07f, 0.05f);
                                ExpandGlitchedEnemies.GlitchExistingEnemy(enemy);
                            }
                            if (Random.value <= 0.25f && !ExpandLists.blobsAndCritters.Contains(enemy.EnemyGuid) && enemy.GetComponent <ExpandSpawnGlitchObjectOnDeath>() == null)
                            {
                                enemy.gameObject.AddComponent <ExpandSpawnGlitchObjectOnDeath>();
                            }
                        }
                    }
                }
                foreach (BraveBehaviour targetObject in FindObjectsOfType <BraveBehaviour>())
                {
                    if (Random.value <= 0.05f && targetObject.gameObject && !targetObject.gameObject.GetComponent <AIActor>() && !targetObject.gameObject.GetComponent <Chest>())
                    {
                        if (string.IsNullOrEmpty(targetObject.gameObject.name) | (!targetObject.gameObject.name.ToLower().StartsWith("glitchtile") && !targetObject.gameObject.name.ToLower().StartsWith("ex secret door") && !targetObject.gameObject.name.ToLower().StartsWith("lock") && !targetObject.gameObject.name.ToLower().StartsWith("chest")))
                        {
                            float RandomIntervalFloat       = Random.Range(0.02f, 0.04f);
                            float RandomDispFloat           = Random.Range(0.06f, 0.08f);
                            float RandomDispIntensityFloat  = Random.Range(0.07f, 0.1f);
                            float RandomColorProbFloat      = Random.Range(0.035f, 0.1f);
                            float RandomColorIntensityFloat = Random.Range(0.05f, 0.1f);
                            ExpandShaders.Instance.BecomeGlitched(targetObject, RandomIntervalFloat, RandomDispFloat, RandomDispIntensityFloat, RandomColorProbFloat, RandomColorIntensityFloat);
                        }
                    }
                }

                ExpandPlaceGlitchedEnemies m_GlitchEnemyRandomizer = new ExpandPlaceGlitchedEnemies();
                m_GlitchEnemyRandomizer.PlaceRandomEnemies(dungeon, GameManager.Instance.CurrentFloor);
                Destroy(m_GlitchEnemyRandomizer);

                MaybeSetupGlitchEnemyStun(dungeon);
            }
        }
        private void HandleChooseCorruptionEnemySource()
        {
            aiActor.enabled            = false;
            behaviorSpeculator.enabled = false;
            aiActor.ToggleRenderers(false);
            specRigidbody.enabled = false;
            aiActor.IsGone        = true;
            RoomHandler currentRoom    = transform.position.GetAbsoluteRoom();
            IntVector2  cachedPosition = (transform.PositionVector2().ToIntVector2() - currentRoom.area.basePosition);

            // bool WillBeBigEnemy = UnityEngine.Random.value <= 0.2f;
            // bool WillBeGlitchObject = UnityEngine.Random.value <= 0.2f;

            if (aiShooter)
            {
                aiShooter.ToggleGunAndHandRenderers(false, "ExpandCorruptedEnemyEngageDoer");
            }
            GameObject newEnemy = null;

            ExpandGlitchedEnemies glitchedEnemies = new ExpandGlitchedEnemies();

            try {
                newEnemy = glitchedEnemies.SpawnRandomGlitchEnemy(currentRoom, cachedPosition, true);
            } catch (Exception) {
                // If something broke, destroy broken Enemy (if it exist) to prevent possible softlocks.
                if (newEnemy)
                {
                    if (newEnemy.GetComponent <AIActor>())
                    {
                        currentRoom.DeregisterEnemy(newEnemy.GetComponent <AIActor>());
                    }
                    Destroy(newEnemy);
                }
            }

            glitchedEnemies = null;

            if (newEnemy && newEnemy.GetComponent <AIActor>())
            {
                newEnemy.GetComponent <AIActor>().aiAnimator.PlayDefaultAwakenedState();
                newEnemy.GetComponent <AIActor>().aiActor.State = AIActor.ActorState.Normal;
                newEnemy.GetComponent <AIActor>().aiActor.invisibleUntilAwaken = false;
            }

            currentRoom.DeregisterEnemy(aiActor);
            Destroy(gameObject);
            return;

            /*string SelectedEnemyToBecome;
             *
             * if (WillBeBigEnemy) {
             *  SelectedEnemyToBecome = BraveUtility.RandomElement(ValidTransformSpecialEnemies);
             * } else {
             *  SelectedEnemyToBecome = BraveUtility.RandomElement(ValidTransformEnemies);
             *  ValidSourceEnemies.Remove(SelectedEnemyToBecome);
             * }
             *
             * string SelectedEnemyToUseAttacks = BraveUtility.RandomElement(ValidSourceEnemies);
             *
             * ReplaceEnemyData(SelectedEnemyToBecome, SelectedEnemyToUseAttacks, WillBeBigEnemy, WillBeGlitchObject);
             *
             * aiActor.enabled = true;
             * RegenerateCache();
             * behaviorSpeculator.enabled = true;
             * behaviorSpeculator.RegenerateCache();
             * // behaviorSpeculator.RefreshBehaviors();
             * aiActor.ToggleRenderers(true);
             * if (aiShooter) { aiShooter.ToggleGunAndHandRenderers(true, "ExpandCorruptedEnemyEngageDoer"); }
             * specRigidbody.enabled = true;
             * specRigidbody.RegenerateCache();
             * specRigidbody.RegenerateColliders = true;
             * // specRigidbody.Reinitialize();
             * healthHaver.RegenerateCache();
             * aiActor.IsGone = false;
             * aiAnimator.PlayDefaultAwakenedState();
             * aiActor.State = AIActor.ActorState.Normal;
             * aiActor.invisibleUntilAwaken = false;
             * // transform.position = cachedPosition;
             * // specRigidbody.Reinitialize();
             * return;*/
        }
Example #7
0
 private void SpawnEnemies(string[] selectedEnemyGuids)
 {
     if (useGlitchedActorPrefab)
     {
         IntVector2 pos = specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor);
         if (aiActor.IsFalling && !IsGlitchedLJ)
         {
             return;
         }
         if (GameManager.Instance.Dungeon.CellIsPit(specRigidbody.UnitCenter.ToVector3ZUp(0f)) && !IsGlitchedLJ)
         {
             return;
         }
         RoomHandler roomFromPosition     = GameManager.Instance.Dungeon.GetRoomFromPosition(pos);
         List <SpeculativeRigidbody> list = new List <SpeculativeRigidbody>();
         list.Add(specRigidbody);
         Vector2 unitBottomLeft = specRigidbody.UnitBottomLeft;
         for (int i = 0; i < ActorPrefabSpawnCount; i++)
         {
             if (IsGlitchedLJ)
             {
                 if (transform.position.GetAbsoluteRoom() != null)
                 {
                     ExpandGlitchedEnemies m_GlitchedEnemyDatabase = new ExpandGlitchedEnemies();
                     RoomHandler           CurrentRoom             = transform.position.GetAbsoluteRoom();
                     IntVector2            actorPosition           = specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor) - CurrentRoom.area.basePosition;
                     m_GlitchedEnemyDatabase.SpawnGlitchedSuperReaper(CurrentRoom, actorPosition);
                     Destroy(m_GlitchedEnemyDatabase);
                     return;
                 }
             }
             else
             {
                 if (ActorObjectTarget == null)
                 {
                     return;
                 }
                 AIActor.AwakenAnimationType AnimationType = AIActor.AwakenAnimationType.Default;
                 AIActor    aiactor = null;
                 GameObject CachedTargetActorObject     = Instantiate(ActorObjectTarget);
                 bool       ExplodesOnDeath             = false;
                 bool       spawnsGlitchedObjectOnDeath = false;
                 if (UnityEngine.Random.value <= 0.25f)
                 {
                     ExplodesOnDeath = true;
                 }
                 if (UnityEngine.Random.value <= 0.15f)
                 {
                     spawnsGlitchedObjectOnDeath = true;
                 }
                 ExpandGlitchedEnemies m_GlitchedEnemyDatabase = new ExpandGlitchedEnemies();
                 aiactor = AIActor.Spawn(m_GlitchedEnemyDatabase.GenerateGlitchedActorPrefab(CachedTargetActorObject, ActorOverrideSource, ExplodesOnDeath, spawnsGlitchedObjectOnDeath), specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor), roomFromPosition, true, AnimationType, true);
                 Destroy(m_GlitchedEnemyDatabase);
                 if (aiactor == null)
                 {
                     return;
                 }
                 if (aiActor.IsBlackPhantom)
                 {
                     aiactor.BecomeBlackPhantom();
                 }
                 if (aiactor)
                 {
                     aiactor.specRigidbody.Initialize();
                     Vector2 a      = unitBottomLeft - (aiactor.specRigidbody.UnitBottomLeft - aiactor.transform.position.XY());
                     Vector2 vector = a + new Vector2(Mathf.Max(0f, specRigidbody.UnitDimensions.x - aiactor.specRigidbody.UnitDimensions.x), 0f);
                     aiactor.transform.position = Vector2.Lerp(a, vector, (ActorPrefabSpawnCount != 1) ? i / (ActorPrefabSpawnCount - 1f) : 0f);
                     aiactor.specRigidbody.Reinitialize();
                     a      -= new Vector2(PhysicsEngine.PixelToUnit(extraPixelWidth), 0f);
                     vector += new Vector2(PhysicsEngine.PixelToUnit(extraPixelWidth), 0f);
                     Vector2       a2            = Vector2.Lerp(a, vector, (ActorPrefabSpawnCount != 1) ? i / (ActorPrefabSpawnCount - 1f) : 0.5f);
                     IntVector2    intVector     = PhysicsEngine.UnitToPixel(a2 - aiactor.transform.position.XY());
                     CollisionData collisionData = null;
                     if (PhysicsEngine.Instance.RigidbodyCastWithIgnores(aiactor.specRigidbody, intVector, out collisionData, true, true, null, false, list.ToArray()))
                     {
                         intVector = collisionData.NewPixelsToMove;
                     }
                     CollisionData.Pool.Free(ref collisionData);
                     aiactor.transform.position += PhysicsEngine.PixelToUnit(intVector).ToVector3ZUp(1f);
                     aiactor.specRigidbody.Reinitialize();
                     if (i == 0)
                     {
                         aiactor.aiAnimator.FacingDirection = 180f;
                     }
                     else if (i == ActorPrefabSpawnCount - 1)
                     {
                         aiactor.aiAnimator.FacingDirection = 0f;
                     }
                     HandleSpawn(aiactor);
                     list.Add(aiactor.specRigidbody);
                     Destroy(CachedTargetActorObject);
                 }
             }
         }
         if (list.Count > 0)
         {
             for (int j = 0; j < list.Count; j++)
             {
                 for (int k = 0; k < list.Count; k++)
                 {
                     if (j != k)
                     {
                         list[j].RegisterGhostCollisionException(list[k]);
                     }
                 }
             }
         }
     }
     else if (spawnPosition == SpawnPosition.InsideCollider)
     {
         IntVector2 pos = specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor);
         if (aiActor.IsFalling)
         {
             return;
         }
         if (GameManager.Instance.Dungeon.CellIsPit(specRigidbody.UnitCenter.ToVector3ZUp(0f)))
         {
             return;
         }
         RoomHandler roomFromPosition     = GameManager.Instance.Dungeon.GetRoomFromPosition(pos);
         List <SpeculativeRigidbody> list = new List <SpeculativeRigidbody>();
         list.Add(specRigidbody);
         Vector2 unitBottomLeft = specRigidbody.UnitBottomLeft;
         for (int i = 0; i < selectedEnemyGuids.Length; i++)
         {
             AIActor orLoadByGuid = EnemyDatabase.GetOrLoadByGuid(selectedEnemyGuids[i]);
             AIActor aiactor      = AIActor.Spawn(orLoadByGuid, specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor), roomFromPosition, false, AIActor.AwakenAnimationType.Default, true);
             if (aiActor.IsBlackPhantom)
             {
                 aiactor.ForceBlackPhantom = true;
             }
             if (aiactor)
             {
                 aiactor.specRigidbody.Initialize();
                 Vector2 a      = unitBottomLeft - (aiactor.specRigidbody.UnitBottomLeft - aiactor.transform.position.XY());
                 Vector2 vector = a + new Vector2(Mathf.Max(0f, specRigidbody.UnitDimensions.x - aiactor.specRigidbody.UnitDimensions.x), 0f);
                 aiactor.transform.position = Vector2.Lerp(a, vector, (selectedEnemyGuids.Length != 1) ? i / (selectedEnemyGuids.Length - 1f) : 0f);
                 aiactor.specRigidbody.Reinitialize();
                 a      -= new Vector2(PhysicsEngine.PixelToUnit(extraPixelWidth), 0f);
                 vector += new Vector2(PhysicsEngine.PixelToUnit(extraPixelWidth), 0f);
                 Vector2       a2            = Vector2.Lerp(a, vector, (selectedEnemyGuids.Length != 1) ? i / (selectedEnemyGuids.Length - 1f) : 0.5f);
                 IntVector2    intVector     = PhysicsEngine.UnitToPixel(a2 - aiactor.transform.position.XY());
                 CollisionData collisionData = null;
                 if (PhysicsEngine.Instance.RigidbodyCastWithIgnores(aiactor.specRigidbody, intVector, out collisionData, true, true, null, false, list.ToArray()))
                 {
                     intVector = collisionData.NewPixelsToMove;
                 }
                 CollisionData.Pool.Free(ref collisionData);
                 // aiactor.transform.position += PhysicsEngine.PixelToUnit(intVector);
                 aiactor.transform.position += PhysicsEngine.PixelToUnit(intVector).ToVector3ZUp(1f);
                 aiactor.specRigidbody.Reinitialize();
                 if (i == 0)
                 {
                     aiactor.aiAnimator.FacingDirection = 180f;
                 }
                 else if (i == selectedEnemyGuids.Length - 1)
                 {
                     aiactor.aiAnimator.FacingDirection = 0f;
                 }
                 HandleSpawn(aiactor);
                 list.Add(aiactor.specRigidbody);
             }
         }
         for (int j = 0; j < list.Count; j++)
         {
             for (int k = 0; k < list.Count; k++)
             {
                 if (j != k)
                 {
                     list[j].RegisterGhostCollisionException(list[k]);
                 }
             }
         }
     }
     else if (spawnPosition == SpawnPosition.ScreenEdge)
     {
         for (int l = 0; l < selectedEnemyGuids.Length; l++)
         {
             AIActor orLoadByGuid2 = EnemyDatabase.GetOrLoadByGuid(selectedEnemyGuids[l]);
             AIActor spawnedActor  = AIActor.Spawn(orLoadByGuid2, specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor), aiActor.ParentRoom, false, AIActor.AwakenAnimationType.Default, true);
             if (spawnedActor)
             {
                 Vector2       cameraBottomLeft = BraveUtility.ViewportToWorldpoint(new Vector2(0f, 0f), ViewportType.Gameplay);
                 Vector2       cameraTopRight   = BraveUtility.ViewportToWorldpoint(new Vector2(1f, 1f), ViewportType.Gameplay);
                 IntVector2    bottomLeft       = cameraBottomLeft.ToIntVector2(VectorConversions.Ceil);
                 IntVector2    topRight         = cameraTopRight.ToIntVector2(VectorConversions.Floor) - IntVector2.One;
                 CellValidator cellValidator    = delegate(IntVector2 c) {
                     for (int num2 = 0; num2 < spawnedActor.Clearance.x; num2++)
                     {
                         for (int num3 = 0; num3 < spawnedActor.Clearance.y; num3++)
                         {
                             if (GameManager.Instance.Dungeon.data.isTopWall(c.x + num2, c.y + num3))
                             {
                                 return(false);
                             }
                             if (GameManager.Instance.Dungeon.data[c.x + num2, c.y + num3].isExitCell)
                             {
                                 return(false);
                             }
                         }
                     }
                     return(c.x >= bottomLeft.x && c.y >= bottomLeft.y && c.x + spawnedActor.Clearance.x - 1 <= topRight.x && c.y + spawnedActor.Clearance.y - 1 <= topRight.y);
                 };
                 Func <IntVector2, float> cellWeightFinder = delegate(IntVector2 c) {
                     float a3 = float.MaxValue;
                     a3 = Mathf.Min(a3, c.x - cameraBottomLeft.x);
                     a3 = Mathf.Min(a3, c.y - cameraBottomLeft.y);
                     a3 = Mathf.Min(a3, cameraTopRight.x - c.x + spawnedActor.Clearance.x);
                     return(Mathf.Min(a3, cameraTopRight.y - c.y + spawnedActor.Clearance.y));
                 };
                 Vector2    b = spawnedActor.specRigidbody.UnitCenter - spawnedActor.transform.position.XY();
                 IntVector2?randomWeightedAvailableCell = spawnedActor.ParentRoom.GetRandomWeightedAvailableCell(new IntVector2?(spawnedActor.Clearance), new CellTypes?(spawnedActor.PathableTiles), false, cellValidator, cellWeightFinder, 0.25f);
                 if (randomWeightedAvailableCell == null)
                 {
                     Debug.LogError("Screen Edge Spawn FAILED!", spawnedActor);
                     Destroy(spawnedActor);
                 }
                 else
                 {
                     spawnedActor.transform.position = Pathfinder.GetClearanceOffset(randomWeightedAvailableCell.Value, spawnedActor.Clearance) - b;
                     spawnedActor.specRigidbody.Reinitialize();
                     HandleSpawn(spawnedActor);
                 }
             }
         }
     }
     else if (spawnPosition == SpawnPosition.InsideRadius)
     {
         Vector2 unitCenter = specRigidbody.GetUnitCenter(ColliderType.HitBox);
         List <SpeculativeRigidbody> list2 = new List <SpeculativeRigidbody>();
         list2.Add(specRigidbody);
         for (int m = 0; m < selectedEnemyGuids.Length; m++)
         {
             Vector2 vector2 = unitCenter + UnityEngine.Random.insideUnitCircle * spawnRadius;
             if (GameManager.Instance.CurrentLevelOverrideState == GameManager.LevelOverrideState.CHARACTER_PAST && SceneManager.GetActiveScene().name == "fs_robot")
             {
                 RoomHandler entrance = GameManager.Instance.Dungeon.data.Entrance;
                 Vector2     lhs      = entrance.area.basePosition.ToVector2() + new Vector2(7f, 7f);
                 Vector2     lhs2     = entrance.area.basePosition.ToVector2() + new Vector2(38f, 36f);
                 vector2 = Vector2.Min(lhs2, Vector2.Max(lhs, vector2));
             }
             AIActor orLoadByGuid3 = EnemyDatabase.GetOrLoadByGuid(selectedEnemyGuids[m]);
             AIActor aiactor2      = AIActor.Spawn(orLoadByGuid3, unitCenter.ToIntVector2(VectorConversions.Floor), aiActor.ParentRoom, true, AIActor.AwakenAnimationType.Default, true);
             if (aiactor2)
             {
                 aiactor2.specRigidbody.Initialize();
                 Vector2 unit = vector2 - aiactor2.specRigidbody.GetUnitCenter(ColliderType.HitBox);
                 aiactor2.specRigidbody.ImpartedPixelsToMove = PhysicsEngine.UnitToPixel(unit);
                 HandleSpawn(aiactor2);
                 list2.Add(aiactor2.specRigidbody);
             }
         }
         for (int n = 0; n < list2.Count; n++)
         {
             for (int num = 0; num < list2.Count; num++)
             {
                 if (n != num)
                 {
                     list2[n].RegisterGhostCollisionException(list2[num]);
                 }
             }
         }
     }
     else
     {
         Debug.LogError("Unknown spawn type: " + spawnPosition);
     }
 }