예제 #1
0
        private void RerollChest(Chest chest, PlayerController user)
        {
            Chest newChest = GameManager.Instance.RewardManager.SpawnRewardChestAt(chest.sprite.WorldBottomLeft.ToIntVector2());

            user.CurrentRoom.DeregisterInteractable(chest);
            chest.DeregisterChestOnMinimap();
            Destroy(chest.gameObject);
        }
예제 #2
0
        protected override void DoEffect(PlayerController user)
        {
            IPlayerInteractable nearestInteractable = user.CurrentRoom.GetNearestInteractable(user.CenterPosition, 1f, user);

            if (!(nearestInteractable is Chest))
            {
                return;
            }

            Chest rerollChest = nearestInteractable as Chest;

            if (rerollChest.IsGlitched == true)
            {
                Chest.Spawn(GameManager.Instance.RewardManager.S_Chest, rerollChest.sprite.WorldCenter.ToIntVector2());
            }
            else
            {
                if (rerollChest.IsRainbowChest == true)
                {
                    Chest badchest = Chest.Spawn(GameManager.Instance.RewardManager.S_Chest, rerollChest.sprite.WorldCenter.ToIntVector2());
                    badchest.IsLocked = false;
                }
                else
                {
                    if ((GameManager.Instance.RewardManager.GetQualityFromChest(rerollChest) == ItemQuality.D))
                    {
                        LootEngine.SpawnItem(Gungeon.Game.Items["junk"].gameObject, rerollChest.sprite.WorldCenter, Vector2.left, 0);
                    }
                    if ((GameManager.Instance.RewardManager.GetQualityFromChest(rerollChest) == ItemQuality.C))
                    {
                        Chest badchest = Chest.Spawn(GameManager.Instance.RewardManager.D_Chest, rerollChest.sprite.WorldCenter.ToIntVector2());
                        badchest.IsLocked = false;
                    }
                    if ((GameManager.Instance.RewardManager.GetQualityFromChest(rerollChest) == ItemQuality.B))
                    {
                        Chest badchest = Chest.Spawn(GameManager.Instance.RewardManager.C_Chest, rerollChest.sprite.WorldCenter.ToIntVector2());
                        badchest.IsLocked = false;
                    }
                    if ((GameManager.Instance.RewardManager.GetQualityFromChest(rerollChest) == ItemQuality.A))
                    {
                        Chest badchest = Chest.Spawn(GameManager.Instance.RewardManager.B_Chest, rerollChest.sprite.WorldCenter.ToIntVector2());
                        badchest.IsLocked = false;
                    }
                    if ((GameManager.Instance.RewardManager.GetQualityFromChest(rerollChest) == ItemQuality.S))
                    {
                        Chest badchest = Chest.Spawn(GameManager.Instance.RewardManager.A_Chest, rerollChest.sprite.WorldCenter.ToIntVector2());
                        badchest.IsLocked = false;
                    }
                }

                user.CurrentRoom.DeregisterInteractable(rerollChest);
                rerollChest.DeregisterChestOnMinimap();
                Destroy(rerollChest.gameObject);
            }
        }
예제 #3
0
        private void UpgradeChest(Chest chest, PlayerController user)
        {
            ChestToolbox.ChestTier tier       = chest.GetChestTier();
            ChestToolbox.ChestTier targetTier = ChestToolbox.ChestTier.OTHER;
            switch (tier)
            {
            case ChestToolbox.ChestTier.BROWN:
                targetTier = ChestToolbox.ChestTier.BLUE;
                break;

            case ChestToolbox.ChestTier.BLUE:
                targetTier = ChestToolbox.ChestTier.GREEN;
                break;

            case ChestToolbox.ChestTier.GREEN:
                targetTier = ChestToolbox.ChestTier.RED;
                break;

            case ChestToolbox.ChestTier.RED:
                targetTier = ChestToolbox.ChestTier.BLACK;
                break;

            case ChestToolbox.ChestTier.BLACK:
                targetTier = ChestToolbox.ChestTier.RAINBOW;
                break;

            case ChestToolbox.ChestTier.SYNERGY:
                targetTier = ChestToolbox.ChestTier.BLACK;
                break;
            }

            ChestToolbox.ThreeStateValue isMimic = ChestToolbox.ThreeStateValue.UNSPECIFIED;
            if (chest.IsMimic)
            {
                isMimic = ChestToolbox.ThreeStateValue.FORCEYES;
            }
            else
            {
                isMimic = ChestToolbox.ThreeStateValue.FORCENO;
            }

            if (targetTier != ChestToolbox.ChestTier.OTHER)
            {
                ChestToolbox.SpawnChestEasy(chest.sprite.WorldBottomLeft.ToIntVector2(), targetTier, chest.IsLocked, Chest.GeneralChestType.UNSPECIFIED, isMimic);
            }
            else
            {
                GameManager.Instance.RewardManager.SpawnRewardChestAt(chest.sprite.WorldBottomLeft.ToIntVector2());
            }
            user.CurrentRoom.DeregisterInteractable(chest);
            chest.DeregisterChestOnMinimap();
            Destroy(chest.gameObject);
        }
예제 #4
0
        public void ReplaceChest(PlayerController user)
        {
            if (rerollChest == null || rerollChest.IsBroken)
            {
                return;
            }

            Chest newChest = GameManager.Instance.RewardManager.SpawnRewardChestAt(rerollChest.sprite.WorldBottomLeft.ToIntVector2());

            user.CurrentRoom.DeregisterInteractable(rerollChest);
            rerollChest.DeregisterChestOnMinimap();
            Destroy(rerollChest.gameObject);
        }
예제 #5
0
        private void TeleportChest(Chest chest, PlayerController user)
        {
            CachedChestData item = new CachedChestData(chest);

            SpawnManager.SpawnVFX(EasyVFXDatabase.ChestTeleporterTimeWarp, chest.sprite.WorldCenter, Quaternion.identity, true);
            user.CurrentRoom.DeregisterInteractable(chest);
            chest.DeregisterChestOnMinimap();
            if (chest.majorBreakable)
            {
                chest.majorBreakable.TemporarilyInvulnerable = true;
            }
            Object.Destroy(chest.gameObject, 0.8f);
            this.m_chestos.Add(item);
        }
예제 #6
0
        protected override void DoEffect(PlayerController user)
        {
            IPlayerInteractable nearestInteractable = user.CurrentRoom.GetNearestInteractable(user.CenterPosition, 1f, user);

            if (!(nearestInteractable is Chest))
            {
                return;
            }

            AkSoundEngine.PostEvent("Play_ENM_electric_charge_01", user.gameObject);

            Chest rerollChest = nearestInteractable as Chest;
            int   selected    = UnityEngine.Random.Range(1, 15);

            ETGModConsole.Log(selected.ToString());

            VFXToolbox.GlitchScreenForSeconds(1.5f);


            switch (selected)
            {
            case 1:     //Blow up chest
                if (user.PlayerHasActiveSynergy("KEYGEN"))
                {
                    SpareChest(rerollChest);
                }
                else
                {
                    Exploder.DoDefaultExplosion(rerollChest.specRigidbody.UnitCenter, Vector2.zero);
                    if (rerollChest.IsMimic)
                    {
                        OMITBReflectionHelpers.ReflectSetField <bool>(typeof(Chest), "m_isMimic", false, rerollChest);
                    }
                    rerollChest.majorBreakable.Break(Vector2.zero);
                    if (rerollChest.GetChestTier() == ChestToolbox.ChestTier.RAT)
                    {
                        UnityEngine.Object.Destroy(rerollChest.gameObject);
                    }
                }
                break;

            case 2:     //Open Chest
                rerollChest.ForceOpen(user);
                break;

            case 3:     //Break Lock
                if (user.PlayerHasActiveSynergy("KEYGEN"))
                {
                    SpareChest(rerollChest);
                }
                else
                {
                    if (rerollChest.IsLocked)
                    {
                        rerollChest.BreakLock();
                    }
                    else
                    {
                        rerollChest.majorBreakable.Break(Vector2.zero);
                    }
                }
                break;

            case 4:     //Duplicate Chest
                DupeChest(rerollChest, user);
                break;

            case 5:     //Turn into mimic
                if (!rerollChest.IsMimic)
                {
                    rerollChest.overrideMimicChance = 100; rerollChest.MaybeBecomeMimic();
                }
                rerollChest.ForceOpen(user);
                break;

            case 6:     //Englitch
                List <GlobalDungeonData.ValidTilesets> bannedGlitchFloors = new List <GlobalDungeonData.ValidTilesets>()
                {
                    GlobalDungeonData.ValidTilesets.CATACOMBGEON,
                    GlobalDungeonData.ValidTilesets.HELLGEON,
                    GlobalDungeonData.ValidTilesets.OFFICEGEON,
                    GlobalDungeonData.ValidTilesets.FORGEGEON,
                };
                if (!bannedGlitchFloors.Contains(GameManager.Instance.Dungeon.tileIndices.tilesetId))
                {
                    rerollChest.BecomeGlitchChest();
                }
                else
                {
                    if (!rerollChest.IsMimic)
                    {
                        rerollChest.MaybeBecomeMimic();
                    }
                    rerollChest.ForceOpen(user);
                }
                break;

            case 7:     //Enrainbow
                if (UnityEngine.Random.value <= 0.65f)
                {
                    UpgradeChest(rerollChest, user);
                }
                else
                {
                    rerollChest.BecomeRainbowChest();
                }
                break;

            case 8:     //Reroll
                RerollChest(rerollChest, user);
                break;

            case 9:     //Turn into pickups
                if (user.PlayerHasActiveSynergy("KEYGEN"))
                {
                    SpareChest(rerollChest);
                }
                else
                {
                    for (int i = 0; i < 5; i++)
                    {
                        LootEngine.SpawnItem(PickupObjectDatabase.GetById(BraveUtility.RandomElement(BabyGoodChanceKin.lootIDlist)).gameObject, rerollChest.sprite.WorldCenter, Vector2.zero, 0);
                    }
                    LootEngine.SpawnCurrency(rerollChest.sprite.WorldCenter, UnityEngine.Random.Range(5, 11));
                    user.CurrentRoom.DeregisterInteractable(rerollChest);
                    rerollChest.DeregisterChestOnMinimap();
                    UnityEngine.Object.Destroy(rerollChest.gameObject);
                }
                break;

            case 10:     //Fuse
                if (user.PlayerHasActiveSynergy("KEYGEN"))
                {
                    SpareChest(rerollChest);
                }
                else
                {
                    var type = typeof(Chest);
                    var func = type.GetMethod("TriggerCountdownTimer", BindingFlags.Instance | BindingFlags.NonPublic);
                    var ret  = func.Invoke(rerollChest, null);
                    AkSoundEngine.PostEvent("Play_OBJ_fuse_loop_01", rerollChest.gameObject);
                }
                break;

            case 11:     //Unlock
                if (rerollChest.IsLocked)
                {
                    rerollChest.ForceUnlock();
                }
                else
                {
                    rerollChest.ForceOpen(user);
                }
                break;

            case 12:     //Enjam
                rerollChest.gameObject.GetOrAddComponent <JammedChestBehav>();
                break;

            case 13:     //TeleportChest
                TeleportChest(rerollChest, user);
                break;

            case 14:     //Drill
                FauxDrill(rerollChest, user);
                break;
            }
        }
        private void Start()
        {
            PlayerReflection.TargetPlayer = GameManager.Instance.PrimaryPlayer;
            PlayerReflection.MirrorSprite = MirrorSprite;
            if (!isGlitched)
            {
                if (GameManager.Instance.CurrentGameType == GameManager.GameType.COOP_2_PLAYER)
                {
                    CoopPlayerReflection.TargetPlayer = GameManager.Instance.SecondaryPlayer;
                    CoopPlayerReflection.MirrorSprite = MirrorSprite;
                }
                else
                {
                    CoopPlayerReflection.gameObject.SetActive(false);
                }
            }
            else
            {
                PlayerReflection.gameObject.SetActive(false);
                CoopPlayerReflection.gameObject.SetActive(false);
                tk2dBaseSprite[] AllMirrorSprites = gameObject.GetComponents <tk2dBaseSprite>();
                if (AllMirrorSprites != null && AllMirrorSprites.Length > 0)
                {
                    ChaosShaders.Instance.ApplyGlitchShader(null, AllMirrorSprites[0]);
                }
            }

            IntVector2 MirrorChestPosition = (base.transform.position.IntXY(VectorConversions.Round) + new IntVector2(0, -2) - m_ParentRoom.area.basePosition);

            if (spawnBellosChest)
            {
                MirrorChest = ChaosUtility.GenerateChest(MirrorChestPosition, m_ParentRoom, PickupObject.ItemQuality.A, 0, false);
                MirrorChest.forceContentIds = new List <int>()
                {
                    435, 493
                };
            }
            else
            {
                MirrorChest = ChaosUtility.GenerateChest(MirrorChestPosition, m_ParentRoom, null, -1f);
            }
            MirrorChest.PreventFuse = true;
            SpriteOutlineManager.RemoveOutlineFromSprite(MirrorChest.sprite, false);
            Transform transform = MirrorChest.gameObject.transform.Find("Shadow");

            if (transform)
            {
                MirrorChest.ShadowSprite = transform.GetComponent <tk2dSprite>();
            }
            MirrorChest.IsMirrorChest = true;
            MirrorChest.ConfigureOnPlacement(m_ParentRoom);
            m_ParentRoom.RegisterInteractable(MirrorChest);
            if (spawnBellosChest)
            {
                MirrorChest.DeregisterChestOnMinimap();
            }
            if (MirrorChest.majorBreakable)
            {
                MirrorChest.majorBreakable.TemporarilyInvulnerable = true;
            }
            ChestSprite = MirrorChest.sprite;
            ChestSprite.renderer.enabled = false;
            ChestReflection.TargetSprite = ChestSprite;
            ChestReflection.MirrorSprite = MirrorSprite;
            SpeculativeRigidbody specRigidbody = MirrorSprite.specRigidbody;

            specRigidbody.OnRigidbodyCollision = (SpeculativeRigidbody.OnRigidbodyCollisionDelegate)Delegate.Combine(specRigidbody.OnRigidbodyCollision, new SpeculativeRigidbody.OnRigidbodyCollisionDelegate(HandleRigidbodyCollisionWithMirror));
            MinorBreakable componentInChildren = GetComponentInChildren <MinorBreakable>();

            componentInChildren.OnlyBrokenByCode = true;
            componentInChildren.heightOffGround  = 4f;

            IPlayerInteractable[] TableInterfacesInChildren = GameObjectExtensions.GetInterfacesInChildren <IPlayerInteractable>(gameObject);
            for (int i = 0; i < TableInterfacesInChildren.Length; i++)
            {
                if (!m_ParentRoom.IsRegistered(TableInterfacesInChildren[i]))
                {
                    m_ParentRoom.RegisterInteractable(TableInterfacesInChildren[i]);
                }
            }
            // Destroy(gameObject.GetComponent<MirrorController>());

            // SpeculativeRigidbody InteractableRigidMirror = gameObject.GetComponent<SpeculativeRigidbody>();
            // InteractableRigidMirror.Initialize();
            // PhysicsEngine.Instance.RegisterOverlappingGhostCollisionExceptions(InteractableRigidMirror, null, false);
        }