Exemplo n.º 1
0
        private IEnumerator Trigger()
        {
            if (m_triggered)
            {
                yield break;
            }
            if (!string.IsNullOrEmpty(TriggerAnimation))
            {
                spriteAnimator.Play(TriggerAnimation);
            }
            if (!string.IsNullOrEmpty(TriggerSFX))
            {
                AkSoundEngine.PostEvent(TriggerSFX, gameObject);
            }
            m_triggered = true;
            Vector2 SpawnOffset = Vector2.zero;

            if (EnemySpawnOffset.HasValue)
            {
                SpawnOffset = EnemySpawnOffset.Value;
            }
            if (TriggerVFX)
            {
                SpawnManager.SpawnVFX(TriggerVFX, specRigidbody.UnitCenter + SpawnOffset, Quaternion.identity);
            }
            if (useAirDropSpawn)
            {
                EmergencyCrateController spawnedEnemyCrate = null;
                if (!EnemySpawnPlacableOverride)
                {
                    RobotDaveIdea targetIdea     = (!GameManager.Instance.Dungeon.UsesCustomFloorIdea) ? GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultProceduralIdea : GameManager.Instance.Dungeon.FloorIdea;
                    GameObject    eCrateInstance = ExpandUtility.SpawnAirDrop(m_room, sprite.WorldCenter, null, targetIdea.ValidEasyEnemyPlaceables[UnityEngine.Random.Range(0, targetIdea.ValidEasyEnemyPlaceables.Length)], 0.2f);
                    if (eCrateInstance)
                    {
                        spawnedEnemyCrate = eCrateInstance.GetComponent <EmergencyCrateController>();
                    }
                    // spawnedEnemyCrate = EnemyAirDrop(m_room, sprite.WorldCenter, targetIdea.ValidEasyEnemyPlaceables[UnityEngine.Random.Range(0, targetIdea.ValidEasyEnemyPlaceables.Length)]);
                }
                else
                {
                    // spawnedEnemyCrate = EnemyAirDrop(m_room, sprite.WorldCenter, EnemySpawnPlacableOverride);
                    GameObject eCrateInstance = ExpandUtility.SpawnAirDrop(m_room, sprite.WorldCenter, null, EnemySpawnPlacableOverride, 0.2f);
                    if (eCrateInstance)
                    {
                        spawnedEnemyCrate = eCrateInstance.GetComponent <EmergencyCrateController>();
                    }
                }
                if (!m_room.IsSealed && spawnedEnemyCrate)
                {
                    m_room.npcSealState = RoomHandler.NPCSealState.SealAll;
                    m_room.SealRoom();
                }
                yield return(new WaitForSeconds(2.25f));

                DestroyMushroom(false);
                if (spawnedEnemyCrate)
                {
                    while (ReflectionHelpers.ReflectGetField <bool?>(typeof(EmergencyCrateController), "m_hasBeenTriggered", spawnedEnemyCrate).HasValue&& ReflectionHelpers.ReflectGetField <bool?>(typeof(EmergencyCrateController), "m_hasBeenTriggered", spawnedEnemyCrate).Value)
                    {
                        if (!spawnedEnemyCrate)
                        {
                            break;
                        }
                        yield return(null);
                    }
                }
                yield return(new WaitForSeconds(1f));

                m_room.npcSealState = RoomHandler.NPCSealState.SealNone;
                if (spriteAnimator.IsPlaying(BreakAnimation))
                {
                    while (spriteAnimator.IsPlaying(BreakAnimation))
                    {
                        yield return(null);
                    }
                }
                Destroy(gameObject);
            }
            else
            {
                AIActor selectedEnemy = null;
                if (EnemySpawnPlacableOverride)
                {
                    DungeonPlaceableVariant enemyVariant = EnemySpawnPlacableOverride.SelectFromTiersFull();
                    selectedEnemy = enemyVariant.GetOrLoadPlaceableObject.GetComponent <AIActor>();
                }
                else
                {
                    RobotDaveIdea           targetIdea           = (!GameManager.Instance.Dungeon.UsesCustomFloorIdea) ? GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultProceduralIdea : GameManager.Instance.Dungeon.FloorIdea;
                    DungeonPlaceable        backupEnemyPlaceable = targetIdea.ValidEasyEnemyPlaceables[UnityEngine.Random.Range(0, targetIdea.ValidEasyEnemyPlaceables.Length)];
                    DungeonPlaceableVariant enemyVariant         = backupEnemyPlaceable.SelectFromTiersFull();
                }
                if (selectedEnemy)
                {
                    AIActor targetAIActor = AIActor.Spawn(selectedEnemy, specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor) + SpawnOffset.ToIntVector2(), m_room, true, AIActor.AwakenAnimationType.Spawn, true);
                    targetAIActor.reinforceType = AIActor.ReinforceType.SkipVfx;
                    targetAIActor.HandleReinforcementFallIntoRoom(0.8f);
                    if (!m_room.IsSealed)
                    {
                        m_room.SealRoom();
                    }
                    while (targetAIActor.IsGone)
                    {
                        yield return(null);
                    }
                    DestroyMushroom();
                }
            }
            yield break;
        }
Exemplo n.º 2
0
        private IEnumerator Trigger()
        {
            if (m_triggered)
            {
                yield break;
            }
            if (!string.IsNullOrEmpty(TriggerAnimation))
            {
                spriteAnimator.Play(TriggerAnimation);
            }
            if (!string.IsNullOrEmpty(TriggerSFX))
            {
                AkSoundEngine.PostEvent(TriggerSFX, gameObject);
            }
            m_triggered = true;
            Vector2 SpawnOffset = Vector2.zero;

            if (EnemySpawnOffset.HasValue)
            {
                SpawnOffset = EnemySpawnOffset.Value;
            }
            if (TriggerVFX)
            {
                if (useAirDropSpawn)
                {
                    m_TriggerVFX = SpawnManager.SpawnVFX(TriggerVFX, specRigidbody.UnitBottomCenter - new Vector2(0, 0.25f), Quaternion.identity);
                }
                else
                {
                    m_TriggerVFX = SpawnManager.SpawnVFX(TriggerVFX, specRigidbody.UnitBottomCenter + SpawnOffset, Quaternion.identity);
                }
            }
            if (useAirDropSpawn)
            {
                Vector2 SpawnPosition = transform.position;

                DungeonPlaceable selectedPlacable = null;
                bool             isExplodyBarrel  = false;
                if (EnemySpawnPlacableOverride)
                {
                    selectedPlacable = EnemySpawnPlacableOverride;
                }
                else
                {
                    RobotDaveIdea targetIdea = (!GameManager.Instance.Dungeon.UsesCustomFloorIdea) ? GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultProceduralIdea : GameManager.Instance.Dungeon.FloorIdea;
                    selectedPlacable = BraveUtility.RandomElement(targetIdea.ValidEasyEnemyPlaceables);
                }
                DungeonPlaceableVariant selectedVarient = BraveUtility.RandomElement(selectedPlacable.variantTiers);
                if (selectedVarient != null && UnityEngine.Random.value > 0.2f)
                {
                    if (!string.IsNullOrEmpty(selectedVarient.enemyPlaceableGuid))
                    {
                        GameObject enemyObject = Instantiate(EnemyDatabase.GetOrLoadByGuid(selectedVarient.enemyPlaceableGuid).gameObject, SpawnPosition, Quaternion.identity);
                        enemyObject.GetComponent <AIActor>().ConfigureOnPlacement(m_room);
                        ExpandUtility.SpawnParaDrop(m_room, SpawnPosition, enemyObject, DropHorizontalOffset: 10, useLandingVFX: false);
                    }
                    else if (selectedVarient.nonDatabasePlaceable)
                    {
                        GameObject ParaDroppedObject = Instantiate(selectedVarient.nonDatabasePlaceable, SpawnPosition, Quaternion.identity);
                        ExpandUtility.SpawnParaDrop(m_room, SpawnPosition, ParaDroppedObject, DropHorizontalOffset: 10, useLandingVFX: false);
                    }
                    else
                    {
                        ExpandUtility.SpawnParaDrop(m_room, SpawnPosition, DropHorizontalOffset: 10, useLandingVFX: false);
                        isExplodyBarrel = true;
                    }
                }
                else
                {
                    ExpandUtility.SpawnParaDrop(m_room, SpawnPosition, DropHorizontalOffset: 10, useLandingVFX: false);
                    isExplodyBarrel = true;
                }
                if (!m_room.IsSealed && !isExplodyBarrel)
                {
                    m_room.SealRoom();
                }
                yield return(null);

                DestroyMushroom();
            }
            else
            {
                AIActor selectedEnemy = null;
                if (EnemySpawnPlacableOverride)
                {
                    DungeonPlaceableVariant enemyVariant = EnemySpawnPlacableOverride.SelectFromTiersFull();
                    selectedEnemy = enemyVariant.GetOrLoadPlaceableObject.GetComponent <AIActor>();
                }
                else
                {
                    RobotDaveIdea           targetIdea           = (!GameManager.Instance.Dungeon.UsesCustomFloorIdea) ? GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultProceduralIdea : GameManager.Instance.Dungeon.FloorIdea;
                    DungeonPlaceable        backupEnemyPlaceable = targetIdea.ValidEasyEnemyPlaceables[UnityEngine.Random.Range(0, targetIdea.ValidEasyEnemyPlaceables.Length)];
                    DungeonPlaceableVariant enemyVariant         = backupEnemyPlaceable.SelectFromTiersFull();
                }
                if (selectedEnemy)
                {
                    AIActor targetAIActor = AIActor.Spawn(selectedEnemy, specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor) + SpawnOffset.ToIntVector2(), m_room, true, AIActor.AwakenAnimationType.Spawn, true);
                    targetAIActor.reinforceType = AIActor.ReinforceType.SkipVfx;
                    targetAIActor.HandleReinforcementFallIntoRoom(0.8f);
                    if (!m_room.IsSealed)
                    {
                        m_room.SealRoom();
                    }
                    while (targetAIActor.IsGone)
                    {
                        yield return(null);
                    }
                    DestroyMushroom();
                }
            }
            yield break;
        }